aboutsummaryrefslogtreecommitdiff
path: root/tests/confLoader.ml
blob: 266ff3398a7a9ac2778d0da281c0f112c085c812 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
open StdLabels

(** Read the configuration in toml and return the internal representation *)
let load : string -> ImportConf.Syntax.t =
 fun content ->
  Otoml.Parser.from_string content |> ImportConf.t_of_toml |> Result.get_ok

let conf =
  load
    {|version = 1

[source]
  file = "source.xlsx"
  name = "source"

[externals.other]
  intern_key = ":A"
  file = "other.xlsx"
  extern_key = ":C"
  allow_missing = false

[externals.last_file]
  intern_key = ":other.A"
  file = "last.xlsx"
  extern_key = ":C"
  allow_missing = true 

[sheet]
  columns = [
    ":A ^ '_'",
   ":B", 
   ":last_file.E", 
  ]|}

let external_table_source =
  ImportDataTypes.Table.{ file = "source.xlsx"; tab = 1; name = "source" }

let external_table_other =
  ImportDataTypes.Table.{ file = "other.xlsx"; tab = 1; name = "other" }

let external_other =
  ImportConf.Syntax.
    {
      intern_key = Path { alias = None; column = 1 };
      target = external_table_other;
      extern_key = Path 3;
      allow_missing = false;
      match_rule = None;
    }

let external_table_last =
  ImportDataTypes.Table.{ file = "last.xlsx"; tab = 1; name = "last_file" }

let external_last =
  ImportConf.Syntax.
    {
      intern_key = Path { alias = Some "other"; column = 1 };
      target = external_table_last;
      extern_key = Path 3;
      allow_missing = true;
      match_rule = None;
    }

let show_source (source : ImportDataTypes.Table.t) =
  Printf.sprintf "%s:%d" source.ImportDataTypes.Table.file
    source.ImportDataTypes.Table.tab

(*
 * Compare two external sources
 *)

let show_sources sources =
  let b = Buffer.create 16 in
  Buffer.add_string b "[";
  List.iter sources ~f:(fun source ->
      Buffer.add_string b (show_source source);
      Buffer.add_string b ",");

  let len = Buffer.length b in
  if len > 1 then Buffer.truncate b (len - 1);
  Buffer.add_string b "]";

  Buffer.contents b

and cmp_source : ImportDataTypes.Table.t -> ImportDataTypes.Table.t -> bool =
 fun s1 s2 ->
  String.equal s1.ImportDataTypes.Table.name s2.ImportDataTypes.Table.name
  && String.equal s1.ImportDataTypes.Table.file s2.ImportDataTypes.Table.file
  && s1.ImportDataTypes.Table.tab = s2.ImportDataTypes.Table.tab

let cmp_list : ('a -> 'a -> bool) -> 'a list -> 'a list -> bool =
 fun cmp elems1 elems2 -> List.for_all2 ~f:cmp elems1 elems2

(*
 * Compare keys in the dependencies
 *)

let key_printer : ImportAnalyser.Dependency.key -> string =
 fun { name; expression; _ } ->
  let path_name =
    let buffer = Buffer.create 16 in
    ImportExpression.Headers.headers_of_expression buffer
      (fun col buffer ->
        Buffer.add_string buffer (ImportCSV.Csv.column_to_string col))
      expression;
    Buffer.contents buffer
  in
  Printf.sprintf "%s, %s" name path_name

and key_cmp a b =
  0
  = ImportExpression.T.cmp
      (fun a b -> a - b)
      a.ImportAnalyser.Dependency.expression
      b.ImportAnalyser.Dependency.expression

let keys_printer : ImportAnalyser.Dependency.key list -> string =
 fun contents ->
  let b = Buffer.create 16 in
  List.iter contents ~f:(fun v -> Buffer.add_string b (key_printer v));
  Buffer.contents b

(*
 * Represents externals
 *)

let pp_externals : ImportConf.Syntax.extern list -> string =
 fun ext -> ImportConf.Syntax.toml_of_externs ext |> Otoml.Printer.to_string