Repository files navigation

Provenance

One model. One truth. Endless outputs.

Provenance lets you define your data model in YAML or JSON and generate ER diagrams, SQL scripts, data lineage, data dictionaries, and more — all from a single source of truth.

Provenance — In data, provenance means the authoritative origin of data.

This document covers:

Badges

GitHub Release


Idea of Provenance

The basic idea of Provenance is to have a single model and then generate and distribute provenance and artifacts into different places.

Each Generator generates something and a Destination can send the output to somewhere.

Some generators are supplied in-the-box, but you're able to design your own generator and destinations.

The generators acts as plugin - Just implement GeneratorConfiguration.

---
title: Basic idea
---
flowchart TD
docFile["provenance file"] docgen["Generator"]
generator1["Generator 1"]
generator1Generate[[Generates SQL-scripts]]
destination1["Destination 1"]
database[(Database)]
generator2["Generator 2"]
destination2["Destination 2"]
markdown(["Markdown"])
generator3["Generator 3"]
destination3["Destination 3"]
confluence(["Confluence"])
generator4["Generator 4"]
destination4["Destination 4"]
csv(["CSV file"])
generator5["Generator 5"]
destination5["Destination 5"]
excel(["Excel workbook"])
generatorX["Generator X"]
destinationX["Destination X"]
something(["Something else"])
docFile --> docgen
docgen --> generator1
docgen --> generator2
docgen --> generator3
docgen --> generator4
docgen --> generator5
docgen --> generatorX
generator1 --> generator1Generate
generator1Generate --> destination1
destination1 --> database
generator2 --> destination2
destination2 --> markdown
generator3 --> destination3
destination3 --> confluence
generator4 --> destination4
destination4 --> csv
generator5 --> destination5
destination5 --> excel
generatorX --> destinationX
destinationX --> something
Loading

Documentation structure

The provenance file or files can be yaml- or json-files.

If you in the beginning of your file add a reference to the schema, so your IDE can validate and have code completion.

$schema: https://patrickfust.github.io/provenance/v1/provenance-schema.json

Example of a provenance file:

$schema: https://patrickfust.github.io/provenance/v1/provenance-schema.jsonprovenanceTitle: My databaseschemaName: theSchematables:
- name: table_acreateTableScript: create_table_a.sqlfields:
- name: field_adataType: intforeignKey:
tableName: table_bcolumnName: field_bonDelete: cascade
- name: table_bfields:
- name: field_bdataType: int
- name: table_in_groupfields:
- name: field_bdataType: int

or as JSON:

{
"$schema": "https://patrickfust.github.io/provenance/v1/provenance-schema.json",
"provenanceTitle": "My database",
"schemaName": "theSchema",
"tables": [
{
"name": "table_a",
"createTableScript": "create_table_a.sql",
"fields": [
{
"name": "field_a",
"dataType": "int",
"foreignKey": {
"tableName": "table_b",
"columnName": "field_b"
}
}
]
},
{
"name": "table_b",
"fields": [
{
"name": "field_b",
"dataType": "int"
}
]
},
{
"name": "table_in_group",
"fields": [
{
"name": "field_b",
"dataType": "int"
}
]
}
]
}

Generator Configuration File

You can either configure your Gradle directly, or have a configuration file. The configuration file is the only way to use the Maven plugin

The generator configuration file contains a list of configurations. Each configuration consist of the class name of the configuration class and then its fields. You can have nested objects, you just have to specify which class name it is.

Example of configuration file

- className: dk.fust.provenance.generator.erdiagram.ERDiagramConfigurationprovenanceFile: provenance.yamlumlGenerator: MERMAIDgenerateKeys:
- className: dk.fust.provenance.generator.erdiagram.GenerateKeydestinationKey: MODEL_MERMAID_PLACEHOLDER
- className: dk.fust.provenance.generator.erdiagram.GenerateKeydestinationKey: MODEL_MERMAID_GROUP_PLACEHOLDERfilterTags: my_groupdestination:
className: dk.fust.provenance.destination.MarkdownDestinationfile: README.md
- className: dk.fust.provenance.generator.erdiagram.ERDiagramConfigurationprovenanceFile: provenance.yamlumlGenerator : PLANTUMLgenerateKeys:
- className: dk.fust.provenance.generator.erdiagram.GenerateKeydestinationKey: MODEL_PLANTUML_PLACEHOLDERdestination:
className: dk.fust.provenance.destination.MarkdownDestinationfile: README.md

Usage

Read about how to use Provenance:

TopicDescription
DestinationsWhere the generated provenance is sent to.
Table formatsThe format of the generated tables.
Generation typesThe different types of generators that are available.
Build tools - GradleHow to use Provenance with Gradle.
Build tools - MavenHow to use Provenance with Maven.
DemosExamples of how to use Provenance.

Validate markdown links

Run the markdown link checker locally:

python3 scripts/check_markdown_links.py --root .

About

One model. One truth. Endless outputs. Provenance lets you define your data model in YAML or JSON and generate ER diagrams, SQL scripts, data lineage, dictionaries, and more — all from a single source of truth. Built for Maven and Gradle.

Resources

Code of conduct

Stars

0 stars

Watchers

0 watching

Forks

