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.
Files changed (110) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +9 -0
  3. data/.travis.yml +15 -0
  4. data/CHANGELOG.md +71 -0
  5. data/Gemfile +6 -0
  6. data/License.txt +22 -0
  7. data/README.md +263 -0
  8. data/Rakefile +6 -0
  9. data/approvals.gemspec +29 -0
  10. data/bin/approvals +8 -0
  11. data/ext/mkrf_conf.rb +22 -0
  12. data/lib/approvals.rb +33 -0
  13. data/lib/approvals/approval.rb +144 -0
  14. data/lib/approvals/cli.rb +36 -0
  15. data/lib/approvals/configuration.rb +29 -0
  16. data/lib/approvals/dotfile.rb +33 -0
  17. data/lib/approvals/dsl.rb +7 -0
  18. data/lib/approvals/error.rb +21 -0
  19. data/lib/approvals/executable.rb +18 -0
  20. data/lib/approvals/extensions/rspec.rb +13 -0
  21. data/lib/approvals/extensions/rspec/dsl.rb +44 -0
  22. data/lib/approvals/filter.rb +45 -0
  23. data/lib/approvals/namers/default_namer.rb +20 -0
  24. data/lib/approvals/namers/directory_namer.rb +30 -0
  25. data/lib/approvals/namers/rspec_namer.rb +32 -0
  26. data/lib/approvals/reporters.rb +14 -0
  27. data/lib/approvals/reporters/diff_reporter/diffmerge_reporter.rb +18 -0
  28. data/lib/approvals/reporters/diff_reporter/opendiff_reporter.rb +18 -0
  29. data/lib/approvals/reporters/diff_reporter/tortoisediff_reporter.rb +18 -0
  30. data/lib/approvals/reporters/diff_reporter/vimdiff_reporter.rb +18 -0
  31. data/lib/approvals/reporters/filelauncher_reporter.rb +18 -0
  32. data/lib/approvals/reporters/first_working_reporter.rb +21 -0
  33. data/lib/approvals/reporters/image_reporter.rb +13 -0
  34. data/lib/approvals/reporters/image_reporter/html_image_reporter.rb +35 -0
  35. data/lib/approvals/reporters/image_reporter/image_magick_reporter.rb +20 -0
  36. data/lib/approvals/reporters/launcher.rb +49 -0
  37. data/lib/approvals/reporters/reporter.rb +30 -0
  38. data/lib/approvals/rspec.rb +4 -0
  39. data/lib/approvals/scrubber.rb +43 -0
  40. data/lib/approvals/system_command.rb +13 -0
  41. data/lib/approvals/version.rb +3 -0
  42. data/lib/approvals/writer.rb +39 -0
  43. data/lib/approvals/writers/array_writer.rb +17 -0
  44. data/lib/approvals/writers/binary_writer.rb +49 -0
  45. data/lib/approvals/writers/hash_writer.rb +20 -0
  46. data/lib/approvals/writers/html_writer.rb +15 -0
  47. data/lib/approvals/writers/json_writer.rb +31 -0
  48. data/lib/approvals/writers/text_writer.rb +21 -0
  49. data/lib/approvals/writers/xml_writer.rb +15 -0
  50. data/spec/approvals_spec.rb +172 -0
  51. data/spec/configuration_spec.rb +28 -0
  52. data/spec/dotfile_spec.rb +22 -0
  53. data/spec/executable_spec.rb +17 -0
  54. data/spec/extensions/rspec_approvals_spec.rb +105 -0
  55. data/spec/filter_spec.rb +123 -0
  56. data/spec/fixtures/approvals/approvals_custom_writer_verifies_a_complex_object.approved.txt +1 -0
  57. data/spec/fixtures/approvals/approvals_passes_approved_files_through_erb.approved.txt +1 -0
  58. data/spec/fixtures/approvals/approvals_passes_the_received_files_through_erb.approved.txt +1 -0
  59. data/spec/fixtures/approvals/approvals_supports_excluded_keys_option_also_supports_an_array_of_hashes.approved.json +10 -0
  60. data/spec/fixtures/approvals/approvals_supports_excluded_keys_option_supports_the_array_writer.approved.txt +1 -0
  61. data/spec/fixtures/approvals/approvals_supports_excluded_keys_option_supports_the_hash_writer.approved.txt +1 -0
  62. data/spec/fixtures/approvals/approvals_supports_excluded_keys_option_verifies_json_with_excluded_keys.approved.json +8 -0
  63. data/spec/fixtures/approvals/approvals_verifies_a_complex_object.approved.txt +1 -0
  64. data/spec/fixtures/approvals/approvals_verifies_a_hash.approved.txt +6 -0
  65. data/spec/fixtures/approvals/approvals_verifies_a_malformed_html_fragment.approved.html +11 -0
  66. data/spec/fixtures/approvals/approvals_verifies_a_string.approved.txt +1 -0
  67. data/spec/fixtures/approvals/approvals_verifies_an_array.approved.txt +4 -0
  68. data/spec/fixtures/approvals/approvals_verifies_an_array_as_json_when_format_is_set_to_json.approved.json +10 -0
  69. data/spec/fixtures/approvals/approvals_verifies_an_executable.approved.txt +1 -0
  70. data/spec/fixtures/approvals/approvals_verifies_html.approved.html +11 -0
  71. data/spec/fixtures/approvals/approvals_verifies_json.approved.json +7 -0
  72. data/spec/fixtures/approvals/approvals_verifies_json_and_is_newline_agnostic.approved.json +7 -0
  73. data/spec/fixtures/approvals/approvals_verifies_xml.approved.xml +9 -0
  74. data/spec/fixtures/approvals/verifications_a_string.approved.txt +1 -0
  75. data/spec/fixtures/approvals/verifies_a_complex_object.approved.txt +1 -0
  76. data/spec/fixtures/approvals/verifies_a_failure.approved.txt +1 -0
  77. data/spec/fixtures/approvals/verifies_a_failure_diff.approved.txt +1 -0
  78. data/spec/fixtures/approvals/verifies_a_string.approved.txt +1 -0
  79. data/spec/fixtures/approvals/verifies_an_array.approved.txt +4 -0
  80. data/spec/fixtures/approvals/verifies_an_executable.approved.txt +1 -0
  81. data/spec/fixtures/approvals/verifies_directory/a_complex_object.approved.txt +1 -0
  82. data/spec/fixtures/approvals/verifies_directory/a_failure.approved.txt +0 -0
  83. data/spec/fixtures/approvals/verifies_directory/a_failure_diff.approved.txt +0 -0
  84. data/spec/fixtures/approvals/verifies_directory/a_string.approved.txt +1 -0
  85. data/spec/fixtures/approvals/verifies_directory/an_array.approved.txt +4 -0
  86. data/spec/fixtures/approvals/verifies_directory/an_executable.approved.txt +1 -0
  87. data/spec/fixtures/approvals/verifies_directory/html.approved.html +11 -0
  88. data/spec/fixtures/approvals/verifies_directory/json.approved.json +7 -0
  89. data/spec/fixtures/approvals/verifies_directory/xml.approved.xml +9 -0
  90. data/spec/fixtures/approvals/verifies_html.approved.html +11 -0
  91. data/spec/fixtures/approvals/verifies_json.approved.json +7 -0
  92. data/spec/fixtures/approvals/verifies_xml.approved.xml +9 -0
  93. data/spec/fixtures/one.png +0 -0
  94. data/spec/fixtures/one.txt +1 -0
  95. data/spec/fixtures/two.png +0 -0
  96. data/spec/fixtures/two.txt +1 -0
  97. data/spec/namers/default_namer_spec.rb +37 -0
  98. data/spec/namers/directory_namer_spec.rb +31 -0
  99. data/spec/namers/rspec_namer_spec.rb +30 -0
  100. data/spec/namers_spec.rb +16 -0
  101. data/spec/reporters/first_working_reporter_spec.rb +30 -0
  102. data/spec/reporters/html_image_reporter_spec.rb +22 -0
  103. data/spec/reporters/image_magick_reporter_spec.rb +16 -0
  104. data/spec/reporters/launcher_spec.rb +24 -0
  105. data/spec/reporters/opendiff_reporter_spec.rb +15 -0
  106. data/spec/reporters/reporter_spec.rb +21 -0
  107. data/spec/scrubber_spec.rb +26 -0
  108. data/spec/spec_helper.rb +7 -0
  109. data/spec/system_command_spec.rb +13 -0
  110. 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
@@ -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
+ We have, I fear, confused power with <%= $what %>.
@@ -0,0 +1,10 @@
1
+ [
2
+ {
3
+ "object": {
4
+ "id": "<id>",
5
+ "created_at": "<date>",
6
+ "name": "test",
7
+ "deleted_at": null
8
+ }
9
+ }
10
+ ]
@@ -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,8 @@
1
+ {
2
+ "object": {
3
+ "id": "<id>",
4
+ "created_at": "<date>",
5
+ "name": "test",
6
+ "deleted_at": null
7
+ }
8
+ }
@@ -0,0 +1,6 @@
1
+ {
2
+ :meal => "breakfast"
3
+ :proteins => "90%"
4
+ :price => 38
5
+ :delicious => true
6
+ }
@@ -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,4 @@
1
+ [0] "abc"
2
+ [1] 123
3
+ [2] :zomg_fooooood
4
+ [3] ["cheese", "burger", "ribs", "steak", "bacon"]
@@ -0,0 +1,10 @@
1
+ [
2
+ {
3
+ "name": "Alice",
4
+ "age": 28
5
+ },
6
+ {
7
+ "name": "Bob",
8
+ "age": 22
9
+ }
10
+ ]
@@ -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,7 @@
1
+ {
2
+ "pet": {
3
+ "species": "turtle",
4
+ "color": "green",
5
+ "name": "Anthony"
6
+ }
7
+ }
@@ -0,0 +1,7 @@
1
+ {
2
+ "pet": {
3
+ "species": "turtle",
4
+ "color": "green",
5
+ "name": "Anthony"
6
+ }
7
+ }
@@ -0,0 +1,9 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <xml char="kiddo">
3
+ <node>
4
+ <content name="beatrice"/>
5
+ </node>
6
+ <node aliases="5">
7
+ <content/>
8
+ </node>
9
+ </xml>
@@ -0,0 +1 @@
1
+ "We have, I fear, confused power with greatness."
@@ -0,0 +1 @@
1
+ We have, I fear, confused power with greatness.
@@ -0,0 +1,4 @@
1
+ [0] "abc"
2
+ [1] 123
3
+ [2] :zomg_fooooood
4
+ [3] ["cheese", "burger", "ribs", "steak", "bacon"]
@@ -0,0 +1 @@
1
+ We have, I fear, confused power with greatness.
@@ -0,0 +1,4 @@
1
+ [0] "abc"
2
+ [1] 123
3
+ [2] :zomg_fooooood
4
+ [3] ["cheese", "burger", "ribs", "steak", "bacon"]
@@ -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,7 @@
1
+ {
2
+ "pet": {
3
+ "species": "turtle",
4
+ "color": "green",
5
+ "name": "Anthony"
6
+ }
7
+ }
@@ -0,0 +1,9 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <xml char="kiddo">
3
+ <node>
4
+ <content name="beatrice"/>
5
+ </node>
6
+ <node aliases="5">
7
+ <content/>
8
+ </node>
9
+ </xml>
@@ -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,7 @@
1
+ {
2
+ "pet": {
3
+ "species": "turtle",
4
+ "color": "green",
5
+ "name": "Anthony"
6
+ }
7
+ }