Add locking

This commit is contained in:
Michiel Borkent 2020-01-04 20:04:29 +01:00
parent 62f12e75ee
commit 5e2c2a7ba0
9 changed files with 239 additions and 902 deletions

View file

@ -11,7 +11,7 @@ jobs:
working_directory: ~/repo working_directory: ~/repo
environment: environment:
LEIN_ROOT: "true" LEIN_ROOT: "true"
# GRAALVM_HOME: /home/circleci/graalvm-ce-java8-19.3.0 BABASHKA_PLATFORM: linux # could be used in jar name
steps: steps:
- checkout - checkout
- run: - run:
@ -52,7 +52,7 @@ jobs:
mkdir -p /tmp/release mkdir -p /tmp/release
lein do clean, uberjar lein do clean, uberjar
VERSION=$(cat resources/BABASHKA_VERSION) VERSION=$(cat resources/BABASHKA_VERSION)
cp target/babashka-$VERSION-standalone.jar /tmp/release cp target/babashka-$VERSION-linux-standalone.jar /tmp/release
- store_artifacts: - store_artifacts:
path: /tmp/release path: /tmp/release
destination: release destination: release
@ -115,6 +115,7 @@ jobs:
name: Run tests name: Run tests
command: | command: |
script/test script/test
script/clj_http_lite_test
# - run: # - run:
# name: Performance report # name: Performance report
# command: | # command: |
@ -178,6 +179,7 @@ jobs:
name: Run tests name: Run tests
command: | command: |
script/test script/test
script/clj_http_lite_test
# - run: # - run:
# name: Performance report # name: Performance report
# command: | # command: |

1
.gitignore vendored
View file

@ -16,3 +16,4 @@ pom.xml.asc
!test-resources/babashka/src_for_classpath_test/foo.jar !test-resources/babashka/src_for_classpath_test/foo.jar
.cpcache .cpcache
deps.edn deps.edn
reflection.json

View file

@ -1,554 +0,0 @@
[ {
"name" : "clojure.lang.Delay",
"allPublicMethods" : true,
"allPublicFields" : true,
"allPublicConstructors" : true
}, {
"name" : "clojure.lang.ExceptionInfo",
"allPublicMethods" : true,
"allPublicFields" : true,
"allPublicConstructors" : true
}, {
"name" : "clojure.lang.IEditableCollection",
"allPublicMethods" : true,
"allPublicFields" : true,
"allPublicConstructors" : true
}, {
"name" : "clojure.lang.IObj",
"allPublicMethods" : true,
"allPublicFields" : true,
"allPublicConstructors" : true
}, {
"name" : "clojure.lang.LineNumberingPushbackReader",
"allPublicMethods" : true,
"allPublicFields" : true,
"allPublicConstructors" : true
}, {
"name" : "clojure.lang.MapEntry",
"allPublicMethods" : true,
"allPublicFields" : true,
"allPublicConstructors" : true
}, {
"name" : "clojure.lang.PersistentQueue",
"allPublicMethods" : true,
"allPublicFields" : true,
"allPublicConstructors" : true
}, {
"name" : "java.io.BufferedReader",
"allPublicMethods" : true,
"allPublicFields" : true,
"allPublicConstructors" : true
}, {
"name" : "java.io.BufferedWriter",
"allPublicMethods" : true,
"allPublicFields" : true,
"allPublicConstructors" : true
}, {
"name" : "java.io.ByteArrayInputStream",
"allPublicMethods" : true,
"allPublicFields" : true,
"allPublicConstructors" : true
}, {
"name" : "java.io.ByteArrayOutputStream",
"allPublicMethods" : true,
"allPublicFields" : true,
"allPublicConstructors" : true
}, {
"name" : "java.io.File",
"allPublicMethods" : true,
"allPublicFields" : true,
"allPublicConstructors" : true
}, {
"name" : "java.io.IOException",
"allPublicMethods" : true,
"allPublicFields" : true,
"allPublicConstructors" : true
}, {
"name" : "java.io.InputStream",
"allPublicMethods" : true,
"allPublicFields" : true,
"allPublicConstructors" : true
}, {
"name" : "java.io.OutputStream",
"allPublicMethods" : true,
"allPublicFields" : true,
"allPublicConstructors" : true
}, {
"name" : "java.io.StringReader",
"allPublicMethods" : true,
"allPublicFields" : true,
"allPublicConstructors" : true
}, {
"name" : "java.io.StringWriter",
"allPublicMethods" : true,
"allPublicFields" : true,
"allPublicConstructors" : true
}, {
"name" : "java.lang.ArithmeticException",
"allPublicMethods" : true,
"allPublicFields" : true,
"allPublicConstructors" : true
}, {
"name" : "java.lang.AssertionError",
"allPublicMethods" : true,
"allPublicFields" : true,
"allPublicConstructors" : true
}, {
"name" : "java.lang.Boolean",
"allPublicMethods" : true,
"allPublicFields" : true,
"allPublicConstructors" : true
}, {
"name" : "java.lang.Class",
"allPublicMethods" : true,
"allPublicFields" : true,
"allPublicConstructors" : true
}, {
"name" : "java.lang.Double",
"allPublicMethods" : true,
"allPublicFields" : true,
"allPublicConstructors" : true
}, {
"name" : "java.lang.Exception",
"allPublicMethods" : true,
"allPublicFields" : true,
"allPublicConstructors" : true
}, {
"name" : "java.lang.Integer",
"allPublicMethods" : true,
"allPublicFields" : true,
"allPublicConstructors" : true
}, {
"name" : "java.lang.Math",
"allPublicMethods" : true,
"allPublicFields" : true,
"allPublicConstructors" : true
}, {
"name" : "java.lang.Process",
"allPublicMethods" : true,
"allPublicFields" : true,
"allPublicConstructors" : true
}, {
"name" : "java.lang.ProcessBuilder",
"allPublicMethods" : true,
"allPublicFields" : true,
"allPublicConstructors" : true
}, {
"name" : "java.lang.ProcessBuilder$Redirect",
"allPublicMethods" : true,
"allPublicFields" : true,
"allPublicConstructors" : true
}, {
"name" : "java.lang.String",
"allPublicMethods" : true,
"allPublicFields" : true,
"allPublicConstructors" : true
}, {
"name" : "java.lang.System",
"allPublicMethods" : true,
"allPublicFields" : true,
"allPublicConstructors" : true
}, {
"name" : "java.lang.Throwable",
"allPublicMethods" : true,
"allPublicFields" : true,
"allPublicConstructors" : true
}, {
"name" : "java.lang.UNIXProcess",
"allPublicMethods" : true,
"allPublicFields" : true,
"allPublicConstructors" : true
}, {
"name" : "java.lang.UNIXProcess$ProcessPipeOutputStream",
"allPublicMethods" : true,
"allPublicFields" : true,
"allPublicConstructors" : true
}, {
"name" : "java.net.HttpURLConnection",
"allPublicMethods" : true,
"allPublicFields" : true,
"allPublicConstructors" : true
}, {
"name" : "java.net.ServerSocket",
"allPublicMethods" : true,
"allPublicFields" : true,
"allPublicConstructors" : true
}, {
"name" : "java.net.Socket",
"allPublicMethods" : true,
"allPublicFields" : true,
"allPublicConstructors" : true
}, {
"name" : "java.net.URI",
"allPublicMethods" : true,
"allPublicFields" : true,
"allPublicConstructors" : true
}, {
"name" : "java.net.URLDecoder",
"allPublicMethods" : true,
"allPublicFields" : true,
"allPublicConstructors" : true
}, {
"name" : "java.net.URLEncoder",
"allPublicMethods" : true,
"allPublicFields" : true,
"allPublicConstructors" : true
}, {
"name" : "java.net.UnknownHostException",
"allPublicMethods" : true,
"allPublicFields" : true,
"allPublicConstructors" : true
}, {
"name" : "java.nio.file.CopyOption",
"allPublicMethods" : true,
"allPublicFields" : true,
"allPublicConstructors" : true
}, {
"name" : "java.nio.file.FileAlreadyExistsException",
"allPublicMethods" : true,
"allPublicFields" : true,
"allPublicConstructors" : true
}, {
"name" : "java.nio.file.Files",
"allPublicMethods" : true,
"allPublicFields" : true,
"allPublicConstructors" : true
}, {
"name" : "java.nio.file.LinkOption",
"allPublicMethods" : true,
"allPublicFields" : true,
"allPublicConstructors" : true
}, {
"name" : "java.nio.file.NoSuchFileException",
"allPublicMethods" : true,
"allPublicFields" : true,
"allPublicConstructors" : true
}, {
"name" : "java.nio.file.Path",
"allPublicMethods" : true,
"allPublicFields" : true,
"allPublicConstructors" : true
}, {
"name" : "java.nio.file.Paths",
"allPublicMethods" : true,
"allPublicFields" : true,
"allPublicConstructors" : true
}, {
"name" : "java.nio.file.StandardCopyOption",
"allPublicMethods" : true,
"allPublicFields" : true,
"allPublicConstructors" : true
}, {
"name" : "java.nio.file.attribute.FileAttribute",
"allPublicMethods" : true,
"allPublicFields" : true,
"allPublicConstructors" : true
}, {
"name" : "java.nio.file.attribute.FileTime",
"allPublicMethods" : true,
"allPublicFields" : true,
"allPublicConstructors" : true
}, {
"name" : "java.nio.file.attribute.PosixFilePermission",
"allPublicMethods" : true,
"allPublicFields" : true,
"allPublicConstructors" : true
}, {
"name" : "java.nio.file.attribute.PosixFilePermissions",
"allPublicMethods" : true,
"allPublicFields" : true,
"allPublicConstructors" : true
}, {
"name" : "java.time.Clock",
"allPublicMethods" : true,
"allPublicFields" : true,
"allPublicConstructors" : true
}, {
"name" : "java.time.DateTimeException",
"allPublicMethods" : true,
"allPublicFields" : true,
"allPublicConstructors" : true
}, {
"name" : "java.time.DayOfWeek",
"allPublicMethods" : true,
"allPublicFields" : true,
"allPublicConstructors" : true
}, {
"name" : "java.time.Duration",
"allPublicMethods" : true,
"allPublicFields" : true,
"allPublicConstructors" : true
}, {
"name" : "java.time.Instant",
"allPublicMethods" : true,
"allPublicFields" : true,
"allPublicConstructors" : true
}, {
"name" : "java.time.LocalDate",
"allPublicMethods" : true,
"allPublicFields" : true,
"allPublicConstructors" : true
}, {
"name" : "java.time.LocalDateTime",
"allPublicMethods" : true,
"allPublicFields" : true,
"allPublicConstructors" : true
}, {
"name" : "java.time.LocalTime",
"allPublicMethods" : true,
"allPublicFields" : true,
"allPublicConstructors" : true
}, {
"name" : "java.time.Month",
"allPublicMethods" : true,
"allPublicFields" : true,
"allPublicConstructors" : true
}, {
"name" : "java.time.MonthDay",
"allPublicMethods" : true,
"allPublicFields" : true,
"allPublicConstructors" : true
}, {
"name" : "java.time.OffsetDateTime",
"allPublicMethods" : true,
"allPublicFields" : true,
"allPublicConstructors" : true
}, {
"name" : "java.time.OffsetTime",
"allPublicMethods" : true,
"allPublicFields" : true,
"allPublicConstructors" : true
}, {
"name" : "java.time.Period",
"allPublicMethods" : true,
"allPublicFields" : true,
"allPublicConstructors" : true
}, {
"name" : "java.time.Year",
"allPublicMethods" : true,
"allPublicFields" : true,
"allPublicConstructors" : true
}, {
"name" : "java.time.YearMonth",
"allPublicMethods" : true,
"allPublicFields" : true,
"allPublicConstructors" : true
}, {
"name" : "java.time.ZoneId",
"allPublicMethods" : true,
"allPublicFields" : true,
"allPublicConstructors" : true
}, {
"name" : "java.time.ZoneOffset",
"allPublicMethods" : true,
"allPublicFields" : true,
"allPublicConstructors" : true
}, {
"name" : "java.time.ZonedDateTime",
"allPublicMethods" : true,
"allPublicFields" : true,
"allPublicConstructors" : true
}, {
"name" : "java.time.format.DateTimeFormatter",
"allPublicMethods" : true,
"allPublicFields" : true,
"allPublicConstructors" : true
}, {
"name" : "java.time.temporal.TemporalAccessor",
"allPublicMethods" : true,
"allPublicFields" : true,
"allPublicConstructors" : true
}, {
"name" : "java.util.Base64",
"allPublicMethods" : true,
"allPublicFields" : true,
"allPublicConstructors" : true
}, {
"name" : "java.util.Base64$Decoder",
"allPublicMethods" : true,
"allPublicFields" : true,
"allPublicConstructors" : true
}, {
"name" : "java.util.Base64$Encoder",
"allPublicMethods" : true,
"allPublicFields" : true,
"allPublicConstructors" : true
}, {
"name" : "java.util.UUID",
"allPublicMethods" : true,
"allPublicFields" : true,
"allPublicConstructors" : true
}, {
"name" : "java.util.concurrent.LinkedBlockingQueue",
"allPublicMethods" : true,
"allPublicFields" : true,
"allPublicConstructors" : true
}, {
"name" : "java.util.concurrent.TimeUnit",
"allPublicMethods" : true,
"allPublicFields" : true,
"allPublicConstructors" : true
}, {
"name" : "java.util.regex.Pattern",
"allPublicMethods" : true,
"allPublicFields" : true,
"allPublicConstructors" : true
}, {
"name" : "java.util.zip.DeflaterInputStream",
"allPublicMethods" : true,
"allPublicFields" : true,
"allPublicConstructors" : true
}, {
"name" : "java.util.zip.GZIPInputStream",
"allPublicMethods" : true,
"allPublicFields" : true,
"allPublicConstructors" : true
}, {
"name" : "java.util.zip.GZIPOutputStream",
"allPublicMethods" : true,
"allPublicFields" : true,
"allPublicConstructors" : true
}, {
"name" : "java.util.zip.InflaterInputStream",
"allPublicMethods" : true,
"allPublicFields" : true,
"allPublicConstructors" : true
}, {
"name" : "sun.net.www.http.PosterOutputStream",
"allPublicMethods" : true,
"allPublicFields" : true,
"allPublicConstructors" : true
}, {
"name" : "sun.net.www.protocol.http.HttpURLConnection",
"allPublicMethods" : true,
"allPublicFields" : true,
"allPublicConstructors" : true
}, {
"name" : "sun.net.www.protocol.http.HttpURLConnection$HttpInputStream",
"allPublicMethods" : true,
"allPublicFields" : true,
"allPublicConstructors" : true
}, {
"name" : "sun.net.www.protocol.https.HttpsURLConnectionImpl",
"allPublicMethods" : true,
"allPublicFields" : true,
"allPublicConstructors" : true
}, {
"name" : "sun.nio.fs.UnixPath",
"allPublicMethods" : true,
"allPublicFields" : true,
"allPublicConstructors" : true
}, {
"allPublicConstructors" : true,
"methods" : [ {
"name" : "activeCount"
}, {
"name" : "checkAccess"
}, {
"name" : "currentThread"
}, {
"name" : "dumpStack"
}, {
"name" : "enumerate"
}, {
"name" : "getAllStackTraces"
}, {
"name" : "getContextClassLoader"
}, {
"name" : "getDefaultUncaughtExceptionHandler"
}, {
"name" : "getId"
}, {
"name" : "getName"
}, {
"name" : "getPriority"
}, {
"name" : "getStackTrace"
}, {
"name" : "getState"
}, {
"name" : "getThreadGroup"
}, {
"name" : "getUncaughtExceptionHandler"
}, {
"name" : "holdsLock"
}, {
"name" : "interrupt"
}, {
"name" : "interrupted"
}, {
"name" : "isAlive"
}, {
"name" : "isDaemon"
}, {
"name" : "isInterrupted"
}, {
"name" : "join"
}, {
"name" : "run"
}, {
"name" : "setContextClassLoader"
}, {
"name" : "setDaemon"
}, {
"name" : "setDefaultUncaughtExceptionHandler"
}, {
"name" : "setName"
}, {
"name" : "setPriority"
}, {
"name" : "setUncaughtExceptionHandler"
}, {
"name" : "sleep"
}, {
"name" : "start"
}, {
"name" : "toString"
}, {
"name" : "yield"
} ],
"name" : "java.lang.Thread"
}, {
"allPublicConstructors" : true,
"allPublicFields" : true,
"methods" : [ {
"name" : "equals"
}, {
"name" : "getAuthority"
}, {
"name" : "getContent"
}, {
"name" : "getDefaultPort"
}, {
"name" : "getFile"
}, {
"name" : "getHost"
}, {
"name" : "getPath"
}, {
"name" : "getPort"
}, {
"name" : "getProtocol"
}, {
"name" : "getQuery"
}, {
"name" : "getRef"
}, {
"name" : "getUserInfo"
}, {
"name" : "hashCode"
}, {
"name" : "openConnection"
}, {
"name" : "openStream"
}, {
"name" : "sameFile"
}, {
"name" : "toExternalForm"
}, {
"name" : "toString"
}, {
"name" : "toURI"
} ],
"name" : "java.net.URL"
} ]

