Monorepo management for opam overlays
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.

+87 -89
+2 -1
dune-project
··· 37 37 (sexp (>= 0.1.0)) 38 38 (tty (>= 0.1.0)) 39 39 (tty-eio (>= 0.1.0)) 40 - (odoc :with-doc))) 40 + (odoc :with-doc) 41 + loc)) 41 42
+5 -5
lib/auto_resolve.ml
··· 92 92 Object.map ~kind:"Proposal" 93 93 (fun merged ours_summary theirs_summary rationale -> 94 94 { merged; ours_summary; theirs_summary; rationale }) 95 - |> Object.mem "merged" string ~enc:(fun p -> p.merged) 96 - |> Object.mem "ours_summary" string ~enc:(fun p -> p.ours_summary) 97 - |> Object.mem "theirs_summary" string ~enc:(fun p -> p.theirs_summary) 98 - |> Object.mem "rationale" string ~enc:(fun p -> p.rationale) 99 - |> Object.finish 95 + |> Object.member "merged" string ~enc:(fun p -> p.merged) 96 + |> Object.member "ours_summary" string ~enc:(fun p -> p.ours_summary) 97 + |> Object.member "theirs_summary" string ~enc:(fun p -> p.theirs_summary) 98 + |> Object.member "rationale" string ~enc:(fun p -> p.rationale) 99 + |> Object.seal 100 100 101 101 let prompt_for path ~chunks = 102 102 let buf = Buffer.create 512 in
+40 -48
lib/changes.ml
··· 67 67 let open Json.Codec in 68 68 let make from_hash to_hash count = { from_hash; to_hash; count } in 69 69 Object.map ~kind:"commit_range" make 70 - |> Object.mem "from" string ~enc:(fun r -> r.from_hash) 71 - |> Object.mem "to" string ~enc:(fun r -> r.to_hash) 72 - |> Object.mem "count" int ~enc:(fun r -> r.count) 73 - |> Object.finish 70 + |> Object.member "from" string ~enc:(fun r -> r.from_hash) 71 + |> Object.member "to" string ~enc:(fun r -> r.to_hash) 72 + |> Object.member "count" int ~enc:(fun r -> r.count) 73 + |> Object.seal 74 74 75 75 let weekly_entry_jsont : weekly_entry Json.codec = 76 76 let open Json.Codec in ··· 78 78 { week_start; week_end; summary; changes; commit_range } 79 79 in 80 80 Object.map ~kind:"weekly_entry" make 81 - |> Object.mem "week_start" string ~enc:(fun (e : weekly_entry) -> 81 + |> Object.member "week_start" string ~enc:(fun (e : weekly_entry) -> 82 82 e.week_start) 83 - |> Object.mem "week_end" string ~enc:(fun (e : weekly_entry) -> e.week_end) 84 - |> Object.mem "summary" string ~enc:(fun (e : weekly_entry) -> e.summary) 85 - |> Object.mem "changes" (list string) ~enc:(fun (e : weekly_entry) -> 83 + |> Object.member "week_end" string ~enc:(fun (e : weekly_entry) -> e.week_end) 84 + |> Object.member "summary" string ~enc:(fun (e : weekly_entry) -> e.summary) 85 + |> Object.member "changes" (list string) ~enc:(fun (e : weekly_entry) -> 86 86 e.changes) 87 - |> Object.mem "commit_range" commit_range_jsont 87 + |> Object.member "commit_range" commit_range_jsont 88 88 ~enc:(fun (e : weekly_entry) -> e.commit_range) 89 - |> Object.finish 89 + |> Object.seal 90 90 91 91 let file_jsont : file Json.codec = 92 92 let open Json.Codec in 93 93 let make repository entries : file = { repository; entries } in 94 94 Object.map ~kind:"changes_file" make 95 - |> Object.mem "repository" string ~enc:(fun (f : file) -> f.repository) 96 - |> Object.mem "entries" (list weekly_entry_jsont) ~enc:(fun (f : file) -> 95 + |> Object.member "repository" string ~enc:(fun (f : file) -> f.repository) 96 + |> Object.member "entries" (list weekly_entry_jsont) ~enc:(fun (f : file) -> 97 97 f.entries) 98 - |> Object.finish 98 + |> Object.seal 99 99 100 100 let ptime_jsont = 101 101 let open Json.Codec in ··· 126 126 let default_hour = 0 in 127 127 let default_timestamp = Ptime.epoch in 128 128 Object.map ~kind:"daily_entry" make 129 - |> Object.mem "date" string ~enc:(fun (e : daily_entry) -> e.date) 130 - |> Object.mem "hour" int ~dec_absent:default_hour 129 + |> Object.member "date" string ~enc:(fun (e : daily_entry) -> e.date) 130 + |> Object.member "hour" int ~dec_absent:default_hour 131 131 ~enc:(fun (e : daily_entry) -> e.hour) 132 - |> Object.mem "timestamp" ptime_jsont ~dec_absent:default_timestamp 132 + |> Object.member "timestamp" ptime_jsont ~dec_absent:default_timestamp 133 133 ~enc:(fun (e : daily_entry) -> e.timestamp) 134 - |> Object.mem "summary" string ~enc:(fun (e : daily_entry) -> e.summary) 135 - |> Object.mem "changes" (list string) ~enc:(fun (e : daily_entry) -> 134 + |> Object.member "summary" string ~enc:(fun (e : daily_entry) -> e.summary) 135 + |> Object.member "changes" (list string) ~enc:(fun (e : daily_entry) -> 136 136 e.changes) 137 - |> Object.mem "commit_range" commit_range_jsont ~enc:(fun (e : daily_entry) -> 138 - e.commit_range) 139 - |> Object.mem "contributors" (list string) ~dec_absent:[] 137 + |> Object.member "commit_range" commit_range_jsont 138 + ~enc:(fun (e : daily_entry) -> e.commit_range) 139 + |> Object.member "contributors" (list string) ~dec_absent:[] 140 140 ~enc:(fun (e : daily_entry) -> e.contributors) 141 - |> Object.mem "repo_url" (option string) ~dec_absent:None 141 + |> Object.member "repo_url" (option string) ~dec_absent:None 142 142 ~enc:(fun (e : daily_entry) -> e.repo_url) 143 - |> Object.finish 143 + |> Object.seal 144 144 145 145 let daily_file_jsont : daily_file Json.codec = 146 146 let open Json.Codec in 147 147 let make repository entries : daily_file = { repository; entries } in 148 148 Object.map ~kind:"daily_changes_file" make 149 - |> Object.mem "repository" string ~enc:(fun (f : daily_file) -> f.repository) 150 - |> Object.mem "entries" (list daily_entry_jsont) ~enc:(fun (f : daily_file) -> 151 - f.entries) 152 - |> Object.finish 149 + |> Object.member "repository" string ~enc:(fun (f : daily_file) -> 150 + f.repository) 151 + |> Object.member "entries" (list daily_entry_jsont) 152 + ~enc:(fun (f : daily_file) -> f.entries) 153 + |> Object.seal 153 154 154 155 (* File I/O *) 155 156 ··· 530 531 let open Json.Codec in 531 532 let make summary changes = { summary; changes } in 532 533 Object.map ~kind:"claude_response" make 533 - |> Object.mem "summary" string ~enc:(fun r -> r.summary) 534 - |> Object.mem "changes" (list string) ~enc:(fun r -> r.changes) 535 - |> Object.finish 534 + |> Object.member "summary" string ~enc:(fun r -> r.summary) 535 + |> Object.member "changes" (list string) ~enc:(fun r -> r.changes) 536 + |> Object.seal 536 537 537 538 let parse_claude_response text = 538 539 let text = String.trim text in ··· 548 549 (* Main analysis function *) 549 550 550 551 let changelog_output_schema = 551 - let typ t = Json.object' [ Json.mem (Json.name "type") (Json.string t) ] in 552 - Json.object' 553 - [ 554 - Json.mem (Json.name "type") (Json.string "object"); 555 - Json.mem (Json.name "properties") 556 - (Json.object' 557 - [ 558 - Json.mem (Json.name "summary") (typ "string"); 559 - Json.mem (Json.name "changes") 560 - (Json.object' 561 - [ 562 - Json.mem (Json.name "type") (Json.string "array"); 563 - Json.mem (Json.name "items") (typ "string"); 564 - ]); 565 - ]); 566 - Json.mem (Json.name "required") 567 - (Json.list [ Json.string "summary"; Json.string "changes" ]); 568 - ] 552 + Json.Value.of_string_exn 553 + {|{ 554 + "type": "object", 555 + "properties": { 556 + "summary": { "type": "string" }, 557 + "changes": { "type": "array", "items": { "type": "string" } } 558 + }, 559 + "required": ["summary", "changes"] 560 + }|} 569 561 570 562 let process_claude_responses responses = 571 563 let result = ref None in
+22 -20
lib/changes_aggregated.ml
··· 84 84 let open Json.Codec in 85 85 let make from_hash to_hash count = { from_hash; to_hash; count } in 86 86 Object.map ~kind:"commit_range" make 87 - |> Object.mem "from" string ~enc:(fun r -> r.from_hash) 88 - |> Object.mem "to" string ~enc:(fun r -> r.to_hash) 89 - |> Object.mem "count" int ~enc:(fun r -> r.count) 90 - |> Object.finish 87 + |> Object.member "from" string ~enc:(fun r -> r.from_hash) 88 + |> Object.member "to" string ~enc:(fun r -> r.to_hash) 89 + |> Object.member "count" int ~enc:(fun r -> r.count) 90 + |> Object.seal 91 91 92 92 let ptime_jsont = 93 93 let open Json.Codec in ··· 119 119 let default_hour = 0 in 120 120 let default_timestamp = Ptime.epoch in 121 121 Object.map ~kind:"aggregated_entry" make 122 - |> Object.mem "repository" string ~enc:(fun e -> e.repository) 123 - |> Object.mem "hour" int ~dec_absent:default_hour ~enc:(fun e -> e.hour) 124 - |> Object.mem "timestamp" ptime_jsont ~dec_absent:default_timestamp 122 + |> Object.member "repository" string ~enc:(fun e -> e.repository) 123 + |> Object.member "hour" int ~dec_absent:default_hour ~enc:(fun e -> e.hour) 124 + |> Object.member "timestamp" ptime_jsont ~dec_absent:default_timestamp 125 125 ~enc:(fun e -> e.timestamp) 126 - |> Object.mem "summary" string ~enc:(fun e -> e.summary) 127 - |> Object.mem "changes" (list string) ~enc:(fun e -> e.changes) 128 - |> Object.mem "commit_range" commit_range_jsont ~enc:(fun e -> e.commit_range) 129 - |> Object.mem "contributors" (list string) ~dec_absent:[] ~enc:(fun e -> 126 + |> Object.member "summary" string ~enc:(fun e -> e.summary) 127 + |> Object.member "changes" (list string) ~enc:(fun e -> e.changes) 128 + |> Object.member "commit_range" commit_range_jsont ~enc:(fun e -> 129 + e.commit_range) 130 + |> Object.member "contributors" (list string) ~dec_absent:[] ~enc:(fun e -> 130 131 e.contributors) 131 - |> Object.mem "repo_url" (option string) ~dec_absent:None ~enc:(fun e -> 132 + |> Object.member "repo_url" (option string) ~dec_absent:None ~enc:(fun e -> 132 133 e.repo_url) 133 - |> Object.mem "change_type" change_type_jsont ~dec_absent:Unknown 134 + |> Object.member "change_type" change_type_jsont ~dec_absent:Unknown 134 135 ~enc:(fun e -> e.change_type) 135 - |> Object.finish 136 + |> Object.seal 136 137 137 138 let jsont = 138 139 let open Json.Codec in ··· 140 141 { date; generated_at; git_head; entries; authors } 141 142 in 142 143 Object.map ~kind:"aggregated_changes" make 143 - |> Object.mem "date" string ~enc:(fun t -> t.date) 144 - |> Object.mem "generated_at" ptime_jsont ~enc:(fun t -> t.generated_at) 145 - |> Object.mem "git_head" string ~enc:(fun t -> t.git_head) 146 - |> Object.mem "entries" (list entry_jsont) ~enc:(fun t -> t.entries) 147 - |> Object.mem "authors" (list string) ~dec_absent:[] ~enc:(fun t -> t.authors) 148 - |> Object.finish 144 + |> Object.member "date" string ~enc:(fun t -> t.date) 145 + |> Object.member "generated_at" ptime_jsont ~enc:(fun t -> t.generated_at) 146 + |> Object.member "git_head" string ~enc:(fun t -> t.git_head) 147 + |> Object.member "entries" (list entry_jsont) ~enc:(fun t -> t.entries) 148 + |> Object.member "authors" (list string) ~dec_absent:[] ~enc:(fun t -> 149 + t.authors) 150 + |> Object.seal 149 151 150 152 (* File I/O *) 151 153
+17 -15
lib/changes_daily.ml
··· 45 45 let open Json.Codec in 46 46 let make from_hash to_hash count = { from_hash; to_hash; count } in 47 47 Object.map ~kind:"commit_range" make 48 - |> Object.mem "from" string ~enc:(fun r -> r.from_hash) 49 - |> Object.mem "to" string ~enc:(fun r -> r.to_hash) 50 - |> Object.mem "count" int ~enc:(fun r -> r.count) 51 - |> Object.finish 48 + |> Object.member "from" string ~enc:(fun r -> r.from_hash) 49 + |> Object.member "to" string ~enc:(fun r -> r.to_hash) 50 + |> Object.member "count" int ~enc:(fun r -> r.count) 51 + |> Object.seal 52 52 53 53 let ptime_jsont = 54 54 let open Json.Codec in ··· 79 79 let default_hour = 0 in 80 80 let default_timestamp = Ptime.epoch in 81 81 Object.map ~kind:"daily_entry" make 82 - |> Object.mem "hour" int ~dec_absent:default_hour ~enc:(fun e -> e.hour) 83 - |> Object.mem "timestamp" ptime_jsont ~dec_absent:default_timestamp 82 + |> Object.member "hour" int ~dec_absent:default_hour ~enc:(fun e -> e.hour) 83 + |> Object.member "timestamp" ptime_jsont ~dec_absent:default_timestamp 84 84 ~enc:(fun e -> e.timestamp) 85 - |> Object.mem "summary" string ~enc:(fun e -> e.summary) 86 - |> Object.mem "changes" (list string) ~enc:(fun e -> e.changes) 87 - |> Object.mem "commit_range" commit_range_jsont ~enc:(fun e -> e.commit_range) 88 - |> Object.mem "contributors" (list string) ~dec_absent:[] ~enc:(fun e -> 85 + |> Object.member "summary" string ~enc:(fun e -> e.summary) 86 + |> Object.member "changes" (list string) ~enc:(fun e -> e.changes) 87 + |> Object.member "commit_range" commit_range_jsont ~enc:(fun e -> 88 + e.commit_range) 89 + |> Object.member "contributors" (list string) ~dec_absent:[] ~enc:(fun e -> 89 90 e.contributors) 90 - |> Object.mem "repo_url" (option string) ~dec_absent:None ~enc:(fun e -> 91 + |> Object.member "repo_url" (option string) ~dec_absent:None ~enc:(fun e -> 91 92 e.repo_url) 92 - |> Object.finish 93 + |> Object.seal 93 94 94 95 type json_file = { json_repository : string; json_entries : file_entry list } 95 96 ··· 97 98 let open Json.Codec in 98 99 let make json_repository json_entries = { json_repository; json_entries } in 99 100 Object.map ~kind:"daily_changes_file" make 100 - |> Object.mem "repository" string ~enc:(fun f -> f.json_repository) 101 - |> Object.mem "entries" (list file_entry_jsont) ~enc:(fun f -> f.json_entries) 102 - |> Object.finish 101 + |> Object.member "repository" string ~enc:(fun f -> f.json_repository) 102 + |> Object.member "entries" (list file_entry_jsont) ~enc:(fun f -> 103 + f.json_entries) 104 + |> Object.seal 103 105 104 106 (* Parse date from filename: <repo>-<YYYY-MM-DD>.json *) 105 107 let parse_daily_filename filename =
+1
monopam.opam
··· 35 35 "tty" {>= "0.1.0"} 36 36 "tty-eio" {>= "0.1.0"} 37 37 "odoc" {with-doc} 38 + "loc" 38 39 ] 39 40 build: [ 40 41 ["dune" "subst"] {dev}