moclojer / moclojer Goto Github PK
View Code? Open in Web Editor NEWSimple and efficient HTTP mock server with specification in yaml, edn or OpenAPI
Home Page: https://docs.moclojer.com
License: MIT License
Simple and efficient HTTP mock server with specification in yaml, edn or OpenAPI
Home Page: https://docs.moclojer.com
License: MIT License
it is important to handle the error when the configuration file is not located, to avoid exposing the problem to the user
[main] INFO org.eclipse.jetty.util.log - Logging initialized @4198ms to org.eclipse.jetty.util.log.Slf4jLog
(-> moclojer :start-server :version "0.1")
[main] INFO moclojer.router - {:mode "moclojer", :line 19}
Exception in thread "main" java.io.FileNotFoundException: /app/moclojer.yml (Is a directory)
today is generated only for x86 (Linux and macOS), we need to generate for other architectures:
The binary should take the name: moclojer-<OS>-<ARCH>
Ex: moclojer-linux-x86
refs:
related #158
Originally posted by avelino October 20, 2023
Specifying large returns in the same moclojer configuration file (.yaml
or any format) is "boring" and makes the specification file difficult to read.
Why not support the file inclusion tag for the body?
- endpoint:
method: GET
path: /external-body-text
response:
status: 200
headers:
Content-Type: application/json
external-body:
provider: text
path: test/moclojer/resources/text-plan.json
using the specification
external-body
created for xlsx support #152
You cannot exit the docker container with control c command.
docker run -it \
-p 8000:8000 -v $(pwd)/moclojer.yml:/app/moclojer.yml \
ghcr.io/moclojer/moclojer:dev
Not applicable, we can use the default.
Exit the container
moclojer version: 0.2 (commit: 0bfcda8)
os: MacOS Ventura 13.0.1 (22A400)
Add 3 arguments to the main function would be nice:
--help
-h
--config
-c
--mock
-m
There are some tools to help this like docopt.clj
This would make moclojer even more like a cli tool, wdyt?
The version is hardcoded, we should be able to have it updated on a release.
Check the dev/moclojer/build.clj file
Not applicable
0.2 should be the version
N/A
We are running moclojer from branch: main and when we edited the yml file the service didn't change.
Looking at the code we didn't see this log https://github.com/moclojer/moclojer/blob/main/src/moclojer/core.clj#L90.
# This mock register route: GET /hello/:username
- endpoint:
# Note: the method could be omitted because GET is the default
method: GET
path: /hello/:username
response:
# Note: the status could be omitted because 200 is the default
status: 200
headers:
Content-Type: application/json
# Note: the body will receive the value passed in the url using the
# :username placeholder
body: >
{
"hello": "{{path-params.username}}!"
}
When I change the config yaml.
I would like not to have to restart the server.
moclojer: branch main
- endpoint:
method: POST
path: /file-upload
store: upload-filesystem
interceptor: multipart
response:
status: 200
headers:
Content-Type: application/json
body: >
{
"url": "https:/..."
}
There are two variables that we need to control in this type of endpoint: store (where the file will be persisted) and interceptor (will it receive the file or in base64 format).
example:
store: upload-filesystem
interceptor: multipart
store:
upload-filesystem
upload-s3
interceptor's:
file-multipart
file-base64
ToDo:
curl:
curl -X POST "http://127.0.0.1:8000/first-post-route" -d '{"name": "moclojer"}'
Using (body-params/body-params)
it will simplify the implementation of the parser of the data received via the request
We are currently writing βa lotβ of content for documentation, and we need to standardize our content, i.e., we need a lint on the markdown files .md
π€ Pattern 'moclojer_Linux' does not match any files.
[12](https://github.com/moclojer/moclojer/runs/8177200669?check_suite_focus=true#step:7:13)
π€ Pattern 'moclojer_macOS' does not match any files.
[13](https://github.com/moclojer/moclojer/runs/8177200669?check_suite_focus=true#step:7:14)
π€ Pattern 'moclojer.jar' does not match any files.
[14](https://github.com/moclojer/moclojer/runs/8177200669?check_suite_focus=true#step:7:15)
π©βπ Creating new GitHub release for tag v0.1.1...
[15](https://github.com/moclojer/moclojer/runs/8177200669?check_suite_focus=true#step:7:16)
π€ moclojer_Linux,moclojer_macOS,moclojer.jar not include valid file.
[16](https://github.com/moclojer/moclojer/runs/8177200669?check_suite_focus=true#step:7:17)
π Release ready at https://github.com/moclojer/moclojer/releases/tag/v0.1.1
Total size of all the files uploaded is 20037109 bytes
[28](https://github.com/moclojer/moclojer/runs/8177104167?check_suite_focus=true#step:6:29)
File upload process has finished. Finalizing the artifact upload
[29](https://github.com/moclojer/moclojer/runs/8177104167?check_suite_focus=true#step:6:30)
Artifact has been finalized. All files have been successfully uploaded!
[30](https://github.com/moclojer/moclojer/runs/8177104167?check_suite_focus=true#step:6:31)
[31](https://github.com/moclojer/moclojer/runs/8177104167?check_suite_focus=true#step:6:32)
The raw size of all the files that were specified for upload is 26968106 bytes
[32](https://github.com/moclojer/moclojer/runs/8177104167?check_suite_focus=true#step:6:33)
The size of all the files that were uploaded is 20037109 bytes. This takes into account any gzip compression used to reduce the upload size, time and storage
[33](https://github.com/moclojer/moclojer/runs/8177104167?check_suite_focus=true#step:6:34)
[34](https://github.com/moclojer/moclojer/runs/8177104167?check_suite_focus=true#step:6:35)
Note: The size of downloaded zips can differ significantly from the reported size. For more information see: https://github.com/actions/upload-artifact#zipped-artifact-downloads
In order to simplify the contribution and reduce the cognitive load for writing tests, we can reduce the number of duplicate lines of service-fn
by moving it to a library to help with testing.
A large part of moclojer's tests are end-to-end (usability) tests. We "turn on" the mock server and send a request to the configured endpoint, validating that the return from the endpoint is as expected.
moclojer/test/moclojer/server_test.clj
Lines 11 to 16 in c294d37
namespace proposal: moclojer.helpers-test
**How do I load a dynamic file based on the endpoint parameter (URI)?
Today there is no support for making the file path dynamic.
Is there an intense list of PokΓ©mon (or anything):
- endpoint:
method: GET
path: /pokemon/:name
response:
status: 200
headers:
Content-Type: application/json
external-body:
provider: json
path: https://pokeapi.co/api/v2/pokemon/{{path-params.name}}
URI's:
/pokemon/kabuto
/pokemon/marowak
/pokemon/cubone
/pokemon/armaldo
Starting to support using moclojer as a framework (creating software/api in clojure using moclojer as a base)
test using yml: OpenAPI-Specification/examples/v3.0/petstore.yaml
backtrace:
β― moclojer (main) β CONFIG="OpenAPI-Specification/examples/v3.0/petstore.yaml" MOCKS="moclojer.yml" clojure -X:run
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/Users/avelino/.m2/repository/org/slf4j/slf4j-simple/1.7.5/slf4j-simple-1.7.5.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/Users/avelino/.m2/repository/ch/qos/logback/logback-classic/1.2.3/logback-classic-1.2.3.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.slf4j.impl.SimpleLoggerFactory]
[main] INFO org.eclipse.jetty.util.log - Logging initialized @2692ms to org.eclipse.jetty.util.log.Slf4jLog
"(moclojer :start-server)"
Execution error (ClassCastException) at moclojer.openapi/json-pointer->path (openapi.clj:30).
class java.lang.Integer cannot be cast to class java.lang.CharSequence (java.lang.Integer and java.lang.CharSequence are in module java.base of loader 'bootstrap')
Full report at:
/var/folders/zy/hl55b1r15qs7pq6dtflqf5k80000gn/T/clojure-13562412897444537512.edn
Whats is devcontainer?
Way to leave the development environment inside the container, it is a specification that started in vscode and other editors support.
when running the clj -M:run
command it gives a namespace error
clojure.lang.Named.getNamespace() becuase x is null
clj -M:run
No response
moclojer version: branch main
While trying to use the -c
and -m
specified on README.md, you will not be able to launch the Moclojer software with mocks. It won't recognize the config file.
Use this docker:
FROM ghcr.io/moclojer/moclojer:latest
COPY ./mock_files/ /app/mock_files/
ENTRYPOINT ["/app/moclojer", "-c", "/app/mock_files/petstore.yaml", "-m", "/app/mock_files/pet-mocks.yml"]
With the files from a certain mock specification
N/A
It should be able to load the config not only from environment variables, but from the flags on the command.
moclojer 0.2 (0bfcda8)
macOS Ventura 13.0.1 (22A400)
ref: https://github.com/moclojer/moclojer/actions/runs/4791922662/jobs/8522968317
tar: moclojer_target.tar.bz2: Cannot read: Is a directory
tar: At beginning of tape, quitting now
tar: Error is not recoverable: exiting now
Error: Process completed with exit code 2.
v
prefixdoes not apply, it is a problem in the github action
No response
does not apply, it is a problem in the github action
Support for "closed" endpoint by authentication
Authorization: Bearer <token>
There is a specification called API Blueprint created by Apiary (and bought by Oracle).
There is a mock server project written in Java that implements the Blueprint API specification
Simple example:
FORMAT: 1A
# The Simplest API
This is one of the simplest APIs written in the **API Blueprint**. One plain
resource combined with a method and that's it! We will explain what is going on
in the next installment -
[Resource and Actions](02.%20Resource%20and%20Actions.md).
**Note:** As we progress through the examples, do not also forget to view the
[Raw](https://raw.github.com/apiaryio/api-blueprint/master/examples/01.%20Simplest%20API.md)
code to see what is really going on in the API Blueprint, as opposed to just
seeing the output of the Github Markdown parser.
Also please keep in mind that every single example in this course is a **real
API Blueprint** and as such you can **parse** it with the
[API Blueprint parser](https://github.com/apiaryio/drafter) or one of its
[bindings](https://github.com/apiaryio/drafter#bindings).
## API Blueprint
+ [This: Raw API Blueprint](https://raw.github.com/apiaryio/api-blueprint/master/examples/01.%20Simplest%20API.md)
+ [Next: Resource and Actions](02.%20Resource%20and%20Actions.md)
# GET /message
+ Response 200 (text/plain)
Hello World!
We have a problem generating binaries with graalvm/native-image with the implementation of issue #152 in PR #153 - it's a simple implementation and graalvm has stopped working and we can't identify the real reason why it's not generating the binary (working correctly).
the "feature" (binary distribution) has been removed, but it is an important feature for the long-term "success" of the product, so we need to implement it in the future.
... it's not an execution bug, so I'm not describing it step by step
No response
#153
for implementing excel support (xlsx)
This project currently use a custom YAML format to describe the routes.
It would be nice if it uses as a base for this YAML config file, the OpenAPI format.
Some possible benefits for this move:
Here how the first example endpoint can be represented.
paths:
/hello-world:
get:
## Your new mockResponse attribute
mockResponse:
status: 200
headers:
Content-Type: application/json
body: >
{
"hello": "Hello, World!"
}
## Other OpenAPI v3 attributes, that may be used to check if the request is valid
## or just use to show an autodoc webpage.
tags:
- hello
- world
parameters:
- name: username
in: path
description: Username of the user to send hello
required: false
schema:
type: string
Pending tasks:
mockResponse
is a name allowed to extension in openAPI specFuture work:
openapi-spec.yaml
already exists, and we just want to add mock to this spec. In OpenAPI, each operation can have a unique OperationID
. We can use it and provide an extra file, operationId->mock.yaml
, allowing to generate mocks to a existing openapi spec.run:
$ CONFIG=simple-api.json MOCKS=mocks.json clj -X:run
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/Users/avelino/.m2/repository/org/slf4j/slf4j-simple/1.7.5/slf4j-simple-1.7.5.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/Users/avelino/.m2/repository/ch/qos/logback/logback-classic/1.2.3/logback-classic-1.2.3.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.slf4j.impl.SimpleLoggerFactory]
[main] INFO org.eclipse.jetty.util.log - Logging initialized @2806ms to org.eclipse.jetty.util.log.Slf4jLog
(-> moclojer :start-server :version "0.1")
[main] INFO moclojer.router - {:mode "openapi", :line 14}
[async-thread-macro-1] INFO moclojer.router - {:mode "openapi", :line 14}
[main] INFO org.eclipse.jetty.server.Server - jetty-9.4.44.v20210927; built: 2021-09-27T23:02:44.612Z; git: 8da83308eeca865e495e53ef315a249d63ba9332; jvm 17.0.2+0
[main] INFO org.eclipse.jetty.server.handler.ContextHandler - Started o.e.j.s.ServletContextHandler@3a4fccc7{/,null,AVAILABLE}
[main] INFO org.eclipse.jetty.server.AbstractConnector - Started ServerConnector@421d9b57{HTTP/1.1, (http/1.1, h2c)}{localhost:8000}
[main] INFO org.eclipse.jetty.server.Server - Started @3220ms
[qtp106092746-24] INFO io.pedestal.http - {:msg "GET /hello", :line 80}
[qtp106092746-18] INFO io.pedestal.http - {:msg "GET /hello", :line 80}
request via curl
and browser:
$ curl -X GET -I http://127.0.0.1:8000/hello
HTTP/1.1 501 Not Implemented
Date: Wed, 30 Mar 2022 10:32:43 GMT
Strict-Transport-Security: max-age=31536000; includeSubdomains
X-Frame-Options: DENY
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
X-Download-Options: noopen
X-Permitted-Cross-Domain-Policies: none
Content-Security-Policy: object-src 'none'; script-src 'unsafe-inline' 'unsafe-eval' 'strict-dynamic' https: http:;
Transfer-Encoding: chunked
simple-api.json
:
{
"openapi": "3.0.0",
"info": {
"title": "Sample API",
"version": "1.0"
},
"paths": {
"/hello": {
"get": {
"operationId": "greet",
"responses": {
"200": {
"description": "A JSON array of user names",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"hello"
],
"properties": {
"hello": {
"type": "string"
}
}
}
}
}
}
}
}
}
}
}
mocks.json
:
{
"myFirstRoute": {
"body": "{\"hello\": \"{{path-params.username}}!\"}",
"headers": {
"Content-Type": "application/json"
},
"status": 200
}
}
support excel document (xlsx
) content on endpoint return
discussed in #116
table:
name | langs |
---|---|
avelino | clojure, go |
chicao | clojure, python |
response (expected):
[{"name": "avelino", "langs": "clojure, go"},
{"name": "chicao","langs": "clojure, python"}]
- endpoint:
method: GET
path: /xlsx
response:
status: 200
headers:
Content-Type: application/json
external-body:
provider: xlsx
path: test/moclojer/resources/lerolero.xlsx
sheet-name: test
support use of query parameters in the return content of the endpoint (body) ?param1=moclojer
path: /hi/:username
When receiving a parameter in the URL it must pass it to the template, being possible to use the parameter in the return body
yml
example:
- endpoint:
method: GET
path: /hi/:username
response:
status: 200
headers:
Content-Type: application/json
body: >
{
"username": "{{username}}"
}
For template rendering we can use Selmer, it keeps up to date and has a friendly syntax.
Example of use:
(parser/render "{{username}}" {:username "moclojer"})
docker -it \
-v $(pwd)/moclojer.yml:/app/moclojer.yml \
ghcr.io/avelino/moclojer:latest
docker output:
exec /usr/local/openjdk-11/bin/java: exec format error
thanks @wesleywillians
ref: https://schema.postman.com/collection/json/v2.1.0/draft-07/docs/index.html
{
"info": {
"_postman_id": "5r7ccf61-22db-4670-95c4-0d4d51ad2193",
"name": "hello-api",
"schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
},
"item": [
{
"name": "/helloworld/foo",
"request": {
"method": "GET",
"header": [
],
"body": {
"mode": "raw",
"raw": ""
},
"url": {
"raw": "{{url}}/helloworld/foo",
"host": [
"{{url}}"
],
"path": [
"helloworld",
"foo"
]
}
},
"response": [
]
},
{
"name": "/list",
"request": {
"method": "GET",
"header": [
],
"body": {
"mode": "raw",
"raw": ""
},
"url": {
"raw": "{{url}}/list",
"host": [
"{{url}}"
],
"path": [
"list"
]
}
},
"response": [
]
},
{
"name": "/add",
"request": {
"method": "POST",
"header": [
{
"key": "Content-Type",
"name": "Content-Type",
"value": "application/json",
"type": "text"
}
],
"body": {
"mode": "raw",
"raw": "{\n\t\"route\": \"/foo/{id}\",\n\t\"methods\": [\"get\"],\n\t\"responses\": [\n\t\t{\n\t\t\t\"uri\": \"/foo/1\",\n\t\t\t\"method\": \"get\",\n\t\t\t\"statusCode\": 200,\n\t\t\t\"headers\": {\"Content-Type\": \"application/json\"},\n\t\t\t\"body\": {\n\t\t\t\t\"foo\": \"bar\"\n\t\t\t}\n\t\t}\t\n\t]\n}"
},
"url": {
"raw": "{{url}}/add",
"host": [
"{{url}}"
],
"path": [
"add"
]
}
},
"response": [
]
}
]
}
ref: #39
Use multistage build with native image to distribute the docker image in the smallest possible size
a great image for final distribution is distroless, created and maintained by Google
gcr.io/distroless/base
https://console.cloud.google.com/gcr/images/distroless/GLOBAL/base
Originally posted by avelino May 5, 2023
When I look at the moclojer code I feel that we are building it wrong, it is hard to understand (especially the openapi package).
We need to make the code simpler and more readable, the way it now increases the barrier for new contributors to get in - if I (who started the project) having trouble understanding it, imagine who is just getting here
Moclojer converts the moclojer specification (yaml
and edn
) to openapi
format and the http server is built on top of the openapi specification - that's how it works today.
The proposal would be that moclojer supports "only" the moclojer spec and who wants to use openapi we do the conversion from openapi to moclojer spec.
This way, the moclojer spec will evolve in parallel with openapi (to run on moclojer).
The distribution of the moclojer
will be done via a self-contained binary file (without depending on Java installed on the machine), for this we use GraalVM to generate the binary using native-image
.
The yaml package is giving error:
β― moclojer (main) β CONFIG=moclojer.yml ./moclojer
"(-> moclojer :start-server)"
Exception in thread "main" java.lang.ClassNotFoundException: org.yaml.snakeyaml.Yaml
at java.lang.Class.forName(DynamicHub.java:1338)
at clojure.lang.RT.classForName(RT.java:2212)
at clojure.lang.RT.classForName(RT.java:2221)
at yaml.reader$parse_string.invokeStatic(reader.clj:67)
at yaml.reader$parse_string.doInvoke(reader.clj:53)
at clojure.lang.RestFn.invoke(RestFn.java:439)
at yaml.core$from_file.invokeStatic(core.clj:25)
at yaml.core$from_file.invoke(core.clj:19)
at yaml.core$from_file.invokeStatic(core.clj:22)
at yaml.core$from_file.invoke(core.clj:19)
at moclojer.core$_main.invokeStatic(core.clj:47)
at moclojer.core$_main.doInvoke(core.clj:41)
at clojure.lang.RestFn.invoke(RestFn.java:397)
at clojure.lang.AFn.applyToHelper(AFn.java:152)
at clojure.lang.RestFn.applyTo(RestFn.java:132)
at moclojer.core.main(Unknown Source)
ref: How to build a native binary for your Clojure projects with GraalVM
native-image
command:
native-image --report-unsupported-elements-at-runtime \
-jar ./moclojer.jar \
-H:Name=./moclojer \
-H:Name=moclojer \
-H:+ReportExceptionStackTraces \
--initialize-at-build-time \
--verbose \
--no-fallback \
--no-server \
--allow-incomplete-classpath \
-H:ReflectionConfigurationFiles=reflect-config.json \
moclojer.core
by running moclojer in the docker image the http server is not outside docker, only inside docker
docker-compose.yml
:
version: '3'
services:
moclojer:
image: ghcr.io/moclojer/moclojer:dev
platform: linux/amd64
ports:
- 8000:8000
volumes:
- ./moclojer.yml:/app/moclojer.yml
moclojer.yml
:
# This mock register route: GET /hello/:username
- endpoint:
# Note: the method could be omitted because GET is the default
method: GET
path: /hello/:username
response:
# Note: the status could be omitted because 200 is the default
status: 200
headers:
Content-Type: application/json
# Note: the body will receive the value passed in the url using the
# :username placeholder
body: >
{
"hello": "{{path-params.username}}!"
}
report by @wesleywillians
- endpoint:
host: moclojer.com
method: GET
path: /multihost
response:
status: 200
headers:
Content-Type: application/json
body: >
{
"domain": "moclojer.com"
}
- endpoint:
host: sub.moclojer.com
method: GET
path: /multihost-sub
response:
status: 200
headers:
Content-Type: application/json
body: >
{
"domain": "sub.moclojer.com"
}
moclojer will be distributed as a binary with everything self-contained, so it is not necessary to have Java installed to work.
Set a default config in the home dir of the user, like ~/.config/moclojer/config
ref: #158 (comment)
Hey I was reading this issue and I think the problem is with the newly added lib
dk.ative/docjure
it heavily relies onorg.apache.poi/poi
in which uses a lot of reflections and this can be hard to graalvm tree shake detect and add the dynamically executed classes in the build as you can see in this issue.
by @rafaeldelboni
Ref:
moclojer/test/moclojer/openapi_test.clj
Line 13 in c6ce862
We have our docs in another repository which is https://github.com/avelino/avelino.run/blob/main/content/projects/moclojer.md.
We would like to move it to this repository. This way it will be easier to add new information to our doc.
Originally posted by matheusfrancisco December 4, 2023
Bruno uses plain-text files organized in related folders, in order to declare an API client tester.
schema: https://bruno-docs.vercel.app/bru-language-tag-reference.html
real use case: https://github.com/usebruno/github-rest-api-collection/tree/main
The root folder needs a json file with the content as follows:
{
"version": "1",
"name": "<<the name of my rest api>>",
"type": "collection"
}
every subsequent file can contain the following:
info about the request
meta {
name: Get users,
type: http
seq: 1
}
which can be any of get, post, put, delete, options, trace, connect and head.
[get/post/put/delete/options/trace/connect/head] {
url: https://api.github.com/users/usebruno
}
optional
query {
something: hello
anotherThing: bye
aThirdThing: hi again
}
optional
headers {
content-type: application/json
Authorization: Bearer topsecret
}
optional
The body can be of any type within text, xml, form-encoded, json, multipart-form, graphql, pre-request and post-request
body:text {
This is a text body
}
cc: @J0sueTM
discussed in #173
spec:
- endpoint:
method: POST
path: /with-webhook
response:
status: 200
headers:
Content-Type: application/json
body: >
{"id": 123}
webhook:
sleep-time: 60
url: http://avelino.run/
method: GET
body: >
{"id": 123, "another-field": "it's working"}
Hello, we could give support to edn format as well.
I opened this PR to #16
write template documentation, specifying how to receive:
There are several types of formats to be exported from openapi, we need to create a complete and simplified documentation on how to use moclojer with openapi files.
Files types:
What is the functionality of moclojer's mock parameter?
I was using moclojer with a localhost frontend and when my frontend hit the moclojer url from my specs I got a cross error,
to fix this we should add ::http/allowed-origins
in the image bellow
I'm running this locally from branch main to develop my frontend, but not sure if we will always allowed localhost even when we build the binary or in our sass application.
do a request for moclojer with a frontend running on localhost:8000
- endpoint:
# Note: the method could be omitted because GET is the default
method: POST
path: /login/auth
response:
# Note: the status could be omitted because 200 is the default
status: 201
headers:
Content-Type: application/json
# Note: the body will receive the value passed in the url using the
# :username placeholder
body: >
{
"user": {"email": "[email protected]", "id": "uuid"}
}
Allow the request
branch main
os: arch linux
The build process is slow (it takes a long time), the configuration files (github action) are extensive and confusing.
We need to simplify the files and design a more user-friendly solution β do we need the .jar
dependency to generate native-image
? It's probably best to generate the .jar
again!
in the printscreen below generating the jar took 36s and uploading the artifact was at
67%
taking +9min
related: #25
this function is too complex, we need to rewrite simplifying the logic and splitting the implementation into smaller functions
moclojer/src/moclojer/openapi.clj
Lines 101 to 158 in 068bd17
A declarative, efficient, and flexible JavaScript library for building user interfaces.
π Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. πππ
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google β€οΈ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.