Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

PlantUML support of plantuml-stdlib #578

Closed
romkavt opened this issue Feb 1, 2021 · 8 comments · Fixed by #580
Closed

PlantUML support of plantuml-stdlib #578

romkavt opened this issue Feb 1, 2021 · 8 comments · Fixed by #580
Labels
👶 good first issue Good for newcomers 🐞 bug Something isn't working

Comments

@romkavt
Copy link

romkavt commented Feb 1, 2021

It would be great to implement support of entire https://plantuml.com/stdlib embedded into PlantUML.
Looks strange: "!include <C4/C4_Container>" works well, but "!include <archimate/Archimate>" or "!include <aws/common>" does not.

I see the following error message in kroki logs when trying to use plantuml-stdlib:
{"timestamp":"1612202036712","level":"ERROR","thread":"vert.x-eventloop-thread-0","mdc":{"error_message":"Syntax Error? (line: 9)","path":"/plantuml/svg/eNp....

@ggrossetie
Copy link
Member

Hello @romkavt

It would be great to implement support of entire plantuml.com/stdlib embedded into PlantUML.
Looks strange: "!include <C4/C4_Container>" works well, but "!include <archimate/Archimate>" or "!include <aws/common>" does not.

It should work... 🤔
Could you please share the complete stacktrace/log or a sample diagram that reproduces this issue?

Here's a working example on https://kroki.io (running v0.10.0)

!include <archimate/Archimate>
!include <aws/common>
!include <aws/Storage/AmazonS3/AmazonS3>
!include <aws/Storage/AmazonS3/bucket/bucket>

rectangle GO #lightgreen
rectangle STOP #red
rectangle WAIT #orange

AMAZONS3(s3_internal)
AMAZONS3(s3_partner,"Vendor's S3")
s3_internal <- s3_partner

https://kroki.io/plantuml/svg/eNqFjDELwjAQhff8irQdtKB0yFqETOKgFVIUXCSmRxpsL3JNEfz1dlBbXZzu8b3vXeTQNH0FPNdkatfqAJl8pxWLxvreZca3rcdfqoInbYdZqx8elfiEv-KlN1cIr7NijMAEjbYBvi540jhbB0sAOClUWex5QlBN2FFuSp4Mv9ECY3IrT8VOiXknzg4DEOom_aI3TQGBFvEBsPI067gSccomPs-XfBSfEPNjog==

@ggrossetie ggrossetie added the ❔ question Further information is requested label Feb 2, 2021
@romkavt
Copy link
Author

romkavt commented Feb 2, 2021

Thanks for your attention

Here is an example of diagram:

@startuml
title Базовый модуль SDK: YooId
!include <archimate/Archimate>

Grouping(SDK, "SDK") {
    Application_Component(SdkYooId, "YooId SDK\n(SDK авторизаций\nсервисов)")

    Application_Service(ServiceYooId, "user-auth-center-api")
    Rel_Access_w_Right(SdkYooId, ServiceYooId, "взаимодействует")

    Application_DataObject(UserAuthorization, "Авторизация\nпользователя YooId\n(авторизация СЦА)")
    Rel_Association_Right(UserAuthorization, SdkYooId, "хранит\nна устройстве")

    Application_Function(FuncYooIdSignIn, "Функции учетной записи YooId:\n\n1. Вход/выход в учетную запись YooId\n2. Открытие новой учетной записи YooId на основе контекста регистрации в прикладном сервисе\n3. Открытие WebView в авторизованном состоянии\n4. Хранение авторизации на устройстве\n5. Аутентификация на устройстве\n(Код доступа, биометрия)")
    Rel_Assignment_Down(SdkYooId, FuncYooIdSignIn, "реализует")
}

Application_Component(App, "Приложение ЛК YooKassa")
Rel_Aggregation(App, SdkYooId, "содержит")

Application_Function(FuncApp, "Личный кабинет YooKassa")
Rel_Assignment_Left(App, FuncApp, "реализует")

@enduml

Here are log messages:

$ docker image ls

REPOSITORY                    TAG            IMAGE ID       CREATED       SIZE
yuzutech/kroki                latest         e74da1442c93   11 days ago   434MB
yuzutech/kroki-excalidraw     latest         2a02f4048390   5 weeks ago   413MB
yuzutech/kroki-bpmn           latest         459dd2c8cc1e   5 weeks ago   413MB
yuzutech/kroki-mermaid        latest         01208df126a6   5 weeks ago   440MB
yuzutech/kroki-blockdiag      latest         ebc85d84c8fb   5 weeks ago   113MB
yuzutech/kroki                jdk-11         96c7a4962470   5 weeks ago   428MB
yuzutech/kroki                jdk11-alpine   96c7a4962470   5 weeks ago   428MB
kroki-builder-static-svgbob   latest         ab7e4d49039b   5 weeks ago   1.74GB
kroki-builder-static-erd      latest         08e4c1bd43ca   5 weeks ago   2.56GB
kroki-builder-bytefield       alpine         628e19dc9545   5 weeks ago   267MB
kroki-builder-bytefield       latest         628e19dc9545   5 weeks ago   267MB
kroki-builder-wavedrom        alpine         76a241f77ea7   5 weeks ago   261MB
kroki-builder-wavedrom        latest         76a241f77ea7   5 weeks ago   261MB
kroki-builder-vega            alpine         8700efa3f102   5 weeks ago   665MB
kroki-builder-vega            latest         8700efa3f102   5 weeks ago   665MB
kroki-builder-nomnoml         alpine         485e094c95a4   5 weeks ago   263MB
kroki-builder-nomnoml         latest         485e094c95a4   5 weeks ago   263MB
yuzutech/kroki                <none>         d53c24754abc   6 weeks ago   433MB

$docker run -p8000:8000 yuzutech/kroki

{"timestamp":"1612258307272","level":"INFO","thread":"vert.x-eventloop-thread-1","logger":"io.vertx.core.impl.launcher.commands.VertxIsolatedDeployer","message":"Succeeded in deploying verticle","context":"default"}
{"timestamp":"1612258801236","level":"INFO","thread":"vert.x-eventloop-thread-0","mdc":{"path":"/plantuml/svg/eNqFVN9r01AUfs9fcd1TC5vDXy9DZMWijAnCihMhULL02kXbm5KkDhRh7Zx7UOz0cQNFUJ9jbWbWru2_cO5_5Hdvsi1bM-xDc3KT853v-845WfYDywvazYYROEGDM_pMIf2lCfXlBzpmdIJwIHdoJD-ySnl1iT1z3ZWacc0RdqNd4-yu5dmbTtMK-GLpNLpnGA89t91yRL2AnHk2h_-5IntjMPxKrVbDsa3AcUX1vttsuYKLoFCpvdTIeFlfVTFTqHQGQn3ZpYncphjUQvke12NTyA5FOOtTjAiEi3NFY6ZChXuvHJsX0utpjbbPvQWrHWwu2Kiu4paDdJW9xhvVkm1z369uVdec-maW3CUYFAch0NE2UUTHsgOqfRgWyW4en7IVWI83XnA7KDwBhxIouJ7zWj9UgPuzWmXPFDRFAfQgaQ3Ouyg2kr2kHTAqzyQ8pu_0i_aLWWm-79pOQiZRl8Mj0w25C8iQxoDrgseYQiZ3lEocT071UpSn9UFb2CooqEDjVZy6WNE6f8CiMQ11L2OFuKccw9FETZ0ydar7GicKl0xhihvXGX2Ru8rqRTWfScion8lH9CmTj6lNHbqJ5K94Yyi3kdlF2Yjpcn1d8r8MmJYOgztpFtKHCMa6FUPtA6zZxs0fXVkZFKb6QJGmujVDGgF5oDFO2IURjkxxK4fkU76x7vAtjXGxyXoSgHSGNdEsJrKn2kWxKW4D72fav0gfRvnrFLMrO2uKO0DZxyMlVMmN5Tut5GzIrk4t0EHSo0FCDl2fUjjP6DcQwFpZrojI3qUZxaA0sZnVsrslMvs3O0na8RCuQszZ2r01jPzPDE7V9H3T4kdgcHTuyyEdqFavWr5vAUMTqdc9XtcgSWp2MTrJzgPqSC2H2oArpz-te4gX9-Ch_rTCQG3DWJGeqXxuwSP-PCV-jpSr2ljmooZP-T-PJxIO","method":"GET","service_name":"plantuml","action":"request_received","bytes_read":"0","user_agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36"},"logger":"io.kroki.server.service.DiagramHandler","message":"Request received GET /plantuml/svg/eNqFVN9r01AUfs9fcd1TC5vDXy9DZMWijAnCihMhULL02kXbm5KkDhRh7Zx7UOz0cQNFUJ9jbWbWru2_cO5_5Hdvsi1bM-xDc3KT853v-845WfYDywvazYYROEGDM_pMIf2lCfXlBzpmdIJwIHdoJD-ySnl1iT1z3ZWacc0RdqNd4-yu5dmbTtMK-GLpNLpnGA89t91yRL2AnHk2h_-5IntjMPxKrVbDsa3AcUX1vttsuYKLoFCpvdTIeFlfVTFTqHQGQn3ZpYncphjUQvke12NTyA5FOOtTjAiEi3NFY6ZChXuvHJsX0utpjbbPvQWrHWwu2Kiu4paDdJW9xhvVkm1z369uVdec-maW3CUYFAch0NE2UUTHsgOqfRgWyW4en7IVWI83XnA7KDwBhxIouJ7zWj9UgPuzWmXPFDRFAfQgaQ3Ouyg2kr2kHTAqzyQ8pu_0i_aLWWm-79pOQiZRl8Mj0w25C8iQxoDrgseYQiZ3lEocT071UpSn9UFb2CooqEDjVZy6WNE6f8CiMQ11L2OFuKccw9FETZ0ydar7GicKl0xhihvXGX2Ru8rqRTWfScion8lH9CmTj6lNHbqJ5K94Yyi3kdlF2Yjpcn1d8r8MmJYOgztpFtKHCMa6FUPtA6zZxs0fXVkZFKb6QJGmujVDGgF5oDFO2IURjkxxK4fkU76x7vAtjXGxyXoSgHSGNdEsJrKn2kWxKW4D72fav0gfRvnrFLMrO2uKO0DZxyMlVMmN5Tut5GzIrk4t0EHSo0FCDl2fUjjP6DcQwFpZrojI3qUZxaA0sZnVsrslMvs3O0na8RCuQszZ2r01jPzPDE7V9H3T4kdgcHTuyyEdqFavWr5vAUMTqdc9XtcgSWp2MTrJzgPqSC2H2oArpz-te4gX9-Ch_rTCQG3DWJGeqXxuwSP-PCV-jpSr2ljmooZP-T-PJxIO","context":"default"}
{"timestamp":"1612258801952","level":"INFO","thread":"vert.x-eventloop-thread-0","mdc":{"path":"/plantuml/svg/eNqFVN9r01AUfs9fcd1TC5vDXy9DZMWijAnCihMhULL02kXbm5KkDhRh7Zx7UOz0cQNFUJ9jbWbWru2_cO5_5Hdvsi1bM-xDc3KT853v-845WfYDywvazYYROEGDM_pMIf2lCfXlBzpmdIJwIHdoJD-ySnl1iT1z3ZWacc0RdqNd4-yu5dmbTtMK-GLpNLpnGA89t91yRL2AnHk2h_-5IntjMPxKrVbDsa3AcUX1vttsuYKLoFCpvdTIeFlfVTFTqHQGQn3ZpYncphjUQvke12NTyA5FOOtTjAiEi3NFY6ZChXuvHJsX0utpjbbPvQWrHWwu2Kiu4paDdJW9xhvVkm1z369uVdec-maW3CUYFAch0NE2UUTHsgOqfRgWyW4en7IVWI83XnA7KDwBhxIouJ7zWj9UgPuzWmXPFDRFAfQgaQ3Ouyg2kr2kHTAqzyQ8pu_0i_aLWWm-79pOQiZRl8Mj0w25C8iQxoDrgseYQiZ3lEocT071UpSn9UFb2CooqEDjVZy6WNE6f8CiMQ11L2OFuKccw9FETZ0ydar7GicKl0xhihvXGX2Ru8rqRTWfScion8lH9CmTj6lNHbqJ5K94Yyi3kdlF2Yjpcn1d8r8MmJYOgztpFtKHCMa6FUPtA6zZxs0fXVkZFKb6QJGmujVDGgF5oDFO2IURjkxxK4fkU76x7vAtjXGxyXoSgHSGNdEsJrKn2kWxKW4D72fav0gfRvnrFLMrO2uKO0DZxyMlVMmN5Tut5GzIrk4t0EHSo0FCDl2fUjjP6DcQwFpZrojI3qUZxaA0sZnVsrslMvs3O0na8RCuQszZ2r01jPzPDE7V9H3T4kdgcHTuyyEdqFavWr5vAUMTqdc9XtcgSWp2MTrJzgPqSC2H2oArpz-te4gX9-Ch_rTCQG3DWJGeqXxuwSP-PCV-jpSr2ljmooZP-T-PJxIO","took":"700","method":"GET","service_name":"plantuml","action":"convert","file_format":"svg","user_agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36"},"logger":"io.kroki.server.service.DiagramHandler","message":"Convert took 700ms","context":"default"}
{"timestamp":"1612258801957","level":"ERROR","thread":"vert.x-eventloop-thread-0","mdc":{"error_message":"Syntax Error? (line: 4)","path":"/plantuml/svg/eNqFVN9r01AUfs9fcd1TC5vDXy9DZMWijAnCihMhULL02kXbm5KkDhRh7Zx7UOz0cQNFUJ9jbWbWru2_cO5_5Hdvsi1bM-xDc3KT853v-845WfYDywvazYYROEGDM_pMIf2lCfXlBzpmdIJwIHdoJD-ySnl1iT1z3ZWacc0RdqNd4-yu5dmbTtMK-GLpNLpnGA89t91yRL2AnHk2h_-5IntjMPxKrVbDsa3AcUX1vttsuYKLoFCpvdTIeFlfVTFTqHQGQn3ZpYncphjUQvke12NTyA5FOOtTjAiEi3NFY6ZChXuvHJsX0utpjbbPvQWrHWwu2Kiu4paDdJW9xhvVkm1z369uVdec-maW3CUYFAch0NE2UUTHsgOqfRgWyW4en7IVWI83XnA7KDwBhxIouJ7zWj9UgPuzWmXPFDRFAfQgaQ3Ouyg2kr2kHTAqzyQ8pu_0i_aLWWm-79pOQiZRl8Mj0w25C8iQxoDrgseYQiZ3lEocT071UpSn9UFb2CooqEDjVZy6WNE6f8CiMQ11L2OFuKccw9FETZ0ydar7GicKl0xhihvXGX2Ru8rqRTWfScion8lH9CmTj6lNHbqJ5K94Yyi3kdlF2Yjpcn1d8r8MmJYOgztpFtKHCMa6FUPtA6zZxs0fXVkZFKb6QJGmujVDGgF5oDFO2IURjkxxK4fkU76x7vAtjXGxyXoSgHSGNdEsJrKn2kWxKW4D72fav0gfRvnrFLMrO2uKO0DZxyMlVMmN5Tut5GzIrk4t0EHSo0FCDl2fUjjP6DcQwFpZrojI3qUZxaA0sZnVsrslMvs3O0na8RCuQszZ2r01jPzPDE7V9H3T4kdgcHTuyyEdqFavWr5vAUMTqdc9XtcgSWp2MTrJzgPqSC2H2oArpz-te4gX9-Ch_rTCQG3DWJGeqXxuwSP-PCV-jpSr2ljmooZP-T-PJxIO","method":"GET","action":"error","error_code":"400","failure_class_name":"io.kroki.server.error.BadRequestException","user_agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36"},"logger":"io.kroki.server.error.ErrorHandler","message":"An error occurred","context":"default","exception":"io.kroki.server.error.BadRequestException: Syntax Error? (line: 4)\n\tat io.kroki.server.service.Plantuml.convert(Plantuml.java:219)\n\tat io.kroki.server.service.Plantuml.convert(Plantuml.java:190)\n\tat io.kroki.server.service.DiagramHandler.convert(DiagramHandler.java:152)\n\tat io.kroki.server.service.DiagramHandler.lambda$createGet$1(DiagramHandler.java:56)\n\tat io.vertx.ext.web.impl.RouteState.handleContext(RouteState.java:1036)\n\tat io.vertx.ext.web.impl.RoutingContextImplBase.iterateNext(RoutingContextImplBase.java:95)\n\tat io.vertx.ext.web.impl.RoutingContextImpl.next(RoutingContextImpl.java:132)\n\tat io.kroki.server.service.DiagramHandler.lambda$createRequestReceived$0(DiagramHandler.java:38)\n\tat io.vertx.ext.web.impl.RouteState.handleContext(RouteState.java:1036)\n\tat io.vertx.ext.web.impl.RoutingContextImplBase.iterateNext(RoutingContextImplBase.java:131)\n\tat io.vertx.ext.web.impl.RoutingContextImpl.next(RoutingContextImpl.java:132)\n\tat io.vertx.ext.web.handler.impl.CorsHandlerImpl.handle(CorsHandlerImpl.java:125)\n\tat io.vertx.ext.web.handler.impl.CorsHandlerImpl.handle(CorsHandlerImpl.java:38)\n\tat io.vertx.ext.web.impl.RouteState.handleContext(RouteState.java:1036)\n\tat io.vertx.ext.web.impl.RoutingContextImplBase.iterateNext(RoutingContextImplBase.java:131)\n\tat io.vertx.ext.web.impl.RoutingContextImpl.next(RoutingContextImpl.java:132)\n\tat io.vertx.ext.web.impl.RouterImpl.handle(RouterImpl.java:54)\n\tat io.vertx.ext.web.impl.RouterImpl.handle(RouterImpl.java:36)\n\tat io.vertx.core.http.impl.WebSocketRequestHandler.handle(WebSocketRequestHandler.java:50)\n\tat io.vertx.core.http.impl.WebSocketRequestHandler.handle(WebSocketRequestHandler.java:32)\n\tat io.vertx.core.http.impl.Http1xServerConnection.handleMessage(Http1xServerConnection.java:136)\n\tat io.vertx.core.impl.ContextImpl.executeTask(ContextImpl.java:366)\n\tat io.vertx.core.impl.EventLoopContext.execute(EventLoopContext.java:43)\n\tat io.vertx.core.impl.ContextImpl.executeFromIO(ContextImpl.java:229)\n\tat io.vertx.core.net.impl.VertxHandler.channelRead(VertxHandler.java:163)\n\tat io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)\n\tat io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)\n\tat io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357)\n\tat io.netty.channel.ChannelInboundHandlerAdapter.channelRead(ChannelInboundHandlerAdapter.java:93)\n\tat io.netty.handler.codec.http.websocketx.extensions.WebSocketServerExtensionHandler.channelRead(WebSocketServerExtensionHandler.java:101)\n\tat io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)\n\tat io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)\n\tat io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357)\n\tat io.vertx.core.http.impl.Http1xUpgradeToH2CHandler.channelRead(Http1xUpgradeToH2CHandler.java:109)\n\tat io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)\n\tat io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)\n\tat io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357)\n\tat io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:324)\n\tat io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:296)\n\tat io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)\n\tat io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)\n\tat io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357)\n\tat io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1410)\n\tat io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)\n\tat io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)\n\tat io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:919)\n\tat io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:163)\n\tat io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:714)\n\tat io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:650)\n\tat io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:576)\n\tat io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:493)\n\tat io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:989)\n\tat io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)\n\tat io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)\n\tat java.base/java.lang.Thread.run(Unknown Source)\n"}
{"timestamp":"1612258802184","level":"INFO","thread":"vert.x-eventloop-thread-0","mdc":{"path":"/plantuml/svg/eNqFVN9r01AUfs9fcd1TC5vDXy9DZMWijAnCihMhULL02kXbm5KkDhRh7Zx7UOz0cQNFUJ9jbWbWru2_cO5_5Hdvsi1bM-xDc3KT853v-845WfYDywvazYYROEGDM_pMIf2lCfXlBzpmdIJwIHdoJD-ySnl1iT1z3ZWacc0RdqNd4-yu5dmbTtMK-GLpNLpnGA89t91yRL2AnHk2h_-5IntjMPxKrVbDsa3AcUX1vttsuYKLoFCpvdTIeFlfVTFTqHQGQn3ZpYncphjUQvke12NTyA5FOOtTjAiEi3NFY6ZChXuvHJsX0utpjbbPvQWrHWwu2Kiu4paDdJW9xhvVkm1z369uVdec-maW3CUYFAch0NE2UUTHsgOqfRgWyW4en7IVWI83XnA7KDwBhxIouJ7zWj9UgPuzWmXPFDRFAfQgaQ3Ouyg2kr2kHTAqzyQ8pu_0i_aLWWm-79pOQiZRl8Mj0w25C8iQxoDrgseYQiZ3lEocT071UpSn9UFb2CooqEDjVZy6WNE6f8CiMQ11L2OFuKccw9FETZ0ydar7GicKl0xhihvXGX2Ru8rqRTWfScion8lH9CmTj6lNHbqJ5K94Yyi3kdlF2Yjpcn1d8r8MmJYOgztpFtKHCMa6FUPtA6zZxs0fXVkZFKb6QJGmujVDGgF5oDFO2IURjkxxK4fkU76x7vAtjXGxyXoSgHSGNdEsJrKn2kWxKW4D72fav0gfRvnrFLMrO2uKO0DZxyMlVMmN5Tut5GzIrk4t0EHSo0FCDl2fUjjP6DcQwFpZrojI3qUZxaA0sZnVsrslMvs3O0na8RCuQszZ2r01jPzPDE7V9H3T4kdgcHTuyyEdqFavWr5vAUMTqdc9XtcgSWp2MTrJzgPqSC2H2oArpz-te4gX9-Ch_rTCQG3DWJGeqXxuwSP-PCV-jpSr2ljmooZP-T-PJxIO","method":"GET","service_name":"plantuml","action":"request_received","bytes_read":"0","user_agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36"},"logger":"io.kroki.server.service.DiagramHandler","message":"Request received GET /plantuml/svg/eNqFVN9r01AUfs9fcd1TC5vDXy9DZMWijAnCihMhULL02kXbm5KkDhRh7Zx7UOz0cQNFUJ9jbWbWru2_cO5_5Hdvsi1bM-xDc3KT853v-845WfYDywvazYYROEGDM_pMIf2lCfXlBzpmdIJwIHdoJD-ySnl1iT1z3ZWacc0RdqNd4-yu5dmbTtMK-GLpNLpnGA89t91yRL2AnHk2h_-5IntjMPxKrVbDsa3AcUX1vttsuYKLoFCpvdTIeFlfVTFTqHQGQn3ZpYncphjUQvke12NTyA5FOOtTjAiEi3NFY6ZChXuvHJsX0utpjbbPvQWrHWwu2Kiu4paDdJW9xhvVkm1z369uVdec-maW3CUYFAch0NE2UUTHsgOqfRgWyW4en7IVWI83XnA7KDwBhxIouJ7zWj9UgPuzWmXPFDRFAfQgaQ3Ouyg2kr2kHTAqzyQ8pu_0i_aLWWm-79pOQiZRl8Mj0w25C8iQxoDrgseYQiZ3lEocT071UpSn9UFb2CooqEDjVZy6WNE6f8CiMQ11L2OFuKccw9FETZ0ydar7GicKl0xhihvXGX2Ru8rqRTWfScion8lH9CmTj6lNHbqJ5K94Yyi3kdlF2Yjpcn1d8r8MmJYOgztpFtKHCMa6FUPtA6zZxs0fXVkZFKb6QJGmujVDGgF5oDFO2IURjkxxK4fkU76x7vAtjXGxyXoSgHSGNdEsJrKn2kWxKW4D72fav0gfRvnrFLMrO2uKO0DZxyMlVMmN5Tut5GzIrk4t0EHSo0FCDl2fUjjP6DcQwFpZrojI3qUZxaA0sZnVsrslMvs3O0na8RCuQszZ2r01jPzPDE7V9H3T4kdgcHTuyyEdqFavWr5vAUMTqdc9XtcgSWp2MTrJzgPqSC2H2oArpz-te4gX9-Ch_rTCQG3DWJGeqXxuwSP-PCV-jpSr2ljmooZP-T-PJxIO","context":"default"}
{"timestamp":"1612258802215","level":"INFO","thread":"vert.x-eventloop-thread-0","mdc":{"path":"/plantuml/svg/eNqFVN9r01AUfs9fcd1TC5vDXy9DZMWijAnCihMhULL02kXbm5KkDhRh7Zx7UOz0cQNFUJ9jbWbWru2_cO5_5Hdvsi1bM-xDc3KT853v-845WfYDywvazYYROEGDM_pMIf2lCfXlBzpmdIJwIHdoJD-ySnl1iT1z3ZWacc0RdqNd4-yu5dmbTtMK-GLpNLpnGA89t91yRL2AnHk2h_-5IntjMPxKrVbDsa3AcUX1vttsuYKLoFCpvdTIeFlfVTFTqHQGQn3ZpYncphjUQvke12NTyA5FOOtTjAiEi3NFY6ZChXuvHJsX0utpjbbPvQWrHWwu2Kiu4paDdJW9xhvVkm1z369uVdec-maW3CUYFAch0NE2UUTHsgOqfRgWyW4en7IVWI83XnA7KDwBhxIouJ7zWj9UgPuzWmXPFDRFAfQgaQ3Ouyg2kr2kHTAqzyQ8pu_0i_aLWWm-79pOQiZRl8Mj0w25C8iQxoDrgseYQiZ3lEocT071UpSn9UFb2CooqEDjVZy6WNE6f8CiMQ11L2OFuKccw9FETZ0ydar7GicKl0xhihvXGX2Ru8rqRTWfScion8lH9CmTj6lNHbqJ5K94Yyi3kdlF2Yjpcn1d8r8MmJYOgztpFtKHCMa6FUPtA6zZxs0fXVkZFKb6QJGmujVDGgF5oDFO2IURjkxxK4fkU76x7vAtjXGxyXoSgHSGNdEsJrKn2kWxKW4D72fav0gfRvnrFLMrO2uKO0DZxyMlVMmN5Tut5GzIrk4t0EHSo0FCDl2fUjjP6DcQwFpZrojI3qUZxaA0sZnVsrslMvs3O0na8RCuQszZ2r01jPzPDE7V9H3T4kdgcHTuyyEdqFavWr5vAUMTqdc9XtcgSWp2MTrJzgPqSC2H2oArpz-te4gX9-Ch_rTCQG3DWJGeqXxuwSP-PCV-jpSr2ljmooZP-T-PJxIO","took":"29","method":"GET","service_name":"plantuml","action":"convert","file_format":"svg","user_agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36"},"logger":"io.kroki.server.service.DiagramHandler","message":"Convert took 29ms","context":"default"}
{"timestamp":"1612258802217","level":"ERROR","thread":"vert.x-eventloop-thread-0","mdc":{"error_message":"Syntax Error? (line: 4)","path":"/plantuml/svg/eNqFVN9r01AUfs9fcd1TC5vDXy9DZMWijAnCihMhULL02kXbm5KkDhRh7Zx7UOz0cQNFUJ9jbWbWru2_cO5_5Hdvsi1bM-xDc3KT853v-845WfYDywvazYYROEGDM_pMIf2lCfXlBzpmdIJwIHdoJD-ySnl1iT1z3ZWacc0RdqNd4-yu5dmbTtMK-GLpNLpnGA89t91yRL2AnHk2h_-5IntjMPxKrVbDsa3AcUX1vttsuYKLoFCpvdTIeFlfVTFTqHQGQn3ZpYncphjUQvke12NTyA5FOOtTjAiEi3NFY6ZChXuvHJsX0utpjbbPvQWrHWwu2Kiu4paDdJW9xhvVkm1z369uVdec-maW3CUYFAch0NE2UUTHsgOqfRgWyW4en7IVWI83XnA7KDwBhxIouJ7zWj9UgPuzWmXPFDRFAfQgaQ3Ouyg2kr2kHTAqzyQ8pu_0i_aLWWm-79pOQiZRl8Mj0w25C8iQxoDrgseYQiZ3lEocT071UpSn9UFb2CooqEDjVZy6WNE6f8CiMQ11L2OFuKccw9FETZ0ydar7GicKl0xhihvXGX2Ru8rqRTWfScion8lH9CmTj6lNHbqJ5K94Yyi3kdlF2Yjpcn1d8r8MmJYOgztpFtKHCMa6FUPtA6zZxs0fXVkZFKb6QJGmujVDGgF5oDFO2IURjkxxK4fkU76x7vAtjXGxyXoSgHSGNdEsJrKn2kWxKW4D72fav0gfRvnrFLMrO2uKO0DZxyMlVMmN5Tut5GzIrk4t0EHSo0FCDl2fUjjP6DcQwFpZrojI3qUZxaA0sZnVsrslMvs3O0na8RCuQszZ2r01jPzPDE7V9H3T4kdgcHTuyyEdqFavWr5vAUMTqdc9XtcgSWp2MTrJzgPqSC2H2oArpz-te4gX9-Ch_rTCQG3DWJGeqXxuwSP-PCV-jpSr2ljmooZP-T-PJxIO","method":"GET","action":"error","error_code":"400","failure_class_name":"io.kroki.server.error.BadRequestException","user_agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36"},"logger":"io.kroki.server.error.ErrorHandler","message":"An error occurred","context":"default","exception":"io.kroki.server.error.BadRequestException: Syntax Error? (line: 4)\n\tat io.kroki.server.service.Plantuml.convert(Plantuml.java:219)\n\tat io.kroki.server.service.Plantuml.convert(Plantuml.java:190)\n\tat io.kroki.server.service.DiagramHandler.convert(DiagramHandler.java:152)\n\tat io.kroki.server.service.DiagramHandler.lambda$createGet$1(DiagramHandler.java:56)\n\tat io.vertx.ext.web.impl.RouteState.handleContext(RouteState.java:1036)\n\tat io.vertx.ext.web.impl.RoutingContextImplBase.iterateNext(RoutingContextImplBase.java:95)\n\tat io.vertx.ext.web.impl.RoutingContextImpl.next(RoutingContextImpl.java:132)\n\tat io.kroki.server.service.DiagramHandler.lambda$createRequestReceived$0(DiagramHandler.java:38)\n\tat io.vertx.ext.web.impl.RouteState.handleContext(RouteState.java:1036)\n\tat io.vertx.ext.web.impl.RoutingContextImplBase.iterateNext(RoutingContextImplBase.java:131)\n\tat io.vertx.ext.web.impl.RoutingContextImpl.next(RoutingContextImpl.java:132)\n\tat io.vertx.ext.web.handler.impl.CorsHandlerImpl.handle(CorsHandlerImpl.java:125)\n\tat io.vertx.ext.web.handler.impl.CorsHandlerImpl.handle(CorsHandlerImpl.java:38)\n\tat io.vertx.ext.web.impl.RouteState.handleContext(RouteState.java:1036)\n\tat io.vertx.ext.web.impl.RoutingContextImplBase.iterateNext(RoutingContextImplBase.java:131)\n\tat io.vertx.ext.web.impl.RoutingContextImpl.next(RoutingContextImpl.java:132)\n\tat io.vertx.ext.web.impl.RouterImpl.handle(RouterImpl.java:54)\n\tat io.vertx.ext.web.impl.RouterImpl.handle(RouterImpl.java:36)\n\tat io.vertx.core.http.impl.WebSocketRequestHandler.handle(WebSocketRequestHandler.java:50)\n\tat io.vertx.core.http.impl.WebSocketRequestHandler.handle(WebSocketRequestHandler.java:32)\n\tat io.vertx.core.http.impl.Http1xServerConnection.handleMessage(Http1xServerConnection.java:136)\n\tat io.vertx.core.impl.ContextImpl.executeTask(ContextImpl.java:366)\n\tat io.vertx.core.impl.EventLoopContext.execute(EventLoopContext.java:43)\n\tat io.vertx.core.impl.ContextImpl.executeFromIO(ContextImpl.java:229)\n\tat io.vertx.core.net.impl.VertxHandler.channelRead(VertxHandler.java:163)\n\tat io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)\n\tat io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)\n\tat io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357)\n\tat io.netty.channel.ChannelInboundHandlerAdapter.channelRead(ChannelInboundHandlerAdapter.java:93)\n\tat io.netty.handler.codec.http.websocketx.extensions.WebSocketServerExtensionHandler.channelRead(WebSocketServerExtensionHandler.java:101)\n\tat io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)\n\tat io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)\n\tat io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357)\n\tat io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:324)\n\tat io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:296)\n\tat io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)\n\tat io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)\n\tat io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357)\n\tat io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1410)\n\tat io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)\n\tat io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)\n\tat io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:919)\n\tat io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:163)\n\tat io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:714)\n\tat io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:650)\n\tat io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:576)\n\tat io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:493)\n\tat io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:989)\n\tat io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)\n\tat io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)\n\tat java.base/java.lang.Thread.run(Unknown Source)\n"}

Some extra info:

  • I've also tried to render this diagram through https://kroki.io - result is the same
  • I using plantuml diagram inside Asciidoctor document using the following syntax:
    plantuml::sdk-hierarchy-v2-yooid.puml[svg]
  • To render diagrams I using JetBrains IDEA AsciiDoc plugin and asciidoctor.js+asciidoctor-kroki.js

@ggrossetie
Copy link
Member

Thanks, I can reproduce this issue!
!include <archimate/Archimate> is unintentionally removed by the sanitizer. As a workaround, you can set the safe mode to UNSAFE:

$ docker run -e KROKI_SAFE_MODE=unsafe -p8000:8000 yuzutech/kroki

@ggrossetie ggrossetie added 👶 good first issue Good for newcomers 🐞 bug Something isn't working and removed ❔ question Further information is requested labels Feb 2, 2021
ggrossetie added a commit to ggrossetie/kroki that referenced this issue Feb 2, 2021
ggrossetie added a commit to ggrossetie/kroki that referenced this issue Feb 2, 2021
ggrossetie added a commit to ggrossetie/kroki that referenced this issue Feb 2, 2021
@romkavt
Copy link
Author

romkavt commented Feb 3, 2021

Thanks for your efforts! With KROKI_SAFE_MODE=unsafe ArchiMate diagrams works well. Waiting kroki 0.11 release)

@romkavt
Copy link
Author

romkavt commented Feb 4, 2021

I have another one case.

Here in an diagram source code:

title Контекст интеграции систем TC и Yoo
!include <C4/C4_Container>

Person_Ext(User, "User", "Пользователь сервисов TC и Yoo")
System_Ext(Pay, "Apple/Google")
Rel_R(User, Pay, "Использует для платежа банковской картой")

produces the following error in kroki server with KROKI_SAFE_MODE=unsafe setting on Ubuntu:

{"timestamp":"1612370450845","level":"ERROR","thread":"vert.x-eventloop-thread-0","mdc":{"error_message":"Cannot open URL (line: 0)","path":"/plantuml/svg/eNpNj8FKw0AQhu95ijEnBaGXehNBgngSStWDp1B0kUDcLckK5tZG0ItQvImXvkKsVmNr6yvMvJH_tCl4mvln_p3vX5_41BC_8pIXUvKUZzKUkrhu5LsMuJIH6JpkyLVuMf6hs2gPLrpw7sRZUwRbib1Mb68M7UftVtSOI2d9L7EmOwiCjslyZ-OjO799nptsl0ItISqPAZ7LE3-hTkDS49DKmgI9UaKuiMcyklKeMVzKI8-4-o8Pd4LTIvfmZgXp9ArcPuz3U4O2dezc9aqDq2vSuNukWNv4BYTfTQy5Bxf__4AcEebzJtSnAt-44gXYCIRHWr9Jo8gAHggA_gDbYbS7","method":"GET","action":"error","error_code":"400","failure_class_name":"io.kroki.server.error.BadRequestException","user_agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 11_2_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.60 YaBrowser/20.12.0.1065 Yowser/2.5 Safari/537.36"},"logger":"io.kroki.server.error.ErrorHandler","message":"An error occurred","context":"default","exception":"io.kroki.server.error.BadRequestException: Cannot open URL (line: 0)\n\tat io.kroki.server.service.Plantuml.convert(Plantuml.java:219)\n\tat io.kroki.server.service.Plantuml.convert(Plantuml.java:190)\n\tat io.kroki.server.service.DiagramHandler.convert(DiagramHandler.java:152)\n\tat io.kroki.server.service.DiagramHandler.lambda$createGet$1(DiagramHandler.java:56)\n\tat io.vertx.ext.web.impl.RouteState.handleContext(RouteState.java:1036)\n\tat io.vertx.ext.web.impl.RoutingContextImplBase.iterateNext(RoutingContextImplBase.java:95)\n\tat io.vertx.ext.web.impl.RoutingContextImpl.next(RoutingContextImpl.java:132)\n\tat io.kroki.server.service.DiagramHandler.lambda$createRequestReceived$0(DiagramHandler.java:38)\n\tat io.vertx.ext.web.impl.RouteState.handleContext(RouteState.java:1036)\n\tat io.vertx.ext.web.impl.RoutingContextImplBase.iterateNext(RoutingContextImplBase.java:131)\n\tat io.vertx.ext.web.impl.RoutingContextImpl.next(RoutingContextImpl.java:132)\n\tat io.vertx.ext.web.handler.impl.CorsHandlerImpl.handle(CorsHandlerImpl.java:125)\n\tat io.vertx.ext.web.handler.impl.CorsHandlerImpl.handle(CorsHandlerImpl.java:38)\n\tat io.vertx.ext.web.impl.RouteState.handleContext(RouteState.java:1036)\n\tat io.vertx.ext.web.impl.RoutingContextImplBase.iterateNext(RoutingContextImplBase.java:131)\n\tat io.vertx.ext.web.impl.RoutingContextImpl.next(RoutingContextImpl.java:132)\n\tat io.vertx.ext.web.impl.RouterImpl.handle(RouterImpl.java:54)\n\tat io.vertx.ext.web.impl.RouterImpl.handle(RouterImpl.java:36)\n\tat io.vertx.core.http.impl.WebSocketRequestHandler.handle(WebSocketRequestHandler.java:50)\n\tat io.vertx.core.http.impl.WebSocketRequestHandler.handle(WebSocketRequestHandler.java:32)\n\tat io.vertx.core.http.impl.Http1xServerConnection.handleMessage(Http1xServerConnection.java:136)\n\tat io.vertx.core.impl.ContextImpl.executeTask(ContextImpl.java:366)\n\tat io.vertx.core.impl.EventLoopContext.execute(EventLoopContext.java:43)\n\tat io.vertx.core.impl.ContextImpl.executeFromIO(ContextImpl.java:229)\n\tat io.vertx.core.net.impl.VertxHandler.channelRead(VertxHandler.java:163)\n\tat io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)\n\tat io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)\n\tat io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357)\n\tat io.netty.channel.ChannelInboundHandlerAdapter.channelRead(ChannelInboundHandlerAdapter.java:93)\n\tat io.netty.handler.codec.http.websocketx.extensions.WebSocketServerExtensionHandler.channelRead(WebSocketServerExtensionHandler.java:101)\n\tat io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)\n\tat io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)\n\tat io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357)\n\tat io.vertx.core.http.impl.Http1xUpgradeToH2CHandler.channelRead(Http1xUpgradeToH2CHandler.java:109)\n\tat io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)\n\tat io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)\n\tat io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357)\n\tat io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:324)\n\tat io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:296)\n\tat io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)\n\tat io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)\n\tat io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357)\n\tat io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1410)\n\tat io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)\n\tat io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)\n\tat io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:919)\n\tat io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:163)\n\tat io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:714)\n\tat io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:650)\n\tat io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:576)\n\tat io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:493)\n\tat io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:989)\n\tat io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)\n\tat io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)\n\tat java.base/java.lang.Thread.run(Unknown Source)\n"}

ggrossetie added a commit that referenced this issue Feb 5, 2021
resolves #578 preserve PlantUML stdlib: archimate, logos and elastic
@ggrossetie
Copy link
Member

I cannot reproduce this issue on master using java -jar and kroki.io is using the Docker image so it's either an "install" issue or this issue is now fixed on master.

If you still get this error on the next version (v0.11.0), feel to open a new issue with a reproduction case.

@romkavt
Copy link
Author

romkavt commented Feb 5, 2021

I had used Docker container image.
I think I found the reason of an error:
plantuml/plantuml-stdlib#32

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
👶 good first issue Good for newcomers 🐞 bug Something isn't working
Projects
None yet
Development

Successfully merging a pull request may close this issue.

2 participants