Skip to content
Snippets Groups Projects
Verified Commit 19c49007 authored by Martin Weise's avatar Martin Weise
Browse files

Merge branch 'master' into dev

parents 4d546682 d1e80995
Branches
No related tags found
3 merge requests!250Master,!246Dev,!244Dev
Showing
with 936 additions and 782 deletions
@article{weise2022dbrepo,
title = {DBRepo: a {S}emantic {D}igital {R}epository for {R}elational {D}atabases},
volume = {17},
ISSN = {1746-8256},
url = {https://doi.org/10.2218/ijdc.v17i1.825},
DOI = {10.2218/ijdc.v17i1.825},
number = {1},
journal = {International Journal of Digital Curation},
publisher = {Edinburgh University Library},
author = {Weise, Martin and Staudinger, Moritz and Michlits, Cornelia and Gergely, Eva and Stytsenko, Kirill and Ganguly, Raman and Rauber, Andreas},
year = {2022},
month = sep,
pages = {11}
}
\ No newline at end of file
<rdf:RDF
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:z="http://www.zotero.org/namespaces/export#"
xmlns:dcterms="http://purl.org/dc/terms/"
xmlns:bib="http://purl.org/net/biblio#"
xmlns:foaf="http://xmlns.com/foaf/0.1/"
xmlns:link="http://purl.org/rss/1.0/modules/link/"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:prism="http://prismstandard.org/namespaces/1.2/basic/">
<bib:Article rdf:about="http://ijdc.net/article/view/825">
<z:itemType>journalArticle</z:itemType>
<dcterms:isPartOf rdf:resource="urn:issn:1746-8256"/>
<bib:authors>
<rdf:Seq>
<rdf:li>
<foaf:Person>
<foaf:surname>Weise</foaf:surname>
<foaf:givenName>Martin</foaf:givenName>
</foaf:Person>
</rdf:li>
<rdf:li>
<foaf:Person>
<foaf:surname>Staudinger</foaf:surname>
<foaf:givenName>Moritz</foaf:givenName>
</foaf:Person>
</rdf:li>
<rdf:li>
<foaf:Person>
<foaf:surname>Michlits</foaf:surname>
<foaf:givenName>Cornelia</foaf:givenName>
</foaf:Person>
</rdf:li>
<rdf:li>
<foaf:Person>
<foaf:surname>Gergely</foaf:surname>
<foaf:givenName>Eva</foaf:givenName>
</foaf:Person>
</rdf:li>
<rdf:li>
<foaf:Person>
<foaf:surname>Stytsenko</foaf:surname>
<foaf:givenName>Kirill</foaf:givenName>
</foaf:Person>
</rdf:li>
<rdf:li>
<foaf:Person>
<foaf:surname>Ganguly</foaf:surname>
<foaf:givenName>Raman</foaf:givenName>
</foaf:Person>
</rdf:li>
<rdf:li>
<foaf:Person>
<foaf:surname>Rauber</foaf:surname>
<foaf:givenName>Andreas</foaf:givenName>
</foaf:Person>
</rdf:li>
</rdf:Seq>
</bib:authors>
<link:link rdf:resource="#item_2"/>
<dc:title>DBRepo: a Semantic Digital Repository for Relational Databases</dc:title>
<dcterms:abstract>Data curation is a complex, multi-faceted task. While dedicated data stewards are starting to take care of these activities in close collaboration with researchers for many types of (usually file-based) data in many institutions, this is rarely yet the case for data held in relational databases. Beyond large-scale infrastructures hosting e.g. climate or genome data, researchers usually have to create, build and maintain their database, care about security patches, and feed data into it in order to use it in their research. Data curation, if at all, usually happens after a project is finished, when data may be exported for digital preservation into file repository systems.
We present DBRepo, a semantic digital repository for relational databases in a private cloud setting designed to (1) host research data stored in relational databases right from the beginning of a research project, (2) provide separation of concerns, allowing the researchers to focus on the domain aspects of the data and their work while bringing in experts to handle classic data management tasks, (3) improve findability, accessibility and reusability by offering semantic mapping of metadata attributes, and (4) focus on reproducibility in dynamically evolving data by supporting versioning and precise identification/cite-ability for arbitrary subsets of data.</dcterms:abstract>
<dc:date>2022-09-07</dc:date>
<z:shortTitle>DBRepo</z:shortTitle>
<z:libraryCatalog>DOI.org (Crossref)</z:libraryCatalog>
<dc:identifier>
<dcterms:URI>
<rdf:value>http://ijdc.net/article/view/825</rdf:value>
</dcterms:URI>
</dc:identifier>
<dcterms:dateSubmitted>2024-02-05 13:45:47</dcterms:dateSubmitted>
<bib:pages>11</bib:pages>
</bib:Article>
<bib:Journal rdf:about="urn:issn:1746-8256">
<prism:volume>17</prism:volume>
<dc:title>International Journal of Digital Curation</dc:title>
<dc:identifier>DOI 10.2218/ijdc.v17i1.825</dc:identifier>
<prism:number>1</prism:number>
<dcterms:alternative>IJDC</dcterms:alternative>
<dc:identifier>ISSN 1746-8256</dc:identifier>
</bib:Journal>
<z:Attachment rdf:about="#item_2">
<z:itemType>attachment</z:itemType>
<dc:title>Submitted Version</dc:title>
<dc:identifier>
<dcterms:URI>
<rdf:value>https://zenodo.org/record/6637333/files/IDCC22_DBREPO_PREPRINT.pdf</rdf:value>
</dcterms:URI>
</dc:identifier>
<dcterms:dateSubmitted>2024-02-05 13:45:49</dcterms:dateSubmitted>
<z:linkMode>1</z:linkMode>
<link:type>application/pdf</link:type>
</z:Attachment>
</rdf:RDF>
TY - JOUR
AU - Weise, Martin
AU - Staudinger, Moritz
AU - Michlits, Cornelia
AU - Gergely, Eva
AU - Stytsenko, Kirill
AU - Ganguly, Raman
AU - Rauber, Andreas
TI - DBRepo: A Semantic Digital Repository for Relational Databases
T2 - International Journal of Digital Curation
VL - 17
IS - 1
SP - 11
PY - 2022
DA - 2022/9/7
PB - Edinburgh University Library
AB - Data curation is a complex, multi-faceted task. While dedicated data
stewards are starting to take care of these activities in close
collaboration with researchers for many types of (usually file-based) data
in many institutions, this is rarely yet the case for data held in
relational databases. Beyond large-scale infrastructures hosting e.g.
climate or genome data, researchers usually have to create, build and
maintain their database, care about security patches, and feed data into
it in order to use it in their research. Data curation, if at all, usually
happens after a project is finished, when data may be exported for digital
preservation into file repository systems. We present DBRepo, a semantic
digital repository for relational databases in a private cloud setting
designed to (1) host research data stored in relational databases right
from the beginning of a research project, (2) provide separation of
concerns, allowing the researchers to focus on the domain aspects of the
data and their work while bringing in experts to handle classic data
management tasks, (3) improve findability, accessibility and reusability
by offering semantic mapping of metadata attributes, and (4) focus on
reproducibility in dynamically evolving data by supporting versioning and
precise identification/cite-ability for arbitrary subsets of data.
SN - 1746-8256
DO - 10.2218/ijdc.v17i1.825
UR - https://doi.org/10.2218/ijdc.v17i1.825
ER -
<?xml version="1.0" encoding="UTF-8"?>
<xml><records><record><database name="MyLibrary">MyLibrary</database><source-app name="Zotero">Zotero</source-app><ref-type name="Journal Article">17</ref-type><contributors><authors><author>Weise, Martin</author><author>Staudinger, Moritz</author><author>Michlits, Cornelia</author><author>Gergely, Eva</author><author>Stytsenko, Kirill</author><author>Ganguly, Raman</author><author>Rauber, Andreas</author></authors></contributors><titles><title>DBRepo: a Semantic Digital Repository for Relational Databases</title><secondary-title>International Journal of Digital Curation</secondary-title><short-title>DBRepo</short-title></titles><periodical><full-title>International Journal of Digital Curation</full-title><abbr-1>IJDC</abbr-1></periodical><pages>11</pages><volume>17</volume><number>1</number><issue>1</issue><dates><year>2022</year><pub-dates><date>2022-09-07</date></pub-dates></dates><isbn>1746-8256</isbn><electronic-resource-num>10.2218/ijdc.v17i1.825</electronic-resource-num><abstract>Data curation is a complex, multi-faceted task. While dedicated data stewards are starting to take care of these activities in close collaboration with researchers for many types of (usually file-based) data in many institutions, this is rarely yet the case for data held in relational databases. Beyond large-scale infrastructures hosting e.g. climate or genome data, researchers usually have to create, build and maintain their database, care about security patches, and feed data into it in order to use it in their research. Data curation, if at all, usually happens after a project is finished, when data may be exported for digital preservation into file repository systems.&#xD;We present DBRepo, a semantic digital repository for relational databases in a private cloud setting designed to (1) host research data stored in relational databases right from the beginning of a research project, (2) provide separation of concerns, allowing the researchers to focus on the domain aspects of the data and their work while bringing in experts to handle classic data management tasks, (3) improve findability, accessibility and reusability by offering semantic mapping of metadata attributes, and (4) focus on reproducibility in dynamically evolving data by supporting versioning and precise identification/cite-ability for arbitrary subsets of data.</abstract><remote-database-name>DOI.org (Crossref)</remote-database-name><urls><web-urls><url>http://ijdc.net/article/view/825</url></web-urls><pdf-urls><url>/home/mweise/Zotero/storage/DEL3SNPP/Weise et al. - 2022 - DBRepo a Semantic Digital Repository for Relation.pdf</url></pdf-urls></urls><access-date>2024-02-05 13:45:47</access-date></record></records></xml>
\ No newline at end of file
......@@ -6,17 +6,25 @@ hide:
# Publications
!!! abstract "How to Cite DBRepo"
Please cite the following paper:
Weise, M., Staudinger, M., Michlits, C., Gergely, E., Stytsenko, K., Ganguly, R., & Rauber, A. (2022). DBRepo: a
Semantic Digital Repository for Relational Databases. *International Journal of Digital Curation*, 17(1), 11.
DOI: [10.2218/ijdc.v17i1.825](https://doi.org/10.2218/ijdc.v17i1.825)<br />
[[BibTeX](../papers/weise2022dbrepo.bib)] &nbsp; [[RIS](../papers/weise2022dbrepo.ris)] &nbsp; [[RDF](../papers/weise2022dbrepo.rdf)] &nbsp; [[EndNote](../papers/weise2022dbrepo.xml)]
## Logos
DBRepo logo in various formats:
* [logo.png](https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/raw/dev/dbrepo-ui/static/logo.png)
* [logo.svg](https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/raw/dev/dbrepo-ui/static/logo.svg)
DBRepo logo (short) in various formats:
* PNG: [bigger](https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/raw/dev/dbrepo-ui/static/logo.png)
([smaller](https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/raw/dev/dbrepo-ui/static/favicon.png))
* SVG: [bigger](https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/raw/dev/dbrepo-ui/static/logo.svg)
([smaller](https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/raw/dev/dbrepo-ui/static/favicon.svg))
* [favicon.svg](https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/raw/dev/dbrepo-ui/static/favicon.svg)
* [favicon.png](https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/raw/dev/dbrepo-ui/static/favicon.png)
## Refereed
......
[[source]]
url = "https://pypi.org/simple"
verify_ssl = true
name = "pypi"
[packages]
mkdocs = "1.5.3"
mkdocs-material = "9.5.5"
mkdocs-with-pdf = "0.9.3"
mkdocs-material-extensions = "*"
requests = "*"
py-dotenv = "*"
python-dotenv = "*"
[dev-packages]
[requires]
python_version = "3.11"
File mode changed from 100644 to 100755
bin/test.sh 100644 → 100755
File mode changed from 100644 to 100755
This diff is collapsed.
......@@ -2,7 +2,7 @@ apiVersion: v1
kind: ConfigMap
metadata:
name: auth-service-config
namespace: {{ $.Values.namespace }}
namespace: {{ .Values.namespace }}
data:
KC_HOSTNAME_PATH: "/api/auth"
KC_HOSTNAME_ADMIN_URL: "https://{{ .Values.hostname }}/api/auth"
\ No newline at end of file
......@@ -4,7 +4,7 @@ apiVersion: v1
kind: Service
metadata:
name: data-service
namespace: {{ $.Values.namespace }}
namespace: {{ .Values.namespace }}
labels:
service: data-service
spec:
......
......@@ -108,6 +108,7 @@ data:
description text,
engine character varying(20),
is_public boolean NOT NULL DEFAULT TRUE,
image longblob,
created_by character varying(36),
owned_by character varying(36),
contact_person character varying(36),
......@@ -191,7 +192,7 @@ data:
id bigint NOT NULL AUTO_INCREMENT,
column_id bigint NOT NULL,
value CHARACTER VARYING(255) NOT NULL,
FOREIGN KEY (column_id) REFERENCES mdb_columns (ID),
FOREIGN KEY (column_id) REFERENCES mdb_columns (ID) ON DELETE CASCADE,
PRIMARY KEY (id)
) WITH SYSTEM VERSIONING;
......@@ -200,7 +201,7 @@ data:
id bigint NOT NULL AUTO_INCREMENT,
column_id bigint NOT NULL,
value CHARACTER VARYING(255) NOT NULL,
FOREIGN KEY (column_id) REFERENCES mdb_columns (ID),
FOREIGN KEY (column_id) REFERENCES mdb_columns (ID) ON DELETE CASCADE,
PRIMARY KEY (id)
) WITH SYSTEM VERSIONING;
......
......@@ -9,25 +9,25 @@ metadata:
stringData:
admin-email: "{{ .Values.metadataService.adminEmail }}"
base-url: "{{ .Values.hostname }}"
broker-endpoint: "{{ .Values.brokerService.url }}"
broker-host: "{{ .Values.brokerService.host }}"
broker-port: "{{ .Values.brokerService.port }}"
broker-endpoint: "{{ index .Values "broker-service" "url" }}"
broker-host: "{{ index .Values "broker-service" "host" }}"
broker-port: "{{ index .Values "broker-service" "port" }}"
gateway-endpoint: "{{ .Values.hostname }}"
website: "{{ .Values.metadataService.website }}"
search-username: "{{ .Values.searchDb.username }}"
search-password: "{{ .Values.searchDb.password }}"
broker-username: "{{ .Values.brokerService.auth.username }}"
broker-password: "{{ .Values.brokerService.auth.password }}"
search-username: "{{ index .Values "search-db" "username" }}"
search-password: "{{ index .Values "search-db" "password" }}"
broker-username: "{{ index .Values "broker-service" "auth" "username" }}"
broker-password: "{{ index .Values "broker-service" "auth" "password" }}"
log-level: "{{ ternary "trace" "info" .Values.metadataService.image.debug }}"
metadata-db: "{{ .Values.metadataDb.db.name }}"
metadata-host: "{{ .Values.metadataDb.host }}"
metadata-username: "{{ .Values.metadataDb.rootUser.user }}"
metadata-password: "{{ .Values.metadataDb.rootUser.password }}"
metadata-jdbc-extra-args: "{{ .Values.metadataDb.jdbcExtraArgs }}"
metadata-db: "{{ index .Values "metadata-db" "db" "name" }}"
metadata-host: "{{ index .Values "metadata-db" "host" }}"
metadata-username: "{{ index .Values "metadata-db" "rootUser" "user" }}"
metadata-password: "{{ index .Values "metadata-db" "rootUser" "password" }}"
metadata-jdbc-extra-args: "{{ index .Values "metadata-db" "jdbcExtraArgs" }}"
keycloak-host: "{{ .Values.metadataService.authService.url }}"
keycloak-admin: "{{ .Values.authService.auth.adminUser }}"
keycloak-admin-password: "{{ .Values.authService.auth.adminPassword }}"
keycloak-client-secret: "{{ .Values.authService.client.secret }}"
keycloak-admin: "{{ index .Values "auth-service" "auth" "adminUser" }}"
keycloak-admin-password: "{{ index .Values "auth-service" "auth" "adminPassword" }}"
keycloak-client-secret: "{{ index .Values "auth-service" "client" "secret" }}"
datacite-url: "{{ .Values.metadataService.datacite.url }}"
datacite-prefix: "{{ .Values.metadataService.datacite.prefix | toString }}"
datacite-username: "{{ .Values.metadataService.datacite.username }}"
......@@ -35,17 +35,17 @@ stringData:
repository-name: "{{ .Values.metadataService.repositoryName }}"
pid-base: "{{ $pidBase }}"
jwt-issuer: "{{ $jwtIssuer }}"
broker-virtualhost: "{{ .Values.brokerService.virtualHost }}"
queue-name: "{{ .Values.brokerService.queueName }}"
exchange-name: "{{ .Values.brokerService.exchangeName }}"
routing-key: "{{ .Values.brokerService.routingKey }}"
connection-timeout: "{{ .Values.brokerService.connectionTimeout }}"
broker-virtualhost: "{{ index .Values "broker-service" "virtualHost" }}"
queue-name: "{{ index .Values "broker-service" "queueName" }}"
exchange-name: "{{ index .Values "broker-service" "exchangeName" }}"
routing-key: "{{ index .Values "broker-service" "routingKey" }}"
connection-timeout: "{{ index .Values "broker-service" "connectionTimeout" }}"
min-concurrent-consumers: "{{ .Values.dataService.consumerConcurrentMin }}"
max-concurrent-consumers: "{{ .Values.dataService.consumerConcurrentMax }}"
requeue-rejected: "{{ .Values.dataService.requeueRejected }}"
s3-storage-endpoint: http://storage-service-s3:9000
s3-access-key-id: "{{ .Values.storageService.s3.auth.username }}"
s3-secret-access-key: "{{ .Values.storageService.s3.auth.password }}"
s3-access-key-id: "{{ index .Values "storage-service" "s3" "auth" "username" }}"
s3-secret-access-key: "{{ index .Values "storage-service" "s3" "auth" "password" }}"
s3-import-bucket: "dbrepo-upload"
s3-export-bucket: "dbrepo-download"
delete-stale-files-rate: {{ .Values.metadataService.rates.deleteStaleFiles | quote }}
......
......@@ -4,111 +4,8 @@ apiVersion: v1
kind: ConfigMap
metadata:
name: ui-setup
namespace: {{ $.Values.namespace }}
namespace: {{ .Values.namespace }}
data:
dbrepo.config.json: |
{
"title": "Database Repository",
"version": "1.4.1",
"ssl": {
"force": false
},
"logo": {
"path": "/logo.svg"
},
"icon": {
"path": "/favicon.ico"
},
"appleTouchIcon": {
"path": "/apple-touch-icon.png"
},
"api": {
"useSsl": false
},
"broker": {
"connection": {
"host": "localhost",
"ports": [
5672
],
"extraInfo": null
}
},
"storage": {
"endpoint": "storage-service",
"port": 9000,
"useSsl": false,
"accessKey": {
"id": "seaweedfsadmin",
"secret": "seaweedfsadmin"
}
},
"upload": {
"endpoint": "localhost",
"port": 1080,
"useSsl": false
},
"database": {
"connection": {
"extraInfo": null
}
},
"keycloak": {
"client": {
"id": "dbrepo-client",
"secret": "MUwRc7yfXSJwX8AdRMWaQC3Nep1VjwgG"
}
},
"opensearch": {
"username": "admin",
"password": "admin"
},
"pid": {
"default": {
"publisher": "Example University"
}
},
"doi": {
"url": "https://doi.org"
},
"pages": {
"login": {
"links": []
},
"information": {
"links": [
{
"text": "Online Documentation",
"blank": true,
"href": "https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/"
},
{
"text": "Sourcecode Documentation",
"blank": true,
"href": "https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services"
},
{
"text": "Docker Images",
"blank": true,
"href": "https://hub.docker.com/u/dbrepo"
},
{
"text": "Demo Instance (Kubernetes)",
"blank": true,
"href": "https://test.dbrepo.tuwien.ac.at/"
},
{
"text": "Pilot Instance (Docker Compose)",
"blank": true,
"href": "https://dbrepo1.ec.tuwien.ac.at/"
},
{
"text": "Paper",
"blank": true,
"href": "https://doi.org/10.2218/ijdc.v17i1.825"
}
]
}
}
}
{{ .Values.ui.config | nindent 4 }}
{{- end }}
\ No newline at end of file
......@@ -4,7 +4,7 @@ apiVersion: apps/v1
kind: Deployment
metadata:
name: upload-service
namespace: {{ $.Values.namespace }}
namespace: {{ .Values.namespace }}
labels:
app: upload-service
service: upload-service
......
......@@ -4,7 +4,7 @@ apiVersion: v1
kind: Service
metadata:
name: upload-service
namespace: {{ $.Values.namespace }}
namespace: {{ .Values.namespace }}
labels:
service: upload-service
spec:
......
......@@ -327,9 +327,6 @@ brokerService:
secret:
secretName: broker-service-secret
extraPlugins: rabbitmq_prometheus rabbitmq_auth_backend_oauth2 rabbitmq_auth_mechanism_ssl
extraEnvVars:
- name: BITNAMI_DEBUG
value: "true"
persistence:
enabled: false
size: 5Gi
......@@ -406,7 +403,7 @@ storageService:
enabled: true
filer:
enabled: true
replicas: 1
replicas: 2
enablePVC: false
storage: 25Gi
s3:
......@@ -418,10 +415,10 @@ storageService:
existingConfigSecret: seaweedfs-s3-secret
volume:
enabled: true
replicas: 1
replicas: 2
s3:
enabled: true
replicas: 1
replicas: 2
port: 9000
metricsPort: 9091
enableAuth: true
......@@ -472,6 +469,111 @@ ui:
tag: "1.4.1"
pullPolicy: Always
replicaCount: 2
config: |
{
"title": "Database Repository",
"version": "1.4.1",
"ssl": {
"force": false
},
"logo": {
"path": "/logo.svg"
},
"icon": {
"path": "/favicon.ico"
},
"appleTouchIcon": {
"path": "/apple-touch-icon.png"
},
"api": {
"useSsl": false
},
"broker": {
"connection": {
"host": "localhost",
"ports": [
5672
],
"extraInfo": null
}
},
"storage": {
"endpoint": "storage-service",
"port": 9000,
"useSsl": false,
"accessKey": {
"id": "seaweedfsadmin",
"secret": "seaweedfsadmin"
}
},
"upload": {
"endpoint": "localhost",
"port": 1080,
"useSsl": false
},
"database": {
"connection": {
"extraInfo": null
}
},
"keycloak": {
"client": {
"id": "dbrepo-client",
"secret": "MUwRc7yfXSJwX8AdRMWaQC3Nep1VjwgG"
}
},
"opensearch": {
"username": "admin",
"password": "admin"
},
"pid": {
"default": {
"publisher": "Example University"
}
},
"doi": {
"url": "https://doi.org"
},
"pages": {
"login": {
"links": [ ]
},
"information": {
"links": [
{
"text": "Online Documentation",
"blank": true,
"href": "https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/"
},
{
"text": "Sourcecode Documentation",
"blank": true,
"href": "https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services"
},
{
"text": "Docker Images",
"blank": true,
"href": "https://hub.docker.com/u/dbrepo"
},
{
"text": "Demo Instance (Kubernetes)",
"blank": true,
"href": "https://test.dbrepo.tuwien.ac.at/"
},
{
"text": "Pilot Instance (Docker Compose)",
"blank": true,
"href": "https://dbrepo1.ec.tuwien.ac.at/"
},
{
"text": "Paper",
"blank": true,
"href": "https://doi.org/10.2218/ijdc.v17i1.825"
}
]
}
}
}
extraVolumes: [ ]
# - name: images-map
# configMap:
......
mkdocs==1.4.3
mkdocs-material==9.1.17
mkdocs==1.5.3
mkdocs-material==9.5.5
mkdocs-with-pdf==0.9.3
mkdocs-material-extensions>=1.0.3
requests>=2.27.0
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment