Skip to main content

Generate UML diagrams from source code.

Project description

UML Gen for Source-to-UML CLI Workflows

UML Gen converts source code into PlantUML class and sequence diagrams from a command-line workflow.

Teams keep architecture artifacts in sync with implementation by generating diagrams directly from code and instruction. The workflow is scriptable for local development and CI pipelines. The output is optimized for review in UMLMark tools.

Build passing Python 3.12+ Dual license model badge GitHub stars for uml-gen-java

Why UML Gen

Problem:

  • Architecture diagrams become outdated when maintained manually.
  • Large codebases are hard to inspect at class and interaction level.
  • Teams need automation-friendly UML output for CI and review workflows.

Solution:

  • Use umlc-gen and umls-gen to run configuration-driven generation pipelines.
  • Use umlc and umls to generate class and sequence diagrams from UMLMark eclipse input.
  • Produce PlantUML output that can be reviewed, versioned, and shared.
  • Integrate generation commands into scripts and CI jobs with consistent inputs.

Key Capabilities

  • Instruction-driven class generation with umlc-gen.
  • Instruction-driven sequence generation with umls-gen.
  • Command-line class diagram generation with umlc.
  • Command-line sequence diagram generation with umls.
  • PlantUML output suitable for UMLMark preview and navigation workflows.

Supported File Types

  • Source input: Java source files (.java) and source roots.
  • Generation instruction: YAML (.yaml, .yml).
  • Output: PlantUML (.puml, .plantuml) and rendered SVG from UMLMark Tool.