Releases

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

Provenance

One model. One truth. Endless outputs.

Provenance lets you define your data model in YAML or JSON and generate ER diagrams, SQL scripts, data lineage, data dictionaries, and more — all from a single source of truth.

Provenance — In data, provenance means the authoritative origin of data.

This document covers:

Badges

GitHub Release


Idea of Provenance

The basic idea of Provenance is to have a single model and then generate and distribute provenance and artifacts into different places.

Each Generator generates something and a Destination can send the output to somewhere.

Some generators are supplied in-the-box, but you're able to design your own generator and destinations.

The generators acts as plugin - Just implement GeneratorConfiguration.

---
title: Basic idea
---
flowchart TD
docFile["provenance file"] docgen["Generator"]
generator1["Generator 1"]
generator1Generate[[Generates SQL-scripts]]
destination1["Destination 1"]
database[(Database)]
generator2["Generator 2"]
destination2["Destination 2"]
markdown(["Markdown"])
generator3["Generator 3"]
destination3["Destination 3"]
confluence(["Confluence"])
generator4["Generator 4"]
destination4["Destination 4"]
csv(["CSV file"])
generator5["Generator 5"]
destination5["Destination 5"]
excel(["Excel workbook"])
generatorX["Generator X"]
destinationX["Destination X"]
something(["Something else"])
docFile --> docgen
docgen --> generator1
docgen --> generator2
docgen --> generator3
docgen --> generator4
docgen --> generator5
docgen --> generatorX
generator1 --> generator1Generate
generator1Generate --> destination1
destination1 --> database
generator2 --> destination2
destination2 --> markdown
generator3 --> destination3
destination3 --> confluence
generator4 --> destination4
destination4 --> csv
generator5 --> destination5
destination5 --> excel
generatorX --> destinationX
destinationX --> something
Loading

Documentation structure

The provenance file or files can be yaml- or json-files.

If you in the beginning of your file add a reference to the schema, so your IDE can validate and have code completion.

$schema: https://patrickfust.github.io/provenance/v1/provenance-schema.json

Example of a provenance file:

$schema: https://patrickfust.github.io/provenance/v1/provenance-schema.jsonprovenanceTitle: My databaseschemaName: theSchematables:
- name: table_acreateTableScript: create_table_a.sqlfields:
- name: field_adataType: intforeignKey:
tableName: table_bcolumnName: field_bonDelete: cascade
- name: table_bfields:
- name: field_bdataType: int
- name: table_in_groupfields:
- name: field_bdataType: int

or as JSON:

{
"$schema": "https://patrickfust.github.io/provenance/v1/provenance-schema.json",
"provenanceTitle": "My database",
"schemaName": "theSchema",
"tables": [
{
"name": "table_a",
"createTableScript": "create_table_a.sql",
"fields": [
{
"name": "field_a",
"dataType": "int",
"foreignKey": {
"tableName": "table_b",
"columnName": "field_b"
}
}
]
},
{
"name": "table_b",
"fields": [
{
"name": "field_b",
"dataType": "int"
}
]
},
{
"name": "table_in_group",
"fields": [
{
"name": "field_b",
"dataType": "int"
}
]
}
]
}

Generator Configuration File

You can either configure your Gradle directly, or have a configuration file. The configuration file is the only way to use the Maven plugin

The generator configuration file contains a list of configurations. Each configuration consist of the class name of the configuration class and then its fields. You can have nested objects, you just have to specify which class name it is.

Example of configuration file

- className: dk.fust.provenance.generator.erdiagram.ERDiagramConfigurationprovenanceFile: provenance.yamlumlGenerator: MERMAIDgenerateKeys:
- className: dk.fust.provenance.generator.erdiagram.GenerateKeydestinationKey: MODEL_MERMAID_PLACEHOLDER
- className: dk.fust.provenance.generator.erdiagram.GenerateKeydestinationKey: MODEL_MERMAID_GROUP_PLACEHOLDERfilterTags: my_groupdestination:
className: dk.fust.provenance.destination.MarkdownDestinationfile: README.md
- className: dk.fust.provenance.generator.erdiagram.ERDiagramConfigurationprovenanceFile: provenance.yamlumlGenerator : PLANTUMLgenerateKeys:
- className: dk.fust.provenance.generator.erdiagram.GenerateKeydestinationKey: MODEL_PLANTUML_PLACEHOLDERdestination:
className: dk.fust.provenance.destination.MarkdownDestinationfile: README.md

Usage

Read about how to use Provenance:

TopicDescription
DestinationsWhere the generated provenance is sent to.
Table formatsThe format of the generated tables.
Generation typesThe different types of generators that are available.
Build tools - GradleHow to use Provenance with Gradle.
Build tools - MavenHow to use Provenance with Maven.
DemosExamples of how to use Provenance.

Validate markdown links

Run the markdown link checker locally:

python3 scripts/check_markdown_links.py --root .

About

One model. One truth. Endless outputs. Provenance lets you define your data model in YAML or JSON and generate ER diagrams, SQL scripts, data lineage, dictionaries, and more — all from a single source of truth. Built for Maven and Gradle.

Resources

Code of conduct

Stars

0 stars

Watchers

0 watching

Forks