View file

@ -1,185 +0,0 @@
[
{
"name":"java.lang.ArithmeticException",
"allPublicMethods":true,
"allPublicFields": true,
"allPublicConstructors": true
},
{
"name":"java.lang.AssertionError",
"allPublicMethods":true,
"allPublicFields": true,
"allPublicConstructors": true
},
{
"name":"java.lang.Boolean",
"allPublicMethods":true,
"allPublicFields": true,
"allPublicConstructors": true
},
{
"name":"java.io.BufferedWriter",
"allPublicMethods":true,
"allPublicFields": true,
"allPublicConstructors": true
},
{
"name":"java.io.BufferedReader",
"allPublicMethods":true,
"allPublicFields": true,
"allPublicConstructors": true
},
{
"name": "java.lang.Class",
"allDeclaredConstructors": true,
"allPublicConstructors": true,
"allDeclaredMethods": true,
"allPublicMethods": true
},
{
"name":"java.lang.Double",
"allPublicMethods":true,
"allPublicFields": true,
"allPublicConstructors": true
},
{
"name":"java.lang.Exception",
"allPublicMethods":true,
"allPublicFields": true,
"allPublicConstructors": true
},
{
"name": "clojure.lang.ExceptionInfo",
"allPublicMethods":true,
"allPublicFields": true,
"allPublicConstructors": true
},
{
"name":"java.lang.Integer",
"allPublicMethods":true,
"allPublicFields": true,
"allPublicConstructors": true
},
{
"name":"java.io.File",
"allPublicMethods":true,
"allPublicFields": true,
"allPublicConstructors": true
},
{
"name":"clojure.lang.LineNumberingPushbackReader",
"allPublicMethods":true,
"allPublicFields": true,
"allPublicConstructors": true
},
{
"name":"java.util.concurrent.LinkedBlockingQueue",
"allPublicMethods":true
},
{
"name":"java.util.regex.Pattern",
"allPublicMethods":true,
"allPublicFields": true,
"allPublicConstructors": true
},
{
"name":"java.lang.Process",
"allPublicMethods":true
},
{
"name":"java.lang.ProcessBuilder",
"allPublicConstructors":true
},
{
"name":"java.lang.String",
"allPublicMethods":true,
"allPublicFields": true,
"allPublicConstructors": true
},
{
"name":"java.io.StringReader",
"allPublicMethods":true,
"allPublicFields": true,
"allPublicConstructors": true
},
{
"name":"java.io.StringWriter",
"allPublicMethods":true,
"allPublicFields": true,
"allPublicConstructors": true
},
{
"name":"java.lang.System",
"allPublicMethods":true,
"allPublicFields": true,
"allPublicConstructors": true
},
{
"name":"java.lang.Thread",
"methods": [{"name":"run"},{"name":"toString"},{"name":"isInterrupted"},{"name":"currentThread"},{"name":"getName"},{"name":"join"},{"name":"getThreadGroup"},{"name":"getStackTrace"},{"name":"holdsLock"},{"name":"checkAccess"},{"name":"dumpStack"},{"name":"yield"},{"name":"setPriority"},{"name":"setDaemon"},{"name":"start"},{"name":"sleep"},{"name":"interrupt"},{"name":"interrupted"},{"name":"isAlive"},{"name":"getPriority"},{"name":"setName"},{"name":"activeCount"},{"name":"enumerate"},{"name":"isDaemon"},{"name":"getContextClassLoader"},{"name":"setContextClassLoader"},{"name":"getAllStackTraces"},{"name":"getId"},{"name":"getState"},{"name":"setDefaultUncaughtExceptionHandler"},{"name":"getDefaultUncaughtExceptionHandler"},{"name":"getUncaughtExceptionHandler"},{"name":"setUncaughtExceptionHandler"}],
"allPublicFields": true,
"allPublicConstructors": true
},
{
"name":"java.lang.UNIXProcess",
"allPublicMethods":true
},
{
"name":"java.nio.file.attribute.FileAttribute",
"allPublicMethods":true,
"allPublicFields": true,
"allPublicConstructors": true
},
{
"name":"java.nio.file.attribute.PosixFilePermission",
"allPublicMethods":true,
"allPublicFields": true,
"allPublicConstructors": true
},
{
"name":"java.nio.file.attribute.PosixFilePermissions",
"allPublicMethods":true,
"allPublicFields": true,
"allPublicConstructors": true
},
{
"name":"java.nio.file.Path",
"allPublicMethods":true
},
{
"name":"java.nio.file.CopyOption",
"allPublicMethods":true,
"allPublicFields": true,
"allPublicConstructors": true
},
{
"name":"java.nio.file.FileAlreadyExistsException",
"allPublicMethods":true,
"allPublicFields": true,
"allPublicConstructors": true
},
{
"name":"java.nio.file.Files",
"allPublicMethods":true,
"allPublicFields": true,
"allPublicConstructors": true
},
{
"name":"java.nio.file.NoSuchFileException",
"allPublicMethods":true,
"allPublicFields": true,
"allPublicConstructors": true
},
{
"name":"java.nio.file.StandardCopyOption",
"allPublicMethods":true,
"allPublicFields": true,
"allPublicConstructors": true
},
{
"name":"sun.nio.fs.UnixPath",
"allPublicMethods":true,
"allPublicFields": true,
"allPublicConstructors": true
}
]