Example

  • PlantUML Class Diagram umlc-CategoryController

    Optimized for viewing with vscode-umlmark

    • PlantUML Source

      @startuml umlc-CategoryController_Depth3
      legend top center
        [[uml/umlc-CategoryController.yaml:1 ⚓uml/umlc-CategoryController.yaml]]
      end legend
      top to bottom direction
      hide empty members
      
      class VisionConfiguration [[src/main/java/cai/peter/vision/common/VisionConfiguration.java:21]] {
        + [[src/main/java/cai/peter/vision/common/VisionConfiguration.java:31 VisionConfiguration()]]
        + [[src/main/java/cai/peter/vision/common/VisionConfiguration.java:55 getVersion()]]
        + [[src/main/java/cai/peter/vision/common/VisionConfiguration.java:59 getGitCommit()]]
      }
      class AbstractFaviconFetcher [[src/main/java/cai/peter/vision/favicon/AbstractFaviconFetcher.java:13]] {
        + [[src/main/java/cai/peter/vision/favicon/AbstractFaviconFetcher.java:22 fetch()]]
        # [[src/main/java/cai/peter/vision/favicon/AbstractFaviconFetcher.java:24 isValidIconResponse()]]
      }
      class FeedQueues [[src/main/java/cai/peter/vision/feed/FeedQueues.java:23]] {
        + [[src/main/java/cai/peter/vision/feed/FeedQueues.java:39 take()]]
        + [[src/main/java/cai/peter/vision/feed/FeedQueues.java:52 add()]]
        + [[src/main/java/cai/peter/vision/feed/FeedQueues.java:115 giveBack()]]
        + [[src/main/java/cai/peter/vision/feed/FeedQueues.java:131 isAllDone()]]
      }
      ...
      
      AbstractFaviconFetcher --> Feed
      FeedQueues --> FeedsRepository
      FeedQueues --> FeedRefreshContext
      FeedQueues --> Feed
      FeedRefreshContext --> Feed
      FeedRefreshContext --> FeedEntry
      SubscriptionDAO --> UnreadCount
      Feed --|> AbstractModel
      ...
      @enduml
      
  • PlantUML Sequence Diagram umls-FeedRefreshTaskGiver

    Optimized for viewing with vscode-umlmark

    • PlantUML Source

      @startuml umls-FeedRefreshTaskGiver
      legend top center
        [[uml/umls-FeedRefreshTaskGiver.yaml:1 ⚓uml/umls-FeedRefreshTaskGiver.yaml]]
      end legend
      hide footbox
      skinparam ParticipantPadding 20
      skinparam BoxPadding 10
      ' autoactivate on
      
      actor "Actor" as Actor_0
      participant "FeedRefreshTaskGiver:\nFeedRefreshTaskGiver" as FeedRefreshTaskGiver_1 [[src/main/java/cai/peter/vision/feed/FeedRefreshTaskGiver.java:9]]
      participant "FeedQueues:\nFeedQueues" as FeedQueues_2 [[src/main/java/cai/peter/vision/feed/FeedQueues.java:23]]
      participant "AdminApi:\nAdminApi" as AdminApi_3 [[src/main/generated/cai/peter/vision/api/controller/AdminApi.java:37]]
      participant "FeedRefreshWorker:\nFeedRefreshWorker" as FeedRefreshWorker_4 [[src/main/java/cai/peter/vision/feed/FeedRefreshWorker.java:25]]
      participant "FeedFetcher:\nFeedFetcher" as FeedFetcher_5 [[src/main/java/cai/peter/vision/feed/FeedFetcher.java:23]]
      participant "HttpGetter:\nHttpGetter" as HttpGetter_6 [[src/main/java/cai/peter/vision/feed/HttpGetter.java:47]]
      participant "FeedParser:\nFeedParser" as FeedParser_7 [[src/main/java/cai/peter/vision/feed/FeedParser.java:32]]
      ...
      Actor_0 -> FeedRefreshTaskGiver_1 : process()\ncallee:[[src/main/java/cai/peter/vision/feed/FeedRefreshTaskGiver.java:30 FeedRefreshTaskGiver.java:30]]\ncaller:[entry include-order]
      FeedRefreshTaskGiver_1 -> FeedQueues_2 : take()\ncallee:[[src/main/java/cai/peter/vision/feed/FeedQueues.java:39 FeedQueues.java:39]]\ncaller:[[src/main/java/cai/peter/vision/feed/FeedRefreshTaskGiver.java:34 FeedRefreshTaskGiver.java:34]]
      FeedQueues_2 -> FeedQueues_2 : refill()\ncallee:[[src/main/java/cai/peter/vision/feed/FeedQueues.java:66 FeedQueues.java:66]]\ncaller:[[src/main/java/cai/peter/vision/feed/FeedQueues.java:43 FeedQueues.java:43]]
      FeedQueues_2 -> FeedQueues_2 : add()\ncallee:[[src/main/java/cai/peter/vision/feed/FeedQueues.java:52 FeedQueues.java:52]]\ncaller:[[src/main/java/cai/peter/vision/feed/FeedQueues.java:74 FeedQueues.java:74]]
      FeedQueues_2 -> FeedQueues_2 : add()\ncallee:[[src/main/java/cai/peter/vision/feed/FeedQueues.java:52 FeedQueues.java:52]]\ncaller:[[src/main/java/cai/peter/vision/feed/FeedQueues.java:58 FeedQueues.java:58]]
      FeedQueues_2 -> AdminApi_3 : save()\ncallee:[[src/main/generated/cai/peter/vision/api/controller/AdminApi.java:230 AdminApi.java:230]]\ncaller:[[src/main/java/cai/peter/vision/feed/FeedQueues.java:108 FeedQueues.java:108]]
      FeedRefreshTaskGiver_1 -> FeedRefreshWorker_4 : updateFeed()\ncallee:[[src/main/java/cai/peter/vision/feed/FeedRefreshWorker.java:47 FeedRefreshWorker.java:47]]\ncaller:[[src/main/java/cai/peter/vision/feed/FeedRefreshTaskGiver.java:36 FeedRefreshTaskGiver.java:36]]
      FeedRefreshWorker_4 -> FeedRefreshWorker_4 : update()\ncallee:[[src/main/java/cai/peter/vision/feed/FeedRefreshWorker.java:52 FeedRefreshWorker.java:52]]\ncaller:[[src/main/java/cai/peter/vision/feed/FeedRefreshWorker.java:49 FeedRefreshWorker.java:49]]
      FeedRefreshWorker_4 -> FeedFetcher_5 : fetch()\ncallee:[[src/main/java/cai/peter/vision/feed/FeedFetcher.java:32 FeedFetcher.java:32]]\ncaller:[[src/main/java/cai/peter/vision/feed/FeedRefreshWorker.java:58 FeedRefreshWorker.java:58]]
      ...
      @enduml
      

