Monorepo management for opam overlays
0
fork

Configure Feed

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

freebox,space,monopam,meross: let open Json.Codec in cleanup

Per-let `let open Json.Codec in` inside each codec body. freebox
needed a few API-helper sites to keep `Json.Codec.list` and
`Json.Codec.null` qualified (they sit outside any codec body, so
opening locally would be wasteful), and `(l : l2ident)` annotation
on freebox/hosts l.id to disambiguate from mem_map.id.
space/config has similar Json.Codec.list at the annotation/encoding
sites that wrap codecs into HTTP requests.
monopam (changes/changes_aggregated/changes_daily) and
meross/device have no field clashes; opens applied straight through.

+110 -114
+52 -52
lib/changes.ml
··· 64 64 (* Jsont codecs *) 65 65 66 66 let commit_range_jsont = 67 + let open Json.Codec in 67 68 let make from_hash to_hash count = { from_hash; to_hash; count } in 68 - Json.Codec.Object.map ~kind:"commit_range" make 69 - |> Json.Codec.Object.mem "from" Json.Codec.string ~enc:(fun r -> r.from_hash) 70 - |> Json.Codec.Object.mem "to" Json.Codec.string ~enc:(fun r -> r.to_hash) 71 - |> Json.Codec.Object.mem "count" Json.Codec.int ~enc:(fun r -> r.count) 72 - |> Json.Codec.Object.finish 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 73 74 74 75 let weekly_entry_jsont : weekly_entry Json.codec = 76 + let open Json.Codec in 75 77 let make week_start week_end summary changes commit_range : weekly_entry = 76 78 { week_start; week_end; summary; changes; commit_range } 77 79 in 78 - Json.Codec.Object.map ~kind:"weekly_entry" make 79 - |> Json.Codec.Object.mem "week_start" Json.Codec.string 80 - ~enc:(fun (e : weekly_entry) -> e.week_start) 81 - |> Json.Codec.Object.mem "week_end" Json.Codec.string 82 - ~enc:(fun (e : weekly_entry) -> e.week_end) 83 - |> Json.Codec.Object.mem "summary" Json.Codec.string 84 - ~enc:(fun (e : weekly_entry) -> e.summary) 85 - |> Json.Codec.Object.mem "changes" (Json.Codec.list Json.Codec.string) 86 - ~enc:(fun (e : weekly_entry) -> e.changes) 87 - |> Json.Codec.Object.mem "commit_range" commit_range_jsont 80 + Object.map ~kind:"weekly_entry" make 81 + |> Object.mem "week_start" string ~enc:(fun (e : weekly_entry) -> 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) -> 86 + e.changes) 87 + |> Object.mem "commit_range" commit_range_jsont 88 88 ~enc:(fun (e : weekly_entry) -> e.commit_range) 89 - |> Json.Codec.Object.finish 89 + |> Object.finish 90 90 91 91 let file_jsont : file Json.codec = 92 + let open Json.Codec in 92 93 let make repository entries : file = { repository; entries } in 93 - Json.Codec.Object.map ~kind:"changes_file" make 94 - |> Json.Codec.Object.mem "repository" Json.Codec.string 95 - ~enc:(fun (f : file) -> f.repository) 96 - |> Json.Codec.Object.mem "entries" (Json.Codec.list weekly_entry_jsont) 97 - ~enc:(fun (f : file) -> f.entries) 98 - |> Json.Codec.Object.finish 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) -> 97 + f.entries) 98 + |> Object.finish 99 99 100 100 let ptime_jsont = 101 + let open Json.Codec in 101 102 let enc t = Ptime.to_rfc3339 t ~tz_offset_s:0 in 102 103 let dec s = 103 104 match Ptime.of_rfc3339 s with 104 105 | Ok (t, _, _) -> t 105 106 | Error _ -> failwith ("Invalid timestamp: " ^ s) 106 107 in 107 - Json.Codec.map ~dec ~enc Json.Codec.string 108 + map ~dec ~enc string 108 109 109 110 let daily_entry_jsont : daily_entry Json.codec = 111 + let open Json.Codec in 110 112 let make date hour timestamp summary changes commit_range contributors 111 113 repo_url : daily_entry = 112 114 { ··· 123 125 (* Default hour and timestamp for backwards compat when reading old files *) 124 126 let default_hour = 0 in 125 127 let default_timestamp = Ptime.epoch in 126 - Json.Codec.Object.map ~kind:"daily_entry" make 127 - |> Json.Codec.Object.mem "date" Json.Codec.string 128 - ~enc:(fun (e : daily_entry) -> e.date) 129 - |> Json.Codec.Object.mem "hour" Json.Codec.int ~dec_absent:default_hour 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 130 131 ~enc:(fun (e : daily_entry) -> e.hour) 131 - |> Json.Codec.Object.mem "timestamp" ptime_jsont ~dec_absent:default_timestamp 132 + |> Object.mem "timestamp" ptime_jsont ~dec_absent:default_timestamp 132 133 ~enc:(fun (e : daily_entry) -> e.timestamp) 133 - |> Json.Codec.Object.mem "summary" Json.Codec.string 134 - ~enc:(fun (e : daily_entry) -> e.summary) 135 - |> Json.Codec.Object.mem "changes" (Json.Codec.list Json.Codec.string) 136 - ~enc:(fun (e : daily_entry) -> e.changes) 137 - |> Json.Codec.Object.mem "commit_range" commit_range_jsont 138 - ~enc:(fun (e : daily_entry) -> e.commit_range) 139 - |> Json.Codec.Object.mem "contributors" (Json.Codec.list Json.Codec.string) 140 - ~dec_absent:[] ~enc:(fun (e : daily_entry) -> e.contributors) 141 - |> Json.Codec.Object.mem "repo_url" (Json.Codec.option Json.Codec.string) 142 - ~dec_absent:None ~enc:(fun (e : daily_entry) -> e.repo_url) 143 - |> Json.Codec.Object.finish 134 + |> Object.mem "summary" string ~enc:(fun (e : daily_entry) -> e.summary) 135 + |> Object.mem "changes" (list string) ~enc:(fun (e : daily_entry) -> 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:[] 140 + ~enc:(fun (e : daily_entry) -> e.contributors) 141 + |> Object.mem "repo_url" (option string) ~dec_absent:None 142 + ~enc:(fun (e : daily_entry) -> e.repo_url) 143 + |> Object.finish 144 144 145 145 let daily_file_jsont : daily_file Json.codec = 146 + let open Json.Codec in 146 147 let make repository entries : daily_file = { repository; entries } in 147 - Json.Codec.Object.map ~kind:"daily_changes_file" make 148 - |> Json.Codec.Object.mem "repository" Json.Codec.string 149 - ~enc:(fun (f : daily_file) -> f.repository) 150 - |> Json.Codec.Object.mem "entries" (Json.Codec.list daily_entry_jsont) 151 - ~enc:(fun (f : daily_file) -> f.entries) 152 - |> Json.Codec.Object.finish 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 153 153 154 154 (* File I/O *) 155 155 ··· 183 183 Eio.Path.( 184 184 fs / Fpath.to_string monorepo / ".changes" / (cf.repository ^ ".json")) 185 185 in 186 - let content = Json.to_string ~format:Json.Indent file_jsont cf in 186 + let content = Json.to_string ~indent:2 file_jsont cf in 187 187 Eio.Path.save ~create:(`Or_truncate 0o644) file_path content; 188 188 Ok () 189 189 ··· 223 223 let file_path = 224 224 Eio.Path.(fs / Fpath.to_string monorepo / ".changes" / filename) 225 225 in 226 - let content = Json.to_string ~format:Json.Indent daily_file_jsont cf in 226 + let content = Json.to_string ~indent:2 daily_file_jsont cf in 227 227 Eio.Path.save ~create:(`Or_truncate 0o644) file_path content; 228 228 Ok () 229 229 ··· 527 527 type claude_response = { summary : string; changes : string list } 528 528 529 529 let claude_response_jsont = 530 + let open Json.Codec in 530 531 let make summary changes = { summary; changes } in 531 - Json.Codec.Object.map ~kind:"claude_response" make 532 - |> Json.Codec.Object.mem "summary" Json.Codec.string ~enc:(fun r -> r.summary) 533 - |> Json.Codec.Object.mem "changes" (Json.Codec.list Json.Codec.string) 534 - ~enc:(fun r -> r.changes) 535 - |> Json.Codec.Object.finish 532 + 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 536 536 537 537 let parse_claude_response text = 538 538 let text = String.trim text in
+33 -36
lib/changes_aggregated.ml
··· 69 69 (* JSON codecs *) 70 70 71 71 let change_type_jsont = 72 - Json.Codec.enum ~kind:"change_type" 72 + let open Json.Codec in 73 + enum ~kind:"change_type" 73 74 [ 74 75 ("feature", Feature); 75 76 ("bugfix", Bugfix); ··· 80 81 ] 81 82 82 83 let commit_range_jsont = 84 + let open Json.Codec in 83 85 let make from_hash to_hash count = { from_hash; to_hash; count } in 84 - Json.Codec.Object.map ~kind:"commit_range" make 85 - |> Json.Codec.Object.mem "from" Json.Codec.string ~enc:(fun r -> r.from_hash) 86 - |> Json.Codec.Object.mem "to" Json.Codec.string ~enc:(fun r -> r.to_hash) 87 - |> Json.Codec.Object.mem "count" Json.Codec.int ~enc:(fun r -> r.count) 88 - |> Json.Codec.Object.finish 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 89 91 90 92 let ptime_jsont = 93 + let open Json.Codec in 91 94 let enc t = Ptime.to_rfc3339 t ~tz_offset_s:0 in 92 95 let dec s = 93 96 match Ptime.of_rfc3339 s with 94 97 | Ok (t, _, _) -> t 95 98 | Error _ -> failwith ("Invalid timestamp: " ^ s) 96 99 in 97 - Json.Codec.map ~dec ~enc Json.Codec.string 100 + map ~dec ~enc string 98 101 99 102 let entry_jsont = 103 + let open Json.Codec in 100 104 let make repository hour timestamp summary changes commit_range contributors 101 105 repo_url change_type = 102 106 { ··· 114 118 (* Default hour and timestamp for backwards compat when reading old files *) 115 119 let default_hour = 0 in 116 120 let default_timestamp = Ptime.epoch in 117 - Json.Codec.Object.map ~kind:"aggregated_entry" make 118 - |> Json.Codec.Object.mem "repository" Json.Codec.string ~enc:(fun e -> 119 - e.repository) 120 - |> Json.Codec.Object.mem "hour" Json.Codec.int ~dec_absent:default_hour 121 - ~enc:(fun e -> e.hour) 122 - |> Json.Codec.Object.mem "timestamp" ptime_jsont ~dec_absent:default_timestamp 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 123 125 ~enc:(fun e -> e.timestamp) 124 - |> Json.Codec.Object.mem "summary" Json.Codec.string ~enc:(fun e -> e.summary) 125 - |> Json.Codec.Object.mem "changes" (Json.Codec.list Json.Codec.string) 126 - ~enc:(fun e -> e.changes) 127 - |> Json.Codec.Object.mem "commit_range" commit_range_jsont ~enc:(fun e -> 128 - e.commit_range) 129 - |> Json.Codec.Object.mem "contributors" (Json.Codec.list Json.Codec.string) 130 - ~dec_absent:[] ~enc:(fun e -> e.contributors) 131 - |> Json.Codec.Object.mem "repo_url" (Json.Codec.option Json.Codec.string) 132 - ~dec_absent:None ~enc:(fun e -> e.repo_url) 133 - |> Json.Codec.Object.mem "change_type" change_type_jsont ~dec_absent:Unknown 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 -> 130 + e.contributors) 131 + |> Object.mem "repo_url" (option string) ~dec_absent:None ~enc:(fun e -> 132 + e.repo_url) 133 + |> Object.mem "change_type" change_type_jsont ~dec_absent:Unknown 134 134 ~enc:(fun e -> e.change_type) 135 - |> Json.Codec.Object.finish 135 + |> Object.finish 136 136 137 137 let jsont = 138 + let open Json.Codec in 138 139 let make date generated_at git_head entries authors = 139 140 { date; generated_at; git_head; entries; authors } 140 141 in 141 - Json.Codec.Object.map ~kind:"aggregated_changes" make 142 - |> Json.Codec.Object.mem "date" Json.Codec.string ~enc:(fun t -> t.date) 143 - |> Json.Codec.Object.mem "generated_at" ptime_jsont ~enc:(fun t -> 144 - t.generated_at) 145 - |> Json.Codec.Object.mem "git_head" Json.Codec.string ~enc:(fun t -> 146 - t.git_head) 147 - |> Json.Codec.Object.mem "entries" (Json.Codec.list entry_jsont) 148 - ~enc:(fun t -> t.entries) 149 - |> Json.Codec.Object.mem "authors" (Json.Codec.list Json.Codec.string) 150 - ~dec_absent:[] ~enc:(fun t -> t.authors) 151 - |> Json.Codec.Object.finish 142 + 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 152 149 153 150 (* File I/O *) 154 151 ··· 250 247 ensure_dir ~fs changes_dir; 251 248 let filename = filename_of_date t.date in 252 249 let file_path = Eio.Path.(fs / Fpath.to_string changes_dir / filename) in 253 - let content = Json.to_string ~format:Json.Indent jsont t in 250 + let content = Json.to_string ~indent:2 jsont t in 254 251 Eio.Path.save ~create:(`Or_truncate 0o644) file_path content; 255 252 Ok ()
+25 -26
lib/changes_daily.ml
··· 42 42 (* JSON codecs for the per-day file format *) 43 43 44 44 let commit_range_jsont = 45 + let open Json.Codec in 45 46 let make from_hash to_hash count = { from_hash; to_hash; count } in 46 - Json.Codec.Object.map ~kind:"commit_range" make 47 - |> Json.Codec.Object.mem "from" Json.Codec.string ~enc:(fun r -> r.from_hash) 48 - |> Json.Codec.Object.mem "to" Json.Codec.string ~enc:(fun r -> r.to_hash) 49 - |> Json.Codec.Object.mem "count" Json.Codec.int ~enc:(fun r -> r.count) 50 - |> Json.Codec.Object.finish 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 51 52 52 53 let ptime_jsont = 54 + let open Json.Codec in 53 55 let enc t = Ptime.to_rfc3339 t ~tz_offset_s:0 in 54 56 let dec s = 55 57 match Ptime.of_rfc3339 s with 56 58 | Ok (t, _, _) -> t 57 59 | Error _ -> failwith ("Invalid timestamp: " ^ s) 58 60 in 59 - Json.Codec.map ~dec ~enc Json.Codec.string 61 + map ~dec ~enc string 60 62 61 63 (* Entry codec for the file format (without repository, added during load) *) 62 64 type file_entry = { ··· 70 72 } 71 73 72 74 let file_entry_jsont = 75 + let open Json.Codec in 73 76 let make hour timestamp summary changes commit_range contributors repo_url = 74 77 { hour; timestamp; summary; changes; commit_range; contributors; repo_url } 75 78 in 76 79 let default_hour = 0 in 77 80 let default_timestamp = Ptime.epoch in 78 - Json.Codec.Object.map ~kind:"daily_entry" make 79 - |> Json.Codec.Object.mem "hour" Json.Codec.int ~dec_absent:default_hour 80 - ~enc:(fun e -> e.hour) 81 - |> Json.Codec.Object.mem "timestamp" ptime_jsont ~dec_absent:default_timestamp 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 84 ~enc:(fun e -> e.timestamp) 83 - |> Json.Codec.Object.mem "summary" Json.Codec.string ~enc:(fun e -> e.summary) 84 - |> Json.Codec.Object.mem "changes" (Json.Codec.list Json.Codec.string) 85 - ~enc:(fun e -> e.changes) 86 - |> Json.Codec.Object.mem "commit_range" commit_range_jsont ~enc:(fun e -> 87 - e.commit_range) 88 - |> Json.Codec.Object.mem "contributors" (Json.Codec.list Json.Codec.string) 89 - ~dec_absent:[] ~enc:(fun e -> e.contributors) 90 - |> Json.Codec.Object.mem "repo_url" (Json.Codec.option Json.Codec.string) 91 - ~dec_absent:None ~enc:(fun e -> e.repo_url) 92 - |> Json.Codec.Object.finish 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 -> 89 + e.contributors) 90 + |> Object.mem "repo_url" (option string) ~dec_absent:None ~enc:(fun e -> 91 + e.repo_url) 92 + |> Object.finish 93 93 94 94 type json_file = { json_repository : string; json_entries : file_entry list } 95 95 96 96 let json_file_jsont = 97 + let open Json.Codec in 97 98 let make json_repository json_entries = { json_repository; json_entries } in 98 - Json.Codec.Object.map ~kind:"daily_changes_file" make 99 - |> Json.Codec.Object.mem "repository" Json.Codec.string ~enc:(fun f -> 100 - f.json_repository) 101 - |> Json.Codec.Object.mem "entries" (Json.Codec.list file_entry_jsont) 102 - ~enc:(fun f -> f.json_entries) 103 - |> Json.Codec.Object.finish 99 + 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 104 103 105 104 (* Parse date from filename: <repo>-<YYYY-MM-DD>.json *) 106 105 let parse_daily_filename filename =