Skip to content

Commit d54c9f3

Browse files
Extract formatters to separate modules
1 parent 1cbafd1 commit d54c9f3

16 files changed

+377
-338
lines changed

.luacheckrc

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,14 @@
11
std = "min"
22
cache = true
3-
include_files = {"src", "spec/*.lua", "scripts/*.lua", "*.rockspec", "*.luacheckrc"}
4-
exclude_files = {"src/luacheck/vendor"}
3+
include_files = {"src", "spec", "scripts/*.lua", "*.rockspec", "*.luacheckrc"}
4+
exclude_files = {
5+
"src/luacheck/vendor",
6+
"spec/configs",
7+
"spec/folder",
8+
"spec/projects",
9+
"spec/rock",
10+
"spec/rock2",
11+
"spec/samples",
12+
}
513

614
files["src/luacheck/unicode_printability_boundaries.lua"].max_line_length = false

luacheck-scm-1.rockspec

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,11 @@ build = {
3434
["luacheck.expand_rockspec"] = "src/luacheck/expand_rockspec.lua",
3535
["luacheck.filter"] = "src/luacheck/filter.lua",
3636
["luacheck.format"] = "src/luacheck/format.lua",
37+
["luacheck.formatter.default"] = "src/luacheck/formatter/default.lua",
38+
["luacheck.formatter.junit"] = "src/luacheck/formatter/junit.lua",
39+
["luacheck.formatter.plain"] = "src/luacheck/formatter/plain.lua",
40+
["luacheck.formatter.tap"] = "src/luacheck/formatter/tap.lua",
41+
["luacheck.formatter.visual_studio"] = "src/luacheck/formatter/visual_studio.lua",
3742
["luacheck.fs"] = "src/luacheck/fs.lua",
3843
["luacheck.fs_adapter"] = "src/luacheck/fs_adapter.lua",
3944
["luacheck.globbing"] = "src/luacheck/globbing.lua",

spec/cli_spec.lua

Lines changed: 1 addition & 115 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ local utils = require "luacheck.utils"
22
local multithreading = require "luacheck.multithreading"
33
local helper = require "spec.helper"
44
local luacheck_cmd = helper.luacheck_command()
5+
local get_output = helper.get_output
56

67
local function quote(argument)
78
-- Do not worry about special characters too much, just quote.
@@ -15,27 +16,6 @@ local function norm_output(output)
1516
return output:gsub("(%w)/(%w)", "%1" .. utils.dir_sep .. "%2")
1617
end
1718

18-
local function get_output(command, wd, color)
19-
if color then
20-
if utils.is_windows and not os.getenv("ANSICON") then
21-
pending("uses terminal colors")
22-
end
23-
else
24-
command = "--no-color " .. command
25-
end
26-
27-
command = ("%s %s 2>&1"):format(helper.luacheck_command(wd), command)
28-
local handler = io.popen(command)
29-
local output = handler:read("*a")
30-
handler:close()
31-
32-
if color then
33-
return (output:gsub("\27%[%d+m", "\27"):gsub("\27+", "#"))
34-
else
35-
return output
36-
end
37-
end
38-
3919
local function get_exitcode(command)
4020
local nosql_db = package.config:sub(1, 1) == "/" and "/dev/null" or "NUL"
4121
local code51, _, code52plus = os.execute(luacheck_cmd.." "..command.." > "..nosql_db.." 2>&1")
@@ -890,100 +870,6 @@ Total: 5 warnings / 0 errors in 2 files
890870
]], get_output "spec/samples/good_code.lua spec/samples/bad_code.lua -qq --config=spec/configs/format_opts_config.luacheckrc")
891871
end)
892872