Install

Install the UML Gen CLI:

pip install uml-gen

Or:

pipx install uml-gen

Install from source:

git clone https://github.com/petercai/uml-gen-java.git
cd uml-gen-java
uv pip install -e .

Quick Start

  1. Prepare a generation instruction in YAML.
  2. Generate a class diagram with umlc-gen --config instruction.yaml.
  3. Generate a sequence diagram with umls-gen --config instruction.yaml.
  4. Open generated .puml files in UMLMark for preview and source navigation.

Developer Flow (UMLMark Suite)

Recommended end-to-end workflow for Design as Code / Architecture as Code:

  1. Write or update source code.
  2. Generate PlantUML diagrams from source using UML Gen (CLI).
  3. Open generated .puml diagrams in UMLMark preview.
  4. Navigate from diagram elements back to source files.
  5. Iterate: update source, regenerate diagrams, and re-verify in preview.

Flow summary:

source code -> uml-gen generation -> .puml preview in UMLMark -> code navigation back -> iterate

Configuration Highlights

  • Generate class diagram:

      # fine-grained diagram generation control
      umlc_gen.py --config <your-generation-instruction>.yaml 
    
      # quick generation
      umlc_gen.py --input src/main/java/com/example/MyService.java
      # or when the class name is unique
      umlc_gen.py --input MyService
    
  • Generate sequence diagram:

    umls_gen.py --config <your-generation-instruction>.yaml
    
  • Use --config with umlc-gen and umls-gen for repeatable generation.

  • Keep generation rules in repository-scoped YAML files for team consistency.

  • Store outputs under versioned folders such as uml/plantuml/ when reviewing changes in pull requests.

Ecosystem: UMLMark Suite

Together, these tools support a full code-to-architecture workflow:

Tool Role
UML Gen (CLI) Generate class and sequence diagrams from source code
UMLMark (VS Code Extension) Interactive PlantUML preview, code navigation, export
UMLMark (Eclipse Plugin) UML generation and usage inside Eclipse

License

This project follows a dual-license model across the UMLMark Suite.

If you need commercial usage guidance for your deployment scenario, contact the maintainer.

Support

If UML Gen helps your team, support the project here:

For Contributors

Run local checks and packaging commands before opening pull requests:

uv pip install -e .
python -m build

Track issues and feature requests in the GitHub issue tracker: https://github.com/petercai/uml-gen-java/issues.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

uml_gen-1.0.1.tar.gz (43.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

uml_gen-1.0.1-py3-none-any.whl (52.9 kB view details)

Uploaded Python 3

File details

Details for the file uml_gen-1.0.1.tar.gz.

File metadata

  • Download URL: uml_gen-1.0.1.tar.gz
  • Upload date:
  • Size: 43.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.8 {"installer":{"name":"uv","version":"0.11.8","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for uml_gen-1.0.1.tar.gz
Algorithm Hash digest
SHA256 5abf662845059a59e048fb2fc425815540119ad0a2d412d274109955f1f4e81d
MD5 3fb06ee3e82cfa76929146048b80d224
BLAKE2b-256 614c0a63b66177207dd5048a33951a1560c627dfa63d9592d2cc9e7db6e7e836

See more details on using hashes here.

File details

Details for the file uml_gen-1.0.1-py3-none-any.whl.

File metadata

  • Download URL: uml_gen-1.0.1-py3-none-any.whl
  • Upload date:
  • Size: 52.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.8 {"installer":{"name":"uv","version":"0.11.8","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for uml_gen-1.0.1-py3-none-any.whl
Algorithm Hash digest
SHA256 800b725a273bbda82f6c10160f0880be972b2171602faa24b23b881f38b964ad
MD5 5cead24c76bf523607a35c410cb64ad2
BLAKE2b-256 4d6ac8d401a29a988544926e01546b426bbf969fa04842b0fdfcd613eefe48c9

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page