From 47f9bc80a9ee103d3263bc6f5ece452d796ea1ff Mon Sep 17 00:00:00 2001 From: Tomasz Pluskiewicz Date: Thu, 8 Aug 2024 14:04:29 +0200 Subject: [PATCH] docs: configuring sparql endpoints --- docs/apis/apis.md | 7 ++ docs/apis/kopflos/_category_.yml | 2 + docs/apis/kopflos/how-to/_category_.yml | 2 + docs/apis/kopflos/how-to/sparql-endpoints.md | 66 +++++++++++++++++++ docs/cubes/cubes.md | 2 +- docusaurus.config.mjs | 6 ++ sidebars.js | 1 + src/components/HomepageFeatures/index.tsx | 10 +++ static/img/kopflos.png | Bin 0 -> 21585 bytes 9 files changed, 95 insertions(+), 1 deletion(-) create mode 100644 docs/apis/apis.md create mode 100644 docs/apis/kopflos/_category_.yml create mode 100644 docs/apis/kopflos/how-to/_category_.yml create mode 100644 docs/apis/kopflos/how-to/sparql-endpoints.md create mode 100644 static/img/kopflos.png diff --git a/docs/apis/apis.md b/docs/apis/apis.md new file mode 100644 index 0000000..fb6f999 --- /dev/null +++ b/docs/apis/apis.md @@ -0,0 +1,7 @@ +--- +sidebar_position: 1 +--- + +# Data-Centric APIs + +TBD - introduce the concept of data-centric APIs diff --git a/docs/apis/kopflos/_category_.yml b/docs/apis/kopflos/_category_.yml new file mode 100644 index 0000000..9706ee2 --- /dev/null +++ b/docs/apis/kopflos/_category_.yml @@ -0,0 +1,2 @@ +label: Kopflos +position: 2 diff --git a/docs/apis/kopflos/how-to/_category_.yml b/docs/apis/kopflos/how-to/_category_.yml new file mode 100644 index 0000000..405427a --- /dev/null +++ b/docs/apis/kopflos/how-to/_category_.yml @@ -0,0 +1,2 @@ +label: How-To +position: 2 diff --git a/docs/apis/kopflos/how-to/sparql-endpoints.md b/docs/apis/kopflos/how-to/sparql-endpoints.md new file mode 100644 index 0000000..2ccbe7b --- /dev/null +++ b/docs/apis/kopflos/how-to/sparql-endpoints.md @@ -0,0 +1,66 @@ +# Configure SPARQL endpoints + +Kopflos can be configured with one or more SPARQL endpoints which can be accessed at runtime by +handler implementors. A single endpoint is required, named `default`. + +To configure the endpoints, one of three methods is supported. + +## From endpoint URL + +The simplest option is to provide a single unauthenticated endpoint URL which will be used for queries and updates. + +```js +import Kopflos from '@kopflos-cms/core' + +let graph + +const kopflos = new Kopflos(graph, { + sparql: { + default: 'http://example.com/query', + } +}) +``` + +## From endpoint configuration object + +A more complex scenario will often require separate query and update URLs and authentication. In such +cases, provide a full settings object as required by [`sparql-http-client`](https://github.com/rdf-ext/sparql-http-client). + +```js +import Kopflos from '@kopflos-cms/core' + +let graph + +const kopflos = new Kopflos(graph, { + sparql: { + default: { + endpointUrl + } + } +}) +``` + +## Provide instances of SPARQL clients + +Lastly, it is possible to create the clients manually in code and pass them to Kopflos. +Both `stream` and `parsed` clients are required. + +```js +import StreamClient from 'sparql-http-client' +import ParsingClient from 'sparql-http-client/ParsingClient.js' +import Kopflos from '@kopflos-cms/core' + +let graph + +const stream = new SparqlClient({ endpointUrl }) +const parsed = new ParsingClient({ endpointUrl }) + +const kopflos = new Kopflos(graph, { + sparql: { + default: { + stream, + parsed + } + } +}) +``` diff --git a/docs/cubes/cubes.md b/docs/cubes/cubes.md index e54c97c..f687f13 100644 --- a/docs/cubes/cubes.md +++ b/docs/cubes/cubes.md @@ -4,4 +4,4 @@ sidebar_position: 1 # RDF Data Cubes -This sections contains information about practical usage of RDF Data Cubes represented with the [cube.link Cube Schema](https://cube.link/). +This section contains information about practical usage of RDF Data Cubes represented with the [cube.link Cube Schema](https://cube.link/). diff --git a/docusaurus.config.mjs b/docusaurus.config.mjs index 90ce514..1ab5cc2 100644 --- a/docusaurus.config.mjs +++ b/docusaurus.config.mjs @@ -83,6 +83,12 @@ const config = { position: 'left', label: 'Workflows', }, + { + type: 'docSidebar', + sidebarId: 'apisSidebar', + position: 'left', + label: 'APIs', + }, { type: 'docSidebar', sidebarId: 'cubesSidebar', diff --git a/sidebars.js b/sidebars.js index 5a129ca..0d04af6 100644 --- a/sidebars.js +++ b/sidebars.js @@ -17,6 +17,7 @@ const sidebars = { aboutSidebar: [{type: 'autogenerated', dirName: 'about'}], rdfjsSidebar: [{type: 'autogenerated', dirName: 'rdfjs'}], workflowsSidebar: [{type: 'autogenerated', dirName: 'workflows'}], + apisSidebar: [{type: 'autogenerated', dirName: 'apis'}], cubesSidebar: [{type: 'autogenerated', dirName: 'cubes'}], // But you can create a sidebar manually diff --git a/src/components/HomepageFeatures/index.tsx b/src/components/HomepageFeatures/index.tsx index 206ef0f..adc573e 100644 --- a/src/components/HomepageFeatures/index.tsx +++ b/src/components/HomepageFeatures/index.tsx @@ -30,6 +30,16 @@ const FeatureList: FeatureItem[] = [ ), }, + { + page: '/docs/apis/', + title: 'APIs', + image: '/img/kopflos.png', + description: ( + <> + Simply create APIs for your data-centric applications + + ), + }, { page: '/docs/cubes/', title: 'Cubes', diff --git a/static/img/kopflos.png b/static/img/kopflos.png new file mode 100644 index 0000000000000000000000000000000000000000..ae764e24d0d4ab0377b1ec0b9337646f2c690d67 GIT binary patch literal 21585 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