Skip to content

Commit 52fe925

Browse files
authored
Merge pull request #7 from cknitt/feature/allow-files-and-directories
Allow multiple files and/or directories to be passed on the command line
2 parents 80521c9 + 9f8201d commit 52fe925

File tree

4 files changed

+52
-20
lines changed

4 files changed

+52
-20
lines changed

bin/Extract.re

Lines changed: 18 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -20,25 +20,26 @@ let iterator =
2020

2121
let extractMessages = ast => iterator.structure(iterator, Obj.magic(ast));
2222

23-
let processReasonFile = filename => {
24-
let channel = open_in_bin(filename);
23+
let processReasonFile = path => {
24+
let channel = open_in_bin(path);
2525
let lexbuf = Lexing.from_channel(channel);
2626
let ast = Reason_toolchain.RE.implementation(lexbuf);
2727
close_in(channel);
2828
extractMessages(ast);
2929
};
3030

31-
let rec processDirectory = dir =>
32-
Sys.readdir(dir)
33-
|> Array.iter(filename => {
34-
let path = Filename.concat(dir, filename);
35-
36-
if (Sys.is_directory(path)) {
37-
processDirectory(path);
38-
} else if (Filename.extension(filename) == ".re") {
39-
processReasonFile(path);
40-
};
41-
});
31+
let rec processPath = path => {
32+
if (! Sys.file_exists(path)) {
33+
Printf.eprintf("Error: file or directory does not exist: %s\n", path);
34+
exit(1);
35+
};
36+
37+
if (Sys.is_directory(path)) {
38+
Sys.readdir(path) |> Array.iter(filename => processPath(Filename.concat(path, filename)));
39+
} else if (Filename.extension(path) == ".re") {
40+
processReasonFile(path);
41+
};
42+
};
4243

4344
let outputJson = () => {
4445
let sortedJsonObjects =
@@ -63,13 +64,13 @@ let showVersion = () => {
6364

6465
let args = [("-v", Arg.Unit(showVersion), "shows the program version")];
6566

66-
let usage = "Usage: " ++ Sys.argv[0] ++ " directory ...";
67+
let usage = "Usage: " ++ Sys.argv[0] ++ " [path...]";
6768

6869
Arg.parse(args, processInputFilename, usage);
6970

7071
switch (inputFilenames^) {
7172
| [] => Arg.usage(args, usage)
72-
| filenames => filenames |> List.rev |> List.iter(processDirectory)
73+
| filenames =>
74+
filenames |> List.rev |> List.iter(processPath);
75+
outputJson();
7376
};
74-
75-
outputJson();

tests/commandLineOptions.test.js

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,19 @@
11
const CliTest = require("command-line-test");
22

3+
let usage =
4+
"Usage: ../_build/default/bin/Extract.exe [path...]\n -v shows the program version\n -help Display this list of options\n --help Display this list of options";
5+
36
describe("test", function() {
7+
it("shows usage when run without params", function*() {
8+
const cliTest = new CliTest();
9+
const res = yield cliTest.exec("../_build/default/bin/Extract.exe");
10+
expect(res.stderr).toEqual(usage);
11+
});
12+
413
it("shows help", function*() {
514
const cliTest = new CliTest();
615
const res = yield cliTest.exec("../_build/default/bin/Extract.exe -help");
7-
expect(res.stdout).toEqual(
8-
"Usage: ../_build/default/bin/Extract.exe directory ...\n -v shows the program version\n -help Display this list of options\n --help Display this list of options"
9-
);
16+
expect(res.stdout).toEqual(usage);
1017
});
1118

1219
it("shows version", function*() {
File renamed without changes.

tests/extractionPartial.test.js

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
const CliTest = require("command-line-test");
2+
3+
const expectedJson = [
4+
{ id: "test1.msg2.1", defaultMessage: "This is message 2.1" },
5+
{
6+
id: "test1.msg2.2",
7+
defaultMessage: "This is message 2.2",
8+
description: "Description for message 2.2"
9+
},
10+
{
11+
id: "test2.msg1.1",
12+
defaultMessage: "This is message 2.1.1"
13+
}
14+
];
15+
16+
describe("test", function() {
17+
it("extracts messages", function*() {
18+
const cliTest = new CliTest();
19+
const res = yield cliTest.exec(
20+
"../_build/default/bin/Extract.exe test1/subdir/Test_1_2.re test2"
21+
);
22+
expect(JSON.parse(res.stdout)).toEqual(expectedJson);
23+
});
24+
});

0 commit comments

Comments
 (0)