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

1
.gitignore vendored
View file

@ -16,3 +16,4 @@ pom.xml.asc
!test-resources/babashka/src_for_classpath_test/foo.jar
.cpcache
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,17 +1,20 @@
(ns babashka.impl.classes
{:no-doc true}
(: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
{:default-classes '[clojure.lang.Delay
clojure.lang.ExceptionInfo
clojure.lang.IObj
clojure.lang.IEditableCollection
clojure.lang.LineNumberingPushbackReader
clojure.lang.MapEntry
clojure.lang.PersistentQueue
java.io.BufferedReader
(cond->
'{:all [java.io.BufferedReader
java.io.BufferedWriter
java.io.ByteArrayInputStream
java.io.ByteArrayOutputStream
@ -30,12 +33,11 @@
java.lang.Integer
java.lang.Math
java.util.concurrent.LinkedBlockingQueue
java.lang.Object
java.lang.String
java.lang.System
java.lang.Throwable
java.lang.Process
java.lang.UNIXProcess
java.lang.UNIXProcess$ProcessPipeOutputStream
java.lang.ProcessBuilder
java.lang.ProcessBuilder$Redirect
java.net.URI
@ -81,19 +83,30 @@
java.util.Base64
java.util.Base64$Decoder
java.util.Base64$Encoder
java.util.Date
java.util.UUID
java.util.concurrent.TimeUnit
java.util.zip.InflaterInputStream
java.util.zip.DeflaterInputStream
java.util.zip.GZIPInputStream
java.util.zip.GZIPOutputStream
sun.nio.fs.UnixPath ;; included because of permission check
sun.net.www.protocol.https.HttpsURLConnectionImpl ;; needed fo clj-http.lite
sun.net.www.protocol.http.HttpURLConnection ;; needed for clj.http.lite http calls
sun.net.www.protocol.http.HttpURLConnection$HttpInputStream ;; needed for clj-http.lite
sun.net.www.http.PosterOutputStream ;; needed for clj-http.lite
]
:custom-classes {'java.lang.Thread
:constructors []
:methods [borkdude.graal.LockFix ;; support for locking
sun.net.www.http.PosterOutputStream ;; support for clj-http-lite
sun.net.www.protocol.https.HttpsURLConnectionImpl ;; support for clj-http-lite
sun.net.www.protocol.http.HttpURLConnection$HttpInputStream ;; support for clj-http-lite
]
:fields [clojure.lang.PersistentQueue]
:instance-checks [clojure.lang.Delay
clojure.lang.ExceptionInfo
clojure.lang.IObj
clojure.lang.IEditableCollection
clojure.lang.LineNumberingPushbackReader
clojure.lang.MapEntry]
:custom {clojure.lang.LineNumberingPushbackReader {:allPublicConstructors true
:allPublicMethods true}
java.lang.Thread
{:allPublicConstructors true
;; generated with `public-declared-method-names`, see in
;; `comment` below
@ -130,7 +143,7 @@
{:name "start"}
{:name "toString"}
{:name "yield"}]}
'java.net.URL
java.net.URL
{:allPublicConstructors true
:allPublicFields true
;; generated with `public-declared-method-names`, see in
@ -154,11 +167,20 @@
;; not supported: {:name "setURLStreamHandlerFactory"}
{:name "toExternalForm"}
{:name "toString"}
{:name "toURI"}]}}})
{: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 []
(let [classes (concat (:default-classes classes)
(keys (:custom-classes classes)))]
(let [classes (concat (:all classes)
(keys (:custom classes))
(:constructors classes)
(:methods classes)
(:fields classes)
(:instance-checks classes))]
(apply hash-map
(for [c classes
c [(list 'quote c) c]]
@ -166,22 +188,31 @@
(def class-map (gen-class-map))
#_(defn sym->class-name [sym]
(-> sym str (str/replace "$" ".")))
(defn generate-reflection-file
"Generate reflection.json file"
[& args]
(let [entries (vec (for [c (sort (:default-classes classes))
(let [entries (vec (for [c (sort (:all classes))
:let [class-name (str c)]]
{:name class-name
:allPublicMethods true
:allPublicFields 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)]]
(assoc v :name class-name))
all-entries (concat entries custom-entries)]
all-entries (concat entries constructors methods fields custom-entries)]
(spit (or
(first args)
"reflection.json") (json/generate-string all-entries {:pretty true}))))

View file

@ -1,6 +1,10 @@
(ns babashka.impl.clojure.core
{: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
{'file-seq file-seq
@ -10,6 +14,7 @@
'send-off send-off
'promise promise
'deliver deliver
'locking (with-meta locking* {:sci/macro true})
'shutdown-agents shutdown-agents
'slurp slurp
'spit spit

View file

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