br-approvals 0.0.22
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gitignore +9 -0
- data/.travis.yml +15 -0
- data/CHANGELOG.md +71 -0
- data/Gemfile +6 -0
- data/License.txt +22 -0
- data/README.md +263 -0
- data/Rakefile +6 -0
- data/approvals.gemspec +29 -0
- data/bin/approvals +8 -0
- data/ext/mkrf_conf.rb +22 -0
- data/lib/approvals.rb +33 -0
- data/lib/approvals/approval.rb +144 -0
- data/lib/approvals/cli.rb +36 -0
- data/lib/approvals/configuration.rb +29 -0
- data/lib/approvals/dotfile.rb +33 -0
- data/lib/approvals/dsl.rb +7 -0
- data/lib/approvals/error.rb +21 -0
- data/lib/approvals/executable.rb +18 -0
- data/lib/approvals/extensions/rspec.rb +13 -0
- data/lib/approvals/extensions/rspec/dsl.rb +44 -0
- data/lib/approvals/filter.rb +45 -0
- data/lib/approvals/namers/default_namer.rb +20 -0
- data/lib/approvals/namers/directory_namer.rb +30 -0
- data/lib/approvals/namers/rspec_namer.rb +32 -0
- data/lib/approvals/reporters.rb +14 -0
- data/lib/approvals/reporters/diff_reporter/diffmerge_reporter.rb +18 -0
- data/lib/approvals/reporters/diff_reporter/opendiff_reporter.rb +18 -0
- data/lib/approvals/reporters/diff_reporter/tortoisediff_reporter.rb +18 -0
- data/lib/approvals/reporters/diff_reporter/vimdiff_reporter.rb +18 -0
- data/lib/approvals/reporters/filelauncher_reporter.rb +18 -0
- data/lib/approvals/reporters/first_working_reporter.rb +21 -0
- data/lib/approvals/reporters/image_reporter.rb +13 -0
- data/lib/approvals/reporters/image_reporter/html_image_reporter.rb +35 -0
- data/lib/approvals/reporters/image_reporter/image_magick_reporter.rb +20 -0
- data/lib/approvals/reporters/launcher.rb +49 -0
- data/lib/approvals/reporters/reporter.rb +30 -0
- data/lib/approvals/rspec.rb +4 -0
- data/lib/approvals/scrubber.rb +43 -0
- data/lib/approvals/system_command.rb +13 -0
- data/lib/approvals/version.rb +3 -0
- data/lib/approvals/writer.rb +39 -0
- data/lib/approvals/writers/array_writer.rb +17 -0
- data/lib/approvals/writers/binary_writer.rb +49 -0
- data/lib/approvals/writers/hash_writer.rb +20 -0
- data/lib/approvals/writers/html_writer.rb +15 -0
- data/lib/approvals/writers/json_writer.rb +31 -0
- data/lib/approvals/writers/text_writer.rb +21 -0
- data/lib/approvals/writers/xml_writer.rb +15 -0
- data/spec/approvals_spec.rb +172 -0
- data/spec/configuration_spec.rb +28 -0
- data/spec/dotfile_spec.rb +22 -0
- data/spec/executable_spec.rb +17 -0
- data/spec/extensions/rspec_approvals_spec.rb +105 -0
- data/spec/filter_spec.rb +123 -0
- data/spec/fixtures/approvals/approvals_custom_writer_verifies_a_complex_object.approved.txt +1 -0
- data/spec/fixtures/approvals/approvals_passes_approved_files_through_erb.approved.txt +1 -0
- data/spec/fixtures/approvals/approvals_passes_the_received_files_through_erb.approved.txt +1 -0
- data/spec/fixtures/approvals/approvals_supports_excluded_keys_option_also_supports_an_array_of_hashes.approved.json +10 -0
- data/spec/fixtures/approvals/approvals_supports_excluded_keys_option_supports_the_array_writer.approved.txt +1 -0
- data/spec/fixtures/approvals/approvals_supports_excluded_keys_option_supports_the_hash_writer.approved.txt +1 -0
- data/spec/fixtures/approvals/approvals_supports_excluded_keys_option_verifies_json_with_excluded_keys.approved.json +8 -0
- data/spec/fixtures/approvals/approvals_verifies_a_complex_object.approved.txt +1 -0
- data/spec/fixtures/approvals/approvals_verifies_a_hash.approved.txt +6 -0
- data/spec/fixtures/approvals/approvals_verifies_a_malformed_html_fragment.approved.html +11 -0
- data/spec/fixtures/approvals/approvals_verifies_a_string.approved.txt +1 -0
- data/spec/fixtures/approvals/approvals_verifies_an_array.approved.txt +4 -0
- data/spec/fixtures/approvals/approvals_verifies_an_array_as_json_when_format_is_set_to_json.approved.json +10 -0
- data/spec/fixtures/approvals/approvals_verifies_an_executable.approved.txt +1 -0
- data/spec/fixtures/approvals/approvals_verifies_html.approved.html +11 -0
- data/spec/fixtures/approvals/approvals_verifies_json.approved.json +7 -0
- data/spec/fixtures/approvals/approvals_verifies_json_and_is_newline_agnostic.approved.json +7 -0
- data/spec/fixtures/approvals/approvals_verifies_xml.approved.xml +9 -0
- data/spec/fixtures/approvals/verifications_a_string.approved.txt +1 -0
- data/spec/fixtures/approvals/verifies_a_complex_object.approved.txt +1 -0
- data/spec/fixtures/approvals/verifies_a_failure.approved.txt +1 -0
- data/spec/fixtures/approvals/verifies_a_failure_diff.approved.txt +1 -0
- data/spec/fixtures/approvals/verifies_a_string.approved.txt +1 -0
- data/spec/fixtures/approvals/verifies_an_array.approved.txt +4 -0
- data/spec/fixtures/approvals/verifies_an_executable.approved.txt +1 -0
- data/spec/fixtures/approvals/verifies_directory/a_complex_object.approved.txt +1 -0
- data/spec/fixtures/approvals/verifies_directory/a_failure.approved.txt +0 -0
- data/spec/fixtures/approvals/verifies_directory/a_failure_diff.approved.txt +0 -0
- data/spec/fixtures/approvals/verifies_directory/a_string.approved.txt +1 -0
- data/spec/fixtures/approvals/verifies_directory/an_array.approved.txt +4 -0
- data/spec/fixtures/approvals/verifies_directory/an_executable.approved.txt +1 -0
- data/spec/fixtures/approvals/verifies_directory/html.approved.html +11 -0
- data/spec/fixtures/approvals/verifies_directory/json.approved.json +7 -0
- data/spec/fixtures/approvals/verifies_directory/xml.approved.xml +9 -0
- data/spec/fixtures/approvals/verifies_html.approved.html +11 -0
- data/spec/fixtures/approvals/verifies_json.approved.json +7 -0
- data/spec/fixtures/approvals/verifies_xml.approved.xml +9 -0
- data/spec/fixtures/one.png +0 -0
- data/spec/fixtures/one.txt +1 -0
- data/spec/fixtures/two.png +0 -0
- data/spec/fixtures/two.txt +1 -0
- data/spec/namers/default_namer_spec.rb +37 -0
- data/spec/namers/directory_namer_spec.rb +31 -0
- data/spec/namers/rspec_namer_spec.rb +30 -0
- data/spec/namers_spec.rb +16 -0
- data/spec/reporters/first_working_reporter_spec.rb +30 -0
- data/spec/reporters/html_image_reporter_spec.rb +22 -0
- data/spec/reporters/image_magick_reporter_spec.rb +16 -0
- data/spec/reporters/launcher_spec.rb +24 -0
- data/spec/reporters/opendiff_reporter_spec.rb +15 -0
- data/spec/reporters/reporter_spec.rb +21 -0
- data/spec/scrubber_spec.rb +26 -0
- data/spec/spec_helper.rb +7 -0
- data/spec/system_command_spec.rb +13 -0
- metadata +196 -0
@@ -0,0 +1,105 @@
|
|
1
|
+
require 'approvals/rspec'
|
2
|
+
|
3
|
+
shared_context 'verify examples' do
|
4
|
+
specify "a string" do
|
5
|
+
verify do
|
6
|
+
"We have, I fear, confused power with greatness."
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
specify "an array" do
|
11
|
+
verify do
|
12
|
+
array = [
|
13
|
+
"abc",
|
14
|
+
123,
|
15
|
+
:zomg_fooooood,
|
16
|
+
%w(cheese burger ribs steak bacon)
|
17
|
+
]
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
specify "a complex object" do
|
22
|
+
verify do
|
23
|
+
hello = Object.new
|
24
|
+
def hello.to_s
|
25
|
+
"Hello, World!"
|
26
|
+
end
|
27
|
+
|
28
|
+
def hello.inspect
|
29
|
+
"#<The World Says: Hello!>"
|
30
|
+
end
|
31
|
+
|
32
|
+
hello
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
specify "html" do
|
37
|
+
verify :format => :html do
|
38
|
+
html = <<-HTML
|
39
|
+
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "DTD/xhtml1-strict.dtd"><html><head><title>Approval</title></head><body><h1>An Approval</h1><p>It has a paragraph</p></body></html>
|
40
|
+
HTML
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
specify "xml" do
|
45
|
+
verify :format => :xml do
|
46
|
+
xml = "<xml char=\"kiddo\"><node><content name='beatrice' /></node><node aliases='5'><content /></node></xml>"
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
specify "json" do
|
51
|
+
verify :format => :json do
|
52
|
+
json = '{"pet":{"species":"turtle","color":"green","name":"Anthony"}}'
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
specify "an executable" do
|
57
|
+
verify do
|
58
|
+
executable('SELECT 1') do |command|
|
59
|
+
puts "your slip is showing (#{command})"
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
specify "a failure" do
|
65
|
+
expect { verify { 'no.' } }.to raise_error(Approvals::ApprovalError)
|
66
|
+
end
|
67
|
+
|
68
|
+
specify "a failure diff" do
|
69
|
+
::RSpec.configuration.diff_on_approval_failure = true
|
70
|
+
expect(::RSpec::Expectations).to receive(:fail_with)
|
71
|
+
verify { 'no.' }
|
72
|
+
::RSpec.configuration.diff_on_approval_failure = false
|
73
|
+
end
|
74
|
+
|
75
|
+
specify "a failure diff", :diff_on_approval_failure => true do
|
76
|
+
expect(::RSpec::Expectations).to receive(:fail_with)
|
77
|
+
verify { 'no.' }
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
RSpec.configure do |c|
|
82
|
+
c.after :each do
|
83
|
+
c.approvals_namer_class = nil
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
describe "Verifies" do
|
88
|
+
before :each do
|
89
|
+
RSpec.configure do |c|
|
90
|
+
c.approvals_namer_class = Approvals::Namers::RSpecNamer
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
include_context 'verify examples'
|
95
|
+
end
|
96
|
+
|
97
|
+
describe "Verifies (directory)" do
|
98
|
+
before :each do
|
99
|
+
RSpec.configure do |c|
|
100
|
+
c.approvals_namer_class = Approvals::Namers::DirectoryNamer
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
include_context 'verify examples'
|
105
|
+
end
|
data/spec/filter_spec.rb
ADDED
@@ -0,0 +1,123 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
|
4
|
+
describe Approvals::Filter do
|
5
|
+
it "When no filters were supplied, it leaves the h_or_a alone" do
|
6
|
+
filter = Approvals::Filter.new({})
|
7
|
+
|
8
|
+
input = {some: 'hash'}
|
9
|
+
output = filter.apply(input)
|
10
|
+
|
11
|
+
expect(input).to equal output
|
12
|
+
end
|
13
|
+
|
14
|
+
it "replaces fields which match a filter" do
|
15
|
+
filter = Approvals::Filter.new({foo: /^_?foo$/})
|
16
|
+
input = {
|
17
|
+
foo: 'bar13',
|
18
|
+
_foo: 'bar27',
|
19
|
+
nonfoo: 'bar',
|
20
|
+
}
|
21
|
+
|
22
|
+
output = filter.apply(input)
|
23
|
+
|
24
|
+
expect(output).to eq({
|
25
|
+
foo: '<foo>',
|
26
|
+
_foo: '<foo>',
|
27
|
+
nonfoo: 'bar',
|
28
|
+
})
|
29
|
+
end
|
30
|
+
|
31
|
+
it "a filter matches, but the value is nil, it does not get replaced" do
|
32
|
+
filter = Approvals::Filter.new({foo: /^foo$/})
|
33
|
+
input = {
|
34
|
+
foo: nil,
|
35
|
+
nonfoo: 'bar',
|
36
|
+
}
|
37
|
+
|
38
|
+
output = filter.apply(input)
|
39
|
+
|
40
|
+
expect(output).to eq({
|
41
|
+
foo: nil,
|
42
|
+
nonfoo: 'bar',
|
43
|
+
})
|
44
|
+
end
|
45
|
+
it "a filter matches, and the value is falsey, but not nil, it gets replaced" do
|
46
|
+
filter = Approvals::Filter.new({foo: /^foo$/})
|
47
|
+
input = {
|
48
|
+
foo: false,
|
49
|
+
nonfoo: 'bar',
|
50
|
+
}
|
51
|
+
|
52
|
+
output = filter.apply(input)
|
53
|
+
|
54
|
+
expect(output).to eq({
|
55
|
+
foo: "<foo>",
|
56
|
+
nonfoo: 'bar',
|
57
|
+
})
|
58
|
+
end
|
59
|
+
|
60
|
+
it "filters recursively in hashes and array" do
|
61
|
+
filter = Approvals::Filter.new({foo: /^foo$/})
|
62
|
+
input = {
|
63
|
+
foo: 'bar124',
|
64
|
+
foolist: [{foo: 'bar 145', bar: 'foo'}, 'foobar'],
|
65
|
+
nonfoo: 'bar',
|
66
|
+
}
|
67
|
+
|
68
|
+
output = filter.apply(input)
|
69
|
+
|
70
|
+
expect(output).to eq({
|
71
|
+
foo: '<foo>',
|
72
|
+
foolist: [{foo: '<foo>', bar: 'foo'}, 'foobar'],
|
73
|
+
nonfoo: 'bar',
|
74
|
+
})
|
75
|
+
end
|
76
|
+
|
77
|
+
it "filters array keys" do
|
78
|
+
filter = Approvals::Filter.new({foolist: /^foolist$/})
|
79
|
+
input = {
|
80
|
+
foo: 'bar124',
|
81
|
+
foolist: [{foo: 'bar 145', bar: 'foo'}, 'foobar'],
|
82
|
+
nonfoo: 'bar',
|
83
|
+
}
|
84
|
+
|
85
|
+
output = filter.apply(input)
|
86
|
+
|
87
|
+
expect(output).to eq({
|
88
|
+
foo: 'bar124',
|
89
|
+
foolist: '<foolist>',
|
90
|
+
nonfoo: 'bar',
|
91
|
+
})
|
92
|
+
end
|
93
|
+
|
94
|
+
it "filters hash keys" do
|
95
|
+
filter = Approvals::Filter.new({foohash: /^foohash$/})
|
96
|
+
input = {
|
97
|
+
foo: 'bar124',
|
98
|
+
foohash: {foo: 'bar 145', barlist: ['foo', 'bar']},
|
99
|
+
nonfoo: 'bar',
|
100
|
+
}
|
101
|
+
|
102
|
+
output = filter.apply(input)
|
103
|
+
|
104
|
+
expect(output).to eq({
|
105
|
+
foo: 'bar124',
|
106
|
+
foohash: '<foohash>',
|
107
|
+
nonfoo: 'bar',
|
108
|
+
})
|
109
|
+
end
|
110
|
+
|
111
|
+
it "takes the last applicable filter" do
|
112
|
+
filter = Approvals::Filter.new({foo: /^foo/, bar: /bar$/})
|
113
|
+
input = {
|
114
|
+
foobar: 'baz',
|
115
|
+
}
|
116
|
+
|
117
|
+
output = filter.apply(input)
|
118
|
+
|
119
|
+
expect(output).to eq({
|
120
|
+
foobar: '<bar>',
|
121
|
+
})
|
122
|
+
end
|
123
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
["#", "<", ":", ">"]
|
@@ -0,0 +1 @@
|
|
1
|
+
We have, I fear, confused power with <%= $what %>.
|
@@ -0,0 +1 @@
|
|
1
|
+
<%
|
@@ -0,0 +1 @@
|
|
1
|
+
[0] {:object=>{:id=>"<id>", :created_at=>"<date>", :name=>"test", :deleted_at=>nil}}
|
@@ -0,0 +1 @@
|
|
1
|
+
[0] [:object, {:id=>"<id>", :created_at=>"<date>", :name=>"test", :deleted_at=>nil}]
|
@@ -0,0 +1 @@
|
|
1
|
+
Hello, World!
|
@@ -0,0 +1,11 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html xmlns="http://www.w3.org/1999/xhtml">
|
3
|
+
<head>
|
4
|
+
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
|
5
|
+
<title>Hoi</title>
|
6
|
+
<script async="" defer="defer" src="http://foo.com/bar.js"></script>
|
7
|
+
</head>
|
8
|
+
<body>
|
9
|
+
<h1>yo</h1>
|
10
|
+
</body>
|
11
|
+
</html>
|
@@ -0,0 +1 @@
|
|
1
|
+
We have, I fear, confused power with greatness.
|
@@ -0,0 +1 @@
|
|
1
|
+
SELECT 1
|
@@ -0,0 +1,11 @@
|
|
1
|
+
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "DTD/xhtml1-strict.dtd">
|
2
|
+
<html xmlns="http://www.w3.org/1999/xhtml">
|
3
|
+
<head>
|
4
|
+
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
|
5
|
+
<title>Approval</title>
|
6
|
+
</head>
|
7
|
+
<body>
|
8
|
+
<h1>An Approval</h1>
|
9
|
+
<p>It has a paragraph</p>
|
10
|
+
</body>
|
11
|
+
</html>
|
@@ -0,0 +1 @@
|
|
1
|
+
"We have, I fear, confused power with greatness."
|
@@ -0,0 +1 @@
|
|
1
|
+
Hello, World!
|
@@ -0,0 +1 @@
|
|
1
|
+
yes.
|
@@ -0,0 +1 @@
|
|
1
|
+
yes.
|
@@ -0,0 +1 @@
|
|
1
|
+
We have, I fear, confused power with greatness.
|
@@ -0,0 +1 @@
|
|
1
|
+
SELECT 1
|
@@ -0,0 +1 @@
|
|
1
|
+
Hello, World!
|
File without changes
|
File without changes
|
@@ -0,0 +1 @@
|
|
1
|
+
We have, I fear, confused power with greatness.
|
@@ -0,0 +1 @@
|
|
1
|
+
SELECT 1
|
@@ -0,0 +1,11 @@
|
|
1
|
+
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "DTD/xhtml1-strict.dtd">
|
2
|
+
<html xmlns="http://www.w3.org/1999/xhtml">
|
3
|
+
<head>
|
4
|
+
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
|
5
|
+
<title>Approval</title>
|
6
|
+
</head>
|
7
|
+
<body>
|
8
|
+
<h1>An Approval</h1>
|
9
|
+
<p>It has a paragraph</p>
|
10
|
+
</body>
|
11
|
+
</html>
|
@@ -0,0 +1,11 @@
|
|
1
|
+
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "DTD/xhtml1-strict.dtd">
|
2
|
+
<html xmlns="http://www.w3.org/1999/xhtml">
|
3
|
+
<head>
|
4
|
+
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
|
5
|
+
<title>Approval</title>
|
6
|
+
</head>
|
7
|
+
<body>
|
8
|
+
<h1>An Approval</h1>
|
9
|
+
<p>It has a paragraph</p>
|
10
|
+
</body>
|
11
|
+
</html>
|