commit 69c59ebc070afe775b6cd74e5aad7d4798cd513f Author: Jake Pullen Date: Sat Jul 25 07:32:23 2026 +0100 Batman diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..6823433 --- /dev/null +++ b/.gitignore @@ -0,0 +1,176 @@ +# https://github.com/github/gitignore/blob/main/Python.gitignore + +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +.pybuilder/ +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +# .python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# UV +# Similar to Pipfile.lock, it is generally recommended to include uv.lock in version control. +# This is especially recommended for binary packages to ensure reproducibility, and is more +# commonly ignored for libraries. +#uv.lock + +# poetry +# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. +# This is especially recommended for binary packages to ensure reproducibility, and is more +# commonly ignored for libraries. +# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control +#poetry.lock + +# pdm +# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. +#pdm.lock +# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it +# in version control. +# https://pdm.fming.dev/latest/usage/project/#working-with-version-control +.pdm.toml +.pdm-python +.pdm-build/ + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Cython debug symbols +cython_debug/ + +# PyCharm +# JetBrains specific template is maintained in a separate JetBrains.gitignore that can +# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore +# and can be added to the global gitignore or merged into this file. For a more nuclear +# option (not recommended) you can uncomment the following to ignore the entire idea folder. +#.idea/ + +# Ruff stuff: +.ruff_cache/ + +# PyPI configuration file +.pypirc \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..6812636 --- /dev/null +++ b/README.md @@ -0,0 +1,3 @@ +# DocGen is an application to normalise and automate documentation for Data Engineers. + +## still WIP \ No newline at end of file diff --git a/docgen.py b/docgen.py new file mode 100644 index 0000000..ace8094 --- /dev/null +++ b/docgen.py @@ -0,0 +1,143 @@ +import logging +from logging.handlers import RotatingFileHandler + +class DocGen: + def __init__(self,file): + self.details = file + self.logging = self.configure_logging() + self.logging.info('Starting DocGen') + + def configure_logging(self): + # Configure logger with rotating file handler and custom log levels + logger = logging.getLogger(__name__) + logger.setLevel(logging.DEBUG) + + console_handler = logging.StreamHandler() + console_handler.setLevel(logging.INFO) + formatter = logging.Formatter('[%(levelname)s] %(name)s.%(funcName)s: %(message)s') + console_handler.setFormatter(formatter) + logger.addHandler(console_handler) + + # Rotate logs every 10 MB, keeping 5 backups + file_handler = RotatingFileHandler('DocGen.log', maxBytes=1024*1024*10, backupCount=5) + file_handler.setLevel(logging.DEBUG) + formatter = logging.Formatter('%(asctime)s [%(levelname)s] %(name)s.%(funcName)s: %(message)s') + file_handler.setFormatter(formatter) + logger.addHandler(file_handler) + + return logger + + def wiki_on_a_page(self) -> str: + self.logging.info('Building Wiki on a page markdown file') + master_file = '' + self.logging.debug('Generating overview') + overview = self.generate_overview() + self.logging.debug('Generating md tables') + md_tables = self.generate_md_tables() + self.logging.debug('Generating entity relationship diagram') + entity_relationship = self.generate_erd() + self.logging.debug('Generating lineage report') + lineage = self.generate_lineage() + self.logging.debug('Generating markdown file') + master_file += overview + master_file += '\n## Table overview\n\n' + master_file += md_tables + master_file += '\n\n## Entity Relationship Diagram\n\n```mermaid\n' + master_file += entity_relationship + master_file += '\n```\n' + master_file += '\n\n## Lineage Report\n\n```mermaid\n' + master_file += lineage + master_file += '\n```\n' + self.logging.debug('Generating markdown file complete') + return master_file + + def generate_erd(self) -> str: + self.logging.info('starting erd generation') + mermaid_erd = self._generate_erd_tables() + self.logging.info('tables generated, generating relationships') + relationships = self._generate_erd_relationships() + self.logging.info('Relationships generated, combining and returning') + mermaid_erd.extend(relationships) + erd_code = "\n".join(mermaid_erd) + return erd_code + + def generate_md_tables(self) -> str: + self.logging.info('starting table generation') + md_table = [ + "| Entity ID | Entity Name | Description | Entity Type | Primary Key(s) |", + "|-----------|-------------|-------------|-------------|----------------|", + ] + for entity in self.details['entities']: + if not entity.get('entity_columns',None): + primary_key_string = '' + else: + pk_list = [column['column_name'] for column in entity['entity_columns'] if column['is_pk'] is True] + primary_key_string = ", ".join(pk_list) + md_table.append( + f"| {entity['entity_id']} | {entity['entity_name']} | {entity.get('entity_description','')} | {entity['entity_type']} | {primary_key_string} |" + ) + md_output = "\n".join(md_table) + return md_output + + def generate_overview(self) -> str: + self.logging.info('Generating Overview String') + self.logging.debug(f'overview Product {self.details.get('product_name',"Missing Product Name")}') + self.logging.debug(f'overview Team {self.details.get('responsible_team',"Missing Responsible Team")}') + overview = f'''# {self.details.get('product_name',"Missing Product Name")} + +## Maintained by: {self.details.get('responsible_team',"Missing Responsible Team")} +''' + return overview + + def generate_lineage(self): + mermaid_lines = [r'''%%{init: {"flowchart": {"defaultRenderer": "elk"}} }%% +flowchart LR +'''] + for entity in self.details['entities']: + mermaid_lines.append(f"{entity['entity_id']}[{entity['entity_id']} {entity['entity_type']} {entity['entity_name']}]") + + mermaid_lines.append("\n") + + for entity in self.details['entities']: + for dependant in entity.get('entity_dependencies',[]): + mermaid_lines.append(f"{dependant} --> {entity['entity_id']}") + + mermaid = "\n".join(mermaid_lines) + return mermaid + + def _generate_erd_tables(self) -> list: + mermaid_erd = ["erDiagram"] + self.logging.info('getting gold entity information') + for entity in self.details['entities']: + self.logging.debug(f'looking at {entity.get('entity_id')}, {entity.get('entity_name')}, {entity.get('entity_type')}') + if entity.get('entity_type') != 'gold': + continue + self.logging.debug(f'entity {entity.get('entity_id')} is golden, getting column information') + mermaid_erd.append(f" {entity.get('entity_name')} {{") + for column in entity.get('entity_columns'): + self.logging.debug(column) + col_name_with_pk = f'{column['column_name']} PK' if column['is_pk'] is True else column['column_name'] + mermaid_erd.append(f" { + column['datatype']} {col_name_with_pk}") + mermaid_erd.append(" }") + return mermaid_erd + + def _generate_erd_relationships(self) -> set: + relationships = set() + for entity_a in self.details['entities']: + self.logging.debug(f'looking at {entity_a.get('entity_id')}, {entity_a.get('entity_name')}, {entity_a.get('entity_type')}') + if entity_a.get('entity_type') != 'gold': + continue + entity_a_columns = [column['column_name'] for column in entity_a['entity_columns']] + for entity_b in self.details['entities']: + self.logging.debug(f'looking at {entity_b.get('entity_id')}, {entity_b.get('entity_name')}, {entity_b.get('entity_type')}') + if entity_b.get('entity_type') != 'gold': + continue + if entity_a['entity_id'] == entity_b['entity_id']: + self.logging.debug('not handling self joins right now. 🫢') + continue + entity_b_columns = [column['column_name'] for column in entity_b['entity_columns'] if column['is_pk'] is True] + for column in entity_a_columns: + if column in entity_b_columns: + relationships.add(f' {entity_a["entity_name"]} ||--|| {entity_b["entity_name"]} : "{column}"') + return relationships \ No newline at end of file diff --git a/example_use.py b/example_use.py new file mode 100644 index 0000000..372574c --- /dev/null +++ b/example_use.py @@ -0,0 +1,16 @@ +import yaml +import os + +from docgen import DocGen + + +input_file_path = os.path.join('examples', 'example_docgen_product.yaml') +output_file_path = os.path.join('examples', 'example_docgen_output.md') + +with open(input_file_path) as f: + file = yaml.safe_load(f) + +with open(output_file_path,'w') as md: + md.write(DocGen(file).wiki_on_a_page()) + +# DocGen(file).release_notes_idea() \ No newline at end of file diff --git a/examples/example_docgen_output.md b/examples/example_docgen_output.md new file mode 100644 index 0000000..e7cce8b --- /dev/null +++ b/examples/example_docgen_output.md @@ -0,0 +1,139 @@ +# The aiimi Data Product + +## Maintained by: The aiimi Data Engineers + +## Table overview + +| Entity ID | Entity Name | Description | Entity Type | Primary Key(s) | +|-----------|-------------|-------------|-------------|----------------| +| 1 | transactions | Transaction Fact Table One line per transaction, but only transactions that have actually happened. | gold | transaction_id | +| 2 | scheduled_transactions | Scheduled Transaction Fact Table One line per transaction, but only transactions that have not actually happened. | gold | scheduled_transaction_id | +| 3 | accounts | Accounts Dimension Table Holds all the information relating to an account, type 1, 1 line per account. | gold | account_id | +| 4 | categories | Categories Dimension Table Holds all the information relating to a category, type 1, 1 line per category. | gold | category_id | +| 5 | payees | Payees Dimension Table Holds all the information relating to a payee, type 1, 1 line per payee. | gold | payee_id | +| 6 | dates | Good old fashioned Date Dimension | gold | date_id | +| 7 | accounts | Silver Accounts Table Other random information. | silver | | +| 8 | categories | Silver Categories Table Other random information. | silver | | +| 9 | payees | Silver Payees Table Other random information. | silver | | +| 10 | scheduled_transactions | Silver Scheduled Transactions Table Other random information. | silver | | +| 11 | transactions | Silver Transactions Table Other random information. | silver | | +| 12 | accounts | | bronze | | +| 13 | categories | | bronze | | +| 14 | payees | | bronze | | +| 15 | scheduled_transactions | | bronze | | +| 16 | transactions | | bronze | | + +## Entity Relationship Diagram + +```mermaid +erDiagram + transactions { + string transaction_id PK + int account_id + int category_id + int payee_id + int date_id + decimal amount + boolean cleared + boolean approved + boolean deleted + string memo + string flag_color + string transfer_account_id + } + scheduled_transactions { + int scheduled_transaction_id PK + int account_id + int category_id + int payee_id + str date_first + str date_next + decimal amount + string frequency + boolean deleted + text memo + string flag_color + str transfer_account_id + } + accounts { + int account_id PK + string account_name + string account_type + boolean on_budget + boolean closed + text note + decimal balance + decimal cleared_balance + decimal uncleared_balance + boolean deleted + } + categories { + int category_id PK + string category_name + string category_group_name + boolean hidden + text note + decimal budgeted + decimal activity + decimal balance + boolean deleted + } + payees { + int payee_id PK + string payee_name + boolean deleted + } + dates { + string date_id PK + date date + int year + int month + int day + boolean is_weekday + int weekday + } + scheduled_transactions ||--|| payees : "payee_id" + transactions ||--|| categories : "category_id" + scheduled_transactions ||--|| accounts : "account_id" + transactions ||--|| dates : "date_id" + scheduled_transactions ||--|| categories : "category_id" + transactions ||--|| payees : "payee_id" + transactions ||--|| accounts : "account_id" +``` + + +## Lineage Report + +```mermaid +%%{init: {"flowchart": {"defaultRenderer": "elk"}} }%% +flowchart LR + +1[1 gold transactions] +2[2 gold scheduled_transactions] +3[3 gold accounts] +4[4 gold categories] +5[5 gold payees] +6[6 gold dates] +7[7 silver accounts] +8[8 silver categories] +9[9 silver payees] +10[10 silver scheduled_transactions] +11[11 silver transactions] +12[12 bronze accounts] +13[13 bronze categories] +14[14 bronze payees] +15[15 bronze scheduled_transactions] +16[16 bronze transactions] + + +11 --> 1 +10 --> 2 +7 --> 3 +8 --> 4 +9 --> 5 +12 --> 7 +13 --> 8 +14 --> 9 +15 --> 10 +16 --> 11 +``` diff --git a/examples/example_docgen_product.yaml b/examples/example_docgen_product.yaml new file mode 100644 index 0000000..111114f --- /dev/null +++ b/examples/example_docgen_product.yaml @@ -0,0 +1,537 @@ +product_name: The aiimi Data Product +responsible_team: The aiimi Data Engineers +entities: + - entity_name: transactions + entity_id: 1 + entity_type: gold + entity_columns: + - column_name: transaction_id + is_pk: True + datatype: string + - column_name: account_id + is_pk: False + datatype: int + - column_name: category_id + is_pk: False + datatype: int + - column_name: payee_id + is_pk: False + datatype: int + - column_name: date_id + is_pk: False + datatype: int + - column_name: amount + is_pk: False + datatype: decimal + - column_name: cleared + is_pk: False + datatype: boolean + - column_name: approved + is_pk: False + datatype: boolean + - column_name: deleted + is_pk: False + datatype: boolean + - column_name: memo + is_pk: False + datatype: string + - column_name: flag_color + is_pk: False + datatype: string + - column_name: transfer_account_id + is_pk: False + datatype: string + entity_dependencies: + - 11 + entity_description: >- + Transaction Fact Table + One line per transaction, but only transactions that have actually happened. + - entity_name: scheduled_transactions + entity_id: 2 + entity_type: gold + entity_columns: + - column_name: scheduled_transaction_id + is_pk: True + datatype: int + - column_name: account_id + is_pk: False + datatype: int + - column_name: category_id + is_pk: False + datatype: int + - column_name: payee_id + is_pk: False + datatype: int + - column_name: date_first + is_pk: False + datatype: str + - column_name: date_next + is_pk: False + datatype: str + - column_name: amount + is_pk: False + datatype: decimal + - column_name: frequency + is_pk: False + datatype: string + - column_name: deleted + is_pk: False + datatype: boolean + - column_name: memo + is_pk: False + datatype: text + - column_name: flag_color + is_pk: False + datatype: string + - column_name: transfer_account_id + is_pk: False + datatype: str + entity_dependencies: + - 10 + entity_description: >- + Scheduled Transaction Fact Table + One line per transaction, but only transactions that have not actually happened. + - entity_name: accounts + entity_id: 3 + entity_type: gold + entity_columns: + - column_name: account_id + is_pk: True + datatype: int + - column_name: account_name + is_pk: False + datatype: string + - column_name: account_type + is_pk: False + datatype: string + - column_name: on_budget + is_pk: False + datatype: boolean + - column_name: closed + is_pk: False + datatype: boolean + - column_name: note + is_pk: False + datatype: text + - column_name: balance + is_pk: False + datatype: decimal + - column_name: cleared_balance + is_pk: False + datatype: decimal + - column_name: uncleared_balance + is_pk: False + datatype: decimal + - column_name: deleted + is_pk: False + datatype: boolean + entity_dependencies: + - 7 + entity_description: >- + Accounts Dimension Table + Holds all the information relating to an account, type 1, 1 line per account. + - entity_name: categories + entity_id: 4 + entity_type: gold + entity_columns: + - column_name: category_id + is_pk: True + datatype: int + - column_name: category_name + is_pk: False + datatype: string + - column_name: category_group_name + is_pk: False + datatype: string + - column_name: hidden + is_pk: False + datatype: boolean + - column_name: note + is_pk: False + datatype: text + - column_name: budgeted + is_pk: False + datatype: decimal + - column_name: activity + is_pk: False + datatype: decimal + - column_name: balance + is_pk: False + datatype: decimal + - column_name: deleted + is_pk: False + datatype: boolean + entity_dependencies: + - 8 + entity_description: >- + Categories Dimension Table + Holds all the information relating to a category, type 1, 1 line per category. + - entity_name: payees + entity_id: 5 + entity_type: gold + entity_columns: + - column_name: payee_id + is_pk: True + datatype: int + - column_name: payee_name + is_pk: False + datatype: string + - column_name: deleted + is_pk: False + datatype: boolean + entity_dependencies: + - 9 + entity_description: >- + Payees Dimension Table + Holds all the information relating to a payee, type 1, 1 line per payee. + - entity_name: dates + entity_id: 6 + entity_type: gold + entity_columns: + - column_name: date_id + is_pk: True + datatype: string + - column_name: date + is_pk: False + datatype: date + - column_name: year + is_pk: False + datatype: int + - column_name: month + is_pk: False + datatype: int + - column_name: day + is_pk: False + datatype: int + - column_name: is_weekday + is_pk: False + datatype: boolean + - column_name: weekday + is_pk: False + datatype: int + entity_description: >- + Good old fashioned Date Dimension + - entity_name: accounts + entity_id: 7 + entity_type: silver + entity_columns: + - column_name: id + is_pk: False + datatype: String + - column_name: name + is_pk: False + datatype: String + - column_name: type + is_pk: False + datatype: String + - column_name: on_budget + is_pk: False + datatype: Boolean + - column_name: closed + is_pk: False + datatype: Boolean + - column_name: note + is_pk: False + datatype: String + - column_name: balance + is_pk: False + datatype: Int64 + - column_name: cleared_balance + is_pk: False + datatype: Int64 + - column_name: uncleared_balance + is_pk: False + datatype: Int64 + - column_name: transfer_payee_id + is_pk: False + datatype: String + - column_name: direct_import_linked + is_pk: False + datatype: Boolean + - column_name: direct_import_in_error + is_pk: False + datatype: Boolean + - column_name: last_reconciled_at + is_pk: False + datatype: String + - column_name: deleted + is_pk: False + datatype: Boolean + - column_name: ingestion_date + is_pk: False + datatype: Date + entity_dependencies: + - 12 + entity_description: >- + Silver Accounts Table + Other random information. + - entity_name: categories + entity_id: 8 + entity_type: silver + entity_columns: + - column_name: id + is_pk: False + datatype: String + - column_name: category_group_id + is_pk: False + datatype: String + - column_name: category_group_name + is_pk: False + datatype: String + - column_name: name + is_pk: False + datatype: String + - column_name: hidden + is_pk: False + datatype: Boolean + - column_name: original_category_group_id + is_pk: False + datatype: Null + - column_name: note + is_pk: False + datatype: String + - column_name: budgeted + is_pk: False + datatype: Int64 + - column_name: activity + is_pk: False + datatype: Int64 + - column_name: balance + is_pk: False + datatype: Int64 + - column_name: goal_type + is_pk: False + datatype: String + - column_name: goal_needs_whole_amount + is_pk: False + datatype: Boolean + - column_name: goal_day + is_pk: False + datatype: Int64 + - column_name: goal_cadence + is_pk: False + datatype: Int64 + - column_name: goal_cadence_frequency + is_pk: False + datatype: Int64 + - column_name: goal_creation_month + is_pk: False + datatype: String + - column_name: goal_target + is_pk: False + datatype: Int64 + - column_name: goal_target_month + is_pk: False + datatype: String + - column_name: goal_percentage_complete + is_pk: False + datatype: Int64 + - column_name: goal_months_to_budget + is_pk: False + datatype: Int64 + - column_name: goal_under_funded + is_pk: False + datatype: Int64 + - column_name: goal_overall_funded + is_pk: False + datatype: Int64 + - column_name: goal_overall_left + is_pk: False + datatype: Int64 + - column_name: deleted + is_pk: False + datatype: Boolean + - column_name: ingestion_date + is_pk: False + datatype: Date + entity_dependencies: + - 13 + entity_description: >- + Silver Categories Table + Other random information. + - entity_name: payees + entity_id: 9 + entity_type: silver + entity_columns: + - column_name: id + is_pk: False + datatype: String + - column_name: name + is_pk: False + datatype: String + - column_name: transfer_account_id + is_pk: False + datatype: String + - column_name: deleted + is_pk: False + datatype: Boolean + - column_name: ingestion_date + is_pk: False + datatype: Date + entity_dependencies: + - 14 + entity_description: >- + Silver Payees Table + Other random information. + - entity_name: scheduled_transactions + entity_id: 10 + entity_type: silver + entity_columns: + - column_name: id + is_pk: False + datatype: String + - column_name: date_first + is_pk: False + datatype: String + - column_name: date_next + is_pk: False + datatype: String + - column_name: frequency + is_pk: False + datatype: String + - column_name: amount + is_pk: False + datatype: Int64 + - column_name: memo + is_pk: False + datatype: Null + - column_name: flag_color + is_pk: False + datatype: Null + - column_name: flag_name + is_pk: False + datatype: Null + - column_name: account_id + is_pk: False + datatype: String + - column_name: account_name + is_pk: False + datatype: String + - column_name: payee_id + is_pk: False + datatype: String + - column_name: payee_name + is_pk: False + datatype: String + - column_name: category_id + is_pk: False + datatype: String + - column_name: category_name + is_pk: False + datatype: String + - column_name: transfer_account_id + is_pk: False + datatype: Null + - column_name: deleted + is_pk: False + datatype: Boolean + - column_name: subtransactions + is_pk: False + datatype: List(Null) + - column_name: ingestion_date + is_pk: False + datatype: Date + entity_dependencies: + - 15 + entity_description: >- + Silver Scheduled Transactions Table + Other random information. + - entity_name: transactions + entity_id: 11 + entity_type: silver + entity_columns: + - column_name: id + is_pk: False + datatype: String + - column_name: date + is_pk: False + datatype: String + - column_name: amount + is_pk: False + datatype: Int64 + - column_name: memo + is_pk: False + datatype: String + - column_name: cleared + is_pk: False + datatype: String + - column_name: approved + is_pk: False + datatype: Boolean + - column_name: flag_color + is_pk: False + datatype: Null + - column_name: flag_name + is_pk: False + datatype: Null + - column_name: account_id + is_pk: False + datatype: String + - column_name: account_name + is_pk: False + datatype: String + - column_name: payee_id + is_pk: False + datatype: String + - column_name: payee_name + is_pk: False + datatype: String + - column_name: category_id + is_pk: False + datatype: String + - column_name: category_name + is_pk: False + datatype: String + - column_name: transfer_account_id + is_pk: False + datatype: String + - column_name: transfer_transaction_id + is_pk: False + datatype: String + - column_name: matched_transaction_id + is_pk: False + datatype: String + - column_name: import_id + is_pk: False + datatype: String + - column_name: import_payee_name + is_pk: False + datatype: String + - column_name: import_payee_name_original + is_pk: False + datatype: String + - column_name: deleted + is_pk: False + datatype: Boolean + - column_name: subtransactions + is_pk: False + datatype: List(Null) + - column_name: ingestion_date + is_pk: False + datatype: Date + entity_dependencies: + - 16 + entity_description: >- + Silver Transactions Table + Other random information. + - entity_name: accounts + entity_id: 12 + entity_type: bronze + - entity_name: categories + entity_id: 13 + entity_type: bronze + - entity_name: payees + entity_id: 14 + entity_type: bronze + - entity_name: scheduled_transactions + entity_id: 15 + entity_type: bronze + - entity_name: transactions + entity_id: 16 + entity_type: bronze +other_relationships: + - entity_name: other_transactions + entity_id: 21 + entity_type: gold + entity_dependencies: + - 22 \ No newline at end of file diff --git a/examples/example_release_notes.yaml b/examples/example_release_notes.yaml new file mode 100644 index 0000000..5a2434e --- /dev/null +++ b/examples/example_release_notes.yaml @@ -0,0 +1,15 @@ +- release_number: 0.0.3 + release_date: 2025-03-12 + changes: + - added fhj table + - changed column a in 372 table +- release_number: 0.0.2 + release_date: 2025-03-07 + changes: + - added abc table + - changed column a in 678 table +- release_number: 0.0.1 + release_date: 2025-03-03 + changes: + - added xyz table + - changed column a in 123 table \ No newline at end of file