15
script/clj_http_lite_test Executable file
View file

@ -0,0 +1,15 @@
#!/usr/bin/env bash
export BABASHKA_CLASSPATH=$(clojure -Sdeps '{:deps {clj-http-lite {:git/url "https://github.com/borkdude/clj-http-lite" :sha "f44ebe45446f0f44f2b73761d102af3da6d0a13e"}}}' -Spath)
./bb -e "
(require '[clj-http.lite.client :as client])
(prn (:status (client/get \"https://www.clojure.org\")))
(prn (:status (client/get \"https://postman-echo.com/get?foo1=bar1&foo2=bar2\")))
(prn (:status (client/post \"https://postman-echo.com/post\")))
(prn (:status (client/put \"https://postman-echo.com/put\")))
"

View file

@ -1,164 +1,186 @@
(ns babashka.impl.classes (ns babashka.impl.classes
{:no-doc true} {:no-doc true}
(:require (:require
[cheshire.core :as json])) [cheshire.core :as json]
[clojure.string :as str]))
(def os-name (str/lower-case (System/getProperty "os.name")))
(def os (cond (str/includes? os-name "mac") :mac
(or (str/includes? os-name "nix")
(str/includes? os-name "nux")) :linux
(str/includes? os-name "win") :windows))
(def unix-like? (or (identical? os :linux)
(identical? os :mac)))
(def classes (def classes
{:default-classes '[clojure.lang.Delay (cond->
clojure.lang.ExceptionInfo '{:all [java.io.BufferedReader
clojure.lang.IObj java.io.BufferedWriter
clojure.lang.IEditableCollection java.io.ByteArrayInputStream
clojure.lang.LineNumberingPushbackReader java.io.ByteArrayOutputStream
clojure.lang.MapEntry java.io.File
clojure.lang.PersistentQueue java.io.InputStream
java.io.BufferedReader java.io.IOException
java.io.BufferedWriter java.io.OutputStream
java.io.ByteArrayInputStream java.io.StringReader
java.io.ByteArrayOutputStream java.io.StringWriter
java.io.File java.lang.ArithmeticException
java.io.InputStream java.lang.AssertionError
java.io.IOException java.lang.Boolean
java.io.OutputStream java.lang.Class
java.io.StringReader java.lang.Double
java.io.StringWriter java.lang.Exception
java.lang.ArithmeticException java.lang.Integer
java.lang.AssertionError java.lang.Math
java.lang.Boolean java.util.concurrent.LinkedBlockingQueue
java.lang.Class java.lang.Object
java.lang.Double java.lang.String
java.lang.Exception java.lang.System
java.lang.Integer java.lang.Throwable
java.lang.Math java.lang.Process
java.util.concurrent.LinkedBlockingQueue java.lang.ProcessBuilder
java.lang.String java.lang.ProcessBuilder$Redirect
java.lang.System java.net.URI
java.lang.Throwable java.net.HttpURLConnection
java.lang.Process java.net.ServerSocket
java.lang.UNIXProcess java.net.Socket
java.lang.UNIXProcess$ProcessPipeOutputStream java.net.UnknownHostException
java.lang.ProcessBuilder java.net.URLEncoder
java.lang.ProcessBuilder$Redirect java.net.URLDecoder
java.net.URI java.nio.file.CopyOption
java.net.HttpURLConnection java.nio.file.FileAlreadyExistsException
java.net.ServerSocket java.nio.file.Files
java.net.Socket java.nio.file.LinkOption
java.net.UnknownHostException java.nio.file.NoSuchFileException
java.net.URLEncoder java.nio.file.Path
java.net.URLDecoder java.nio.file.Paths
java.nio.file.CopyOption java.nio.file.StandardCopyOption
java.nio.file.FileAlreadyExistsException java.nio.file.attribute.FileAttribute
java.nio.file.Files java.nio.file.attribute.FileTime
java.nio.file.LinkOption java.nio.file.attribute.PosixFilePermission
java.nio.file.NoSuchFileException java.nio.file.attribute.PosixFilePermissions
java.nio.file.Path java.time.format.DateTimeFormatter
java.nio.file.Paths java.time.Clock
java.nio.file.StandardCopyOption java.time.DateTimeException
java.nio.file.attribute.FileAttribute java.time.DayOfWeek
java.nio.file.attribute.FileTime java.time.Duration
java.nio.file.attribute.PosixFilePermission java.time.Instant
java.nio.file.attribute.PosixFilePermissions java.time.LocalDate
java.time.format.DateTimeFormatter java.time.LocalDateTime
java.time.Clock java.time.LocalTime
java.time.DateTimeException java.time.Month
java.time.DayOfWeek java.time.MonthDay
java.time.Duration java.time.OffsetDateTime
java.time.Instant java.time.OffsetTime
java.time.LocalDate java.time.Period
java.time.LocalDateTime java.time.Year
java.time.LocalTime java.time.YearMonth
java.time.Month java.time.ZonedDateTime
java.time.MonthDay java.time.ZoneId
java.time.OffsetDateTime java.time.ZoneOffset
java.time.OffsetTime java.time.temporal.TemporalAccessor
java.time.Period java.util.regex.Pattern
java.time.Year java.util.Base64
java.time.YearMonth java.util.Base64$Decoder
java.time.ZonedDateTime java.util.Base64$Encoder
java.time.ZoneId java.util.Date
java.time.ZoneOffset java.util.UUID
java.time.temporal.TemporalAccessor java.util.concurrent.TimeUnit
java.util.regex.Pattern java.util.zip.InflaterInputStream
java.util.Base64 java.util.zip.DeflaterInputStream
java.util.Base64$Decoder java.util.zip.GZIPInputStream
java.util.Base64$Encoder java.util.zip.GZIPOutputStream
java.util.UUID ]
java.util.concurrent.TimeUnit :constructors []
java.util.zip.InflaterInputStream :methods [borkdude.graal.LockFix ;; support for locking
java.util.zip.DeflaterInputStream sun.net.www.http.PosterOutputStream ;; support for clj-http-lite
java.util.zip.GZIPInputStream sun.net.www.protocol.https.HttpsURLConnectionImpl ;; support for clj-http-lite
java.util.zip.GZIPOutputStream sun.net.www.protocol.http.HttpURLConnection$HttpInputStream ;; support for clj-http-lite
sun.nio.fs.UnixPath ;; included because of permission check ]
sun.net.www.protocol.https.HttpsURLConnectionImpl ;; needed fo clj-http.lite :fields [clojure.lang.PersistentQueue]
sun.net.www.protocol.http.HttpURLConnection ;; needed for clj.http.lite http calls :instance-checks [clojure.lang.Delay
sun.net.www.protocol.http.HttpURLConnection$HttpInputStream ;; needed for clj-http.lite clojure.lang.ExceptionInfo
sun.net.www.http.PosterOutputStream ;; needed for clj-http.lite clojure.lang.IObj
] clojure.lang.IEditableCollection
:custom-classes {'java.lang.Thread clojure.lang.LineNumberingPushbackReader
{:allPublicConstructors true clojure.lang.MapEntry]
;; generated with `public-declared-method-names`, see in :custom {clojure.lang.LineNumberingPushbackReader {:allPublicConstructors true
;; `comment` below :allPublicMethods true}
:methods [{:name "activeCount"} java.lang.Thread
{:name "checkAccess"} {:allPublicConstructors true
{:name "currentThread"} ;; generated with `public-declared-method-names`, see in
{:name "dumpStack"} ;; `comment` below
{:name "enumerate"} :methods [{:name "activeCount"}
{:name "getAllStackTraces"} {:name "checkAccess"}
{:name "getContextClassLoader"} {:name "currentThread"}
{:name "getDefaultUncaughtExceptionHandler"} {:name "dumpStack"}
{:name "getId"} {:name "enumerate"}
{:name "getName"} {:name "getAllStackTraces"}
{:name "getPriority"} {:name "getContextClassLoader"}
{:name "getStackTrace"} {:name "getDefaultUncaughtExceptionHandler"}
{:name "getState"} {:name "getId"}
{:name "getThreadGroup"} {:name "getName"}
{:name "getUncaughtExceptionHandler"} {:name "getPriority"}
{:name "holdsLock"} {:name "getStackTrace"}
{:name "interrupt"} {:name "getState"}
{:name "interrupted"} {:name "getThreadGroup"}
{:name "isAlive"} {:name "getUncaughtExceptionHandler"}
{:name "isDaemon"} {:name "holdsLock"}
{:name "isInterrupted"} {:name "interrupt"}
{:name "join"} {:name "interrupted"}
{:name "run"} {:name "isAlive"}
{:name "setContextClassLoader"} {:name "isDaemon"}
{:name "setDaemon"} {:name "isInterrupted"}
{:name "setDefaultUncaughtExceptionHandler"} {:name "join"}
{:name "setName"} {:name "run"}
{:name "setPriority"} {:name "setContextClassLoader"}
{:name "setUncaughtExceptionHandler"} {:name "setDaemon"}
{:name "sleep"} {:name "setDefaultUncaughtExceptionHandler"}
{:name "start"} {:name "setName"}
{:name "toString"} {:name "setPriority"}
{:name "yield"}]} {:name "setUncaughtExceptionHandler"}
'java.net.URL {:name "sleep"}
{:allPublicConstructors true {:name "start"}
:allPublicFields true {:name "toString"}
;; generated with `public-declared-method-names`, see in {:name "yield"}]}
;; `comment` below java.net.URL
:methods [{:name "equals"} {:allPublicConstructors true
{:name "getAuthority"} :allPublicFields true
{:name "getContent"} ;; generated with `public-declared-method-names`, see in
{:name "getDefaultPort"} ;; `comment` below
{:name "getFile"} :methods [{:name "equals"}
{:name "getHost"} {:name "getAuthority"}
{:name "getPath"} {:name "getContent"}
{:name "getPort"} {:name "getDefaultPort"}
{:name "getProtocol"} {:name "getFile"}
{:name "getQuery"} {:name "getHost"}
{:name "getRef"} {:name "getPath"}
{:name "getUserInfo"} {:name "getPort"}
{:name "hashCode"} {:name "getProtocol"}
{:name "openConnection"} {:name "getQuery"}
{:name "openStream"} {:name "getRef"}
{:name "sameFile"} {:name "getUserInfo"}
;; not supported: {:name "setURLStreamHandlerFactory"} {:name "hashCode"}
{:name "toExternalForm"} {:name "openConnection"}
{:name "toString"} {:name "openStream"}
{:name "toURI"}]}}}) {:name "sameFile"}
;; not supported: {:name "setURLStreamHandlerFactory"}
{:name "toExternalForm"}
{:name "toString"}
{:name "toURI"}]}}}
unix-like? (->
(update :methods conj 'sun.nio.fs.UnixPath)
(update :all conj
'java.lang.UNIXProcess
'java.lang.UNIXProcess$ProcessPipeOutputStream))))
(defmacro gen-class-map [] (defmacro gen-class-map []
(let [classes (concat (:default-classes classes) (let [classes (concat (:all classes)
(keys (:custom-classes classes)))] (keys (:custom classes))
(:constructors classes)
(:methods classes)
(:fields classes)
(:instance-checks classes))]
(apply hash-map (apply hash-map
(for [c classes (for [c classes
c [(list 'quote c) c]] c [(list 'quote c) c]]
@ -166,22 +188,31 @@
(def class-map (gen-class-map)) (def class-map (gen-class-map))
#_(defn sym->class-name [sym]
(-> sym str (str/replace "$" ".")))
(defn generate-reflection-file (defn generate-reflection-file
"Generate reflection.json file" "Generate reflection.json file"
[& args] [& args]
(let [entries (vec (for [c (sort (:default-classes classes)) (let [entries (vec (for [c (sort (:all classes))
:let [class-name (str c)]] :let [class-name (str c)]]
{:name class-name {:name class-name
:allPublicMethods true :allPublicMethods true
:allPublicFields true :allPublicFields true
:allPublicConstructors true})) :allPublicConstructors true}))
custom-entries (for [[c v] (:custom-classes classes) constructors (vec (for [c (sort (:constructors classes))
:let [class-name (str c)]]
{:name class-name
:allPublicConstructors true}))
methods (vec (for [c (sort (:methods classes))
:let [class-name (str c)]]
{:name class-name
:allPublicMethods true}))
fields (vec (for [c (sort (:fields classes))
:let [class-name (str c)]]
{:name class-name
:allPublicFields true}))
custom-entries (for [[c v] (:custom classes)
:let [class-name (str c)]] :let [class-name (str c)]]
(assoc v :name class-name)) (assoc v :name class-name))
all-entries (concat entries custom-entries)] all-entries (concat entries constructors methods fields custom-entries)]
(spit (or (spit (or
(first args) (first args)
"reflection.json") (json/generate-string all-entries {:pretty true})))) "reflection.json") (json/generate-string all-entries {:pretty true}))))

View file

@ -1,6 +1,10 @@
(ns babashka.impl.clojure.core (ns babashka.impl.clojure.core
{:no-doc true} {:no-doc true}
(:refer-clojure :exclude [future])) (:refer-clojure :exclude [future])
(:require [borkdude.graal.locking :as locking]))
(defn locking* [form bindings v f & args]
(apply @#'locking/locking form bindings v f args))
(def core-extras (def core-extras
{'file-seq file-seq {'file-seq file-seq
@ -10,6 +14,7 @@
'send-off send-off 'send-off send-off
'promise promise 'promise promise
'deliver deliver 'deliver deliver
'locking (with-meta locking* {:sci/macro true})
'shutdown-agents shutdown-agents 'shutdown-agents shutdown-agents
'slurp slurp 'slurp slurp
'spit spit 'spit spit

View file

@ -307,6 +307,7 @@ Everything after that is bound to *command-line-args*."))
Integer java.lang.Integer Integer java.lang.Integer
File java.io.File File java.io.File
Math java.lang.Math Math java.lang.Math
Object java.lang.Object
ProcessBuilder java.lang.ProcessBuilder ProcessBuilder java.lang.ProcessBuilder
String java.lang.String String java.lang.String
System java.lang.System System java.lang.System

View file

@ -0,0 +1,21 @@
(ns babashka.http-connection-test
(:require
[babashka.test-utils :as tu]
[clojure.test :as t :refer [deftest is]]
[clojure.string :as str]))
(defn bb [& args]
(apply tu/bb nil (map str args)))
(deftest open-connection-test
(is (= "\"1\"" (str/trim (bb "-e" "
(require '[cheshire.core :as json])
(let [conn (.openConnection (java.net.URL. \"https://postman-echo.com/get?foo=1\"))]
(.setConnectTimeout conn 1000)
(.setRequestProperty conn \"Content-Type\" \"application/json\") ;; nonsensical, but to test if this method exists
(.connect conn)
(let [is (.getInputStream conn)
err (.getErrorStream conn)
response (json/decode (slurp is) true)]
(-> response :args :foo)))
")))))