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.
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-genandumls-gento run configuration-driven generation pipelines. - Use
umlcandumlsto 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
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
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
- Prepare a generation instruction in YAML.
- Generate a class diagram with
umlc-gen --config instruction.yaml. - Generate a sequence diagram with
umls-gen --config instruction.yaml. - Open generated
.pumlfiles in UMLMark for preview and source navigation.
Developer Flow (UMLMark Suite)
Recommended end-to-end workflow for Design as Code / Architecture as Code:
- Write or update source code.
- Generate PlantUML diagrams from source using UML Gen (CLI).
- Open generated
.pumldiagrams in UMLMark preview. - Navigate from diagram elements back to source files.
- 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
refer to instruction example
-
Generate sequence diagram:
umls_gen.py --config <your-generation-instruction>.yaml
refer to instruction example
-
Use
--configwithumlc-genandumls-genfor 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.
- Free for Non-Commercial Use: LICENSE.txt
- Commercial Use Requires License: COMMERCIAL_LICENSE.txt
If you need commercial usage guidance for your deployment scenario, contact the maintainer.
Support
If UML Gen helps your team, support the project here:
- Support me: https://paypal.me/petercaica
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
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file uml_gen-1.0.2.tar.gz.
File metadata
- Download URL: uml_gen-1.0.2.tar.gz
- Upload date:
- Size: 58.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.23 {"installer":{"name":"uv","version":"0.11.23","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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
60a2d2059405b2774dbd2e804baab056e4c315f5ed6254d2143c389e82c0e5fa
|
|
| MD5 |
58f35a42424e78a2d94581dae3bf8c59
|
|
| BLAKE2b-256 |
11ea653f0ad4c2a13955c4746428d43338fc87362c86ec44d70e0bb3fae34941
|
File details
Details for the file uml_gen-1.0.2-py3-none-any.whl.
File metadata
- Download URL: uml_gen-1.0.2-py3-none-any.whl
- Upload date:
- Size: 71.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.23 {"installer":{"name":"uv","version":"0.11.23","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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a96c40b8690ba2669d24a99751507005cf8315ed526c5b763cc1fcbd85382018
|
|
| MD5 |
c1b4442771f56f4c95380dc7d4985ca7
|
|
| BLAKE2b-256 |
772edcda76bab20949ce302ea9cbc527b004269eb0481b0e03ead39f8bf22d00
|