Releases

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Provenance

One model. One truth. Endless outputs.

Provenance lets you define your data model in YAML or JSON and generate ER diagrams, SQL scripts, data lineage, data dictionaries, and more — all from a single source of truth.

Provenance — In data, provenance means the authoritative origin of data.

This document covers:

Badges

GitHub Release


Idea of Provenance

The basic idea of Provenance is to have a single model and then generate and distribute provenance and artifacts into different places.

Each Generator generates something and a Destination can send the output to somewhere.

Some generators are supplied in-the-box, but you're able to design your own generator and destinations.

The generators acts as plugin - Just implement GeneratorConfiguration.

---
title: Basic idea
---
flowchart TD
docFile["provenance file"] docgen["Generator"]
generator1["Generator 1"]
generator1Generate[[Generates SQL-scripts]]
destination1["Destination 1"]
database[(Database)]
generator2["Generator 2"]
destination2["Destination 2"]
markdown(["Markdown"])
generator3["Generator 3"]
destination3["Destination 3"]
confluence(["Confluence"])
generator4["Generator 4"]
destination4["Destination 4"]
csv(["CSV file"])
generator5["Generator 5"]
destination5["Destination 5"]
excel(["Excel workbook"])
generatorX["Generator X"]
destinationX["Destination X"]
something(["Something else"])
docFile --> docgen
docgen --> generator1
docgen --> generator2
docgen --> generator3
docgen --> generator4
docgen --> generator5
docgen --> generatorX
generator1 --> generator1Generate
generator1Generate --> destination1
destination1 --> database
generator2 --> destination2
destination2 --> markdown
generator3 --> destination3
destination3 --> confluence
generator4 --> destination4
destination4 --> csv
generator5 --> destination5
destination5 --> excel
generatorX --> destinationX
destinationX --> something
Loading

Documentation structure

The provenance file or files can be yaml- or json-files.

If you in the beginning of your file add a reference to the schema, so your IDE can validate and have code completion.

$schema: https://patrickfust.github.io/provenance/v1/provenance-schema.json

Example of a provenance file:

$schema: https://patrickfust.github.io/provenance/v1/provenance-schema.jsonprovenanceTitle: My databaseschemaName: theSchematables:
- name: table_acreateTableScript: create_table_a.sqlfields:
- name: field_adataType: intforeignKey:
tableName: table_bcolumnName: field_bonDelete: cascade
- name: table_bfields:
- name: field_bdataType: int
- name: table_in_groupfields:
- name: field_bdataType: int

or as JSON:

{
"$schema": "https://patrickfust.github.io/provenance/v1/provenance-schema.json",
"provenanceTitle": "My database",
"schemaName": "theSchema",
"tables": [
{
"name": "table_a",
"createTableScript": "create_table_a.sql",
"fields": [
{
"name": "field_a",
"dataType": "int",
"foreignKey": {
"tableName": "table_b",
"columnName": "field_b"
}
}
]
},
{
"name": "table_b",
"fields": [
{
"name": "field_b",
"dataType": "int"
}
]
},
{
"name": "table_in_group",
"fields": [
{
"name": "field_b",
"dataType": "int"
}
]
}
]
}

Generator Configuration File

You can either configure your Gradle directly, or have a configuration file. The configuration file is the only way to use the Maven plugin

The generator configuration file contains a list of configurations. Each configuration consist of the class name of the configuration class and then its fields. You can have nested objects, you just have to specify which class name it is.

Example of configuration file

- className: dk.fust.provenance.generator.erdiagram.ERDiagramConfigurationprovenanceFile: provenance.yamlumlGenerator: MERMAIDgenerateKeys:
- className: dk.fust.provenance.generator.erdiagram.GenerateKeydestinationKey: MODEL_MERMAID_PLACEHOLDER
- className: dk.fust.provenance.generator.erdiagram.GenerateKeydestinationKey: MODEL_MERMAID_GROUP_PLACEHOLDERfilterTags: my_groupdestination:
className: dk.fust.provenance.destination.MarkdownDestinationfile: README.md
- className: dk.fust.provenance.generator.erdiagram.ERDiagramConfigurationprovenanceFile: provenance.yamlumlGenerator : PLANTUMLgenerateKeys:
- className: dk.fust.provenance.generator.erdiagram.GenerateKeydestinationKey: MODEL_PLANTUML_PLACEHOLDERdestination:
className: dk.fust.provenance.destination.MarkdownDestinationfile: README.md

Usage

Read about how to use Provenance:

TopicDescription
DestinationsWhere the generated provenance is sent to.
Table formatsThe format of the generated tables.
Generation typesThe different types of generators that are available.
Build tools - GradleHow to use Provenance with Gradle.
Build tools - MavenHow to use Provenance with Maven.
DemosExamples of how to use Provenance.

Validate markdown links

Run the markdown link checker locally:

python3 scripts/check_markdown_links.py --root .

About

One model. One truth. Endless outputs. Provenance lets you define your data model in YAML or JSON and generate ER diagrams, SQL scripts, data lineage, dictionaries, and more — all from a single source of truth. Built for Maven and Gradle.

Resources

Code of conduct

Stars

0 stars

Watchers

0 watching

Forks

