diff --git a/.github/actions/prepare_env/action.yml b/.github/actions/prepare_env/action.yml index acfa469..79d72c2 100644 --- a/.github/actions/prepare_env/action.yml +++ b/.github/actions/prepare_env/action.yml @@ -1,11 +1,11 @@ name: prepare env action -description: prepare python environment +description: prepare Python environment runs: using: composite steps: - name: Set up Python 3.11 - uses: actions/setup-python@v3 + uses: actions/setup-python@v6 with: python-version: "3.11" - name: Install dependencies diff --git a/.github/actions/test/action.yml b/.github/actions/test/action.yml index 0bc2d80..2177bd2 100644 --- a/.github/actions/test/action.yml +++ b/.github/actions/test/action.yml @@ -1,5 +1,5 @@ -name: test action -description: run test against compiled package +name: tests action +description: run tests against compiled package runs: using: composite @@ -7,4 +7,4 @@ runs: - name: Test output files in typical scenarios shell: bash run: | - python test/run_test.py \ No newline at end of file + python tests/syntax_semantic_check.py \ No newline at end of file diff --git a/.github/workflows/build_and_test.yml b/.github/workflows/build_and_test.yml index eae421f..d994583 100644 --- a/.github/workflows/build_and_test.yml +++ b/.github/workflows/build_and_test.yml @@ -1,4 +1,4 @@ -name: Compile package and test it +name: Compile package and tests it on: push: @@ -16,7 +16,7 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 - uses: ./.github/actions/prepare_env - uses: ./.github/actions/build - uses: ./.github/actions/test \ No newline at end of file diff --git a/.github/workflows/create_release.yml b/.github/workflows/create_release.yml index 532a8a8..f977633 100644 --- a/.github/workflows/create_release.yml +++ b/.github/workflows/create_release.yml @@ -12,7 +12,7 @@ jobs: permissions: contents: write steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 - uses: ./.github/actions/prepare_env - uses: ./.github/actions/build - uses: ./.github/actions/test diff --git a/.gitignore b/.gitignore index 30a2665..9c47a49 100644 --- a/.gitignore +++ b/.gitignore @@ -9,34 +9,11 @@ Testing/API/templates/.DS_Store ServiceCategories # output files that are produced (TTL and vocabulary) -TTL/* -JSON-LD/* +TTL/ +JSONLD/ Testing/Vocabulary/Vocabulary.txt -JSON-LD -TTL -TTL/bodies.ttl -TTL/cgpm.ttl -TTL/cipm.ttl -TTL/cctf.ttl -TTL/si.ttl -TTL/constants.ttl -TTL/quantities.ttl -TTL/prefixes.ttl -TTL/units.ttl -TTL/decisions.ttl -JSON-LD/bodies.ttl -JSON-LD/cgpm.ttl -JSON-LD/cipm.ttl -JSON-LD/cctf.ttl -JSON-LD/si.ttl -JSON-LD/constants.ttl -JSON-LD/quantities.ttl -JSON-LD/prefixes.ttl -JSON-LD/units.ttl -JSON-LD/decisions.ttl *.zip -TTL/ -JSON-LD/ + # cache files __pycache__ diff --git a/Readme.md b/Readme.md index 33ab96a..89935af 100644 --- a/Readme.md +++ b/Readme.md @@ -1,9 +1,10 @@ # Semantic SI created: Jan 2023 / GD -last modified: 2025-10-13 +last modified: 2026-03-27 -This package implements the SI Reference point, a part of the SI digital framework. The package allows to produce a machine readable version of the SI Brochures (knowledge graph). -General principle for the generation of the knowledge graphs : +This package implements the SI Reference point, a part of the SI digital framework. The package provides a +machine-readable version (knowledge graph) of the units, prefixes, constants defined in the SI Brochure. +The general workflow for the generation of the knowledge graph is: ```mermaid flowchart TD @@ -12,36 +13,34 @@ flowchart TD C --> F["Serialised Knowledge Graph (ttl file)"] ``` - -See also SIDataModel.pdf (depicting the underlying data model used for this part of the si digital framework \[may be obsolete on some aspects\]). +See also SIDataModel.pdf (depicting the underlying data model used for this part of the SI digital framework +\[may be obsolete on some aspects\]). -The package contains also a test Website (based on FastAPI), allowing to interrogate the produced knowledge graphs. Note that this is only provided for demo purposes. +The package contains also a test Website (based on FastAPI), allowing to interrogate the produced knowledge graphs. +Note that this is only provided for demo purposes. ## Installation Install as a python package - Clone repository or download zip file and unzip it -- `pip install path/to/repo` (or `pip install -e path/to/repo` if you plan to edit the code and see the changes immediately, "editable mode") +- `pip install path/to/repo` (or `pip install -e path/to/repo` if you plan to edit the code and see the changes + immediately, "editable mode") Python >= 3.11 required, for other requirements see pyproject.toml. -[Specific instructions for pycharm](./docs/install_in_pycharm.md) - -## Usage -After installation, two commands are available -* `generate_turtle_files` -* `launch_si_test_api` +[Specific instructions for PyCharm](docs/pycharm.md) -### `generate_turtle_files` -This command will create all `.ttl` files in a subfolder. +## Command line usage +After installation, the `generate_sirp_files` is made available. -The `-z` option generates a zip file. +This command will create all `.ttl` and `.jsonld` files in a subfolder. The `-z` option generates a zip file of the ensemble. For debugging purposes, you can choose to generate only one ttl by providing its label with the `--only` option. -`--gen_ontology_viz` updates the markdown files in `docs/vocabulary_viz` using Ontospy. Make sure to add and commit changes if you want the up-to-date version to be displayed on github. +`--gen_ontology_viz` updates the Markdown files in `docs/vocabulary_viz` using Ontospy. Make sure to add and commit +changes if you want the up-to-date version to be displayed on GitHub. -Finally `-o / --outputdir` indicates the directory where to output the ttl files. It defaults to the current directory (from where the `generate_turtle_files`is executed. It creates a subfolder `./TTL`. +`-o / --output_dir` indicates where to write the output files, and defaults to `./output`. Additionaly `--ttl_output_subdir` and `--jsonld_output_subdir` indicate the subdirectories for TTL and JSON-LD outputs. They default to `TTL` and `JSONLD`. `-h / --help` provides a list of available options. @@ -49,33 +48,25 @@ Finally `-o / --outputdir` indicates the directory where to output the ttl files This command will launch a local web-service for testing purposes. -## Short description of the `src/si_ref_point/` sub directories +## Short description of the `src/si_ref_point/` subdirectories + +### tboxes -### cuq -Contains several Python codes that allow to produce 4 serialized knowledge graphs (as ttl) containing information about: -- the 7 constants underpinning the SI, -- the Prefixes, -- the Quantities, -- the Units. -The TBox (classes and properties) is common to all parts, the ABoxes (allowing to fill the knowledge graphs with individuals) are separate for the different parts. -Each ABox gets the relevant information from one or more YAML file(s). The location of the input and output files is defined in settings.py +Contains the python scripts that will generate the "terminology" part of the SI Reference Point (`si_tbox.py`) and the additional concepts necessary to bond to responsible bodies (`rb_tbox.py`). -### cuq\_data -The YAML files containing all the input data, + turtle files for the SI ontology TBox (core + extended concepts). +### aboxes -### resbod -Contains Python code that allows to produce a serialized knowledge graph (as ttl file) of Responsible Bodies, their Events and the Outcomes thereof. -The information is read from yaml files (provided by Ron Tse). The code is separated in TBox (definition of the classes and properties) and ABox (istances using TBox) -The location of the input and output files is defined in settings.py +Contains the python scripts that will populate the "assertions" part of the SI Reference Point (constants, decisions, prefixes, quantities, units) and responsible bodies (CCTF, CGPM, CIPM). `symbols_format.py` is a common utility that handles the conversion between html, LaTeX, json and ascii formatting. -### resbod\_data -Contains cctf, cgpm and cipm sub directories with yaml data for these 3 bodies, obtained from Ron Tse, see: https://github.com/metanorma/bipm-data-outcomes/tree/main) +### inputs +Contains 2 subdirectories, `si` and `rb`, gathering all necessary input information. In general these are yaml files, but in the case for the SI concepts (that will feed the corresponding TBox) these are already ttl files. -### Testing +Content of the `rb` directory originally come from a digitalization effort by Ron Tse (Ribose) in the frame of Metanorma (https://github.com/metanorma/cgpm-resolutions, https://github.com/metanorma/bipm-data-outcomes/tree/main) -The API can be launched with command `launch_si_test_api`. This is a refurbishment of the previous Testing/API code, now residing in `src/sir_ref_point/test_api` and not the production API. It is meant to allow quick tests of the requests. +### Test API +A fastapi instance allowing to test the TTL output used to be included in this package. It has now been transfered into a separate repository [sirp-tools](https://github.com/TheBIPM/sirp-tools). ## Current class diagram diff --git a/Testing/UnitTest_Ontospy.py b/Testing/UnitTest_Ontospy.py deleted file mode 100644 index 4bc56ad..0000000 --- a/Testing/UnitTest_Ontospy.py +++ /dev/null @@ -1,3 +0,0 @@ -import ontospy - - diff --git a/Testing/examples.ttl b/Testing/examples.ttl deleted file mode 100644 index 2f60087..0000000 --- a/Testing/examples.ttl +++ /dev/null @@ -1,49 +0,0 @@ -@prefix owl: . -@prefix rdfs: . -@prefix xsd: . -@prefix math: . - -@prefix si: . -@prefix units: . -@prefix quantities: . -@prefix prefixes: . - - -############################################### -########### TESTING INDIVIDUALS ############### -############################################### - -@prefix ex: . - -ex:nanosecond a si:PrefixedUnit ; - si:hasBaseUnit units:second ; - si:hasPrefix prefixes:nano . - -ex:millimetre a si:PrefixedUnit ; - si:hasBaseUnit units:metre ; - si:hasPrefix prefixes:milli . - -ex:millimetre_alt a si:UnitMultiple ; - si:hasNumericFactor 0.001 ; - si:hasBaseUnit units:metre . - -ex:voltmetre a si:UnitProduct ; - si:hasFactor units:volt ; - si:hasFactor units:metre . - -ex:foot a si:UnitMultiple ; - si:hasNumericFactor "0.3048"^^xsd:decimal; - si:hasBaseUnit units:metre . - -ex:voltmillimetre a si:UnitProduct ; - si:hasFactor units:volt ; - si:hasFactor ex:millimetre . - -ex:newton a si:UnitProduct ; - si:hasFactor units:metre ; - si:hasFactor units:kilogram ; - si:hasFactor [ - a si:Exponentiation ; - si:hasBase units:second ; - si:hasExponent -2 - ] . diff --git a/docs/GuideForDevelopers.md b/docs/GuideForDevelopers.md deleted file mode 100644 index 16a5b4a..0000000 --- a/docs/GuideForDevelopers.md +++ /dev/null @@ -1,191 +0,0 @@ -# The SI Reference Point - Guide for Developers - -## 1. Scope - -The [SI Reference Point](https://si-digital-framework.org/SI/) is a digital reference in support of the [International System of Units (SI)](https://www.bipm.org/en/measurement-units/). It is aimed at anyone wishing to express their measurement data in a [FAIR](https://www.go-fair.org/fair-principles/) manner. - -The SI Reference Point contains -* the values of (and PIDs for) the constants defining the SI -* the definitions of (and PIDs for) the named SI units and prefixes, along with the relevant official decisions -* the list of non-SI units allowed for use with the SI -* examples of physical and chemical quantities, along with their corresponding SI units - -The information in the SI Reference Point is provided as a knowledge graph serialized in a set of six Turtle (TTL) or JSON-LD files: - -* SI.ttl -* SI/units.ttl -* SI/prefixes.ttl -* SI/decisions.ttl -* constants.ttl -* quantities.ttl - -The SI Reference Point provides: -* an Application Programming Interface (API) providing JSON, JSON-LD, XML or HTML outputs -* a SPARQL endpoint -* a tool to generate the PID of any compound unit - -An introductory overview of the service for users is given [HERE](https://github.com/TheBIPM/SI_Digital_Framework/tree/main/SI_Reference_Point/docs). The present document provides more information about the Application Programming Interface. - - -## 2. Introduction to the SI - -The SI is an internationally agreed, practical system of units of measurement, comprising a set of "SI units" and a set of "SI prefixes". In brief: - -* an SI unit can be multiplied by an SI prefix to create multiples or submultiples of the unit: e.g. nanosecond (ns) = 10-9 s. -* compound units can be formed by multiplying (or dividing) combinations of the units (prefixed or not): e.g. metres per second squared (m⋅s-2) for acceleration. -* each kind of quantity has one corresponding SI unit (though it might be possible to express that unit in different ways). -* a derived SI unit can correspond to more than one derived quantity. - -All SI units can be expressed in terms of a set of seven so-called "base units": namely, the second (s), metre (m), kilogram (kg), kelvin (K), mole (mol) and candela (cd). There are another 22 named units corresponding to different kinds of quantity, such as the newton (N) for force, the joule (J) for energy, and the watt (W) for power. - -Full details are provided in the [SI Brochure](https://www.bipm.org/en/publications/si-brochure) published by the BIPM and currently in its 9th edition. Since its creation in 1960, the SI has evolved both through the inclusion of new units and new prefixes, and through the redefinition of existing units. When a unit is redefined, the new definition ensures that continuity is kept with the previous definition, but usually there will be some practical advantage such as an improved means to "realize" the unit in question. After a major revision of the SI adopted in 2018, the whole SI is now defined in terms of seven defining constants. In particular, new definitions of the kilogram, kelvin, mole and candela were agreed at that time. -The following table shows how the information from the SI Brochure is distributed among the TTL (or JSON-LD) files. - - -**Table 1.** List of tables in the SI Brochure and corresponding information in the SI Reference Point - -| Table | Title | Encoded in| -| :----- | :----- | :---- | -| 1 | The seven defining constants of the SI and the seven corresponding units they define | constants | -| 2 | SI base units | SI/units | -| 3 | Base quantities and dimensions used in the SI | quantities | -| 4 | The 22 SI units with special names and symbols | SI/units | -| 5 | Examples of coherent derived units in the SI expressed in terms of base units | SI/units | -| 6 | Examples of SI coherent derived units whose names and symbols include SI coherent derived units with special names and symbol | SI/units | -| 7 | SI prefixes | SI/prefixes| -| 8 | Non-SI units accepted for use with the SI units | SI/units | -| App. 1 | Decisions of the CGPM and the CIPM | SI/decisions | - - -## 3. Getting started - -The Application Programming Interface provides a set of predefined SPARQL queries to retrieve the information in the knowledge graph. The available calls are described below and in the Swagger interface at https://si-digital-framework.org/api-docs/swagger-ui/?urls.primaryName=SI%20REFERENCE%20POINT. They can be used to retrieve information about the units, prefixes, defining constants, related official decisions, and kinds of quantity. They also underpin the web interface. - -### 3.1 Authentication and Authorization - -The API of the beta-version of the SI Reference Point is openly available at - -
https://si-digital-framework.org/api-docs/swagger-ui/?urls.primaryName=SI%20REFERENCE%20POINT
- -under the Creative Commons Attribution 3.0 Intergovernmental Organization license ([CC BY 3.0 IGO](https://creativecommons.org/licenses/by/3.0/igo/)). - -Currently no pre-registration is required, but please note that during the beta-testing phase the API calls provided may be subject to revision. During this phase (at least until the end of 2024), two weeks' notice will be given, via the website and the GitHub site, to announce upcoming changes. The changes will be logged on the GitHub site. - -Once the official version is released, registration of users will be encouraged to facilitate the communication of any further changes to the API. - -A rate limit of XXXX is in place. - -### 3.2 API calls - -The API queries can be triggered through the [Swagger interface](https://si-digital-framework.org/api-docs/swagger-ui/?urls.primaryName=SI%20REFERENCE%20POINT) or by a Command Line Interface (CLI). - -The header information can be adjusted as follows to return data in JSON, JSON-LD, XML, HTML or TTL formats, respectively: - -* `curl -H "accept: application/json"` -* `curl -H "accept: application/ld+json"` -* `curl -H "accept: application/xml"` -* `curl -H "accept: application/html"` -* `curl -H "accept: application/octet-stream"` - -The names of the calls indicated below should be appended to the base URL `si-digital-framework.org/`. Thus the call `SI/units`, for example, listed below represents `https://si-digital-framework.org/SI/units`. - -| GET Query | Action | Mandatory parameters | Optional parameters | Effect | -| :----- | :----- | :---- | :---- | :---- | -| `SI/units` | returns complete list of units | | | default language is English | -| | | | `lang=en` | text in English | -| | | | `lang=fr` | text in French | -| `SI/units/{name}` | information about specified unit `{name}` | `{name}` of unit | | default language is English; default date is date of query | -| | | | `lang=en` | text in English | -| | | | `lang=fr` | text in French | -| | | | `date=YYYY-MM-DD` | information at specified date | -| `SI/prefixes` | returns list of SI prefixes | | | default language is English; default date is date of query | -| | | | `lang=en` | text in English | -| | | | `lang=fr` | text in French | -| `SI/prefixes/{name}` | information about specified prefix `{name}` | `{name}` of prefix | | default language is English | -| | | | `lang=en` | text in English | -| | | | `lang=fr` | text in French | -| `constants` | returns list of defining constants | | | default language is English | -| | | | `lang=en` | text in English | -| | | | `lang=fr` | text in French | -| `constants/{name}` | information about specified constant `{name}` | `{name}` (shortened) name of constant as returned by the previous call | | default language is English | -| | | | `lang=en` | text in English | -| | | | `lang=fr` | text in French | -| `quantities` | returns list of kinds of quantity currently included in the system | | | default language is English | -| | | | `lang=en` | text in English | -| | | | `lang=fr` | text in French | -| `quantities/{code}` | information about specified quantity `{code}` | {code} is the four-letter code for the quantity as returned by the previous call | | default language is English | -| | | | `lang=en` | text in English | -| | | | `lang=fr` | text in French | - -#### Examples - -**`SI/units`** - -* ```curl -X GET "https://si-digital-framework.org/SI/units" -H "accept: application/json"``` (on linux/MacOS) -* ```curl -X GET "https://si-digital-framework.org/SI/units?lang=fr" -H "accept: application/json"``` -* ```curl -X GET "https://si-digital-framework.org/SI/units" -Headers "{accept='application/json'}``` (on Windows) - -will return a complete list of the units: the SI base units, SI derived units with special names, and non-SI units allowed for use with the SI units. - -Optional parameters: - * `lang=fr` (to return French texts) or `lang=en` (the default setting: English) - -**`SI/units/{name}`** - -* ```curl -X GET "https://www.si-digital-framework.org/SI/units/degreeCelsius"``` -* ```curl -X GET "https://www.si-digital-framework.org/SI/units/kilogram?lang=fr&date=2007-11-21"``` - -will return respectively information about the degree Celsius and information in French relating to the unit "kilogram" as at (and up until) 21 November 2007. - -The mandatory parameter {name} is the English name of the unit (written without spaces). - -Optional parameters: - * `lang=fr` (to return French information) or `lang=en` (the default setting: English) - * `date=YYYY-MM-DD` (e.g. `date=2024-02-14` for 14 February 2024); the default setting is the query date - -**`SI/prefixes`** - -* ```curl -X GET "https://www.si-digital-framework.org/SI/prefixes?lang=fr" -H "accept: application/xml"``` - -will return (in XML format and French text) information about all the SI prefixes. - - Optional parameters - * `lang=fr` (to return French information) or `lang=en` (for English: default setting) - - **`SI/prefixes/{name}`** - -* ```curl -X GET "https://www.si-digital-framework.org/SI/prefixes/mega?lang=fr" -H "accept: application/json"``` - -will return (in JSON format and French text) information about the SI prefix "mega" (méga). - -The mandatory parameter {name} is the English name of the prefix. - - Optional parameters: - * `lang=fr` (to return French information) or `lang=en` (for English: default setting) - - - **`constants`** - -* ```curl -X GET "https://si-digital-framework.org/constants?lang=en" -H "accept: application/json"``` - -will returns information about the defining constants. (Note: The knowledge base is currently restricted to the seven constants defining the SI.) - -Optional parameters: - * `lang=fr` (to return French information) or `lang=en` (for English: default setting) - - **`constants/{parameter}`** - -```curl -X GET "https://si-digital-framework.org/constants/PlanckConstant?lang=en" -H "accept: application/json"``` - -will return (in JSON format) information in English about the Planck constant. {parameter} is the ID of the constant as listed by `constants`. It is a shortened version of the Ennglish name (written without spaces and in CamelCase (camel caps), with an initial capital letter and no spaces. For confirmation of the name to use, please refer to the output of `constants`. - -Optional parameters: - * `lang=fr` (to return French information) or `lang=en` (for English: default setting) - - -## 3.3 Parser and compound units - -## 4. Error messages - -## 5. HTTP/HTTPS - diff --git a/docs/Readme.md b/docs/Readme.md index de08ec9..5a98a10 100644 --- a/docs/Readme.md +++ b/docs/Readme.md @@ -1,7 +1,7 @@ # Docs -This contains documentation generation tools and data. +This folder contains documentation generation tools and data. -Current documentation may be found in [SI_Reference_Point.md](./SI_Reference_Point.md) +Current documentation may be found in [SI_Reference_Point.md](sirp.md) Autogenerated ontology documentation (done via [Ontospy](https://github.com/lambdamusic/Ontospy) ) starts in [vocabulary_viz/index.md](vocabulary_viz/index.md). diff --git a/docs/developers.md b/docs/developers.md new file mode 100644 index 0000000..5b3b80a --- /dev/null +++ b/docs/developers.md @@ -0,0 +1,197 @@ +# The SI Reference Point - Guide for Developers + +## 1. Scope +The [SI Reference Point](https://si-digital-framework.org/SI/) is a digital reference in support of the [International System of Units (SI)](https://www.bipm.org/en/measurement-units/). It is +aimed at anyone wishing to express their measurement data in a [FAIR](https://www.go-fair.org/fair-principles/) manner. + +The SI Reference Point contains +* the values of (and PIDs for) the constants defining the SI +* the definitions of (and PIDs for) the named SI units and prefixes, along with the relevant official decisions +* the list of non-SI units allowed for use with the SI +* examples of physical and chemical quantities, along with their corresponding SI units + +The information in the SI Reference Point is provided as a knowledge graph serialized in a set of six Turtle (TTL) or +JSON-LD files: +* SI.ttl +* SI/units.ttl +* SI/prefixes.ttl +* SI/decisions.ttl +* constants.ttl +* quantities.ttl + +The SI Reference Point provides: +* an Application Programming Interface (API) providing JSON, JSON-LD, XML or HTML outputs +* a SPARQL endpoint +* a tool to generate the PID of any compound unit + +An introductory overview of the service for users is given [HERE](https://github.com/TheBIPM/SI_Digital_Framework/tree/main/SI_Reference_Point/docs). The present document provides more information +about the Application Programming Interface. + +## 2. Introduction to the SI +The SI is an internationally agreed, practical system of units of measurement, comprising a set of "SI units" and a set +of "SI prefixes". In brief: +* an SI unit can be multiplied by an SI prefix to create multiples or submultiples of the unit: e.g. nanosecond + (ns) = 10-9 s. +* compound units can be formed by multiplying (or dividing) combinations of the units (prefixed or not): e.g. metres + per second squared (m⋅s-2) for acceleration. +* each kind of quantity has one corresponding SI unit (though it might be possible to express that unit in different ways). +* a derived SI unit can correspond to more than one derived quantity. + +All SI units can be expressed in terms of a set of seven so-called "base units": namely, the second (s), metre (m), +kilogram (kg), kelvin (K), mole (mol) and candela (cd). There are another 22 named units corresponding to different +kinds of quantity, such as the newton (N) for force, the joule (J) for energy, and the watt (W) for power. + +Full details are provided in the [SI Brochure](https://www.bipm.org/en/publications/si-brochure) published by the BIPM and currently in its 9th edition. Since its +creation in 1960, the SI has evolved both through the inclusion of new units and new prefixes, and through the +redefinition of existing units. When a unit is redefined, the new definition ensures that continuity is kept with the +previous definition, but usually there will be some practical advantage such as an improved means to "realize" the +unit in question. After a major revision of the SI adopted in 2018, the whole SI is now defined in terms of seven +defining constants. In particular, new definitions of the kilogram, kelvin, mole and candela were agreed at that time. +The following table shows how the information from the SI Brochure is distributed among the TTL (or JSON-LD) files. + + +**Table 1.** List of tables in the SI Brochure and corresponding information in the SI Reference Point + +| Table | Title | Encoded in | +|:------------|:------------------------------------------------------------------------------------------------------------------------------|:-------------| +| 1 | The seven defining constants of the SI and the seven corresponding units they define | constants | +| 2 | SI base units | SI/units | +| 3 | Base quantities and dimensions used in the SI | quantities | +| 4 | The 22 SI units with special names and symbols | SI/units | +| 5 | Examples of coherent derived units in the SI expressed in terms of base units | SI/units | +| 6 | Examples of SI coherent derived units whose names and symbols include SI coherent derived units with special names and symbol | SI/units | +| 7 | SI prefixes | SI/prefixes | +| 8 | Non-SI units accepted for use with the SI units | SI/units | +| App. 1 | Decisions of the CGPM and the CIPM | SI/decisions | + + +## 3. Getting started +The Application Programming Interface provides a set of predefined SPARQL queries to retrieve the information in the +knowledge graph. The available calls are described below and in the Swagger interface +at https://si-digital-framework.org/api-docs/swagger-ui/?urls.primaryName=SI%20REFERENCE%20POINT. They can be used to +retrieve information about the units, prefixes, defining constants, related official decisions, and kinds of quantity. +They also underpin the web interface. + +### 3.1 Authentication and Authorization +The API of the beta-version of the SI Reference Point is openly available at + +
https://si-digital-framework.org/api-docs/swagger-ui/?urls.primaryName=SI%20REFERENCE%20POINT
+under the Creative Commons Attribution 3.0 Intergovernmental Organization license +([CC BY 3.0 IGO](https://creativecommons.org/licenses/by/3.0/igo/)). Currently, no pre-registration is required, but +please note that during the beta-testing phase the API calls provided may be subject to revision. During this phase +(at least until the end of 2024), two weeks' notice will be given, via the website and the GitHub site, to announce +upcoming changes. The changes will be logged on the GitHub site. + +Once the official version is released, registration of users will be encouraged to facilitate the communication of any +further changes to the API. A rate limit of XXXX is in place. + +### 3.2 API calls +The API queries can be triggered through the [Swagger interface](https://si-digital-framework.org/api-docs/swagger-ui/?urls.primaryName=SI%20REFERENCE%20POINT) or by a Command Line Interface (CLI). + +The header information can be adjusted as follows to return data in JSON, JSON-LD, XML, HTML or TTL formats, respectively: +* `curl -H "accept: application/json"` +* `curl -H "accept: application/ld+json"` +* `curl -H "accept: application/xml"` +* `curl -H "accept: application/html"` +* `curl -H "accept: application/octet-stream"` + +The names of the calls indicated below should be appended to the base URL `si-digital-framework.org/`. Thus, the call +`SI/units`, for example, listed below represents `https://si-digital-framework.org/SI/units`. + +| GET Query | Action | Mandatory parameters | Optional parameters | Effect | +|:---------------------|:-------------------------------------------------------------------|:---------------------------------------------------------------------------------|:--------------------|:-----------------------------------------------------------| +| `SI/units` | returns complete list of units | | | default language is English | +| | | | `lang=en` | text in English | +| | | | `lang=fr` | text in French | +| `SI/units/{name}` | information about specified unit `{name}` | `{name}` of unit | | default language is English; default date is date of query | +| | | | `lang=en` | text in English | +| | | | `lang=fr` | text in French | +| | | | `date=YYYY-MM-DD` | information at specified date | +| `SI/prefixes` | returns list of SI prefixes | | | default language is English; default date is date of query | +| | | | `lang=en` | text in English | +| | | | `lang=fr` | text in French | +| `SI/prefixes/{name}` | information about specified prefix `{name}` | `{name}` of prefix | | default language is English | +| | | | `lang=en` | text in English | +| | | | `lang=fr` | text in French | +| `constants` | returns list of defining constants | | | default language is English | +| | | | `lang=en` | text in English | +| | | | `lang=fr` | text in French | +| `constants/{name}` | information about specified constant `{name}` | `{name}` (shortened) name of constant as returned by the previous call | | default language is English | +| | | | `lang=en` | text in English | +| | | | `lang=fr` | text in French | +| `quantities` | returns list of kinds of quantity currently included in the system | | | default language is English | +| | | | `lang=en` | text in English | +| | | | `lang=fr` | text in French | +| `quantities/{code}` | information about specified quantity `{code}` | {code} is the four-letter code for the quantity as returned by the previous call | | default language is English | +| | | | `lang=en` | text in English | +| | | | `lang=fr` | text in French | + +#### Examples + +**`SI/units`** +* ```curl -X GET "https://si-digital-framework.org/SI/units" -H "accept: application/json"``` (on linux/MacOS) +* ```curl -X GET "https://si-digital-framework.org/SI/units?lang=fr" -H "accept: application/json"``` +* ```curl -X GET "https://si-digital-framework.org/SI/units" -Headers "{accept='application/json'}``` (on Windows) + +will return a complete list of the units: the SI base units, SI derived units with special names, and non-SI units allowed for use with the SI units. + +Optional parameters: +* `lang=fr` (to return French texts) or `lang=en` (the default setting: English) + +**`SI/units/{name}`** + +* ```curl -X GET "https://www.si-digital-framework.org/SI/units/degreeCelsius"``` +* ```curl -X GET "https://www.si-digital-framework.org/SI/units/kilogram?lang=fr&date=2007-11-21"``` + +will return respectively information about the degree Celsius and information in French relating to the unit "kilogram" as at (and up until) 21 November 2007. + +The mandatory parameter {name} is the English name of the unit (written without spaces). + +Optional parameters: + * `lang=fr` (to return French information) or `lang=en` (the default setting: English) + * `date=YYYY-MM-DD` (e.g. `date=2024-02-14` for 14 February 2024); the default setting is the query date + +**`SI/prefixes`** +* ```curl -X GET "https://www.si-digital-framework.org/SI/prefixes?lang=fr" -H "accept: application/xml"``` +will return (in XML format and French text) information about all the SI prefixes. + +Optional parameters +* `lang=fr` (to return French information) or `lang=en` (for English: default setting) + +**`SI/prefixes/{name}`** +* ```curl -X GET "https://www.si-digital-framework.org/SI/prefixes/mega?lang=fr" -H "accept: application/json"``` + +will return (in JSON format and French text) information about the SI prefix "mega" (méga). +The mandatory parameter {name} is the English name of the prefix. + +Optional parameters: +* `lang=fr` (to return French information) or `lang=en` (for English: default setting) + + +**`constants`** +* ```curl -X GET "https://si-digital-framework.org/constants?lang=en" -H "accept: application/json"``` + +will return information about the defining constants. (Note: The knowledge base is currently restricted to the seven +constants defining the SI.) + +Optional parameters: +* `lang=fr` (to return French information) or `lang=en` (for English: default setting) + +**`constants/{parameter}`** +```curl -X GET "https://si-digital-framework.org/constants/PlanckConstant?lang=en" -H "accept: application/json"``` + +will return (in JSON format) information in English about the Planck constant. {parameter} is the ID of the constant as +listed by `constants`. It is a shortened version of the English name (written without spaces) and in CamelCase +(camel caps), with an initial capital letter and no spaces. For confirmation of the name to use, please refer to the +output of `constants`. + +Optional parameters: +* `lang=fr` (to return French information) or `lang=en` (for English: default setting) + + +## 3.3 Parser and compound units + +## 4. Error messages + +## 5. HTTP/HTTPS + diff --git a/docs/fig/API_panel.png b/docs/images/api_panel.png similarity index 100% rename from docs/fig/API_panel.png rename to docs/images/api_panel.png diff --git a/docs/fig/graphdb_example.png b/docs/images/graphdb_example.png similarity index 100% rename from docs/fig/graphdb_example.png rename to docs/images/graphdb_example.png diff --git a/docs/fig/global_SI_reference_point_schema.png b/docs/images/sirp_schema.png similarity index 100% rename from docs/fig/global_SI_reference_point_schema.png rename to docs/images/sirp_schema.png diff --git a/docs/install_in_pycharm.md b/docs/install_in_pycharm.md deleted file mode 100644 index 656297c..0000000 --- a/docs/install_in_pycharm.md +++ /dev/null @@ -1,11 +0,0 @@ -# Installation using pycharm - -Using the "Community edition" - -Starting from a blank project, I would advise to use the package manager and install `si_ref_point` as an external package (via the "python package", second icon from the top on the right vertical toolbar.) One can "add package" either from disk or from git. The latest version works also if you download as a zip file from github (`setuptools_scm` removed to allow that). - -One can tick the "editable" box while doing so, to achieve the same effect as the "pip -e" option. - -Then, upon successful installation, opening a terminal via the 3rd icon from the bottom would give you access to a functional "`generate_turtle_files`" command and generate the TTLs. - -Reading and editing the `si_ref_point` code is done through using the "Open..." option from the main menu, and attach it to the current project. diff --git a/docs/pycharm.md b/docs/pycharm.md new file mode 100644 index 0000000..ad1028b --- /dev/null +++ b/docs/pycharm.md @@ -0,0 +1,14 @@ +# Installation using PyCharm + +Starting from a blank project, I would advise to use the package manager and install `si_ref_point` as an external +package (via the "python package", second icon from the top on the right vertical toolbar.) One can "add package" either +from disk or from git. The latest version works also if you download as a zip file from GitHub (`setuptools_scm` removed +to allow that). + +One can tick the "editable" box while doing so, to achieve the same effect as the "pip -e" option. + +Then, upon successful installation, opening a terminal via the 3rd icon from the bottom would give you access to a +functional "`generate_turtle_files`" command and generate the TTLs. + +Reading and editing the `si_ref_point` code is done through using the "Open..." option from the main menu, and attach +it to the current project. diff --git a/docs/combined_units_to_str/gen_list.py b/docs/scripts/list_quantities.py similarity index 91% rename from docs/combined_units_to_str/gen_list.py rename to docs/scripts/list_quantities.py index 7b1d65c..676deac 100644 --- a/docs/combined_units_to_str/gen_list.py +++ b/docs/scripts/list_quantities.py @@ -1,19 +1,15 @@ -from rdflib import Graph, RDF, URIRef, BNode +""" Generate a list of quantities used in the SI Reference Point """ -import os import logging +from rdflib import Graph, RDF, URIRef, BNode +from config import TTLPATH - -default_path = os.path.abspath(os.path.join(os.path.dirname(__file__), - "..", "..", "TTL")) - +# instantiate graph g = Graph() for ttl_file in ['quantities.ttl', 'units.ttl']: - file_path = os.path.join(default_path, ttl_file) - if not os.path.exists(file_path): - logging.error( - "{} does not exist, did you run generate_turtle_file ?".format( - file_path)) + file_path = TTLPATH / ttl_file + if not file_path: + logging.error("{} does not exist, did you run generate_sirp_files ?".format(file_path)) raise SystemExit g.parse(file_path) @@ -111,9 +107,3 @@ def unitnode_to_str(nodeID) -> str|None: qty, unit, label = row print("{0:4s} | {1:20s} | {2:}".format( g.qname(qty).split(":")[1], unitnode_to_str(unit), label)) - - - - - - diff --git a/docs/vocabulary/MakeVisualizations.py b/docs/scripts/make_visualizations.py similarity index 87% rename from docs/vocabulary/MakeVisualizations.py rename to docs/scripts/make_visualizations.py index ec4930a..5a0f693 100644 --- a/docs/vocabulary/MakeVisualizations.py +++ b/docs/scripts/make_visualizations.py @@ -1,25 +1,24 @@ +""" Add documentation """ + import argparse -from rdflib import Graph, BNode, RDF, Namespace -import os +from rdflib import Graph +from config import TTLPATH, VOCPATH def main(APIPATH): # ------------------------------------------------------------------------ # load ttl files into knowledge graph g = Graph() - g.parse(os.path.join(APIPATH, 'si.ttl')) - g.parse(os.path.join(APIPATH, 'units.ttl')) - g.parse(os.path.join(APIPATH, 'prefixes.ttl')) - g.parse(os.path.join(APIPATH, 'quantities.ttl')) - g.parse(os.path.join(APIPATH, 'constants.ttl')) - g.parse(os.path.join(APIPATH, 'bodies.ttl')) - g.parse(os.path.join(APIPATH, 'cgpm.ttl')) - - + g.parse(APIPATH / 'si.ttl') + g.parse(APIPATH / 'units.ttl') + g.parse(APIPATH / 'prefixes.ttl') + g.parse(APIPATH / 'quantities.ttl') + g.parse(APIPATH / 'constants.ttl') + g.parse(APIPATH / 'bodies.ttl') + g.parse(APIPATH / 'cgpm.ttl') # ------------------------------------------------------------------------ # get classes - unit_taxonomy_query = """ PREFIX rdfs: PREFIX skos: @@ -87,7 +86,7 @@ def main(APIPATH): """ # Write diagram (mermaid code) - with open('class_diagram_details.md', 'w') as out: + with open(VOCPATH / 'class_diagram_details.md', 'w') as out: out.write("# Diagrams\n") # Unit-related concepts @@ -127,9 +126,9 @@ def main(APIPATH): out.write("classDiagram\ndirection LR\n") res = g.query(comp_unit_query) for item in res: - c, prop, range = item + c, prop, rng = item class_display = c.n3(g.namespace_manager) - range_display = "owl:Thing" if range is None else range.n3(g.namespace_manager) + range_display = "owl:Thing" if rng is None else rng.n3(g.namespace_manager) prop_display = "owl:Thing" if prop is None else prop.n3(g.namespace_manager) print(class_display, superclass_display) @@ -143,8 +142,8 @@ def main(APIPATH): out.write("classDiagram\ndirection LR\n") res = g.query(definition_query) for item in res: - prop, domain, range = item - range_display = "owl:Thing" if range is None else range.n3(g.namespace_manager) + prop, domain, rng = item + range_display = "owl:Thing" if rng is None else rng.n3(g.namespace_manager) domain_display = "owl:Thing" if domain is None else domain.n3(g.namespace_manager) prop_display = "owl:Thing" if prop is None else prop.n3(g.namespace_manager) print(domain_display, prop_display, range_display) @@ -152,7 +151,6 @@ def main(APIPATH): out.write(f"`{domain_display}` --|> `{range_display}` : {prop_display.replace(':', '#colon;')}\n") out.write("```\n") - # convert to pdfs using mermaid-cli: # npx mmdc -i .\class_diagram_details.md -f -e pdf -o class_diagrams_details_converted.md @@ -160,13 +158,12 @@ def main(APIPATH): # npm install -g @mermaid-js/mermaid-cli@10.9.1 -if __name__=="__main__": +if __name__ == "__main__": parser = argparse.ArgumentParser( description="Generate SI ref point vocabulary") parser.add_argument( "--path_to_ttl", - default=os.path.abspath( - os.path.join(os.path.dirname(__file__), "..", "..", "TTL")), + default=TTLPATH, help="Directory where TTLs are stored") args = parser.parse_args() main(args.path_to_ttl) diff --git a/docs/vocabulary/MakeVocabulary.py b/docs/scripts/make_vocabulary.py similarity index 84% rename from docs/vocabulary/MakeVocabulary.py rename to docs/scripts/make_vocabulary.py index f428ef8..628d384 100644 --- a/docs/vocabulary/MakeVocabulary.py +++ b/docs/scripts/make_vocabulary.py @@ -1,23 +1,27 @@ +""" Create a vocabulary file """ + import argparse from rdflib import Graph, BNode, RDF -import os +from config import TTLPATH, VOCPATH def main(APIPATH): # ------------------------------------------------------------------------ # load ttl files into knowledge graph g = Graph() - g.parse(os.path.join(APIPATH, 'si.ttl')) - g.parse(os.path.join(APIPATH, 'units.ttl')) - g.parse(os.path.join(APIPATH, 'prefixes.ttl')) - g.parse(os.path.join(APIPATH, 'quantities.ttl')) - g.parse(os.path.join(APIPATH, 'constants.ttl')) - g.parse(os.path.join(APIPATH, 'cgpm.ttl')) - + g.parse(APIPATH / 'si.ttl') + g.parse(APIPATH / 'units.ttl') + g.parse(APIPATH / 'prefixes.ttl') + g.parse(APIPATH / 'quantities.ttl') + g.parse(APIPATH / 'constants.ttl') + g.parse(APIPATH / 'bodies.ttl') + g.parse(APIPATH / 'decisions.ttl') + g.parse(APIPATH / 'cctf.ttl') + g.parse(APIPATH / 'cgpm.ttl') + g.parse(APIPATH / 'cipm.ttl') # ------------------------------------------------------------------------ # get classes - class_query = """ PREFIX rdfs: PREFIX skos: @@ -51,17 +55,16 @@ def main(APIPATH): sc = g.qname(element['Superclass']) except (ValueError, TypeError): sc = "owl:Class" - diagram[g.qname(element['Class'])] = {'superclass': sc, - 'predicates': []} + diagram[g.qname(element['Class'])] = {'superclass': sc, 'predicates': []} - with open('vocabulary.md', 'w') as output_file: + with open(VOCPATH / 'vocabulary.md', 'w') as output_file: for subject in class_list: topic = subject['class'].n3(g.namespace_manager) - print(topic+": ", end="") + print(topic + ": ", end="") predicate_query = """ - PREFIX si: + PREFIX si: PREFIX owl: - PREFIX rb: + PREFIX rb: PREFIX rdfs: SELECT DISTINCT ?Predicate ?Domain ?Range ?Comment ?Comment_wo WHERE @@ -126,12 +129,12 @@ def main(APIPATH): output_file.write("\n") # Write diagram (mermaid code) - with open('class_diagram.md', 'w') as out: + with open(VOCPATH / 'class_diagram.md', 'w') as out: out.write("classDiagram\n") for cl, vals in diagram.items(): if vals['superclass'] != "owl:Class": out.write("\t`{}`<|--`{}`\n".format(vals['superclass'], - cl)) + cl)) for cl, vals in diagram.items(): already_shown = [] out.write("\tclass `{}`{{\n".format(cl)) @@ -151,8 +154,8 @@ def main(APIPATH): def parse_multi(g, nodeID): + items = [] for s, p, o in g.triples((nodeID, None, None)): - items = [] if "owl#oneOf" in str(p) or "owl#unionOf" in str(p): next_node = o next_node_string = "" @@ -169,13 +172,10 @@ def parse_multi(g, nodeID): return items -if __name__=="__main__": - parser = argparse.ArgumentParser( - description="Generate SI ref point vocabulary") - parser.add_argument( - "--path_to_ttl", - default=os.path.abspath( - os.path.join(os.path.dirname(__file__), "..", "..", "TTL")), - help="Directory where TTLs are stored") +if __name__ == "__main__": + parser = argparse.ArgumentParser(description="Generate an SI Reference Point vocabulary") + parser.add_argument("--path_to_ttl", + default=TTLPATH, + help="Directory where TTLs are stored") args = parser.parse_args() main(args.path_to_ttl) diff --git a/docs/SI_Reference_Point.md b/docs/sirp.md similarity index 57% rename from docs/SI_Reference_Point.md rename to docs/sirp.md index f512b68..8f6bf5b 100644 --- a/docs/SI_Reference_Point.md +++ b/docs/sirp.md @@ -2,10 +2,16 @@ ## 1. Scope -The [SI Reference Point](http://si-digital-framework.org/SI) is a part of the SI Digital Framework, an effort undertaken by the [Bureau International des Poids et Mesures](https://bipm.org) to digitalize metrology. The [SI Reference Point](http://si-digital-framework.org/SI) offers a suite of tools that render the information from the SI Brochures available in a machine-readable format and is thus at the very heart of the SI Digital Framework. It is designed to serve as the authoritative digital reference for the +The [SI Reference Point](http://si-digital-framework.org/SI) is a part of the SI Digital Framework, an effort undertaken by the +[International Committee for Weights and Measures](https://www.bipm.org/en/committees/ci/cipm) to digitalize metrology, endorsed by a growing coalition of international scientific and quality infrastructure organisations through a [Joint Statement of Intent](https://www.bipm.org/en/-/2022-03-30-digital-statement). The [SI Reference Point](http://si-digital-framework.org/SI) offers a suite +of tools that render the information from the SI Brochures available in a machine-readable format and is thus at the +very heart of the SI Digital Framework. It is designed to serve as the authoritative digital reference for the [International System of Units (SI)](https://www.bipm.org/measurement-units/). -The present document provides a general overview of the SI Reference Point for unsers who wish to utilize the information published by the BIPM. A more detailed description for advanced used cases, inclusing information for a local installation of the package, a description of the Application Programming Interface (API), and the underlying knowledge graph files is available separately. +The present document provides a general overview of the SI Reference Point for unsers who wish to utilize the +information published by the BIPM. A more detailed description for advanced used cases, inclusing information for a +local installation of the package, a description of the Application Programming Interface (API), and the underlying +knowledge graph files is available separately. The present document is structured as follows: * Section 2 details the information covered by the SI Reference Point. @@ -21,50 +27,59 @@ The SI Reference Point is based on five main pillars, or knowledge graphs: * SI base units (Table 2 of [1]) * SI derived units with special names (Table 4 of [1]) * Non-SI units allowed for use with the SI (Table 8 of [1]) - * Compound units (the examples given in Tables 5 and 6 of [1] plus additional examples from the BIPM key comparison database (KCDB) [2]) -1. **[SI/prefixes](http://si-digital-framework.org/SI/prefixes)** + * Compound units (the examples given in Tables 5 and 6 of [1] plus additional examples from the BIPM key + comparison database (KCDB) [2]) +2. **[SI/prefixes](http://si-digital-framework.org/SI/prefixes)** * SI prefixes (Table 7 of [1]) -1. **[Constants](http://si-digital-framework.org/constants)** +3. **[Constants](http://si-digital-framework.org/constants)** * Initially the 7 defining constants of the SI (Table 1 of [1]) -1. **[Quantities](http://si-digital-framework,org/quantities)** +4. **[Quantities](http://si-digital-framework,org/quantities)** * SI base quantities (Table 3 of [1]) * Other example quantities (Tables 5 and 6 of [1]) - * Other quantities in the BIPM key comparison database (KCDB)) -1. **[SI/decisions](http://si-digital-framework.org/SI/decisions)** - * Decisions relating to the SI, taken by the [General Conference on Weights and Measures (CGPM)](https://www.bipm.org/en/committees/cg/cgpm) and the [International Committee for Weights and Measures (CIPM)](https://www.bipm.org/en/committees/ci/cipm) (Appendix 1 of [1]) + * Other quantities in the BIPM key comparison database (KCDB) +5. **[SI/decisions](http://si-digital-framework.org/SI/decisions)** + * Decisions relating to the SI, taken by the [General Conference on Weights and Measures (CGPM)](https://www.bipm.org/en/committees/cg/cgpm) and the + [International Committee for Weights and Measures (CIPM)](https://www.bipm.org/en/committees/ci/cipm) (Appendix 1 of [1]) ##### Remarks -- The current version of the SI Reference Point covers exclusively the 7 defining constants of the SI. For a comprehensive list of constants and their recommended values, consult [3] -- The SI/decisions information is presented in a stand-alone file, but interfaces with another component of the SI Digital Framework under development, covering responsible bodies within the BIPM the (e.g [General Conference on Weights and Measures (CGPM)](https://www.bipm.org/en/committees/cg/cgpm) or the [International Committee for Weights and Measures (CIPM)](https://www.bipm.org/en/committees/ci/cipm) ). +- The current version of the SI Reference Point covers exclusively the 7 defining constants of the SI. For a + comprehensive list of constants and their recommended values, consult [3]. +- The SI/decisions information is presented in a stand-alone file, but interfaces with another component of the SI + Digital Framework under development, covering responsible bodies within the BIPM the (e.g., + [General Conference on Weights and Measures (CGPM)](https://www.bipm.org/en/committees/cg/cgpm) or the + [International Committee for Weights and Measures (CIPM)](https://www.bipm.org/en/committees/ci/cipm)). **Table 1.** List of tables in the SI Brochure [1] and corresponding information in the SI Reference Point -| Table | Title | Encoded in| -| :----- | :----- | :---- | -| 1 | The seven defining constants of the SI and the seven corresponding units they define | constants | -| 2 | SI base units | SI/units | -| 3 | Base quantities and dimensions used in the SI | quantities | -| 4 | The 22 SI units with special names and symbols | SI/units | -| 5 | Examples of coherent derived units in the SI expressed in terms of base units | SI/units | -| 6 | Examples of SI coherent derived units whose names and symbols include SI coherent derived units with special names and symbol | SI/units | -| 7 | SI prefixes | SI/prefixes| -| 8 | Non-SI units accepted for use with the SI units | SI/units | -| App. 1 | Decisions of the CGPM and the CIPM | SI/decisions | +| Table | Title | Encoded in | +|:--------------------|:------------------------------------------------------------------------------------------------------------------------------|:-------------| +| 1 | The seven defining constants of the SI and the seven corresponding units they define | constants | +| 2 | SI base units | SI/units | +| 3 | Base quantities and dimensions used in the SI | quantities | +| 4 | The 22 SI units with special names and symbols | SI/units | +| 5 | Examples of coherent derived units in the SI expressed in terms of base units | SI/units | +| 6 | Examples of SI coherent derived units whose names and symbols include SI coherent derived units with special names and symbol | SI/units | +| 7 | SI prefixes | SI/prefixes | +| 8 | Non-SI units accepted for use with the SI units | SI/units | +| App. 1 | Decisions of the CGPM and the CIPM | SI/decisions | #### Tools -The SI Reference Point provides also a tool to allow for machine-encoding and interpretation of prefixed and other combined units (µm, m2, m s-1, etc.). +The SI Reference Point provides also a tool to allow for machine-encoding and interpretation of prefixed and other +combined units (µm, m2, m s-1, etc.). --> !! USAGE !! <--- ## 3. Data model -The information contained in the ninth editions of the SI Brochure has been encoded semantically and made publicly available on the internet at: +The information contained in the ninth edition of the SI Brochure has been encoded semantically and made publicly +available on the internet at: [si-digital-framework.org/SI](http://si-digital-framework.org/SI) -The figure below shows the data model developed for this purpose. For a full list of the classes and predicates please refer to the GitHub site (see Annex 1). +The figure below shows the data model developed for this purpose. For a full list of the classes and predicates please +refer to the GitHub site (see Annex 1). ```mermaid classDiagram @@ -194,49 +209,54 @@ classDiagram ## 4. Browsing the knowledge graphs ### General +The set of knowledge graphs are presented in the form of TTL files, which can be browsed by different means as outlined +below. As they are interlinked, the five TTL files should be available together for parsing by the chosen application. +The information can then be displayed and exploited according to the services offered by the application. -The set of knowledge graphs are presented in the form of TTL files, which can be browsed by different means as outlined below. As they are interlinked, the five TTL files should be available together for parsing by the chosen application. The information can then be displayed and exploited according to the services offered by the application. - -Following standard practice, the TTL files are divided between a “T-box”, specifying the data model at the “SI” level, and “A-boxes”, specifying the data entries at the “units”, “prefixes” and “decisions” levels. - - -![image](./fig/global_SI_reference_point_schema.png) +Following standard practice, the TTL files are divided between a “T-box”, specifying the data model at the “SI” level, +and “A-boxes”, specifying the data entries at the “units”, “prefixes” and “decisions” levels. +![image](images/sirp_schema.png) ### Application Programming Interface (API) -The web interface at https://si-digital-framework.org/SI is designed to simplify access to the knowledge graphs for a human reader. Underpinning the web pages are a set of pre-programmed calls to the TTL files, such as (expressed as words rather than data requests) “list all the SI units”, “list all the SI prefixes”, “what is the current definition of the metre”, etc. +The web interface at https://si-digital-framework.org/SI is designed to simplify access to the knowledge graphs for a +human reader. Underpinning the web pages are a set of pre-programmed calls to the TTL files, such as (expressed as words +rather than data requests): “list all the SI units”, “list all the SI prefixes”, +“what is the current definition of the metre”, etc. The same pre-programmed queries (API calls) are documented in the Swagger interface at [https://si-digital-framework.org/api-docs/swagger-ui](https://si-digital-framework.org/api-docs/swagger-ui) Select the service `SI REFERENCE POINT` from the drop-down menu at the top right of the screen. -![image](./fig/API_panel.png) +![image](images/api_panel.png) -The responses will be given according to the header information, which can be modified manually from a Command Line Interface if desired. For example: -* `-H ‘accept:application/json’` will return JSON code +The responses will be given according to the header information, which can be modified manually from a Command Line +Interface if desired. For example: +* `-H ‘accept:application/json’` will return JSON code * `-H ‘accept:application/xml’` will return XML code -* `-H ‘accept:application/octet-stream’` will return the response without change of format (i.e. in TTL) +* `-H ‘accept:application/octet-stream’` will return the response without change of format (i.e. in TTL) ### SPARQL endpoint -The TTL files can also be interrogated directly either using the [SPARQL endpoint](http://si-digital-framework.org/SI/query?lang=en) provided or via a human-friendly tool such as GraphDB. +The TTL files can also be interrogated directly either using the [SPARQL endpoint](http://si-digital-framework.org/SI/query?lang=en) provided or via a human-friendly +tool such as GraphDB. -![image](./fig/graphdb_example.png) +![image](images/graphdb_example.png) As an example, to browse the files visually using GraphDB: * Download the (free) (GraphDB Desktop software)[https://www.ontotext.com/products/graphdb/] and install it on your computer. * Create a new repository, e.g. SI-MMDD, based on: * PREFIX skos: - * PREFIX si: - * PREFIX units: - * PREFIX prefixes: - * PREFIX decisions: - * PREFIX constants: - * PREFIX quantities: + * PREFIX si: + * PREFIX units: + * PREFIX prefixes: + * PREFIX decisions: + * PREFIX constants: + * PREFIX quantities: GraphDB also provides an interface for visual exploration of the knowledge graphs. @@ -249,9 +269,11 @@ GraphDB also provides an interface for visual exploration of the knowledge graph ### Acknowlegements -This project was undertaken as part of the BIPM's Work Programme in Digital Transformation, with contributions from seconding NMIs. +This project was undertaken as part of the BIPM's Work Programme in Digital Transformation, with contributions +from seconding NMIs. -Janet Miles (Head of Digital Transformation, BIPM) thanks in particular the following colleagues (listed alphabetically), who all made invaluable contributions: +The BIPM thanks in particular the following colleagues (listed alphabetically), +who all made invaluable contributions: * Amin Ben Abdallah * Stuart Chalk (UNF) @@ -259,7 +281,7 @@ Janet Miles (Head of Digital Transformation, BIPM) thanks in particular the foll * Maximilian Gruber (PTB) * Jean-Laurent Hippolyte (NPL) * Frédéric Meynadier (BIPM) - +* Janet Miles (BIPM, now OIML) ## Annex 1: List of Namespaces, Classes and Predicates @@ -273,26 +295,31 @@ A complete list of Classes and Predicates contained in the knowledge graphs will soon be available. ### Namespaces + #### ~bodies * https://si-digital-framework.org/bodies# * https://si-digital-framework.org/bodies/CGPM# -* https://si-digital-framwework.org/bodies/CIPM# +* https://si-digital-framework.org/bodies/CIPM# +* https://si-digital-framework.org/bodies/CCTF# * https://si-digital-framework.org/bodies/AUV# (not yet implemented) * https://si-digital-framework.org/bodies/CCEM# (not yet implemented) * https://si-digital-framework.org/bodies/CCL# (not yet implemented) * https://si-digital-framework.org/bodies/CCM# (not yet implemented) * https://si-digital-framework.org/bodies/CCPR# (not yet implemented) * https://si-digital-framework.org/bodies/CCT# (not yet implemented) -* https://si-digital-framework.org/bodies/CCTF# (not yet implemented) * https://si-digital-framework.org/bodies/CCQM# (not yet implemented) * https://si-digital-framework.org/bodies/CCU# (not yet implemented) + #### ~constants * https://si-digital-framework.org/constants# + #### ~kcdb * https://si-digital-framework.org/kcdb-sc# * https://si-digital-framework.org/kcdb-cmc# + #### ~quantities * https://si-digital-framework.org/quantities# + #### ~SI * https://si-digital-framework.org/SI# * https://si-digital-framework.org/SI/decisions# @@ -300,3 +327,4 @@ will soon be available. * https://si-digital-framework.org/SI/units# ### Classes and Predicates +TODO: ??? \ No newline at end of file diff --git a/docs/vocabulary/class_diagram.md b/docs/vocabulary/class_diagram.md new file mode 100644 index 0000000..d133c3b --- /dev/null +++ b/docs/vocabulary/class_diagram.md @@ -0,0 +1,131 @@ +classDiagram + `si:QuantityKind`<|--`si:CompoundQuantityKind` + `si:MeasurementUnit`<|--`si:CompoundUnit` + `si:CompoundUnit`<|--`si:PrefixedUnit` + `si:CompoundQuantityKind`<|--`si:QuantityKindPower` + `si:CompoundQuantityKind`<|--`si:QuantityKindProduct` + `si:MeasurementUnit`<|--`si:SIBaseUnit` + `si:MeasurementUnit`<|--`si:SISpecialNamedUnit` + `si:CompoundUnit`<|--`si:UnitMultiple` + `si:CompoundUnit`<|--`si:UnitPower` + `si:CompoundUnit`<|--`si:UnitProduct` + `si:MeasurementUnit`<|--`si:nonSIUnit` + class `si:CompoundQuantityKind`{ + } + class `si:CompoundUnit`{ + } + class `si:Constant`{ + +si:hasDatatype + +si:hasDefiningResolution + +si:hasUnit + +si:hasUpdatedDate + +si:hasValue + +si:hasValueAsString + +si:hasDefiningEquation + } + class `si:Definition`{ + +si:hasDefiningResolution + +si:hasDefiningConstant + +si:hasDefiningEquation + +si:hasDefiningText + +si:hasDefinitionNote + +si:hasEndValidity + +si:hasNextDefinition + +si:hasPreviousDefinition + +si:hasStartValidity + +si:hasStatus + } + class `si:DefinitionNote`{ + +si:hasNoteIndex + +si:hasNoteText + } + class `si:MeasurementUnit`{ + +si:prefixRestriction + +si:isUnitOfQtyKind + +si:hasUnitTypeAsString + } + class `si:PrefixedUnit`{ + +si:hasNonPrefixedUnit + +si:hasPrefix + } + class `si:QuantityKind`{ + +si:hasUnit + } + class `si:QuantityKindPower`{ + } + class `si:QuantityKindProduct`{ + } + class `si:SIBaseUnit`{ + +si:prefixRestriction + +si:hasDefinition + +si:hasUnitTypeAsString + } + class `si:SIDecision`{ + +si:correspondingResolution + +si:isDecisionOf + } + class `si:SIDecisionTarget`{ + +si:hasDecision + +si:isTargetOf + } + class `si:SIPrefix`{ + +si:hasDatatype + +si:hasScalingFactor + } + class `si:SISpecialNamedUnit`{ + +si:prefixRestriction + +si:hasUnitTypeAsString + } + class `si:UnitMultiple`{ + +si:hasNumericFactor + +si:hasNumericFactorAsString + +si:hasUnitTerm + } + class `si:UnitPower`{ + +si:hasNumericExponent + +si:hasUnitBase + } + class `si:UnitProduct`{ + +si:hasUnitTerm + +si:hasLeftUnitTerm + +si:hasRightUnitTerm + } + class `si:nonSIUnit`{ + +si:prefixRestriction + +si:hasUnitTypeAsString + } + `si:Constant` --o `rb:Resolution` + `si:Constant` --o `si:MeasurementUnit` + `si:Constant` --o `xsd:date` + `si:Constant` --o `rdfs:Literal` + `si:Constant` --o `xsd:string` + `si:Definition` --o `rb:Resolution` + `si:Definition` --o `si:Constant` + `si:Definition` --o `rdfs:Literal` + `si:Definition` --o `si:DefinitionNote` + `si:Definition` --o `xsd:date` + `si:Definition` --o `si:Definition` + `si:DefinitionNote` --o `rdfs:Literal` + `si:MeasurementUnit` --o `xsd:boolean` + `si:MeasurementUnit` --o `si:QuantityKind` + `si:MeasurementUnit` --o `rdfs:Literal` + `si:PrefixedUnit` --o `si:MeasurementUnit` + `si:PrefixedUnit` --o `si:SIPrefix` + `si:QuantityKind` --o `si:MeasurementUnit` + `si:SIBaseUnit` --o `xsd:boolean` + `si:SIBaseUnit` --o `si:Definition` + `si:SIBaseUnit` --o `rdfs:Literal` + `si:SIDecision` --o `rb:Resolution` + `si:SIDecision` --o `si:SIDecisionTarget` + `si:SIDecisionTarget` --o `si:SIDecision` + `si:SIDecisionTarget` --o `si:SIDecisionScope` + `si:SIPrefix` --o `rdfs:Literal` + `si:SISpecialNamedUnit` --o `xsd:boolean` + `si:SISpecialNamedUnit` --o `rdfs:Literal` + `si:UnitMultiple` --o `xsd:string` + `si:UnitMultiple` --o `si:MeasurementUnit` + `si:UnitPower` --o `xsd:short` + `si:UnitPower` --o `si:MeasurementUnit` + `si:UnitProduct` --o `si:MeasurementUnit` + `si:nonSIUnit` --o `xsd:boolean` + `si:nonSIUnit` --o `rdfs:Literal` diff --git a/docs/vocabulary/class_diagram_details.md b/docs/vocabulary/class_diagram_details.md new file mode 100644 index 0000000..9a25106 --- /dev/null +++ b/docs/vocabulary/class_diagram_details.md @@ -0,0 +1,62 @@ +# Diagrams +## Unit-related Concepts +```mermaid +%%{init: { 'class': {'hideEmptyMembersBox':true} } }%% +classDiagram +direction RL +`si:CompoundUnit` --|> `si:MeasurementUnit` : rdfs#colon;subClassOf +`si:PrefixedUnit` --|> `si:CompoundUnit` : rdfs#colon;subClassOf +`si:SIBaseUnit` --|> `si:MeasurementUnit` : rdfs#colon;subClassOf +`si:SISpecialNamedUnit` --|> `si:MeasurementUnit` : rdfs#colon;subClassOf +`si:UnitMultiple` --|> `si:CompoundUnit` : rdfs#colon;subClassOf +`si:UnitPower` --|> `si:CompoundUnit` : rdfs#colon;subClassOf +`si:UnitProduct` --|> `si:CompoundUnit` : rdfs#colon;subClassOf +`si:nonSIUnit` --|> `si:MeasurementUnit` : rdfs#colon;subClassOf +``` +## QuantityKind-related Concepts +```mermaid +%%{init: { 'class': {'hideEmptyMembersBox':true} } }%% +classDiagram +direction RL +`si:CompoundQuantityKind` --|> `si:QuantityKind` : rdfs#colon;subClassOf +`si:QuantityKindPower` --|> `si:CompoundQuantityKind` : rdfs#colon;subClassOf +`si:QuantityKindProduct` --|> `si:CompoundQuantityKind` : rdfs#colon;subClassOf +``` +## CompoundUnit-related properties +```mermaid +%%{init: { 'class': {'hideEmptyMembersBox':true} } }%% +classDiagram +direction LR +`si:PrefixedUnit` --|> `si:MeasurementUnit` : si#colon;hasNonPrefixedUnit +`si:PrefixedUnit` --|> `si:SIPrefix` : si#colon;hasPrefix +`si:UnitMultiple` --|> `owl:Thing` : si#colon;hasNumericFactor +`si:UnitMultiple` --|> `xsd:string` : si#colon;hasNumericFactorAsString +`si:UnitPower` --|> `xsd:short` : si#colon;hasNumericExponent +`si:UnitPower` --|> `si:MeasurementUnit` : si#colon;hasUnitBase +`si:UnitProduct` --|> `si:MeasurementUnit` : si#colon;hasLeftUnitTerm +`si:UnitProduct` --|> `si:MeasurementUnit` : si#colon;hasRightUnitTerm +``` +## Definition-related properties +```mermaid +%%{init: { 'class': {'hideEmptyMembersBox':true} } }%% +classDiagram +direction LR +`si:Definition` --|> `si:Constant` : si#colon;hasDefiningConstant +`rb:Resolution` --|> `si:Definition` : si#colon;isDefiningResolutionOf +`rb:Resolution` --|> `si:Constant` : si#colon;isDefiningResolutionOf +`si:Definition` --|> `rdfs:Literal` : si#colon;hasDefiningEquation +`si:Constant` --|> `rdfs:Literal` : si#colon;hasDefiningEquation +`si:Constant` --|> `xsd:date` : si#colon;hasUpdatedDate +`si:Constant` --|> `rdfs:Literal` : si#colon;hasValue +`si:Constant` --|> `xsd:string` : si#colon;hasValueAsString +`si:Definition` --|> `rb:Resolution` : si#colon;hasDefiningResolution +`si:Constant` --|> `rb:Resolution` : si#colon;hasDefiningResolution +`si:SIBaseUnit` --|> `si:Definition` : si#colon;hasDefinition +`si:Definition` --|> `si:Definition` : si#colon;hasNextDefinition +`si:Definition` --|> `si:Definition` : si#colon;hasPreviousDefinition +`si:Definition` --|> `rdfs:Literal` : si#colon;hasDefiningText +`si:Definition` --|> `si:DefinitionNote` : si#colon;hasDefinitionNote +`si:Definition` --|> `xsd:date` : si#colon;hasEndValidity +`si:Definition` --|> `rdfs:Literal` : si#colon;hasStatus +`si:Definition` --|> `xsd:date` : si#colon;hasStartValidity +``` diff --git a/docs/vocabulary/vocabulary.md b/docs/vocabulary/vocabulary.md new file mode 100644 index 0000000..c463898 --- /dev/null +++ b/docs/vocabulary/vocabulary.md @@ -0,0 +1,284 @@ +## si:CompoundQuantityKind + +compound quantitykind + +| Predicate | Domain | Range | Comment | +|------------|--------|-------|---------| + +## si:CompoundUnit + +compound unit + +| Predicate | Domain | Range | Comment | +|------------|--------|-------|---------| + +## si:Constant + +defining constant + +| Predicate | Domain | Range | Comment | +|------------|--------|-------|---------| +| rdf:type | | | | +| skos:hiddenLabel | | | | +| skos:prefLabel | | | | +| si:hasDatatype | si:Constant, si:SIPrefix | | | +| si:hasDatatype | si:Constant, si:SIPrefix | | | +| si:hasDefiningResolution | si:Definition, si:Constant | rb:Resolution | Linking an SI definition to the resolution by which it was adopted. | +| si:hasDefiningResolution | si:Definition, si:Constant | rb:Resolution | Linking an SI definition to the resolution by which it was adopted. | +| si:hasSymbol | | xsd:string | Linking a measurement unit or prefix to a symbol. | +| si:hasUnit | si:Constant, si:QuantityKind | si:MeasurementUnit | Linking a measurement unit to an object. | +| si:hasUnit | si:Constant, si:QuantityKind | si:MeasurementUnit | Linking a measurement unit to an object. | +| si:hasUpdatedDate | si:Constant | xsd:date | | +| si:hasValue | si:Constant | rdfs:Literal | | +| si:hasValueAsString | si:Constant | xsd:string | | + +## si:Definition + +definition of a base unit + +| Predicate | Domain | Range | Comment | +|------------|--------|-------|---------| +| rdf:type | | | | +| skos:prefLabel | | | | +| si:hasDefiningConstant | si:Definition | si:Constant | Linking a definition to its defining constant. | +| si:hasDefiningEquation | si:Definition, si:Constant | rdfs:Literal | Linking a SI definition to its defining equation. | +| si:hasDefiningEquation | si:Definition, si:Constant | rdfs:Literal | Linking a SI definition to its defining equation. | +| si:hasDefiningResolution | si:Definition, si:Constant | rb:Resolution | Linking an SI definition to the resolution by which it was adopted. | +| si:hasDefiningResolution | si:Definition, si:Constant | rb:Resolution | Linking an SI definition to the resolution by which it was adopted. | +| si:hasDefiningText | si:Definition | rdfs:Literal | Linking an SI definition to the defining text. | +| si:hasDefinitionNote | si:Definition | si:DefinitionNote | Linking an SI definition to a definition note. | +| si:hasEndValidity | si:Definition | xsd:date | Linking an SI definition to its ending validity date. | +| si:hasNextDefinition | si:Definition | si:Definition | Linking an SI definition version to the next version. | +| si:hasPreviousDefinition | si:Definition | si:Definition | Linking an SI definition version to the previous version. | +| si:hasStartValidity | si:Definition | xsd:date | Linking an SI definition to its starting validity date. | +| si:hasStatus | si:Definition | rdfs:Literal | Linking a SI definition to its status. | +| si:prefixRestriction | si:SIBaseUnit, si:SISpecialNamedUnit, si:nonSIUnit, si:MeasurementUnit | xsd:boolean | | +| si:prefixRestriction | si:SIBaseUnit, si:SISpecialNamedUnit, si:nonSIUnit, si:MeasurementUnit | xsd:boolean | | + +## si:Definition + +definition of a base unit + +| Predicate | Domain | Range | Comment | +|------------|--------|-------|---------| +| rdf:type | | | | +| skos:prefLabel | | | | +| si:hasDefiningConstant | si:Definition | si:Constant | Linking a definition to its defining constant. | +| si:hasDefiningEquation | si:Definition, si:Constant | rdfs:Literal | Linking a SI definition to its defining equation. | +| si:hasDefiningEquation | si:Definition, si:Constant | rdfs:Literal | Linking a SI definition to its defining equation. | +| si:hasDefiningResolution | si:Definition, si:Constant | rb:Resolution | Linking an SI definition to the resolution by which it was adopted. | +| si:hasDefiningResolution | si:Definition, si:Constant | rb:Resolution | Linking an SI definition to the resolution by which it was adopted. | +| si:hasDefiningText | si:Definition | rdfs:Literal | Linking an SI definition to the defining text. | +| si:hasDefinitionNote | si:Definition | si:DefinitionNote | Linking an SI definition to a definition note. | +| si:hasEndValidity | si:Definition | xsd:date | Linking an SI definition to its ending validity date. | +| si:hasNextDefinition | si:Definition | si:Definition | Linking an SI definition version to the next version. | +| si:hasPreviousDefinition | si:Definition | si:Definition | Linking an SI definition version to the previous version. | +| si:hasStartValidity | si:Definition | xsd:date | Linking an SI definition to its starting validity date. | +| si:hasStatus | si:Definition | rdfs:Literal | Linking a SI definition to its status. | +| si:prefixRestriction | si:SIBaseUnit, si:SISpecialNamedUnit, si:nonSIUnit, si:MeasurementUnit | xsd:boolean | | +| si:prefixRestriction | si:SIBaseUnit, si:SISpecialNamedUnit, si:nonSIUnit, si:MeasurementUnit | xsd:boolean | | + +## si:DefinitionNote + +unit definition note + +| Predicate | Domain | Range | Comment | +|------------|--------|-------|---------| +| rdf:type | | | | +| si:hasNoteIndex | si:DefinitionNote | rdfs:Literal | The text of a definition note. | +| si:hasNoteText | si:DefinitionNote | rdfs:Literal | The order index of a definition note. | + +## si:MeasurementUnit + +measurement unit + +| Predicate | Domain | Range | Comment | +|------------|--------|-------|---------| +| rdf:type | | | | +| skos:prefLabel | | | | +| si:hasSymbol | | xsd:string | Linking a measurement unit or prefix to a symbol. | +| si:isUnitOfQtyKind | si:MeasurementUnit | si:QuantityKind | Linking a measurement unit to its quantity kind. | +| si:prefixRestriction | si:SIBaseUnit, si:SISpecialNamedUnit, si:nonSIUnit, si:MeasurementUnit | xsd:boolean | | +| si:prefixRestriction | si:SIBaseUnit, si:SISpecialNamedUnit, si:nonSIUnit, si:MeasurementUnit | xsd:boolean | | + +## si:PrefixedUnit + +prefixed unit + +| Predicate | Domain | Range | Comment | +|------------|--------|-------|---------| +| rdf:type | | | | +| skos:prefLabel | | | | +| si:hasDefinition | si:SIBaseUnit | si:Definition | Linking an SI base unit to its definition. | +| si:hasNonPrefixedUnit | si:PrefixedUnit | si:MeasurementUnit | | +| si:hasPrefix | si:PrefixedUnit | si:SIPrefix | | +| si:hasSymbol | | xsd:string | Linking a measurement unit or prefix to a symbol. | +| si:hasUnitTypeAsString | si:SIBaseUnit, si:SISpecialNamedUnit, si:nonSIUnit, si:MeasurementUnit | rdfs:Literal | | +| si:hasUnitTypeAsString | si:SIBaseUnit, si:SISpecialNamedUnit, si:nonSIUnit, si:MeasurementUnit | rdfs:Literal | | +| si:isUnitOfQtyKind | si:MeasurementUnit | si:QuantityKind | Linking a measurement unit to its quantity kind. | + +## si:QuantityKind + +kind of quantity + +| Predicate | Domain | Range | Comment | +|------------|--------|-------|---------| +| rdf:type | | | | +| skos:altLabel | | | | +| skos:prefLabel | | | | +| si:hasUnit | si:Constant, si:QuantityKind | si:MeasurementUnit | Linking a measurement unit to an object. | +| si:hasUnit | si:Constant, si:QuantityKind | si:MeasurementUnit | Linking a measurement unit to an object. | + +## si:QuantityKindPower + +quantitykind power + +| Predicate | Domain | Range | Comment | +|------------|--------|-------|---------| + +## si:QuantityKindProduct + +quantitykind product + +| Predicate | Domain | Range | Comment | +|------------|--------|-------|---------| + +## si:SIBaseUnit + +base unit + +| Predicate | Domain | Range | Comment | +|------------|--------|-------|---------| +| rdf:type | | | | +| skos:prefLabel | | | | +| si:hasDefinition | si:SIBaseUnit | si:Definition | Linking an SI base unit to its definition. | +| si:hasNonPrefixedUnit | si:PrefixedUnit | si:MeasurementUnit | | +| si:hasPrefix | si:PrefixedUnit | si:SIPrefix | | +| si:hasSymbol | | xsd:string | Linking a measurement unit or prefix to a symbol. | +| si:hasUnitTypeAsString | si:SIBaseUnit, si:SISpecialNamedUnit, si:nonSIUnit, si:MeasurementUnit | rdfs:Literal | | +| si:hasUnitTypeAsString | si:SIBaseUnit, si:SISpecialNamedUnit, si:nonSIUnit, si:MeasurementUnit | rdfs:Literal | | +| si:isUnitOfQtyKind | si:MeasurementUnit | si:QuantityKind | Linking a measurement unit to its quantity kind. | + +## si:SIDecision + +SI Decision + +| Predicate | Domain | Range | Comment | +|------------|--------|-------|---------| +| rdf:type | | | | +| rdfs:label | | | | +| skos:related | | | | +| si:correspondingResolution | si:SIDecision | rb:Resolution | | +| si:isDecisionOf | si:SIDecision | si:SIDecisionTarget | | + +## si:SIDecisionTarget + +SI Decision target + +| Predicate | Domain | Range | Comment | +|------------|--------|-------|---------| +| rdf:type | | | | +| rdfs:label | | | | +| si:hasDecision | si:SIDecisionTarget | si:SIDecision | | +| si:isTargetOf | si:SIDecisionTarget | si:SIDecisionScope | | + +## si:SIPrefix + +SI prefix + +| Predicate | Domain | Range | Comment | +|------------|--------|-------|---------| +| rdf:type | | | | +| skos:prefLabel | | | | +| si:hasDatatype | si:Constant, si:SIPrefix | | | +| si:hasDatatype | si:Constant, si:SIPrefix | | | +| si:hasDefiningResolution | si:Definition, si:Constant | rb:Resolution | Linking an SI definition to the resolution by which it was adopted. | +| si:hasDefiningResolution | si:Definition, si:Constant | rb:Resolution | Linking an SI definition to the resolution by which it was adopted. | +| si:hasNumericExponent | si:UnitPower | xsd:short | | +| si:hasScalingFactor | si:SIPrefix | rdfs:Literal | Linking an SI prefix to its scaling factor. | +| si:hasSymbol | | xsd:string | Linking a measurement unit or prefix to a symbol. | + +## si:SIPrefix + +SI prefix + +| Predicate | Domain | Range | Comment | +|------------|--------|-------|---------| +| rdf:type | | | | +| skos:prefLabel | | | | +| si:hasDatatype | si:Constant, si:SIPrefix | | | +| si:hasDatatype | si:Constant, si:SIPrefix | | | +| si:hasDefiningResolution | si:Definition, si:Constant | rb:Resolution | Linking an SI definition to the resolution by which it was adopted. | +| si:hasDefiningResolution | si:Definition, si:Constant | rb:Resolution | Linking an SI definition to the resolution by which it was adopted. | +| si:hasNumericExponent | si:UnitPower | xsd:short | | +| si:hasScalingFactor | si:SIPrefix | rdfs:Literal | Linking an SI prefix to its scaling factor. | +| si:hasSymbol | | xsd:string | Linking a measurement unit or prefix to a symbol. | + +## si:SISpecialNamedUnit + +SI unit with special name + +| Predicate | Domain | Range | Comment | +|------------|--------|-------|---------| +| rdf:type | | | | +| skos:prefLabel | | | | +| si:hasDefiningResolution | si:Definition, si:Constant | rb:Resolution | Linking an SI definition to the resolution by which it was adopted. | +| si:hasDefiningResolution | si:Definition, si:Constant | rb:Resolution | Linking an SI definition to the resolution by which it was adopted. | +| si:hasSymbol | | xsd:string | Linking a measurement unit or prefix to a symbol. | +| si:hasUnitTypeAsString | si:SIBaseUnit, si:SISpecialNamedUnit, si:nonSIUnit, si:MeasurementUnit | rdfs:Literal | | +| si:hasUnitTypeAsString | si:SIBaseUnit, si:SISpecialNamedUnit, si:nonSIUnit, si:MeasurementUnit | rdfs:Literal | | +| si:inBaseSIUnits | | si:MeasurementUnit | | +| si:inOtherSIUnits | | si:MeasurementUnit | | +| si:isUnitOfQtyKind | si:MeasurementUnit | si:QuantityKind | Linking a measurement unit to its quantity kind. | +| si:prefixRestriction | si:SIBaseUnit, si:SISpecialNamedUnit, si:nonSIUnit, si:MeasurementUnit | xsd:boolean | | +| si:prefixRestriction | si:SIBaseUnit, si:SISpecialNamedUnit, si:nonSIUnit, si:MeasurementUnit | xsd:boolean | | + +## si:UnitMultiple + +unit multiple + +| Predicate | Domain | Range | Comment | +|------------|--------|-------|---------| +| rdf:type | | | | +| si:hasNumericFactor | si:UnitMultiple | | | +| si:hasNumericFactorAsString | si:UnitMultiple | xsd:string | | +| si:hasUnitTerm | si:UnitProduct, si:UnitMultiple | si:MeasurementUnit | | +| si:hasUnitTerm | si:UnitProduct, si:UnitMultiple | si:MeasurementUnit | | + +## si:UnitPower + +unit power + +| Predicate | Domain | Range | Comment | +|------------|--------|-------|---------| +| rdf:type | | | | +| si:hasNumericExponent | si:UnitPower | xsd:short | | +| si:hasUnitBase | si:UnitPower | si:MeasurementUnit | | + +## si:UnitProduct + +unit product + +| Predicate | Domain | Range | Comment | +|------------|--------|-------|---------| +| rdf:type | | | | +| si:hasLeftUnitTerm | si:UnitProduct | si:MeasurementUnit | | +| si:hasRightUnitTerm | si:UnitProduct | si:MeasurementUnit | | + +## si:nonSIUnit + +non SI unit + +| Predicate | Domain | Range | Comment | +|------------|--------|-------|---------| +| rdf:type | | | | +| skos:prefLabel | | | | +| si:hasAltSymbol | | xsd:string | Linking a measurement unit or prefix to an alternate symbol. | +| si:hasSymbol | | xsd:string | Linking a measurement unit or prefix to a symbol. | +| si:hasUnitTypeAsString | si:SIBaseUnit, si:SISpecialNamedUnit, si:nonSIUnit, si:MeasurementUnit | rdfs:Literal | | +| si:hasUnitTypeAsString | si:SIBaseUnit, si:SISpecialNamedUnit, si:nonSIUnit, si:MeasurementUnit | rdfs:Literal | | +| si:inOtherSIUnits | | si:MeasurementUnit | | +| si:isUnitOfQtyKind | si:MeasurementUnit | si:QuantityKind | Linking a measurement unit to its quantity kind. | +| si:prefixRestriction | si:SIBaseUnit, si:SISpecialNamedUnit, si:nonSIUnit, si:MeasurementUnit | xsd:boolean | | +| si:prefixRestriction | si:SIBaseUnit, si:SISpecialNamedUnit, si:nonSIUnit, si:MeasurementUnit | xsd:boolean | | + diff --git a/pyproject.toml b/pyproject.toml index 165f510..df1506c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -2,14 +2,13 @@ requires = ["setuptools>=64"] build-backend = "setuptools.build_meta" - [project] name = "si_ref_point" version = "1.0b" description = "SI reference point generation scripts and source data" authors = [ - {name = "Stuart Chalk", email = "n00002621@unf.edu"}, - {name = "Gregor Dudle", email = "gregor.dudle@ost.ch"}, + {name = "Stuart Chalk", email = "schalk@unf.edu"}, + {name = "Gregor Dudle", email = "gregor.dudle@ost.ch"}, {name = "Max Gruber", email = "maximilian.gruber@ptb.de"}, {name = "Jean-Laurent Hippolyte", email = "jean-laurent.hippolyte@npl.co.uk"}, {name = "Frédéric Meynadier", email = "Frederic.Meynadier@bipm.org"}, @@ -28,16 +27,14 @@ dependencies = [ "fastapi", "pydantic>=1.10,<2.0", "pyshacl", - "gitpython" + "gitpython", + "pyvis" ] - [project.urls] repository = "https://github.com/TheBIPM/SI-Reference-Point-2023" - [project.scripts] -generate_turtle_files = "si_ref_point.main:main" -launch_si_test_api = "si_ref_point.test_api.launch_api:main" +generate_sirp_files = "si_ref_point.main:main" diff --git a/src/si_ref_point/aboxes/__init__.py b/src/si_ref_point/aboxes/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/si_ref_point/cuq/constants_abox.py b/src/si_ref_point/aboxes/constants_abox.py similarity index 66% rename from src/si_ref_point/cuq/constants_abox.py rename to src/si_ref_point/aboxes/constants_abox.py index 5f80f5d..b696615 100644 --- a/src/si_ref_point/cuq/constants_abox.py +++ b/src/si_ref_point/aboxes/constants_abox.py @@ -1,17 +1,16 @@ -""" -constants A-Box -""" +""" defining constants A-Box """ from datetime import datetime, timezone import git import os from rdflib import Graph, URIRef, RDF, OWL, SKOS, XSD, RDFS, DCTERMS, Literal, PROV import yaml -from si_ref_point.cuq.cuq_tbox import SiElements -import si_ref_point.cuq.symbols_format as sf -from si_ref_point.settings import CC_LICENCE, CC_LICENCE_TEXT_EN, CC_LICENCE_TEXT_FR, \ - CUQ_FILES_FOLDER, GITHUB_BASE_PATH, SIDFWBASE -from si_ref_point.cuq.units_abox import transform_to_graph + +from si_ref_point.tboxes.si_tbox import SiElements +import si_ref_point.aboxes.symbols_format as sf +from si_ref_point.settings import PKG_ROOT, CC_LICENCE, CC_LICENCE_TEXT_EN, CC_LICENCE_TEXT_FR, \ + SI_FILES_FOLDER, GITHUB_BASE_PATH +from si_ref_point.aboxes.units_abox import transform_to_graph def main(): @@ -19,15 +18,14 @@ def main(): # get the predicates and classes that are common to all cuq files si_graph = SiElements() # produce a separate graph for the constants - constants_graph = Graph() + constants_graph = Graph() # 1) Define the namespaces within (base)/SI - constants_graph.bind("constants",si_graph.namespace_constants) - constants_graph.bind("units",si_graph.namespace_units) - constants_graph.bind("si",si_graph.namespace) - + constants_graph.bind("constants", si_graph.namespace_constants) + constants_graph.bind("units", si_graph.namespace_units) + constants_graph.bind("si", si_graph.namespace) - # 2) Add annotations to the constants-graph + # 2) Add annotations to the constants-graph # 2.1 General annotations (type, labels, comments etc) constants_graph.add( @@ -44,8 +42,8 @@ def main(): (URIRef(si_graph.namespace_constants), RDFS.comment, Literal(("Ontology, part of the SI reference point, covering the " - "seven underpinning constants of the SI"), - datatype=XSD.string)) + "seven underpinning constants of the SI"), + datatype=XSD.string)) ) # 2.2 Versioning (using PROVENANCE vocabulary) @@ -53,30 +51,29 @@ def main(): # It is obtained using the `datetime.now(timezone.utc)` function call. This timestamp is then # formatted into a string representation (`uri_timestamp` and `startedAt_timestamp`) to be used # for uniquely identifying the produced TTL file and for timestamping the activity respectively. - timestamp = datetime.now(timezone.utc) # get the system time (in UTC) - uri_timestamp = timestamp.strftime("%Y%m%d%H%M%SZ") # used to identify uniquely the produced TTL file (entity) - startedAt_timestamp = timestamp.strftime("%Y-%m-%dT%H:%M:%SZ") # used with the predicate 'startedAtTime' of the corresponding activity - repo = git.Repo(search_parent_directories=True) + timestamp = datetime.now(timezone.utc) # get the system time (in UTC) + uri_timestamp = timestamp.strftime("%Y%m%d%H%M%SZ") # used to identify uniquely the produced TTL file (entity) + startedAt_timestamp = timestamp.strftime( + "%Y-%m-%dT%H:%M:%SZ") # used with the predicate 'startedAtTime' of the corresponding activity + repo = git.Repo(PKG_ROOT, search_parent_directories=True) sha = repo.head.object.hexsha # 2.2.1 Agent - # declare this code as an 'agent' (in the sense of PROVENANCE) - # and define URI to a specific version by using its commit on github - agents = [] - agents.append(GITHUB_BASE_PATH +"blob/"+ sha + "/src/si_ref_point/cuq/cuq_tbox.py") - agents.append(GITHUB_BASE_PATH +"blob/"+ sha + "/src/si_ref_point/cuq/constants_abox.py") + # declare this code as an 'agent' (in the sense of PROVENANCE) + # and define URI to a specific version by using its commit on GitHub + agents = [GITHUB_BASE_PATH + "blob/" + sha + "/src/si_ref_point/cuq/si_tbox.py", + GITHUB_BASE_PATH + "blob/" + sha + "/src/si_ref_point/cuq/constants_abox.py"] for agent_sw in agents: constants_graph.add( (URIRef(agent_sw), - RDF.type, - PROV.Agent) + RDF.type, + PROV.Agent) ) # 2.2.2 Entity # declare the sources (YAML files) as 'entitiy' (in the sense of PROVENANCE) # The manually produced YAML files are stored on GitHub. Their hexsha together # with the path is used to define a unique URI for each file. - source_files = [] - source_files.append(GITHUB_BASE_PATH + "blob/" + sha + "/src/si_ref_point/cuq_data/si_constants.yaml") + source_files = [GITHUB_BASE_PATH + "blob/" + sha + "/src/si_ref_point/si/si_constants.yaml"] for source in source_files: constants_graph.add( (URIRef(source), @@ -85,36 +82,36 @@ def main(): ) # declare the ttl output as an 'entity' (in the sense of PROVENANCE) # make the entity unique by adding the timestamp to the identifier of the output file - constants_out_entity ="constants_" + uri_timestamp + ".ttl" + constants_out_entity = "constants_" + uri_timestamp + ".ttl" constants_graph.add( (si_graph.set_entity_uri(constants_out_entity), RDF.type, PROV.Entity) ) - + # 2.2.3 Activity # declare the constants_ttl_generation as 'activity' (in the sense of PROVENANCE) # make the activity unique by adding the timestamp to the identifier of the activity - activity = 'constants_'+uri_timestamp + '.ttl_generation' - + activity = 'constants_' + uri_timestamp + '.ttl_generation' + constants_graph.add( (si_graph.set_activity_uri(activity), - RDF.type, - PROV.Activity) - ) + RDF.type, + PROV.Activity) + ) # 2.2.4 Relation activity, agent, entities # activity - agent for agent_sw in agents: constants_graph.add( - (si_graph.set_activity_uri(activity), - PROV.wasAssociatedWith, - URIRef(agent_sw)) + (si_graph.set_activity_uri(activity), + PROV.wasAssociatedWith, + URIRef(agent_sw)) ) constants_graph.add( - (si_graph.set_activity_uri(activity), - PROV.startedAtTime, - # Literal(str(date.today()), datatype=XSD.date)) - Literal(str(startedAt_timestamp), datatype=XSD.dateTime)) + (si_graph.set_activity_uri(activity), + PROV.startedAtTime, + # Literal(str(date.today()), datatype=XSD.date)) + Literal(str(startedAt_timestamp), datatype=XSD.dateTime)) ) # output entity - source entities @@ -128,8 +125,8 @@ def main(): for agent_sw in agents: constants_graph.add( (si_graph.set_entity_uri(constants_out_entity), - PROV.wasAttributedTo, - URIRef(agent_sw)) + PROV.wasAttributedTo, + URIRef(agent_sw)) ) # output entity - activity constants_graph.add( @@ -138,25 +135,25 @@ def main(): si_graph.set_activity_uri(activity)) ) - # 2.3 Licence information + # 2.3 License information constants_graph.add( - (URIRef(si_graph.namespace_constants), - DCTERMS.license, - URIRef(CC_LICENCE)) + (URIRef(si_graph.namespace_constants), + DCTERMS.license, + URIRef(CC_LICENCE)) ) constants_graph.add( (URIRef(si_graph.namespace_constants), RDFS.comment, - Literal(CC_LICENCE_TEXT_EN,lang="en")) + Literal(CC_LICENCE_TEXT_EN, lang="en")) ) constants_graph.add( (URIRef(si_graph.namespace_constants), RDFS.comment, - Literal(CC_LICENCE_TEXT_FR,lang="fr")) + Literal(CC_LICENCE_TEXT_FR, lang="fr")) ) # 3) Build constants graph - with open(os.path.join(CUQ_FILES_FOLDER,'si_constants.yaml'), + with open(os.path.join(SI_FILES_FOLDER, 'si_constants.yaml'), encoding="utf8") as fp: cst_list = yaml.safe_load(fp) @@ -164,7 +161,7 @@ def main(): element = si_graph.set_constant_uri(cst['id']) constants_graph.add((element, RDF.type, si_graph.constant)) constants_graph.add((element, si_graph.has_value_as_string, - Literal(cst['value_str'], datatype=XSD.string))) + Literal(cst['value_str'], datatype=XSD.string))) # Deprecated in favor of "combined units" style # si_graph.g.add((element, si_graph.hasUnitAsString, # Literal(cst['unit_str'], datatype=XSD.string))) @@ -183,7 +180,7 @@ def main(): si_graph.has_unit, si_graph.set_unit_uri(cst['unit']))) constants_graph.add((element, si_graph.has_value, - Literal(cst['value'], datatype=XSD[cst['xsd_type']], normalize=False))) + Literal(cst['value'], datatype=XSD[cst['xsd_type']], normalize=False))) constants_graph.add((element, si_graph.has_datatype, XSD[cst['xsd_type']])) # note on xsd:double : # RDFLib has a known bug that loses precision in value for xsd:double @@ -192,17 +189,17 @@ def main(): latex_symbol = sf.formattxt(cst['symbol'], 'latex') constants_graph.add((element, si_graph.has_symbol, - Literal(latex_symbol, datatype=XSD.string))) + Literal(latex_symbol, datatype=XSD.string))) constants_graph.add((element, si_graph.has_updated_date, - Literal(cst['updateddate'], datatype=XSD.date))) + Literal(cst['updateddate'], datatype=XSD.date))) constants_graph.add((element, SKOS.prefLabel, - Literal(cst['name_en'], lang="en"))) + Literal(cst['name_en'], lang="en"))) constants_graph.add((element, SKOS.prefLabel, - Literal(cst['name_fr'], lang="fr"))) + Literal(cst['name_fr'], lang="fr"))) constants_graph.add((element, SKOS.hiddenLabel, - Literal(cst['hidden_label'], datatype=XSD.string))) + Literal(cst['hidden_label'], datatype=XSD.string))) constants_graph.add((element, si_graph.has_defining_resolution, - si_graph.set_cgpm_uri(cst['hasDefiningResolution']))) + si_graph.set_cgpm_uri(cst['hasDefiningResolution']))) return constants_graph diff --git a/src/si_ref_point/cuq/decisions_abox.py b/src/si_ref_point/aboxes/decisions_abox.py similarity index 94% rename from src/si_ref_point/cuq/decisions_abox.py rename to src/si_ref_point/aboxes/decisions_abox.py index ce9e17a..4062ee7 100644 --- a/src/si_ref_point/cuq/decisions_abox.py +++ b/src/si_ref_point/aboxes/decisions_abox.py @@ -1,15 +1,11 @@ -""" -Decisions ABox -""" +""" Decisions ABox """ - - -from datetime import date import os -from rdflib import RDF, OWL, URIRef, RDFS, DCTERMS, Literal, SKOS, XSD import yaml -from si_ref_point.cuq.cuq_tbox import SiElements -from si_ref_point.settings import CUQ_FILES_FOLDER +from datetime import date +from rdflib import RDF, OWL, URIRef, RDFS, DCTERMS, Literal, SKOS, XSD +from si_ref_point.tboxes.si_tbox import SiElements +from si_ref_point.settings import SI_FILES_FOLDER def cap1(instr): """Utility method""" @@ -31,7 +27,7 @@ def main(): Literal(str(date.today()), datatype=XSD.date))) # crawl through the items of the YAML file - with open(os.path.join(CUQ_FILES_FOLDER, 'decisions.yaml'), + with open(os.path.join(SI_FILES_FOLDER, 'decisions.yaml'), encoding="utf8") as fp: dec_list = yaml.safe_load(fp) for dec in dec_list: diff --git a/src/si_ref_point/cuq/prefixes_abox.py b/src/si_ref_point/aboxes/prefixes_abox.py similarity index 88% rename from src/si_ref_point/cuq/prefixes_abox.py rename to src/si_ref_point/aboxes/prefixes_abox.py index d76ff98..c6e3269 100644 --- a/src/si_ref_point/cuq/prefixes_abox.py +++ b/src/si_ref_point/aboxes/prefixes_abox.py @@ -6,8 +6,8 @@ import os import yaml from rdflib import Graph, URIRef, RDF, OWL, SKOS, XSD, RDFS, DCTERMS, Literal, PROV -from si_ref_point.cuq.cuq_tbox import SiElements -from si_ref_point.settings import CC_LICENCE, CC_LICENCE_TEXT_EN, CC_LICENCE_TEXT_FR, CUQ_FILES_FOLDER,GITHUB_BASE_PATH,SIDFWBASE +from si_ref_point.tboxes.si_tbox import SiElements +from si_ref_point.settings import PKG_ROOT, CC_LICENCE, CC_LICENCE_TEXT_EN, CC_LICENCE_TEXT_FR, SI_FILES_FOLDER, GITHUB_BASE_PATH def main(): @@ -16,14 +16,14 @@ def main(): # get the predicates and classes that are common to all cuq files si_graph = SiElements() # produce a separate graph for the prefixes - prefix_graph = Graph() + prefix_graph = Graph() # 1) Define the namespaces within (base)/SI prefix_graph.bind("prefixes",si_graph.namespace_prefixes) prefix_graph.bind("si",si_graph.namespace) # 2) Annotations to the prefix-graph - + # 2.1 General annotations (type, labels, comments etc) prefix_graph.add( (URIRef(si_graph.namespace_prefixes), @@ -46,16 +46,15 @@ def main(): timestamp = datetime.now(timezone.utc) # get the system time (in UTC) uri_timestamp = timestamp.strftime("%Y%m%d%H%M%SZ") # used to identify uniquely the produced TTL file (entity) startedAt_timestamp = timestamp.strftime("%Y-%m-%dT%H:%M:%SZ") # used with the predicate 'startedAtTime' of the corresponding activity - - repo = git.Repo(search_parent_directories=True) + + repo = git.Repo(PKG_ROOT, search_parent_directories=True) sha = repo.head.object.hexsha - + # 2.2.1 Agent - # declare this code as an 'agent' (in the sense of PROVENANCE) - # and define URI to a specific version by using the commit reference on github - agents = [] - agents.append(GITHUB_BASE_PATH +"blob/"+ sha + "/src/si_ref_point/cuq/prefixes_abox.py") - agents.append(GITHUB_BASE_PATH +"blob/"+ sha + "/src/si_ref_point/cuq/cuq_tbox.py") + # declare this code as an 'agent' (in the sense of PROVENANCE) + # and define URI to a specific version by using the commit reference on GitHub + agents = [GITHUB_BASE_PATH + "blob/" + sha + "/src/si_ref_point/cuq/prefixes_abox.py", + GITHUB_BASE_PATH + "blob/" + sha + "/src/si_ref_point/cuq/si_tbox.py"] for agent in agents: prefix_graph.add( (URIRef(agent), @@ -66,9 +65,8 @@ def main(): # 2.2.2 Entity # declare the source (YAML file) as 'entity' (in the sense of PROVENANCE) # The manually produced YAML files are stored on GITHUB. Their hexsha together - # with the path are used as an unique identifier - source_list = [] - source_list.append(GITHUB_BASE_PATH + "blob/" + sha + "/src/si_ref_point/cuq_data/prefixes.yaml") + # with the path are used as a unique identifier + source_list = [GITHUB_BASE_PATH + "blob/" + sha + "/src/si_ref_point/si/prefixes.yaml"] for source in source_list: prefix_graph.add( (URIRef(source), @@ -84,8 +82,8 @@ def main(): RDF.type, PROV.Entity) ) - - # 2.2.3 Activity + + # 2.2.3 Activity # declare the prefixes_ttl_generation as 'activity' (in the sense of PROVENANCE) # make the activity unique by adding the timestamp to the identifier of the activity activity = 'prefixes_'+ uri_timestamp +'.ttl_generation' @@ -94,7 +92,7 @@ def main(): RDF.type, PROV.Activity) ) - + # 2.2.4 Link activity, agent, entities # activity - agent for agent in agents: @@ -128,7 +126,7 @@ def main(): PROV.wasGeneratedBy, si_graph.set_activity_uri(activity)) ) - + # 2.3 Licence prefix_graph.add( (URIRef(si_graph.namespace_prefixes), @@ -145,11 +143,11 @@ def main(): RDFS.comment, Literal(CC_LICENCE_TEXT_FR,lang="fr")) ) - + # 3) Build prefix graph - + # 3.1 Open YAML files as source - with open(os.path.join(CUQ_FILES_FOLDER, 'prefixes.yaml'),encoding='utf-8') as fp: + with open(os.path.join(SI_FILES_FOLDER, 'prefixes.yaml'),encoding='utf-8') as fp: prefixes = yaml.safe_load(fp) # 3.2 Fill graph with all prefix entries diff --git a/src/si_ref_point/cuq/quantities_abox.py b/src/si_ref_point/aboxes/quantities_abox.py similarity index 83% rename from src/si_ref_point/cuq/quantities_abox.py rename to src/si_ref_point/aboxes/quantities_abox.py index 36ca847..a18b802 100644 --- a/src/si_ref_point/cuq/quantities_abox.py +++ b/src/si_ref_point/aboxes/quantities_abox.py @@ -1,25 +1,22 @@ -""" -Quantities ABox -""" +""" Quantities ABox """ -from datetime import datetime, timezone import git import os import logging -from rdflib import Graph, RDF, OWL, URIRef, RDFS, DCTERMS, Literal, SKOS, XSD, PROV import yaml -#from si_ref_point.cuq.cuq_tbox import SiElements # as example if package is installed -from si_ref_point.cuq.cuq_tbox import SiElements -from si_ref_point.cuq.units_abox import transform_to_graph -from si_ref_point.settings import CC_LICENCE, CC_LICENCE_TEXT_EN, CC_LICENCE_TEXT_FR, CUQ_FILES_FOLDER, GITHUB_BASE_PATH, SIDFWBASE +from datetime import datetime, timezone +from rdflib import Graph, RDF, OWL, URIRef, RDFS, DCTERMS, Literal, SKOS, XSD, PROV +from si_ref_point.tboxes.si_tbox import SiElements +from si_ref_point.aboxes.units_abox import transform_to_graph +from si_ref_point.settings import PKG_ROOT, CC_LICENCE, CC_LICENCE_TEXT_EN, CC_LICENCE_TEXT_FR, SI_FILES_FOLDER, GITHUB_BASE_PATH def main(): """Main of Quantities A-box""" # get the predicates and classes that are common to all cuq files - si_graph = SiElements() - # produce a separate graphe for the units - quantities_graph = Graph() + si_graph = SiElements() + # produce a separate graphe for the units + quantities_graph = Graph() # 1) Define the namespaces within (base)/SI quantities_graph.bind("quantities",si_graph.namespace_quantities) @@ -27,7 +24,7 @@ def main(): quantities_graph.bind("si",si_graph.namespace) # 2) Add annotations to the quantity graph - + # 2.1 General annotations (type, labels, comments etc) quantities_graph.add( @@ -48,19 +45,18 @@ def main(): "covering quantities", datatype=XSD.string)) ) - + # 2.2 Versioning (using PROVENANCE vocabulary) timestamp = datetime.now(timezone.utc) # get the system time (in UTC) uri_timestamp = timestamp.strftime("%Y%m%d%H%M%SZ") # used to identify uniquely the produced TTL file (entity) startedAt_timestamp = timestamp.strftime("%Y-%m-%dT%H:%M:%SZ") # used with the predicate 'startedAtTime' of the corresponding activity - repo = git.Repo(search_parent_directories=True) + repo = git.Repo(PKG_ROOT, search_parent_directories=True) sha = repo.head.object.hexsha # 2.2.1 Agent # declare this code as an 'agent' (in the sense of PROVENANCE) - # and define UàRI to a specific version by using its commit on github - agents = [] - agents.append(GITHUB_BASE_PATH +"blob/"+ sha + "/src/si_ref_point/cuq/cuq_tbox.py") - agents.append(GITHUB_BASE_PATH +"blob/"+ sha + "/src/si_ref_point/cuq/quantities_abox.py") + # and define UàRI to a specific version by using its commit on GitHub + agents = [GITHUB_BASE_PATH + "blob/" + sha + "/src/si_ref_point/cuq/si_tbox.py", + GITHUB_BASE_PATH + "blob/" + sha + "/src/si_ref_point/cuq/quantities_abox.py"] for agent_sw in agents: quantities_graph.add( @@ -68,14 +64,13 @@ def main(): RDF.type, PROV.Agent) ) - + # 2.2.2 Entity # declare the sources (YAML files) as 'entity' (in the sense of PROVENANCE) # The manually produced YAML files are stored on GitHub. Their hexsha together # with the path is used to define a unique URI for each file. - source_files = [] - source_files.append(GITHUB_BASE_PATH + "blob/" + sha + "/src/si_ref_point/cuq_data/quantities_core.yaml") - source_files.append(GITHUB_BASE_PATH + "blob/" + sha + "/src/si_ref_point/cuq_data/quantities_other.yaml") + source_files = [GITHUB_BASE_PATH + "blob/" + sha + "/src/si_ref_point/si/quantities_core.yaml", + GITHUB_BASE_PATH + "blob/" + sha + "/src/si_ref_point/si/quantities_other.yaml"] for source in source_files: quantities_graph.add( (URIRef(source), @@ -88,18 +83,18 @@ def main(): RDF.type, PROV.Entity) ) - + # 2.2.3 Activity # declare the constants_ttl_generation as 'activity' (in the sense of PROVENANCE) # make the activity unique by adding the timestamp to the identifier of the activity - activity = 'quantities_'+uri_timestamp + '.ttl_generation' - + activity = 'quantities_'+uri_timestamp + '.ttl_generation' + quantities_graph.add( (si_graph.set_activity_uri(activity), RDF.type, PROV.Activity) ) - + # 2.2.4 Relation activity, agent, entities # activity - agent for agent_sw in agents: @@ -133,8 +128,8 @@ def main(): PROV.wasGeneratedBy, si_graph.set_activity_uri(activity)) ) - - # 2.3 Licence information + + # 2.3 License information quantities_graph.add( (URIRef(si_graph.namespace_quantities), DCTERMS.license, @@ -150,7 +145,7 @@ def main(): RDFS.comment, Literal(CC_LICENCE_TEXT_FR,lang="fr")) ) - + # 3) Build quantity graph # crawl through the list of YAML files qty_files = ['quantities_core.yaml', 'quantities_other.yaml'] @@ -158,7 +153,7 @@ def main(): # open YAML files with information for filename in qty_files: - with open(os.path.join(CUQ_FILES_FOLDER, filename), encoding="utf8") as fp: + with open(os.path.join(SI_FILES_FOLDER, filename), encoding="utf8") as fp: qty_list = yaml.safe_load(fp) # add the individual quantities to the graph diff --git a/src/si_ref_point/resbod/ResBod_ABox_CCTF.py b/src/si_ref_point/aboxes/rb_abox_cctf.py similarity index 79% rename from src/si_ref_point/resbod/ResBod_ABox_CCTF.py rename to src/si_ref_point/aboxes/rb_abox_cctf.py index f776617..64703d9 100644 --- a/src/si_ref_point/resbod/ResBod_ABox_CCTF.py +++ b/src/si_ref_point/aboxes/rb_abox_cctf.py @@ -2,7 +2,7 @@ CCTF ABox """ from si_ref_point.settings import CCTF_FILES_FOLDER -from si_ref_point.resbod.utils import MeetingsFileExtractor +from si_ref_point.aboxes.rb_utils import MeetingsFileExtractor def main(): diff --git a/src/si_ref_point/resbod/ResBod_ABox_CGPM.py b/src/si_ref_point/aboxes/rb_abox_cgpm.py similarity index 79% rename from src/si_ref_point/resbod/ResBod_ABox_CGPM.py rename to src/si_ref_point/aboxes/rb_abox_cgpm.py index 232a6ab..a786a97 100644 --- a/src/si_ref_point/resbod/ResBod_ABox_CGPM.py +++ b/src/si_ref_point/aboxes/rb_abox_cgpm.py @@ -2,7 +2,7 @@ CGPM ABox """ from si_ref_point.settings import CGPM_FILES_FOLDER -from si_ref_point.resbod.utils import MeetingsFileExtractor +from si_ref_point.aboxes.rb_utils import MeetingsFileExtractor def main(): diff --git a/src/si_ref_point/resbod/ResBod_ABox_CIPM.py b/src/si_ref_point/aboxes/rb_abox_cipm.py similarity index 73% rename from src/si_ref_point/resbod/ResBod_ABox_CIPM.py rename to src/si_ref_point/aboxes/rb_abox_cipm.py index e4875ee..52fee0a 100644 --- a/src/si_ref_point/resbod/ResBod_ABox_CIPM.py +++ b/src/si_ref_point/aboxes/rb_abox_cipm.py @@ -1,8 +1,7 @@ -""" -CIPM ABox -""" +""" CIPM ABox """ + from si_ref_point.settings import CIPM_FILES_FOLDER -from si_ref_point.resbod.utils import MeetingsFileExtractor +from si_ref_point.aboxes.rb_utils import MeetingsFileExtractor def main(): diff --git a/src/si_ref_point/resbod/utils.py b/src/si_ref_point/aboxes/rb_utils.py similarity index 95% rename from src/si_ref_point/resbod/utils.py rename to src/si_ref_point/aboxes/rb_utils.py index aa80638..fd4ce87 100644 --- a/src/si_ref_point/resbod/utils.py +++ b/src/si_ref_point/aboxes/rb_utils.py @@ -1,24 +1,26 @@ import glob import os import re -from datetime import date - import yaml +from datetime import date from rdflib import Graph, Literal, Namespace, URIRef from rdflib.namespace import DCTERMS, OWL, RDF, RDFS, SKOS, XSD -from si_ref_point.resbod.ResBod_TBox import RES_BOD_NS - +from si_ref_point.tboxes.rb_tbox import RES_BOD_NS from si_ref_point.settings import SIDFWBASE RB = Namespace(RES_BOD_NS) +def meetings_sort_key(item): + return float(re.findall("[0-9]+[\-0-9]*", os.path.basename(item))[0].replace("-", ".")) + + class MeetingsFileExtractor: def __init__( - self, - base_url=SIDFWBASE + "/bodies/", - resbod_acronym="", - meeting_files_directory="", + self, + base_url=SIDFWBASE + "/bodies/", + resbod_acronym="", + meeting_files_directory="", ): self.own_acronym = resbod_acronym meeting_files_directory = meeting_files_directory @@ -48,7 +50,7 @@ def init_graph(self): def add_general_description(self): - # Annotations to the ontology (name, creation date, comment) + # Annotations to the ontology (name, creation date, comment) self.g.add((URIRef(self.OWN_NS), RDF.type, OWL.Ontology)) self.g.add( ( @@ -60,7 +62,7 @@ def add_general_description(self): ), ) ) - + self.g.add( ( URIRef(self.OWN_NS), @@ -68,7 +70,7 @@ def add_general_description(self): Literal(str(date.today()), datatype=XSD.date), ) ) - + self.g.add( ( URIRef(self.OWN_NS), @@ -87,10 +89,10 @@ def add_general_description(self): def add_meeting_information(self): # iterate over the resolutions files (in 'natural' sorted order) filenames_en = sorted( - glob.glob(self.base_path_en + "meeting-*.yml"), key=self.meetings_sort_key + glob.glob(self.base_path_en + "meeting-*.yml"), key=meetings_sort_key ) filenames_fr = sorted( - glob.glob(self.base_path_fr + "meeting-*.yml"), key=self.meetings_sort_key + glob.glob(self.base_path_fr + "meeting-*.yml"), key=meetings_sort_key ) for filename_en, filename_fr in zip(filenames_en, filenames_fr): @@ -274,8 +276,3 @@ def get_outcome_values(self, outcome, conf_Nr): hidden_label = local_id return outcome_URI, out_id, hidden_label, outcome_type - - def meetings_sort_key(self, item): - return float( - re.findall("[0-9]+[\-0-9]*", os.path.basename(item))[0].replace("-", ".") - ) diff --git a/src/si_ref_point/cuq/symbols_format.py b/src/si_ref_point/aboxes/symbols_format.py similarity index 91% rename from src/si_ref_point/cuq/symbols_format.py rename to src/si_ref_point/aboxes/symbols_format.py index 752bfa8..c93361c 100644 --- a/src/si_ref_point/cuq/symbols_format.py +++ b/src/si_ref_point/aboxes/symbols_format.py @@ -6,17 +6,17 @@ import os import re import yaml -from si_ref_point.settings import CUQ_FILES_FOLDER +from si_ref_point.settings import SI_FILES_FOLDER # Load symbols data -with open(os.path.join(CUQ_FILES_FOLDER, 'symbols.yaml'), encoding="utf8") as fp: +with open(os.path.join(SI_FILES_FOLDER, 'symbols.yaml'), encoding="utf8") as fp: symbols = yaml.safe_load(fp) def formattxt(txt, fmt='latex', add_delim=True, decimal_sep="."): """ formats a text string with symbols replaced in any of the following formats - html, latex, json, text + HTML, latex, JSON, text txt : input string fmt : one of ['html', 'latex', 'json', 'text'] diff --git a/src/si_ref_point/cuq/units_abox.py b/src/si_ref_point/aboxes/units_abox.py similarity index 94% rename from src/si_ref_point/cuq/units_abox.py rename to src/si_ref_point/aboxes/units_abox.py index caa2c84..cd1ada6 100644 --- a/src/si_ref_point/cuq/units_abox.py +++ b/src/si_ref_point/aboxes/units_abox.py @@ -8,9 +8,9 @@ import logging import yaml from rdflib import Graph, URIRef, BNode, Literal, RDF, OWL, SKOS, XSD, RDFS, DCTERMS, PROV -from si_ref_point.cuq.cuq_tbox import SiElements -import si_ref_point.cuq.symbols_format as sf -from si_ref_point.settings import CC_LICENCE, CC_LICENCE_TEXT_EN, CC_LICENCE_TEXT_FR, CUQ_FILES_FOLDER, GITHUB_BASE_PATH, SIDFWBASE +from si_ref_point.tboxes.si_tbox import SiElements +import si_ref_point.aboxes.symbols_format as sf +from si_ref_point.settings import PKG_ROOT, CC_LICENCE, CC_LICENCE_TEXT_EN, CC_LICENCE_TEXT_FR, SI_FILES_FOLDER, GITHUB_BASE_PATH def nest_mult(expr): @@ -137,7 +137,7 @@ def main(): # 1) Define the namespaces within (base)/SI # (for the moment, these bindings are made 'manually'. - # They should be proposed as a common function [e.g. in cuq_tbox.py]) + # They should be proposed as a common function [e.g. in si_tbox.py]) units_graph.bind("constants",si_graph.namespace_constants) units_graph.bind("quantities",si_graph.namespace_quantities) units_graph.bind("units",si_graph.namespace_units) @@ -174,14 +174,13 @@ def main(): timestamp = datetime.now(timezone.utc) # get the system time (in UTC) uri_timestamp = timestamp.strftime("%Y%m%d%H%M%SZ") # used to identify uniquely the produced TTL file (entity) startedAt_timestamp = timestamp.strftime("%Y-%m-%dT%H:%M:%SZ") # used with the predicate 'startedAtTime' of the corresponding activity - repo = git.Repo(search_parent_directories=True) + repo = git.Repo(PKG_ROOT, search_parent_directories=True) sha = repo.head.object.hexsha # 2.2.1 Agent # declare this code as an 'agent' (in the sense of PROVENANCE) - # and define URI to a specific version by using its commit on github - agents = [] - agents.append(GITHUB_BASE_PATH +"blob/"+ sha + "/src/si_ref_point/cuq/cuq_tbox.py") - agents.append(GITHUB_BASE_PATH +"blob/"+ sha + "/src/si_ref_point/cuq/units_abox.py") + # and define URI to a specific version by using its commit on GitHub + agents = [GITHUB_BASE_PATH + "blob/" + sha + "/src/si_ref_point/cuq/si_tbox.py", + GITHUB_BASE_PATH + "blob/" + sha + "/src/si_ref_point/cuq/units_abox.py"] for agent_sw in agents: units_graph.add( (URIRef(agent_sw), @@ -192,13 +191,12 @@ def main(): # 2.2.2 Entity # declare the sources (YAML files) as 'entity' (in the sense of PROVENANCE) # The manually produced YAML files are stored on GITHUB. Their hexsha together - # with the path are used as an unique identifier - source_list = [] - source_list.append(GITHUB_BASE_PATH + "blob/" + sha + "/src/si_ref_point/cuq_data/def_collectors.yaml") - source_list.append(GITHUB_BASE_PATH + "blob/" + sha + "/src/si_ref_point/cuq_data/base_units_defs.yaml") - source_list.append(GITHUB_BASE_PATH + "blob/" + sha + "/src/si_ref_point/cuq_data/notes.yaml") - source_list.append(GITHUB_BASE_PATH + "blob/" + sha + "/src/si_ref_point/cuq_data/si_units_special_names.yaml") - source_list.append(GITHUB_BASE_PATH + "blob/" + sha + "/src/si_ref_point/cuq_data/non_si_units.yaml") + # with the path are used as a unique identifier + source_list = [GITHUB_BASE_PATH + "blob/" + sha + "/src/si_ref_point/si/def_collectors.yaml", + GITHUB_BASE_PATH + "blob/" + sha + "/src/si_ref_point/si/base_units_defs.yaml", + GITHUB_BASE_PATH + "blob/" + sha + "/src/si_ref_point/si/notes.yaml", + GITHUB_BASE_PATH + "blob/" + sha + "/src/si_ref_point/si/si_units_special_names.yaml", + GITHUB_BASE_PATH + "blob/" + sha + "/src/si_ref_point/si/non_si_units.yaml"] for source in source_list: units_graph.add( @@ -281,7 +279,7 @@ def main(): # 3) Build units graph # 3.1 open YAML file def_collector - with open(os.path.join(CUQ_FILES_FOLDER, "def_collectors.yaml"), encoding='utf-8') as fp: + with open(os.path.join(SI_FILES_FOLDER, "def_collectors.yaml"), encoding='utf-8') as fp: def_collectors = yaml.safe_load(fp) # 3.2 Base unit definitions @@ -424,10 +422,10 @@ def main(): # year of the definition, e.g., ampere2018 with open( - os.path.join(CUQ_FILES_FOLDER, "base_units_defs.yaml"), encoding="utf8" + os.path.join(SI_FILES_FOLDER, "base_units_defs.yaml"), encoding="utf8" ) as fp: basedefs = yaml.safe_load(fp) - with open(os.path.join(CUQ_FILES_FOLDER, "notes.yaml"), encoding="utf8") as fp: + with open(os.path.join(SI_FILES_FOLDER, "notes.yaml"), encoding="utf8") as fp: notes = yaml.safe_load(fp) @@ -554,7 +552,7 @@ def main(): ) # 3.4 SI Units Special Names - with open(os.path.join(CUQ_FILES_FOLDER, "si_units_special_names.yaml"),encoding='utf-8') as fp: + with open(os.path.join(SI_FILES_FOLDER, "si_units_special_names.yaml"),encoding='utf-8') as fp: si_spec_list = yaml.safe_load(fp) for sisp in si_spec_list["data"]: @@ -631,7 +629,7 @@ def main(): # 3.5 non SI units - with open(os.path.join(CUQ_FILES_FOLDER, "non_si_units.yaml"),encoding='utf-8') as fp: + with open(os.path.join(SI_FILES_FOLDER, "non_si_units.yaml"),encoding='utf-8') as fp: non_si_list = yaml.safe_load(fp) for nsi in non_si_list["data"]: @@ -703,7 +701,7 @@ def main(): has_unit_term = si_graph.set_uri("hasUnitTerm") has_numeric_factor = si_graph.set_uri("hasNumericFactor") has_numeric_factor_as_string = si_graph.set_uri("hasNumericFactorAsString") - + if isinstance(nsi["ConversionFactor"], int): conv_factor_type = XSD.integer elif isinstance(nsi["ConversionFactor"], float): diff --git a/src/si_ref_point/resbod_data/cctf/meetings-en/meeting-14.yml b/src/si_ref_point/inputs/rb/cctf/meetings-en/meeting-14.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/meetings-en/meeting-14.yml rename to src/si_ref_point/inputs/rb/cctf/meetings-en/meeting-14.yml diff --git a/src/si_ref_point/resbod_data/cctf/meetings-en/meeting-15.yml b/src/si_ref_point/inputs/rb/cctf/meetings-en/meeting-15.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/meetings-en/meeting-15.yml rename to src/si_ref_point/inputs/rb/cctf/meetings-en/meeting-15.yml diff --git a/src/si_ref_point/resbod_data/cctf/meetings-en/meeting-16.yml b/src/si_ref_point/inputs/rb/cctf/meetings-en/meeting-16.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/meetings-en/meeting-16.yml rename to src/si_ref_point/inputs/rb/cctf/meetings-en/meeting-16.yml diff --git a/src/si_ref_point/resbod_data/cctf/meetings-en/meeting-17.yml b/src/si_ref_point/inputs/rb/cctf/meetings-en/meeting-17.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/meetings-en/meeting-17.yml rename to src/si_ref_point/inputs/rb/cctf/meetings-en/meeting-17.yml diff --git a/src/si_ref_point/resbod_data/cctf/meetings-en/meeting-18.yml b/src/si_ref_point/inputs/rb/cctf/meetings-en/meeting-18.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/meetings-en/meeting-18.yml rename to src/si_ref_point/inputs/rb/cctf/meetings-en/meeting-18.yml diff --git a/src/si_ref_point/resbod_data/cctf/meetings-en/meeting-19.yml b/src/si_ref_point/inputs/rb/cctf/meetings-en/meeting-19.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/meetings-en/meeting-19.yml rename to src/si_ref_point/inputs/rb/cctf/meetings-en/meeting-19.yml diff --git a/src/si_ref_point/resbod_data/cctf/meetings-en/meeting-20.yml b/src/si_ref_point/inputs/rb/cctf/meetings-en/meeting-20.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/meetings-en/meeting-20.yml rename to src/si_ref_point/inputs/rb/cctf/meetings-en/meeting-20.yml diff --git a/src/si_ref_point/resbod_data/cctf/meetings-en/meeting-21.yml b/src/si_ref_point/inputs/rb/cctf/meetings-en/meeting-21.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/meetings-en/meeting-21.yml rename to src/si_ref_point/inputs/rb/cctf/meetings-en/meeting-21.yml diff --git a/src/si_ref_point/resbod_data/cctf/meetings-en/meeting-22-1.yml b/src/si_ref_point/inputs/rb/cctf/meetings-en/meeting-22-1.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/meetings-en/meeting-22-1.yml rename to src/si_ref_point/inputs/rb/cctf/meetings-en/meeting-22-1.yml diff --git a/src/si_ref_point/resbod_data/cctf/meetings-en/meeting-22-2.yml b/src/si_ref_point/inputs/rb/cctf/meetings-en/meeting-22-2.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/meetings-en/meeting-22-2.yml rename to src/si_ref_point/inputs/rb/cctf/meetings-en/meeting-22-2.yml diff --git a/src/si_ref_point/resbod_data/cctf/meetings-en/meeting-23.yml b/src/si_ref_point/inputs/rb/cctf/meetings-en/meeting-23.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/meetings-en/meeting-23.yml rename to src/si_ref_point/inputs/rb/cctf/meetings-en/meeting-23.yml diff --git a/src/si_ref_point/resbod_data/cctf/meetings-en/meeting-24-1.yml b/src/si_ref_point/inputs/rb/cctf/meetings-en/meeting-24-1.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/meetings-en/meeting-24-1.yml rename to src/si_ref_point/inputs/rb/cctf/meetings-en/meeting-24-1.yml diff --git a/src/si_ref_point/resbod_data/cctf/meetings-en/meeting-24-2.yml b/src/si_ref_point/inputs/rb/cctf/meetings-en/meeting-24-2.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/meetings-en/meeting-24-2.yml rename to src/si_ref_point/inputs/rb/cctf/meetings-en/meeting-24-2.yml diff --git a/src/si_ref_point/resbod_data/cctf/meetings-en/meeting-5.yml b/src/si_ref_point/inputs/rb/cctf/meetings-en/meeting-5.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/meetings-en/meeting-5.yml rename to src/si_ref_point/inputs/rb/cctf/meetings-en/meeting-5.yml diff --git a/src/si_ref_point/resbod_data/cctf/meetings-fr/meeting-14.yml b/src/si_ref_point/inputs/rb/cctf/meetings-fr/meeting-14.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/meetings-fr/meeting-14.yml rename to src/si_ref_point/inputs/rb/cctf/meetings-fr/meeting-14.yml diff --git a/src/si_ref_point/resbod_data/cctf/meetings-fr/meeting-15.yml b/src/si_ref_point/inputs/rb/cctf/meetings-fr/meeting-15.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/meetings-fr/meeting-15.yml rename to src/si_ref_point/inputs/rb/cctf/meetings-fr/meeting-15.yml diff --git a/src/si_ref_point/resbod_data/cctf/meetings-fr/meeting-16.yml b/src/si_ref_point/inputs/rb/cctf/meetings-fr/meeting-16.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/meetings-fr/meeting-16.yml rename to src/si_ref_point/inputs/rb/cctf/meetings-fr/meeting-16.yml diff --git a/src/si_ref_point/resbod_data/cctf/meetings-fr/meeting-17.yml b/src/si_ref_point/inputs/rb/cctf/meetings-fr/meeting-17.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/meetings-fr/meeting-17.yml rename to src/si_ref_point/inputs/rb/cctf/meetings-fr/meeting-17.yml diff --git a/src/si_ref_point/resbod_data/cctf/meetings-fr/meeting-18.yml b/src/si_ref_point/inputs/rb/cctf/meetings-fr/meeting-18.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/meetings-fr/meeting-18.yml rename to src/si_ref_point/inputs/rb/cctf/meetings-fr/meeting-18.yml diff --git a/src/si_ref_point/resbod_data/cctf/meetings-fr/meeting-19.yml b/src/si_ref_point/inputs/rb/cctf/meetings-fr/meeting-19.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/meetings-fr/meeting-19.yml rename to src/si_ref_point/inputs/rb/cctf/meetings-fr/meeting-19.yml diff --git a/src/si_ref_point/resbod_data/cctf/meetings-fr/meeting-20.yml b/src/si_ref_point/inputs/rb/cctf/meetings-fr/meeting-20.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/meetings-fr/meeting-20.yml rename to src/si_ref_point/inputs/rb/cctf/meetings-fr/meeting-20.yml diff --git a/src/si_ref_point/resbod_data/cctf/meetings-fr/meeting-21.yml b/src/si_ref_point/inputs/rb/cctf/meetings-fr/meeting-21.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/meetings-fr/meeting-21.yml rename to src/si_ref_point/inputs/rb/cctf/meetings-fr/meeting-21.yml diff --git a/src/si_ref_point/resbod_data/cctf/meetings-fr/meeting-22-1.yml b/src/si_ref_point/inputs/rb/cctf/meetings-fr/meeting-22-1.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/meetings-fr/meeting-22-1.yml rename to src/si_ref_point/inputs/rb/cctf/meetings-fr/meeting-22-1.yml diff --git a/src/si_ref_point/resbod_data/cctf/meetings-fr/meeting-22-2.yml b/src/si_ref_point/inputs/rb/cctf/meetings-fr/meeting-22-2.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/meetings-fr/meeting-22-2.yml rename to src/si_ref_point/inputs/rb/cctf/meetings-fr/meeting-22-2.yml diff --git a/src/si_ref_point/resbod_data/cctf/meetings-fr/meeting-23.yml b/src/si_ref_point/inputs/rb/cctf/meetings-fr/meeting-23.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/meetings-fr/meeting-23.yml rename to src/si_ref_point/inputs/rb/cctf/meetings-fr/meeting-23.yml diff --git a/src/si_ref_point/resbod_data/cctf/meetings-fr/meeting-24-1.yml b/src/si_ref_point/inputs/rb/cctf/meetings-fr/meeting-24-1.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/meetings-fr/meeting-24-1.yml rename to src/si_ref_point/inputs/rb/cctf/meetings-fr/meeting-24-1.yml diff --git a/src/si_ref_point/resbod_data/cctf/meetings-fr/meeting-24-2.yml b/src/si_ref_point/inputs/rb/cctf/meetings-fr/meeting-24-2.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/meetings-fr/meeting-24-2.yml rename to src/si_ref_point/inputs/rb/cctf/meetings-fr/meeting-24-2.yml diff --git a/src/si_ref_point/resbod_data/cctf/meetings-fr/meeting-5.yml b/src/si_ref_point/inputs/rb/cctf/meetings-fr/meeting-5.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/meetings-fr/meeting-5.yml rename to src/si_ref_point/inputs/rb/cctf/meetings-fr/meeting-5.yml diff --git a/src/si_ref_point/resbod_data/cctf/publications-en.yml b/src/si_ref_point/inputs/rb/cctf/publications-en.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/publications-en.yml rename to src/si_ref_point/inputs/rb/cctf/publications-en.yml diff --git a/src/si_ref_point/resbod_data/cctf/publications-fr.yml b/src/si_ref_point/inputs/rb/cctf/publications-fr.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/publications-fr.yml rename to src/si_ref_point/inputs/rb/cctf/publications-fr.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/ccl-cctf-wgfs/meetings-en/meeting-2003-09-09.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/ccl-cctf-wgfs/meetings-en/meeting-2003-09-09.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/ccl-cctf-wgfs/meetings-en/meeting-2003-09-09.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/ccl-cctf-wgfs/meetings-en/meeting-2003-09-09.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/ccl-cctf-wgfs/meetings-en/meeting-2004-03-30.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/ccl-cctf-wgfs/meetings-en/meeting-2004-03-30.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/ccl-cctf-wgfs/meetings-en/meeting-2004-03-30.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/ccl-cctf-wgfs/meetings-en/meeting-2004-03-30.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/ccl-cctf-wgfs/meetings-en/meeting-2005-09-13.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/ccl-cctf-wgfs/meetings-en/meeting-2005-09-13.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/ccl-cctf-wgfs/meetings-en/meeting-2005-09-13.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/ccl-cctf-wgfs/meetings-en/meeting-2005-09-13.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/ccl-cctf-wgfs/meetings-en/meeting-2006-09-11.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/ccl-cctf-wgfs/meetings-en/meeting-2006-09-11.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/ccl-cctf-wgfs/meetings-en/meeting-2006-09-11.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/ccl-cctf-wgfs/meetings-en/meeting-2006-09-11.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/ccl-cctf-wgfs/meetings-en/meeting-2007-09-10.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/ccl-cctf-wgfs/meetings-en/meeting-2007-09-10.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/ccl-cctf-wgfs/meetings-en/meeting-2007-09-10.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/ccl-cctf-wgfs/meetings-en/meeting-2007-09-10.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/ccl-cctf-wgfs/meetings-en/meeting-2009-06-02.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/ccl-cctf-wgfs/meetings-en/meeting-2009-06-02.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/ccl-cctf-wgfs/meetings-en/meeting-2009-06-02.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/ccl-cctf-wgfs/meetings-en/meeting-2009-06-02.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/ccl-cctf-wgfs/meetings-en/meeting-2012-09-10.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/ccl-cctf-wgfs/meetings-en/meeting-2012-09-10.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/ccl-cctf-wgfs/meetings-en/meeting-2012-09-10.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/ccl-cctf-wgfs/meetings-en/meeting-2012-09-10.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/ccl-cctf-wgfs/meetings-en/meeting-2013-07-23.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/ccl-cctf-wgfs/meetings-en/meeting-2013-07-23.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/ccl-cctf-wgfs/meetings-en/meeting-2013-07-23.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/ccl-cctf-wgfs/meetings-en/meeting-2013-07-23.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/ccl-cctf-wgfs/meetings-en/meeting-2014-06-26.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/ccl-cctf-wgfs/meetings-en/meeting-2014-06-26.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/ccl-cctf-wgfs/meetings-en/meeting-2014-06-26.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/ccl-cctf-wgfs/meetings-en/meeting-2014-06-26.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/ccl-cctf-wgfs/meetings-en/meeting-2015-09-14.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/ccl-cctf-wgfs/meetings-en/meeting-2015-09-14.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/ccl-cctf-wgfs/meetings-en/meeting-2015-09-14.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/ccl-cctf-wgfs/meetings-en/meeting-2015-09-14.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/ccl-cctf-wgfs/meetings-en/meeting-2017-05-03.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/ccl-cctf-wgfs/meetings-en/meeting-2017-05-03.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/ccl-cctf-wgfs/meetings-en/meeting-2017-05-03.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/ccl-cctf-wgfs/meetings-en/meeting-2017-05-03.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/ccl-cctf-wgfs/meetings-en/meeting-2017-06-06.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/ccl-cctf-wgfs/meetings-en/meeting-2017-06-06.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/ccl-cctf-wgfs/meetings-en/meeting-2017-06-06.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/ccl-cctf-wgfs/meetings-en/meeting-2017-06-06.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/ccl-cctf-wgfs/meetings-en/meeting-2018-06-14.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/ccl-cctf-wgfs/meetings-en/meeting-2018-06-14.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/ccl-cctf-wgfs/meetings-en/meeting-2018-06-14.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/ccl-cctf-wgfs/meetings-en/meeting-2018-06-14.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/ccl-cctf-wgfs/meetings-en/meeting-2021-09-27.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/ccl-cctf-wgfs/meetings-en/meeting-2021-09-27.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/ccl-cctf-wgfs/meetings-en/meeting-2021-09-27.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/ccl-cctf-wgfs/meetings-en/meeting-2021-09-27.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/ccl-cctf-wgfs/meetings-fr/meeting-2003-09-09.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/ccl-cctf-wgfs/meetings-fr/meeting-2003-09-09.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/ccl-cctf-wgfs/meetings-fr/meeting-2003-09-09.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/ccl-cctf-wgfs/meetings-fr/meeting-2003-09-09.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/ccl-cctf-wgfs/meetings-fr/meeting-2004-03-30.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/ccl-cctf-wgfs/meetings-fr/meeting-2004-03-30.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/ccl-cctf-wgfs/meetings-fr/meeting-2004-03-30.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/ccl-cctf-wgfs/meetings-fr/meeting-2004-03-30.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/ccl-cctf-wgfs/meetings-fr/meeting-2005-09-13.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/ccl-cctf-wgfs/meetings-fr/meeting-2005-09-13.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/ccl-cctf-wgfs/meetings-fr/meeting-2005-09-13.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/ccl-cctf-wgfs/meetings-fr/meeting-2005-09-13.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/ccl-cctf-wgfs/meetings-fr/meeting-2006-09-11.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/ccl-cctf-wgfs/meetings-fr/meeting-2006-09-11.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/ccl-cctf-wgfs/meetings-fr/meeting-2006-09-11.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/ccl-cctf-wgfs/meetings-fr/meeting-2006-09-11.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/ccl-cctf-wgfs/meetings-fr/meeting-2007-09-10.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/ccl-cctf-wgfs/meetings-fr/meeting-2007-09-10.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/ccl-cctf-wgfs/meetings-fr/meeting-2007-09-10.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/ccl-cctf-wgfs/meetings-fr/meeting-2007-09-10.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/ccl-cctf-wgfs/meetings-fr/meeting-2009-06-02.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/ccl-cctf-wgfs/meetings-fr/meeting-2009-06-02.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/ccl-cctf-wgfs/meetings-fr/meeting-2009-06-02.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/ccl-cctf-wgfs/meetings-fr/meeting-2009-06-02.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/ccl-cctf-wgfs/meetings-fr/meeting-2012-09-10.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/ccl-cctf-wgfs/meetings-fr/meeting-2012-09-10.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/ccl-cctf-wgfs/meetings-fr/meeting-2012-09-10.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/ccl-cctf-wgfs/meetings-fr/meeting-2012-09-10.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/ccl-cctf-wgfs/meetings-fr/meeting-2013-07-23.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/ccl-cctf-wgfs/meetings-fr/meeting-2013-07-23.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/ccl-cctf-wgfs/meetings-fr/meeting-2013-07-23.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/ccl-cctf-wgfs/meetings-fr/meeting-2013-07-23.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/ccl-cctf-wgfs/meetings-fr/meeting-2014-06-26.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/ccl-cctf-wgfs/meetings-fr/meeting-2014-06-26.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/ccl-cctf-wgfs/meetings-fr/meeting-2014-06-26.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/ccl-cctf-wgfs/meetings-fr/meeting-2014-06-26.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/ccl-cctf-wgfs/meetings-fr/meeting-2015-09-14.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/ccl-cctf-wgfs/meetings-fr/meeting-2015-09-14.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/ccl-cctf-wgfs/meetings-fr/meeting-2015-09-14.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/ccl-cctf-wgfs/meetings-fr/meeting-2015-09-14.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/ccl-cctf-wgfs/meetings-fr/meeting-2017-05-03.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/ccl-cctf-wgfs/meetings-fr/meeting-2017-05-03.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/ccl-cctf-wgfs/meetings-fr/meeting-2017-05-03.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/ccl-cctf-wgfs/meetings-fr/meeting-2017-05-03.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/ccl-cctf-wgfs/meetings-fr/meeting-2017-06-06.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/ccl-cctf-wgfs/meetings-fr/meeting-2017-06-06.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/ccl-cctf-wgfs/meetings-fr/meeting-2017-06-06.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/ccl-cctf-wgfs/meetings-fr/meeting-2017-06-06.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/ccl-cctf-wgfs/meetings-fr/meeting-2018-06-14.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/ccl-cctf-wgfs/meetings-fr/meeting-2018-06-14.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/ccl-cctf-wgfs/meetings-fr/meeting-2018-06-14.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/ccl-cctf-wgfs/meetings-fr/meeting-2018-06-14.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/ccl-cctf-wgfs/meetings-fr/meeting-2021-09-27.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/ccl-cctf-wgfs/meetings-fr/meeting-2021-09-27.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/ccl-cctf-wgfs/meetings-fr/meeting-2021-09-27.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/ccl-cctf-wgfs/meetings-fr/meeting-2021-09-27.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-atft-ws/meetings-en/meeting-2011-06-28.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-atft-ws/meetings-en/meeting-2011-06-28.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-atft-ws/meetings-en/meeting-2011-06-28.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-atft-ws/meetings-en/meeting-2011-06-28.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-atft-ws/meetings-fr/meeting-2011-06-28.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-atft-ws/meetings-fr/meeting-2011-06-28.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-atft-ws/meetings-fr/meeting-2011-06-28.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-atft-ws/meetings-fr/meeting-2011-06-28.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wg-algo/meetings-en/meeting-2015-11-09.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wg-algo/meetings-en/meeting-2015-11-09.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wg-algo/meetings-en/meeting-2015-11-09.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wg-algo/meetings-en/meeting-2015-11-09.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wg-algo/meetings-en/meeting-2020-07-17.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wg-algo/meetings-en/meeting-2020-07-17.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wg-algo/meetings-en/meeting-2020-07-17.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wg-algo/meetings-en/meeting-2020-07-17.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wg-algo/meetings-en/meeting-2022-05-17.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wg-algo/meetings-en/meeting-2022-05-17.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wg-algo/meetings-en/meeting-2022-05-17.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wg-algo/meetings-en/meeting-2022-05-17.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wg-algo/meetings-fr/meeting-2015-11-09.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wg-algo/meetings-fr/meeting-2015-11-09.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wg-algo/meetings-fr/meeting-2015-11-09.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wg-algo/meetings-fr/meeting-2015-11-09.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wg-algo/meetings-fr/meeting-2020-07-17.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wg-algo/meetings-fr/meeting-2020-07-17.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wg-algo/meetings-fr/meeting-2020-07-17.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wg-algo/meetings-fr/meeting-2020-07-17.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wg-algo/meetings-fr/meeting-2022-05-17.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wg-algo/meetings-fr/meeting-2022-05-17.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wg-algo/meetings-fr/meeting-2022-05-17.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wg-algo/meetings-fr/meeting-2022-05-17.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgatft/meetings-en/meeting-2011-06-29.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgatft/meetings-en/meeting-2011-06-29.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgatft/meetings-en/meeting-2011-06-29.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgatft/meetings-en/meeting-2011-06-29.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgatft/meetings-en/meeting-2012-04-25.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgatft/meetings-en/meeting-2012-04-25.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgatft/meetings-en/meeting-2012-04-25.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgatft/meetings-en/meeting-2012-04-25.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgatft/meetings-en/meeting-2014-06-23.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgatft/meetings-en/meeting-2014-06-23.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgatft/meetings-en/meeting-2014-06-23.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgatft/meetings-en/meeting-2014-06-23.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgatft/meetings-en/meeting-2015-09-15.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgatft/meetings-en/meeting-2015-09-15.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgatft/meetings-en/meeting-2015-09-15.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgatft/meetings-en/meeting-2015-09-15.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgatft/meetings-en/meeting-2016-04-07.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgatft/meetings-en/meeting-2016-04-07.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgatft/meetings-en/meeting-2016-04-07.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgatft/meetings-en/meeting-2016-04-07.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgatft/meetings-en/meeting-2017-06-07.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgatft/meetings-en/meeting-2017-06-07.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgatft/meetings-en/meeting-2017-06-07.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgatft/meetings-en/meeting-2017-06-07.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgatft/meetings-en/meeting-2018-04-12.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgatft/meetings-en/meeting-2018-04-12.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgatft/meetings-en/meeting-2018-04-12.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgatft/meetings-en/meeting-2018-04-12.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgatft/meetings-en/meeting-2022-06-24.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgatft/meetings-en/meeting-2022-06-24.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgatft/meetings-en/meeting-2022-06-24.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgatft/meetings-en/meeting-2022-06-24.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgatft/meetings-fr/meeting-2011-06-29.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgatft/meetings-fr/meeting-2011-06-29.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgatft/meetings-fr/meeting-2011-06-29.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgatft/meetings-fr/meeting-2011-06-29.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgatft/meetings-fr/meeting-2012-04-25.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgatft/meetings-fr/meeting-2012-04-25.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgatft/meetings-fr/meeting-2012-04-25.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgatft/meetings-fr/meeting-2012-04-25.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgatft/meetings-fr/meeting-2014-06-23.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgatft/meetings-fr/meeting-2014-06-23.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgatft/meetings-fr/meeting-2014-06-23.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgatft/meetings-fr/meeting-2014-06-23.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgatft/meetings-fr/meeting-2015-09-15.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgatft/meetings-fr/meeting-2015-09-15.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgatft/meetings-fr/meeting-2015-09-15.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgatft/meetings-fr/meeting-2015-09-15.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgatft/meetings-fr/meeting-2016-04-07.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgatft/meetings-fr/meeting-2016-04-07.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgatft/meetings-fr/meeting-2016-04-07.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgatft/meetings-fr/meeting-2016-04-07.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgatft/meetings-fr/meeting-2017-06-07.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgatft/meetings-fr/meeting-2017-06-07.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgatft/meetings-fr/meeting-2017-06-07.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgatft/meetings-fr/meeting-2017-06-07.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgatft/meetings-fr/meeting-2018-04-12.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgatft/meetings-fr/meeting-2018-04-12.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgatft/meetings-fr/meeting-2018-04-12.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgatft/meetings-fr/meeting-2018-04-12.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgatft/meetings-fr/meeting-2022-06-24.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgatft/meetings-fr/meeting-2022-06-24.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgatft/meetings-fr/meeting-2022-06-24.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgatft/meetings-fr/meeting-2022-06-24.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wggnss/meetings-en/meeting-2012-11-28.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wggnss/meetings-en/meeting-2012-11-28.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wggnss/meetings-en/meeting-2012-11-28.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wggnss/meetings-en/meeting-2012-11-28.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wggnss/meetings-en/meeting-2013-07-24.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wggnss/meetings-en/meeting-2013-07-24.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wggnss/meetings-en/meeting-2013-07-24.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wggnss/meetings-en/meeting-2013-07-24.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wggnss/meetings-en/meeting-2013-12-04.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wggnss/meetings-en/meeting-2013-12-04.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wggnss/meetings-en/meeting-2013-12-04.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wggnss/meetings-en/meeting-2013-12-04.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wggnss/meetings-en/meeting-2014-06-24.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wggnss/meetings-en/meeting-2014-06-24.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wggnss/meetings-en/meeting-2014-06-24.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wggnss/meetings-en/meeting-2014-06-24.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wggnss/meetings-en/meeting-2015-04-13.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wggnss/meetings-en/meeting-2015-04-13.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wggnss/meetings-en/meeting-2015-04-13.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wggnss/meetings-en/meeting-2015-04-13.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wggnss/meetings-en/meeting-2015-09-14.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wggnss/meetings-en/meeting-2015-09-14.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wggnss/meetings-en/meeting-2015-09-14.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wggnss/meetings-en/meeting-2015-09-14.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wggnss/meetings-en/meeting-2016-04-05.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wggnss/meetings-en/meeting-2016-04-05.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wggnss/meetings-en/meeting-2016-04-05.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wggnss/meetings-en/meeting-2016-04-05.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wggnss/meetings-en/meeting-2017-06-06.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wggnss/meetings-en/meeting-2017-06-06.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wggnss/meetings-en/meeting-2017-06-06.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wggnss/meetings-en/meeting-2017-06-06.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wggnss/meetings-en/meeting-2018-04-10.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wggnss/meetings-en/meeting-2018-04-10.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wggnss/meetings-en/meeting-2018-04-10.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wggnss/meetings-en/meeting-2018-04-10.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wggnss/meetings-en/meeting-2018-11-28.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wggnss/meetings-en/meeting-2018-11-28.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wggnss/meetings-en/meeting-2018-11-28.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wggnss/meetings-en/meeting-2018-11-28.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wggnss/meetings-en/meeting-2020-06-03.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wggnss/meetings-en/meeting-2020-06-03.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wggnss/meetings-en/meeting-2020-06-03.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wggnss/meetings-en/meeting-2020-06-03.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wggnss/meetings-en/meeting-2021-02-03.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wggnss/meetings-en/meeting-2021-02-03.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wggnss/meetings-en/meeting-2021-02-03.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wggnss/meetings-en/meeting-2021-02-03.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wggnss/meetings-en/meeting-2021-06-23.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wggnss/meetings-en/meeting-2021-06-23.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wggnss/meetings-en/meeting-2021-06-23.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wggnss/meetings-en/meeting-2021-06-23.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wggnss/meetings-en/meeting-2022-05-18.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wggnss/meetings-en/meeting-2022-05-18.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wggnss/meetings-en/meeting-2022-05-18.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wggnss/meetings-en/meeting-2022-05-18.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wggnss/meetings-en/meeting-2023-05-30.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wggnss/meetings-en/meeting-2023-05-30.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wggnss/meetings-en/meeting-2023-05-30.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wggnss/meetings-en/meeting-2023-05-30.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wggnss/meetings-fr/meeting-2012-11-28.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wggnss/meetings-fr/meeting-2012-11-28.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wggnss/meetings-fr/meeting-2012-11-28.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wggnss/meetings-fr/meeting-2012-11-28.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wggnss/meetings-fr/meeting-2013-07-24.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wggnss/meetings-fr/meeting-2013-07-24.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wggnss/meetings-fr/meeting-2013-07-24.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wggnss/meetings-fr/meeting-2013-07-24.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wggnss/meetings-fr/meeting-2013-12-04.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wggnss/meetings-fr/meeting-2013-12-04.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wggnss/meetings-fr/meeting-2013-12-04.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wggnss/meetings-fr/meeting-2013-12-04.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wggnss/meetings-fr/meeting-2014-06-24.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wggnss/meetings-fr/meeting-2014-06-24.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wggnss/meetings-fr/meeting-2014-06-24.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wggnss/meetings-fr/meeting-2014-06-24.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wggnss/meetings-fr/meeting-2015-04-13.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wggnss/meetings-fr/meeting-2015-04-13.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wggnss/meetings-fr/meeting-2015-04-13.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wggnss/meetings-fr/meeting-2015-04-13.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wggnss/meetings-fr/meeting-2015-09-14.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wggnss/meetings-fr/meeting-2015-09-14.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wggnss/meetings-fr/meeting-2015-09-14.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wggnss/meetings-fr/meeting-2015-09-14.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wggnss/meetings-fr/meeting-2016-04-05.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wggnss/meetings-fr/meeting-2016-04-05.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wggnss/meetings-fr/meeting-2016-04-05.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wggnss/meetings-fr/meeting-2016-04-05.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wggnss/meetings-fr/meeting-2017-06-06.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wggnss/meetings-fr/meeting-2017-06-06.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wggnss/meetings-fr/meeting-2017-06-06.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wggnss/meetings-fr/meeting-2017-06-06.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wggnss/meetings-fr/meeting-2018-04-10.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wggnss/meetings-fr/meeting-2018-04-10.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wggnss/meetings-fr/meeting-2018-04-10.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wggnss/meetings-fr/meeting-2018-04-10.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wggnss/meetings-fr/meeting-2018-11-28.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wggnss/meetings-fr/meeting-2018-11-28.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wggnss/meetings-fr/meeting-2018-11-28.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wggnss/meetings-fr/meeting-2018-11-28.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wggnss/meetings-fr/meeting-2020-06-03.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wggnss/meetings-fr/meeting-2020-06-03.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wggnss/meetings-fr/meeting-2020-06-03.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wggnss/meetings-fr/meeting-2020-06-03.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wggnss/meetings-fr/meeting-2021-02-03.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wggnss/meetings-fr/meeting-2021-02-03.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wggnss/meetings-fr/meeting-2021-02-03.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wggnss/meetings-fr/meeting-2021-02-03.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wggnss/meetings-fr/meeting-2021-06-23.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wggnss/meetings-fr/meeting-2021-06-23.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wggnss/meetings-fr/meeting-2021-06-23.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wggnss/meetings-fr/meeting-2021-06-23.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wggnss/meetings-fr/meeting-2022-05-18.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wggnss/meetings-fr/meeting-2022-05-18.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wggnss/meetings-fr/meeting-2022-05-18.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wggnss/meetings-fr/meeting-2022-05-18.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wggnss/meetings-fr/meeting-2023-05-30.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wggnss/meetings-fr/meeting-2023-05-30.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wggnss/meetings-fr/meeting-2023-05-30.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wggnss/meetings-fr/meeting-2023-05-30.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgmra/meetings-en/meeting-2015-09-14.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgmra/meetings-en/meeting-2015-09-14.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgmra/meetings-en/meeting-2015-09-14.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgmra/meetings-en/meeting-2015-09-14.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgmra/meetings-en/meeting-2017-02-17.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgmra/meetings-en/meeting-2017-02-17.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgmra/meetings-en/meeting-2017-02-17.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgmra/meetings-en/meeting-2017-02-17.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgmra/meetings-en/meeting-2017-06-06.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgmra/meetings-en/meeting-2017-06-06.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgmra/meetings-en/meeting-2017-06-06.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgmra/meetings-en/meeting-2017-06-06.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgmra/meetings-en/meeting-2021-03-04.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgmra/meetings-en/meeting-2021-03-04.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgmra/meetings-en/meeting-2021-03-04.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgmra/meetings-en/meeting-2021-03-04.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgmra/meetings-fr/meeting-2015-09-14.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgmra/meetings-fr/meeting-2015-09-14.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgmra/meetings-fr/meeting-2015-09-14.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgmra/meetings-fr/meeting-2015-09-14.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgmra/meetings-fr/meeting-2017-02-17.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgmra/meetings-fr/meeting-2017-02-17.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgmra/meetings-fr/meeting-2017-02-17.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgmra/meetings-fr/meeting-2017-02-17.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgmra/meetings-fr/meeting-2017-06-06.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgmra/meetings-fr/meeting-2017-06-06.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgmra/meetings-fr/meeting-2017-06-06.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgmra/meetings-fr/meeting-2017-06-06.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgmra/meetings-fr/meeting-2021-03-04.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgmra/meetings-fr/meeting-2021-03-04.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgmra/meetings-fr/meeting-2021-03-04.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgmra/meetings-fr/meeting-2021-03-04.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgpsfs/meetings-en/meeting-2015-04-15.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgpsfs/meetings-en/meeting-2015-04-15.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgpsfs/meetings-en/meeting-2015-04-15.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgpsfs/meetings-en/meeting-2015-04-15.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgpsfs/meetings-en/meeting-2017-06-06.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgpsfs/meetings-en/meeting-2017-06-06.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgpsfs/meetings-en/meeting-2017-06-06.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgpsfs/meetings-en/meeting-2017-06-06.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgpsfs/meetings-fr/meeting-2015-04-15.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgpsfs/meetings-fr/meeting-2015-04-15.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgpsfs/meetings-fr/meeting-2015-04-15.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgpsfs/meetings-fr/meeting-2015-04-15.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgpsfs/meetings-fr/meeting-2017-06-06.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgpsfs/meetings-fr/meeting-2017-06-06.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgpsfs/meetings-fr/meeting-2017-06-06.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgpsfs/meetings-fr/meeting-2017-06-06.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgsp/meetings-en/meeting-2015-09-15.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgsp/meetings-en/meeting-2015-09-15.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgsp/meetings-en/meeting-2015-09-15.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgsp/meetings-en/meeting-2015-09-15.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgsp/meetings-en/meeting-2019-06-26.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgsp/meetings-en/meeting-2019-06-26.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgsp/meetings-en/meeting-2019-06-26.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgsp/meetings-en/meeting-2019-06-26.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgsp/meetings-en/meeting-2019-10-11.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgsp/meetings-en/meeting-2019-10-11.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgsp/meetings-en/meeting-2019-10-11.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgsp/meetings-en/meeting-2019-10-11.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgsp/meetings-en/meeting-2020-04-20.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgsp/meetings-en/meeting-2020-04-20.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgsp/meetings-en/meeting-2020-04-20.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgsp/meetings-en/meeting-2020-04-20.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgsp/meetings-en/meeting-2020-05-27.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgsp/meetings-en/meeting-2020-05-27.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgsp/meetings-en/meeting-2020-05-27.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgsp/meetings-en/meeting-2020-05-27.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgsp/meetings-en/meeting-2020-06-24.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgsp/meetings-en/meeting-2020-06-24.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgsp/meetings-en/meeting-2020-06-24.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgsp/meetings-en/meeting-2020-06-24.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgsp/meetings-en/meeting-2020-08-26.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgsp/meetings-en/meeting-2020-08-26.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgsp/meetings-en/meeting-2020-08-26.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgsp/meetings-en/meeting-2020-08-26.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgsp/meetings-en/meeting-2020-09-24.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgsp/meetings-en/meeting-2020-09-24.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgsp/meetings-en/meeting-2020-09-24.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgsp/meetings-en/meeting-2020-09-24.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgsp/meetings-en/meeting-2020-11-20.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgsp/meetings-en/meeting-2020-11-20.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgsp/meetings-en/meeting-2020-11-20.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgsp/meetings-en/meeting-2020-11-20.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgsp/meetings-en/meeting-2021-02-11.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgsp/meetings-en/meeting-2021-02-11.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgsp/meetings-en/meeting-2021-02-11.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgsp/meetings-en/meeting-2021-02-11.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgsp/meetings-en/meeting-2021-03-03.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgsp/meetings-en/meeting-2021-03-03.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgsp/meetings-en/meeting-2021-03-03.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgsp/meetings-en/meeting-2021-03-03.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgsp/meetings-en/meeting-2021-06-18.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgsp/meetings-en/meeting-2021-06-18.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgsp/meetings-en/meeting-2021-06-18.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgsp/meetings-en/meeting-2021-06-18.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgsp/meetings-en/meeting-2021-09-17.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgsp/meetings-en/meeting-2021-09-17.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgsp/meetings-en/meeting-2021-09-17.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgsp/meetings-en/meeting-2021-09-17.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgsp/meetings-en/meeting-2022-01-21.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgsp/meetings-en/meeting-2022-01-21.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgsp/meetings-en/meeting-2022-01-21.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgsp/meetings-en/meeting-2022-01-21.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgsp/meetings-en/meeting-2022-03-18.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgsp/meetings-en/meeting-2022-03-18.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgsp/meetings-en/meeting-2022-03-18.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgsp/meetings-en/meeting-2022-03-18.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgsp/meetings-en/meeting-2022-05-23.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgsp/meetings-en/meeting-2022-05-23.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgsp/meetings-en/meeting-2022-05-23.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgsp/meetings-en/meeting-2022-05-23.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgsp/meetings-en/meeting-2022-06-17.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgsp/meetings-en/meeting-2022-06-17.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgsp/meetings-en/meeting-2022-06-17.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgsp/meetings-en/meeting-2022-06-17.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgsp/meetings-en/meeting-2023-02-03.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgsp/meetings-en/meeting-2023-02-03.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgsp/meetings-en/meeting-2023-02-03.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgsp/meetings-en/meeting-2023-02-03.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgsp/meetings-en/meeting-2023-04-21.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgsp/meetings-en/meeting-2023-04-21.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgsp/meetings-en/meeting-2023-04-21.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgsp/meetings-en/meeting-2023-04-21.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgsp/meetings-en/meeting-2023-06-20.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgsp/meetings-en/meeting-2023-06-20.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgsp/meetings-en/meeting-2023-06-20.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgsp/meetings-en/meeting-2023-06-20.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgsp/meetings-en/meeting-2023-09-22.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgsp/meetings-en/meeting-2023-09-22.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgsp/meetings-en/meeting-2023-09-22.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgsp/meetings-en/meeting-2023-09-22.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgsp/meetings-fr/meeting-2015-09-15.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgsp/meetings-fr/meeting-2015-09-15.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgsp/meetings-fr/meeting-2015-09-15.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgsp/meetings-fr/meeting-2015-09-15.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgsp/meetings-fr/meeting-2019-06-26.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgsp/meetings-fr/meeting-2019-06-26.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgsp/meetings-fr/meeting-2019-06-26.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgsp/meetings-fr/meeting-2019-06-26.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgsp/meetings-fr/meeting-2019-10-11.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgsp/meetings-fr/meeting-2019-10-11.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgsp/meetings-fr/meeting-2019-10-11.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgsp/meetings-fr/meeting-2019-10-11.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgsp/meetings-fr/meeting-2020-04-20.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgsp/meetings-fr/meeting-2020-04-20.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgsp/meetings-fr/meeting-2020-04-20.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgsp/meetings-fr/meeting-2020-04-20.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgsp/meetings-fr/meeting-2020-05-27.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgsp/meetings-fr/meeting-2020-05-27.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgsp/meetings-fr/meeting-2020-05-27.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgsp/meetings-fr/meeting-2020-05-27.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgsp/meetings-fr/meeting-2020-06-24.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgsp/meetings-fr/meeting-2020-06-24.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgsp/meetings-fr/meeting-2020-06-24.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgsp/meetings-fr/meeting-2020-06-24.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgsp/meetings-fr/meeting-2020-08-26.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgsp/meetings-fr/meeting-2020-08-26.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgsp/meetings-fr/meeting-2020-08-26.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgsp/meetings-fr/meeting-2020-08-26.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgsp/meetings-fr/meeting-2020-09-24.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgsp/meetings-fr/meeting-2020-09-24.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgsp/meetings-fr/meeting-2020-09-24.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgsp/meetings-fr/meeting-2020-09-24.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgsp/meetings-fr/meeting-2020-11-20.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgsp/meetings-fr/meeting-2020-11-20.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgsp/meetings-fr/meeting-2020-11-20.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgsp/meetings-fr/meeting-2020-11-20.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgsp/meetings-fr/meeting-2021-02-11.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgsp/meetings-fr/meeting-2021-02-11.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgsp/meetings-fr/meeting-2021-02-11.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgsp/meetings-fr/meeting-2021-02-11.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgsp/meetings-fr/meeting-2021-03-03.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgsp/meetings-fr/meeting-2021-03-03.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgsp/meetings-fr/meeting-2021-03-03.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgsp/meetings-fr/meeting-2021-03-03.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgsp/meetings-fr/meeting-2021-06-18.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgsp/meetings-fr/meeting-2021-06-18.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgsp/meetings-fr/meeting-2021-06-18.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgsp/meetings-fr/meeting-2021-06-18.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgsp/meetings-fr/meeting-2021-09-17.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgsp/meetings-fr/meeting-2021-09-17.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgsp/meetings-fr/meeting-2021-09-17.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgsp/meetings-fr/meeting-2021-09-17.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgsp/meetings-fr/meeting-2022-01-21.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgsp/meetings-fr/meeting-2022-01-21.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgsp/meetings-fr/meeting-2022-01-21.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgsp/meetings-fr/meeting-2022-01-21.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgsp/meetings-fr/meeting-2022-03-18.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgsp/meetings-fr/meeting-2022-03-18.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgsp/meetings-fr/meeting-2022-03-18.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgsp/meetings-fr/meeting-2022-03-18.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgsp/meetings-fr/meeting-2022-05-23.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgsp/meetings-fr/meeting-2022-05-23.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgsp/meetings-fr/meeting-2022-05-23.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgsp/meetings-fr/meeting-2022-05-23.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgsp/meetings-fr/meeting-2022-06-17.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgsp/meetings-fr/meeting-2022-06-17.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgsp/meetings-fr/meeting-2022-06-17.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgsp/meetings-fr/meeting-2022-06-17.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgsp/meetings-fr/meeting-2023-02-03.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgsp/meetings-fr/meeting-2023-02-03.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgsp/meetings-fr/meeting-2023-02-03.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgsp/meetings-fr/meeting-2023-02-03.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgsp/meetings-fr/meeting-2023-04-21.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgsp/meetings-fr/meeting-2023-04-21.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgsp/meetings-fr/meeting-2023-04-21.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgsp/meetings-fr/meeting-2023-04-21.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgsp/meetings-fr/meeting-2023-06-20.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgsp/meetings-fr/meeting-2023-06-20.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgsp/meetings-fr/meeting-2023-06-20.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgsp/meetings-fr/meeting-2023-06-20.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgsp/meetings-fr/meeting-2023-09-22.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgsp/meetings-fr/meeting-2023-09-22.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgsp/meetings-fr/meeting-2023-09-22.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgsp/meetings-fr/meeting-2023-09-22.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgtai/meetings-en/meeting-2006-09-12.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgtai/meetings-en/meeting-2006-09-12.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgtai/meetings-en/meeting-2006-09-12.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgtai/meetings-en/meeting-2006-09-12.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgtai/meetings-en/meeting-2009-06-03.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgtai/meetings-en/meeting-2009-06-03.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgtai/meetings-en/meeting-2009-06-03.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgtai/meetings-en/meeting-2009-06-03.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgtai/meetings-en/meeting-2012-09-12.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgtai/meetings-en/meeting-2012-09-12.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgtai/meetings-en/meeting-2012-09-12.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgtai/meetings-en/meeting-2012-09-12.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgtai/meetings-en/meeting-2015-09-16.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgtai/meetings-en/meeting-2015-09-16.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgtai/meetings-en/meeting-2015-09-16.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgtai/meetings-en/meeting-2015-09-16.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgtai/meetings-en/meeting-2016-09-28.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgtai/meetings-en/meeting-2016-09-28.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgtai/meetings-en/meeting-2016-09-28.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgtai/meetings-en/meeting-2016-09-28.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgtai/meetings-en/meeting-2017-06-07.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgtai/meetings-en/meeting-2017-06-07.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgtai/meetings-en/meeting-2017-06-07.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgtai/meetings-en/meeting-2017-06-07.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgtai/meetings-en/meeting-2021-06-11.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgtai/meetings-en/meeting-2021-06-11.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgtai/meetings-en/meeting-2021-06-11.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgtai/meetings-en/meeting-2021-06-11.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgtai/meetings-en/meeting-2022-09-20.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgtai/meetings-en/meeting-2022-09-20.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgtai/meetings-en/meeting-2022-09-20.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgtai/meetings-en/meeting-2022-09-20.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgtai/meetings-en/meeting-2023-04-18.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgtai/meetings-en/meeting-2023-04-18.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgtai/meetings-en/meeting-2023-04-18.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgtai/meetings-en/meeting-2023-04-18.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgtai/meetings-en/meeting-2023-06-15.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgtai/meetings-en/meeting-2023-06-15.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgtai/meetings-en/meeting-2023-06-15.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgtai/meetings-en/meeting-2023-06-15.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgtai/meetings-fr/meeting-2006-09-12.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgtai/meetings-fr/meeting-2006-09-12.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgtai/meetings-fr/meeting-2006-09-12.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgtai/meetings-fr/meeting-2006-09-12.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgtai/meetings-fr/meeting-2009-06-03.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgtai/meetings-fr/meeting-2009-06-03.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgtai/meetings-fr/meeting-2009-06-03.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgtai/meetings-fr/meeting-2009-06-03.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgtai/meetings-fr/meeting-2012-09-12.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgtai/meetings-fr/meeting-2012-09-12.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgtai/meetings-fr/meeting-2012-09-12.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgtai/meetings-fr/meeting-2012-09-12.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgtai/meetings-fr/meeting-2015-09-16.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgtai/meetings-fr/meeting-2015-09-16.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgtai/meetings-fr/meeting-2015-09-16.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgtai/meetings-fr/meeting-2015-09-16.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgtai/meetings-fr/meeting-2016-09-28.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgtai/meetings-fr/meeting-2016-09-28.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgtai/meetings-fr/meeting-2016-09-28.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgtai/meetings-fr/meeting-2016-09-28.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgtai/meetings-fr/meeting-2017-06-07.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgtai/meetings-fr/meeting-2017-06-07.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgtai/meetings-fr/meeting-2017-06-07.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgtai/meetings-fr/meeting-2017-06-07.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgtai/meetings-fr/meeting-2021-06-11.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgtai/meetings-fr/meeting-2021-06-11.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgtai/meetings-fr/meeting-2021-06-11.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgtai/meetings-fr/meeting-2021-06-11.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgtai/meetings-fr/meeting-2022-09-20.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgtai/meetings-fr/meeting-2022-09-20.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgtai/meetings-fr/meeting-2022-09-20.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgtai/meetings-fr/meeting-2022-09-20.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgtai/meetings-fr/meeting-2023-04-18.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgtai/meetings-fr/meeting-2023-04-18.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgtai/meetings-fr/meeting-2023-04-18.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgtai/meetings-fr/meeting-2023-04-18.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgtai/meetings-fr/meeting-2023-06-15.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgtai/meetings-fr/meeting-2023-06-15.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgtai/meetings-fr/meeting-2023-06-15.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgtai/meetings-fr/meeting-2023-06-15.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgtwstft/meetings-en/meeting-2000-10-05.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgtwstft/meetings-en/meeting-2000-10-05.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgtwstft/meetings-en/meeting-2000-10-05.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgtwstft/meetings-en/meeting-2000-10-05.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgtwstft/meetings-en/meeting-2001-10-05.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgtwstft/meetings-en/meeting-2001-10-05.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgtwstft/meetings-en/meeting-2001-10-05.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgtwstft/meetings-en/meeting-2001-10-05.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgtwstft/meetings-en/meeting-2002-10-07.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgtwstft/meetings-en/meeting-2002-10-07.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgtwstft/meetings-en/meeting-2002-10-07.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgtwstft/meetings-en/meeting-2002-10-07.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgtwstft/meetings-en/meeting-2003-10-09.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgtwstft/meetings-en/meeting-2003-10-09.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgtwstft/meetings-en/meeting-2003-10-09.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgtwstft/meetings-en/meeting-2003-10-09.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgtwstft/meetings-en/meeting-2004-10-14.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgtwstft/meetings-en/meeting-2004-10-14.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgtwstft/meetings-en/meeting-2004-10-14.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgtwstft/meetings-en/meeting-2004-10-14.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgtwstft/meetings-en/meeting-2005-11-15.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgtwstft/meetings-en/meeting-2005-11-15.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgtwstft/meetings-en/meeting-2005-11-15.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgtwstft/meetings-en/meeting-2005-11-15.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgtwstft/meetings-en/meeting-2006-09-10.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgtwstft/meetings-en/meeting-2006-09-10.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgtwstft/meetings-en/meeting-2006-09-10.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgtwstft/meetings-en/meeting-2006-09-10.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgtwstft/meetings-en/meeting-2007-09-17.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgtwstft/meetings-en/meeting-2007-09-17.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgtwstft/meetings-en/meeting-2007-09-17.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgtwstft/meetings-en/meeting-2007-09-17.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgtwstft/meetings-en/meeting-2008-10-02.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgtwstft/meetings-en/meeting-2008-10-02.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgtwstft/meetings-en/meeting-2008-10-02.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgtwstft/meetings-en/meeting-2008-10-02.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgtwstft/meetings-en/meeting-2009-10-20.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgtwstft/meetings-en/meeting-2009-10-20.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgtwstft/meetings-en/meeting-2009-10-20.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgtwstft/meetings-en/meeting-2009-10-20.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgtwstft/meetings-en/meeting-2010-09-16.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgtwstft/meetings-en/meeting-2010-09-16.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgtwstft/meetings-en/meeting-2010-09-16.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgtwstft/meetings-en/meeting-2010-09-16.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgtwstft/meetings-en/meeting-2011-09-12.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgtwstft/meetings-en/meeting-2011-09-12.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgtwstft/meetings-en/meeting-2011-09-12.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgtwstft/meetings-en/meeting-2011-09-12.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgtwstft/meetings-en/meeting-2012-09-06.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgtwstft/meetings-en/meeting-2012-09-06.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgtwstft/meetings-en/meeting-2012-09-06.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgtwstft/meetings-en/meeting-2012-09-06.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgtwstft/meetings-en/meeting-2013-09-05.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgtwstft/meetings-en/meeting-2013-09-05.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgtwstft/meetings-en/meeting-2013-09-05.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgtwstft/meetings-en/meeting-2013-09-05.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgtwstft/meetings-en/meeting-2014-09-15.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgtwstft/meetings-en/meeting-2014-09-15.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgtwstft/meetings-en/meeting-2014-09-15.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgtwstft/meetings-en/meeting-2014-09-15.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgtwstft/meetings-en/meeting-2015-09-07.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgtwstft/meetings-en/meeting-2015-09-07.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgtwstft/meetings-en/meeting-2015-09-07.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgtwstft/meetings-en/meeting-2015-09-07.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgtwstft/meetings-en/meeting-2016-09-07.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgtwstft/meetings-en/meeting-2016-09-07.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgtwstft/meetings-en/meeting-2016-09-07.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgtwstft/meetings-en/meeting-2016-09-07.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgtwstft/meetings-en/meeting-2017-05-18.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgtwstft/meetings-en/meeting-2017-05-18.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgtwstft/meetings-en/meeting-2017-05-18.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgtwstft/meetings-en/meeting-2017-05-18.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgtwstft/meetings-en/meeting-2018-06-07.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgtwstft/meetings-en/meeting-2018-06-07.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgtwstft/meetings-en/meeting-2018-06-07.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgtwstft/meetings-en/meeting-2018-06-07.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgtwstft/meetings-en/meeting-2019-10-31.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgtwstft/meetings-en/meeting-2019-10-31.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgtwstft/meetings-en/meeting-2019-10-31.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgtwstft/meetings-en/meeting-2019-10-31.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgtwstft/meetings-en/meeting-2021-02-23.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgtwstft/meetings-en/meeting-2021-02-23.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgtwstft/meetings-en/meeting-2021-02-23.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgtwstft/meetings-en/meeting-2021-02-23.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgtwstft/meetings-en/meeting-2022-05-20.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgtwstft/meetings-en/meeting-2022-05-20.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgtwstft/meetings-en/meeting-2022-05-20.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgtwstft/meetings-en/meeting-2022-05-20.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgtwstft/meetings-en/meeting-2023-06-13.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgtwstft/meetings-en/meeting-2023-06-13.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgtwstft/meetings-en/meeting-2023-06-13.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgtwstft/meetings-en/meeting-2023-06-13.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgtwstft/meetings-fr/meeting-2000-10-05.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgtwstft/meetings-fr/meeting-2000-10-05.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgtwstft/meetings-fr/meeting-2000-10-05.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgtwstft/meetings-fr/meeting-2000-10-05.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgtwstft/meetings-fr/meeting-2001-10-05.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgtwstft/meetings-fr/meeting-2001-10-05.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgtwstft/meetings-fr/meeting-2001-10-05.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgtwstft/meetings-fr/meeting-2001-10-05.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgtwstft/meetings-fr/meeting-2002-10-07.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgtwstft/meetings-fr/meeting-2002-10-07.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgtwstft/meetings-fr/meeting-2002-10-07.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgtwstft/meetings-fr/meeting-2002-10-07.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgtwstft/meetings-fr/meeting-2003-10-09.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgtwstft/meetings-fr/meeting-2003-10-09.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgtwstft/meetings-fr/meeting-2003-10-09.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgtwstft/meetings-fr/meeting-2003-10-09.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgtwstft/meetings-fr/meeting-2004-10-14.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgtwstft/meetings-fr/meeting-2004-10-14.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgtwstft/meetings-fr/meeting-2004-10-14.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgtwstft/meetings-fr/meeting-2004-10-14.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgtwstft/meetings-fr/meeting-2005-11-15.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgtwstft/meetings-fr/meeting-2005-11-15.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgtwstft/meetings-fr/meeting-2005-11-15.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgtwstft/meetings-fr/meeting-2005-11-15.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgtwstft/meetings-fr/meeting-2006-09-10.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgtwstft/meetings-fr/meeting-2006-09-10.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgtwstft/meetings-fr/meeting-2006-09-10.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgtwstft/meetings-fr/meeting-2006-09-10.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgtwstft/meetings-fr/meeting-2007-09-17.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgtwstft/meetings-fr/meeting-2007-09-17.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgtwstft/meetings-fr/meeting-2007-09-17.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgtwstft/meetings-fr/meeting-2007-09-17.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgtwstft/meetings-fr/meeting-2008-10-02.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgtwstft/meetings-fr/meeting-2008-10-02.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgtwstft/meetings-fr/meeting-2008-10-02.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgtwstft/meetings-fr/meeting-2008-10-02.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgtwstft/meetings-fr/meeting-2009-10-20.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgtwstft/meetings-fr/meeting-2009-10-20.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgtwstft/meetings-fr/meeting-2009-10-20.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgtwstft/meetings-fr/meeting-2009-10-20.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgtwstft/meetings-fr/meeting-2010-09-16.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgtwstft/meetings-fr/meeting-2010-09-16.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgtwstft/meetings-fr/meeting-2010-09-16.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgtwstft/meetings-fr/meeting-2010-09-16.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgtwstft/meetings-fr/meeting-2011-09-12.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgtwstft/meetings-fr/meeting-2011-09-12.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgtwstft/meetings-fr/meeting-2011-09-12.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgtwstft/meetings-fr/meeting-2011-09-12.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgtwstft/meetings-fr/meeting-2012-09-06.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgtwstft/meetings-fr/meeting-2012-09-06.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgtwstft/meetings-fr/meeting-2012-09-06.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgtwstft/meetings-fr/meeting-2012-09-06.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgtwstft/meetings-fr/meeting-2013-09-05.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgtwstft/meetings-fr/meeting-2013-09-05.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgtwstft/meetings-fr/meeting-2013-09-05.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgtwstft/meetings-fr/meeting-2013-09-05.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgtwstft/meetings-fr/meeting-2014-09-15.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgtwstft/meetings-fr/meeting-2014-09-15.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgtwstft/meetings-fr/meeting-2014-09-15.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgtwstft/meetings-fr/meeting-2014-09-15.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgtwstft/meetings-fr/meeting-2015-09-07.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgtwstft/meetings-fr/meeting-2015-09-07.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgtwstft/meetings-fr/meeting-2015-09-07.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgtwstft/meetings-fr/meeting-2015-09-07.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgtwstft/meetings-fr/meeting-2016-09-07.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgtwstft/meetings-fr/meeting-2016-09-07.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgtwstft/meetings-fr/meeting-2016-09-07.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgtwstft/meetings-fr/meeting-2016-09-07.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgtwstft/meetings-fr/meeting-2017-05-18.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgtwstft/meetings-fr/meeting-2017-05-18.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgtwstft/meetings-fr/meeting-2017-05-18.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgtwstft/meetings-fr/meeting-2017-05-18.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgtwstft/meetings-fr/meeting-2018-06-07.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgtwstft/meetings-fr/meeting-2018-06-07.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgtwstft/meetings-fr/meeting-2018-06-07.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgtwstft/meetings-fr/meeting-2018-06-07.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgtwstft/meetings-fr/meeting-2019-10-31.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgtwstft/meetings-fr/meeting-2019-10-31.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgtwstft/meetings-fr/meeting-2019-10-31.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgtwstft/meetings-fr/meeting-2019-10-31.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgtwstft/meetings-fr/meeting-2021-02-23.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgtwstft/meetings-fr/meeting-2021-02-23.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgtwstft/meetings-fr/meeting-2021-02-23.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgtwstft/meetings-fr/meeting-2021-02-23.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgtwstft/meetings-fr/meeting-2022-05-20.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgtwstft/meetings-fr/meeting-2022-05-20.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgtwstft/meetings-fr/meeting-2022-05-20.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgtwstft/meetings-fr/meeting-2022-05-20.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgtwstft/meetings-fr/meeting-2023-06-13.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgtwstft/meetings-fr/meeting-2023-06-13.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-wgtwstft/meetings-fr/meeting-2023-06-13.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-wgtwstft/meetings-fr/meeting-2023-06-13.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-ws/meetings-en/meeting-2023-11-16.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-ws/meetings-en/meeting-2023-11-16.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-ws/meetings-en/meeting-2023-11-16.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-ws/meetings-en/meeting-2023-11-16.yml diff --git a/src/si_ref_point/resbod_data/cctf/workgroups/cctf-ws/meetings-fr/meeting-2023-11-16.yml b/src/si_ref_point/inputs/rb/cctf/workgroups/cctf-ws/meetings-fr/meeting-2023-11-16.yml similarity index 100% rename from src/si_ref_point/resbod_data/cctf/workgroups/cctf-ws/meetings-fr/meeting-2023-11-16.yml rename to src/si_ref_point/inputs/rb/cctf/workgroups/cctf-ws/meetings-fr/meeting-2023-11-16.yml diff --git a/src/si_ref_point/resbod_data/cgpm/meetings-en/meeting-01.yml b/src/si_ref_point/inputs/rb/cgpm/meetings-en/meeting-01.yml similarity index 100% rename from src/si_ref_point/resbod_data/cgpm/meetings-en/meeting-01.yml rename to src/si_ref_point/inputs/rb/cgpm/meetings-en/meeting-01.yml diff --git a/src/si_ref_point/resbod_data/cgpm/meetings-en/meeting-03.yml b/src/si_ref_point/inputs/rb/cgpm/meetings-en/meeting-03.yml similarity index 100% rename from src/si_ref_point/resbod_data/cgpm/meetings-en/meeting-03.yml rename to src/si_ref_point/inputs/rb/cgpm/meetings-en/meeting-03.yml diff --git a/src/si_ref_point/resbod_data/cgpm/meetings-en/meeting-07.yml b/src/si_ref_point/inputs/rb/cgpm/meetings-en/meeting-07.yml similarity index 100% rename from src/si_ref_point/resbod_data/cgpm/meetings-en/meeting-07.yml rename to src/si_ref_point/inputs/rb/cgpm/meetings-en/meeting-07.yml diff --git a/src/si_ref_point/resbod_data/cgpm/meetings-en/meeting-08.yml b/src/si_ref_point/inputs/rb/cgpm/meetings-en/meeting-08.yml similarity index 100% rename from src/si_ref_point/resbod_data/cgpm/meetings-en/meeting-08.yml rename to src/si_ref_point/inputs/rb/cgpm/meetings-en/meeting-08.yml diff --git a/src/si_ref_point/resbod_data/cgpm/meetings-en/meeting-09.yml b/src/si_ref_point/inputs/rb/cgpm/meetings-en/meeting-09.yml similarity index 100% rename from src/si_ref_point/resbod_data/cgpm/meetings-en/meeting-09.yml rename to src/si_ref_point/inputs/rb/cgpm/meetings-en/meeting-09.yml diff --git a/src/si_ref_point/resbod_data/cgpm/meetings-en/meeting-10.yml b/src/si_ref_point/inputs/rb/cgpm/meetings-en/meeting-10.yml similarity index 100% rename from src/si_ref_point/resbod_data/cgpm/meetings-en/meeting-10.yml rename to src/si_ref_point/inputs/rb/cgpm/meetings-en/meeting-10.yml diff --git a/src/si_ref_point/resbod_data/cgpm/meetings-en/meeting-11.yml b/src/si_ref_point/inputs/rb/cgpm/meetings-en/meeting-11.yml similarity index 100% rename from src/si_ref_point/resbod_data/cgpm/meetings-en/meeting-11.yml rename to src/si_ref_point/inputs/rb/cgpm/meetings-en/meeting-11.yml diff --git a/src/si_ref_point/resbod_data/cgpm/meetings-en/meeting-12.yml b/src/si_ref_point/inputs/rb/cgpm/meetings-en/meeting-12.yml similarity index 100% rename from src/si_ref_point/resbod_data/cgpm/meetings-en/meeting-12.yml rename to src/si_ref_point/inputs/rb/cgpm/meetings-en/meeting-12.yml diff --git a/src/si_ref_point/resbod_data/cgpm/meetings-en/meeting-13.yml b/src/si_ref_point/inputs/rb/cgpm/meetings-en/meeting-13.yml similarity index 100% rename from src/si_ref_point/resbod_data/cgpm/meetings-en/meeting-13.yml rename to src/si_ref_point/inputs/rb/cgpm/meetings-en/meeting-13.yml diff --git a/src/si_ref_point/resbod_data/cgpm/meetings-en/meeting-14.yml b/src/si_ref_point/inputs/rb/cgpm/meetings-en/meeting-14.yml similarity index 100% rename from src/si_ref_point/resbod_data/cgpm/meetings-en/meeting-14.yml rename to src/si_ref_point/inputs/rb/cgpm/meetings-en/meeting-14.yml diff --git a/src/si_ref_point/resbod_data/cgpm/meetings-en/meeting-15.yml b/src/si_ref_point/inputs/rb/cgpm/meetings-en/meeting-15.yml similarity index 100% rename from src/si_ref_point/resbod_data/cgpm/meetings-en/meeting-15.yml rename to src/si_ref_point/inputs/rb/cgpm/meetings-en/meeting-15.yml diff --git a/src/si_ref_point/resbod_data/cgpm/meetings-en/meeting-16.yml b/src/si_ref_point/inputs/rb/cgpm/meetings-en/meeting-16.yml similarity index 100% rename from src/si_ref_point/resbod_data/cgpm/meetings-en/meeting-16.yml rename to src/si_ref_point/inputs/rb/cgpm/meetings-en/meeting-16.yml diff --git a/src/si_ref_point/resbod_data/cgpm/meetings-en/meeting-17.yml b/src/si_ref_point/inputs/rb/cgpm/meetings-en/meeting-17.yml similarity index 100% rename from src/si_ref_point/resbod_data/cgpm/meetings-en/meeting-17.yml rename to src/si_ref_point/inputs/rb/cgpm/meetings-en/meeting-17.yml diff --git a/src/si_ref_point/resbod_data/cgpm/meetings-en/meeting-18.yml b/src/si_ref_point/inputs/rb/cgpm/meetings-en/meeting-18.yml similarity index 100% rename from src/si_ref_point/resbod_data/cgpm/meetings-en/meeting-18.yml rename to src/si_ref_point/inputs/rb/cgpm/meetings-en/meeting-18.yml diff --git a/src/si_ref_point/resbod_data/cgpm/meetings-en/meeting-19.yml b/src/si_ref_point/inputs/rb/cgpm/meetings-en/meeting-19.yml similarity index 100% rename from src/si_ref_point/resbod_data/cgpm/meetings-en/meeting-19.yml rename to src/si_ref_point/inputs/rb/cgpm/meetings-en/meeting-19.yml diff --git a/src/si_ref_point/resbod_data/cgpm/meetings-en/meeting-20.yml b/src/si_ref_point/inputs/rb/cgpm/meetings-en/meeting-20.yml similarity index 100% rename from src/si_ref_point/resbod_data/cgpm/meetings-en/meeting-20.yml rename to src/si_ref_point/inputs/rb/cgpm/meetings-en/meeting-20.yml diff --git a/src/si_ref_point/resbod_data/cgpm/meetings-en/meeting-21.yml b/src/si_ref_point/inputs/rb/cgpm/meetings-en/meeting-21.yml similarity index 99% rename from src/si_ref_point/resbod_data/cgpm/meetings-en/meeting-21.yml rename to src/si_ref_point/inputs/rb/cgpm/meetings-en/meeting-21.yml index 8c46513..85cbf78 100755 --- a/src/si_ref_point/resbod_data/cgpm/meetings-en/meeting-21.yml +++ b/src/si_ref_point/inputs/rb/cgpm/meetings-en/meeting-21.yml @@ -77,7 +77,7 @@ resolutions: - type: considering date_effective: '1999-10-15' message: considering the rapidly increasing emphasis on the need to demonstrate - international equivalence of measurements and test results related to trade, + international equivalence of measurements and tests results related to trade, - type: considering date_effective: '1999-10-15' message: considering the increasing number of mutual recognition arrangements @@ -92,7 +92,7 @@ resolutions: date_effective: '1999-10-15' message: "*recognizes* that mutual recognition of the national measurement standards and the calibration services of the national metrology institutes is necessary - in order to provide the basis for mutual recognition of calibration and test + in order to provide the basis for mutual recognition of calibration and tests services generally," actions: - type: welcomes diff --git a/src/si_ref_point/resbod_data/cgpm/meetings-en/meeting-22.yml b/src/si_ref_point/inputs/rb/cgpm/meetings-en/meeting-22.yml similarity index 100% rename from src/si_ref_point/resbod_data/cgpm/meetings-en/meeting-22.yml rename to src/si_ref_point/inputs/rb/cgpm/meetings-en/meeting-22.yml diff --git a/src/si_ref_point/resbod_data/cgpm/meetings-en/meeting-23.yml b/src/si_ref_point/inputs/rb/cgpm/meetings-en/meeting-23.yml similarity index 100% rename from src/si_ref_point/resbod_data/cgpm/meetings-en/meeting-23.yml rename to src/si_ref_point/inputs/rb/cgpm/meetings-en/meeting-23.yml diff --git a/src/si_ref_point/resbod_data/cgpm/meetings-en/meeting-24.yml b/src/si_ref_point/inputs/rb/cgpm/meetings-en/meeting-24.yml similarity index 100% rename from src/si_ref_point/resbod_data/cgpm/meetings-en/meeting-24.yml rename to src/si_ref_point/inputs/rb/cgpm/meetings-en/meeting-24.yml diff --git a/src/si_ref_point/resbod_data/cgpm/meetings-en/meeting-25.yml b/src/si_ref_point/inputs/rb/cgpm/meetings-en/meeting-25.yml similarity index 100% rename from src/si_ref_point/resbod_data/cgpm/meetings-en/meeting-25.yml rename to src/si_ref_point/inputs/rb/cgpm/meetings-en/meeting-25.yml diff --git a/src/si_ref_point/resbod_data/cgpm/meetings-en/meeting-26.yml b/src/si_ref_point/inputs/rb/cgpm/meetings-en/meeting-26.yml similarity index 100% rename from src/si_ref_point/resbod_data/cgpm/meetings-en/meeting-26.yml rename to src/si_ref_point/inputs/rb/cgpm/meetings-en/meeting-26.yml diff --git a/src/si_ref_point/resbod_data/cgpm/meetings-en/meeting-27.yml b/src/si_ref_point/inputs/rb/cgpm/meetings-en/meeting-27.yml similarity index 100% rename from src/si_ref_point/resbod_data/cgpm/meetings-en/meeting-27.yml rename to src/si_ref_point/inputs/rb/cgpm/meetings-en/meeting-27.yml diff --git a/src/si_ref_point/resbod_data/cgpm/meetings-fr/meeting-01.yml b/src/si_ref_point/inputs/rb/cgpm/meetings-fr/meeting-01.yml similarity index 100% rename from src/si_ref_point/resbod_data/cgpm/meetings-fr/meeting-01.yml rename to src/si_ref_point/inputs/rb/cgpm/meetings-fr/meeting-01.yml diff --git a/src/si_ref_point/resbod_data/cgpm/meetings-fr/meeting-03.yml b/src/si_ref_point/inputs/rb/cgpm/meetings-fr/meeting-03.yml similarity index 100% rename from src/si_ref_point/resbod_data/cgpm/meetings-fr/meeting-03.yml rename to src/si_ref_point/inputs/rb/cgpm/meetings-fr/meeting-03.yml diff --git a/src/si_ref_point/resbod_data/cgpm/meetings-fr/meeting-07.yml b/src/si_ref_point/inputs/rb/cgpm/meetings-fr/meeting-07.yml similarity index 100% rename from src/si_ref_point/resbod_data/cgpm/meetings-fr/meeting-07.yml rename to src/si_ref_point/inputs/rb/cgpm/meetings-fr/meeting-07.yml diff --git a/src/si_ref_point/resbod_data/cgpm/meetings-fr/meeting-08.yml b/src/si_ref_point/inputs/rb/cgpm/meetings-fr/meeting-08.yml similarity index 100% rename from src/si_ref_point/resbod_data/cgpm/meetings-fr/meeting-08.yml rename to src/si_ref_point/inputs/rb/cgpm/meetings-fr/meeting-08.yml diff --git a/src/si_ref_point/resbod_data/cgpm/meetings-fr/meeting-09.yml b/src/si_ref_point/inputs/rb/cgpm/meetings-fr/meeting-09.yml similarity index 100% rename from src/si_ref_point/resbod_data/cgpm/meetings-fr/meeting-09.yml rename to src/si_ref_point/inputs/rb/cgpm/meetings-fr/meeting-09.yml diff --git a/src/si_ref_point/resbod_data/cgpm/meetings-fr/meeting-10.yml b/src/si_ref_point/inputs/rb/cgpm/meetings-fr/meeting-10.yml similarity index 100% rename from src/si_ref_point/resbod_data/cgpm/meetings-fr/meeting-10.yml rename to src/si_ref_point/inputs/rb/cgpm/meetings-fr/meeting-10.yml diff --git a/src/si_ref_point/resbod_data/cgpm/meetings-fr/meeting-11.yml b/src/si_ref_point/inputs/rb/cgpm/meetings-fr/meeting-11.yml similarity index 100% rename from src/si_ref_point/resbod_data/cgpm/meetings-fr/meeting-11.yml rename to src/si_ref_point/inputs/rb/cgpm/meetings-fr/meeting-11.yml diff --git a/src/si_ref_point/resbod_data/cgpm/meetings-fr/meeting-12.yml b/src/si_ref_point/inputs/rb/cgpm/meetings-fr/meeting-12.yml similarity index 100% rename from src/si_ref_point/resbod_data/cgpm/meetings-fr/meeting-12.yml rename to src/si_ref_point/inputs/rb/cgpm/meetings-fr/meeting-12.yml diff --git a/src/si_ref_point/resbod_data/cgpm/meetings-fr/meeting-13.yml b/src/si_ref_point/inputs/rb/cgpm/meetings-fr/meeting-13.yml similarity index 100% rename from src/si_ref_point/resbod_data/cgpm/meetings-fr/meeting-13.yml rename to src/si_ref_point/inputs/rb/cgpm/meetings-fr/meeting-13.yml diff --git a/src/si_ref_point/resbod_data/cgpm/meetings-fr/meeting-14.yml b/src/si_ref_point/inputs/rb/cgpm/meetings-fr/meeting-14.yml similarity index 100% rename from src/si_ref_point/resbod_data/cgpm/meetings-fr/meeting-14.yml rename to src/si_ref_point/inputs/rb/cgpm/meetings-fr/meeting-14.yml diff --git a/src/si_ref_point/resbod_data/cgpm/meetings-fr/meeting-15.yml b/src/si_ref_point/inputs/rb/cgpm/meetings-fr/meeting-15.yml similarity index 100% rename from src/si_ref_point/resbod_data/cgpm/meetings-fr/meeting-15.yml rename to src/si_ref_point/inputs/rb/cgpm/meetings-fr/meeting-15.yml diff --git a/src/si_ref_point/resbod_data/cgpm/meetings-fr/meeting-16.yml b/src/si_ref_point/inputs/rb/cgpm/meetings-fr/meeting-16.yml similarity index 100% rename from src/si_ref_point/resbod_data/cgpm/meetings-fr/meeting-16.yml rename to src/si_ref_point/inputs/rb/cgpm/meetings-fr/meeting-16.yml diff --git a/src/si_ref_point/resbod_data/cgpm/meetings-fr/meeting-17.yml b/src/si_ref_point/inputs/rb/cgpm/meetings-fr/meeting-17.yml similarity index 100% rename from src/si_ref_point/resbod_data/cgpm/meetings-fr/meeting-17.yml rename to src/si_ref_point/inputs/rb/cgpm/meetings-fr/meeting-17.yml diff --git a/src/si_ref_point/resbod_data/cgpm/meetings-fr/meeting-18.yml b/src/si_ref_point/inputs/rb/cgpm/meetings-fr/meeting-18.yml similarity index 100% rename from src/si_ref_point/resbod_data/cgpm/meetings-fr/meeting-18.yml rename to src/si_ref_point/inputs/rb/cgpm/meetings-fr/meeting-18.yml diff --git a/src/si_ref_point/resbod_data/cgpm/meetings-fr/meeting-19.yml b/src/si_ref_point/inputs/rb/cgpm/meetings-fr/meeting-19.yml similarity index 100% rename from src/si_ref_point/resbod_data/cgpm/meetings-fr/meeting-19.yml rename to src/si_ref_point/inputs/rb/cgpm/meetings-fr/meeting-19.yml diff --git a/src/si_ref_point/resbod_data/cgpm/meetings-fr/meeting-20.yml b/src/si_ref_point/inputs/rb/cgpm/meetings-fr/meeting-20.yml similarity index 100% rename from src/si_ref_point/resbod_data/cgpm/meetings-fr/meeting-20.yml rename to src/si_ref_point/inputs/rb/cgpm/meetings-fr/meeting-20.yml diff --git a/src/si_ref_point/resbod_data/cgpm/meetings-fr/meeting-21.yml b/src/si_ref_point/inputs/rb/cgpm/meetings-fr/meeting-21.yml similarity index 100% rename from src/si_ref_point/resbod_data/cgpm/meetings-fr/meeting-21.yml rename to src/si_ref_point/inputs/rb/cgpm/meetings-fr/meeting-21.yml diff --git a/src/si_ref_point/resbod_data/cgpm/meetings-fr/meeting-22.yml b/src/si_ref_point/inputs/rb/cgpm/meetings-fr/meeting-22.yml similarity index 100% rename from src/si_ref_point/resbod_data/cgpm/meetings-fr/meeting-22.yml rename to src/si_ref_point/inputs/rb/cgpm/meetings-fr/meeting-22.yml diff --git a/src/si_ref_point/resbod_data/cgpm/meetings-fr/meeting-23.yml b/src/si_ref_point/inputs/rb/cgpm/meetings-fr/meeting-23.yml similarity index 100% rename from src/si_ref_point/resbod_data/cgpm/meetings-fr/meeting-23.yml rename to src/si_ref_point/inputs/rb/cgpm/meetings-fr/meeting-23.yml diff --git a/src/si_ref_point/resbod_data/cgpm/meetings-fr/meeting-24.yml b/src/si_ref_point/inputs/rb/cgpm/meetings-fr/meeting-24.yml similarity index 100% rename from src/si_ref_point/resbod_data/cgpm/meetings-fr/meeting-24.yml rename to src/si_ref_point/inputs/rb/cgpm/meetings-fr/meeting-24.yml diff --git a/src/si_ref_point/resbod_data/cgpm/meetings-fr/meeting-25.yml b/src/si_ref_point/inputs/rb/cgpm/meetings-fr/meeting-25.yml similarity index 100% rename from src/si_ref_point/resbod_data/cgpm/meetings-fr/meeting-25.yml rename to src/si_ref_point/inputs/rb/cgpm/meetings-fr/meeting-25.yml diff --git a/src/si_ref_point/resbod_data/cgpm/meetings-fr/meeting-26.yml b/src/si_ref_point/inputs/rb/cgpm/meetings-fr/meeting-26.yml similarity index 100% rename from src/si_ref_point/resbod_data/cgpm/meetings-fr/meeting-26.yml rename to src/si_ref_point/inputs/rb/cgpm/meetings-fr/meeting-26.yml diff --git a/src/si_ref_point/resbod_data/cgpm/meetings-fr/meeting-27.yml b/src/si_ref_point/inputs/rb/cgpm/meetings-fr/meeting-27.yml similarity index 100% rename from src/si_ref_point/resbod_data/cgpm/meetings-fr/meeting-27.yml rename to src/si_ref_point/inputs/rb/cgpm/meetings-fr/meeting-27.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-en/meeting-1.yml b/src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-1.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-en/meeting-1.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-1.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-en/meeting-10.yml b/src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-10.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-en/meeting-10.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-10.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-en/meeting-100-1.yml b/src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-100-1.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-en/meeting-100-1.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-100-1.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-en/meeting-100-2.yml b/src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-100-2.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-en/meeting-100-2.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-100-2.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-en/meeting-101-1.yml b/src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-101-1.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-en/meeting-101-1.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-101-1.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-en/meeting-101-2.yml b/src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-101-2.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-en/meeting-101-2.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-101-2.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-en/meeting-102-1.yml b/src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-102-1.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-en/meeting-102-1.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-102-1.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-en/meeting-102-2.yml b/src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-102-2.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-en/meeting-102-2.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-102-2.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-en/meeting-103-1.yml b/src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-103-1.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-en/meeting-103-1.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-103-1.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-en/meeting-103-2.yml b/src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-103-2.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-en/meeting-103-2.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-103-2.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-en/meeting-104-1.yml b/src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-104-1.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-en/meeting-104-1.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-104-1.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-en/meeting-104-2.yml b/src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-104-2.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-en/meeting-104-2.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-104-2.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-en/meeting-105.yml b/src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-105.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-en/meeting-105.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-105.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-en/meeting-106.yml b/src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-106.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-en/meeting-106.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-106.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-en/meeting-107.yml b/src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-107.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-en/meeting-107.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-107.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-en/meeting-108-1.yml b/src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-108-1.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-en/meeting-108-1.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-108-1.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-en/meeting-108-2.yml b/src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-108-2.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-en/meeting-108-2.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-108-2.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-en/meeting-109.yml b/src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-109.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-en/meeting-109.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-109.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-en/meeting-11.yml b/src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-11.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-en/meeting-11.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-11.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-en/meeting-110-1.yml b/src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-110-1.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-en/meeting-110-1.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-110-1.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-en/meeting-110-2.yml b/src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-110-2.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-en/meeting-110-2.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-110-2.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-en/meeting-111-1.yml b/src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-111-1.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-en/meeting-111-1.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-111-1.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-en/meeting-111-2.yml b/src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-111-2.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-en/meeting-111-2.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-111-2.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-en/meeting-112-1.yml b/src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-112-1.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-en/meeting-112-1.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-112-1.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-en/meeting-112-2.yml b/src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-112-2.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-en/meeting-112-2.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-112-2.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-en/meeting-112-3.yml b/src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-112-3.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-en/meeting-112-3.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-112-3.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-en/meeting-12.yml b/src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-12.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-en/meeting-12.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-12.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-en/meeting-13.yml b/src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-13.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-en/meeting-13.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-13.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-en/meeting-14.yml b/src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-14.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-en/meeting-14.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-14.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-en/meeting-15.yml b/src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-15.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-en/meeting-15.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-15.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-en/meeting-16.yml b/src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-16.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-en/meeting-16.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-16.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-en/meeting-17.yml b/src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-17.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-en/meeting-17.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-17.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-en/meeting-18.yml b/src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-18.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-en/meeting-18.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-18.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-en/meeting-19.yml b/src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-19.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-en/meeting-19.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-19.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-en/meeting-2.yml b/src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-2.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-en/meeting-2.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-2.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-en/meeting-20.yml b/src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-20.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-en/meeting-20.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-20.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-en/meeting-21.yml b/src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-21.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-en/meeting-21.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-21.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-en/meeting-22.yml b/src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-22.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-en/meeting-22.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-22.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-en/meeting-23.yml b/src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-23.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-en/meeting-23.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-23.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-en/meeting-24.yml b/src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-24.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-en/meeting-24.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-24.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-en/meeting-25.yml b/src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-25.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-en/meeting-25.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-25.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-en/meeting-26.yml b/src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-26.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-en/meeting-26.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-26.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-en/meeting-27.yml b/src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-27.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-en/meeting-27.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-27.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-en/meeting-28.yml b/src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-28.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-en/meeting-28.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-28.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-en/meeting-29.yml b/src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-29.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-en/meeting-29.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-29.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-en/meeting-3.yml b/src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-3.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-en/meeting-3.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-3.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-en/meeting-30.yml b/src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-30.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-en/meeting-30.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-30.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-en/meeting-31.yml b/src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-31.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-en/meeting-31.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-31.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-en/meeting-32.yml b/src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-32.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-en/meeting-32.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-32.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-en/meeting-33.yml b/src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-33.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-en/meeting-33.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-33.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-en/meeting-34.yml b/src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-34.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-en/meeting-34.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-34.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-en/meeting-35.yml b/src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-35.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-en/meeting-35.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-35.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-en/meeting-36.yml b/src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-36.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-en/meeting-36.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-36.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-en/meeting-37.yml b/src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-37.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-en/meeting-37.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-37.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-en/meeting-38.yml b/src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-38.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-en/meeting-38.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-38.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-en/meeting-39.yml b/src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-39.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-en/meeting-39.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-39.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-en/meeting-4.yml b/src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-4.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-en/meeting-4.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-4.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-en/meeting-40.yml b/src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-40.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-en/meeting-40.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-40.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-en/meeting-41.yml b/src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-41.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-en/meeting-41.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-41.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-en/meeting-42.yml b/src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-42.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-en/meeting-42.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-42.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-en/meeting-43.yml b/src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-43.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-en/meeting-43.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-43.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-en/meeting-44.yml b/src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-44.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-en/meeting-44.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-44.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-en/meeting-45.yml b/src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-45.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-en/meeting-45.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-45.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-en/meeting-46.yml b/src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-46.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-en/meeting-46.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-46.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-en/meeting-47.yml b/src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-47.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-en/meeting-47.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-47.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-en/meeting-48.yml b/src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-48.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-en/meeting-48.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-48.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-en/meeting-49.yml b/src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-49.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-en/meeting-49.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-49.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-en/meeting-5.yml b/src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-5.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-en/meeting-5.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-5.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-en/meeting-50.yml b/src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-50.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-en/meeting-50.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-50.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-en/meeting-51.yml b/src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-51.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-en/meeting-51.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-51.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-en/meeting-52.yml b/src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-52.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-en/meeting-52.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-52.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-en/meeting-53.yml b/src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-53.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-en/meeting-53.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-53.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-en/meeting-54.yml b/src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-54.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-en/meeting-54.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-54.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-en/meeting-55.yml b/src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-55.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-en/meeting-55.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-55.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-en/meeting-56.yml b/src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-56.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-en/meeting-56.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-56.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-en/meeting-57.yml b/src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-57.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-en/meeting-57.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-57.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-en/meeting-58.yml b/src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-58.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-en/meeting-58.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-58.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-en/meeting-59.yml b/src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-59.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-en/meeting-59.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-59.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-en/meeting-6.yml b/src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-6.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-en/meeting-6.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-6.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-en/meeting-60.yml b/src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-60.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-en/meeting-60.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-60.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-en/meeting-61.yml b/src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-61.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-en/meeting-61.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-61.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-en/meeting-62.yml b/src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-62.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-en/meeting-62.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-62.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-en/meeting-63.yml b/src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-63.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-en/meeting-63.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-63.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-en/meeting-64.yml b/src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-64.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-en/meeting-64.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-64.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-en/meeting-65.yml b/src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-65.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-en/meeting-65.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-65.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-en/meeting-66.yml b/src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-66.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-en/meeting-66.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-66.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-en/meeting-67.yml b/src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-67.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-en/meeting-67.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-67.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-en/meeting-68.yml b/src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-68.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-en/meeting-68.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-68.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-en/meeting-69.yml b/src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-69.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-en/meeting-69.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-69.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-en/meeting-7.yml b/src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-7.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-en/meeting-7.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-7.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-en/meeting-70.yml b/src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-70.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-en/meeting-70.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-70.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-en/meeting-71.yml b/src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-71.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-en/meeting-71.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-71.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-en/meeting-72.yml b/src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-72.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-en/meeting-72.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-72.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-en/meeting-73.yml b/src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-73.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-en/meeting-73.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-73.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-en/meeting-74.yml b/src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-74.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-en/meeting-74.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-74.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-en/meeting-75.yml b/src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-75.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-en/meeting-75.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-75.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-en/meeting-76.yml b/src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-76.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-en/meeting-76.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-76.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-en/meeting-77.yml b/src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-77.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-en/meeting-77.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-77.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-en/meeting-78.yml b/src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-78.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-en/meeting-78.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-78.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-en/meeting-79.yml b/src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-79.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-en/meeting-79.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-79.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-en/meeting-8.yml b/src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-8.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-en/meeting-8.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-8.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-en/meeting-80.yml b/src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-80.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-en/meeting-80.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-80.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-en/meeting-81.yml b/src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-81.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-en/meeting-81.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-81.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-en/meeting-82.yml b/src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-82.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-en/meeting-82.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-82.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-en/meeting-83.yml b/src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-83.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-en/meeting-83.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-83.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-en/meeting-84.yml b/src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-84.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-en/meeting-84.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-84.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-en/meeting-85.yml b/src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-85.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-en/meeting-85.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-85.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-en/meeting-86.yml b/src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-86.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-en/meeting-86.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-86.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-en/meeting-87.yml b/src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-87.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-en/meeting-87.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-87.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-en/meeting-88.yml b/src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-88.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-en/meeting-88.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-88.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-en/meeting-89.yml b/src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-89.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-en/meeting-89.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-89.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-en/meeting-9.yml b/src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-9.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-en/meeting-9.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-9.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-en/meeting-90.yml b/src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-90.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-en/meeting-90.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-90.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-en/meeting-91.yml b/src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-91.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-en/meeting-91.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-91.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-en/meeting-92.yml b/src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-92.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-en/meeting-92.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-92.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-en/meeting-93.yml b/src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-93.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-en/meeting-93.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-93.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-en/meeting-94.yml b/src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-94.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-en/meeting-94.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-94.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-en/meeting-95.yml b/src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-95.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-en/meeting-95.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-95.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-en/meeting-96.yml b/src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-96.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-en/meeting-96.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-96.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-en/meeting-97.yml b/src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-97.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-en/meeting-97.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-97.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-en/meeting-98.yml b/src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-98.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-en/meeting-98.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-98.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-en/meeting-99.yml b/src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-99.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-en/meeting-99.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-en/meeting-99.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-1.yml b/src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-1.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-1.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-1.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-10.yml b/src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-10.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-10.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-10.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-100-1.yml b/src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-100-1.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-100-1.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-100-1.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-100-2.yml b/src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-100-2.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-100-2.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-100-2.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-101-1.yml b/src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-101-1.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-101-1.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-101-1.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-101-2.yml b/src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-101-2.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-101-2.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-101-2.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-102-1.yml b/src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-102-1.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-102-1.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-102-1.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-102-2.yml b/src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-102-2.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-102-2.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-102-2.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-103-1.yml b/src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-103-1.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-103-1.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-103-1.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-103-2.yml b/src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-103-2.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-103-2.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-103-2.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-104-1.yml b/src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-104-1.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-104-1.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-104-1.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-104-2.yml b/src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-104-2.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-104-2.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-104-2.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-105.yml b/src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-105.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-105.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-105.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-106.yml b/src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-106.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-106.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-106.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-107.yml b/src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-107.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-107.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-107.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-108-1.yml b/src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-108-1.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-108-1.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-108-1.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-108-2.yml b/src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-108-2.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-108-2.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-108-2.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-109.yml b/src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-109.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-109.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-109.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-11.yml b/src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-11.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-11.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-11.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-110-1.yml b/src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-110-1.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-110-1.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-110-1.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-110-2.yml b/src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-110-2.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-110-2.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-110-2.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-111-1.yml b/src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-111-1.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-111-1.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-111-1.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-111-2.yml b/src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-111-2.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-111-2.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-111-2.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-112-1.yml b/src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-112-1.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-112-1.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-112-1.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-112-2.yml b/src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-112-2.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-112-2.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-112-2.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-112-3.yml b/src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-112-3.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-112-3.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-112-3.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-12.yml b/src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-12.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-12.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-12.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-13.yml b/src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-13.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-13.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-13.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-14.yml b/src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-14.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-14.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-14.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-15.yml b/src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-15.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-15.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-15.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-16.yml b/src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-16.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-16.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-16.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-17.yml b/src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-17.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-17.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-17.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-18.yml b/src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-18.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-18.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-18.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-19.yml b/src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-19.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-19.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-19.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-2.yml b/src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-2.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-2.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-2.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-20.yml b/src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-20.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-20.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-20.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-21.yml b/src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-21.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-21.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-21.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-22.yml b/src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-22.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-22.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-22.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-23.yml b/src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-23.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-23.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-23.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-24.yml b/src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-24.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-24.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-24.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-25.yml b/src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-25.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-25.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-25.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-26.yml b/src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-26.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-26.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-26.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-27.yml b/src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-27.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-27.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-27.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-28.yml b/src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-28.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-28.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-28.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-29.yml b/src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-29.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-29.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-29.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-3.yml b/src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-3.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-3.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-3.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-30.yml b/src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-30.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-30.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-30.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-31.yml b/src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-31.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-31.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-31.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-32.yml b/src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-32.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-32.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-32.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-33.yml b/src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-33.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-33.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-33.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-34.yml b/src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-34.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-34.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-34.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-35.yml b/src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-35.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-35.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-35.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-36.yml b/src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-36.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-36.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-36.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-37.yml b/src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-37.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-37.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-37.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-38.yml b/src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-38.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-38.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-38.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-39.yml b/src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-39.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-39.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-39.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-4.yml b/src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-4.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-4.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-4.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-40.yml b/src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-40.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-40.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-40.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-41.yml b/src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-41.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-41.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-41.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-42.yml b/src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-42.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-42.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-42.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-43.yml b/src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-43.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-43.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-43.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-44.yml b/src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-44.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-44.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-44.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-45.yml b/src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-45.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-45.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-45.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-46.yml b/src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-46.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-46.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-46.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-47.yml b/src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-47.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-47.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-47.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-48.yml b/src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-48.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-48.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-48.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-49.yml b/src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-49.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-49.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-49.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-5.yml b/src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-5.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-5.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-5.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-50.yml b/src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-50.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-50.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-50.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-51.yml b/src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-51.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-51.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-51.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-52.yml b/src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-52.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-52.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-52.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-53.yml b/src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-53.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-53.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-53.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-54.yml b/src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-54.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-54.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-54.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-55.yml b/src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-55.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-55.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-55.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-56.yml b/src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-56.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-56.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-56.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-57.yml b/src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-57.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-57.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-57.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-58.yml b/src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-58.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-58.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-58.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-59.yml b/src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-59.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-59.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-59.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-6.yml b/src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-6.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-6.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-6.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-60.yml b/src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-60.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-60.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-60.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-61.yml b/src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-61.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-61.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-61.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-62.yml b/src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-62.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-62.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-62.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-63.yml b/src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-63.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-63.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-63.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-64.yml b/src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-64.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-64.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-64.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-65.yml b/src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-65.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-65.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-65.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-66.yml b/src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-66.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-66.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-66.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-67.yml b/src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-67.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-67.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-67.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-68.yml b/src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-68.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-68.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-68.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-69.yml b/src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-69.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-69.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-69.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-7.yml b/src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-7.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-7.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-7.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-70.yml b/src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-70.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-70.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-70.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-71.yml b/src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-71.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-71.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-71.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-72.yml b/src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-72.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-72.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-72.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-73.yml b/src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-73.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-73.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-73.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-74.yml b/src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-74.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-74.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-74.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-75.yml b/src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-75.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-75.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-75.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-76.yml b/src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-76.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-76.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-76.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-77.yml b/src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-77.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-77.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-77.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-78.yml b/src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-78.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-78.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-78.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-79.yml b/src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-79.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-79.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-79.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-8.yml b/src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-8.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-8.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-8.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-80.yml b/src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-80.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-80.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-80.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-81.yml b/src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-81.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-81.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-81.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-82.yml b/src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-82.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-82.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-82.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-83.yml b/src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-83.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-83.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-83.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-84.yml b/src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-84.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-84.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-84.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-85.yml b/src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-85.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-85.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-85.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-86.yml b/src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-86.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-86.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-86.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-87.yml b/src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-87.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-87.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-87.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-88.yml b/src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-88.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-88.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-88.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-89.yml b/src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-89.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-89.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-89.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-9.yml b/src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-9.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-9.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-9.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-90.yml b/src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-90.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-90.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-90.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-91.yml b/src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-91.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-91.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-91.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-92.yml b/src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-92.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-92.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-92.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-93.yml b/src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-93.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-93.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-93.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-94.yml b/src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-94.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-94.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-94.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-95.yml b/src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-95.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-95.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-95.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-96.yml b/src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-96.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-96.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-96.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-97.yml b/src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-97.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-97.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-97.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-98.yml b/src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-98.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-98.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-98.yml diff --git a/src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-99.yml b/src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-99.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/meetings-fr/meeting-99.yml rename to src/si_ref_point/inputs/rb/cipm/meetings-fr/meeting-99.yml diff --git a/src/si_ref_point/resbod_data/cipm/publications-en.yml b/src/si_ref_point/inputs/rb/cipm/publications-en.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/publications-en.yml rename to src/si_ref_point/inputs/rb/cipm/publications-en.yml diff --git a/src/si_ref_point/resbod_data/cipm/publications-fr.yml b/src/si_ref_point/inputs/rb/cipm/publications-fr.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/publications-fr.yml rename to src/si_ref_point/inputs/rb/cipm/publications-fr.yml diff --git a/src/si_ref_point/resbod_data/cipm/workgroups/cipm-tg-dig/meetings-en/meeting-2023-04-19.yml b/src/si_ref_point/inputs/rb/cipm/workgroups/cipm-tg-dig/meetings-en/meeting-2023-04-19.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/workgroups/cipm-tg-dig/meetings-en/meeting-2023-04-19.yml rename to src/si_ref_point/inputs/rb/cipm/workgroups/cipm-tg-dig/meetings-en/meeting-2023-04-19.yml diff --git a/src/si_ref_point/resbod_data/cipm/workgroups/cipm-tg-dig/meetings-en/meeting-2023-05-22.yml b/src/si_ref_point/inputs/rb/cipm/workgroups/cipm-tg-dig/meetings-en/meeting-2023-05-22.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/workgroups/cipm-tg-dig/meetings-en/meeting-2023-05-22.yml rename to src/si_ref_point/inputs/rb/cipm/workgroups/cipm-tg-dig/meetings-en/meeting-2023-05-22.yml diff --git a/src/si_ref_point/resbod_data/cipm/workgroups/cipm-tg-dig/meetings-en/meeting-2023-05-24.yml b/src/si_ref_point/inputs/rb/cipm/workgroups/cipm-tg-dig/meetings-en/meeting-2023-05-24.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/workgroups/cipm-tg-dig/meetings-en/meeting-2023-05-24.yml rename to src/si_ref_point/inputs/rb/cipm/workgroups/cipm-tg-dig/meetings-en/meeting-2023-05-24.yml diff --git a/src/si_ref_point/resbod_data/cipm/workgroups/cipm-tg-dig/meetings-en/meeting-2023-09-19.yml b/src/si_ref_point/inputs/rb/cipm/workgroups/cipm-tg-dig/meetings-en/meeting-2023-09-19.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/workgroups/cipm-tg-dig/meetings-en/meeting-2023-09-19.yml rename to src/si_ref_point/inputs/rb/cipm/workgroups/cipm-tg-dig/meetings-en/meeting-2023-09-19.yml diff --git a/src/si_ref_point/resbod_data/cipm/workgroups/cipm-tg-dig/meetings-fr/meeting-2023-04-19.yml b/src/si_ref_point/inputs/rb/cipm/workgroups/cipm-tg-dig/meetings-fr/meeting-2023-04-19.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/workgroups/cipm-tg-dig/meetings-fr/meeting-2023-04-19.yml rename to src/si_ref_point/inputs/rb/cipm/workgroups/cipm-tg-dig/meetings-fr/meeting-2023-04-19.yml diff --git a/src/si_ref_point/resbod_data/cipm/workgroups/cipm-tg-dig/meetings-fr/meeting-2023-05-22.yml b/src/si_ref_point/inputs/rb/cipm/workgroups/cipm-tg-dig/meetings-fr/meeting-2023-05-22.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/workgroups/cipm-tg-dig/meetings-fr/meeting-2023-05-22.yml rename to src/si_ref_point/inputs/rb/cipm/workgroups/cipm-tg-dig/meetings-fr/meeting-2023-05-22.yml diff --git a/src/si_ref_point/resbod_data/cipm/workgroups/cipm-tg-dig/meetings-fr/meeting-2023-05-24.yml b/src/si_ref_point/inputs/rb/cipm/workgroups/cipm-tg-dig/meetings-fr/meeting-2023-05-24.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/workgroups/cipm-tg-dig/meetings-fr/meeting-2023-05-24.yml rename to src/si_ref_point/inputs/rb/cipm/workgroups/cipm-tg-dig/meetings-fr/meeting-2023-05-24.yml diff --git a/src/si_ref_point/resbod_data/cipm/workgroups/cipm-tg-dig/meetings-fr/meeting-2023-09-19.yml b/src/si_ref_point/inputs/rb/cipm/workgroups/cipm-tg-dig/meetings-fr/meeting-2023-09-19.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/workgroups/cipm-tg-dig/meetings-fr/meeting-2023-09-19.yml rename to src/si_ref_point/inputs/rb/cipm/workgroups/cipm-tg-dig/meetings-fr/meeting-2023-09-19.yml diff --git a/src/si_ref_point/resbod_data/cipm/workgroups/cipm-wg-employment/meetings-en/meeting-2019-06-18.yml b/src/si_ref_point/inputs/rb/cipm/workgroups/cipm-wg-employment/meetings-en/meeting-2019-06-18.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/workgroups/cipm-wg-employment/meetings-en/meeting-2019-06-18.yml rename to src/si_ref_point/inputs/rb/cipm/workgroups/cipm-wg-employment/meetings-en/meeting-2019-06-18.yml diff --git a/src/si_ref_point/resbod_data/cipm/workgroups/cipm-wg-employment/meetings-en/meeting-2020-10-07.yml b/src/si_ref_point/inputs/rb/cipm/workgroups/cipm-wg-employment/meetings-en/meeting-2020-10-07.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/workgroups/cipm-wg-employment/meetings-en/meeting-2020-10-07.yml rename to src/si_ref_point/inputs/rb/cipm/workgroups/cipm-wg-employment/meetings-en/meeting-2020-10-07.yml diff --git a/src/si_ref_point/resbod_data/cipm/workgroups/cipm-wg-employment/meetings-fr/meeting-2019-06-18.yml b/src/si_ref_point/inputs/rb/cipm/workgroups/cipm-wg-employment/meetings-fr/meeting-2019-06-18.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/workgroups/cipm-wg-employment/meetings-fr/meeting-2019-06-18.yml rename to src/si_ref_point/inputs/rb/cipm/workgroups/cipm-wg-employment/meetings-fr/meeting-2019-06-18.yml diff --git a/src/si_ref_point/resbod_data/cipm/workgroups/cipm-wg-employment/meetings-fr/meeting-2020-10-07.yml b/src/si_ref_point/inputs/rb/cipm/workgroups/cipm-wg-employment/meetings-fr/meeting-2020-10-07.yml similarity index 100% rename from src/si_ref_point/resbod_data/cipm/workgroups/cipm-wg-employment/meetings-fr/meeting-2020-10-07.yml rename to src/si_ref_point/inputs/rb/cipm/workgroups/cipm-wg-employment/meetings-fr/meeting-2020-10-07.yml diff --git a/src/si_ref_point/cuq_data/base_units_defs.yaml b/src/si_ref_point/inputs/si/base_units_defs.yaml similarity index 100% rename from src/si_ref_point/cuq_data/base_units_defs.yaml rename to src/si_ref_point/inputs/si/base_units_defs.yaml diff --git a/src/si_ref_point/cuq_data/decisions.yaml b/src/si_ref_point/inputs/si/decisions.yaml similarity index 100% rename from src/si_ref_point/cuq_data/decisions.yaml rename to src/si_ref_point/inputs/si/decisions.yaml diff --git a/src/si_ref_point/cuq_data/def_collectors.yaml b/src/si_ref_point/inputs/si/def_collectors.yaml similarity index 100% rename from src/si_ref_point/cuq_data/def_collectors.yaml rename to src/si_ref_point/inputs/si/def_collectors.yaml diff --git a/src/si_ref_point/cuq_data/non_si_units.yaml b/src/si_ref_point/inputs/si/non_si_units.yaml similarity index 100% rename from src/si_ref_point/cuq_data/non_si_units.yaml rename to src/si_ref_point/inputs/si/non_si_units.yaml diff --git a/src/si_ref_point/cuq_data/notes.yaml b/src/si_ref_point/inputs/si/notes.yaml similarity index 100% rename from src/si_ref_point/cuq_data/notes.yaml rename to src/si_ref_point/inputs/si/notes.yaml diff --git a/src/si_ref_point/cuq_data/prefixes.yaml b/src/si_ref_point/inputs/si/prefixes.yaml similarity index 100% rename from src/si_ref_point/cuq_data/prefixes.yaml rename to src/si_ref_point/inputs/si/prefixes.yaml diff --git a/src/si_ref_point/cuq_data/quantities_core.yaml b/src/si_ref_point/inputs/si/quantities_core.yaml similarity index 100% rename from src/si_ref_point/cuq_data/quantities_core.yaml rename to src/si_ref_point/inputs/si/quantities_core.yaml diff --git a/src/si_ref_point/cuq_data/quantities_other.yaml b/src/si_ref_point/inputs/si/quantities_other.yaml similarity index 100% rename from src/si_ref_point/cuq_data/quantities_other.yaml rename to src/si_ref_point/inputs/si/quantities_other.yaml diff --git a/src/si_ref_point/cuq_data/si_constants.yaml b/src/si_ref_point/inputs/si/si_constants.yaml similarity index 100% rename from src/si_ref_point/cuq_data/si_constants.yaml rename to src/si_ref_point/inputs/si/si_constants.yaml diff --git a/src/si_ref_point/cuq_data/CUQ_core_concepts.ttl b/src/si_ref_point/inputs/si/si_core_concepts.ttl similarity index 100% rename from src/si_ref_point/cuq_data/CUQ_core_concepts.ttl rename to src/si_ref_point/inputs/si/si_core_concepts.ttl diff --git a/src/si_ref_point/cuq_data/CUQ_extended_concepts.ttl b/src/si_ref_point/inputs/si/si_extended_concepts.ttl similarity index 100% rename from src/si_ref_point/cuq_data/CUQ_extended_concepts.ttl rename to src/si_ref_point/inputs/si/si_extended_concepts.ttl diff --git a/src/si_ref_point/cuq_data/si_units_special_names.yaml b/src/si_ref_point/inputs/si/si_units_special_names.yaml similarity index 100% rename from src/si_ref_point/cuq_data/si_units_special_names.yaml rename to src/si_ref_point/inputs/si/si_units_special_names.yaml diff --git a/src/si_ref_point/cuq_data/symbols.yaml b/src/si_ref_point/inputs/si/symbols.yaml similarity index 100% rename from src/si_ref_point/cuq_data/symbols.yaml rename to src/si_ref_point/inputs/si/symbols.yaml diff --git a/src/si_ref_point/main.py b/src/si_ref_point/main.py index 01a5d62..57a98e3 100644 --- a/src/si_ref_point/main.py +++ b/src/si_ref_point/main.py @@ -1,27 +1,24 @@ -""" Generate the SI reference point TTL files -""" +""" Generate the SI reference point TTL/JSON-LD files """ import argparse import logging import hashlib -#import si_ref_point.cuq.cuq_tbox as cuq_tbox # as example if the package is installed -import si_ref_point.cuq.cuq_tbox as cuq_tbox -import si_ref_point.cuq.quantities_abox as quantities_abox -import si_ref_point.cuq.units_abox as units_abox -import si_ref_point.cuq.constants_abox as constants_abox -import si_ref_point.cuq.prefixes_abox as prefixes_abox -import si_ref_point.cuq.decisions_abox as decisions_abox -import si_ref_point.resbod.ResBod_TBox as ResBod_TBox -import si_ref_point.resbod.ResBod_ABox_CGPM as ResBod_ABox_CGPM -import si_ref_point.resbod.ResBod_ABox_CIPM as ResBod_ABox_CIPM -import si_ref_point.resbod.ResBod_ABox_CCTF as ResBod_ABox_CCTF -from si_ref_point.settings import TTL_FILES_FOLDER, JSONLD_FILES_FOLDER -#from si_ref_point import __version__ +import si_ref_point.tboxes.si_tbox as cuq_tbox +import si_ref_point.aboxes.quantities_abox as quantities_abox +import si_ref_point.aboxes.units_abox as units_abox +import si_ref_point.aboxes.constants_abox as constants_abox +import si_ref_point.aboxes.prefixes_abox as prefixes_abox +import si_ref_point.aboxes.decisions_abox as decisions_abox +import si_ref_point.tboxes.rb_tbox as rb_tbox +import si_ref_point.aboxes.rb_abox_cgpm as rb_abox_cgpm +import si_ref_point.aboxes.rb_abox_cipm as rb_abox_cipm +import si_ref_point.aboxes.rb_abox_cctf as rb_abox_cctf +from si_ref_point.settings import PKG_ROOT import git import os import datetime +from pathlib import Path from zipfile import ZipFile -import subprocess def get_parser(): @@ -49,19 +46,23 @@ def get_parser(): '--generate_RDF', action='store_true', help='Generate (single) RDF output') parser.add_argument( - '-o', '--output_dir', + '-o', '--output_dir', type=Path, + default=".", + help="Output directory. Defaults to current working directory") + parser.add_argument( + '--ttl_output_subdir', type=str, - default=TTL_FILES_FOLDER, - help="Output directory for TTL output") + default="TTL", + help="Optional output subdirectory for TTL output") parser.add_argument( - '--jsonld_output_dir', + '--jsonld_output_subdir', type=str, - default=JSONLD_FILES_FOLDER, - help="Output directory for JSON-LD output") + default="JSONLD", + help="Optional output directory for JSON-LD output") return parser -def main(): +def main(force_output_dir_to=None): args = get_parser().parse_args() if args.debug: logging.basicConfig(level=logging.DEBUG) @@ -75,10 +76,10 @@ def main(): 'constants': constants_abox.main, 'prefixes': prefixes_abox.main, 'decisions': decisions_abox.main, - 'bodies': ResBod_TBox.main, - 'cgpm': ResBod_ABox_CGPM.main, - 'cipm': ResBod_ABox_CIPM.main, - 'cctf': ResBod_ABox_CCTF.main, + 'bodies': rb_tbox.main, + 'cgpm': rb_abox_cgpm.main, + 'cipm': rb_abox_cipm.main, + 'cctf': rb_abox_cctf.main, } output = {} for label, generator in file_generator.items(): @@ -89,11 +90,17 @@ def main(): output[label] = generator() logging.info("..done") + if force_output_dir_to: + ttl_dir = jsonld_dir = force_output_dir_to + else: + ttl_dir = args.output_dir / args.ttl_output_subdir + jsonld_dir = args.output_dir / args.jsonld_output_subdir + serializations = [{"fmt": "ttl", - "dir": args.output_dir, + "dir": ttl_dir, "ext": "ttl"}, {"fmt": "json-ld", - "dir": args.jsonld_output_dir, + "dir": jsonld_dir, "ext": "jsonld"}] # Serialize all graphs in their respective output files @@ -101,7 +108,7 @@ def main(): if not os.path.exists(srl['dir']): os.makedirs(srl['dir']) for label, graph in output.items(): - filedest = os.path.join(srl['dir'],label + '.' + srl['ext']) + filedest = os.path.join(srl['dir'], label + '.' + srl['ext']) graph.serialize(format=srl['fmt'], destination=filedest) # generate hash for file and write it alongside @@ -113,7 +120,7 @@ def main(): with open(hashdest, 'w') as fp: fp.write(hashstr) - logging.info(f"TTL files wrote in {args.output_dir}") + logging.info(f"TTL and JSON-LD files written to ./{ttl_dir}/ and ./{jsonld_dir}/, respectively") if args.generate_RDF: output['si'].serialize( format='xml', @@ -130,7 +137,7 @@ def main(): try: # Replaced to work in the tests # githash = subprocess.check_output(["git", "describe"]).strip().decode() - repo = git.Repo(search_parent_directories=True) + repo = git.Repo(PKG_ROOT, search_parent_directories=True) githash = repo.head.object.hexsha[:8] except: # noqa githash = "nohash" @@ -147,7 +154,7 @@ def main(): zf.write(os.path.join(srl['dir'], hash_file), arcname=os.path.join(srl['fmt'].upper(), hash_file)) - # Generate ontology documentation markdown files + # Generate ontology documentation Markdown files if args.gen_ontology_viz: import ontospy from ontospy.gendocs.viz.viz_markdown import MarkdownViz diff --git a/src/si_ref_point/settings.py b/src/si_ref_point/settings.py index 327bbbd..150961e 100644 --- a/src/si_ref_point/settings.py +++ b/src/si_ref_point/settings.py @@ -1,41 +1,43 @@ """ -seetings.py -Global constants etc +source 'settings.py' +global constants etc. """ -import os -import pathlib -package_dir = pathlib.Path(__file__).parent.resolve() + +from pathlib import Path + + +PKG_ROOT = Path(__file__).resolve().parent SKOSURL = "http://www.w3.org/2004/02/skos/core#" DCTURL = "http://purl.org/dc/terms#" -SIDFWBASE = "https://si-digital-framework.org" # Base URL for the SI Digital Framework - # from this URL, sub-URLs are defined - # - (SIDFWBASE)/SI# - # - (SIDFWBASE)/constants# - # - (SIDFWBASE)/bodies# +SIDFWBASE = "https://si-digital-framework.org" + +# Base URL for the SI Digital Framework +# from this URL, sub-URLs are defined +# - (SIDFWBASE)/SI# +# - (SIDFWBASE)/constants# +# - (SIDFWBASE)/bodies# # Locations of input and output files # Folder for files of cgpm + cipm resolutions -CGPM_FILES_FOLDER = os.path.join(package_dir, "resbod_data", "cgpm") -CIPM_FILES_FOLDER = os.path.join(package_dir, "resbod_data", "cipm") -CCTF_FILES_FOLDER = os.path.join(package_dir, "resbod_data", "cctf") +CGPM_FILES_FOLDER = PKG_ROOT / "inputs" / "rb" / "cgpm" +CIPM_FILES_FOLDER = PKG_ROOT / "inputs" / "rb" / "cipm" +CCTF_FILES_FOLDER = PKG_ROOT / "inputs" / "rb" / "cctf" # Folder for YAML- and TTL-files produced manually -CUQ_FILES_FOLDER = os.path.join(package_dir, "cuq_data") +SI_FILES_FOLDER = PKG_ROOT / "inputs" / "si" # Default Folder for output files -# per default, the output will be placed in the directory -# from which the script is launched -TTL_FILES_FOLDER = os.path.join(".","TTL") -JSONLD_FILES_FOLDER = os.path.join(".","JSON-LD") +# Deprecated : per default, the output will be placed in the directory +# from which the script is launched +# TTL_FILES_FOLDER = TTLPATH +# JSONLD_FILES_FOLDER = JLDPATH GITHUB_BASE_PATH = "https://github.com/TheBIPM/SI-Reference-Point-2023/" - - -#SI_BROCHURE_PID="SI_Brochure_ed3_V3_01" # will be transformed into a PID '(SIDFWBASE)/SI/entities/(SI_BROCHURE_PID)' +# SI_BROCHURE_PID="SI_Brochure_ed3_V3_01" # will be transformed into a PID '(SIDFWBASE)/SI/entities/(SI_BROCHURE_PID)' # Licences CC_LICENCE = "https://creativecommons.org/licenses/by/3.0/igo/" @@ -55,10 +57,10 @@ le matériel par tous moyens et sous tous formats) et adapter (remixer, transformer et créer à partir du matériel) pour toute utilisation, y compris commerciale. L'Offrant ne peut retirer les autorisations concédées par la licence tant que -vous appliquez les termes de cette licence. Vous devez créditer l'oeuvre -(en utilisant l'IRI de l'ontologie originale pour l'ontologie entière -et les IRIs originaux des termes individuels), intégrer un lien vers la licence +vous appliquez les termes de cette licence. Vous devez créditer l'oeuvre +(en utilisant l'IRI de l'ontologie originale pour l'ontologie entière +et les IRIs originaux des termes individuels), intégrer un lien vers la licence et indiquer si des modifications ont été effectuées à l'oeuvre. -Vous devez indiquer ces informations par tous les moyens raisonnables, -sans toutefois suggérer que l'offrant vous soutient ou soutient +Vous devez indiquer ces informations par tous les moyens raisonnables, +sans toutefois suggérer que l'offrant vous soutient ou soutient la façon dont vous avez utilisé son Oeuvre.""" diff --git a/src/si_ref_point/tboxes/__init__.py b/src/si_ref_point/tboxes/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/si_ref_point/resbod/ResBod_TBox.py b/src/si_ref_point/tboxes/rb_tbox.py similarity index 99% rename from src/si_ref_point/resbod/ResBod_TBox.py rename to src/si_ref_point/tboxes/rb_tbox.py index 35c4046..17bf6bd 100644 --- a/src/si_ref_point/resbod/ResBod_TBox.py +++ b/src/si_ref_point/tboxes/rb_tbox.py @@ -1,16 +1,11 @@ -""" -ResBod TBox -""" -from datetime import date +""" Responsible Bodies TBox """ +from datetime import date from rdflib import URIRef, RDF, OWL, SKOS, XSD, RDFS, DCTERMS, Graph, Literal from si_ref_point.settings import SIDFWBASE, SKOSURL - - RES_BOD_NS = SIDFWBASE + "/bodies#" - class ResBod: def __init__(self, namespace: str = RES_BOD_NS, prefix: str = 'rb'): self.namespace = namespace diff --git a/src/si_ref_point/cuq/cuq_tbox.py b/src/si_ref_point/tboxes/si_tbox.py similarity index 95% rename from src/si_ref_point/cuq/cuq_tbox.py rename to src/si_ref_point/tboxes/si_tbox.py index f0019bc..ef95401 100644 --- a/src/si_ref_point/cuq/cuq_tbox.py +++ b/src/si_ref_point/tboxes/si_tbox.py @@ -5,11 +5,10 @@ from datetime import datetime, timezone import git import os -import yaml -from rdflib import Graph, OWL,RDF,RDFS,URIRef, Literal, BNode, SKOS, PROV +from rdflib import Graph, OWL, RDF, RDFS, URIRef, Literal, BNode, SKOS, PROV from rdflib.collection import Collection from rdflib.namespace import XSD, DCTERMS -from si_ref_point.settings import CC_LICENCE, CC_LICENCE_TEXT_EN, CC_LICENCE_TEXT_FR, CUQ_FILES_FOLDER, GITHUB_BASE_PATH, SIDFWBASE +from si_ref_point.settings import PKG_ROOT, CC_LICENCE, CC_LICENCE_TEXT_EN, CC_LICENCE_TEXT_FR, SI_FILES_FOLDER, GITHUB_BASE_PATH, SIDFWBASE RES_BOD_NS = SIDFWBASE + "/bodies#" bodies_list = ['cgpm', 'cipm', 'cctf'] @@ -61,9 +60,9 @@ def __init__(self, namespace: str = SIDFWBASE + "/SI#", ns_prefix: str = "si"): self.g.bind("agents",self.namespace_agents) # Load graph from ttl files - for ttl_file in ['CUQ_core_concepts.ttl', - 'CUQ_extended_concepts.ttl']: - self.g.parse(os.path.join(CUQ_FILES_FOLDER, ttl_file), + for ttl_file in ['si_core_concepts.ttl', + 'si_extended_concepts.ttl']: + self.g.parse(os.path.join(SI_FILES_FOLDER, ttl_file), format="ttl") # 2) Add annotations to the ontology @@ -95,13 +94,14 @@ def __init__(self, namespace: str = SIDFWBASE + "/SI#", ns_prefix: str = "si"): uri_timestamp = timestamp.strftime("%Y%m%d%H%M%SZ") # used to identify uniquely the produced TTL file (entity) startedAt_timestamp = timestamp.strftime("%Y-%m-%dT%H:%M:%SZ") # used with the predicate 'startedAtTime' of the corresponding activity - repo = git.Repo(search_parent_directories=True) +### `generate_turtle_files` + repo = git.Repo(PKG_ROOT, search_parent_directories=True) sha = repo.head.object.hexsha # 2.2.1 Agent # declare this code as an 'agent' (in the sense of PROVENANCE) - # and define the URI to a specific version by using its commit on github - agent_sw = GITHUB_BASE_PATH +"blob/"+ sha + "/src/si_ref_point/cuq/cuq_tbox.py" + # and define the URI to a specific version by using its commit on GitHub + agent_sw = GITHUB_BASE_PATH +"blob/"+ sha + "/src/si_ref_point/tboxes/si_tbox.py" self.g.add( (URIRef(agent_sw), RDF.type, @@ -288,6 +288,7 @@ def set_resolution_uri(self, name: str) -> URIRef: for body in bodies_list: if body == bd: return URIRef(self.namespace_bodies[body] + res_id) + return URIRef('') def main(): diff --git a/src/si_ref_point/test_api/Readme.md b/src/si_ref_point/test_api/Readme.md deleted file mode 100644 index 0e42538..0000000 --- a/src/si_ref_point/test_api/Readme.md +++ /dev/null @@ -1,133 +0,0 @@ -API for Semantic SI -=================== -Gregor Dudle, 02.05.2023 - -Quick intro ------------ -The following addresses are implemented (~ stands for the root address, including the port (8000) [localhost:8000/ or digital.extranet.bipm.org] ) - -"~/CGPM" -displays the titles of all CGPMs -- an optional parameter 'Year' aloows to search for a CGPM of a given year. If no CGPM took place the return is empty - -Example: -"~/CGPM?Year=2014" returns the 25th CGPM (which took place in 2014) - -"~/CGPM{Id} -displays the Resolutions of the {Id}th CGPM. - -Example: -"~/CGPM26" returns all Resolutions of the 26th CGPM - -"~/CGPM{Id}/Res{R_Id} -displays Resolution nr. {R_id} of the {Id}th CGPM - -Example: -"~/CGPM26/Res1" returns the 1st Resolution of the 26th CGPM - -"~/page/{keyword}" -dbpedia-like page -displays all predicates and objectifs of the {keyword} - -Example -"~/page/ampere" returns all information regarding ampere -"~/page/nano" returns all informaiton regarding nano - - -"~/Quantities" -displays the kind of quantities (4-lettre-code, corresponding unit and the unit's symbol) -- an optional parameter 'Code' allows to search for a specific kind of quantity -- an optional parameter 'Language' allows to define the language of the response (en or fr) - -Examples: -"~/Quantities" returns the full list of defined kind of quantities -"~/Quantities/?Code=ELRE" returns the kind of quantity having the code "ELRE" - - -"~/SI/BaseUnits/" -displays the current definition of the Base Unit(s) -- an optional parameter 'Symbol' allows to search a specific Definition. If the parameter - 'Symbol' is not used, all definitions are returned -- an optional parameter 'language' allows to select between 'en' and 'fr' - If no language is indicated in the request, en is returned by default - If the parameter language is used with another value, an exception is raised -- an optional parameter 'date' allows to select the definition on a given date (format YYYY-MM-DD) - If no date is indicated, the current date is used - -Examples: -"~/SI/BaseUnits/?Symbol=s" returns the definition of the second in english -"~/SI/BaseUnits/?=fr" returns all definitions of the Base Units -"~/SI/BaseUnits/?Symbol=A&language=fr" returns the definiton of the Ampere in french -"~/SI/BaseUnits/?Symbol=A&date=2000-01-01" returns the definiton of the Ampere on 2000-01-01 - - -"~/SI/Prefixes/" -displays the prefix(es) with their multiplication factor -- an optional parameter 'Symbol' allows to search a specific Prefix -- an optional parameter 'ScalingFactor' allows to search a specific Prefix -- if neither 'Symbol' nor 'ScalingFactor' are defined, all prefixes are returned -- if both 'Symbol' and 'ScalingFactor' are provided, an exception is raised (system overdetermined) - -Examples: -"~/SI/Prefixes/" returns all prefixes with their scaling factor -"~/SI/Prefixes/?Symbol=p" returns the info about pico -"~/SI/Prefixes/?ScalingFactor=1000" return the info about kilo -(some strange behaviour; positive exponents are written without the + sign [e.g. 1e12]; - 0.1, 0.01, 0.001 do not give a correct response) - - -"~/SI/Units" -displays the unit (BaseUnit and SpecialNameUnits) and the Label (specifying the Quantity) -- an optional parameter 'Symbol' allows to search for a specific Unit -- an optional parameter 'Language' allows to define the language of the response (en or fr) - -Examples: -"~/SI/Units" returns all units and their description -"~/SI/Units/?Symbol=F&Language=fr returns the unit farad and its description in French - -Remark on the input files -------------------------- -main.py reads several knowledge graphs, -- 'CGPM.ttl' -- 'Constants.ttl' -- 'Quantitis.ttl' -- 'UntisPrefixes.ttl' -All must be stored in the same directory as 'main.py' - -Remark on the output format ---------------------------- -Previously, I had two APIs, one that return JSON and one that returns HTML(using Jinja2) -The two versions have now been merged to a single one. Before the return statement, the functions check the -header of the call. If the header contains "accept application/json" it returns an array of JSON dictonnary, -otherwise it returns html together with an instruction to use a given template - -Requirements ------------- -Data: -The data is imported from two tt files in the same directory as main.py -Filename Python code to be run to produce the ttl file -........ ................................... -CGPM.ttl CGPM/CGPM_ABox.py -Constants.ttl Constants/Constants_ABox_xlsReader.py -Quantities.ttl Quantities/Quantities_ABox.py -UnitsPrefixes.ttl Units/Units_ABox.py - - -HTML-Templates: -'main.py' uses templates (Jinja2). They must be stored in a folder ./templates/ -template-name used by (web address) -BaseUnitsLayout.html ~/SI/BaseUnits -CstLayout.html ~/Constants -DbpediaLayout.html ~/page/{keyword} -ParentLaout.html (skeleton for all other layouts) -PrefixesLayout.html ~/SI/Prefixes -QtyLayout.html ~/Quantities -UnitLayout.html ~/SI/Units - -Server: -to launch the API service, use 'uvicorn main:app' in the terminal - -Note1: to run this command, you must be in the directory of the 'main.py' app -Note2: to allow other devices on the same LAN to access the Uvicorn server, the command must be complemented with --host=0.0.0.0 (otherwise the ports are not open for devices other than "localhost") - - diff --git a/src/si_ref_point/test_api/api_main.py b/src/si_ref_point/test_api/api_main.py deleted file mode 100644 index 5afc209..0000000 --- a/src/si_ref_point/test_api/api_main.py +++ /dev/null @@ -1,1759 +0,0 @@ -""" Module providing a webservice that runs on the local computer """ -############################################################################# -# -# api_main -# -# Starts a API service on the local host -# to launch the service, use the wrapper launch_api.py -# -# This app returns html pages (using Jinja2Templates) -# -# Based on a tutorial found at: http://www.youtube.com/watch?v=SORiTsvnU28 -# -# To start the API server manually, use: uvicorn main:app --host=0.0.0.0 -# (the --host=0.0.0.0 ensures that the server can be reached from the same network) -# -# G. Dudle/ 16.02.2023 -# -# -from typing import List -from pathlib import Path -from datetime import date, datetime -import os -from rdflib import Graph - -from fastapi import FastAPI, APIRouter, HTTPException, Request # , Header, Query -from fastapi.templating import Jinja2Templates -from fastapi.staticfiles import StaticFiles -from fastapi.responses import RedirectResponse -from si_ref_point.settings import TTL_FILES_FOLDER,JSONLD_FILES_FOLDER,SIDFWBASE - -# To add a SPARQL endpoint to the FastAPI app -from fastapi import Request -from rdflib.plugins.sparql import prepareQuery - -BASE_PATH = os.path.dirname(os.path.realpath(__file__)) -TEMPLATES = Jinja2Templates(directory=os.path.join(BASE_PATH, "templates")) - -app = FastAPI(title="API Semantic SI", openapi_url="/openapi.json") - -app.mount("/static", StaticFiles(directory=Path(BASE_PATH, 'static')), name="static") - -api_router = APIRouter() - -# ---------------------------------------------------------------------------------------- -# setup section -# -# load ttl files into knowledge graph -g = Graph() -g.parse(os.path.join(TTL_FILES_FOLDER, 'units.ttl')) -g.parse(os.path.join(TTL_FILES_FOLDER, 'prefixes.ttl')) -g.parse(os.path.join(TTL_FILES_FOLDER, 'quantities.ttl')) -g.parse(os.path.join(TTL_FILES_FOLDER, 'constants.ttl')) -g.parse(os.path.join(TTL_FILES_FOLDER, 'cgpm.ttl')) - -# reasoner (used e.g. to infer "?Conf CGPM:adopted ?Res" is equivalent to "?Res CGPM:wasAdoptedBy ?Conf") -# owlrl.DeductiveClosure(owlrl.OWLRL_Semantics).expand(g) - -# list of the possible parameters of the API call -param_list_cgpms = ["lang"] -param_list_base_unit_grps = ["lang"] -param_list_base_units = ["lang", "datestr"] -param_list_named_units = ["lang"] -param_list_named_unit = ["lang"] -param_list_prefixes = ["lang"] -param_list_quantities = ["lang"] -param_list_constants = ["name", "lang"] -param_list_lang = ['en', 'fr'] - -# produce dictionaries of symbol:units / symobol:prefix_name / symbol:prefix_scaling -# unit_list_dict -UNITS_QUERY = """ - PREFIX si: <"""+SIDFWBASE+"""/SI#> - SELECT ?Unit ?Symbol - WHERE - { - {?Unit a si:SISpecialNamedUnit } - UNION - {?Unit a si:SIBaseUnit } - UNION - {?Unit a si:nonSIUnit} - ?Unit si:hasSymbol ?Symbol - } - """ - - -# run SPARQL query for units -unitlist = g.query(UNITS_QUERY) -unit_list_dict = dict() - -for unit in unitlist: - unit_list_dict[str(unit['Symbol'])] = unit['Unit'] - -# prefix_list_dict / scaling_list_dict -FIX_QUERY = """ - PREFIX si: <"""+SIDFWBASE+"""/SI#> - PREFIX skos: - SELECT ?Prefix ?PrefixLabel ?Symbol ?ScalingFactor - WHERE - { - ?Prefix a si:SIPrefix ; - skos:prefLabel ?PrefixLabel ; - si:hasScalingFactor ?ScalingFactor ; - si:hasSymbol ?Symbol - } - """ - -# run SPARQL query for prefixes -fixlist = g.query(FIX_QUERY) -prefix_list_dict = dict() -scaling_list_dict = dict() - -for f in fixlist: - prefix_list_dict[str(f['Symbol'])] = f['Prefix'] - scaling_list_dict[str(f['Symbol'])] = f['ScalingFactor'] - -# define the endpoint urls for the different sections of data -# base URL were the API should be reached -BASEURL = "http://localhost:5000" -SIURL = BASEURL + '/SI' -QUANTSURL = BASEURL + '/quantities/' -UNITSURL = BASEURL + '/SI/units/' -CONSURL = BASEURL + '/constants' -FIXESURL = BASEURL + '/SI/prefixes/' -XSDURL = 'http://www.w3.org/2001/XMLSchema#' - - -# ---------------------------------------------------------------------------------------- -# function definitions - - -def get_unit_name(sym: str, lang: str | None = 'en'): - """ get the name of a unit based on the symbol""" - - unit_query = """ - PREFIX si: <"""+SIDFWBASE+"""/SI#> - PREFIX skos: - SELECT ?Unit ?Label - WHERE - { - {?Unit a si:SISpecialNamedUnit } - UNION - {?Unit a si:SIBaseUnit } - UNION - {?Unit a si:nonSIUnit} - ?Unit skos:prefLabel ?Label . - ?Unit si:hasSymbol ?Symbol . - FILTER (?Symbol='""" + sym + """') . - FILTER (langmatches(lang(?Label),'""" + lang + """'))}""" - - # run SPARQL query for units - ures = g.query(unit_query) - for element in ures: - return element['Label'] - - -def get_prefix_name(sym: str): - """ get the name of a prefix based on a symbol """ - - prefix_query = """ - PREFIX si: <"""+SIDFWBASE+"""/SI#> - PREFIX skos: - SELECT ?Prefix ?Label - WHERE - { - ?Prefix a si:SIPrefix . - ?Prefix skos:prefLabel ?Label . - ?Prefix si:hasSymbol ?Symbol . - FILTER (?Symbol='""" + sym + """')}""" - - # run SPARQL query for units - pres = g.query(prefix_query) - for element in pres: - return element['Label'] - - - -def get_unit_uri(symbol: str): - """ get the URI of a unit based on the symbol """ - return unit_list_dict[symbol] - - -def get_prefix_uri(symbol: str): - """ get the URI of a prefix based on the symbol """ - return prefix_list_dict[symbol] - - -def get_scalingfactor(symbol: str) -> float: - """ get the scaling factor of a prefix with symbol """ - return scaling_list_dict[symbol] - - -# ---------------------------------------------------------------------------------------- -# parser of prefixed unit -def prefixedunit(unit_element: str): - """parses a prefixed unit""" - dictionary = {} - - if unit_element[-1:].isnumeric(): - unit_str = unit_element[:-2] - unit_pwr = int(unit_element[-2:]) - else: - unit_str = unit_element - unit_pwr = 1 - - expo = "" if unit_pwr == 1 else "^" + str(unit_pwr) - - if unit_str[-1:] == "g": - if unit_str == "kg": - dictionary['unit_URI'] = get_unit_uri("kg") - dictionary['unit_symbol'] = "kg" - dictionary['prefix_name'] = "" - dictionary['unit_name'] = "kilogram" - dictionary.update({'scaling': 1}) - - else: - if unit_str == "g": - dictionary['unit_symbol'] = "kg" - dictionary['unit_URI'] = get_unit_uri("kg") - dictionary['unit_name'] = "kilogram" - dictionary['scaling'] = 0.001 ** abs(unit_pwr) - dictionary['relation'] = "1 g" + expo + " = " + str(dictionary['scaling']) + " kg" + expo - - # case "g" with a prefix ≠ k - else: -# if unit_str[0] in prefix_list_dict.keys(): - if unit_str[0] in prefix_list_dict: - - dictionary['prefix_symbol'] = unit_str[0] - dictionary['unit_URI'] = get_unit_uri("kg") - dictionary['unit_symbol'] = "g" - dictionary['unit_name'] = "gram" - dictionary['unit_url'] = BASEURL + "/SI/units/kg" - dictionary['prefix_URI'] = get_prefix_uri(unit_str[0]) - dictionary['prefix_name'] = str(get_prefix_name(unit_str[0])) - dictionary['prefix_url'] = BASEURL + "/SI/prefixes/" + dictionary['prefix_name'] - dictionary['scaling'] = str((float(get_scalingfactor(unit_str[0])) / 1000) ** abs(unit_pwr)) - dictionary['relation'] = "1 " + unit_str + expo + " = " + dictionary['scaling'] + " kg" + expo - - else: - raise HTTPException( - status_code=404, - detail="No information available. Make sure the prefixes and units are correct") - else: - # last character not g -# if unit_str in unit_list_dict.keys(): - if unit_str in unit_list_dict: - dictionary['unit_symbol'] = unit_str - dictionary['unit_URI'] = get_unit_uri(unit_str) - dictionary['unit_name'] = get_unit_name(unit_str) - dictionary['unit_url'] = BASEURL + "/SI/units/" + dictionary['unit_name'] - dictionary['scaling'] = 1 - - else: - remains = unit_str[1:] - - if (unit_str[0] in prefix_list_dict) and (remains in unit_list_dict): - dictionary['prefix_symbol'] = unit_str[0] - dictionary['prefix_URI'] = get_prefix_uri(unit_str[0]) - dictionary['prefix_name'] = str(get_prefix_name(unit_str[0])) - dictionary['prefix_url'] = BASEURL + "/SI/prefixes/" + dictionary['prefix_name'] - dictionary['unit_symbol'] = remains - dictionary['unit_name'] = get_unit_name(remains) - dictionary['unit_URI'] = get_unit_uri(remains) - dictionary['unit_url'] = BASEURL + "/SI/units/" + dictionary['unit_name'] - dictionary['scaling'] = str(float(get_scalingfactor(unit_str[0])) ** abs(unit_pwr)) - dictionary['relation'] = "1 " + unit_str + expo + " = " + dictionary['scaling'] + " " + dictionary[ - 'unit_symbol'] + expo - - else: - raise HTTPException( - status_code=404, - detail="No information available. Make sure the prefixes and units are correct") - - return dictionary - - -# ---------------------------------------------------------------------------------------- -# API endpoints - - -# ---------------------------------------------------------------------------------------- -@app.get("/") -def landing_page(request: Request): - """ return landing page """ - - return TEMPLATES.TemplateResponse( - "ParentLayout.html", - {"request": request}) - - -# ---------------------------------------------------------------------------------------- -@app.get("/cgpm") -def displ_cgpms(request: Request, lang: str | None = 'en'): - """ endpoint to get the full list of CGPM conferences """ - - # check params - for param in request.query_params: - if param not in param_list_cgpms: - error_msg = "Parameter " + param + " unknown. Allowed parameter: " - for allowed_para in param_list_cgpms: - error_msg += allowed_para + ", " - error_msg = error_msg[:-2] - raise HTTPException( - status_code=404, detail=error_msg) - # check language - if lang not in param_list_lang: - raise HTTPException( - status_code=404, detail=f"Requested language unknown {lang}") - - knows_query = """ - PREFIX xsd: - PREFIX si: <"""+SIDFWBASE+"""/SI#> - PREFIX skos: - PREFIX rb: <"""+SIDFWBASE+"""/bodies#> - - - SELECT ?CGPM_title ?Identifier ?Conf_date - WHERE { - ?Conf a rb:Event ; - skos:prefLabel ?CGPM_title ; - rb:hasEventNr ?Identifier ; - rb:hasEventDate ?Conf_date . - BIND(year(?Conf_date) as ?Jahr) . - FILTER (langmatches(lang(?CGPM_title),'""" + lang + """')). - } - ORDER by ?Identifier - """ - - qres = g.query(knows_query) - responses = [] - - for element in qres: - year = element['Conf_date'][:4] - responses.append({ - 'Title': element['CGPM_title'], - 'Year': year, - 'Link': BASEURL + "/bodies/cgpm/" + element['Identifier'], - "Lang": lang - } - ) - - if not responses: - raise HTTPException( - status_code=404, detail="No conference found.") - - accept = request.headers.get("Accept") - if not accept or accept == "application/json": - return {'Conferences': responses} - else: - return TEMPLATES.TemplateResponse( - "ConfsLayout.html", - {"request": request, "Conferences": responses, "lang": lang} - ) - - -# ---------------------------------------------------------------------------------------- -@app.get("/cgpm/{confid}") -def displ_cgpm(request: Request, confid: int | None = None, lang: str | None = 'en'): - """ endpoint to get a specific CGPM conference """ - - # check params - for param in request.query_params: - if param not in param_list_cgpms: - error_msg = "Parameter " + param + " unknown. Allowed parameter: " - for allowed_para in param_list_cgpms: - error_msg += allowed_para + ", " - error_msg = error_msg[:-2] - raise HTTPException( - status_code=404, detail=error_msg) - # check language - if lang not in param_list_lang: - raise HTTPException( - status_code=404, detail=f"Requested language unknown {lang}") - - if confid > 1888 : - fstr = "FILTER (YEAR(?Event_date)=" + str(confid) + ")." - elif confid < 1000 : - fstr = "FILTER (?Identifier=" + str(confid) + ")." - elif confid is not None: - return RedirectResponse("/CGPM") - else: - raise HTTPException( - status_code=404, detail="Should be list of conferences...") - # fstr = "" - - knows_query = """ - PREFIX xsd: - PREFIX si: <"""+SIDFWBASE+"""/SI#> - PREFIX skos: - PREFIX rb: <"""+SIDFWBASE+"""/bodies#> - - SELECT ?Event_title ?Conf ?Identifier ?Event_date - WHERE { - ?Conf a rb:Event ; - skos:prefLabel ?Event_title ; - rb:hasEventNr ?Identifier ; - rb:hasEventDate ?Event_date . - FILTER (langmatches(lang(?Event_title),'""" + lang + """')). - """ + fstr + """ - } - ORDER by ?Identifier - """ - qres = g.query(knows_query) - responses = [] - - for element in qres: - res_query = """ - PREFIX xsd: - PREFIX si: <"""+SIDFWBASE+"""/SI#> - PREFIX skos: - PREFIX rb: <"""+SIDFWBASE+"""/bodies#> - - SELECT ?Event_title ?Event_date ?Outcome_Nr ?Outcome_title ?Outcome_DOI - WHERE { - ?ResBod a rb:ResBod ; - rb:hasEvent ?Event . - ?Event rb:hasOutcome ?Outcome ; - rb:hasEventNr ?Identifier ; - skos:prefLabel ?Event_title ; - rb:hasEventDate ?Event_date . - ?Outcome rb:hasOutcomeNr ?Outcome_Nr ; - rb:hasOutcomeTitle ?Outcome_title ; - rb:hasDOI ?Outcome_DOI . - FILTER(langmatches(lang(?Outcome_title),'""" + lang + """')) . - FILTER(langmatches(lang(?Outcome_DOI),'""" + lang + """')) . - FILTER(langmatches(lang(?Event_title),'""" + lang + """')) . - """ + fstr + """ - } - ORDER by ?Outcome_Nr - """ - - resolutions = g.query(res_query) - res_list = [] - for resolution in resolutions: - res_list.append({'Nr': resolution['Outcome_Nr'], 'Title': resolution['Outcome_title'], - 'Res_Link': resolution['Outcome_DOI']}) - responses.append( - { - 'Title': element['Event_title'], - 'Date': element['Event_date'], - 'Resolutions': res_list - } - ) - - if not responses: - raise HTTPException( - status_code=404, detail="No conference found.") - - accept = request.headers.get("Accept") - if not accept or accept == "application/json": - return {'Conferences': responses} - else: - return TEMPLATES.TemplateResponse( - "ConfLayout.html", - {"request": request, "Conferences": responses, "lang": lang} - ) - - -# ---------------------------------------------------------------------------------------- -@app.get("/constants/") -def displ_constants(request: Request, lang: str | None = 'en'): - """ endpoint to get the full list of defining constants """ - - # check params - for param in request.query_params: - if param not in param_list_constants: - error_msg = "Parameter " + param + " unknown. Allowed parameter: " - for allowed_para in param_list_constants: - error_msg += allowed_para + ", " - error_msg = error_msg[:-2] - raise HTTPException( - status_code=404, detail=error_msg) - - # check language - if lang not in param_list_lang: - raise HTTPException( - status_code=404, detail=f"Requested language unknown {lang}") - - # SPARQL query to get information about all defining constants - constants_query = """ - PREFIX skos: - PREFIX rdf: - PREFIX rdfs: - PREFIX si: <"""+SIDFWBASE+"""/SI#> - - SELECT ?cst ?eText ?fText ?symbol ?updateDate ?valueStr - WHERE { - ?cst a si:Constant ; - skos:prefLabel ?eText ; - skos:prefLabel ?fText ; - si:hasValue ?value ; - si:hasUpdatedDate ?updateDate; - si:hasValueAsString ?valueStr. - - FILTER (lang(?eText) = '""" + lang + """') - FILTER (lang(?fText) = '""" + lang + """') - } - """ - - # run SPARQL query - consset = g.query(constants_query) - - # check for data - if not consset: - raise HTTPException( - status_code=404, detail="No constants data found.") - - # generate output - accept = request.headers.get("Accept") - if not accept or accept == "application/json": - return {'constants': consset.bindings} - elif accept == 'application/ld+json': - # create context - ctx = ["https://stuchalk.github.io/scidata/contexts/si.jsonld", - {"si": SIURL, - "constants": CONSURL, - 'xsd': XSDURL}, - {"@base": CONSURL}] - jld = {"@context": ctx, "@id": CONSURL, "@type": "si:Constant"} - cons = [] - for constant in consset: - name = constant['constant'].replace(CONSURL, 'constants:') - con = {"@id": name, "@type": "si:Constant"} - con.update({"name_en": constant['eText']}) - con.update({"name_fr": constant['fText']}) - con.update({"symbol": constant['sym']}) - # needed to correctly display numeric value - dtype = constant['dtype'].replace(XSDURL, 'xsd:') - if dtype == 'xsd:integer': - con.update({'value': int(constant['nval'])}) - elif dtype == 'xsd:float': - con.update({'value': float(constant['nval'])}) - con.update({"value_str": constant['sval']}) - con.update({'datatype': dtype}) - con.update({"unit": constant['ustr']}) - con.update({'defining_resolution_en': constant['eDOI']}) - con.update({'defining_resolution_fr': constant['fDOI']}) - unt = constant['unit'].replace(SIURL, 'si:') - con.update({'defines': unt}) - cons.append(con) - jld.update({"constants": cons}) - return jld - else: - return TEMPLATES.TemplateResponse( - "ConstantsLayout.html", - {"request": request, "cons": consset, "lang": lang} - ) - - -# ---------------------------------------------------------------------------------------- -@app.get("/constants/{name}/") -def displ_constant(request: Request, name: str | None = None, lang: str | None = 'en'): - """ endpoint to get a specific defining constant """ - - # check params - for param in request.query_params: - if param not in param_list_constants: - error_msg = "Parameter " + param + " unknown. Allowed parameter: " - for allowed_para in param_list_constants: - error_msg += allowed_para + ", " - error_msg = error_msg[:-2] - raise HTTPException( - status_code=404, detail=error_msg) - - # check language - if lang not in param_list_lang: - raise HTTPException( - status_code=404, detail=f"Requested language unknown {lang}") - - knows_query = """ - PREFIX xsd: - PREFIX si: <"""+SIDFWBASE+"""/SI#> - PREFIX skos: - - SELECT ?Label ?Value ?Unit ?Unitstr ?Updated ?Valuestr ?Symbol ?Hidden ?Type - WHERE { - ?SIBaseUnit si:hasDefiningConstant ?Constant . - ?Constant skos:prefLabel ?Label ; - skos:hiddenLabel ?Hidden ; - si:hasValueAsString ?Valuestr ; - si:hasUnitAsString ?Unitstr ; - si:hasUpdatedDate ?Updated ; - si:hasDatatype ?Type ; - si:hasValue ?Value ; - si:hasUnitElement ?list ; - si:hasSymbol ?Symbol . - ?list rdf:_1 ?el1 . - ?el1 si:hasUnit ?u1 ; - si:hasUnitPwr ?p1. - ?u1 si:hasSymbol ?sym1 . - BIND(IF(?p1=1, str(?sym1), CONCAT(str(?sym1),"",str(?p1),'')) AS ?u1Str) - - OPTIONAl { - ?list rdf:_2 ?el2 . - ?el2 si:hasUnit ?u2 ; - si:hasUnitPwr ?p2. - ?u2 si:hasSymbol ?sym2 . - BIND(IF(?p2=1, str(?sym2), CONCAT(str(?sym2),"",str(?p2),'')) AS ?u2Str) - } - - FILTER (langmatches(lang(?Label),'""" + lang + """')) . - FILTER (?Hidden='""" + name + """') . - BIND(IF(EXISTS {?list rdf:_2 ?el }, CONCAT(?u1Str, " ", ?u2Str ), ?u1Str) AS ?Unit) - } - """ - qres = g.query(knows_query) - response: dict = {} - for element in qres: # using iteration even though only unit returned... - response.update( - { - 'Cst_Label': element['Label'], - 'Cst_Symbol': element['Symbol'], - 'Cst_Value': element['Value'], - 'Cst_Valuestr': element['Valuestr'], - 'Cst_Date': element['Updated'], - 'Cst_Unit': element['Unit'], - 'Cst_Unitstr': element['Unitstr'], - 'Cst_Hidden': element['Hidden'], - 'Cst_Datatype': element['Type'] - } - ) - - if not response: - raise HTTPException( - status_code=404, detail="No Constant found.") - - accept = request.headers.get("Accept") - if not accept or accept == "application/json": - return {'constant': response} - elif accept == 'application/ld+json': - resp = response - # create url - url = 'http://si-digital-framework.org/constant/' + resp['Cst_Hidden'] - # create context - ctx = ["https://stuchalk.github.io/scidata/contexts/constants.jsonld", - {"si": "http://si-digital-framework.org/SI/sio.owl"}, - {"@base": url}] - # # populate graph - gph = {"@id": url, "@type": "si:Constant"} - gph.update({"name": resp['Cst_Label']}) - gph.update({"symbol": resp['Cst_Symbol']}) - gph.update({"value": resp['Cst_Value']}) - gph.update({"valuestr": resp['Cst_Valuestr']}) - gph.update({"datatype": resp['Cst_Datatype']}) - gph.update({"unit": resp['Cst_Unit']}) - gph.update({"unitstr": resp['Cst_Unitstr']}) - gph.update({"url": url}) - gph.update({"lastupdated": resp['Cst_Date']}) - - # build JSON-LD - jld = { - "@context": ctx, "@id": url, - "generatedAt": str(datetime.now()), "version": 1, "@graph": gph} - return jld - else: - return TEMPLATES.TemplateResponse( - "ConstantLayout.html", - {"request": request, "constant": response, "lang":lang} - ) - - -# ---------------------------------------------------------------------------------------- -@app.get("/si-baseunits/") -def displ_baseunitsdefinitions(request: Request, sym: str | None = None, lang: str | None = 'en', - datestr: str | None = str(date.today())): - """ endpoint to get the full list of SI base units """ - - # check params - for param in request.query_params: - if param not in param_list_base_units: - error_msg = "Parameter " + param + " unknown. Allowed parameters: " - for allowed_para in param_list_base_units: - error_msg += allowed_para + ", " - error_msg = error_msg[:-2] - raise HTTPException(status_code=404, detail=error_msg) - - # check language - if lang not in param_list_lang: - raise HTTPException( - status_code=404, detail=f"Requested language not available {lang}") - - knows_query = """ - PREFIX xsd: - PREFIX si: <"""+SIDFWBASE+"""/SI#> - PREFIX skos: - PREFIX rb: <"""+SIDFWBASE+"""/bodies#> - - SELECT DISTINCT ?Symbol ?Label ?Q_Label ?Q_Code ?DefiningText ?DefiningResolution ?NoteText - ?StartValidity ?EndValidity ?Equation ?Constant ?Cst_Label ?Cst_Hidden ?ConfNr ?ResNr ?Res_DOI - WHERE - { - VALUES ?datum {'""" + datestr + """'^^xsd:date} . - ?SIBaseUnit a si:SIBaseUnit ; - si:hasSymbol ?Symbol ; - skos:prefLabel ?Label . - FILTER (langmatches(lang(?Label),'""" + lang + """')) . - - ?SIBaseUnit si:hasDefinition ?Definition . - ?Definition si:hasDefiningText ?DefiningText . - FILTER (langmatches(lang(?DefiningText),'""" + lang + """')) . - - OPTIONAL { - ?SIBaseUnit si:hasDefinitionNote ?Note . - ?Note si:hasNoteIndex ?NoteIndex . - ?Note si:hasNoteText ?NoteText . - FILTER (?NoteIndex = 1) . - } - - OPTIONAL {?SIBaseUnit si:isUnitOfQtyKind ?QtyKind .} - OPTIONAL {?QtyKind skos:prefLabel ?Q_Label ; - skos:altLabel ?Q_Code . - FILTER (langmatches(lang(?Q_Label),'""" + lang + """'))}. - - OPTIONAL {?Definition si:hasDefiningConstant ?Constant . - ?Constant skos:prefLabel ?Cst_Label ; - skos:hiddenLabel ?Cst_Hidden . - FILTER (langmatches(lang(?Cst_Label),'""" + lang + """'))} . - - ?Definition si:hasStartValidity ?StartValidity . - OPTIONAL {?Definition si:hasEndValidity ?EndValidity} . - FILTER (((?StartValidity <= ?datum) && !BOUND(?EndValidity)) || - ((?StartValidity <= ?datum) && (?EndValidity >= ?datum))). - - ?Definition si:hasDefiningResolution ?DefiningResolution . - ?Conf rb:hasOutcome ?DefiningResolution ; - rb:hasEventNr ?ConfNr . - ?DefiningResolution rb:hasOutcomeNr ?ResNr ; - rb:hasDOI ?Res_DOI . - FILTER (langmatches(lang(?Res_DOI),'""" + lang + """')) - - OPTIONAL {?Definition si:hasDefiningEquation ?Equation} .}""" - if sym is not None: - knows_query = knows_query[:-1] + """FILTER (?Symbol='""" + sym + """') .}""" - - qres = g.query(knows_query) - responses: List[dict] = [] - - for element in qres: - responses.append( - { - 'Label': element['Label'], - 'Symbol': element['Symbol'], - 'StartValidity': element['StartValidity'], - 'EndValidit?y': element['EndValidity'], - 'Definition': element['DefiningText'], - 'Q_Label': element['Q_Label'], - 'Q_Link': BASEURL + "/quantity/" + element['Q_Code'], - 'DefiningResolution': "CGPM" + str(element['ConfNr']) + "-Res" + str(element['ResNr']), - 'Res_Link': element['Res_DOI'], - 'Equation': element['Equation'], - 'Note': element['NoteText'], - 'Cst_Label': element['Cst_Label'], - 'Cst_Link': None if element['Cst_Hidden'] is None else BASEURL + "/constant/" + element['Cst_Hidden'] - } - ) - - if not responses: - raise HTTPException( - status_code=404, detail=f"No Base Unit with Symbol {sym}.") - - accept = request.headers.get("Accept") - if not accept or accept == "application/json": - return {'units': responses} - - else: - return TEMPLATES.TemplateResponse( - "BaseUnitsLayout.html", - {"request": request, "units": responses, "lang": lang} - ) - - -# ---------------------------------------------------------------------------------------- -@app.get("/si-baseunits/{baseunitid}") -def displ_baseunitdefinition(request: Request, baseunitid: str | None = None, lang: str | None = 'en', - datestr: str | None = str(date.today())): - """ endpoint to get a specific SI base unit """ - - # check params - for param in request.query_params: - if param not in param_list_base_units: - error_msg = "Parameter " + param + " unknown. Allowed parameters: " - for allowed_para in param_list_base_units: - error_msg += allowed_para + ", " - error_msg = error_msg[:-2] - raise HTTPException(status_code=404, detail=error_msg) - - # check language - if lang not in param_list_lang: - raise HTTPException( - status_code=404, detail=f"Requested language not available {lang}") - - knows_query = """ - PREFIX xsd: - PREFIX si: <"""+SIDFWBASE+"""/SI#> - PREFIX skos: - PREFIX rb: <"""+SIDFWBASE+"""/bodies#> - - SELECT DISTINCT ?Symbol ?Label ?Q_Label ?Q_Code ?DefiningText ?DefiningResolution - ?StartValidity ?EndValidity ?Equation ?Constant ?Cst_Label ?Cst_Hidden ?ConfNr ?ResNr ?Res_DOI - WHERE - { - VALUES ?datum {'""" + datestr + """'^^xsd:date} . - ?SIBaseUnit a si:SIBaseUnit ; - si:hasSymbol ?Symbol ; - skos:prefLabel ?Label . - FILTER (langmatches(lang(?Label),'""" + lang + """')) . - - ?SIBaseUnit si:hasDefinition ?Definition . - ?Definition si:hasDefiningText ?DefiningText . - FILTER (langmatches(lang(?DefiningText),'""" + lang + """')) . - - - OPTIONAL {?SIBaseUnit si:isUnitOfQtyKind ?QtyKind .} - OPTIONAL {?QtyKind skos:prefLabel ?Q_Label ; - skos:altLabel ?Q_Code . - FILTER (langmatches(lang(?Q_Label),'""" + lang + """'))}. - - OPTIONAL {?Definition si:hasDefiningConstant ?Constant . - ?Constant skos:prefLabel ?Cst_Label ; - skos:hiddenLabel ?Cst_Hidden . - FILTER (langmatches(lang(?Cst_Label),'""" + lang + """'))} . - - ?Definition si:hasStartValidity ?StartValidity . - OPTIONAL {?Definition si:hasEndValidity ?EndValidity} . - FILTER (((?StartValidity <= ?datum) && !BOUND(?EndValidity)) || - ((?StartValidity <= ?datum) && (?EndValidity >= ?datum))). - - ?Definition si:hasDefiningResolution ?DefiningResolution . - OPTIONAL {?Definition si:hasDefinitionNote ?Note . - ?Note si:hasNoteIndex ?NoteIndex; - si:hasNoteText ?NoteText . - FILTER (langmatches(lang(?NoteText),'""" + lang + """')) . - - } - ?Conf rb:hasOutcome ?DefiningResolution ; - rb:hasEventNr ?ConfNr . - ?DefiningResolution rb:hasOutcomeNr ?ResNr ; - rb:hasDOI ?Res_DOI . - FILTER (langmatches(lang(?Res_DOI),'""" + lang + """')) - - OPTIONAL {?Definition si:hasDefiningEquation ?Equation} .}""" - if len(baseunitid) < 4: - knows_query = knows_query[:-1] + """FILTER (?Symbol='""" + baseunitid + """') .}""" - else: - knows_query = knows_query[:-1] + """FILTER (?Label='""" + baseunitid + """'@""" + lang + """) .}""" - - qres = g.query(knows_query) - responses: List[dict] = [] - - for element in qres: - responses.append( - { - 'Label': element['Label'], - 'Symbol': element['Symbol'], - 'StartValidity': element['StartValidity'], - 'EndValidity': element['EndValidity'], - 'Definition': element['DefiningText'], - 'Q_Label': element['Q_Label'], - 'Q_Link': BASEURL + "/quantity/" + element['Q_Code'], - 'DefiningResolution': "CGPM" + str(element['ConfNr']) + "-Res" + str(element['ResNr']), - 'Res_Link': element['Res_DOI'], - 'Equation': element['Equation'], - 'Cst_Label': element['Cst_Label'], - 'Cst_Link': None if element['Cst_Hidden'] is None else BASEURL + "/constant/" + element['Cst_Hidden'] - } - ) - - notes_query = """ - PREFIX xsd: - PREFIX si: <"""+SIDFWBASE+"""/SI#> - PREFIX skos: - PREFIX rb: <"""+SIDFWBASE+"""/bodies#> - SELECT DISTINCT ?NoteIndex ?NoteText - WHERE - { - VALUES ?datum {'""" + datestr + """'^^xsd:date} . - ?SIBaseUnit a si:SIBaseUnit ; - si:hasSymbol ?Symbol ; - skos:prefLabel ?Label . - FILTER (langmatches(lang(?Label),'""" + lang + """')) . - - ?SIBaseUnit si:hasDefinition ?Definition . - - ?Definition si:hasStartValidity ?StartValidity . - OPTIONAL {?Definition si:hasEndValidity ?EndValidity} . - FILTER (((?StartValidity <= ?datum) && !BOUND(?EndValidity)) || - ((?StartValidity <= ?datum) && (?EndValidity >= ?datum))). - - OPTIONAL {?Definition si:hasDefinitionNote ?Note . - ?Note si:hasNoteIndex ?NoteIndex; - si:hasNoteText ?NoteText . - FILTER (langmatches(lang(?NoteText),'""" + lang + """')) . - } - """ - - if len(baseunitid) < 4: - notes_query = notes_query[:-1] + """FILTER (?Symbol='""" + baseunitid + """') .}""" - else: - notes_query = notes_query[:-1] + """FILTER (?Label='""" + baseunitid + """'@""" + lang + """) .}""" - - nres = g.query(notes_query) - nresponses: List[dict] = [] - - for element in nres: - nresponses.append( - { - 'index': element['NoteIndex'], - 'text': element['NoteText'] - } - ) - - if not responses: - raise HTTPException( - status_code=404, detail=f"No Base Unit with Symbol {baseunitid}.") - - accept = request.headers.get("Accept") - if not accept or accept == "application/json": - return {'units': responses} - elif accept == 'application/ld+json': - resp = responses[0] - # create context - ctx = ["https://stuchalk.github.io/scidata/contexts/si.jsonld", - {"si": "http://si-digital-framework.org/SI/sio.owl"}, - {"@base": "http://si-digital-framework.org/SI/ampere"}] - # add notes - notes = [] - for nresponse in nresponses: - note = {"@id": "note/" + str(nresponse['index']) + "/", "@type": "si:DefinitionNote"} - note.update({"notetext": nresponse['text']}) - notes.append(note) - # # populate graph - gph = {"@id": "http://si-digital-framework.org/SI/" + resp['Label'], "@type": "si:SIBaseUnit"} - gph.update({"name": resp['Label']}) - gph.update({"symbol": resp['Symbol']}) - gph.update({"startvaliditydate": resp['StartValidity']}) - gph.update({"endvaliditydate": resp['EndValidity']}) - gph.update({"definition": resp['Definition']}) - gph.update({"quantity": resp['Q_Label']}) - gph.update({"equation": resp['Equation']}) - gph.update({"resolution_defn": resp['DefiningResolution']}) - gph.update({"resolution_url": resp['Res_Link']}) - gph.update({"notes": notes}) - - # build JSON-LD - jld = { - "@context": ctx, "@id": "http://si-digital-framework.org/SI/" + resp['Label'], - "generatedAt": str(datetime.now()), "version": 1, "@graph": gph} - return jld - else: - return TEMPLATES.TemplateResponse( - "BaseUnitLayout.html", - {"request": request, "units": responses, "notes": nresponses, "lang": lang} - ) - - -# ---------------------------------------------------------------------------------------- -@app.get("/SI/units/") -def displ_units(request: Request, sym: str | None = None, lang: str | None = 'en'): - """ endpoint to get the full list of SI units with special name""" - - # check params - for param in request.query_params: - if param not in param_list_named_units: - error_msg = "Parameter " + param + " unknown. Allowed parameter(s): " - for allowed_para in param_list_named_units: - error_msg += allowed_para + ", " - error_msg = error_msg[:-2] - raise HTTPException( - status_code=404, detail=error_msg) - - # check language - if lang not in param_list_lang: - raise HTTPException( - status_code=404, detail=f"Requested language unknown {lang}") - - knows_query = """ - PREFIX si: <"""+SIDFWBASE+"""/SI#> - PREFIX skos: - SELECT DISTINCT ?Symbol ?Label ?Description ?Q_Label ?Q_Code - WHERE { - {?Unit a si:SIBaseUnit} - UNION - {?Unit a si:SISpecialNamedUnit} - ?Unit si:hasSymbol ?Symbol ; - skos:prefLabel ?Label ; - si:isUnitOfQtyKind ?QtyKind . - ?QtyKind skos:prefLabel ?Q_Label ; - skos:altLabel ?Q_Code . - FILTER (langmatches(lang(?Label),'""" + lang + """')) . - FILTER (langmatches(lang(?Q_Label),'""" + lang + """')) . - } ORDER BY ASC (?Label) - """ - - qres = g.query(knows_query) - responses: List[dict] = [] - - for element in qres: - responses.append( - { - 'Name': element['Label'], - 'Symbol': element['Symbol'], - 'Label': element['Label'], - 'Q_Label': element['Q_Label'], - 'Q_Link': QUANTSURL + element['Q_Code'], - 'N_Link': BASEURL + "/page/" + element['Label'], - 'U_Link': UNITSURL + element['Symbol'] - } - ) - - if not responses: - raise HTTPException( - status_code=404, detail=f"No Unit with Symbol {sym}.") - - accept = request.headers.get("Accept") - if not accept or accept == "application/json": - return {'units': responses} - else: - return TEMPLATES.TemplateResponse( - "NamedUnitsLayout.html", - {"request": request, "units": responses, "lang": lang} - ) - - -# ---------------------------------------------------------------------------------------- -@app.get("/SI/units/{sym}") -def displ_unit(request: Request, sym: str | None = None, lang: str | None = 'en'): - """ endpoint to get a specific SI units with special name""" - - # check params - for param in request.query_params: - if param not in param_list_named_unit: - error_msg = "Parameter " + param + " unknown. Allowed parameter(s): " - for allowed_para in param_list_named_unit: - error_msg += allowed_para + ", " - error_msg = error_msg[:-2] - raise HTTPException( - status_code=404, detail=error_msg) - - # check language - if lang not in param_list_lang: - raise HTTPException( - status_code=404, detail=f"Requested language unknown {lang}") - - knows_query = """ - PREFIX si: <"""+SIDFWBASE+"""/SI#> - PREFIX skos: - SELECT DISTINCT ?Symbol ?Label ?Description ?Q_Label ?Q_Code - WHERE { - {?Unit a si:SIBaseUnit} - UNION - {?Unit a si:SISpecialNamedUnit} - ?Unit si:hasSymbol ?Symbol ; - skos:prefLabel ?Label ; - si:isUnitOfQtyKind ?QtyKind . - ?QtyKind skos:prefLabel ?Q_Label ; - skos:altLabel ?Q_Code . - FILTER (langmatches(lang(?Label),'""" + lang + """')) . - FILTER (langmatches(lang(?Q_Label),'""" + lang + """')) .}""" - - if len(sym) < 4: - knows_query = knows_query[:-1] + """FILTER (?Symbol='""" + sym + """') .}""" - else: - knows_query = knows_query[:-1] + """FILTER (?Label='""" + sym.lower() + """'@""" + lang + """) .}""" - - qres = g.query(knows_query) - responses: List[dict] = [] - - for element in qres: - responses.append( - { - 'Name': element['Label'], - 'Symbol': element['Symbol'], - 'Label': element['Label'], - 'Q_Label': element['Q_Label'], - 'Q_Link': BASEURL + "/quantities/" + element['Q_Code'], - 'N_Link': BASEURL + "/page/" + element['Label'] - } - ) - - if not responses: - raise HTTPException( - status_code=404, detail=f"No Unit with Symbol or Name {sym}.") - - accept = request.headers.get("Accept") - if not accept or accept == "application/json": - return {'units': responses} - else: - return TEMPLATES.TemplateResponse( - "NamedUnitLayout.html", - {"request": request, "units": responses, "lang": lang} - ) - - -# ---------------------------------------------------------------------------------------- -@app.get("/SI/prefixes/") -def displ_prefixes(request: Request, lang: str | None = 'en'): - """ endpoint to get the full list of SI prefixes """ - - # check params - for param in request.query_params: - if param not in param_list_prefixes: - error_msg = "Parameter " + param + " unknown. Allowed parameter(s): " - for allowed_para in param_list_prefixes: - error_msg += allowed_para + ", " - error_msg = error_msg[:-2] - raise HTTPException( - status_code=404, detail=error_msg) - - # check language - if lang not in param_list_lang: - raise HTTPException( - status_code=404, detail=f"Requested language unknown {lang}") - - - fixes_query = """ - PREFIX rb: <"""+SIDFWBASE+"""/bodies#> - PREFIX skos: - PREFIX rdf: - PREFIX si: <"""+SIDFWBASE+"""/SI#> - PREFIX xsd: - - SELECT ?fix ?factor ?type ?sym ?res ?eDOI ?fDOI ?eText ?fText - WHERE { - ?fix rdf:type si:SIPrefix ; - si:hasScalingFactor ?factor ; - si:hasDatatype ?type ; - si:hasSymbol ?sym ; - si:hasDefiningResolution ?res ; - skos:prefLabel ?eText ; - skos:prefLabel ?fText . - ?res rb:hasDOI ?eDOI ; - rb:hasDOI ?fDOI . - FILTER (lang(?eDOI) = "en") - FILTER (lang(?fDOI) = "fr") - FILTER (lang(?eText) = "en") - FILTER (lang(?fText) = "fr") - } - ORDER BY DESC(?factor) - """ - - # run SPARQL query - fixset = g.query(fixes_query) - - # check for data - if not fixset: - raise HTTPException( - status_code=404, detail="SPARQL query not working?.") - - # generate output - accept = request.headers.get("Accept") - if not accept or accept == "application/json": - return {'prefixes': fixset.bindings} - elif accept == 'application/ld+json': - # create context - ctx = ["https://stuchalk.github.io/scidata/contexts/si.jsonld", - {"si": SIURL, - "prefixes": FIXESURL, - "xsd": XSDURL}, - {"@base": FIXESURL}] - jld = {"@context": ctx, "@id": FIXESURL, "@type": "si:Prefix"} - fixes = [] - for prefix in fixset: - name = prefix['fix'].replace(FIXESURL, 'prefixes:') - fix = {"@id": name, "@type": "si:Prefix"} - fix.update({"name_en": prefix['eText']}) - fix.update({"name_fr": prefix['fText']}) - fix.update({'symbol': prefix['sym']}) - # needed to correctly display factor as numeric value in JSON - factor = float(prefix['factor']) - if 1 < factor < 1E+18: - fix.update({'factor': int(factor)}) - else: - fix.update({'factor': factor}) - dtype = prefix['type'].replace(XSDURL, 'xsd:') - fix.update({'datatype': dtype}) - fix.update({'resolution_en': prefix['eDOI']}) - fix.update({'resolution_fr': prefix['fDOI']}) - fixes.append(fix) - jld.update({"prefixes": fixes}) - return jld - else: - return TEMPLATES.TemplateResponse( - "PrefixesLayout.html", - {"request": request, "prefixes": fixset, "lang": lang} - ) - - -# ---------------------------------------------------------------------------------------- -@app.get("/SI/prefixes/{sym}") -def displ_prefix(request: Request, sym: str | None = None, lang: str | None = 'en'): - """ endpoint to get a specific prefix""" - - # check params - for param in request.query_params: - if param not in param_list_prefixes: - error_msg = "Parameter " + param + " unknown. Allowed parameter(s): " - for allowed_para in param_list_prefixes: - error_msg += allowed_para + ", " - error_msg = error_msg[:-2] - raise HTTPException( - status_code=404, detail=error_msg) - - # check language - if lang not in param_list_lang: - raise HTTPException( - status_code=404, detail=f"Requested language unknown {lang}") - - knows_query = """ - PREFIX si: <"""+SIDFWBASE+"""/SI#> - PREFIX skos: - SELECT ?Label ?PrefixSymbol ?ScalingFactor - WHERE - { - ?SIPrefix a si:SIPrefix; - si:hasSymbol ?PrefixSymbol ; - skos:prefLabel ?Label ; - si:hasScalingFactor ?ScalingFactor .}""" - - if len(sym) > 1: - knows_query = knows_query[:-1] + """FILTER (?Label='""" + sym.lower() + """')} """ - else: - knows_query = knows_query[:-1] + """FILTER (?PrefixSymbol='""" + sym + """')} """ - qres = g.query(knows_query) - responses: List[dict] = [] - - for element in qres: - responses.append( - { - 'Label': element['Label'], - 'Symbol': element['PrefixSymbol'], - 'ScalingFactor': element['ScalingFactor'] - } - ) - - if not responses: - raise HTTPException( - status_code=404, detail=f"No prefix for Symbol {sym}.") - - accept = request.headers.get("Accept") - if not accept or accept == "application/json": - return {'prefixes': responses} - - else: - return TEMPLATES.TemplateResponse( - "PrefixesLayout.html", - {"request": request, "prefixes": responses, "lang": lang} - ) - -# ---------------------------------------------------------------------------------------- -@app.get("/si/{combined}") -def displ_comb_unit(request: Request, combined: str, lang: str | None = 'en'): - """ displays explanations on a combined unit""" - - c_unit = combined.split(".") - responses = [] - titel = "" - for element in c_unit: - answer = prefixedunit(element) - prefunitdict = dict() - for label in answer: - prefunitdict[label] = answer[label] - responses.append(prefunitdict) - if element[-1:].isnumeric(): - titel = titel + element[:-2] - titel = titel + "$^{" + element[-2:] + "}$ " - else: - titel = titel + element + " " - - if not responses: - raise HTTPException( - status_code=404, - detail="No information available. Make sure the prefixes and units are correct") - - accept = request.headers.get("Accept") - if not accept or accept == "application/json": - return {'units': responses} - - else: - return TEMPLATES.TemplateResponse( - "siLayout.html", - {"request": request, "units": responses, "title": titel, "lang": lang} - ) - - -# ---------------------------------------------------------------------------------------- -@app.get("/non-si-units/") -def displ_nonsiunits(request: Request, lang: str | None = 'en'): - """ displays a list of non-si-units""" - - # check language - if lang not in param_list_lang: - raise HTTPException( - status_code=404, detail=f"Requested language unknown {lang}") - - knows_query = """ - PREFIX si: <"""+SIDFWBASE+"""/SI#> - PREFIX skos: - SELECT DISTINCT ?Symbol ?Label ?Q_Label ?Q_Code ?Factor ?SIUnitSymbol - WHERE { - ?Unit a si:nonSIUnit . - ?Unit si:hasSymbol ?Symbol ; - skos:prefLabel ?Label ; - si:isUnitOfQtyKind ?QtyKind; - si:hasConversionFactor ?Factor; - si:hasConversionUnit ?SIUnit. - ?SIUnit si:hasSymbol ?SIUnitSymbol. - ?QtyKind skos:prefLabel ?Q_Label ; - skos:altLabel ?Q_Code . - FILTER(langmatches(lang(?Label),'""" + lang + """')) . - FILTER (langmatches(lang(?Q_Label),'""" + lang + """')) .}""" - - qres = g.query(knows_query) - responses: List[dict] = [] - - for element in qres: - responses.append( - { - 'Name': element['Label'], - 'Symbol': element['Symbol'], - 'Label': element['Label'], - 'Factor': element['Factor'], - 'SIUnitSymbol': element['SIUnitSymbol'], - 'Q_Label': element['Q_Label'], - 'Q_Link': BASEURL + "/quantities/" + element['Q_Code'], - 'U_Link': BASEURL + "/non-si-unit/" + element['Label'] - } - ) - - if not responses: - raise HTTPException( - status_code=404, - detail="No non-SI unit found") - - accept = request.headers.get("Accept") - if not accept or accept == "application/json": - return {'units': responses} - - else: - return TEMPLATES.TemplateResponse( - "NonSILayout.html", - {"request": request, "units": responses, "lang": lang} - ) - - -# ---------------------------------------------------------------------------------------- -@app.get("/non-si-unit/{identifier}") -def displ_nonsiunit(request: Request, identifier: str, lang: str | None = 'en'): - """displays a specific non-si-unit""" - - # check language - if lang not in param_list_lang: - raise HTTPException( - status_code=404, detail=f"Requested language unknown {lang}") - - knows_query = """ - PREFIX si: <"""+SIDFWBASE+"""/SI#> - PREFIX skos: - SELECT DISTINCT ?Symbol ?Label ?Q_Label ?Q_Code ?Factor ?SIUnitSymbol - WHERE { - VALUES ?identifier {'""" + identifier + """'@""" + lang + """} - ?Unit a si:nonSIUnit . - ?Unit si:hasSymbol ?Symbol ; - skos:prefLabel ?Label ; - si:isUnitOfQtyKind ?QtyKind ; - si:hasConversionFactor ?Factor; - si:hasConversionUnit ?SIUnit. - ?SIUnit si:hasSymbol ?SIUnitSymbol. - ?QtyKind skos:prefLabel ?Q_Label ; - skos:altLabel ?Q_Code . - FILTER(?Label =?identifier) . - FILTER (langmatches(lang(?Q_Label),'""" + lang + """')) .}""" - - qres = g.query(knows_query) - responses: List[dict] = [] - - for element in qres: - responses.append( - { - 'Name': element['Label'], - 'Symbol': element['Symbol'], - 'Factor': element['Factor'], - 'SIUnitSymbol': element['SIUnitSymbol'], - 'Label': element['Label'], - 'Q_Label': element['Q_Label'], - 'Q_Link': BASEURL + "/quantity/" + element['Q_Code'], - } - ) - - if not responses: - raise HTTPException( - status_code=404, - detail="No non-SI unit found") - - accept = request.headers.get("Accept") - if not accept or accept == "application/json": - return {'units': responses} - - else: - return TEMPLATES.TemplateResponse( - "NonSILayout.html", - {"request": request, "units": responses, "lang": lang} - ) - - -# ---------------------------------------------------------------------------------------- -@app.get("/quantities/") -def displ_quants(request: Request, lang: str | None = 'en'): - """ generate a list of the quantities referenced in the SI brochure""" - - # check params - for param in request.query_params: - if param not in param_list_quantities: - error_msg = "Parameter " + param + " unknown. Allowed parameter: " - for allowed_para in param_list_quantities: - error_msg += allowed_para + ", " - error_msg = error_msg[:-2] - raise HTTPException( - status_code=404, detail=error_msg) - - # check language - if lang not in param_list_lang: - raise HTTPException( - status_code=404, detail=f"Requested language unknown {lang}") - - # SPARQL query to get all the information about quantities and related SI allowed units - quants_query = """ - PREFIX skos: - PREFIX rdf: - PREFIX si: <"""+SIDFWBASE+"""/SI#> - - SELECT ?quant ?code ?unit ?ulabel ?usym ?eText ?fText - WHERE { - ?quant rdf:type si:QuantityKind ; - skos:altLabel ?code ; - skos:prefLabel ?eText ; - skos:prefLabel ?fText . - ?unit si:isUnitOfQtyKind ?quant ; - si:hasSymbol ?usym; - skos:prefLabel ?ulabel. - FILTER (lang(?eText) = '""" + lang + """') - FILTER (lang(?fText) = '""" + lang + """') - FILTER (lang(?ulabel) = '""" + lang + """') - } - ORDER BY ASC(?eText) - """ - - # run SPARQL query - quantset = g.query(quants_query) - - # check for data - if not quantset: - raise HTTPException( - status_code=404, - detail=f"No Quantity corresponding to the request (Language = {lang}).") - - # generate output - accept = request.headers.get("Accept") - if not accept or accept == "application/json": - return {'quantities': quantset.bindings} - elif accept == 'application/ld+json': - # preprocess units as some quantities have more than one - units = {} - for q in quantset: - if q['code'] not in units: - units.update({q['code']: []}) - u = q['unit'].replace(UNITSURL, "units:") - units[q['code']].append(u) - # create context - ctx = ["https://stuchalk.github.io/scidata/contexts/si.jsonld", - {"si": "http://si-digital-framework.org/SI#", - 'units': UNITSURL}, - {"@base": QUANTSURL}] - jld = {"@context": ctx, "@id": QUANTSURL, "@type": "si:QuantityKind"} - quants = [] - for quant in quantset: - # check if this is the quantity with the first unit in units[quant.code], if not ignore - u = quant['unit'].replace(UNITSURL, "units:") - if u == units[quant['code']][0]: - name = quant['quant'].replace(QUANTSURL, "quantities:") - qty = {"@id": name, "@type": "si:QuantityKind"} - qty.update({"name_en": quant['eText']}) - qty.update({"name_fr": quant['fText']}) - qty.update({'code': quant['code']}) - qty.update({'siunits': units[quant.code]}) - quants.append(qty) - jld.update({"quantities": quants}) - return jld - else: - - return TEMPLATES.TemplateResponse( - "QtyLayout.html", - {"request": request, "quants": quantset, "lang": lang} - ) - - -# ---------------------------------------------------------------------------------------- -@app.get("/quantities/{code}") -def displ_quant(request: Request, code: str | None = None, lang: str | None = 'en'): - """ display a specif quantity referenced in the SI brochure""" - - # check params - for param in request.query_params: - if param not in param_list_quantities: - error_msg = "Parameter " + param + " unknown. Allowed parameter: " - for allowed_para in param_list_quantities: - error_msg += allowed_para + ", " - error_msg = error_msg[:-2] - raise HTTPException( - status_code=404, detail=error_msg) - - # check language - if lang not in param_list_lang: - raise HTTPException( - status_code=404, detail=f"Requested language unknown {lang}") - - - # the SPARQL query below could be written without UNION and rely on inferences - # (owlrl.DeductiveClosure(owlrl.OWLRL_Semantics).expand(g)) - # 'SIBaseUnits' and 'SIUnitSpecialName' are both 'MeasurementUnits'. - knows_query = """ - PREFIX skos: - PREFIX rdf: - PREFIX si: <"""+SIDFWBASE+"""/SI#> - - - SELECT ?quant ?code ?unit ?ulabel ?usym ?eText ?fText - WHERE { - ?quant rdf:type si:QuantityKind ; - skos:altLabel ?code ; - skos:prefLabel ?eText ; - skos:prefLabel ?fText ; - si:hasUnit ?unit. - ?unit si:isUnitOfQtyKind ?quant ; - si:hasSymbol ?usym; - skos:prefLabel ?ulabel; - FILTER (lang(?eText) = '""" + lang + """') - FILTER (lang(?fText) = '""" + lang + """') - FILTER (lang(?ulabel) = '""" + lang + """') - }""" - if code is not None: - knows_query = knows_query[:-1] + """FILTER (?code='""" + code + """')}""" - - qres = g.query(knows_query) - - responses: List[dict] = [] - - for element in qres: - responses.append( - { - 'eText': element['eText'], - 'fText': element['fText'], - 'code': element['code'], - 'ulabel': element['ulabel'], - 'usym': element['usym'] - } - ) - - if not responses: - raise HTTPException( - status_code=404, - detail=f"no Quantity corresponding to the request (Code = {code} and Language = {lang}).") - - accept = request.headers.get("Accept") - if not accept or accept == "application/json": - return {'units': responses} - - else: - return TEMPLATES.TemplateResponse( - "QtyLayout.html", - {"request": request, "quants": responses, "lang": lang} - ) - - -# ---------------------------------------------------------------------------------------- -@app.get("/page/{word}") -def dbpedia_page(request: Request, word: str): - """displays a dbpedia-like page""" - knows_query = """ - PREFIX xsd: - PREFIX si: <"""+SIDFWBASE+"""/SI#> - PREFIX skos: - PREFIX rdf: - PREFIX rdfs: - - SELECT DISTINCT ?p ?o - WHERE { - {?s (skos:prefLabel | skos:hiddenLabel | skos:altLabel) ?word . - ?s ?p ?o . - VALUES ?word {'""" + word + """'@en '""" + word + """'@fr '""" + word + """'^^xsd:string} - } - } - """ - qres = g.query(knows_query) - responses: List[dict] = [] - - for element in qres: - responses.append( - { - # the property .n3(g.namespace_manager) allows to display the identifiers using the PREFIXES - 'URI': element['p'].n3(g.namespace_manager), - 'object': element['o'].n3(g.namespace_manager) - } - ) - - return TEMPLATES.TemplateResponse( - "DbpediaLayout.html", - {"request": request, "title": word, "teile": responses} - ) - - -# ---------------------------------------------------------------------------------------- -# SPARQL Query Assistant UI - -from fastapi.responses import HTMLResponse -from urllib.parse import quote - -@app.get("/sparql-ui", response_class=HTMLResponse) -async def sparql_ui(): - example_query = """PREFIX skos: -PREFIX rdf: -PREFIX rdfs: -PREFIX si: - -SELECT ?cst ?label ?symbol ?updateDate ?valueStr ?value -WHERE { - ?cst a si:Constant ; - skos:prefLabel ?label ; - si:hasValue ?value ; - si:hasUpdatedDate ?updateDate ; - si:hasValueAsString ?valueStr . - FILTER langMatches(lang(?label), "en") -} -LIMIT 10""" - - return f""" - - - SPARQL Query Assistant - - - -

SPARQL Query Assistant

-

Write or modify your SPARQL query below, then click Run Query.

-
-
- - - -
- - - - - """ - - -# ---------------------------------------------------------------------------------------- -# SPARQL endpoint to the FastAPI app -from fastapi.responses import JSONResponse, HTMLResponse -from rdflib import Literal, URIRef, BNode - -@app.get("/sparql") -async def sparql_endpoint(request: Request, q: str, format: str = "json"): - """ - Unified SPARQL endpoint: - /sparql?q=&format=json → W3C-compliant JSON results (default) - /sparql?q=&format=html → Human-readable HTML table - """ - try: - results = g.query(q) - vars_ = [str(v) for v in results.vars] - - # Build SPARQL Results JSON "bindings" - bindings = [] - for row in results.bindings: - binding = {} - for var, term in row.items(): - if term is None: - continue - entry = {"value": str(term)} - - # Determine RDF term type - if isinstance(term, Literal): - entry["type"] = "literal" - if term.datatype: - entry["type"] = "typed-literal" - entry["datatype"] = str(term.datatype) - if term.language: - entry["xml:lang"] = term.language - elif isinstance(term, URIRef): - entry["type"] = "uri" - elif isinstance(term, BNode): - entry["type"] = "bnode" - else: - entry["type"] = "literal" - - binding[str(var)] = entry - bindings.append(binding) - - # ------------------------- - # JSON (W3C SPARQL Results) - # ------------------------- - if format == "json": - return JSONResponse( - content={"head": {"vars": vars_}, "results": {"bindings": bindings}} - ) - - # ------------------------- - # HTML Table representation - # ------------------------- - html = [ - "SPARQL Results", - "", - "

SPARQL Results (HTML View)

", - "", - ] - html += [f"" for v in vars_] - html += [""] - - for row in bindings: - html.append("") - for v in vars_: - val = row.get(v, {}).get("value", "") - typ = row.get(v, {}).get("type", "") - if typ == "uri": - val = f'{val}' - html.append(f"") - html.append("") - html.append("
{v}
{val}
") - - return HTMLResponse("".join(html)) - - except Exception as e: - return JSONResponse(content={"error": str(e)}, status_code=400) \ No newline at end of file diff --git a/src/si_ref_point/test_api/launch_api.py b/src/si_ref_point/test_api/launch_api.py deleted file mode 100644 index f86fa13..0000000 --- a/src/si_ref_point/test_api/launch_api.py +++ /dev/null @@ -1,32 +0,0 @@ -""" Wrapper to launch fastAPI/uvicorn app -""" -import argparse -import uvicorn -import json - -def get_parser(): - """ Dedicated function to collect command line parameters, so it can - autogenerate doc too - """ - parser = argparse.ArgumentParser( - description="Launch SI test API") - parser.add_argument( - '-p', '--port', type=int, default=5000, - help="Web server port") - parser.add_argument( - '--host', type=str, default="0.0.0.0", # 0.0.0.0 is needed to make the server visible on a local network - help="Web server host") - parser.add_argument( - '--log_level', type=str, default="info", - help="Log level") - return parser - -def main(): - args = get_parser().parse_args() - uvicorn.run('si_ref_point.test_api.api_main:app', - port=args.port, - log_level=args.log_level, - host=args.host) - -if __name__ == "__main__": - main() diff --git a/src/si_ref_point/test_api/static/dsi.css b/src/si_ref_point/test_api/static/dsi.css deleted file mode 100644 index f5ea30f..0000000 --- a/src/si_ref_point/test_api/static/dsi.css +++ /dev/null @@ -1,66 +0,0 @@ -h1, h2, h3, h4, h5,li, p, td, th { - font-family :Arial, Helvetica, sans-serif; -} - -p { - font-family :Arial, Helvetica, sans-serif; -} - -table { - width: 500px; -} - -button, img, table { - margin-left: 10px; -} -th { - width: 50%; - font-weight: bold; - text-align: left; - background-color:lightgray; -} -button{ - width :200px ; - margin-left : 5px; - margin-top : 20px; - font-size: 14px; -} -.btn-group button { - background-color: #da7af2; /* Green background */ - border: 1px solid rgb(211, 94, 224); /* Green border */ - color: white; /* White text */ - padding: 10px 24px; /* Some padding */ - cursor: pointer; /* Pointer/hand icon */ - float: left; /* Float the buttons side by side */ -} -.btn-group button:not(:last-child) { - border-right: none; /* Prevent double borders */ -} - -/* Clear floats (clearfix hack) */ -.btn-group:after { - content: ""; - clear: both; - display: table; -} - -/* Add a background color on hover */ -.btn-group button:hover { - background-color: #df00fd; -} - -.flex-container { - display: flex; -} - -/* .flex-child { - flex: 1; -} */ - -.flex-child:first-child { - margin-right: 20px; -} - -.API_request_class{ - color: rgb(4, 138, 138) -} \ No newline at end of file diff --git a/src/si_ref_point/test_api/static/dsi.jpg b/src/si_ref_point/test_api/static/dsi.jpg deleted file mode 100644 index e7aa0fd..0000000 Binary files a/src/si_ref_point/test_api/static/dsi.jpg and /dev/null differ diff --git a/src/si_ref_point/test_api/templates/BaseUnitLayout.html b/src/si_ref_point/test_api/templates/BaseUnitLayout.html deleted file mode 100644 index b0bae0f..0000000 --- a/src/si_ref_point/test_api/templates/BaseUnitLayout.html +++ /dev/null @@ -1,143 +0,0 @@ - - - - Base Units - - - {% extends 'ParentLayout.html' %} - {% block main %} - - {% if language == 'en' %} -
-

SI Base Units

- {% for unit in units %} -

{{unit.Label}}

-

Definition: {{unit.Definition}}

- - {% if unit.Note %} - - - - - {% endif %} - - {% if not unit.EndValidity %} - - - - - {% else %} - - - - - {% endif %} - - - - - - - - - - - - {% if unit.Cst_Link %} - - - - - {% endif %} - - {% if unit.Q_Label %} - - - - - {% endif %} - - {% if unit.Equation %} - - - - - {% endif %} -
Note 1:{{unit.Note}}
Validity:Current definition (valid from {{unit.StartValidity}})
Validity: From {{unit.StartValidity}} to {{unit.EndValidity}}
Defining Resolution:{{unit.DefiningResolution}}
Symbol:{{unit.Symbol}}
Defining Constant:{{unit.Cst_Label}}
Quantity Kind:{{unit.Q_Label}}
Defining Equation:$${{unit.Equation}}$$
-

Notes

-
    - {% for note in notes %} -
  1. {{ note.text|safe }}
  2. - {% endfor %} -
- {% endfor %} -
- {% else %} -
-

Unités SI de base

- {% for unit in units %} -

{{unit.Label}}

-

Définition: {{unit.Definition}}

- - {% if unit.Note %} - - - - - {% endif %} - - {% if not unit.EndValidity %} - - - - - {% else %} - - - - - {% endif %} - - - - - - - - - - - - {% if unit.Cst_Link %} - - - - - {% endif %} - - {% if unit.Q_Label %} - - - - - {% endif %} - - {% if unit.Equation %} - - - - - {% endif %} -
Note 1:{{unit.Note}}
Validité:Définition actuelle (en force depuis {{unit.StartValidity}})
Validité: De {{unit.StartValidity}} à {{unit.EndValidity}}
Résolution définissante:{{unit.DefiningResolution}}
Symbole:{{unit.Symbol}}
Constante définissante:{{unit.Cst_Label}}
Type de grandeur:{{unit.Q_Label}}
Equation définissante:$${{unit.Equation}}$$
-

Notes

-
    - {% for note in notes %} -
  1. {{ note.text|safe }}
  2. - {% endfor %} -
- {% endfor %} -
- {% endif %} -{% endblock %} - - \ No newline at end of file diff --git a/src/si_ref_point/test_api/templates/BaseUnitsLayout.html b/src/si_ref_point/test_api/templates/BaseUnitsLayout.html deleted file mode 100644 index 6cdf16e..0000000 --- a/src/si_ref_point/test_api/templates/BaseUnitsLayout.html +++ /dev/null @@ -1,23 +0,0 @@ - - - - Base Units - - - {% extends 'ParentLayout.html' %} - {% block main %} -
-

SI Base Units

- {% for unit in units %} - {% set url_address = '../si-baseunit/' ~ unit.Symbol ~'?lang=' ~lang %} -

{{unit.Label}}

-

Definition: {{unit.Definition}}

- - {% endfor %} -
-{% endblock %} - - - - -{{unit.Q_Label}} \ No newline at end of file diff --git a/src/si_ref_point/test_api/templates/ConfLayout.html b/src/si_ref_point/test_api/templates/ConfLayout.html deleted file mode 100644 index 9e31039..0000000 --- a/src/si_ref_point/test_api/templates/ConfLayout.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - Conferences - - - {% extends 'ParentLayout.html' %} - {% block main %} - - {% for Conference in Conferences %} -

{{Conference.Title}}

- Date: {{Conference.Date}} - {% for Resolution in Conference.Resolutions %} -

{{Resolution.Nr}} {{Resolution.Title}}

- {% endfor %} - {% endfor %} - - {% endblock %} - - \ No newline at end of file diff --git a/src/si_ref_point/test_api/templates/ConfsLayout.html b/src/si_ref_point/test_api/templates/ConfsLayout.html deleted file mode 100644 index c8b1d7c..0000000 --- a/src/si_ref_point/test_api/templates/ConfsLayout.html +++ /dev/null @@ -1,23 +0,0 @@ - - - - Conferences - - - {% extends 'ParentLayout.html' %} - {% block main %} - {% if lang == 'en' %} -

Conferences

- {% for Conference in Conferences %} -

{{Conference.Title}} ({{Conference.Year}})

- {% endfor %} - - {% elif lang =='fr' %} -

Conférences

- {% for Conference in Conferences %} -

{{Conference.Title}} ({{Conference.Year}})

- {% endfor %} - {% endif %} - {% endblock %} - - \ No newline at end of file diff --git a/src/si_ref_point/test_api/templates/ConstantLayout.html b/src/si_ref_point/test_api/templates/ConstantLayout.html deleted file mode 100644 index 232577a..0000000 --- a/src/si_ref_point/test_api/templates/ConstantLayout.html +++ /dev/null @@ -1,46 +0,0 @@ - - - - Constant - - - {% extends 'ParentLayout.html' %} - {% block main %} -

{{constant.Cst_Label}}

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Numeric Value:{{constant.Cst_Value}}
Value Datatype:{{constant.Cst_Datatype}}
Value as a String:{{constant.Cst_Valuestr}}
Symbol:{{constant.Cst_Symbol}}
Unit as HTML:{{constant.Cst_Unit}}
Unit as String:{{constant.Cst_Unitstr}}
Hidden Label:{{constant.Cst_Hidden}}
Last updated date:{{constant.Cst_Date}}
-{% endblock %} - - \ No newline at end of file diff --git a/src/si_ref_point/test_api/templates/ConstantsLayout.html b/src/si_ref_point/test_api/templates/ConstantsLayout.html deleted file mode 100644 index ff84e0d..0000000 --- a/src/si_ref_point/test_api/templates/ConstantsLayout.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - Defining Constants - - - {% extends 'ParentLayout.html' %} - {% block main %} -

Defining Constants

- {% for con in cons %} - {% set cst_url_address = con.cst ~'?lang=' ~lang %} - {% if lang == 'en' %} -

{{con.eText}}

- {% elif lang == 'fr' %} -

{{con.fText}}

- {% endif %} - {% endfor %} -{% endblock %} - - \ No newline at end of file diff --git a/src/si_ref_point/test_api/templates/DbpediaLayout.html b/src/si_ref_point/test_api/templates/DbpediaLayout.html deleted file mode 100644 index 79093dd..0000000 --- a/src/si_ref_point/test_api/templates/DbpediaLayout.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - SI Digital Framework Landing Page - - - {% extends 'ParentLayout.html' %} - {% block main %} -

{{title}}

- - - - - - {% for teil in teile %} - - - - - {% endfor %} -
PredicateObject
{{teil.URI}}{{teil.object}}
- {% endblock %} - - \ No newline at end of file diff --git a/src/si_ref_point/test_api/templates/NamedUnitLayout.html b/src/si_ref_point/test_api/templates/NamedUnitLayout.html deleted file mode 100644 index 48c9098..0000000 --- a/src/si_ref_point/test_api/templates/NamedUnitLayout.html +++ /dev/null @@ -1,38 +0,0 @@ - - - - Units - - -{% extends 'ParentLayout.html' %} -{% block main %} - {% if lang == 'fr' %} -

Unités SI

- {% for unit in units %} -

{{unit.Label}}

- {% set Q_url_address = unit.Q_Link ~'?lang=' ~lang %} -

- {{unit.Label}} est l'unité de la grandeur {{unit.Q_Label}} et a le symbol {{unit.Symbol}}. -

-

- Dbpedia page -

- {% endfor %} - - {% else %} -

SI Units

- {% for unit in units %} -

{{unit.Label}}

- {% set Q_url_address = unit.Q_Link ~'?lang=' ~lang %} -

- {{unit.Label}} is the unit of the quantity kind {{unit.Q_Label}} and has the symbol {{unit.Symbol}}. - -

-

- Dbpedia page -

- {% endfor %} - {% endif %} -{% endblock %} - - \ No newline at end of file diff --git a/src/si_ref_point/test_api/templates/NamedUnitsLayout.html b/src/si_ref_point/test_api/templates/NamedUnitsLayout.html deleted file mode 100644 index 4dd07cd..0000000 --- a/src/si_ref_point/test_api/templates/NamedUnitsLayout.html +++ /dev/null @@ -1,22 +0,0 @@ - - - - Units - - - {% extends 'ParentLayout.html' %} - {% block main %} -

SI Units

- {% for unit in units %} -

{{unit.Label}}

-

- {% if lang == 'en' %} - {{unit.Label}} is the unit of the quantity kind {{unit.Q_Label}} and has the symbol {{unit.Symbol}}. - {% elif lang == 'fr' %} - {{unit.Label}} est l'unité de la grandeur {{unit.Q_Label}} et a le symbol {{unit.Symbol}}. - {% endif %} -

- {% endfor %} -{% endblock %} - - \ No newline at end of file diff --git a/src/si_ref_point/test_api/templates/NonSILayout.html b/src/si_ref_point/test_api/templates/NonSILayout.html deleted file mode 100644 index 4f3d097..0000000 --- a/src/si_ref_point/test_api/templates/NonSILayout.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - Units - - - {% extends 'ParentLayout.html' %} - {% block main %} -

Non SI Units

- {% for unit in units %} -

{{unit.Label}}

-

- {% if language == 'fr' %} - {{unit.Label}} est l'unité de la grandeur - {{unit.Q_Label}} et a le symbol {{unit.Symbol}}. - {% else %} - {{unit.Label}} is the unit of the quantity kind - {{unit.Q_Label}} and has the symbol {{unit.Symbol}}. - {% endif %} -

-

1 {{unit.Symbol}} = {{unit.Factor}} {{unit.SIUnitSymbol}}

- {% endfor %} -{% endblock %} - - \ No newline at end of file diff --git a/src/si_ref_point/test_api/templates/ParentLayout.html b/src/si_ref_point/test_api/templates/ParentLayout.html deleted file mode 100644 index 2c190f4..0000000 --- a/src/si_ref_point/test_api/templates/ParentLayout.html +++ /dev/null @@ -1,157 +0,0 @@ - - - - SI Digital Framework Landing Page - - - - - - - {% block head %} -
-
- DSI logo -
-
- SI Reference Point -
-
-
- - - - - - -
- {% endblock %} -
- {% block main %} -

How to use this site

-

Below you will find a few examples of requests that can be used in this API.

- -

~/cgpm

-

Returns all general Conferences (CGPM)

-

Optional parameters

-
    -
  • lang: selects the language (en or fr)
  • - -
-

~/cgpm/{identifier}

-

Returns on the General Conference (CGPM) specified by the identifier. The identifier can be the year of the conference (YYYY) or the number of the conference.

-

Optional parameter

-
    -
  • lang: selects the language (en or fr)
  • -
- -

Examples

- - - -

~/constants

-

Returns the list of the constants that underpin the SI.

-

Optional parameter

-
    -
  • lang: selects the language (en or fr)
  • -
-

~/constant/{identifier}

-

Return information about the constant specified by the identifier

-

Examples

- - -

~/si-baseunits

-

Returns the list of the Base Units with their definition.

-

Optional parameters

-
    -
  • datestr: selects the definition valid at a given date (format YYYY-MM-DD)
  • -
  • lang: selects the language (en or fr)
  • -
-

~/si-baseunit/{identifer}

-

Returns information about the Base Units specified by the identifier. The identifier can be the Symbol (case sensitive) or the full name (not case sensitive)with their definition.

-

Optional parameters

-
    -
  • datestr: selects the definition valid at a given date (format YYYY-MM-DD)
  • -
  • lang: selects the language (en or fr)
  • -
- -

Examples

- - -

~/si-units

-

Returns a list of all units (base and derived units)

-

Optional parameters

-
    -
  • lang:selects the language (en or fr)
  • -
- -

~/si-unit/{identifier}

-

Returns information on a si-unit (base and derived units) specified by the identifier. The identifier can be the Symbol (case sensitive) or the full name (not case sensitive)with their definition.

-

Optional parameter

-
    -
  • lang:selects the language (en or fr)
  • - -
-

Examples

- - -

~/si-prefixes

-

Returns the list of all prefixes accepted in the SI

-

Optional parameter

-
    -
  • lang:selects the language (en or fr)
  • -
- -

~/si-prefix/{identifier}

-

Returns information on a prefix specified by the identifier. The identifier can be the Symbol (case sensitive) or the full name (not case sensitive)with their definition.

-

Optional parameter

-
    -
  • lang:selects the language (en or fr)
  • -
- -

Example

- - -

~/quantities

-

Returns a list of all kind of quantities given in the SI Brochure

-

Optional parameter

-
    -
  • lang:selects the language (en or fr)
  • -
-

~/quantity/{identifier}

-

Returns information on a quantity specified by its 4-letter-code.

-

Optional parameters

-
    -
  • lang:selects the language (en or fr)
  • -
- -

Example

- - - {% endblock %} -
- - \ No newline at end of file diff --git a/src/si_ref_point/test_api/templates/PrefixesLayout.html b/src/si_ref_point/test_api/templates/PrefixesLayout.html deleted file mode 100644 index b464ce4..0000000 --- a/src/si_ref_point/test_api/templates/PrefixesLayout.html +++ /dev/null @@ -1,32 +0,0 @@ - - - - Prefixes - - - {% extends 'ParentLayout.html' %} - {% block main %} -

Prefixes

- - - - - - - - - - - {% for prefix in prefixes %} - - - - - - - {% endfor %} - -
SymbolFactorEnglish NameNom Français
{{ prefix.sym }}{{ prefix.factor }}{{ prefix.eText }}{{ prefix.fText }}
- {% endblock %} - - \ No newline at end of file diff --git a/src/si_ref_point/test_api/templates/QtyLayout.html b/src/si_ref_point/test_api/templates/QtyLayout.html deleted file mode 100644 index bbb58d4..0000000 --- a/src/si_ref_point/test_api/templates/QtyLayout.html +++ /dev/null @@ -1,32 +0,0 @@ - - - - Quantities - - - {% extends 'ParentLayout.html' %} - {% block main %} - {% if lang == 'fr' %} -

Grandeurs

- {% for quant in quants %} -

{{quant.fText}}

- {% set url_address = "/SI/units/" + quant.usym ~'?lang=' ~lang %} -

- Le type de grandeur {{quant.fText}} (code: {{quant.code}}) a l'unité - {{quant.ulabel}} (symbole {{quant.usym}}). -

- {% endfor %} - {% else %} -

Quantities

- {% for quant in quants %} -

{{quant.eText}}

- {% set url_address = "/SI/units/" + quant.usym ~'?lang=' ~lang %} -

- The kind of quantity {{quant.eText}} (code: {{quant.code}}) has the - unit {{quant.ulabel}} (symbol {{quant.usym}}). -

- {% endfor %} - {% endif %} - {% endblock %} - - \ No newline at end of file diff --git a/src/si_ref_point/test_api/templates/ResolutionLayout.html b/src/si_ref_point/test_api/templates/ResolutionLayout.html deleted file mode 100644 index 61a56f8..0000000 --- a/src/si_ref_point/test_api/templates/ResolutionLayout.html +++ /dev/null @@ -1,13 +0,0 @@ - - - - Resolution - - - {% extends 'ParentLayout.html' %} - {% block main %} -

{{response.Conf_title}} ({{response.Conf_year}})

-

Resolution {{response.Res_ID}}: {{response.Res_title}}

- {% endblock %} - - \ No newline at end of file diff --git a/src/si_ref_point/test_api/templates/siLayout.html b/src/si_ref_point/test_api/templates/siLayout.html deleted file mode 100644 index 5de94db..0000000 --- a/src/si_ref_point/test_api/templates/siLayout.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - Units - - - {% extends 'ParentLayout.html' %} - {% block main %} -

SI Unit

-

{{title}}

- {% for element in units %} -
-

{{element.prefix_symbol}}{{element.unit_symbol}}: {{element.prefix_name}}{{element.unit_name}}

- {% if element.prefix_symbol %} -

where

-

{{element.prefix_symbol}} stands for {{element.prefix_name}}

- {% endif%} -

{{element.unit_symbol}} for {{element.unit_name}}

-

{{element.relation}}

-
-

- {% endfor %} -{% endblock %} - - \ No newline at end of file diff --git a/test/quantities_ttl_to_yaml.py b/tests/quantities_ttl_to_yaml.py similarity index 63% rename from test/quantities_ttl_to_yaml.py rename to tests/quantities_ttl_to_yaml.py index 62f0f64..d0e6588 100644 --- a/test/quantities_ttl_to_yaml.py +++ b/tests/quantities_ttl_to_yaml.py @@ -1,46 +1,46 @@ """ Convert TTL files for quantities back to YAML input format -Apart from allogin some testing this also helps backporting additional +Apart from allogin some testing this also helps to backport additional quantities introduced by the backoffice """ -from rdflib import URIRef, Graph, Namespace - import argparse +from rdflib import URIRef, Graph, Namespace +from config import TTLPATH rdf = Namespace("http://www.w3.org/1999/02/22-rdf-syntax-ns#") skos = Namespace("http://www.w3.org/2004/02/skos/core#") si = Namespace("https://si-digital-framework.org/SI#") qty = Namespace("https://si-digital-framework.org/quantities/") + def get_unit(g, obj): if not obj.isidentifier(): # This a leaf of the binary tree, return the code of the unit, power 1 return [str(obj).split('/')[-1] , 1] else: + rdftype = None for s, p, o in list(g.triples((obj, URIRef(rdf + 'type'), None))): rdftype = o + left_term, right_term = None, None if rdftype == URIRef(si + 'UnitProduct'): - for s, p, o in list(g.triples((obj, - URIRef(si + 'hasLeftUnitTerm'), - None))): + for s, p, o in list(g.triples((obj, URIRef(si + 'hasLeftUnitTerm'), None))): left_term = get_unit(g, o) - for s, p, o in list(g.triples((obj, - URIRef(si + 'hasRightUnitTerm'), - None))): + for s, p, o in list(g.triples((obj, URIRef(si + 'hasRightUnitTerm'), None))): right_term = get_unit(g, o) return [left_term, right_term] elif rdftype == URIRef(si + 'UnitPower'): - for s, p, o in list(g.triples((obj, - URIRef(si + 'hasNumericExponent'), - None))): + num_ex = None + for s, p, o in list(g.triples((obj, URIRef(si + 'hasNumericExponent'), None))): num_ex = o.value - for s, p, o in list(g.triples((obj, - URIRef(si + 'hasUnitBase'), - None))): + unit = None + for s, p, o in list(g.triples((obj, URIRef(si + 'hasUnitBase'), None))): unit = get_unit(g, o) unit[1] = num_ex return unit + else: + return None + def flatten_units(units): """ flatten the binary tree @@ -49,27 +49,25 @@ def flatten_units(units): return [units] elif isinstance(units[0], list) and isinstance(units[1], list): return flatten_units(units[0]) + flatten_units(units[1]) + else: + return None + def main(): - parser = argparse.ArgumentParser(description="Convert quantitities TTL to YAML") + parser = argparse.ArgumentParser(description="Convert the quantities TTL to YAML") parser.add_argument("-v", "--verbose", action="store_true") parser.add_argument( - "input_TTL", type=str, - help="The input quantities knowdledge graphe, serialized as TTL" + "input_TTL", default=TTLPATH / 'quantities.ttl', type=str, + help="The input quantities knowledge graph, serialized as TTL" ) args = parser.parse_args() - g = Graph() g.parse(args.input_TTL, format="n3") # Get list of quantities 4-char ids qty_list = [] - for s, p, o in list(g.triples((None, - URIRef(rdf + 'type'), - URIRef(si + "QuantityKind") - ))): - + for s, p, o in list(g.triples((None, URIRef(rdf + 'type'), URIRef(si + "QuantityKind")))): q_id = str(s).split('/')[-1] if q_id not in qty_list: qty_list.append(q_id) @@ -79,17 +77,12 @@ def main(): for q_id in qty_list: buf = {'identifier': q_id} quantity = URIRef(qty + q_id) - for s, p, o in list(g.triples((quantity, - URIRef(skos + "prefLabel"), - None))): + for s, p, o in list(g.triples((quantity, URIRef(skos + "prefLabel"), None))): buf['quantity-' + o.language] = str(o) - for s, p, o in list(g.triples((quantity, - URIRef(si + "hasUnit"), - None))): - buf['Unit'] = get_unit(g, o) + for s, p, o in list(g.triples((quantity, URIRef(si + "hasUnit"), None))): + buf['Unit'] = get_unit(g, o.language) output.append(buf) - print('Number of quantity kinds : {}'.format(len(qty_list))) with open('output.yaml', 'w') as fp: diff --git a/tests/reasoning/examples.ttl b/tests/reasoning/examples.ttl new file mode 100644 index 0000000..a4252ee --- /dev/null +++ b/tests/reasoning/examples.ttl @@ -0,0 +1,48 @@ +@prefix owl: . +@prefix rdfs: . +@prefix xsd: . + +@prefix si: . +@prefix units: . +@prefix quantities: . +@prefix prefixes: . + + +############################################### +########### TESTING INDIVIDUALS ############### +############################################### + +@prefix ex: . + +ex:nanosecond a si:PrefixedUnit ; + si:hasUnitBase units:second ; + si:hasPrefix prefixes:nano . + +ex:millimetre a si:PrefixedUnit ; + si:hasUnitBase units:metre ; + si:hasPrefix prefixes:milli . + +ex:millimetre_alt a si:UnitMultiple ; + si:hasNumericFactor 0.001 ; + si:hasUnitBase units:metre . + +ex:voltmetre a si:UnitProduct ; + si:hasLeftUnitTerm units:volt ; + si:hasRightUnitTerm units:metre . + +ex:foot a si:UnitMultiple ; + si:hasNumericFactor "0.3048"^^xsd:decimal; + si:hasUnitBase units:metre . + +ex:voltmillimetre a si:UnitProduct ; + si:hasLeftUnitTerm units:volt ; + si:hasRightUnitTerm ex:millimetre . + +ex:newton a si:UnitProduct ; + si:hasLeftUnitTerm [ a si:UnitProduct ; + si:hasLeftUnitTerm units:metre ; + si:hasRightUnitTerm units:kilogram ; ] ; + si:hasRightUnitTerm [ a si:UnitPower ; + si:hasNumericExponent "-1"^^xsd:short ; + si:hasUnitBase units:second ; + ] . diff --git a/Testing/testing_with_complete_reasoner.py b/tests/reasoning/reasoner.py similarity index 87% rename from Testing/testing_with_complete_reasoner.py rename to tests/reasoning/reasoner.py index aab9550..05d0335 100644 --- a/Testing/testing_with_complete_reasoner.py +++ b/tests/reasoning/reasoner.py @@ -1,8 +1,11 @@ +""" Test the SI graph with a reasoner """ + import owlrl import rdflib from rdflib import OWL, RDF, RDFS import io from owlready2 import World, sync_reasoner_pellet, sync_reasoner_hermit +from config import TTLPATH # script parameters do_RDFS_completion = True # infer rdfs hierarchies @@ -13,13 +16,13 @@ do_OWLDL_with_Pellet = True knowledge_bases = { - #"test": {"path": "testing.ttl", "format": "ttl"}, - "si_base": {"path": "../TTL/si.ttl", "format": "ttl"}, - "units": {"path": "../TTL/units.ttl", "format": "ttl"}, - "quantities": {"path": "../TTL/quantities.ttl", "format": "ttl"}, - "prefixes": {"path": "../TTL/prefixes.ttl", "format": "ttl"}, - "constants": {"path": "../TTL/constants.ttl", "format": "ttl"}, - "examples": {"path": "./examples.ttl", "format": "ttl"}, + # "tests": {"path": "testing.ttl", "format": "ttl"}, + "si_base": {"path": TTLPATH / "si.ttl", "format": "ttl"}, + "units": {"path": TTLPATH / "units.ttl", "format": "ttl"}, + "quantities": {"path": TTLPATH / "quantities.ttl", "format": "ttl"}, + "prefixes": {"path": TTLPATH / "prefixes.ttl", "format": "ttl"}, + "constants": {"path": TTLPATH / "constants.ttl", "format": "ttl"}, + "examples": {"path": "examples.ttl", "format": "ttl"}, } diff --git a/tests/shacl/lib/bindings/utils.js b/tests/shacl/lib/bindings/utils.js new file mode 100644 index 0000000..088effe --- /dev/null +++ b/tests/shacl/lib/bindings/utils.js @@ -0,0 +1,189 @@ +function neighbourhoodHighlight(params) { + // console.log("in nieghbourhoodhighlight"); + allNodes = nodes.get({ returnType: "Object" }); + // originalNodes = JSON.parse(JSON.stringify(allNodes)); + // if something is selected: + if (params.nodes.length > 0) { + highlightActive = true; + var i, j; + var selectedNode = params.nodes[0]; + var degrees = 2; + + // mark all nodes as hard to read. + for (let nodeId in allNodes) { + // nodeColors[nodeId] = allNodes[nodeId].color; + allNodes[nodeId].color = "rgba(200,200,200,0.5)"; + if (allNodes[nodeId].hiddenLabel === undefined) { + allNodes[nodeId].hiddenLabel = allNodes[nodeId].label; + allNodes[nodeId].label = undefined; + } + } + var connectedNodes = network.getConnectedNodes(selectedNode); + var allConnectedNodes = []; + + // get the second degree nodes + for (i = 1; i < degrees; i++) { + for (j = 0; j < connectedNodes.length; j++) { + allConnectedNodes = allConnectedNodes.concat( + network.getConnectedNodes(connectedNodes[j]) + ); + } + } + + // all second degree nodes get a different color and their label back + for (i = 0; i < allConnectedNodes.length; i++) { + // allNodes[allConnectedNodes[i]].color = "pink"; + allNodes[allConnectedNodes[i]].color = "rgba(150,150,150,0.75)"; + if (allNodes[allConnectedNodes[i]].hiddenLabel !== undefined) { + allNodes[allConnectedNodes[i]].label = + allNodes[allConnectedNodes[i]].hiddenLabel; + allNodes[allConnectedNodes[i]].hiddenLabel = undefined; + } + } + + // all first degree nodes get their own color and their label back + for (i = 0; i < connectedNodes.length; i++) { + // allNodes[connectedNodes[i]].color = undefined; + allNodes[connectedNodes[i]].color = nodeColors[connectedNodes[i]]; + if (allNodes[connectedNodes[i]].hiddenLabel !== undefined) { + allNodes[connectedNodes[i]].label = + allNodes[connectedNodes[i]].hiddenLabel; + allNodes[connectedNodes[i]].hiddenLabel = undefined; + } + } + + // the main node gets its own color and its label back. + // allNodes[selectedNode].color = undefined; + allNodes[selectedNode].color = nodeColors[selectedNode]; + if (allNodes[selectedNode].hiddenLabel !== undefined) { + allNodes[selectedNode].label = allNodes[selectedNode].hiddenLabel; + allNodes[selectedNode].hiddenLabel = undefined; + } + } else if (highlightActive === true) { + // console.log("highlightActive was true"); + // reset all nodes + for (let nodeId in allNodes) { + // allNodes[nodeId].color = "purple"; + allNodes[nodeId].color = nodeColors[nodeId]; + // delete allNodes[nodeId].color; + if (allNodes[nodeId].hiddenLabel !== undefined) { + allNodes[nodeId].label = allNodes[nodeId].hiddenLabel; + allNodes[nodeId].hiddenLabel = undefined; + } + } + highlightActive = false; + } + + // transform the object into an array + var updateArray = []; + if (params.nodes.length > 0) { + for (let nodeId in allNodes) { + if (allNodes.hasOwnProperty(nodeId)) { + // console.log(allNodes[nodeId]); + updateArray.push(allNodes[nodeId]); + } + } + nodes.update(updateArray); + } else { + // console.log("Nothing was selected"); + for (let nodeId in allNodes) { + if (allNodes.hasOwnProperty(nodeId)) { + // console.log(allNodes[nodeId]); + // allNodes[nodeId].color = {}; + updateArray.push(allNodes[nodeId]); + } + } + nodes.update(updateArray); + } +} + +function filterHighlight(params) { + allNodes = nodes.get({ returnType: "Object" }); + // if something is selected: + if (params.nodes.length > 0) { + filterActive = true; + let selectedNodes = params.nodes; + + // hiding all nodes and saving the label + for (let nodeId in allNodes) { + allNodes[nodeId].hidden = true; + if (allNodes[nodeId].savedLabel === undefined) { + allNodes[nodeId].savedLabel = allNodes[nodeId].label; + allNodes[nodeId].label = undefined; + } + } + + for (let i=0; i < selectedNodes.length; i++) { + allNodes[selectedNodes[i]].hidden = false; + if (allNodes[selectedNodes[i]].savedLabel !== undefined) { + allNodes[selectedNodes[i]].label = allNodes[selectedNodes[i]].savedLabel; + allNodes[selectedNodes[i]].savedLabel = undefined; + } + } + + } else if (filterActive === true) { + // reset all nodes + for (let nodeId in allNodes) { + allNodes[nodeId].hidden = false; + if (allNodes[nodeId].savedLabel !== undefined) { + allNodes[nodeId].label = allNodes[nodeId].savedLabel; + allNodes[nodeId].savedLabel = undefined; + } + } + filterActive = false; + } + + // transform the object into an array + var updateArray = []; + if (params.nodes.length > 0) { + for (let nodeId in allNodes) { + if (allNodes.hasOwnProperty(nodeId)) { + updateArray.push(allNodes[nodeId]); + } + } + nodes.update(updateArray); + } else { + for (let nodeId in allNodes) { + if (allNodes.hasOwnProperty(nodeId)) { + updateArray.push(allNodes[nodeId]); + } + } + nodes.update(updateArray); + } +} + +function selectNode(nodes) { + network.selectNodes(nodes); + neighbourhoodHighlight({ nodes: nodes }); + return nodes; +} + +function selectNodes(nodes) { + network.selectNodes(nodes); + filterHighlight({nodes: nodes}); + return nodes; +} + +function highlightFilter(filter) { + let selectedNodes = [] + let selectedProp = filter['property'] + if (filter['item'] === 'node') { + let allNodes = nodes.get({ returnType: "Object" }); + for (let nodeId in allNodes) { + if (allNodes[nodeId][selectedProp] && filter['value'].includes((allNodes[nodeId][selectedProp]).toString())) { + selectedNodes.push(nodeId) + } + } + } + else if (filter['item'] === 'edge'){ + let allEdges = edges.get({returnType: 'object'}); + // check if the selected property exists for selected edge and select the nodes connected to the edge + for (let edge in allEdges) { + if (allEdges[edge][selectedProp] && filter['value'].includes((allEdges[edge][selectedProp]).toString())) { + selectedNodes.push(allEdges[edge]['from']) + selectedNodes.push(allEdges[edge]['to']) + } + } + } + selectNodes(selectedNodes) +} \ No newline at end of file diff --git a/tests/shacl/lib/tom-select/tom-select.complete.min.js b/tests/shacl/lib/tom-select/tom-select.complete.min.js new file mode 100644 index 0000000..e2e0211 --- /dev/null +++ b/tests/shacl/lib/tom-select/tom-select.complete.min.js @@ -0,0 +1,356 @@ +/** +* Tom Select v2.0.0-rc.4 +* Licensed under the Apache License, Version 2.0 (the "License"); +*/ +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).TomSelect=t()}(this,(function(){"use strict" +function e(e,t){e.split(/\s+/).forEach((e=>{t(e)}))}class t{constructor(){this._events={}}on(t,i){e(t,(e=>{this._events[e]=this._events[e]||[],this._events[e].push(i)}))}off(t,i){var s=arguments.length +0!==s?e(t,(e=>{if(1===s)return delete this._events[e] +e in this._events!=!1&&this._events[e].splice(this._events[e].indexOf(i),1)})):this._events={}}trigger(t,...i){var s=this +e(t,(e=>{if(e in s._events!=!1)for(let t of s._events[e])t.apply(s,i)}))}}var i +const s="[̀-ͯ·ʾ]",n=new RegExp(s,"g") +var o +const r={"æ":"ae","ⱥ":"a","ø":"o"},l=new RegExp(Object.keys(r).join("|"),"g"),a=[[67,67],[160,160],[192,438],[452,652],[961,961],[1019,1019],[1083,1083],[1281,1289],[1984,1984],[5095,5095],[7429,7441],[7545,7549],[7680,7935],[8580,8580],[9398,9449],[11360,11391],[42792,42793],[42802,42851],[42873,42897],[42912,42922],[64256,64260],[65313,65338],[65345,65370]],c=e=>e.normalize("NFKD").replace(n,"").toLowerCase().replace(l,(function(e){return r[e]})),d=(e,t="|")=>{if(1==e.length)return e[0] +var i=1 +return e.forEach((e=>{i=Math.max(i,e.length)})),1==i?"["+e.join("")+"]":"(?:"+e.join(t)+")"},p=e=>{if(1===e.length)return[[e]] +var t=[] +return p(e.substring(1)).forEach((function(i){var s=i.slice(0) +s[0]=e.charAt(0)+s[0],t.push(s),(s=i.slice(0)).unshift(e.charAt(0)),t.push(s)})),t},u=e=>{void 0===o&&(o=(()=>{var e={} +a.forEach((t=>{for(let s=t[0];s<=t[1];s++){let t=String.fromCharCode(s),n=c(t) +if(n!=t.toLowerCase()){n in e||(e[n]=[n]) +var i=new RegExp(d(e[n]),"iu") +t.match(i)||e[n].push(t)}}})) +var t=Object.keys(e) +t=t.sort(((e,t)=>t.length-e.length)),i=new RegExp("("+d(t)+"[̀-ͯ·ʾ]*)","g") +var s={} +return t.sort(((e,t)=>e.length-t.length)).forEach((t=>{var i=p(t).map((t=>(t=t.map((t=>e.hasOwnProperty(t)?d(e[t]):t)),d(t,"")))) +s[t]=d(i)})),s})()) +return e.normalize("NFKD").toLowerCase().split(i).map((e=>{if(""==e)return"" +const t=c(e) +if(o.hasOwnProperty(t))return o[t] +const i=e.normalize("NFC") +return i!=e?d([e,i]):e})).join("")},h=(e,t)=>{if(e)return e[t]},g=(e,t)=>{if(e){for(var i,s=t.split(".");(i=s.shift())&&(e=e[i]););return e}},f=(e,t,i)=>{var s,n +return e?-1===(n=(e+="").search(t.regex))?0:(s=t.string.length/e.length,0===n&&(s+=.5),s*i):0},v=e=>(e+"").replace(/([\$\(-\+\.\?\[-\^\{-\}])/g,"\\$1"),m=(e,t)=>{var i=e[t] +if("function"==typeof i)return i +i&&!Array.isArray(i)&&(e[t]=[i])},y=(e,t)=>{if(Array.isArray(e))e.forEach(t) +else for(var i in e)e.hasOwnProperty(i)&&t(e[i],i)},O=(e,t)=>"number"==typeof e&&"number"==typeof t?e>t?1:e(t=c(t+"").toLowerCase())?1:t>e?-1:0 +class b{constructor(e,t){this.items=e,this.settings=t||{diacritics:!0}}tokenize(e,t,i){if(!e||!e.length)return[] +const s=[],n=e.split(/\s+/) +var o +return i&&(o=new RegExp("^("+Object.keys(i).map(v).join("|")+"):(.*)$")),n.forEach((e=>{let i,n=null,r=null +o&&(i=e.match(o))&&(n=i[1],e=i[2]),e.length>0&&(r=v(e),this.settings.diacritics&&(r=u(r)),t&&(r="\\b"+r)),s.push({string:e,regex:r?new RegExp(r,"iu"):null,field:n})})),s}getScoreFunction(e,t){var i=this.prepareSearch(e,t) +return this._getScoreFunction(i)}_getScoreFunction(e){const t=e.tokens,i=t.length +if(!i)return function(){return 0} +const s=e.options.fields,n=e.weights,o=s.length,r=e.getAttrFn +if(!o)return function(){return 1} +const l=1===o?function(e,t){const i=s[0].field +return f(r(t,i),e,n[i])}:function(e,t){var i=0 +if(e.field){const s=r(t,e.field) +!e.regex&&s?i+=1/o:i+=f(s,e,1)}else y(n,((s,n)=>{i+=f(r(t,n),e,s)})) +return i/o} +return 1===i?function(e){return l(t[0],e)}:"and"===e.options.conjunction?function(e){for(var s,n=0,o=0;n{s+=l(t,e)})),s/i}}getSortFunction(e,t){var i=this.prepareSearch(e,t) +return this._getSortFunction(i)}_getSortFunction(e){var t,i,s +const n=this,o=e.options,r=!e.query&&o.sort_empty?o.sort_empty:o.sort,l=[],a=[] +if("function"==typeof r)return r.bind(this) +const c=function(t,i){return"$score"===t?i.score:e.getAttrFn(n.items[i.id],t)} +if(r)for(t=0,i=r.length;t{"string"==typeof t&&(t={field:t,weight:1}),e.push(t),i[t.field]="weight"in t?t.weight:1})),s.fields=e}return{options:s,query:e.toLowerCase().trim(),tokens:this.tokenize(e,s.respect_word_boundaries,i),total:0,items:[],weights:i,getAttrFn:s.nesting?g:h}}search(e,t){var i,s,n=this +s=this.prepareSearch(e,t),t=s.options,e=s.query +const o=t.score||n._getScoreFunction(s) +e.length?y(n.items,((e,n)=>{i=o(e),(!1===t.filter||i>0)&&s.items.push({score:i,id:n})})):y(n.items,((e,t)=>{s.items.push({score:1,id:t})})) +const r=n._getSortFunction(s) +return r&&s.items.sort(r),s.total=s.items.length,"number"==typeof t.limit&&(s.items=s.items.slice(0,t.limit)),s}}const w=e=>{if(e.jquery)return e[0] +if(e instanceof HTMLElement)return e +if(e.indexOf("<")>-1){let t=document.createElement("div") +return t.innerHTML=e.trim(),t.firstChild}return document.querySelector(e)},_=(e,t)=>{var i=document.createEvent("HTMLEvents") +i.initEvent(t,!0,!1),e.dispatchEvent(i)},I=(e,t)=>{Object.assign(e.style,t)},C=(e,...t)=>{var i=A(t);(e=x(e)).map((e=>{i.map((t=>{e.classList.add(t)}))}))},S=(e,...t)=>{var i=A(t);(e=x(e)).map((e=>{i.map((t=>{e.classList.remove(t)}))}))},A=e=>{var t=[] +return y(e,(e=>{"string"==typeof e&&(e=e.trim().split(/[\11\12\14\15\40]/)),Array.isArray(e)&&(t=t.concat(e))})),t.filter(Boolean)},x=e=>(Array.isArray(e)||(e=[e]),e),k=(e,t,i)=>{if(!i||i.contains(e))for(;e&&e.matches;){if(e.matches(t))return e +e=e.parentNode}},F=(e,t=0)=>t>0?e[e.length-1]:e[0],L=(e,t)=>{if(!e)return-1 +t=t||e.nodeName +for(var i=0;e=e.previousElementSibling;)e.matches(t)&&i++ +return i},P=(e,t)=>{y(t,((t,i)=>{null==t?e.removeAttribute(i):e.setAttribute(i,""+t)}))},E=(e,t)=>{e.parentNode&&e.parentNode.replaceChild(t,e)},T=(e,t)=>{if(null===t)return +if("string"==typeof t){if(!t.length)return +t=new RegExp(t,"i")}const i=e=>3===e.nodeType?(e=>{var i=e.data.match(t) +if(i&&e.data.length>0){var s=document.createElement("span") +s.className="highlight" +var n=e.splitText(i.index) +n.splitText(i[0].length) +var o=n.cloneNode(!0) +return s.appendChild(o),E(n,s),1}return 0})(e):((e=>{if(1===e.nodeType&&e.childNodes&&!/(script|style)/i.test(e.tagName)&&("highlight"!==e.className||"SPAN"!==e.tagName))for(var t=0;t0},render:{}} +const q=e=>null==e?null:D(e),D=e=>"boolean"==typeof e?e?"1":"0":e+"",N=e=>(e+"").replace(/&/g,"&").replace(//g,">").replace(/"/g,"""),z=(e,t)=>{var i +return function(s,n){var o=this +i&&(o.loading=Math.max(o.loading-1,0),clearTimeout(i)),i=setTimeout((function(){i=null,o.loadedSearches[s]=!0,e.call(o,s,n)}),t)}},R=(e,t,i)=>{var s,n=e.trigger,o={} +for(s in e.trigger=function(){var i=arguments[0] +if(-1===t.indexOf(i))return n.apply(e,arguments) +o[i]=arguments},i.apply(e,[]),e.trigger=n,o)n.apply(e,o[s])},H=(e,t=!1)=>{e&&(e.preventDefault(),t&&e.stopPropagation())},B=(e,t,i,s)=>{e.addEventListener(t,i,s)},K=(e,t)=>!!t&&(!!t[e]&&1===(t.altKey?1:0)+(t.ctrlKey?1:0)+(t.shiftKey?1:0)+(t.metaKey?1:0)),M=(e,t)=>{const i=e.getAttribute("id") +return i||(e.setAttribute("id",t),t)},Q=e=>e.replace(/[\\"']/g,"\\$&"),G=(e,t)=>{t&&e.append(t)} +function U(e,t){var i=Object.assign({},j,t),s=i.dataAttr,n=i.labelField,o=i.valueField,r=i.disabledField,l=i.optgroupField,a=i.optgroupLabelField,c=i.optgroupValueField,d=e.tagName.toLowerCase(),p=e.getAttribute("placeholder")||e.getAttribute("data-placeholder") +if(!p&&!i.allowEmptyOption){let t=e.querySelector('option[value=""]') +t&&(p=t.textContent)}var u,h,g,f,v,m,O={placeholder:p,options:[],optgroups:[],items:[],maxItems:null} +return"select"===d?(h=O.options,g={},f=1,v=e=>{var t=Object.assign({},e.dataset),i=s&&t[s] +return"string"==typeof i&&i.length&&(t=Object.assign(t,JSON.parse(i))),t},m=(e,t)=>{var s=q(e.value) +if(null!=s&&(s||i.allowEmptyOption)){if(g.hasOwnProperty(s)){if(t){var a=g[s][l] +a?Array.isArray(a)?a.push(t):g[s][l]=[a,t]:g[s][l]=t}}else{var c=v(e) +c[n]=c[n]||e.textContent,c[o]=c[o]||s,c[r]=c[r]||e.disabled,c[l]=c[l]||t,c.$option=e,g[s]=c,h.push(c)}e.selected&&O.items.push(s)}},O.maxItems=e.hasAttribute("multiple")?null:1,y(e.children,(e=>{var t,i,s +"optgroup"===(u=e.tagName.toLowerCase())?((s=v(t=e))[a]=s[a]||t.getAttribute("label")||"",s[c]=s[c]||f++,s[r]=s[r]||t.disabled,O.optgroups.push(s),i=s[c],y(t.children,(e=>{m(e,i)}))):"option"===u&&m(e)}))):(()=>{const t=e.getAttribute(s) +if(t)O.options=JSON.parse(t),y(O.options,(e=>{O.items.push(e[o])})) +else{var r=e.value.trim()||"" +if(!i.allowEmptyOption&&!r.length)return +const t=r.split(i.delimiter) +y(t,(e=>{const t={} +t[n]=e,t[o]=e,O.options.push(t)})),O.items=t}})(),Object.assign({},j,O,t)}var W=0 +class J extends(function(e){return e.plugins={},class extends e{constructor(...e){super(...e),this.plugins={names:[],settings:{},requested:{},loaded:{}}}static define(t,i){e.plugins[t]={name:t,fn:i}}initializePlugins(e){var t,i +const s=this,n=[] +if(Array.isArray(e))e.forEach((e=>{"string"==typeof e?n.push(e):(s.plugins.settings[e.name]=e.options,n.push(e.name))})) +else if(e)for(t in e)e.hasOwnProperty(t)&&(s.plugins.settings[t]=e[t],n.push(t)) +for(;i=n.shift();)s.require(i)}loadPlugin(t){var i=this,s=i.plugins,n=e.plugins[t] +if(!e.plugins.hasOwnProperty(t))throw new Error('Unable to find "'+t+'" plugin') +s.requested[t]=!0,s.loaded[t]=n.fn.apply(i,[i.plugins.settings[t]||{}]),s.names.push(t)}require(e){var t=this,i=t.plugins +if(!t.plugins.loaded.hasOwnProperty(e)){if(i.requested[e])throw new Error('Plugin has circular dependency ("'+e+'")') +t.loadPlugin(e)}return i.loaded[e]}}}(t)){constructor(e,t){var i +super(),this.order=0,this.isOpen=!1,this.isDisabled=!1,this.isInvalid=!1,this.isValid=!0,this.isLocked=!1,this.isFocused=!1,this.isInputHidden=!1,this.isSetup=!1,this.ignoreFocus=!1,this.hasOptions=!1,this.lastValue="",this.caretPos=0,this.loading=0,this.loadedSearches={},this.activeOption=null,this.activeItems=[],this.optgroups={},this.options={},this.userOptions={},this.items=[],W++ +var s=w(e) +if(s.tomselect)throw new Error("Tom Select already initialized on this element") +s.tomselect=this,i=(window.getComputedStyle&&window.getComputedStyle(s,null)).getPropertyValue("direction") +const n=U(s,t) +this.settings=n,this.input=s,this.tabIndex=s.tabIndex||0,this.is_select_tag="select"===s.tagName.toLowerCase(),this.rtl=/rtl/i.test(i),this.inputId=M(s,"tomselect-"+W),this.isRequired=s.required,this.sifter=new b(this.options,{diacritics:n.diacritics}),n.mode=n.mode||(1===n.maxItems?"single":"multi"),"boolean"!=typeof n.hideSelected&&(n.hideSelected="multi"===n.mode),"boolean"!=typeof n.hidePlaceholder&&(n.hidePlaceholder="multi"!==n.mode) +var o=n.createFilter +"function"!=typeof o&&("string"==typeof o&&(o=new RegExp(o)),o instanceof RegExp?n.createFilter=e=>o.test(e):n.createFilter=()=>!0),this.initializePlugins(n.plugins),this.setupCallbacks(),this.setupTemplates() +const r=w("
"),l=w("
"),a=this._render("dropdown"),c=w('
'),d=this.input.getAttribute("class")||"",p=n.mode +var u +if(C(r,n.wrapperClass,d,p),C(l,n.controlClass),G(r,l),C(a,n.dropdownClass,p),n.copyClassesToDropdown&&C(a,d),C(c,n.dropdownContentClass),G(a,c),w(n.dropdownParent||r).appendChild(a),n.hasOwnProperty("controlInput"))n.controlInput?(u=w(n.controlInput),this.focus_node=u):(u=w(""),this.focus_node=l) +else{u=w('') +y(["autocorrect","autocapitalize","autocomplete"],(e=>{s.getAttribute(e)&&P(u,{[e]:s.getAttribute(e)})})),u.tabIndex=-1,l.appendChild(u),this.focus_node=u}this.wrapper=r,this.dropdown=a,this.dropdown_content=c,this.control=l,this.control_input=u,this.setup()}setup(){const e=this,t=e.settings,i=e.control_input,s=e.dropdown,n=e.dropdown_content,o=e.wrapper,r=e.control,l=e.input,a=e.focus_node,c={passive:!0},d=e.inputId+"-ts-dropdown" +P(n,{id:d}),P(a,{role:"combobox","aria-haspopup":"listbox","aria-expanded":"false","aria-controls":d}) +const p=M(a,e.inputId+"-ts-control"),u="label[for='"+(e=>e.replace(/['"\\]/g,"\\$&"))(e.inputId)+"']",h=document.querySelector(u),g=e.focus.bind(e) +if(h){B(h,"click",g),P(h,{for:p}) +const t=M(h,e.inputId+"-ts-label") +P(a,{"aria-labelledby":t}),P(n,{"aria-labelledby":t})}if(o.style.width=l.style.width,e.plugins.names.length){const t="plugin-"+e.plugins.names.join(" plugin-") +C([o,s],t)}(null===t.maxItems||t.maxItems>1)&&e.is_select_tag&&P(l,{multiple:"multiple"}),e.settings.placeholder&&P(i,{placeholder:t.placeholder}),!e.settings.splitOn&&e.settings.delimiter&&(e.settings.splitOn=new RegExp("\\s*"+v(e.settings.delimiter)+"+\\s*")),t.load&&t.loadThrottle&&(t.load=z(t.load,t.loadThrottle)),e.control_input.type=l.type,B(s,"click",(t=>{const i=k(t.target,"[data-selectable]") +i&&(e.onOptionSelect(t,i),H(t,!0))})),B(r,"click",(t=>{var s=k(t.target,"[data-ts-item]",r) +s&&e.onItemSelect(t,s)?H(t,!0):""==i.value&&(e.onClick(),H(t,!0))})),B(i,"mousedown",(e=>{""!==i.value&&e.stopPropagation()})),B(a,"keydown",(t=>e.onKeyDown(t))),B(i,"keypress",(t=>e.onKeyPress(t))),B(i,"input",(t=>e.onInput(t))),B(a,"resize",(()=>e.positionDropdown()),c),B(a,"blur",(t=>e.onBlur(t))),B(a,"focus",(t=>e.onFocus(t))),B(a,"paste",(t=>e.onPaste(t))) +const f=t=>{const i=t.composedPath()[0] +if(!o.contains(i)&&!s.contains(i))return e.isFocused&&e.blur(),void e.inputState() +H(t,!0)} +var m=()=>{e.isOpen&&e.positionDropdown()} +B(document,"mousedown",f),B(window,"scroll",m,c),B(window,"resize",m,c),this._destroy=()=>{document.removeEventListener("mousedown",f),window.removeEventListener("sroll",m),window.removeEventListener("resize",m),h&&h.removeEventListener("click",g)},this.revertSettings={innerHTML:l.innerHTML,tabIndex:l.tabIndex},l.tabIndex=-1,l.insertAdjacentElement("afterend",e.wrapper),e.sync(!1),t.items=[],delete t.optgroups,delete t.options,B(l,"invalid",(t=>{e.isValid&&(e.isValid=!1,e.isInvalid=!0,e.refreshState())})),e.updateOriginalInput(),e.refreshItems(),e.close(!1),e.inputState(),e.isSetup=!0,l.disabled?e.disable():e.enable(),e.on("change",this.onChange),C(l,"tomselected","ts-hidden-accessible"),e.trigger("initialize"),!0===t.preload&&e.preload()}setupOptions(e=[],t=[]){this.addOptions(e),y(t,(e=>{this.registerOptionGroup(e)}))}setupTemplates(){var e=this,t=e.settings.labelField,i=e.settings.optgroupLabelField,s={optgroup:e=>{let t=document.createElement("div") +return t.className="optgroup",t.appendChild(e.options),t},optgroup_header:(e,t)=>'
'+t(e[i])+"
",option:(e,i)=>"
"+i(e[t])+"
",item:(e,i)=>"
"+i(e[t])+"
",option_create:(e,t)=>'
Add '+t(e.input)+"
",no_results:()=>'
No results found
',loading:()=>'
',not_loading:()=>{},dropdown:()=>"
"} +e.settings.render=Object.assign({},s,e.settings.render)}setupCallbacks(){var e,t,i={initialize:"onInitialize",change:"onChange",item_add:"onItemAdd",item_remove:"onItemRemove",item_select:"onItemSelect",clear:"onClear",option_add:"onOptionAdd",option_remove:"onOptionRemove",option_clear:"onOptionClear",optgroup_add:"onOptionGroupAdd",optgroup_remove:"onOptionGroupRemove",optgroup_clear:"onOptionGroupClear",dropdown_open:"onDropdownOpen",dropdown_close:"onDropdownClose",type:"onType",load:"onLoad",focus:"onFocus",blur:"onBlur"} +for(e in i)(t=this.settings[i[e]])&&this.on(e,t)}sync(e=!0){const t=this,i=e?U(t.input,{delimiter:t.settings.delimiter}):t.settings +t.setupOptions(i.options,i.optgroups),t.setValue(i.items,!0),t.lastQuery=null}onClick(){var e=this +if(e.activeItems.length>0)return e.clearActiveItems(),void e.focus() +e.isFocused&&e.isOpen?e.blur():e.focus()}onMouseDown(){}onChange(){_(this.input,"input"),_(this.input,"change")}onPaste(e){var t=this +t.isFull()||t.isInputHidden||t.isLocked?H(e):t.settings.splitOn&&setTimeout((()=>{var e=t.inputValue() +if(e.match(t.settings.splitOn)){var i=e.trim().split(t.settings.splitOn) +y(i,(e=>{t.createItem(e)}))}}),0)}onKeyPress(e){var t=this +if(!t.isLocked){var i=String.fromCharCode(e.keyCode||e.which) +return t.settings.create&&"multi"===t.settings.mode&&i===t.settings.delimiter?(t.createItem(),void H(e)):void 0}H(e)}onKeyDown(e){var t=this +if(t.isLocked)9!==e.keyCode&&H(e) +else{switch(e.keyCode){case 65:if(K(V,e))return H(e),void t.selectAll() +break +case 27:return t.isOpen&&(H(e,!0),t.close()),void t.clearActiveItems() +case 40:if(!t.isOpen&&t.hasOptions)t.open() +else if(t.activeOption){let e=t.getAdjacent(t.activeOption,1) +e&&t.setActiveOption(e)}return void H(e) +case 38:if(t.activeOption){let e=t.getAdjacent(t.activeOption,-1) +e&&t.setActiveOption(e)}return void H(e) +case 13:return void(t.isOpen&&t.activeOption?(t.onOptionSelect(e,t.activeOption),H(e)):t.settings.create&&t.createItem()&&H(e)) +case 37:return void t.advanceSelection(-1,e) +case 39:return void t.advanceSelection(1,e) +case 9:return void(t.settings.selectOnTab&&(t.isOpen&&t.activeOption&&(t.onOptionSelect(e,t.activeOption),H(e)),t.settings.create&&t.createItem()&&H(e))) +case 8:case 46:return void t.deleteSelection(e)}t.isInputHidden&&!K(V,e)&&H(e)}}onInput(e){var t=this +if(!t.isLocked){var i=t.inputValue() +t.lastValue!==i&&(t.lastValue=i,t.settings.shouldLoad.call(t,i)&&t.load(i),t.refreshOptions(),t.trigger("type",i))}}onFocus(e){var t=this,i=t.isFocused +if(t.isDisabled)return t.blur(),void H(e) +t.ignoreFocus||(t.isFocused=!0,"focus"===t.settings.preload&&t.preload(),i||t.trigger("focus"),t.activeItems.length||(t.showInput(),t.refreshOptions(!!t.settings.openOnFocus)),t.refreshState())}onBlur(e){if(!1!==document.hasFocus()){var t=this +if(t.isFocused){t.isFocused=!1,t.ignoreFocus=!1 +var i=()=>{t.close(),t.setActiveItem(),t.setCaret(t.items.length),t.trigger("blur")} +t.settings.create&&t.settings.createOnBlur?t.createItem(null,!1,i):i()}}}onOptionSelect(e,t){var i,s=this +t&&(t.parentElement&&t.parentElement.matches("[data-disabled]")||(t.classList.contains("create")?s.createItem(null,!0,(()=>{s.settings.closeAfterSelect&&s.close()})):void 0!==(i=t.dataset.value)&&(s.lastQuery=null,s.addItem(i),s.settings.closeAfterSelect&&s.close(),!s.settings.hideSelected&&e.type&&/click/.test(e.type)&&s.setActiveOption(t))))}onItemSelect(e,t){var i=this +return!i.isLocked&&"multi"===i.settings.mode&&(H(e),i.setActiveItem(t,e),!0)}canLoad(e){return!!this.settings.load&&!this.loadedSearches.hasOwnProperty(e)}load(e){const t=this +if(!t.canLoad(e))return +C(t.wrapper,t.settings.loadingClass),t.loading++ +const i=t.loadCallback.bind(t) +t.settings.load.call(t,e,i)}loadCallback(e,t){const i=this +i.loading=Math.max(i.loading-1,0),i.lastQuery=null,i.clearActiveOption(),i.setupOptions(e,t),i.refreshOptions(i.isFocused&&!i.isInputHidden),i.loading||S(i.wrapper,i.settings.loadingClass),i.trigger("load",e,t)}preload(){var e=this.wrapper.classList +e.contains("preloaded")||(e.add("preloaded"),this.load(""))}setTextboxValue(e=""){var t=this.control_input +t.value!==e&&(t.value=e,_(t,"update"),this.lastValue=e)}getValue(){return this.is_select_tag&&this.input.hasAttribute("multiple")?this.items:this.items.join(this.settings.delimiter)}setValue(e,t){R(this,t?[]:["change"],(()=>{this.clear(t),this.addItems(e,t)}))}setMaxItems(e){0===e&&(e=null),this.settings.maxItems=e,this.refreshState()}setActiveItem(e,t){var i,s,n,o,r,l,a=this +if("single"!==a.settings.mode){if(!e)return a.clearActiveItems(),void(a.isFocused&&a.showInput()) +if("click"===(i=t&&t.type.toLowerCase())&&K("shiftKey",t)&&a.activeItems.length){for(l=a.getLastActive(),(n=Array.prototype.indexOf.call(a.control.children,l))>(o=Array.prototype.indexOf.call(a.control.children,e))&&(r=n,n=o,o=r),s=n;s<=o;s++)e=a.control.children[s],-1===a.activeItems.indexOf(e)&&a.setActiveItemClass(e) +H(t)}else"click"===i&&K(V,t)||"keydown"===i&&K("shiftKey",t)?e.classList.contains("active")?a.removeActiveItem(e):a.setActiveItemClass(e):(a.clearActiveItems(),a.setActiveItemClass(e)) +a.hideInput(),a.isFocused||a.focus()}}setActiveItemClass(e){const t=this,i=t.control.querySelector(".last-active") +i&&S(i,"last-active"),C(e,"active last-active"),t.trigger("item_select",e),-1==t.activeItems.indexOf(e)&&t.activeItems.push(e)}removeActiveItem(e){var t=this.activeItems.indexOf(e) +this.activeItems.splice(t,1),S(e,"active")}clearActiveItems(){S(this.activeItems,"active"),this.activeItems=[]}setActiveOption(e){e!==this.activeOption&&(this.clearActiveOption(),e&&(this.activeOption=e,P(this.focus_node,{"aria-activedescendant":e.getAttribute("id")}),P(e,{"aria-selected":"true"}),C(e,"active"),this.scrollToOption(e)))}scrollToOption(e,t){if(!e)return +const i=this.dropdown_content,s=i.clientHeight,n=i.scrollTop||0,o=e.offsetHeight,r=e.getBoundingClientRect().top-i.getBoundingClientRect().top+n +r+o>s+n?this.scroll(r-s+o,t):r0||!e.isFocused&&e.settings.hidePlaceholder&&e.items.length>0?(e.setTextboxValue(),e.isInputHidden=!0):(e.settings.hidePlaceholder&&e.items.length>0&&P(e.control_input,{placeholder:""}),e.isInputHidden=!1),e.wrapper.classList.toggle("input-hidden",e.isInputHidden))}hideInput(){this.inputState()}showInput(){this.inputState()}inputValue(){return this.control_input.value.trim()}focus(){var e=this +e.isDisabled||(e.ignoreFocus=!0,e.control_input.offsetWidth?e.control_input.focus():e.focus_node.focus(),setTimeout((()=>{e.ignoreFocus=!1,e.onFocus()}),0))}blur(){this.focus_node.blur(),this.onBlur()}getScoreFunction(e){return this.sifter.getScoreFunction(e,this.getSearchOptions())}getSearchOptions(){var e=this.settings,t=e.sortField +return"string"==typeof e.sortField&&(t=[{field:e.sortField}]),{fields:e.searchField,conjunction:e.searchConjunction,sort:t,nesting:e.nesting}}search(e){var t,i,s,n=this,o=this.getSearchOptions() +if(n.settings.score&&"function"!=typeof(s=n.settings.score.call(n,e)))throw new Error('Tom Select "score" setting must be a function that returns a function') +if(e!==n.lastQuery?(n.lastQuery=e,i=n.sifter.search(e,Object.assign(o,{score:s})),n.currentResults=i):i=Object.assign({},n.currentResults),n.settings.hideSelected)for(t=i.items.length-1;t>=0;t--){let e=q(i.items[t].id) +e&&-1!==n.items.indexOf(e)&&i.items.splice(t,1)}return i}refreshOptions(e=!0){var t,i,s,n,o,r,l,a,c,d,p +const u={},h=[] +var g,f=this,v=f.inputValue(),m=f.search(v),O=f.activeOption,b=f.settings.shouldOpen||!1,w=f.dropdown_content +for(O&&(c=O.dataset.value,d=O.closest("[data-group]")),n=m.items.length,"number"==typeof f.settings.maxOptions&&(n=Math.min(n,f.settings.maxOptions)),n>0&&(b=!0),t=0;t0&&(l=l.cloneNode(!0),P(l,{id:n.$id+"-clone-"+i,"aria-selected":null}),l.classList.add("ts-cloned"),S(l,"active")),c==e&&d&&d.dataset.group===o&&(O=l),u[o].appendChild(l)}this.settings.lockOptgroupOrder&&h.sort(((e,t)=>(f.optgroups[e]&&f.optgroups[e].$order||0)-(f.optgroups[t]&&f.optgroups[t].$order||0))),l=document.createDocumentFragment(),y(h,(e=>{if(f.optgroups.hasOwnProperty(e)&&u[e].children.length){let t=document.createDocumentFragment(),i=f.render("optgroup_header",f.optgroups[e]) +G(t,i),G(t,u[e]) +let s=f.render("optgroup",{group:f.optgroups[e],options:t}) +G(l,s)}else G(l,u[e])})),w.innerHTML="",G(w,l),f.settings.highlight&&(g=w.querySelectorAll("span.highlight"),Array.prototype.forEach.call(g,(function(e){var t=e.parentNode +t.replaceChild(e.firstChild,e),t.normalize()})),m.query.length&&m.tokens.length&&y(m.tokens,(e=>{T(w,e.regex)}))) +var _=e=>{let t=f.render(e,{input:v}) +return t&&(b=!0,w.insertBefore(t,w.firstChild)),t} +if(f.loading?_("loading"):f.settings.shouldLoad.call(f,v)?0===m.items.length&&_("no_results"):_("not_loading"),(a=f.canCreate(v))&&(p=_("option_create")),f.hasOptions=m.items.length>0||a,b){if(m.items.length>0){if(!w.contains(O)&&"single"===f.settings.mode&&f.items.length&&(O=f.getOption(f.items[0])),!w.contains(O)){let e=0 +p&&!f.settings.addPrecedence&&(e=1),O=f.selectable()[e]}}else p&&(O=p) +e&&!f.isOpen&&(f.open(),f.scrollToOption(O,"auto")),f.setActiveOption(O)}else f.clearActiveOption(),e&&f.isOpen&&f.close(!1)}selectable(){return this.dropdown_content.querySelectorAll("[data-selectable]")}addOption(e,t=!1){const i=this +if(Array.isArray(e))return i.addOptions(e,t),!1 +const s=q(e[i.settings.valueField]) +return null!==s&&!i.options.hasOwnProperty(s)&&(e.$order=e.$order||++i.order,e.$id=i.inputId+"-opt-"+e.$order,i.options[s]=e,i.lastQuery=null,t&&(i.userOptions[s]=t,i.trigger("option_add",s,e)),s)}addOptions(e,t=!1){y(e,(e=>{this.addOption(e,t)}))}registerOption(e){return this.addOption(e)}registerOptionGroup(e){var t=q(e[this.settings.optgroupValueField]) +return null!==t&&(e.$order=e.$order||++this.order,this.optgroups[t]=e,t)}addOptionGroup(e,t){var i +t[this.settings.optgroupValueField]=e,(i=this.registerOptionGroup(t))&&this.trigger("optgroup_add",i,t)}removeOptionGroup(e){this.optgroups.hasOwnProperty(e)&&(delete this.optgroups[e],this.clearCache(),this.trigger("optgroup_remove",e))}clearOptionGroups(){this.optgroups={},this.clearCache(),this.trigger("optgroup_clear")}updateOption(e,t){const i=this +var s,n +const o=q(e),r=q(t[i.settings.valueField]) +if(null===o)return +if(!i.options.hasOwnProperty(o))return +if("string"!=typeof r)throw new Error("Value must be set in option data") +const l=i.getOption(o),a=i.getItem(o) +if(t.$order=t.$order||i.options[o].$order,delete i.options[o],i.uncacheValue(r),i.options[r]=t,l){if(i.dropdown_content.contains(l)){const e=i._render("option",t) +E(l,e),i.activeOption===l&&i.setActiveOption(e)}l.remove()}a&&(-1!==(n=i.items.indexOf(o))&&i.items.splice(n,1,r),s=i._render("item",t),a.classList.contains("active")&&C(s,"active"),E(a,s)),i.lastQuery=null}removeOption(e,t){const i=this +e=D(e),i.uncacheValue(e),delete i.userOptions[e],delete i.options[e],i.lastQuery=null,i.trigger("option_remove",e),i.removeItem(e,t)}clearOptions(){this.loadedSearches={},this.userOptions={},this.clearCache() +var e={} +y(this.options,((t,i)=>{this.items.indexOf(i)>=0&&(e[i]=this.options[i])})),this.options=this.sifter.items=e,this.lastQuery=null,this.trigger("option_clear")}getOption(e,t=!1){const i=q(e) +if(null!==i&&this.options.hasOwnProperty(i)){const e=this.options[i] +if(e.$div)return e.$div +if(t)return this._render("option",e)}return null}getAdjacent(e,t,i="option"){var s +if(!e)return null +s="item"==i?this.controlChildren():this.dropdown_content.querySelectorAll("[data-selectable]") +for(let i=0;i0?s[i+1]:s[i-1] +return null}getItem(e){if("object"==typeof e)return e +var t=q(e) +return null!==t?this.control.querySelector(`[data-value="${Q(t)}"]`):null}addItems(e,t){var i=this,s=Array.isArray(e)?e:[e] +for(let e=0,n=(s=s.filter((e=>-1===i.items.indexOf(e)))).length;e{var i,s +const n=this,o=n.settings.mode,r=q(e) +if((!r||-1===n.items.indexOf(r)||("single"===o&&n.close(),"single"!==o&&n.settings.duplicates))&&null!==r&&n.options.hasOwnProperty(r)&&("single"===o&&n.clear(t),"multi"!==o||!n.isFull())){if(i=n._render("item",n.options[r]),n.control.contains(i)&&(i=i.cloneNode(!0)),s=n.isFull(),n.items.splice(n.caretPos,0,r),n.insertAtCaret(i),n.isSetup){if(!n.isPending&&n.settings.hideSelected){let e=n.getOption(r),t=n.getAdjacent(e,1) +t&&n.setActiveOption(t)}n.isPending||n.refreshOptions(n.isFocused&&"single"!==o),0!=n.settings.closeAfterSelect&&n.isFull()?n.close():n.isPending||n.positionDropdown(),n.trigger("item_add",r,i),n.isPending||n.updateOriginalInput({silent:t})}(!n.isPending||!s&&n.isFull())&&(n.inputState(),n.refreshState())}}))}removeItem(e=null,t){const i=this +if(!(e=i.getItem(e)))return +var s,n +const o=e.dataset.value +s=L(e),e.remove(),e.classList.contains("active")&&(n=i.activeItems.indexOf(e),i.activeItems.splice(n,1),S(e,"active")),i.items.splice(s,1),i.lastQuery=null,!i.settings.persist&&i.userOptions.hasOwnProperty(o)&&i.removeOption(o,t),s{})){var s,n=this,o=n.caretPos +if(e=e||n.inputValue(),!n.canCreate(e))return i(),!1 +n.lock() +var r=!1,l=e=>{if(n.unlock(),!e||"object"!=typeof e)return i() +var s=q(e[n.settings.valueField]) +if("string"!=typeof s)return i() +n.setTextboxValue(),n.addOption(e,!0),n.setCaret(o),n.addItem(s),n.refreshOptions(t&&"single"!==n.settings.mode),i(e),r=!0} +return s="function"==typeof n.settings.create?n.settings.create.call(this,e,l):{[n.settings.labelField]:e,[n.settings.valueField]:e},r||l(s),!0}refreshItems(){var e=this +e.lastQuery=null,e.isSetup&&e.addItems(e.items),e.updateOriginalInput(),e.refreshState()}refreshState(){const e=this +e.refreshValidityState() +const t=e.isFull(),i=e.isLocked +e.wrapper.classList.toggle("rtl",e.rtl) +const s=e.wrapper.classList +var n +s.toggle("focus",e.isFocused),s.toggle("disabled",e.isDisabled),s.toggle("required",e.isRequired),s.toggle("invalid",!e.isValid),s.toggle("locked",i),s.toggle("full",t),s.toggle("input-active",e.isFocused&&!e.isInputHidden),s.toggle("dropdown-active",e.isOpen),s.toggle("has-options",(n=e.options,0===Object.keys(n).length)),s.toggle("has-items",e.items.length>0)}refreshValidityState(){var e=this +e.input.checkValidity&&(e.isValid=e.input.checkValidity(),e.isInvalid=!e.isValid)}isFull(){return null!==this.settings.maxItems&&this.items.length>=this.settings.maxItems}updateOriginalInput(e={}){const t=this +var i,s +const n=t.input.querySelector('option[value=""]') +if(t.is_select_tag){const e=[] +function o(i,s,o){return i||(i=w('")),i!=n&&t.input.append(i),e.push(i),i.selected=!0,i}t.input.querySelectorAll("option:checked").forEach((e=>{e.selected=!1})),0==t.items.length&&"single"==t.settings.mode?o(n,"",""):t.items.forEach((n=>{if(i=t.options[n],s=i[t.settings.labelField]||"",e.includes(i.$option)){o(t.input.querySelector(`option[value="${Q(n)}"]:not(:checked)`),n,s)}else i.$option=o(i.$option,n,s)}))}else t.input.value=t.getValue() +t.isSetup&&(e.silent||t.trigger("change",t.getValue()))}open(){var e=this +e.isLocked||e.isOpen||"multi"===e.settings.mode&&e.isFull()||(e.isOpen=!0,P(e.focus_node,{"aria-expanded":"true"}),e.refreshState(),I(e.dropdown,{visibility:"hidden",display:"block"}),e.positionDropdown(),I(e.dropdown,{visibility:"visible",display:"block"}),e.focus(),e.trigger("dropdown_open",e.dropdown))}close(e=!0){var t=this,i=t.isOpen +e&&(t.setTextboxValue(),"single"===t.settings.mode&&t.items.length&&t.hideInput()),t.isOpen=!1,P(t.focus_node,{"aria-expanded":"false"}),I(t.dropdown,{display:"none"}),t.settings.hideSelected&&t.clearActiveOption(),t.refreshState(),i&&t.trigger("dropdown_close",t.dropdown)}positionDropdown(){if("body"===this.settings.dropdownParent){var e=this.control,t=e.getBoundingClientRect(),i=e.offsetHeight+t.top+window.scrollY,s=t.left+window.scrollX +I(this.dropdown,{width:t.width+"px",top:i+"px",left:s+"px"})}}clear(e){var t=this +if(t.items.length){var i=t.controlChildren() +y(i,(e=>{t.removeItem(e,!0)})),t.showInput(),e||t.updateOriginalInput(),t.trigger("clear")}}insertAtCaret(e){const t=this,i=t.caretPos,s=t.control +s.insertBefore(e,s.children[i]),t.setCaret(i+1)}deleteSelection(e){var t,i,s,n,o,r=this +t=e&&8===e.keyCode?-1:1,i={start:(o=r.control_input).selectionStart||0,length:(o.selectionEnd||0)-(o.selectionStart||0)} +const l=[] +if(r.activeItems.length)n=F(r.activeItems,t),s=L(n),t>0&&s++,y(r.activeItems,(e=>l.push(e))) +else if((r.isFocused||"single"===r.settings.mode)&&r.items.length){const e=r.controlChildren() +t<0&&0===i.start&&0===i.length?l.push(e[r.caretPos-1]):t>0&&i.start===r.inputValue().length&&l.push(e[r.caretPos])}const a=l.map((e=>e.dataset.value)) +if(!a.length||"function"==typeof r.settings.onDelete&&!1===r.settings.onDelete.call(r,a,e))return!1 +for(H(e,!0),void 0!==s&&r.setCaret(s);l.length;)r.removeItem(l.pop()) +return r.showInput(),r.positionDropdown(),r.refreshOptions(!1),!0}advanceSelection(e,t){var i,s,n=this +n.rtl&&(e*=-1),n.inputValue().length||(K(V,t)||K("shiftKey",t)?(s=(i=n.getLastActive(e))?i.classList.contains("active")?n.getAdjacent(i,e,"item"):i:e>0?n.control_input.nextElementSibling:n.control_input.previousElementSibling)&&(s.classList.contains("active")&&n.removeActiveItem(i),n.setActiveItemClass(s)):n.moveCaret(e))}moveCaret(e){}getLastActive(e){let t=this.control.querySelector(".last-active") +if(t)return t +var i=this.control.querySelectorAll(".active") +return i?F(i,e):void 0}setCaret(e){this.caretPos=this.items.length}controlChildren(){return Array.from(this.control.querySelectorAll("[data-ts-item]"))}lock(){this.close(),this.isLocked=!0,this.refreshState()}unlock(){this.isLocked=!1,this.refreshState()}disable(){var e=this +e.input.disabled=!0,e.control_input.disabled=!0,e.focus_node.tabIndex=-1,e.isDisabled=!0,e.lock()}enable(){var e=this +e.input.disabled=!1,e.control_input.disabled=!1,e.focus_node.tabIndex=e.tabIndex,e.isDisabled=!1,e.unlock()}destroy(){var e=this,t=e.revertSettings +e.trigger("destroy"),e.off(),e.wrapper.remove(),e.dropdown.remove(),e.input.innerHTML=t.innerHTML,e.input.tabIndex=t.tabIndex,S(e.input,"tomselected","ts-hidden-accessible"),e._destroy(),delete e.input.tomselect}render(e,t){return"function"!=typeof this.settings.render[e]?null:this._render(e,t)}_render(e,t){var i,s,n="" +const o=this +return"option"!==e&&"item"!=e||(n=D(t[o.settings.valueField])),null==(s=o.settings.render[e].call(this,t,N))||(s=w(s),"option"===e||"option_create"===e?t[o.settings.disabledField]?P(s,{"aria-disabled":"true"}):P(s,{"data-selectable":""}):"optgroup"===e&&(i=t.group[o.settings.optgroupValueField],P(s,{"data-group":i}),t.group[o.settings.disabledField]&&P(s,{"data-disabled":""})),"option"!==e&&"item"!==e||(P(s,{"data-value":n}),"item"===e?(C(s,o.settings.itemClass),P(s,{"data-ts-item":""})):(C(s,o.settings.optionClass),P(s,{role:"option",id:t.$id}),o.options[n].$div=s))),s}clearCache(){y(this.options,((e,t)=>{e.$div&&(e.$div.remove(),delete e.$div)}))}uncacheValue(e){const t=this.getOption(e) +t&&t.remove()}canCreate(e){return this.settings.create&&e.length>0&&this.settings.createFilter.call(this,e)}hook(e,t,i){var s=this,n=s[t] +s[t]=function(){var t,o +return"after"===e&&(t=n.apply(s,arguments)),o=i.apply(s,arguments),"instead"===e?o:("before"===e&&(t=n.apply(s,arguments)),t)}}}return J.define("change_listener",(function(){B(this.input,"change",(()=>{this.sync()}))})),J.define("checkbox_options",(function(){var e=this,t=e.onOptionSelect +e.settings.hideSelected=!1 +var i=function(e){setTimeout((()=>{var t=e.querySelector("input") +e.classList.contains("selected")?t.checked=!0:t.checked=!1}),1)} +e.hook("after","setupTemplates",(()=>{var t=e.settings.render.option +e.settings.render.option=(i,s)=>{var n=w(t.call(e,i,s)),o=document.createElement("input") +o.addEventListener("click",(function(e){H(e)})),o.type="checkbox" +const r=q(i[e.settings.valueField]) +return r&&e.items.indexOf(r)>-1&&(o.checked=!0),n.prepend(o),n}})),e.on("item_remove",(t=>{var s=e.getOption(t) +s&&(s.classList.remove("selected"),i(s))})),e.hook("instead","onOptionSelect",((s,n)=>{if(n.classList.contains("selected"))return n.classList.remove("selected"),e.removeItem(n.dataset.value),e.refreshOptions(),void H(s,!0) +t.call(e,s,n),i(n)}))})),J.define("clear_button",(function(e){const t=this,i=Object.assign({className:"clear-button",title:"Clear All",html:e=>`
×
`},e) +t.on("initialize",(()=>{var e=w(i.html(i)) +e.addEventListener("click",(e=>{t.clear(),"single"===t.settings.mode&&t.settings.allowEmptyOption&&t.addItem(""),e.preventDefault(),e.stopPropagation()})),t.control.appendChild(e)}))})),J.define("drag_drop",(function(){var e=this +if(!$.fn.sortable)throw new Error('The "drag_drop" plugin requires jQuery UI "sortable".') +if("multi"===e.settings.mode){var t=e.lock,i=e.unlock +e.hook("instead","lock",(()=>{var i=$(e.control).data("sortable") +return i&&i.disable(),t.call(e)})),e.hook("instead","unlock",(()=>{var t=$(e.control).data("sortable") +return t&&t.enable(),i.call(e)})),e.on("initialize",(()=>{var t=$(e.control).sortable({items:"[data-value]",forcePlaceholderSize:!0,disabled:e.isLocked,start:(e,i)=>{i.placeholder.css("width",i.helper.css("width")),t.css({overflow:"visible"})},stop:()=>{t.css({overflow:"hidden"}) +var i=[] +t.children("[data-value]").each((function(){this.dataset.value&&i.push(this.dataset.value)})),e.setValue(i)}})}))}})),J.define("dropdown_header",(function(e){const t=this,i=Object.assign({title:"Untitled",headerClass:"dropdown-header",titleRowClass:"dropdown-header-title",labelClass:"dropdown-header-label",closeClass:"dropdown-header-close",html:e=>'
'+e.title+'×
'},e) +t.on("initialize",(()=>{var e=w(i.html(i)),s=e.querySelector("."+i.closeClass) +s&&s.addEventListener("click",(e=>{H(e,!0),t.close()})),t.dropdown.insertBefore(e,t.dropdown.firstChild)}))})),J.define("caret_position",(function(){var e=this +e.hook("instead","setCaret",(t=>{"single"!==e.settings.mode&&e.control.contains(e.control_input)?(t=Math.max(0,Math.min(e.items.length,t)))==e.caretPos||e.isPending||e.controlChildren().forEach(((i,s)=>{s{if(!e.isFocused)return +const i=e.getLastActive(t) +if(i){const s=L(i) +e.setCaret(t>0?s+1:s),e.setActiveItem()}else e.setCaret(e.caretPos+t)}))})),J.define("dropdown_input",(function(){var e=this +e.settings.shouldOpen=!0,e.hook("before","setup",(()=>{e.focus_node=e.control,C(e.control_input,"dropdown-input") +const t=w('