893-
it("has built-in TAP formatter", function()
894-
assert.equal([[
895-
1..8
896-
not ok 1 bad_file: I/O error
897-
ok 2 spec/samples/good_code.lua
898-
not ok 3 spec/samples/bad_code.lua:3:16: unused function 'helper'
899-
not ok 4 spec/samples/bad_code.lua:3:23: unused variable length argument
900-
not ok 5 spec/samples/bad_code.lua:7:10: setting non-standard global variable 'embrace'
901-
not ok 6 spec/samples/bad_code.lua:8:10: variable 'opt' was previously defined as an argument on line 7
902-
not ok 7 spec/samples/bad_code.lua:9:11: accessing undefined variable 'hepler'
903-
not ok 8 spec/samples/python_code.lua:1:6: expected '=' near '__future__'
904-
]], get_output "bad_file spec/samples/good_code.lua spec/samples/bad_code.lua spec/samples/python_code.lua --std=lua52 --formatter TAP --no-config")
905-
906-
assert.equal([[
907-
1..8
908-
not ok 1 bad_file: I/O error
909-
ok 2 spec/samples/good_code.lua
910-
not ok 3 spec/samples/bad_code.lua:3:16: (W211) unused function 'helper'
911-
not ok 4 spec/samples/bad_code.lua:3:23: (W212) unused variable length argument
912-
not ok 5 spec/samples/bad_code.lua:7:10: (W111) setting non-standard global variable 'embrace'
913-
not ok 6 spec/samples/bad_code.lua:8:10: (W412) variable 'opt' was previously defined as an argument on line 7
914-
not ok 7 spec/samples/bad_code.lua:9:11: (W113) accessing undefined variable 'hepler'
915-
not ok 8 spec/samples/python_code.lua:1:6: (E011) expected '=' near '__future__'
916-
]], get_output "bad_file spec/samples/good_code.lua spec/samples/bad_code.lua spec/samples/python_code.lua --std=lua52 --formatter TAP --codes --no-config")
917-
end)
918-
919-
it("has built-in JUnit formatter", function()
920-
assert.equal([[
921-
<?xml version="1.0" encoding="UTF-8"?>
922-
<testsuite name="Luacheck report" tests="8">
923-
<testcase name="bad_file" classname="bad_file">
924-
<error type="I/O error"/>
925-
</testcase>
926-
<testcase name="spec/samples/good_code.lua" classname="spec/samples/good_code.lua"/>
927-
<testcase name="spec/samples/bad_code.lua:1" classname="spec/samples/bad_code.lua">
928-
<failure type="W211" message="spec/samples/bad_code.lua:3:16: unused function &apos;helper&apos;"/>
929-
</testcase>
930-
<testcase name="spec/samples/bad_code.lua:2" classname="spec/samples/bad_code.lua">
931-
<failure type="W212" message="spec/samples/bad_code.lua:3:23: unused variable length argument"/>
932-
</testcase>
933-
<testcase name="spec/samples/bad_code.lua:3" classname="spec/samples/bad_code.lua">
934-
<failure type="W111" message="spec/samples/bad_code.lua:7:10: setting non-standard global variable &apos;embrace&apos;"/>
935-
</testcase>
936-
<testcase name="spec/samples/bad_code.lua:4" classname="spec/samples/bad_code.lua">
937-
<failure type="W412" message="spec/samples/bad_code.lua:8:10: variable &apos;opt&apos; was previously defined as an argument on line 7"/>
938-
</testcase>
939-
<testcase name="spec/samples/bad_code.lua:5" classname="spec/samples/bad_code.lua">
940-
<failure type="W113" message="spec/samples/bad_code.lua:9:11: accessing undefined variable &apos;hepler&apos;"/>
941-
</testcase>
942-
<testcase name="spec/samples/python_code.lua:1" classname="spec/samples/python_code.lua">
943-
<failure type="E011" message="spec/samples/python_code.lua:1:6: expected &apos;=&apos; near &apos;__future__&apos;"/>
944-
</testcase>
945-
</testsuite>
946-
]], get_output "bad_file spec/samples/good_code.lua spec/samples/bad_code.lua spec/samples/python_code.lua --std=lua52 --formatter JUnit --no-config")
947-
end)
948-
949-
it("has built-in Visual Studio aware formatter", function()
950-
assert.equal([[
951-
luacheck : fatal error F1: couldn't check bad_file: couldn't read: No such file or directory
952-
spec/samples/bad_code.lua(3,16) : warning W211: unused function 'helper'
953-
spec/samples/bad_code.lua(3,23) : warning W212: unused variable length argument
954-
spec/samples/bad_code.lua(7,10) : warning W111: setting non-standard global variable 'embrace'
955-
spec/samples/bad_code.lua(8,10) : warning W412: variable 'opt' was previously defined as an argument on line 7
956-
spec/samples/bad_code.lua(9,11) : warning W113: accessing undefined variable 'hepler'
957-
spec/samples/python_code.lua(1,6) : error E011: expected '=' near '__future__'
958-
]], get_output "bad_file spec/samples/good_code.lua spec/samples/bad_code.lua spec/samples/python_code.lua --std=lua52 --formatter visual_studio --no-config")
959-
end)
960-
961-
it("has built-in simple warning-per-line formatter", function()
962-
assert.equal("", get_output "spec/samples/good_code.lua --std=lua52 --formatter plain --no-config")
963-
964-
assert.equal([[
965-
spec/samples/bad_code.lua:3:16: unused function 'helper'
966-
spec/samples/bad_code.lua:3:23: unused variable length argument
967-
spec/samples/bad_code.lua:7:10: setting non-standard global variable 'embrace'
968-
spec/samples/bad_code.lua:8:10: variable 'opt' was previously defined as an argument on line 7
969-
spec/samples/bad_code.lua:9:11: accessing undefined variable 'hepler'
970-
spec/samples/python_code.lua:1:6: expected '=' near '__future__'
971-
]], get_output "spec/samples/good_code.lua spec/samples/bad_code.lua spec/samples/python_code.lua --std=lua52 --formatter plain --no-config")
972-
973-
assert.equal([[
974-
spec/samples/404.lua: I/O error (couldn't read: No such file or directory)
975-
]], get_output "spec/samples/404.lua --formatter plain --no-config")
976-
977-
assert.equal([[
978-
spec/samples/bad_code.lua:3:16: (W211) unused function 'helper'
979-
spec/samples/bad_code.lua:3:23: (W212) unused variable length argument
980-
spec/samples/bad_code.lua:7:10: (W111) setting non-standard global variable 'embrace'
981-
spec/samples/bad_code.lua:8:10: (W412) variable 'opt' was previously defined as an argument on line 7
982-
spec/samples/bad_code.lua:9:11: (W113) accessing undefined variable 'hepler'
983-
spec/samples/python_code.lua:1:6: (E011) expected '=' near '__future__'
984-
]], get_output "spec/samples/good_code.lua spec/samples/bad_code.lua spec/samples/python_code.lua --std=lua52 --formatter plain --codes --no-config")
985-
end)
986-
987873
it("provides version info", function()
988874
local output = get_output "--version"
989875
assert.truthy(output:match("^Luacheck: [%w%p ]+\nLua: [%w%p ]+\nArgparse: [%w%p ]+\nLuaLanes: [%w%p ]+\n$"))

spec/formatters/custom_formatter.lua

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
return function(report, file_names, options)
1+
return function(_, file_names, options)
22
return ([[
33
Files: %d
44
Formatter: %s

spec/formatters/junit_spec.lua

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
local get_output = require("spec.helper").get_output
2+
3+
-- luacheck: max line length 180
4+
describe("JUnit formatter", function()
5+
it("is built-in", function()
6+
assert.equal([[
7+
<?xml version="1.0" encoding="UTF-8"?>
8+
<testsuite name="Luacheck report" tests="8">
9+
<testcase name="bad_file" classname="bad_file">
10+
<error type="I/O error"/>
11+
</testcase>
12+
<testcase name="spec/samples/good_code.lua" classname="spec/samples/good_code.lua"/>
13+
<testcase name="spec/samples/bad_code.lua:1" classname="spec/samples/bad_code.lua">
14+
<failure type="W211" message="spec/samples/bad_code.lua:3:16: unused function &apos;helper&apos;"/>
15+
</testcase>
16+
<testcase name="spec/samples/bad_code.lua:2" classname="spec/samples/bad_code.lua">
17+
<failure type="W212" message="spec/samples/bad_code.lua:3:23: unused variable length argument"/>
18+
</testcase>
19+
<testcase name="spec/samples/bad_code.lua:3" classname="spec/samples/bad_code.lua">
20+
<failure type="W111" message="spec/samples/bad_code.lua:7:10: setting non-standard global variable &apos;embrace&apos;"/>
21+
</testcase>
22+
<testcase name="spec/samples/bad_code.lua:4" classname="spec/samples/bad_code.lua">
23+
<failure type="W412" message="spec/samples/bad_code.lua:8:10: variable &apos;opt&apos; was previously defined as an argument on line 7"/>
24+
</testcase>
25+
<testcase name="spec/samples/bad_code.lua:5" classname="spec/samples/bad_code.lua">
26+
<failure type="W113" message="spec/samples/bad_code.lua:9:11: accessing undefined variable &apos;hepler&apos;"/>
27+
</testcase>
28+
<testcase name="spec/samples/python_code.lua:1" classname="spec/samples/python_code.lua">
29+
<failure type="E011" message="spec/samples/python_code.lua:1:6: expected &apos;=&apos; near &apos;__future__&apos;"/>
30+
</testcase>
31+
</testsuite>
32+
]], get_output "bad_file spec/samples/good_code.lua spec/samples/bad_code.lua spec/samples/python_code.lua --std=lua52 --formatter JUnit --no-config")
33+
end)
34+
end)

spec/formatters/plain_spec.lua

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
local get_output = require("spec.helper").get_output
2+
3+
-- luacheck: max line length 180
4+
describe("Plain formatter", function()
5+
it("is built-in", function()
6+
assert.equal("", get_output "spec/samples/good_code.lua --std=lua52 --formatter plain --no-config")
7+
8+
assert.equal([[
9+
spec/samples/bad_code.lua:3:16: unused function 'helper'
10+
spec/samples/bad_code.lua:3:23: unused variable length argument
11+
spec/samples/bad_code.lua:7:10: setting non-standard global variable 'embrace'
12+
spec/samples/bad_code.lua:8:10: variable 'opt' was previously defined as an argument on line 7
13+
spec/samples/bad_code.lua:9:11: accessing undefined variable 'hepler'
14+
spec/samples/python_code.lua:1:6: expected '=' near '__future__'
15+
]], get_output "spec/samples/good_code.lua spec/samples/bad_code.lua spec/samples/python_code.lua --std=lua52 --formatter plain --no-config")
16+
17+
assert.equal([[
18+
spec/samples/404.lua: I/O error (couldn't read: No such file or directory)
19+
]], get_output "spec/samples/404.lua --formatter plain --no-config")
20+
21+
assert.equal([[
22+
spec/samples/bad_code.lua:3:16: (W211) unused function 'helper'
23+
spec/samples/bad_code.lua:3:23: (W212) unused variable length argument
24+
spec/samples/bad_code.lua:7:10: (W111) setting non-standard global variable 'embrace'
25+
spec/samples/bad_code.lua:8:10: (W412) variable 'opt' was previously defined as an argument on line 7
26+
spec/samples/bad_code.lua:9:11: (W113) accessing undefined variable 'hepler'
27+
spec/samples/python_code.lua:1:6: (E011) expected '=' near '__future__'
28+
]], get_output "spec/samples/good_code.lua spec/samples/bad_code.lua spec/samples/python_code.lua --std=lua52 --formatter plain --codes --no-config")
29+
end)
30+
end)

spec/formatters/tap_spec.lua

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
local get_output = require("spec.helper").get_output
2+
3+
-- luacheck: max line length 180
4+
describe("TAP formatter", function()
5+
it("is built-in", function()
6+
assert.equal([[
7+
1..8
8+
not ok 1 bad_file: I/O error
9+
ok 2 spec/samples/good_code.lua
10+
not ok 3 spec/samples/bad_code.lua:3:16: unused function 'helper'
11+
not ok 4 spec/samples/bad_code.lua:3:23: unused variable length argument
12+
not ok 5 spec/samples/bad_code.lua:7:10: setting non-standard global variable 'embrace'
13+
not ok 6 spec/samples/bad_code.lua:8:10: variable 'opt' was previously defined as an argument on line 7
14+
not ok 7 spec/samples/bad_code.lua:9:11: accessing undefined variable 'hepler'
15+
not ok 8 spec/samples/python_code.lua:1:6: expected '=' near '__future__'
16+
]], get_output "bad_file spec/samples/good_code.lua spec/samples/bad_code.lua spec/samples/python_code.lua --std=lua52 --formatter TAP --no-config")
17+
18+
assert.equal([[
19+
1..8
20+
not ok 1 bad_file: I/O error
21+
ok 2 spec/samples/good_code.lua
22+
not ok 3 spec/samples/bad_code.lua:3:16: (W211) unused function 'helper'
23+
not ok 4 spec/samples/bad_code.lua:3:23: (W212) unused variable length argument
24+
not ok 5 spec/samples/bad_code.lua:7:10: (W111) setting non-standard global variable 'embrace'
25+
not ok 6 spec/samples/bad_code.lua:8:10: (W412) variable 'opt' was previously defined as an argument on line 7
26+
not ok 7 spec/samples/bad_code.lua:9:11: (W113) accessing undefined variable 'hepler'
27+
not ok 8 spec/samples/python_code.lua:1:6: (E011) expected '=' near '__future__'
28+
]], get_output "bad_file spec/samples/good_code.lua spec/samples/bad_code.lua spec/samples/python_code.lua --std=lua52 --formatter TAP --codes --no-config")
29+
end)
30+
end)
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
local get_output = require("spec.helper").get_output
2+
3+
-- luacheck: max line length 180
4+
describe("Visual studio formatter", function()
5+
it("is built-in", function()
6+
assert.equal([[
7+
luacheck : fatal error F1: couldn't check bad_file: couldn't read: No such file or directory
8+
spec/samples/bad_code.lua(3,16) : warning W211: unused function 'helper'
9+
spec/samples/bad_code.lua(3,23) : warning W212: unused variable length argument
10+
spec/samples/bad_code.lua(7,10) : warning W111: setting non-standard global variable 'embrace'
11+
spec/samples/bad_code.lua(8,10) : warning W412: variable 'opt' was previously defined as an argument on line 7
12+
spec/samples/bad_code.lua(9,11) : warning W113: accessing undefined variable 'hepler'
13+
spec/samples/python_code.lua(1,6) : error E011: expected '=' near '__future__'
14+
]], get_output "bad_file spec/samples/good_code.lua spec/samples/bad_code.lua spec/samples/python_code.lua --std=lua52 --formatter visual_studio --no-config")
15+
end)
16+
end)

spec/helper.lua

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,4 +86,26 @@ function helper.get_stage_warnings(target_stage_name, source)
8686
return chstate.warnings
8787
end
8888

89+
function helper.get_output(command, wd, color)
90+
local utils = require "luacheck.utils" -- don't require in toplevel to collect coverage
91+
if color then
92+
if utils.is_windows and not os.getenv("ANSICON") then
93+
pending("uses terminal colors") -- luacheck: no global
94+
end
95+
else
96+
command = "--no-color " .. command
97+
end
98+
99+
command = ("%s %s 2>&1"):format(helper.luacheck_command(wd), command)
100+
local handler = io.popen(command)
101+
local output = handler:read("*a")
102+
handler:close()
103+
104+
if color then
105+
return (output:gsub("\27%[%d+m", "\27"):gsub("\27+", "#"))
106+
else
107+
return output
108+
end
109+
end
110+
89111
return helper

0 commit comments

Comments
 (0)