Releases

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Provenance

One model. One truth. Endless outputs.

Provenance lets you define your data model in YAML or JSON and generate ER diagrams, SQL scripts, data lineage, data dictionaries, and more — all from a single source of truth.

Provenance — In data, provenance means the authoritative origin of data.

This document covers:

Badges

GitHub Release


Idea of Provenance

The basic idea of Provenance is to have a single model and then generate and distribute provenance and artifacts into different places.

Each Generator generates something and a Destination can send the output to somewhere.

Some generators are supplied in-the-box, but you're able to design your own generator and destinations.

The generators acts as plugin - Just implement GeneratorConfiguration.

---
title: Basic idea
---
flowchart TD
docFile["provenance file"] docgen["Generator"]
generator1["Generator 1"]
generator1Generate[[Generates SQL-scripts]]
destination1["Destination 1"]
database[(Database)]
generator2["Generator 2"]
destination2["Destination 2"]
markdown(["Markdown"])
generator3["Generator 3"]
destination3["Destination 3"]
confluence(["Confluence"])
generator4["Generator 4"]
destination4["Destination 4"]
csv(["CSV file"])
generator5["Generator 5"]
destination5["Destination 5"]
excel(["Excel workbook"])
generatorX["Generator X"]
destinationX["Destination X"]
something(["Something else"])
docFile --> docgen
docgen --> generator1
docgen --> generator2
docgen --> generator3
docgen --> generator4
docgen --> generator5
docgen --> generatorX
generator1 --> generator1Generate
generator1Generate --> destination1
destination1 --> database
generator2 --> destination2
destination2 --> markdown
generator3 --> destination3
destination3 --> confluence
generator4 --> destination4
destination4 --> csv
generator5 --> destination5
destination5 --> excel
generatorX --> destinationX
destinationX --> something
Loading

Documentation structure

The provenance file or files can be yaml- or json-files.

If you in the beginning of your file add a reference to the schema, so your IDE can validate and have code completion.

$schema: https://patrickfust.github.io/provenance/v1/provenance-schema.json

Example of a provenance file:

$schema: https://patrickfust.github.io/provenance/v1/provenance-schema.jsonprovenanceTitle: My databaseschemaName: theSchematables:
- name: table_acreateTableScript: create_table_a.sqlfields:
- name: field_adataType: intforeignKey:
tableName: table_bcolumnName: field_bonDelete: cascade
- name: table_bfields:
- name: field_bdataType: int
- name: table_in_groupfields:
- name: field_bdataType: int

or as JSON:

{
"$schema": "https://patrickfust.github.io/provenance/v1/provenance-schema.json",
"provenanceTitle": "My database",
"schemaName": "theSchema",
"tables": [
{
"name": "table_a",
"createTableScript": "create_table_a.sql",
"fields": [
{
"name": "field_a",
"dataType": "int",
"foreignKey": {
"tableName": "table_b",
"columnName": "field_b"
}
}
]
},
{
"name": "table_b",
"fields": [
{
"name": "field_b",
"dataType": "int"
}
]
},
{
"name": "table_in_group",
"fields": [
{
"name": "field_b",
"dataType": "int"
}
]
}
]
}

Generator Configuration File

You can either configure your Gradle directly, or have a configuration file. The configuration file is the only way to use the Maven plugin

The generator configuration file contains a list of configurations. Each configuration consist of the class name of the configuration class and then its fields. You can have nested objects, you just have to specify which class name it is.

Example of configuration file

- className: dk.fust.provenance.generator.erdiagram.ERDiagramConfigurationprovenanceFile: provenance.yamlumlGenerator: MERMAIDgenerateKeys:
- className: dk.fust.provenance.generator.erdiagram.GenerateKeydestinationKey: MODEL_MERMAID_PLACEHOLDER
- className: dk.fust.provenance.generator.erdiagram.GenerateKeydestinationKey: MODEL_MERMAID_GROUP_PLACEHOLDERfilterTags: my_groupdestination:
className: dk.fust.provenance.destination.MarkdownDestinationfile: README.md
- className: dk.fust.provenance.generator.erdiagram.ERDiagramConfigurationprovenanceFile: provenance.yamlumlGenerator : PLANTUMLgenerateKeys:
- className: dk.fust.provenance.generator.erdiagram.GenerateKeydestinationKey: MODEL_PLANTUML_PLACEHOLDERdestination:
className: dk.fust.provenance.destination.MarkdownDestinationfile: README.md

Usage

Read about how to use Provenance:

TopicDescription
DestinationsWhere the generated provenance is sent to.
Table formatsThe format of the generated tables.
Generation typesThe different types of generators that are available.
Build tools - GradleHow to use Provenance with Gradle.
Build tools - MavenHow to use Provenance with Maven.
DemosExamples of how to use Provenance.

Validate markdown links

Run the markdown link checker locally:

python3 scripts/check_markdown_links.py --root .

About

One model. One truth. Endless outputs. Provenance lets you define your data model in YAML or JSON and generate ER diagrams, SQL scripts, data lineage, dictionaries, and more — all from a single source of truth. Built for Maven and Gradle.

Resources

Code of conduct

Stars

0 stars

Watchers

0 watching

Forks

Releases

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

