mdmodels 0.2.10

A tool to generate models, code and schemas from markdown files
Documentation
name: Tests

# This workflow runs various tests across different languages and environments
# to ensure cross-platform compatibility and functionality

on:
  workflow_dispatch:
  push:
    paths:
      - 'src/**'
      - 'tests/**'
      - 'Cargo.toml'
      - 'Cargo.lock'
      - 'templates/**'
      - '.github/workflows/test.yml'
  pull_request:
    paths:
      - 'src/**'
      - 'tests/**'
      - 'Cargo.toml'
      - 'Cargo.lock'
      - 'templates/**'
      - '.github/workflows/test.yml'
env:
  CARGO_TERM_COLOR: always

jobs:
  # Runs the core Rust unit tests for the project
  unit-tests:
    name: Unit Tests (${{ matrix.os }})
    runs-on: ${{ matrix.os }}
    strategy:
      fail-fast: false
      matrix:
        # Windows works, but breaks minijinja
        # iterators and thus some content is
        # rendered in a different order *sigh*
        os: [ubuntu-latest, macos-latest]

    steps:
      - uses: actions/checkout@v4
      - name: Build
        run: cargo build --verbose
      - name: Run tests
        run: cargo test --verbose

  # Tests Go code generation and validates the output
  golang:
    name: Go
    needs: unit-tests
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Restore cached build
        uses: actions/cache/restore@v3
        with:
          path: |
            target
            ~/.cargo
          key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}
      - name: Generate Go code
        run: |
          cargo run convert \
            -i tests/data/model.md \
            -o tests/envs/go/generated.go \
            -t golang

      - name: Build Docker image
        run: docker build -t gotests -f tests/envs/go/Dockerfile .
      - name: Run tests
        run: docker run --rm gotests

  # Tests Python code generation for multiple Python frameworks:
  # - dataclasses
  # - pydantic
  # - pydantic with XML support
  python:
    name: Python
    needs: unit-tests
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Generate Python code
        run: |
          cargo run convert \
            -i tests/data/model.md \
            -o tests/envs/python/gen_dataclasses.py \
            -t python-dataclass

          cargo run convert \
            -i tests/data/model.md \
            -o tests/envs/python/gen_pydantic.py \
            -t python-pydantic

          cargo run convert \
            -i tests/data/model.md \
            -o tests/envs/python/gen_pydantic_xml.py \
            -t python-pydantic-xml

      - name: Build Docker image
        run: docker build -t pythontests -f tests/envs/python/Dockerfile .
      - name: Run tests
        run: docker run --rm pythontests

  # Tests TypeScript code generation with Zod schema validation
  typescript:
    name: TypeScript Zod
    needs: unit-tests
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Generate TypeScript code
        run: |
          cargo run convert \
            -i tests/data/model.md \
            -o tests/envs/typescript/generated.ts \
            -t typescript-zod

      - name: Build Docker image
        run: docker build -t tstests -f tests/envs/typescript/Dockerfile .
      - name: Run tests
        run: docker run --rm tstests

  # Tests Julia code generation and validates the output
  julia:
    name: Julia
    needs: unit-tests
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Restore cached build
        uses: actions/cache/restore@v3
        with:
          path: |
            target
            ~/.cargo
          key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}
      - name: Generate Julia code
        run: |
          cargo run convert \
            -i tests/data/model.md \
            -o tests/envs/julia/generated.jl \
            -t julia

      - name: Setup Julia
        uses: julia-actions/setup-julia@v1
        with:
          version: '1.9'

      - name: Install dependencies
        run: |
          julia -e 'using Pkg; Pkg.add(["Test", "JSON3", "StructTypes"])'

      - name: Run tests
        run: |
          cd tests/envs/julia
          julia test.jl

  # Tests Rust without JSON-LD code generation and validates the output
  rust:
    name: Rust
    needs: unit-tests
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Generate Rust code
        run: |
          cargo run convert \
            -i tests/data/model.md \
            -o tests/envs/rust/src/generated.rs \
            -t rust

      - name: Build Docker image
        run: docker build -t rusttests -f tests/envs/rust/Dockerfile .
      - name: Run tests
        run: docker run --rm rusttests

  # Tests Rust with JSON-LD code generation and validates the output
  rust-ld:
    name: Rust (LD)
    needs: unit-tests
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Generate Rust code
        run: |
          cargo run convert \
            -i tests/data/model.md \
            -o tests/envs/rust-ld/src/generated.rs \
            -O jsonld \
            -t rust

      - name: Build Docker image
        run: docker build -t rusttests -f tests/envs/rust-ld/Dockerfile .
      - name: Run tests
        run: docker run --rm rusttests

  # Tests WASM build for npm bundler target
  bundler:
    name: Bundler
    needs: unit-tests
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v3

      - name: Install Rust
        uses: dtolnay/rust-toolchain@stable

      - uses: jetli/wasm-pack-action@v0.4.0
        with:
          version: 'latest'

      - name: Build WASM for npm (bundle)
        run: wasm-pack build --target bundler --features wasm --no-default-features

  # Tests WASM build for web target
  web:
    name: Web
    needs: unit-tests
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v3

      - name: Install Rust
        uses: dtolnay/rust-toolchain@stable

      - uses: jetli/wasm-pack-action@v0.4.0
        with:
          version: 'latest'

      - name: Build WASM for npm (bundle)
        run: wasm-pack build --features wasm --no-default-features