@@ -22,6 +22,8 @@ type compiled = {
22
22
type t =
23
23
{ id : id ;
24
24
prelude_ml : string ;
25
+ prepare_ml : string ;
26
+ (* absent from the json, empty except when building the exercises *)
25
27
template : string ;
26
28
solution : string ;
27
29
(* absent from the json, empty except when building the exercises *)
@@ -64,10 +66,10 @@ let encoding =
64
66
(req " test_lib" compiled_lib_encoding))
65
67
in
66
68
conv
67
- (fun { id ; prelude_ml ; template ; descr ; compiled ; max_score ; depend ; dependencies ; solution = _ } ->
69
+ (fun { id ; prelude_ml ; prepare_ml = _ ; template ; descr ; compiled ; max_score ; depend ; dependencies ; solution = _ } ->
68
70
(id, prelude_ml, template, descr, compiled, max_score, depend, dependencies))
69
71
(fun ((id , prelude_ml , template , descr , compiled , max_score , depend , dependencies )) ->
70
- { id ; prelude_ml ; template ; descr ; compiled ; max_score ; depend ; dependencies; solution = " " })
72
+ { id ; prelude_ml ; prepare_ml = " " ; template ; descr ; compiled ; max_score ; depend ; dependencies; solution = " " })
71
73
(obj8
72
74
(req " id" string )
73
75
(req " prelude_ml" string )
@@ -81,7 +83,7 @@ let encoding =
81
83
(* let meta_from_string m =
82
84
* Ezjsonm.from_string m
83
85
* |> Json_encoding.destruct Learnocaml_meta.encoding
84
- *
86
+ *
85
87
* let meta_to_string m =
86
88
* Json_encoding.construct Learnocaml_meta.encoding m
87
89
* |> (function
@@ -138,9 +140,9 @@ module File = struct
138
140
with Not_found -> raise (Missing_file (" get " ^ key))
139
141
140
142
let get_opt file ex =
141
- try (* a missing file here is necessarily [file] *)
142
- get file ex
143
- with Missing_file _ -> None
143
+ try (* a missing file here is necessarily [file] *)
144
+ get file ex
145
+ with Missing_file _ -> None
144
146
145
147
let has { key ; _ } ex =
146
148
StringMap. mem key ex
@@ -186,6 +188,12 @@ module File = struct
186
188
field = (fun ex -> ex.prelude_ml) ;
187
189
update = (fun prelude_ml ex -> { ex with prelude_ml })
188
190
}
191
+ let prepare_ml =
192
+ { key = " prepare.ml" ;
193
+ decode = (fun v -> v) ; encode = (fun v -> v) ;
194
+ field = (fun ex -> ex.prepare_ml) ;
195
+ update = (fun prepare_ml ex -> { ex with prepare_ml })
196
+ }
189
197
let template =
190
198
{ key = " template.ml" ;
191
199
decode = (fun v -> v) ; encode = (fun v -> v) ;
@@ -242,8 +250,8 @@ module File = struct
242
250
(fun test_lib c -> { c with test_lib })
243
251
let depend =
244
252
{ key = " depend.txt" ;
245
- decode = (fun v -> Some v) ;
246
- encode = (function
253
+ decode = (fun v -> Some v) ;
254
+ encode = (function
247
255
| None -> " " (* no `depend` ~ empty `depend` *)
248
256
| Some txt -> txt) ;
249
257
field = (fun ex -> ex.depend) ;
@@ -252,7 +260,7 @@ module File = struct
252
260
253
261
(* [parse_dependencies txt] extracts dependencies from the string [txt].
254
262
Dependencies are file names separated by at least one line break.
255
- [txt] may contain comments starting with characters ';' or '#'
263
+ [txt] may contain comments starting with characters ';' or '#'
256
264
and ending by a line break. *)
257
265
let parse_dependencies txt =
258
266
let remove_comment ~start :c line =
@@ -267,17 +275,17 @@ module File = struct
267
275
| None -> []
268
276
| Some txt ->
269
277
let filenames = parse_dependencies txt in
270
- List. mapi
278
+ List. mapi
271
279
(fun pos filename ->
272
280
{ key = filename ;
273
281
decode = (fun v -> v) ; encode = (fun v -> v) ;
274
282
field = (fun ex -> List. nth ex.dependencies pos) ;
275
- update = (fun v ex ->
276
- let dependencies =
283
+ update = (fun v ex ->
284
+ let dependencies =
277
285
List. mapi (fun i v' -> if i = pos then v else v')
278
286
ex.dependencies in { ex with dependencies }) })
279
287
filenames
280
-
288
+
281
289
module MakeReader (Concur : Concur ) = struct
282
290
let read ~read_field ?id : ex_id () =
283
291
let open Concur in
@@ -396,6 +404,7 @@ module File = struct
396
404
join
397
405
[ (* read_title () ; *)
398
406
read_file prelude_ml ;
407
+ read_file prepare_ml ;
399
408
read_file template ;
400
409
read_file solution ;
401
410
read_descrs () ;
@@ -447,7 +456,7 @@ let strip need_js ex =
447
456
448
457
449
458
module MakeReaderAnddWriter (Concur : Concur ) = struct
450
-
459
+
451
460
module FileReader = File. MakeReader (Concur )
452
461
453
462
let read ~read_field ?id () =
@@ -459,6 +468,7 @@ module MakeReaderAnddWriter (Concur : Concur) = struct
459
468
{ id = field_from_file File. id ex;
460
469
(* meta = field_from_file File.meta ex; *)
461
470
prelude_ml = field_from_file File. prelude_ml ex ;
471
+ prepare_ml = field_from_file File. prepare_ml ex ;
462
472
template = field_from_file File. template ex ;
463
473
solution = field_from_file File. solution ex ;
464
474
descr = field_from_file File. descr ex ;
@@ -478,14 +488,14 @@ module MakeReaderAnddWriter (Concur : Concur) = struct
478
488
};
479
489
max_score = 0 ;
480
490
depend ;
481
- dependencies =
491
+ dependencies =
482
492
let field_from_dependency file =
483
493
try field_from_file file ex
484
- with File. Missing_file msg
485
- -> let msg' = msg ^ " : dependency declared in "
494
+ with File. Missing_file msg
495
+ -> let msg' = msg ^ " : dependency declared in "
486
496
^ File. (key depend) ^ " , but not found" in
487
- raise (File. Missing_file msg')
488
- in
497
+ raise (File. Missing_file msg')
498
+ in
489
499
List. map field_from_dependency (File. dependencies depend)
490
500
}
491
501
with File. Missing_file _ as e -> fail e
@@ -505,7 +515,8 @@ module MakeReaderAnddWriter (Concur : Concur) = struct
505
515
([ write_field id ;
506
516
(* write_field meta ;
507
517
* write_field title ; *)
508
- write_field prelude_ml ;
518
+ write_field prelude_ml ;
519
+ (* prepare not written on purpose *)
509
520
write_field template ;
510
521
(* solution not written on purpose *)
511
522
write_field descr ;
@@ -517,7 +528,7 @@ module MakeReaderAnddWriter (Concur : Concur) = struct
517
528
write_field test_cma ;
518
529
write_field test_js ;
519
530
write_field depend ;
520
- (* write_field max_score *) ]
531
+ (* write_field max_score *) ]
521
532
@ (List. map write_field (dependencies (access depend ex))) )
522
533
>> = fun () ->
523
534
return ! acc
0 commit comments