Provenance

One model. One truth. Endless outputs.

Provenance lets you define your data model in YAML or JSON and generate ER diagrams, SQL scripts, data lineage, data dictionaries, and more — all from a single source of truth.

Provenance — In data, provenance means the authoritative origin of data.

This document covers:

Badges

GitHub Release


Idea of Provenance

The basic idea of Provenance is to have a single model and then generate and distribute provenance and artifacts into different places.

Each Generator generates something and a Destination can send the output to somewhere.

Some generators are supplied in-the-box, but you're able to design your own generator and destinations.

The generators acts as plugin - Just implement GeneratorConfiguration.

---
title: Basic idea
---
flowchart TD
docFile["provenance file"] docgen["Generator"]
generator1["Generator 1"]
generator1Generate[[Generates SQL-scripts]]
destination1["Destination 1"]
database[(Database)]
generator2["Generator 2"]
destination2["Destination 2"]
markdown(["Markdown"])
generator3["Generator 3"]
destination3["Destination 3"]
confluence(["Confluence"])
generator4["Generator 4"]
destination4["Destination 4"]
csv(["CSV file"])
generator5["Generator 5"]
destination5["Destination 5"]
excel(["Excel workbook"])
generatorX["Generator X"]
destinationX["Destination X"]
something(["Something else"])
docFile --> docgen
docgen --> generator1
docgen --> generator2
docgen --> generator3
docgen --> generator4
docgen --> generator5
docgen --> generatorX
generator1 --> generator1Generate
generator1Generate --> destination1
destination1 --> database
generator2 --> destination2
destination2 --> markdown
generator3 --> destination3
destination3 --> confluence
generator4 --> destination4
destination4 --> csv
generator5 --> destination5
destination5 --> excel
generatorX --> destinationX
destinationX --> something
Loading

Documentation structure

The provenance file or files can be yaml- or json-files.

If you in the beginning of your file add a reference to the schema, so your IDE can validate and have code completion.

$schema: https://patrickfust.github.io/provenance/v1/provenance-schema.json

Example of a provenance file:

$schema: https://patrickfust.github.io/provenance/v1/provenance-schema.jsonprovenanceTitle: My databaseschemaName: theSchematables:
- name: table_acreateTableScript: create_table_a.sqlfields:
- name: field_adataType: intforeignKey:
tableName: table_bcolumnName: field_bonDelete: cascade
- name: table_bfields:
- name: field_bdataType: int
- name: table_in_groupfields:
- name: field_bdataType: int

or as JSON:

{
"$schema": "https://patrickfust.github.io/provenance/v1/provenance-schema.json",
"provenanceTitle": "My database",
"schemaName": "theSchema",
"tables": [
{
"name": "table_a",
"createTableScript": "create_table_a.sql",
"fields": [
{
"name": "field_a",
"dataType": "int",
"foreignKey": {
"tableName": "table_b",
"columnName": "field_b"
}
}
]
},
{
"name": "table_b",
"fields": [
{
"name": "field_b",
"dataType": "int"
}
]
},
{
"name": "table_in_group",
"fields": [
{
"name": "field_b",
"dataType": "int"
}
]
}
]
}

Generator Configuration File

You can either configure your Gradle directly, or have a configuration file. The configuration file is the only way to use the Maven plugin

The generator configuration file contains a list of configurations. Each configuration consist of the class name of the configuration class and then its fields. You can have nested objects, you just have to specify which class name it is.

Example of configuration file

- className: dk.fust.provenance.generator.erdiagram.ERDiagramConfigurationprovenanceFile: provenance.yamlumlGenerator: MERMAIDgenerateKeys:
- className: dk.fust.provenance.generator.erdiagram.GenerateKeydestinationKey: MODEL_MERMAID_PLACEHOLDER
- className: dk.fust.provenance.generator.erdiagram.GenerateKeydestinationKey: MODEL_MERMAID_GROUP_PLACEHOLDERfilterTags: my_groupdestination:
className: dk.fust.provenance.destination.MarkdownDestinationfile: README.md
- className: dk.fust.provenance.generator.erdiagram.ERDiagramConfigurationprovenanceFile: provenance.yamlumlGenerator : PLANTUMLgenerateKeys:
- className: dk.fust.provenance.generator.erdiagram.GenerateKeydestinationKey: MODEL_PLANTUML_PLACEHOLDERdestination:
className: dk.fust.provenance.destination.MarkdownDestinationfile: README.md

Usage

Read about how to use Provenance:

TopicDescription
DestinationsWhere the generated provenance is sent to.
Table formatsThe format of the generated tables.
Generation typesThe different types of generators that are available.
Build tools - GradleHow to use Provenance with Gradle.
Build tools - MavenHow to use Provenance with Maven.
DemosExamples of how to use Provenance.

Validate markdown links

Run the markdown link checker locally:

python3 scripts/check_markdown_links.py --root .

About

One model. One truth. Endless outputs. Provenance lets you define your data model in YAML or JSON and generate ER diagrams, SQL scripts, data lineage, dictionaries, and more — all from a single source of truth. Built for Maven and Gradle.

Resources

Code of conduct

Stars

0 stars

Watchers

0 watching

Forks

Releases

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Provenance

