Skip to content

Commit 58d4c56

Browse files
authored
Merge pull request #149 from Julow/specify-deps-only-pkg
Specify required packages
2 parents e0a4def + eb31591 commit 58d4c56

File tree

14 files changed

+86
-20
lines changed

14 files changed

+86
-20
lines changed

bin/rule.ml

Lines changed: 23 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ let prepend_root r b = match r with
2929
| None -> b
3030
| Some r -> Filename.concat r b
3131

32-
let print_rule ~nd ~prelude ~md_file ~ml_files ~dirs ~root options =
32+
let print_rule ~nd ~prelude ~md_file ~ml_files ~dirs ~root ~requires options =
3333
let ml_files = String.Set.elements ml_files in
3434
let ml_files = List.map (prepend_root root) ml_files in
3535
let dirs = match root with
@@ -44,6 +44,10 @@ let print_rule ~nd ~prelude ~md_file ~ml_files ~dirs ~root options =
4444
let f (cpt, acc) _ = cpt + 1, ("y" ^ string_of_int cpt) :: acc in
4545
List.fold_left f (0, []) ml_files |> snd
4646
in
47+
let requires = String.Set.elements requires in
48+
let pp_package_deps fmt name =
49+
Fmt.pf fmt "\ (package %s)" name
50+
in
4751
let pp_ml_deps fmt (var_name, ml_file) =
4852
Fmt.pf fmt "\ (:%s %s)" var_name ml_file
4953
in
@@ -57,22 +61,17 @@ let print_rule ~nd ~prelude ~md_file ~ml_files ~dirs ~root options =
5761
let files = String.Set.of_list (List.map prelude_file prelude) in
5862
String.Set.elements files
5963
|> List.map (fun f -> Fmt.strf " %s" f)
60-
|> String.concat ~sep:"\n"
6164
in
6265
let root = match root with None -> "" | Some r -> Fmt.strf "--root=%s " r in
6366
let deps =
64-
let sep1 = if var_names <> [] then "\n" else "" in
65-
let sep2 = if dirs <> [] && prelude <> "" then "\n" else "" in
66-
let x = Fmt.strf "%a%s%a%s%s"
67-
Fmt.(list ~sep:(unit "\n") pp_ml_deps) (List.combine var_names ml_files)
68-
sep1
69-
Fmt.(list ~sep:(unit "\n") pp_dir_deps) dirs
70-
sep2
71-
prelude
72-
in
73-
match x with
74-
| "" -> ""
75-
| s -> "\n" ^ s
67+
match
68+
List.map (Fmt.to_to_string pp_package_deps) requires @
69+
List.map (Fmt.to_to_string pp_ml_deps) (List.combine var_names ml_files) @
70+
List.map (Fmt.to_to_string pp_dir_deps) dirs @
71+
prelude
72+
with
73+
| [] -> ""
74+
| s -> String.concat ~sep:"\n" ("" :: s)
7675
in
7776
let pp name arg =
7877
Fmt.pr
@@ -117,7 +116,11 @@ let run () md_file section direction prelude prelude_str root =
117116
let on_item acc = function
118117
| Mdx.Section _ | Text _ -> acc
119118
| Block b when active b ->
120-
let files, dirs, nd = acc in
119+
let files, dirs, nd, requires = acc in
120+
let requires =
121+
Mdx.Block.required_packages b
122+
|> List.fold_left (fun s e -> String.Set.add e s) requires
123+
in
121124
let nd = nd || match Mdx.Block.mode b with
122125
| `Non_det _ -> true
123126
| _ -> false
@@ -129,19 +132,20 @@ let run () md_file section direction prelude prelude_str root =
129132
|> String.Set.union source_trees
130133
in
131134
let files = add_opt (Mdx.Block.file b) files in
132-
files, dirs, nd
135+
files, dirs, nd, requires
133136
| Block _ -> acc
134137
in
135138
let on_file file_contents items =
136-
let ml_files, dirs, nd =
137-
List.fold_left on_item (String.Set.empty, String.Set.empty, false) items
139+
let ml_files, dirs, nd, requires =
140+
let empty = String.Set.empty in
141+
List.fold_left on_item (empty, empty, false, empty) items
138142
in
139143
let options =
140144
List.map (Fmt.to_to_string pp_prelude) prelude @
141145
List.map (Fmt.to_to_string pp_prelude_str) prelude_str @
142146
[Fmt.to_to_string pp_direction direction]
143147
in
144-
print_rule ~md_file ~prelude ~nd ~ml_files ~dirs ~root options;
148+
print_rule ~md_file ~prelude ~nd ~ml_files ~dirs ~root ~requires options;
145149
file_contents
146150
in
147151
Mdx.run md_file ~f:on_file;

lib/block.ml

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,7 @@ let labels = [
149149
`Label "skip" , [`None];
150150
`Label "non-deterministic", [`None; `Some "command"; `Some "output"];
151151
`Label "version" , [`Any];
152+
`Label "require-package" , [`Any];
152153
`Prefix "set-" , [`Any];
153154
`Prefix "unset-" , [`None];
154155
]
@@ -290,6 +291,15 @@ let unset_variables t =
290291
in
291292
List.map f (get_prefixed_labels t "unset-")
292293

294+
let required_packages t =
295+
let f = function
296+
| `Eq, "" ->
297+
Fmt.failwith "invalid `require-package` label value: requires a value"
298+
| `Eq, pkg -> pkg
299+
| _ -> Fmt.failwith "invalid `require-package` label value"
300+
in
301+
List.map f (get_labels t "require-package")
302+
293303
let value t = t.value
294304
let section t = t.section
295305
let header t = t.header

lib/block.mli

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,9 @@ val set_variables: t -> (string * string) list
9494
val unset_variables: t -> string list
9595
(** [unset_variable t] is the list of environment variable to unset *)
9696

97+
val required_packages: t -> string list
98+
(** [required_packages t] is the names of the required packages *)
99+
97100
val skip: t -> bool
98101
(** [skip t] is true iff [skip] is in the labels of [t]. *)
99102

test/dune

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -268,3 +268,12 @@
268268
(alias
269269
(name runtest)
270270
(action (diff dune_rules.inc dune_rules.inc.gen)))
271+
272+
(alias
273+
(name runtest)
274+
(deps (:x require/require-package.md)
275+
(package mdx)
276+
(package example_lib))
277+
(action (progn
278+
(run ocaml-mdx test --direction=infer-timestamp %{x})
279+
(diff? %{x} %{x}.corrected))))

test/labels.md.expected

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,6 @@ $ ls
66
```
77

88
```sh toto,dir=xxx
9-
>> "toto" is not a valid label or prefix. Valid labels are "dir", "source-tree", "file", "part", "env", "skip", "non-deterministic" and "version" and valid prefixes are "set-" and "unset-".
9+
>> "toto" is not a valid label or prefix. Valid labels are "dir", "source-tree", "file", "part", "env", "skip", "non-deterministic", "version" and "require-package" and valid prefixes are "set-" and "unset-".
1010
$ xxx
1111
```

test/require/dune-project

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
(lang dune 1.11)
2+
(name example_lib)

test/require/example_exe/dune

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
(executable
2+
(name example_exe)
3+
(public_name example_lib.exe)
4+
(libraries example_lib))
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
let () = Example_lib.hello ()

test/require/example_lib.opam

Whitespace-only changes.

test/require/example_lib/dune

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
(library
2+
(name example_lib)
3+
(public_name example_lib))

0 commit comments

Comments
 (0)