From 843e59811a5a104df1c746627aa668d26fdc9f60 Mon Sep 17 00:00:00 2001 From: Michel Jonathan Schmitz Date: Wed, 5 Jun 2019 16:15:24 +0200 Subject: [PATCH] feat: added output file name for uml generation --- README.md | 6 +- package-lock.json | 136 +++++++++++++++++++++++++++++++++------ package.json | 2 +- src/cli.ts | 15 +++-- src/uml/createDiagram.ts | 13 ++-- src/uml/umlConfig.ts | 5 ++ 6 files changed, 148 insertions(+), 29 deletions(-) diff --git a/README.md b/README.md index cb1ae54c..ae08463e 100644 --- a/README.md +++ b/README.md @@ -161,11 +161,13 @@ Multiple options can be set to enhance the diagram. By default all additional in - `--showProperties` to show all mandatory attributes of the classes and interfaces. - `--showOptionalProperties` to show all mandatory attributes of the classes and interfaces. `--showProperties` must be set! +- `--showInheritedProperties` to show all inherited attributes of the classes and interfaces. `--showProperties` must be set! - `--showEnumValues` to show all enumeration and type (enumeration-like) values - `--showInheritance` to show the hierarchy of the classes and interfaces. Inherited attributes will only be shown in their parent. - `--showAssociations` to show all references of classes and interfaces between one another - `--excludeExternals` to exclude external definitions - `--definitions ` to show only specific definitions to reduce the output of the diagram. `` is a comma seperated list of definitions. +- `--outputFileName ` for a custom file name, the file extension will be added automatically (.svg). Otherwise a generic file with a timestamp will be generated into the execution directory. If a file with the same name already exists it will be overwritten! The best way to explore models is to enable `--showInheritance` and `--showAssociations`. Start with just one definition in your `--definition `-list, generate the diagram, look at it, add a new definition that you have seen to your command and generate anew. @@ -185,10 +187,10 @@ openstapps-core-tools plantuml ../core http://localhost:8080 --showProperties -- ### Generating from existing file -The plantuml code is persisted inside the generated filea at the very bottom. You can tweak the model by using the function to generate UML from a PlantUML-file(simple text file). Extract the code (starting from `@startuml` to `@enduml`), edit it manually and execute the function. +The plantuml code is persisted inside the generated file at the very bottom. You can tweak the model by using the function to generate UML from a PlantUML-file(simple text file). Extract the code (starting from `@startuml` to `@enduml`), edit it manually and execute this function. ```shell -openstapps-core-tools plantuml-file /PATH/TO/Project.plantuml http://PLANTUMLSERVER +openstapps-core-tools plantuml-file /PATH/TO/Project.plantuml http://PLANTUMLSERVER OptionalCustomFileName ``` Example-File-Content of Project.plantuml diff --git a/package-lock.json b/package-lock.json index 3aa265f2..8d280601 100644 --- a/package-lock.json +++ b/package-lock.json @@ -60,6 +60,41 @@ "resolved": "https://registry.npmjs.org/@types/node/-/node-10.14.7.tgz", "integrity": "sha512-on4MmIDgHXiuJDELPk1NFaKVUxxCFr37tm8E9yN6rAiF5Pzp/9bBfBHkoexqRiY+hk/Z04EJU9kKEb59YqJ82A==", "dev": true + }, + "diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true + }, + "tslint": { + "version": "5.17.0", + "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.17.0.tgz", + "integrity": "sha512-pflx87WfVoYepTet3xLfDOLDm9Jqi61UXIKePOuca0qoAZyrGWonDG9VTbji58Fy+8gciUn8Bt7y69+KEVjc/w==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "builtin-modules": "^1.1.1", + "chalk": "^2.3.0", + "commander": "^2.12.1", + "diff": "^3.2.0", + "glob": "^7.1.1", + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.1", + "resolve": "^1.3.2", + "semver": "^5.3.0", + "tslib": "^1.8.0", + "tsutils": "^2.29.0" + }, + "dependencies": { + "semver": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", + "dev": true + } + } } } }, @@ -166,9 +201,9 @@ "integrity": "sha512-RTVWV485OOf4+nO2+feurk0chzHkSjkjALiejpHltyuMf/13fGymbbNNFrSKdSSUg1TIwzszXdWsVirxgqYiFA==" }, "@types/nock": { - "version": "10.0.2", - "resolved": "https://registry.npmjs.org/@types/nock/-/nock-10.0.2.tgz", - "integrity": "sha512-jOdoZ3zVLmPWZOoPJDoks+Zo6GsogdZuVBWs8/prWau993qno5PPtukVXKfc+WtS/ROgTPWpiru92z2K6KFYgQ==", + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/@types/nock/-/nock-10.0.3.tgz", + "integrity": "sha512-OthuN+2FuzfZO3yONJ/QVjKmLEuRagS9TV9lEId+WHL9KhftYG+/2z+pxlr0UgVVXSpVD8woie/3fzQn8ft/Ow==", "dev": true, "requires": { "@types/node": "*" @@ -637,6 +672,14 @@ "semver": "^5.5.0", "split": "^1.0.0", "through2": "^3.0.0" + }, + "dependencies": { + "semver": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", + "dev": true + } } }, "conventional-commits-filter": { @@ -662,6 +705,23 @@ "split2": "^2.0.0", "through2": "^3.0.0", "trim-off-newlines": "^1.0.0" + }, + "dependencies": { + "is-text-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz", + "integrity": "sha1-Thqg+1G/vLPpJogAE5cgLBd1tm4=", + "dev": true, + "requires": { + "text-extensions": "^1.0.0" + } + }, + "text-extensions": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.9.0.tgz", + "integrity": "sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==", + "dev": true + } } }, "core-util-is": { @@ -1245,6 +1305,27 @@ "through2": "^2.0.0" }, "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, "through2": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", @@ -1567,15 +1648,6 @@ "has-symbols": "^1.0.0" } }, - "is-text-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-2.0.0.tgz", - "integrity": "sha512-+oDTluR6WEjdXEJMnC2z6A4FRwFoYuvShVVEGsS7ewc0UTi2QtAKMDJuL4BDEVt+5T7MjFo12RP8ghOM75oKJw==", - "dev": true, - "requires": { - "text-extensions": "^2.0.0" - } - }, "is-utf8": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", @@ -2193,6 +2265,12 @@ "requires": { "ms": "^2.1.1" } + }, + "semver": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", + "dev": true } } }, @@ -2776,6 +2854,27 @@ "through2": "^2.0.2" }, "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, "through2": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", @@ -2864,12 +2963,6 @@ "uuid": "^2.0.1" } }, - "text-extensions": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-2.0.0.tgz", - "integrity": "sha512-F91ZqLgvi1E0PdvmxMgp+gcf6q8fMH7mhdwWfzXnl1k+GbpQDmi8l7DzLC5JTASKbwpY3TfxajAUzAXcv2NmsQ==", - "dev": true - }, "through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", @@ -2925,6 +3018,13 @@ "glob": "~7.1.4", "json-stable-stringify": "^1.0.1", "typescript": "~3.4.5" + }, + "dependencies": { + "typescript": { + "version": "3.4.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.4.5.tgz", + "integrity": "sha512-YycBxUb49UUhdNMU5aJ7z5Ej2XGmaIBL0x34vZ82fn3hGvD+bgrMrVDpatgz2f7YxUMJxMkbWxJZeAvDxVe7Vw==" + } } }, "ts-node": { diff --git a/package.json b/package.json index f5173646..6eac5951 100644 --- a/package.json +++ b/package.json @@ -70,7 +70,7 @@ "@types/chai": "4.1.7", "@types/mocha": "5.2.7", "@types/rimraf": "2.0.2", - "@types/nock": "10.0.2", + "@types/nock": "10.0.3", "conventional-changelog-cli": "2.0.21", "mocha": "6.1.4", "mocha-typescript": "1.1.17", diff --git a/src/cli.ts b/src/cli.ts index 1af962d2..c5def8bf 100644 --- a/src/cli.ts +++ b/src/cli.ts @@ -199,6 +199,10 @@ commander '--excludeExternals', 'Exclude external definitions', ) + .option( + '--outputFileName ', + 'Defines the filename of the output', + ) .action(async (relativeSrcPath, plantumlserver, options) => { const plantUmlConfig: UMLConfig = { definitions: @@ -225,9 +229,12 @@ commander : false, showProperties: typeof options.showProperties !== 'undefined' - ? options.showEnumValues + ? options.showProperties : false, }; + if (typeof options.outputFileName !== 'undefined') { + plantUmlConfig.outputFileName = options.outputFileName; + } Logger.log(`PlantUML options: ${JSON.stringify(plantUmlConfig)}`); @@ -241,10 +248,10 @@ commander }); commander - .command('plantuml-file ') - .action(async (file: string, plantumlserver: string) => { + .command('plantuml-file [outputFile]') + .action(async (file: string, plantumlserver: string, outputFile: string) => { const fileContent = readFileSync(resolve(file)).toString(); - await createDiagramFromString(fileContent, plantumlserver); + await createDiagramFromString(fileContent, plantumlserver, outputFile); }); commander.parse(process.argv); diff --git a/src/uml/createDiagram.ts b/src/uml/createDiagram.ts index 485b7250..d2a8c5df 100644 --- a/src/uml/createDiagram.ts +++ b/src/uml/createDiagram.ts @@ -81,7 +81,7 @@ export async function createDiagram( modelPlantUMLCode += definitionPlantUMLCode; } - return await createDiagramFromString(modelPlantUMLCode, plantUmlBaseURL); + return await createDiagramFromString(modelPlantUMLCode, plantUmlBaseURL, config.outputFileName); } /** @@ -90,9 +90,13 @@ export async function createDiagram( * * @param modelPlantUMLCode */ -export async function createDiagramFromString(modelPlantUMLCode: string, plantUmlBaseURL: string) { +export async function createDiagramFromString( + modelPlantUMLCode: string, + plantUmlBaseURL: string, + outputFile = `Diagram-${new Date().toISOString()}`, +) { const plantumlEncoder = require('plantuml-encoder'); - const plantUMLCode = plantumlEncoder.encode(modelPlantUMLCode); + const plantUMLCode = plantumlEncoder.encode(`@startuml\n${modelPlantUMLCode}\n@enduml`); const url = `${plantUmlBaseURL}/svg/${plantUMLCode}`; let response; try { @@ -105,7 +109,8 @@ export async function createDiagramFromString(modelPlantUMLCode: string, plantUm Logger.log(`Please try using the public plantuml server:\nhttp://www.plantuml.com/plantuml/svg/${plantUMLCode}`); throw e; } - const fileName: string = `Diagram-${new Date().toISOString()}.svg`; + // attach file extension + const fileName = `${outputFile}.svg`; try { createWriteStream(fileName).write(response.body); Logger.log(`Writen data to file: ${fileName}`); diff --git a/src/uml/umlConfig.ts b/src/uml/umlConfig.ts index a2a65432..f7e895cf 100644 --- a/src/uml/umlConfig.ts +++ b/src/uml/umlConfig.ts @@ -22,6 +22,11 @@ export interface UMLConfig { */ definitions: string[]; + /** + * Defines the output file name without file extension + */ + outputFileName?: string; + /** * Should the associations between definitions be shown */