One model. One truth. Endless outputs.

Provenance lets you define your data model in YAML or JSON and generate ER diagrams, SQL scripts, data lineage, data dictionaries, and more — all from a single source of truth.

Provenance — In data, provenance means the authoritative origin of data.

This document covers:

Badges

GitHub Release


Idea of Provenance

The basic idea of Provenance is to have a single model and then generate and distribute provenance and artifacts into different places.

Each Generator generates something and a Destination can send the output to somewhere.

Some generators are supplied in-the-box, but you're able to design your own generator and destinations.

The generators acts as plugin - Just implement GeneratorConfiguration.

---
title: Basic idea
---
flowchart TD
docFile["provenance file"] docgen["Generator"]
generator1["Generator 1"]
generator1Generate[[Generates SQL-scripts]]
destination1["Destination 1"]
database[(Database)]
generator2["Generator 2"]
destination2["Destination 2"]
markdown(["Markdown"])
generator3["Generator 3"]
destination3["Destination 3"]
confluence(["Confluence"])
generator4["Generator 4"]
destination4["Destination 4"]
csv(["CSV file"])
generator5["Generator 5"]
destination5["Destination 5"]
excel(["Excel workbook"])
generatorX["Generator X"]
destinationX["Destination X"]
something(["Something else"])
docFile --> docgen
docgen --> generator1
docgen --> generator2
docgen --> generator3
docgen --> generator4
docgen --> generator5
docgen --> generatorX
generator1 --> generator1Generate
generator1Generate --> destination1
destination1 --> database
generator2 --> destination2
destination2 --> markdown
generator3 --> destination3
destination3 --> confluence
generator4 --> destination4
destination4 --> csv
generator5 --> destination5
destination5 --> excel
generatorX --> destinationX
destinationX --> something
Loading

Documentation structure

The provenance file or files can be yaml- or json-files.

If you in the beginning of your file add a reference to the schema, so your IDE can validate and have code completion.

$schema: https://patrickfust.github.io/provenance/v1/provenance-schema.json

Example of a provenance file:

$schema: https://patrickfust.github.io/provenance/v1/provenance-schema.jsonprovenanceTitle: My databaseschemaName: theSchematables:
- name: table_acreateTableScript: create_table_a.sqlfields:
- name: field_adataType: intforeignKey:
tableName: table_bcolumnName: field_bonDelete: cascade
- name: table_bfields:
- name: field_bdataType: int
- name: table_in_groupfields:
- name: field_bdataType: int

or as JSON:

{
"$schema": "https://patrickfust.github.io/provenance/v1/provenance-schema.json",
"provenanceTitle": "My database",
"schemaName": "theSchema",
"tables": [
{
"name": "table_a",
"createTableScript": "create_table_a.sql",
"fields": [
{
"name": "field_a",
"dataType": "int",
"foreignKey": {
"tableName": "table_b",
"columnName": "field_b"
}
}
]
},
{
"name": "table_b",
"fields": [
{
"name": "field_b",
"dataType": "int"
}
]
},
{
"name": "table_in_group",
"fields": [
{
"name": "field_b",
"dataType": "int"
}
]
}
]
}

Generator Configuration File

You can either configure your Gradle directly, or have a configuration file. The configuration file is the only way to use the Maven plugin

The generator configuration file contains a list of configurations. Each configuration consist of the class name of the configuration class and then its fields. You can have nested objects, you just have to specify which class name it is.

Example of configuration file

- className: dk.fust.provenance.generator.erdiagram.ERDiagramConfigurationprovenanceFile: provenance.yamlumlGenerator: MERMAIDgenerateKeys:
- className: dk.fust.provenance.generator.erdiagram.GenerateKeydestinationKey: MODEL_MERMAID_PLACEHOLDER
- className: dk.fust.provenance.generator.erdiagram.GenerateKeydestinationKey: MODEL_MERMAID_GROUP_PLACEHOLDERfilterTags: my_groupdestination:
className: dk.fust.provenance.destination.MarkdownDestinationfile: README.md
- className: dk.fust.provenance.generator.erdiagram.ERDiagramConfigurationprovenanceFile: provenance.yamlumlGenerator : PLANTUMLgenerateKeys:
- className: dk.fust.provenance.generator.erdiagram.GenerateKeydestinationKey: MODEL_PLANTUML_PLACEHOLDERdestination:
className: dk.fust.provenance.destination.MarkdownDestinationfile: README.md

Usage

Read about how to use Provenance:

TopicDescription
DestinationsWhere the generated provenance is sent to.
Table formatsThe format of the generated tables.
Generation typesThe different types of generators that are available.
Build tools - GradleHow to use Provenance with Gradle.
Build tools - MavenHow to use Provenance with Maven.
DemosExamples of how to use Provenance.

Validate markdown links

Run the markdown link checker locally:

python3 scripts/check_markdown_links.py --root .

About

One model. One truth. Endless outputs. Provenance lets you define your data model in YAML or JSON and generate ER diagrams, SQL scripts, data lineage, dictionaries, and more — all from a single source of truth. Built for Maven and Gradle.

Resources

Code of conduct

Stars

0 stars

Watchers

0 watching

Forks

Releases

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Provenance

