OCaml library and CLI for OCI and Docker image manipulation
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

json: rename mem -> member / finish -> seal across the codec + value API

Object combinators: [Object.mem] -> [Object.member], [Object.opt_mem]
-> [Object.opt_member], [Object.case_mem] -> [Object.case_member]. The
sibling submodules [Object.Mem] / [Object.Mems] become
[Object.Member] / [Object.Members]. RFC 8259 §4 calls these
"name/value pairs, referred to as the members", so mirror the spec
name rather than the shortened [mem].

[Object.finish] -> [Object.seal]. "Seal" reads as "close the map, no
more members added", which is what the operation does.

Value constructors/queries: [Value.mem] (function) -> [Value.member];
[Value.mem_find] -> [Value.member_key]; [Value.mem_names] ->
[Value.member_names]; [Value.mem_keys] -> [Value.member_keys].
[type mem = ...] -> [type member = ...]; [type object'] still points
at [member list].

Downstream (~80 files across slack, sbom, stripe, sigstore, requests,
claude, irmin, freebox) updated via perl-pie. dune build clean,
dune test ocaml-json clean.

+159 -151
+2 -1
dune-project
··· 40 40 uri 41 41 xdg 42 42 osrelease 43 - (alcotest :with-test))) 43 + (alcotest :with-test) 44 + loc))
+2 -2
lib/spec/auth.ml
··· 2 2 3 3 let jsont = 4 4 Json.Codec.Object.map ~kind:"auth" (fun access_token -> { access_token }) 5 - |> Json.Codec.Object.mem "access_token" Json.Codec.string ~enc:(fun t -> 5 + |> Json.Codec.Object.member "access_token" Json.Codec.string ~enc:(fun t -> 6 6 t.access_token) 7 - |> Json.Codec.Object.skip_unknown |> Json.Codec.Object.finish 7 + |> Json.Codec.Object.skip_unknown |> Json.Codec.Object.seal 8 8 9 9 let of_string s = 10 10 match Json.of_string jsont s with
+1 -1
lib/spec/common.ml
··· 50 50 51 51 let nil_jsont = 52 52 let open Json.Codec in 53 - Object.map ~kind:"nil" Nil |> Object.skip_unknown |> Object.finish 53 + Object.map ~kind:"nil" Nil |> Object.skip_unknown |> Object.seal 54 54 55 55 (** {1 Environment variable} *) 56 56
+92 -89
lib/spec/config.ml
··· 64 64 healthcheck = Option.value ~default:[] healthcheck; 65 65 on_build; 66 66 }) 67 - |> Object.opt_mem "User" string ~enc:(fun c -> c.user) 68 - |> Object.opt_mem "ExposedPorts" set_jsont ~enc:(fun c -> 67 + |> Object.opt_member "User" string ~enc:(fun c -> c.user) 68 + |> Object.opt_member "ExposedPorts" set_jsont ~enc:(fun c -> 69 69 non_empty c.exposed_ports) 70 - |> Object.opt_mem "Env" (list env_jsont) ~enc:(fun c -> non_empty c.env) 71 - |> Object.opt_mem "Entrypoint" (list string) ~enc:(fun c -> 70 + |> Object.opt_member "Env" (list env_jsont) ~enc:(fun c -> non_empty c.env) 71 + |> Object.opt_member "Entrypoint" (list string) ~enc:(fun c -> 72 72 non_empty c.entrypoint) 73 - |> Object.opt_mem "Cmd" (list string) ~enc:(fun c -> non_empty c.cmd) 74 - |> Object.opt_mem "Volumes" set_jsont ~enc:(fun c -> non_empty c.volumes) 75 - |> Object.opt_mem "WorkingDir" string ~enc:(fun c -> c.working_dir) 76 - |> Object.opt_mem "Labels" labels_jsont ~enc:(fun c -> non_empty c.labels) 77 - |> Object.opt_mem "StopSignal" string ~enc:(fun c -> c.stop_signal) 78 - |> Object.opt_mem "ArgsEscaped" bool ~enc:(fun c -> c.args_escaped) 79 - |> Object.opt_mem "Memory" int ~enc:(fun c -> c.memory) 80 - |> Object.opt_mem "MemorySwap" int ~enc:(fun c -> c.memory_swap) 81 - |> Object.opt_mem "CpuShares" int ~enc:(fun c -> c.cpu_shares) 82 - |> Object.opt_mem "HealthCheck" set_jsont ~enc:(fun c -> 73 + |> Object.opt_member "Cmd" (list string) ~enc:(fun c -> non_empty c.cmd) 74 + |> Object.opt_member "Volumes" set_jsont ~enc:(fun c -> non_empty c.volumes) 75 + |> Object.opt_member "WorkingDir" string ~enc:(fun c -> c.working_dir) 76 + |> Object.opt_member "Labels" labels_jsont ~enc:(fun c -> 77 + non_empty c.labels) 78 + |> Object.opt_member "StopSignal" string ~enc:(fun c -> c.stop_signal) 79 + |> Object.opt_member "ArgsEscaped" bool ~enc:(fun c -> c.args_escaped) 80 + |> Object.opt_member "Memory" int ~enc:(fun c -> c.memory) 81 + |> Object.opt_member "MemorySwap" int ~enc:(fun c -> c.memory_swap) 82 + |> Object.opt_member "CpuShares" int ~enc:(fun c -> c.cpu_shares) 83 + |> Object.opt_member "HealthCheck" set_jsont ~enc:(fun c -> 83 84 non_empty c.healthcheck) 84 - |> Object.opt_mem "OnBuild" string ~enc:(fun c -> c.on_build) 85 - |> Object.skip_unknown |> Object.finish 85 + |> Object.opt_member "OnBuild" string ~enc:(fun c -> c.on_build) 86 + |> Object.skip_unknown |> Object.seal 86 87 87 88 type rootfs = { type_ : string; diff_ids : Digest.t list } 88 89 89 90 let rootfs_jsont = 90 91 let open Json.Codec in 91 92 Object.map ~kind:"rootfs" (fun type_ diff_ids -> { type_; diff_ids }) 92 - |> Object.mem "type" string ~enc:(fun r -> r.type_) 93 - |> Object.mem "diff_ids" (list Digest.jsont) ~enc:(fun r -> r.diff_ids) 94 - |> Object.finish 93 + |> Object.member "type" string ~enc:(fun r -> r.type_) 94 + |> Object.member "diff_ids" (list Digest.jsont) ~enc:(fun r -> r.diff_ids) 95 + |> Object.seal 95 96 96 97 type history = { 97 98 created : date_time option; ··· 112 113 comment; 113 114 empty_layer = Option.value ~default:false empty_layer; 114 115 }) 115 - |> Object.opt_mem "created" date_time_jsont ~enc:(fun h -> h.created) 116 - |> Object.opt_mem "author" string ~enc:(fun h -> h.author) 117 - |> Object.opt_mem "created_by" string ~enc:(fun h -> h.created_by) 118 - |> Object.opt_mem "comment" string ~enc:(fun h -> h.comment) 119 - |> Object.opt_mem "empty_layer" bool ~enc:(fun h -> 116 + |> Object.opt_member "created" date_time_jsont ~enc:(fun h -> h.created) 117 + |> Object.opt_member "author" string ~enc:(fun h -> h.author) 118 + |> Object.opt_member "created_by" string ~enc:(fun h -> h.created_by) 119 + |> Object.opt_member "comment" string ~enc:(fun h -> h.comment) 120 + |> Object.opt_member "empty_layer" bool ~enc:(fun h -> 120 121 if h.empty_layer then Some true else None) 121 - |> Object.skip_unknown |> Object.finish 122 + |> Object.skip_unknown |> Object.seal 122 123 123 124 type t = { 124 125 created : date_time option; ··· 160 161 rootfs; 161 162 history = Option.value ~default:[] history; 162 163 }) 163 - |> Object.opt_mem "created" date_time_jsont ~enc:(fun t -> t.created) 164 - |> Object.opt_mem "author" string ~enc:(fun t -> t.author) 165 - |> Object.mem "architecture" Arch.jsont ~enc:(fun t -> t.architecture) 166 - |> Object.mem "os" OS.jsont ~enc:(fun t -> t.os) 167 - |> Object.opt_mem "os.version" string ~enc:(fun t -> t.os_version) 168 - |> Object.opt_mem "os.features" (list string) ~enc:(fun t -> 164 + |> Object.opt_member "created" date_time_jsont ~enc:(fun t -> t.created) 165 + |> Object.opt_member "author" string ~enc:(fun t -> t.author) 166 + |> Object.member "architecture" Arch.jsont ~enc:(fun t -> t.architecture) 167 + |> Object.member "os" OS.jsont ~enc:(fun t -> t.os) 168 + |> Object.opt_member "os.version" string ~enc:(fun t -> t.os_version) 169 + |> Object.opt_member "os.features" (list string) ~enc:(fun t -> 169 170 if t.os_features = [] then None else Some t.os_features) 170 - |> Object.opt_mem "variant" Arch.variant_jsont ~enc:(fun t -> t.variant) 171 - |> Object.opt_mem "config" config_jsont ~enc:(fun t -> t.config) 172 - |> Object.mem "rootfs" rootfs_jsont ~enc:(fun t -> t.rootfs) 173 - |> Object.opt_mem "history" (list history_jsont) ~enc:(fun t -> 171 + |> Object.opt_member "variant" Arch.variant_jsont ~enc:(fun t -> t.variant) 172 + |> Object.opt_member "config" config_jsont ~enc:(fun t -> t.config) 173 + |> Object.member "rootfs" rootfs_jsont ~enc:(fun t -> t.rootfs) 174 + |> Object.opt_member "history" (list history_jsont) ~enc:(fun t -> 174 175 if t.history = [] then None else Some t.history) 175 - |> Object.skip_unknown |> Object.finish 176 + |> Object.skip_unknown |> Object.seal 176 177 177 178 let of_yojson json = 178 179 match Json.decode jsont json with ··· 285 286 stop_timeout; 286 287 shell = Option.value ~default:[] shell; 287 288 }) 288 - |> Object.opt_mem "Hostname" string ~enc:(fun c -> c.hostname) 289 - |> Object.opt_mem "Domainname" string ~enc:(fun c -> c.domain_name) 290 - |> Object.opt_mem "User" string ~enc:(fun c -> c.user) 291 - |> Object.opt_mem "AttachStdin" bool ~enc:(fun c -> opt_true c.attach_stdin) 292 - |> Object.opt_mem "AttachStdout" bool ~enc:(fun c -> 289 + |> Object.opt_member "Hostname" string ~enc:(fun c -> c.hostname) 290 + |> Object.opt_member "Domainname" string ~enc:(fun c -> c.domain_name) 291 + |> Object.opt_member "User" string ~enc:(fun c -> c.user) 292 + |> Object.opt_member "AttachStdin" bool ~enc:(fun c -> 293 + opt_true c.attach_stdin) 294 + |> Object.opt_member "AttachStdout" bool ~enc:(fun c -> 293 295 opt_true c.attach_stdout) 294 - |> Object.opt_mem "AttachStderr" bool ~enc:(fun c -> 296 + |> Object.opt_member "AttachStderr" bool ~enc:(fun c -> 295 297 opt_true c.attach_stderr) 296 - |> Object.opt_mem "ExposedPorts" set_jsont ~enc:(fun c -> 298 + |> Object.opt_member "ExposedPorts" set_jsont ~enc:(fun c -> 297 299 non_empty c.exposed_ports) 298 - |> Object.opt_mem "Tty" bool ~enc:(fun c -> opt_true c.tty) 299 - |> Object.opt_mem "OpenStdin" bool ~enc:(fun c -> opt_true c.open_stdin) 300 - |> Object.opt_mem "StdinOnce" bool ~enc:(fun c -> opt_true c.stdin_once) 301 - |> Object.opt_mem "Env" (list env_jsont) ~enc:(fun c -> c.env) 302 - |> Object.opt_mem "Cmd" (list string) ~enc:(fun c -> c.cmd) 303 - |> Object.opt_mem "HealthCheck" set_jsont ~enc:(fun c -> 300 + |> Object.opt_member "Tty" bool ~enc:(fun c -> opt_true c.tty) 301 + |> Object.opt_member "OpenStdin" bool ~enc:(fun c -> opt_true c.open_stdin) 302 + |> Object.opt_member "StdinOnce" bool ~enc:(fun c -> opt_true c.stdin_once) 303 + |> Object.opt_member "Env" (list env_jsont) ~enc:(fun c -> c.env) 304 + |> Object.opt_member "Cmd" (list string) ~enc:(fun c -> c.cmd) 305 + |> Object.opt_member "HealthCheck" set_jsont ~enc:(fun c -> 304 306 non_empty c.healthcheck) 305 - |> Object.opt_mem "ArgsEscaped" bool ~enc:(fun c -> c.args_escaped) 306 - |> Object.opt_mem "Image" string ~enc:(fun c -> c.image) 307 - |> Object.opt_mem "Volumes" set_jsont ~enc:(fun c -> non_empty c.volumes) 308 - |> Object.opt_mem "WorkingDir" string ~enc:(fun c -> 307 + |> Object.opt_member "ArgsEscaped" bool ~enc:(fun c -> c.args_escaped) 308 + |> Object.opt_member "Image" string ~enc:(fun c -> c.image) 309 + |> Object.opt_member "Volumes" set_jsont ~enc:(fun c -> non_empty c.volumes) 310 + |> Object.opt_member "WorkingDir" string ~enc:(fun c -> 309 311 if c.working_dir = "" then None else Some c.working_dir) 310 - |> Object.opt_mem "Entrypoint" (list string) ~enc:(fun c -> c.entrypoint) 311 - |> Object.opt_mem "NetworkDisabled" bool ~enc:(fun c -> 312 + |> Object.opt_member "Entrypoint" (list string) ~enc:(fun c -> c.entrypoint) 313 + |> Object.opt_member "NetworkDisabled" bool ~enc:(fun c -> 312 314 opt_true c.network_disabled) 313 - |> Object.opt_mem "MacAddress" string ~enc:(fun c -> c.mac_address) 314 - |> Object.opt_mem "OnBuild" (list string) ~enc:(fun c -> c.on_build) 315 - |> Object.opt_mem "Labels" labels_jsont ~enc:(fun c -> non_empty c.labels) 316 - |> Object.opt_mem "StopSignal" string ~enc:(fun c -> c.stop_signal) 317 - |> Object.opt_mem "StopTimeout" int ~enc:(fun c -> c.stop_timeout) 318 - |> Object.opt_mem "Shell" (list string) ~enc:(fun c -> non_empty c.shell) 319 - |> Object.skip_unknown |> Object.finish 315 + |> Object.opt_member "MacAddress" string ~enc:(fun c -> c.mac_address) 316 + |> Object.opt_member "OnBuild" (list string) ~enc:(fun c -> c.on_build) 317 + |> Object.opt_member "Labels" labels_jsont ~enc:(fun c -> 318 + non_empty c.labels) 319 + |> Object.opt_member "StopSignal" string ~enc:(fun c -> c.stop_signal) 320 + |> Object.opt_member "StopTimeout" int ~enc:(fun c -> c.stop_timeout) 321 + |> Object.opt_member "Shell" (list string) ~enc:(fun c -> non_empty c.shell) 322 + |> Object.skip_unknown |> Object.seal 320 323 321 324 type rootfs = { type_ : string; diff_ids : Digest.t list } 322 325 323 326 let rootfs_jsont = 324 327 let open Json.Codec in 325 328 Object.map ~kind:"rootfs" (fun type_ diff_ids -> { type_; diff_ids }) 326 - |> Object.mem "type" string ~enc:(fun r -> r.type_) 327 - |> Object.mem "diff_ids" (list Digest.jsont) ~enc:(fun r -> r.diff_ids) 328 - |> Object.finish 329 + |> Object.member "type" string ~enc:(fun r -> r.type_) 330 + |> Object.member "diff_ids" (list Digest.jsont) ~enc:(fun r -> r.diff_ids) 331 + |> Object.seal 329 332 330 333 type history = { 331 334 created : date_time option; ··· 346 349 comment; 347 350 empty_layer = Option.value ~default:false empty_layer; 348 351 }) 349 - |> Object.opt_mem "created" date_time_jsont ~enc:(fun h -> h.created) 350 - |> Object.opt_mem "author" string ~enc:(fun h -> h.author) 351 - |> Object.opt_mem "created_by" string ~enc:(fun h -> h.created_by) 352 - |> Object.opt_mem "comment" string ~enc:(fun h -> h.comment) 353 - |> Object.opt_mem "empty_layer" bool ~enc:(fun h -> 352 + |> Object.opt_member "created" date_time_jsont ~enc:(fun h -> h.created) 353 + |> Object.opt_member "author" string ~enc:(fun h -> h.author) 354 + |> Object.opt_member "created_by" string ~enc:(fun h -> h.created_by) 355 + |> Object.opt_member "comment" string ~enc:(fun h -> h.comment) 356 + |> Object.opt_member "empty_layer" bool ~enc:(fun h -> 354 357 if h.empty_layer then Some true else None) 355 - |> Object.skip_unknown |> Object.finish 358 + |> Object.skip_unknown |> Object.seal 356 359 357 360 type t = { 358 361 id : string option; ··· 433 436 rootfs; 434 437 history = Option.value ~default:[] history; 435 438 }) 436 - |> Object.opt_mem "id" string ~enc:id 437 - |> Object.opt_mem "parent" Digest.jsont ~enc:parent 438 - |> Object.opt_mem "comment" string ~enc:comment 439 - |> Object.mem "created" date_time_jsont ~enc:created 440 - |> Object.opt_mem "container" string ~enc:container 441 - |> Object.opt_mem "container_config" config_jsont ~enc:container_config 442 - |> Object.opt_mem "docker_version" string ~enc:docker_version 443 - |> Object.opt_mem "author" string ~enc:author 444 - |> Object.opt_mem "config" config_jsont ~enc:config 445 - |> Object.mem "architecture" Arch.jsont ~enc:architecture 446 - |> Object.opt_mem "variant" Arch.variant_jsont ~enc:variant 447 - |> Object.mem "os" OS.jsont ~enc:os 448 - |> Object.opt_mem "os.version" string ~enc:os_version 449 - |> Object.opt_mem "os.features" (list string) ~enc:os_features 450 - |> Object.opt_mem "Size" int64 ~enc:size 451 - |> Object.mem "rootfs" rootfs_jsont ~enc:rootfs 452 - |> Object.opt_mem "history" (list history_jsont) ~enc:history 453 - |> Object.skip_unknown |> Object.finish 439 + |> Object.opt_member "id" string ~enc:id 440 + |> Object.opt_member "parent" Digest.jsont ~enc:parent 441 + |> Object.opt_member "comment" string ~enc:comment 442 + |> Object.member "created" date_time_jsont ~enc:created 443 + |> Object.opt_member "container" string ~enc:container 444 + |> Object.opt_member "container_config" config_jsont ~enc:container_config 445 + |> Object.opt_member "docker_version" string ~enc:docker_version 446 + |> Object.opt_member "author" string ~enc:author 447 + |> Object.opt_member "config" config_jsont ~enc:config 448 + |> Object.member "architecture" Arch.jsont ~enc:architecture 449 + |> Object.opt_member "variant" Arch.variant_jsont ~enc:variant 450 + |> Object.member "os" OS.jsont ~enc:os 451 + |> Object.opt_member "os.version" string ~enc:os_version 452 + |> Object.opt_member "os.features" (list string) ~enc:os_features 453 + |> Object.opt_member "Size" int64 ~enc:size 454 + |> Object.member "rootfs" rootfs_jsont ~enc:rootfs 455 + |> Object.opt_member "history" (list history_jsont) ~enc:history 456 + |> Object.skip_unknown |> Object.seal 454 457 455 458 let of_yojson json = 456 459 match Json.decode jsont json with
+10 -10
lib/spec/descriptor.ml
··· 43 43 platform; 44 44 artifact_type; 45 45 }) 46 - |> Json.Codec.Object.mem "mediaType" Media_type.jsont ~enc:(fun d -> 46 + |> Json.Codec.Object.member "mediaType" Media_type.jsont ~enc:(fun d -> 47 47 d.media_type) 48 - |> Json.Codec.Object.mem "digest" Digest.jsont ~enc:(fun d -> d.digest) 49 - |> Json.Codec.Object.mem "size" z_jsont ~enc:(fun d -> d.size) 50 - |> Json.Codec.Object.opt_mem "urls" (Json.Codec.list Uri_jsont.jsont) 48 + |> Json.Codec.Object.member "digest" Digest.jsont ~enc:(fun d -> d.digest) 49 + |> Json.Codec.Object.member "size" z_jsont ~enc:(fun d -> d.size) 50 + |> Json.Codec.Object.opt_member "urls" (Json.Codec.list Uri_jsont.jsont) 51 51 ~enc:(fun d -> if d.urls = [] then None else Some d.urls) 52 - |> Json.Codec.Object.opt_mem "annotations" annotations_jsont ~enc:(fun d -> 52 + |> Json.Codec.Object.opt_member "annotations" annotations_jsont ~enc:(fun d -> 53 53 if d.annotations = [] then None else Some d.annotations) 54 - |> Json.Codec.Object.opt_mem "data" Base64.jsont ~enc:(fun d -> d.data) 55 - |> Json.Codec.Object.opt_mem "platform" Platform.jsont ~enc:(fun d -> 54 + |> Json.Codec.Object.opt_member "data" Base64.jsont ~enc:(fun d -> d.data) 55 + |> Json.Codec.Object.opt_member "platform" Platform.jsont ~enc:(fun d -> 56 56 d.platform) 57 - |> Json.Codec.Object.opt_mem "artifactType" Content_type.jsont ~enc:(fun d -> 58 - d.artifact_type) 59 - |> Json.Codec.Object.finish 57 + |> Json.Codec.Object.opt_member "artifactType" Content_type.jsont 58 + ~enc:(fun d -> d.artifact_type) 59 + |> Json.Codec.Object.seal 60 60 61 61 let v ?platform ?data ?(annotations = []) ~media_type ~size digest = 62 62 let data =
+9 -8
lib/spec/index.ml
··· 33 33 subject; 34 34 annotations = Option.value ~default:[] annotations; 35 35 }) 36 - |> Object.mem "schemaVersion" v2_jsont ~enc:(fun t -> t.version) 37 - |> Object.opt_mem "mediaType" string ~enc:(fun _ -> 36 + |> Object.member "schemaVersion" v2_jsont ~enc:(fun t -> t.version) 37 + |> Object.opt_member "mediaType" string ~enc:(fun _ -> 38 38 Some (Media_type.to_string (OCI Image_index))) 39 - |> Object.opt_mem "artifactType" rfc_6838_jsont ~enc:(fun t -> 39 + |> Object.opt_member "artifactType" rfc_6838_jsont ~enc:(fun t -> 40 40 t.artifact_type) 41 - |> Object.mem "manifests" (list Descriptor.jsont) ~enc:(fun t -> t.manifests) 42 - |> Object.opt_mem "platform" Platform.jsont ~enc:(fun t -> t.platform) 43 - |> Object.opt_mem "subject" Descriptor.jsont ~enc:(fun t -> t.subject) 44 - |> Object.opt_mem "annotations" annotations_jsont ~enc:(fun t -> 41 + |> Object.member "manifests" (list Descriptor.jsont) ~enc:(fun t -> 42 + t.manifests) 43 + |> Object.opt_member "platform" Platform.jsont ~enc:(fun t -> t.platform) 44 + |> Object.opt_member "subject" Descriptor.jsont ~enc:(fun t -> t.subject) 45 + |> Object.opt_member "annotations" annotations_jsont ~enc:(fun t -> 45 46 if t.annotations = [] then None else Some t.annotations) 46 - |> Object.finish 47 + |> Object.seal 47 48 48 49 let of_yojson json = 49 50 match Json.decode jsont json with
+9 -8
lib/spec/intoto.ml
··· 22 22 let subject_jsont = 23 23 let open Json.Codec in 24 24 Object.map ~kind:"subject" (fun name digest : subject -> { name; digest }) 25 - |> Object.mem "name" string ~enc:(fun (s : subject) -> s.name) 26 - |> Object.mem "digest" digest_map_jsont ~enc:(fun (s : subject) -> s.digest) 27 - |> Object.finish 25 + |> Object.member "name" string ~enc:(fun (s : subject) -> s.name) 26 + |> Object.member "digest" digest_map_jsont ~enc:(fun (s : subject) -> 27 + s.digest) 28 + |> Object.seal 28 29 29 30 type t = { 30 31 type_ : string; ··· 43 44 (fun type_ predicate_type subject predicate -> 44 45 let predicate = Json.Value.to_string predicate in 45 46 { type_; predicate_type; subject; predicate }) 46 - |> Object.mem "_type" string ~enc:(fun t -> t.type_) 47 - |> Object.mem "predicateType" string ~enc:(fun t -> t.predicate_type) 48 - |> Object.mem "subject" (list subject_jsont) ~enc:(fun t -> t.subject) 49 - |> Object.mem "predicate" Value.t ~enc:(fun t -> 47 + |> Object.member "_type" string ~enc:(fun t -> t.type_) 48 + |> Object.member "predicateType" string ~enc:(fun t -> t.predicate_type) 49 + |> Object.member "subject" (list subject_jsont) ~enc:(fun t -> t.subject) 50 + |> Object.member "predicate" Value.t ~enc:(fun t -> 50 51 match Json.Value.of_string t.predicate with 51 52 | Ok json -> json 52 53 | Error _ -> Json.Null ((), Json.Meta.none)) 53 - |> Object.finish 54 + |> Object.seal 54 55 55 56 let of_string s = 56 57 match Json.of_string jsont s with
+2 -2
lib/spec/layout.ml
··· 10 10 let jsont = 11 11 let open Json.Codec in 12 12 Object.map ~kind:"layout" (fun version -> { version }) 13 - |> Object.mem "imageLayoutVersion" int ~enc:(fun l -> l.version) 14 - |> Object.finish 13 + |> Object.member "imageLayoutVersion" int ~enc:(fun l -> l.version) 14 + |> Object.seal 15 15 16 16 let of_yojson json = 17 17 match Json.decode jsont json with
+13 -13
lib/spec/manifest.ml
··· 28 28 subject; 29 29 annotations = Option.value ~default:[] annotations; 30 30 }) 31 - |> Object.mem "schemaVersion" v2_jsont ~enc:(fun t -> t.version) 32 - |> Object.mem "mediaType" string ~enc:(fun _ -> 31 + |> Object.member "schemaVersion" v2_jsont ~enc:(fun t -> t.version) 32 + |> Object.member "mediaType" string ~enc:(fun _ -> 33 33 Media_type.to_string (OCI Image_manifest)) 34 - |> Object.opt_mem "artifactType" string ~enc:(fun t -> t.artifact_type) 35 - |> Object.mem "config" Descriptor.jsont ~enc:(fun t -> t.config) 36 - |> Object.mem "layers" (list Descriptor.jsont) ~enc:(fun t -> t.layers) 37 - |> Object.opt_mem "subject" Descriptor.jsont ~enc:(fun t -> t.subject) 38 - |> Object.opt_mem "annotations" annotations_jsont ~enc:(fun t -> 34 + |> Object.opt_member "artifactType" string ~enc:(fun t -> t.artifact_type) 35 + |> Object.member "config" Descriptor.jsont ~enc:(fun t -> t.config) 36 + |> Object.member "layers" (list Descriptor.jsont) ~enc:(fun t -> t.layers) 37 + |> Object.opt_member "subject" Descriptor.jsont ~enc:(fun t -> t.subject) 38 + |> Object.opt_member "annotations" annotations_jsont ~enc:(fun t -> 39 39 if t.annotations = [] then None else Some t.annotations) 40 - |> Object.finish 40 + |> Object.seal 41 41 42 42 let of_yojson json = 43 43 match Json.decode jsont json with ··· 104 104 let open Json.Codec in 105 105 Object.map ~kind:"docker_manifest" (fun version _media_type config layers -> 106 106 { version; config; layers }) 107 - |> Object.mem "schemaVersion" v2_jsont ~enc:(fun t -> t.version) 108 - |> Object.mem "mediaType" string ~enc:(fun _ -> 107 + |> Object.member "schemaVersion" v2_jsont ~enc:(fun t -> t.version) 108 + |> Object.member "mediaType" string ~enc:(fun _ -> 109 109 Media_type.to_string (Docker Image_manifest)) 110 - |> Object.mem "config" Descriptor.jsont ~enc:(fun t -> t.config) 111 - |> Object.mem "layers" (list Descriptor.jsont) ~enc:(fun t -> t.layers) 112 - |> Object.finish 110 + |> Object.member "config" Descriptor.jsont ~enc:(fun t -> t.config) 111 + |> Object.member "layers" (list Descriptor.jsont) ~enc:(fun t -> t.layers) 112 + |> Object.seal 113 113 114 114 let of_yojson json = 115 115 match Json.decode jsont json with
+5 -4
lib/spec/manifest_list.ml
··· 6 6 let open Json.Codec in 7 7 Object.map ~kind:"manifest_list" (fun version _media_type manifests -> 8 8 { version; manifests }) 9 - |> Object.mem "schemaVersion" v2_jsont ~enc:(fun t -> t.version) 10 - |> Object.mem "mediaType" string ~enc:(fun _ -> 9 + |> Object.member "schemaVersion" v2_jsont ~enc:(fun t -> t.version) 10 + |> Object.member "mediaType" string ~enc:(fun _ -> 11 11 Media_type.to_string (Docker Image_manifest_list)) 12 - |> Object.mem "manifests" (list Descriptor.jsont) ~enc:(fun t -> t.manifests) 13 - |> Object.finish 12 + |> Object.member "manifests" (list Descriptor.jsont) ~enc:(fun t -> 13 + t.manifests) 14 + |> Object.seal 14 15 15 16 let of_yojson json = 16 17 match Json.decode jsont json with
+2 -2
lib/spec/media_type.ml
··· 118 118 let extractor = 119 119 let open Json.Codec in 120 120 Object.map ~kind:"extractor" (fun media_type -> media_type) 121 - |> Object.opt_mem "mediaType" string ~enc:(fun _ -> None) 122 - |> Object.skip_unknown |> Object.finish 121 + |> Object.opt_member "mediaType" string ~enc:(fun _ -> None) 122 + |> Object.skip_unknown |> Object.seal 123 123 124 124 let guess str = 125 125 if str = "" then None
+7 -7
lib/spec/platform.ml
··· 23 23 variant; 24 24 features = Option.value ~default:[] features; 25 25 }) 26 - |> Object.mem "architecture" Arch.jsont ~enc:(fun p -> p.architecture) 27 - |> Object.mem "os" OS.jsont ~enc:(fun p -> p.os) 28 - |> Object.opt_mem "os.version" string ~enc:(fun p -> p.os_version) 29 - |> Object.opt_mem "os.features" (list string) ~enc:(fun p -> 26 + |> Object.member "architecture" Arch.jsont ~enc:(fun p -> p.architecture) 27 + |> Object.member "os" OS.jsont ~enc:(fun p -> p.os) 28 + |> Object.opt_member "os.version" string ~enc:(fun p -> p.os_version) 29 + |> Object.opt_member "os.features" (list string) ~enc:(fun p -> 30 30 if p.os_features = [] then None else Some p.os_features) 31 - |> Object.opt_mem "variant" Arch.variant_jsont ~enc:(fun p -> p.variant) 32 - |> Object.opt_mem "features" (list string) ~enc:(fun p -> 31 + |> Object.opt_member "variant" Arch.variant_jsont ~enc:(fun p -> p.variant) 32 + |> Object.opt_member "features" (list string) ~enc:(fun p -> 33 33 if p.features = [] then None else Some p.features) 34 - |> Object.finish 34 + |> Object.seal 35 35 36 36 let v ?os_version ?(os_features = []) ?variant architecture os = 37 37 { architecture; os; os_version; os_features; variant; features = [] }
+1
oci.opam
··· 35 35 "xdg" 36 36 "osrelease" 37 37 "alcotest" {with-test} 38 + "loc" 38 39 "odoc" {with-doc} 39 40 ] 40 41 build: [
+4 -4
test/interop/registry/helpers.ml
··· 9 9 let meta_jsont = 10 10 Json.Codec.Object.map (fun index_digest manifest_digest config_digest -> 11 11 (index_digest, manifest_digest, config_digest)) 12 - |> Json.Codec.Object.mem "index_digest" Json.Codec.string 12 + |> Json.Codec.Object.member "index_digest" Json.Codec.string 13 13 ~enc:(fun (x, _, _) -> x) 14 - |> Json.Codec.Object.mem "manifest_digest" Json.Codec.string 14 + |> Json.Codec.Object.member "manifest_digest" Json.Codec.string 15 15 ~enc:(fun (_, x, _) -> x) 16 - |> Json.Codec.Object.mem "config_digest" Json.Codec.string 16 + |> Json.Codec.Object.member "config_digest" Json.Codec.string 17 17 ~enc:(fun (_, _, x) -> x) 18 - |> Json.Codec.Object.skip_unknown |> Json.Codec.Object.finish 18 + |> Json.Codec.Object.skip_unknown |> Json.Codec.Object.seal 19 19 20 20 let meta () = 21 21 let raw = read_file "meta.json" in