Skip to content

Commit d6dd594

Browse files
authored
Basic JSON Schema support for uPickle types (#699)
Currently implemented as a parallel typeclass derivation step from the main `upickle.ReadWriter`.
1 parent 0b29304 commit d6dd594

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

50 files changed

+3224
-0
lines changed

.mill-version

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
1.1.2

build.mill

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ val scala212 = "2.12.20"
1818
val scala213 = "2.13.16"
1919

2020
val scala3 = "3.3.7"
21+
val scala381 = "3.8.1"
2122
val scala3NamedTuples = "3.7.0"
2223
val scalaJSNamedTuples = "1.20.1" // the version of scala.js that the scala3-library is built for.
2324
val scalaNativeNamedTuples = "0.5.9" // the version of scala.native that the scala3-library is built for.
@@ -387,6 +388,28 @@ object upickle extends Module{
387388
}
388389
}
389390

391+
object jsonschema extends Module {
392+
object jvm extends Cross[JvmModule](Seq(scala381))
393+
trait JvmModule extends CommonJvmModule {
394+
def jvmId = "17"
395+
def moduleDeps = Seq(upickle.jvm(scala3))
396+
override def mimaPreviousVersions = Seq.empty[String]
397+
override def mimaPreviousArtifacts = Seq.empty[Dep]
398+
override def mimaReportBinaryIssues() = Task.Command {}
399+
400+
object test extends CommonTestModule{
401+
override def mvnDeps = Seq(
402+
mvn"com.lihaoyi::utest::0.10.0-RC1",
403+
mvn"com.networknt:json-schema-validator:1.5.8"
404+
)
405+
def moduleDeps = super.moduleDeps ++ Seq(
406+
upickle.jvm(scala3).test,
407+
upickle.implicits.`named-tuples`.jvm(scala3NamedTuples).test
408+
)
409+
}
410+
}
411+
}
412+
390413
trait UpickleModule extends CommonPublishModule {
391414
def compileMvnDeps =
392415
Seq(

mill.bat

Lines changed: 300 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,300 @@
1+
@echo off
2+
3+
setlocal enabledelayedexpansion
4+
5+
if [!DEFAULT_MILL_VERSION!]==[] ( set "DEFAULT_MILL_VERSION=1.1.0-RC4" )
6+
7+
if [!MILL_GITHUB_RELEASE_CDN!]==[] ( set "MILL_GITHUB_RELEASE_CDN=" )
8+
9+
if [!MILL_MAIN_CLI!]==[] ( set "MILL_MAIN_CLI=%~f0" )
10+
11+
set "MILL_REPO_URL=https://github.com/com-lihaoyi/mill"
12+
13+
SET MILL_BUILD_SCRIPT=
14+
15+
if exist "build.mill" (
16+
set MILL_BUILD_SCRIPT=build.mill
17+
) else (
18+
if exist "build.mill.scala" (
19+
set MILL_BUILD_SCRIPT=build.mill.scala
20+
) else (
21+
if exist "build.sc" (
22+
set MILL_BUILD_SCRIPT=build.sc
23+
) else (
24+
rem no-op
25+
)
26+
)
27+
)
28+
29+
if [!MILL_VERSION!]==[] (
30+
if exist .mill-version (
31+
set /p MILL_VERSION=<.mill-version
32+
) else (
33+
if exist .config\mill-version (
34+
set /p MILL_VERSION=<.config\mill-version
35+
) else (
36+
rem Determine which config file to use for version extraction
37+
set "MILL_VERSION_CONFIG_FILE="
38+
set "MILL_VERSION_SEARCH_PATTERN="
39+
40+
if exist build.mill.yaml (
41+
set "MILL_VERSION_CONFIG_FILE=build.mill.yaml"
42+
set "MILL_VERSION_SEARCH_PATTERN=mill-version:"
43+
) else (
44+
if not "%MILL_BUILD_SCRIPT%"=="" (
45+
set "MILL_VERSION_CONFIG_FILE=%MILL_BUILD_SCRIPT%"
46+
set "MILL_VERSION_SEARCH_PATTERN=//\|.*mill-version"
47+
)
48+
)
49+
50+
rem Process the config file if found
51+
if not "!MILL_VERSION_CONFIG_FILE!"=="" (
52+
rem Find the line and process it
53+
for /f "tokens=*" %%a in ('findstr /R /C:"!MILL_VERSION_SEARCH_PATTERN!" "!MILL_VERSION_CONFIG_FILE!"') do (
54+
set "line=%%a"
55+
56+
rem --- 1. Replicate sed 's/.*://' ---
57+
rem This removes everything up to and including the first colon
58+
set "line=!line:*:=!"
59+
60+
rem --- 2. Replicate sed 's/#.*//' ---
61+
rem Split on '#' and keep the first part
62+
for /f "tokens=1 delims=#" %%b in ("!line!") do (
63+
set "line=%%b"
64+
)
65+
66+
rem --- 3. Replicate sed 's/['"]//g' ---
67+
rem Remove all quotes
68+
set "line=!line:'=!"
69+
set "line=!line:"=!"
70+
71+
rem --- 4. Replicate sed's trim/space removal ---
72+
rem Remove all space characters from the result. This is more robust.
73+
set "MILL_VERSION=!line: =!"
74+
75+
rem We found the version, so we can exit the loop
76+
goto :version_found
77+
)
78+
79+
:version_found
80+
rem no-op
81+
)
82+
)
83+
)
84+
)
85+
86+
if [!MILL_VERSION!]==[] (
87+
set MILL_VERSION=%DEFAULT_MILL_VERSION%
88+
)
89+
90+
if [!MILL_FINAL_DOWNLOAD_FOLDER!]==[] set MILL_FINAL_DOWNLOAD_FOLDER=%USERPROFILE%\.cache\mill\download
91+
92+
rem without bat file extension, cmd doesn't seem to be able to run it
93+
94+
set "MILL_NATIVE_SUFFIX=-native"
95+
set "MILL_JVM_SUFFIX=-jvm"
96+
set "MILL_FULL_VERSION=%MILL_VERSION%"
97+
set "MILL_DOWNLOAD_EXT=.bat"
98+
set "ARTIFACT_SUFFIX="
99+
REM Check if MILL_VERSION contains MILL_NATIVE_SUFFIX
100+
echo !MILL_VERSION! | findstr /C:"%MILL_NATIVE_SUFFIX%" >nul
101+
if !errorlevel! equ 0 (
102+
set "MILL_VERSION=%MILL_VERSION:-native=%"
103+
REM -native images compiled with graal do not support windows-arm
104+
REM https://github.com/oracle/graal/issues/9215
105+
IF /I NOT "%PROCESSOR_ARCHITECTURE%"=="ARM64" (
106+
set "ARTIFACT_SUFFIX=-native-windows-amd64"
107+
set "MILL_DOWNLOAD_EXT=.exe"
108+
) else (
109+
rem no-op
110+
)
111+
) else (
112+
echo !MILL_VERSION! | findstr /C:"%MILL_JVM_SUFFIX%" >nul
113+
if !errorlevel! equ 0 (
114+
set "MILL_VERSION=%MILL_VERSION:-jvm=%"
115+
) else (
116+
set "SKIP_VERSION=false"
117+
set "MILL_PREFIX=%MILL_VERSION:~0,4%"
118+
if "!MILL_PREFIX!"=="0.1." set "SKIP_VERSION=true"
119+
if "!MILL_PREFIX!"=="0.2." set "SKIP_VERSION=true"
120+
if "!MILL_PREFIX!"=="0.3." set "SKIP_VERSION=true"
121+
if "!MILL_PREFIX!"=="0.4." set "SKIP_VERSION=true"
122+
if "!MILL_PREFIX!"=="0.5." set "SKIP_VERSION=true"
123+
if "!MILL_PREFIX!"=="0.6." set "SKIP_VERSION=true"
124+
if "!MILL_PREFIX!"=="0.7." set "SKIP_VERSION=true"
125+
if "!MILL_PREFIX!"=="0.8." set "SKIP_VERSION=true"
126+
if "!MILL_PREFIX!"=="0.9." set "SKIP_VERSION=true"
127+
set "MILL_PREFIX=%MILL_VERSION:~0,5%"
128+
if "!MILL_PREFIX!"=="0.10." set "SKIP_VERSION=true"
129+
if "!MILL_PREFIX!"=="0.11." set "SKIP_VERSION=true"
130+
if "!MILL_PREFIX!"=="0.12." set "SKIP_VERSION=true"
131+
132+
if "!SKIP_VERSION!"=="false" (
133+
IF /I NOT "%PROCESSOR_ARCHITECTURE%"=="ARM64" (
134+
set "ARTIFACT_SUFFIX=-native-windows-amd64"
135+
set "MILL_DOWNLOAD_EXT=.exe"
136+
)
137+
) else (
138+
rem no-op
139+
)
140+
)
141+
)
142+
143+
set MILL=%MILL_FINAL_DOWNLOAD_FOLDER%\!MILL_FULL_VERSION!!MILL_DOWNLOAD_EXT!
144+
145+
set MILL_RESOLVE_DOWNLOAD=
146+
147+
if not exist "%MILL%" (
148+
set MILL_RESOLVE_DOWNLOAD=true
149+
) else (
150+
if defined MILL_TEST_DRY_RUN_LAUNCHER_SCRIPT (
151+
set MILL_RESOLVE_DOWNLOAD=true
152+
) else (
153+
rem no-op
154+
)
155+
)
156+
157+
158+
if [!MILL_RESOLVE_DOWNLOAD!]==[true] (
159+
set MILL_VERSION_PREFIX=%MILL_VERSION:~0,4%
160+
set MILL_SHORT_VERSION_PREFIX=%MILL_VERSION:~0,2%
161+
rem Since 0.5.0
162+
set MILL_DOWNLOAD_SUFFIX=-assembly
163+
rem Since 0.11.0
164+
set MILL_DOWNLOAD_FROM_MAVEN=1
165+
if [!MILL_VERSION_PREFIX!]==[0.0.] (
166+
set MILL_DOWNLOAD_SUFFIX=
167+
set MILL_DOWNLOAD_FROM_MAVEN=0
168+
)
169+
if [!MILL_VERSION_PREFIX!]==[0.1.] (
170+
set MILL_DOWNLOAD_SUFFIX=
171+
set MILL_DOWNLOAD_FROM_MAVEN=0
172+
)
173+
if [!MILL_VERSION_PREFIX!]==[0.2.] (
174+
set MILL_DOWNLOAD_SUFFIX=
175+
set MILL_DOWNLOAD_FROM_MAVEN=0
176+
)
177+
if [!MILL_VERSION_PREFIX!]==[0.3.] (
178+
set MILL_DOWNLOAD_SUFFIX=
179+
set MILL_DOWNLOAD_FROM_MAVEN=0
180+
)
181+
if [!MILL_VERSION_PREFIX!]==[0.4.] (
182+
set MILL_DOWNLOAD_SUFFIX=
183+
set MILL_DOWNLOAD_FROM_MAVEN=0
184+
)
185+
if [!MILL_VERSION_PREFIX!]==[0.5.] set MILL_DOWNLOAD_FROM_MAVEN=0
186+
if [!MILL_VERSION_PREFIX!]==[0.6.] set MILL_DOWNLOAD_FROM_MAVEN=0
187+
if [!MILL_VERSION_PREFIX!]==[0.7.] set MILL_DOWNLOAD_FROM_MAVEN=0
188+
if [!MILL_VERSION_PREFIX!]==[0.8.] set MILL_DOWNLOAD_FROM_MAVEN=0
189+
if [!MILL_VERSION_PREFIX!]==[0.9.] set MILL_DOWNLOAD_FROM_MAVEN=0
190+
191+
set MILL_VERSION_PREFIX=%MILL_VERSION:~0,5%
192+
if [!MILL_VERSION_PREFIX!]==[0.10.] set MILL_DOWNLOAD_FROM_MAVEN=0
193+
194+
set MILL_VERSION_PREFIX=%MILL_VERSION:~0,8%
195+
if [!MILL_VERSION_PREFIX!]==[0.11.0-M] set MILL_DOWNLOAD_FROM_MAVEN=0
196+
197+
set MILL_VERSION_PREFIX=%MILL_VERSION:~0,5%
198+
set DOWNLOAD_EXT=exe
199+
if [!MILL_SHORT_VERSION_PREFIX!]==[0.] set DOWNLOAD_EXT=jar
200+
if [!MILL_VERSION_PREFIX!]==[0.12.] set DOWNLOAD_EXT=exe
201+
if [!MILL_VERSION!]==[0.12.0] set DOWNLOAD_EXT=jar
202+
if [!MILL_VERSION!]==[0.12.1] set DOWNLOAD_EXT=jar
203+
if [!MILL_VERSION!]==[0.12.2] set DOWNLOAD_EXT=jar
204+
if [!MILL_VERSION!]==[0.12.3] set DOWNLOAD_EXT=jar
205+
if [!MILL_VERSION!]==[0.12.4] set DOWNLOAD_EXT=jar
206+
if [!MILL_VERSION!]==[0.12.5] set DOWNLOAD_EXT=jar
207+
if [!MILL_VERSION!]==[0.12.6] set DOWNLOAD_EXT=jar
208+
if [!MILL_VERSION!]==[0.12.7] set DOWNLOAD_EXT=jar
209+
if [!MILL_VERSION!]==[0.12.8] set DOWNLOAD_EXT=jar
210+
if [!MILL_VERSION!]==[0.12.9] set DOWNLOAD_EXT=jar
211+
if [!MILL_VERSION!]==[0.12.10] set DOWNLOAD_EXT=jar
212+
if [!MILL_VERSION!]==[0.12.11] set DOWNLOAD_EXT=jar
213+
214+
set MILL_VERSION_PREFIX=
215+
set MILL_SHORT_VERSION_PREFIX=
216+
217+
for /F "delims=- tokens=1" %%A in ("!MILL_VERSION!") do set MILL_VERSION_BASE=%%A
218+
set MILL_VERSION_MILESTONE=
219+
for /F "delims=- tokens=2" %%A in ("!MILL_VERSION!") do set MILL_VERSION_MILESTONE=%%A
220+
set MILL_VERSION_MILESTONE_START=!MILL_VERSION_MILESTONE:~0,1!
221+
if [!MILL_VERSION_MILESTONE_START!]==[M] (
222+
set MILL_VERSION_TAG=!MILL_VERSION_BASE!-!MILL_VERSION_MILESTONE!
223+
) else (
224+
set MILL_VERSION_TAG=!MILL_VERSION_BASE!
225+
)
226+
if [!MILL_DOWNLOAD_FROM_MAVEN!]==[1] (
227+
set MILL_DOWNLOAD_URL=https://repo1.maven.org/maven2/com/lihaoyi/mill-dist!ARTIFACT_SUFFIX!/!MILL_VERSION!/mill-dist!ARTIFACT_SUFFIX!-!MILL_VERSION!.!DOWNLOAD_EXT!
228+
) else (
229+
set MILL_DOWNLOAD_URL=!MILL_GITHUB_RELEASE_CDN!%MILL_REPO_URL%/releases/download/!MILL_VERSION_TAG!/!MILL_VERSION!!MILL_DOWNLOAD_SUFFIX!
230+
)
231+
232+
if defined MILL_TEST_DRY_RUN_LAUNCHER_SCRIPT (
233+
echo !MILL_DOWNLOAD_URL!
234+
echo !MILL!
235+
exit /b 0
236+
)
237+
238+
rem there seems to be no way to generate a unique temporary file path (on native Windows)
239+
if defined MILL_OUTPUT_DIR (
240+
set MILL_TEMP_DOWNLOAD_FILE=%MILL_OUTPUT_DIR%\mill-temp-download
241+
if not exist "%MILL_OUTPUT_DIR%" mkdir "%MILL_OUTPUT_DIR%"
242+
) else (
243+
set MILL_TEMP_DOWNLOAD_FILE=out\mill-bootstrap-download
244+
if not exist "out" mkdir "out"
245+
)
246+
247+
echo Downloading mill !MILL_VERSION! from !MILL_DOWNLOAD_URL! ... 1>&2
248+
249+
curl -f -L "!MILL_DOWNLOAD_URL!" -o "!MILL_TEMP_DOWNLOAD_FILE!"
250+
251+
if not exist "%MILL_FINAL_DOWNLOAD_FOLDER%" mkdir "%MILL_FINAL_DOWNLOAD_FOLDER%"
252+
move /y "!MILL_TEMP_DOWNLOAD_FILE!" "%MILL%"
253+
254+
set MILL_TEMP_DOWNLOAD_FILE=
255+
set MILL_DOWNLOAD_SUFFIX=
256+
)
257+
258+
set MILL_FINAL_DOWNLOAD_FOLDER=
259+
set MILL_VERSION=
260+
set MILL_REPO_URL=
261+
262+
rem Need to preserve the first position of those listed options
263+
set MILL_FIRST_ARG=
264+
if [%~1%]==[--bsp] (
265+
set MILL_FIRST_ARG=%1%
266+
) else (
267+
if [%~1%]==[-i] (
268+
set MILL_FIRST_ARG=%1%
269+
) else (
270+
if [%~1%]==[--interactive] (
271+
set MILL_FIRST_ARG=%1%
272+
) else (
273+
if [%~1%]==[--no-server] (
274+
set MILL_FIRST_ARG=%1%
275+
) else (
276+
if [%~1%]==[--no-daemon] (
277+
set MILL_FIRST_ARG=%1%
278+
) else (
279+
if [%~1%]==[--repl] (
280+
set MILL_FIRST_ARG=%1%
281+
) else (
282+
if [%~1%]==[--help] (
283+
set MILL_FIRST_ARG=%1%
284+
)
285+
)
286+
)
287+
)
288+
)
289+
)
290+
)
291+
set "MILL_PARAMS=%*%"
292+
293+
if not [!MILL_FIRST_ARG!]==[] (
294+
for /f "tokens=1*" %%a in ("%*") do (
295+
set "MILL_PARAMS=%%b"
296+
)
297+
)
298+
299+
rem -D mill.main.cli is for compatibility with Mill 0.10.9 - 0.13.0-M2
300+
"%MILL%" %MILL_FIRST_ARG% -D "mill.main.cli=%MILL_MAIN_CLI%" %MILL_PARAMS%

0 commit comments

Comments
 (0)