One model. One truth. Endless outputs.

Provenance lets you define your data model in YAML or JSON and generate ER diagrams, SQL scripts, data lineage, data dictionaries, and more — all from a single source of truth.

Provenance — In data, provenance means the authoritative origin of data.

This document covers:

Badges

GitHub Release


Idea of Provenance

The basic idea of Provenance is to have a single model and then generate and distribute provenance and artifacts into different places.

Each Generator generates something and a Destination can send the output to somewhere.

Some generators are supplied in-the-box, but you're able to design your own generator and destinations.

The generators acts as plugin - Just implement GeneratorConfiguration.

---
title: Basic idea
---
flowchart TD
docFile["provenance file"] docgen["Generator"]
generator1["Generator 1"]
generator1Generate[[Generates SQL-scripts]]
destination1["Destination 1"]
database[(Database)]
generator2["Generator 2"]
destination2["Destination 2"]
markdown(["Markdown"])
generator3["Generator 3"]
destination3["Destination 3"]
confluence(["Confluence"])
generator4["Generator 4"]
destination4["Destination 4"]
csv(["CSV file"])
generator5["Generator 5"]
destination5["Destination 5"]
excel(["Excel workbook"])
generatorX["Generator X"]
destinationX["Destination X"]
something(["Something else"])
docFile --> docgen
docgen --> generator1
docgen --> generator2
docgen --> generator3
docgen --> generator4
docgen --> generator5
docgen --> generatorX
generator1 --> generator1Generate
generator1Generate --> destination1
destination1 --> database
generator2 --> destination2
destination2 --> markdown
generator3 --> destination3
destination3 --> confluence
generator4 --> destination4
destination4 --> csv
generator5 --> destination5
destination5 --> excel
generatorX --> destinationX
destinationX --> something
Loading

Documentation structure

The provenance file or files can be yaml- or json-files.

If you in the beginning of your file add a reference to the schema, so your IDE can validate and have code completion.

$schema: https://patrickfust.github.io/provenance/v1/provenance-schema.json

Example of a provenance file:

$schema: https://patrickfust.github.io/provenance/v1/provenance-schema.jsonprovenanceTitle: My databaseschemaName: theSchematables:
- name: table_acreateTableScript: create_table_a.sqlfields:
- name: field_adataType: intforeignKey:
tableName: table_bcolumnName: field_bonDelete: cascade
- name: table_bfields:
- name: field_bdataType: int
- name: table_in_groupfields:
- name: field_bdataType: int

or as JSON:

{
"$schema": "https://patrickfust.github.io/provenance/v1/provenance-schema.json",
"provenanceTitle": "My database",
"schemaName": "theSchema",
"tables": [
{
"name": "table_a",
"createTableScript": "create_table_a.sql",
"fields": [
{
"name": "field_a",
"dataType": "int",
"foreignKey": {
"tableName": "table_b",
"columnName": "field_b"
}
}
]
},
{
"name": "table_b",
"fields": [
{
"name": "field_b",
"dataType": "int"
}
]
},
{
"name": "table_in_group",
"fields": [
{
"name": "field_b",
"dataType": "int"
}
]
}
]
}

Generator Configuration File

You can either configure your Gradle directly, or have a configuration file. The configuration file is the only way to use the Maven plugin

The generator configuration file contains a list of configurations. Each configuration consist of the class name of the configuration class and then its fields. You can have nested objects, you just have to specify which class name it is.

Example of configuration file

- className: dk.fust.provenance.generator.erdiagram.ERDiagramConfigurationprovenanceFile: provenance.yamlumlGenerator: MERMAIDgenerateKeys:
- className: dk.fust.provenance.generator.erdiagram.GenerateKeydestinationKey: MODEL_MERMAID_PLACEHOLDER
- className: dk.fust.provenance.generator.erdiagram.GenerateKeydestinationKey: MODEL_MERMAID_GROUP_PLACEHOLDERfilterTags: my_groupdestination:
className: dk.fust.provenance.destination.MarkdownDestinationfile: README.md
- className: dk.fust.provenance.generator.erdiagram.ERDiagramConfigurationprovenanceFile: provenance.yamlumlGenerator : PLANTUMLgenerateKeys:
- className: dk.fust.provenance.generator.erdiagram.GenerateKeydestinationKey: MODEL_PLANTUML_PLACEHOLDERdestination:
className: dk.fust.provenance.destination.MarkdownDestinationfile: README.md

Usage

Read about how to use Provenance:

TopicDescription
DestinationsWhere the generated provenance is sent to.
Table formatsThe format of the generated tables.
Generation typesThe different types of generators that are available.
Build tools - GradleHow to use Provenance with Gradle.
Build tools - MavenHow to use Provenance with Maven.
DemosExamples of how to use Provenance.

Validate markdown links

Run the markdown link checker locally:

python3 scripts/check_markdown_links.py --root .

About

One model. One truth. Endless outputs. Provenance lets you define your data model in YAML or JSON and generate ER diagrams, SQL scripts, data lineage, dictionaries, and more — all from a single source of truth. Built for Maven and Gradle.

Resources

Code of conduct

Stars

0 stars

Watchers

0 watching

Forks

Releases

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

Provenance

