Declarative CSV codecs
0
fork

Configure Feed

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

Clean up debug files, update serialization libraries

Remove ocaml-rice/test/debug/ (temporary libaec debug stubs).
Update ocaml-crypto, ocaml-csvt, ocaml-sexpt, ocaml-tomlt, ocaml-xmlt.

+18 -20
+2 -2
lib/csvt.ml
··· 427 427 428 428 (* {1 Streaming I/O} *) 429 429 430 - let read codec reader = 430 + let decode codec reader = 431 431 let s = Bytesrw.Bytes.Reader.to_string reader in 432 432 decode_string codec s 433 433 434 - let write codec rows writer = 434 + let encode codec rows writer = 435 435 let w s = Bytesrw.Bytes.Writer.write_string writer s in 436 436 let header = encode_header codec in 437 437 w (String.concat "," (Array.to_list header));
+6 -8
lib/csvt.mli
··· 7 7 8 8 Csvt defines a generalized algebraic datatype whose values denote 9 9 bidirectional maps between CSV data and the OCaml values of your choice, 10 - following the {e finally tagged} approach from 10 + based on the {e finally tagged} approach from 11 11 {{:https://github.com/dbuenzli/jsont/blob/main/paper/soup.tex}An alphabet 12 12 for your data soups} by Daniel Bünzli. Field-level and row-level codecs 13 13 share a single type {!t}. Row codecs are built declaratively using 14 - constructors and field accessors with the {!Row} builder. See 15 - {{:https://erratique.ch/repos/jsont/paper/soup.pdf}An alphabet for your data 16 - soups} for the technique. 14 + constructors and field accessors with the {!Row} builder. 17 15 18 16 {2 Quick Start} 19 17 ··· 203 201 204 202 (** {1:bytesrw Streaming I/O} *) 205 203 206 - val read : 'a t -> Bytesrw.Bytes.Reader.t -> ('a list, error) result 207 - (** [read t r] reads CSV data from reader [r] and decodes all rows. *) 204 + val decode : 'a t -> Bytesrw.Bytes.Reader.t -> ('a list, error) result 205 + (** [decode t r] reads CSV data from reader [r] and decodes all rows. *) 208 206 209 - val write : 'a t -> 'a list -> Bytesrw.Bytes.Writer.t -> unit 210 - (** [write t rows w] encodes [rows] as CSV and writes them to writer [w]. *) 207 + val encode : 'a t -> 'a list -> Bytesrw.Bytes.Writer.t -> unit 208 + (** [encode t rows w] encodes [rows] as CSV and writes them to writer [w]. *)
+10 -10
test/test_csvt.ml
··· 496 496 let test_read_simple () = 497 497 let csv = "x,y,label\n1.0,2.0,origin\n3.5,4.5,target\n" in 498 498 let reader = Bytesrw.Bytes.Reader.of_string csv in 499 - match Csvt.read point_codec reader with 499 + match Csvt.decode point_codec reader with 500 500 | Error e -> Alcotest.failf "read failed: %s" (Csvt.error_to_string e) 501 501 | Ok points -> 502 502 Alcotest.(check int) "count" 2 (List.length points); ··· 514 514 in 515 515 let buf = Buffer.create 64 in 516 516 let writer = Bytesrw.Bytes.Writer.of_buffer buf in 517 - Csvt.write point_codec points writer; 517 + Csvt.encode point_codec points writer; 518 518 Bytesrw.Bytes.Writer.write_eod writer; 519 519 let result = Buffer.contents buf in 520 520 (* Verify the header is present *) ··· 541 541 (* Write to buffer *) 542 542 let buf = Buffer.create 64 in 543 543 let writer = Bytesrw.Bytes.Writer.of_buffer buf in 544 - Csvt.write point_codec points writer; 544 + Csvt.encode point_codec points writer; 545 545 Bytesrw.Bytes.Writer.write_eod writer; 546 546 (* Read back *) 547 547 let reader = Bytesrw.Bytes.Reader.of_string (Buffer.contents buf) in 548 - match Csvt.read point_codec reader with 548 + match Csvt.decode point_codec reader with 549 549 | Error e -> Alcotest.failf "roundtrip failed: %s" (Csvt.error_to_string e) 550 550 | Ok points' -> 551 551 Alcotest.(check int) "count" 2 (List.length points'); ··· 566 566 in 567 567 let buf = Buffer.create 64 in 568 568 let writer = Bytesrw.Bytes.Writer.of_buffer buf in 569 - Csvt.write record_codec records writer; 569 + Csvt.encode record_codec records writer; 570 570 Bytesrw.Bytes.Writer.write_eod writer; 571 571 let result = Buffer.contents buf in 572 572 match Csvt.decode_string record_codec result with ··· 581 581 let test_write_empty () = 582 582 let buf = Buffer.create 64 in 583 583 let writer = Bytesrw.Bytes.Writer.of_buffer buf in 584 - Csvt.write point_codec [] writer; 584 + Csvt.encode point_codec [] writer; 585 585 Bytesrw.Bytes.Writer.write_eod writer; 586 586 let result = Buffer.contents buf in 587 587 (* Should still have a header *) ··· 756 756 (* Custom codec *) 757 757 Alcotest.test_case "col_map custom" `Quick test_col_map; 758 758 (* Streaming I/O *) 759 - Alcotest.test_case "read simple" `Quick test_read_simple; 760 - Alcotest.test_case "write simple" `Quick test_write_simple; 761 - Alcotest.test_case "write multi-type" `Quick test_write_multi_type; 762 - Alcotest.test_case "write empty" `Quick test_write_empty; 759 + Alcotest.test_case "decode reader" `Quick test_read_simple; 760 + Alcotest.test_case "encode writer" `Quick test_write_simple; 761 + Alcotest.test_case "encode writer multi-type" `Quick test_write_multi_type; 762 + Alcotest.test_case "encode writer empty" `Quick test_write_empty; 763 763 Alcotest.test_case "roundtrip streaming" `Quick test_roundtrip_streaming; 764 764 (* Introspection *) 765 765 Alcotest.test_case "col_names" `Quick test_col_names;