One model. One truth. Endless outputs.

Provenance lets you define your data model in YAML or JSON and generate ER diagrams, SQL scripts, data lineage, data dictionaries, and more — all from a single source of truth.

Provenance — In data, provenance means the authoritative origin of data.

This document covers:

Badges

GitHub Release


Idea of Provenance

The basic idea of Provenance is to have a single model and then generate and distribute provenance and artifacts into different places.

Each Generator generates something and a Destination can send the output to somewhere.

Some generators are supplied in-the-box, but you're able to design your own generator and destinations.

The generators acts as plugin - Just implement GeneratorConfiguration.

---
title: Basic idea
---
flowchart TD
docFile["provenance file"] docgen["Generator"]
generator1["Generator 1"]
generator1Generate[[Generates SQL-scripts]]
destination1["Destination 1"]
database[(Database)]
generator2["Generator 2"]
destination2["Destination 2"]
markdown(["Markdown"])
generator3["Generator 3"]
destination3["Destination 3"]
confluence(["Confluence"])
generator4["Generator 4"]
destination4["Destination 4"]
csv(["CSV file"])
generator5["Generator 5"]
destination5["Destination 5"]
excel(["Excel workbook"])
generatorX["Generator X"]
destinationX["Destination X"]
something(["Something else"])
docFile --> docgen
docgen --> generator1
docgen --> generator2
docgen --> generator3
docgen --> generator4
docgen --> generator5
docgen --> generatorX
generator1 --> generator1Generate
generator1Generate --> destination1
destination1 --> database
generator2 --> destination2
destination2 --> markdown
generator3 --> destination3
destination3 --> confluence
generator4 --> destination4
destination4 --> csv
generator5 --> destination5
destination5 --> excel
generatorX --> destinationX
destinationX --> something
Loading

Documentation structure

The provenance file or files can be yaml- or json-files.

If you in the beginning of your file add a reference to the schema, so your IDE can validate and have code completion.

$schema: https://patrickfust.github.io/provenance/v1/provenance-schema.json

Example of a provenance file:

$schema: https://patrickfust.github.io/provenance/v1/provenance-schema.jsonprovenanceTitle: My databaseschemaName: theSchematables:
- name: table_acreateTableScript: create_table_a.sqlfields:
- name: field_adataType: intforeignKey:
tableName: table_bcolumnName: field_bonDelete: cascade
- name: table_bfields:
- name: field_bdataType: int
- name: table_in_groupfields:
- name: field_bdataType: int

or as JSON:

{
"$schema": "https://patrickfust.github.io/provenance/v1/provenance-schema.json",
"provenanceTitle": "My database",
"schemaName": "theSchema",
"tables": [
{
"name": "table_a",
"createTableScript": "create_table_a.sql",
"fields": [
{
"name": "field_a",
"dataType": "int",
"foreignKey": {
"tableName": "table_b",
"columnName": "field_b"
}
}
]
},
{
"name": "table_b",
"fields": [
{
"name": "field_b",
"dataType": "int"
}
]
},
{
"name": "table_in_group",
"fields": [
{
"name": "field_b",
"dataType": "int"
}
]
}
]
}

Generator Configuration File

You can either configure your Gradle directly, or have a configuration file. The configuration file is the only way to use the Maven plugin

The generator configuration file contains a list of configurations. Each configuration consist of the class name of the configuration class and then its fields. You can have nested objects, you just have to specify which class name it is.

Example of configuration file

- className: dk.fust.provenance.generator.erdiagram.ERDiagramConfigurationprovenanceFile: provenance.yamlumlGenerator: MERMAIDgenerateKeys:
- className: dk.fust.provenance.generator.erdiagram.GenerateKeydestinationKey: MODEL_MERMAID_PLACEHOLDER
- className: dk.fust.provenance.generator.erdiagram.GenerateKeydestinationKey: MODEL_MERMAID_GROUP_PLACEHOLDERfilterTags: my_groupdestination:
className: dk.fust.provenance.destination.MarkdownDestinationfile: README.md
- className: dk.fust.provenance.generator.erdiagram.ERDiagramConfigurationprovenanceFile: provenance.yamlumlGenerator : PLANTUMLgenerateKeys:
- className: dk.fust.provenance.generator.erdiagram.GenerateKeydestinationKey: MODEL_PLANTUML_PLACEHOLDERdestination:
className: dk.fust.provenance.destination.MarkdownDestinationfile: README.md

Usage

Read about how to use Provenance:

TopicDescription
DestinationsWhere the generated provenance is sent to.
Table formatsThe format of the generated tables.
Generation typesThe different types of generators that are available.
Build tools - GradleHow to use Provenance with Gradle.
Build tools - MavenHow to use Provenance with Maven.
DemosExamples of how to use Provenance.

Validate markdown links

Run the markdown link checker locally:

python3 scripts/check_markdown_links.py --root .

About

One model. One truth. Endless outputs. Provenance lets you define your data model in YAML or JSON and generate ER diagrams, SQL scripts, data lineage, dictionaries, and more — all from a single source of truth. Built for Maven and Gradle.

Resources

Code of conduct

Stars

0 stars

Watchers

0 watching

Forks

Releases

Contributors

Languages