rspec_approvals 0.9.1 → 0.9.3

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ee9d20fbefe8c582b91491fc68d138f968d2af93a2ebddadc1fbcec28cd4825b
4
- data.tar.gz: 2ef26b7fa67d9bce2136d7ccb03c3c3c02984152b366eac600c6e870f3586b31
3
+ metadata.gz: c3ff469b7a7e1566249ed3c1c56e11121907a6a3866ad6dd5b9d754167bc8409
4
+ data.tar.gz: 63aa1daaafb280caee02bac81513adfaa2a49904c0efe7c0e8413ff47d58520e
5
5
  SHA512:
6
- metadata.gz: 4e2fb14501ecfc75f57c4c81b126d4b51d4a7339a014aab4a9ddbf83c86af3839fc58f83d088f42e85cd33fc858239a67247ebe0670539364c2953988b2d2d69
7
- data.tar.gz: 11c4cd21df4ca1295cb6d1087d81c9e70e1717f2015037e21aca7214a99a77a1f989468655e6c01ad76795c822bd6935c4abbd846dce410e60e6e0c8531496fa
6
+ metadata.gz: f7acae848e872e4dce5f9a3ba712c12cec05b0fdba9103c7959c9ee9eb5989d67ee34e3ad2c1c6122d8897518eb0ef533a338466ff2e8bf9f3282b8b108b1472
7
+ data.tar.gz: 4b8adb50942d8e4c4d2e5da57d8624122d9dffd72f02ad5f246d2535ca26eff3dfd827ea85f1dd35b6d30954be79eb7070ff9f3f9700cdba0f9452bf70fc46c7
@@ -3,7 +3,6 @@ require 'colsole'
3
3
  require 'diffy'
4
4
 
5
5
  module RSpecApprovals
6
-
7
6
  # Handles user input and interactive approvals
8
7
  class ApprovalHandler
9
8
  include Colsole
@@ -22,7 +21,7 @@ module RSpecApprovals
22
21
  private
23
22
 
24
23
  def prompt_user
25
- response = auto_approve? ? :approve : get_response
24
+ response = auto_approve? ? :approve : user_response
26
25
 
27
26
  case response
28
27
 
@@ -43,38 +42,38 @@ module RSpecApprovals
43
42
  RSpec.configuration.auto_approve
44
43
  end
45
44
 
46
- def get_response
47
- Prompt.select "Please Choose:", 'r', menu_options
45
+ def user_response
46
+ Prompt.select 'Please Choose:', 'r', menu_options
48
47
  end
49
48
 
50
49
  def menu_options
51
50
  base = {
52
51
  'a' => ['Approve (and save)', :approve],
53
- 'r' => ['Reject (and fail test)', :reject]
52
+ 'r' => ['Reject (and fail test)', :reject],
54
53
  }
55
54
 
56
55
  extra = {
57
56
  '1' => ['Show actual output', :actual],
58
57
  '2' => ['Show expected output', :expected],
59
- '3' => ['Show diff', :diff]
58
+ '3' => ['Show diff', :diff],
60
59
  }
61
60
 
62
- expected.empty? ? base : base.merge(extra)
61
+ expected.empty? ? base : base.merge(extra)
63
62
  end
64
63
 
65
64
  def approve
66
- say "!txtgrn!Approved"
65
+ say 'g`Approved`'
67
66
  File.deep_write approval_file, actual
68
67
  true
69
68
  end
70
69
 
71
70
  def reject
72
- say "!txtred!Not Approved"
71
+ say 'r`Not Approved`'
73
72
  false
74
73
  end
75
74
 
76
75
  def separator
77
- "!txtgrn!" + ('_' * terminal_width)
76
+ "g`#{'_' * terminal_width}`"
78
77
  end
79
78
 
80
79
  def diff
@@ -82,10 +81,10 @@ module RSpecApprovals
82
81
  end
83
82
 
84
83
  def show(what)
85
- say ""
84
+ say ''
86
85
  say separator
87
86
  say what
88
87
  say separator
89
88
  end
90
89
  end
91
- end
90
+ end
@@ -3,7 +3,7 @@ require 'fileutils'
3
3
  class File
4
4
  def self.deep_write(file, content)
5
5
  dir = File.dirname file
6
- FileUtils.mkdir_p dir unless Dir.exist? dir
6
+ FileUtils.mkdir_p dir
7
7
  File.write file, content
8
8
  end
9
9
  end
@@ -25,4 +25,3 @@ unless StringIO.method_defined? :wait_readable
25
25
  end
26
26
  end
27
27
  end
28
-
@@ -1,11 +1,10 @@
1
1
  module RSpecApprovals
2
2
  module Matchers
3
-
4
3
  # A base matcher for approvals
5
4
  class Base
6
5
  attr_reader :approval_name, :actual, :distance, :actual_distance
7
6
 
8
- def initialize(approval_name=nil)
7
+ def initialize(approval_name = nil)
9
8
  @before = nil
10
9
  @approval_name = approval_name
11
10
  end
@@ -18,7 +17,7 @@ module RSpecApprovals
18
17
  @actual = sanitize @actual
19
18
  success = strings_match?
20
19
 
21
- if success or !interactive?
20
+ if success || !interactive?
22
21
  success
23
22
  else
24
23
  approve_approval
@@ -36,9 +35,9 @@ module RSpecApprovals
36
35
  # Enables the ability to do something like:
37
36
  # `expect(string).to match_approval(file).except(/\d+/)
38
37
  def except(regex, replace = '...')
39
- before ->(str) do
38
+ before lambda { |str|
40
39
  str.gsub regex, replace
41
- end
40
+ }
42
41
  end
43
42
 
44
43
  # Enables the ability to adjust the actual string before checking
@@ -57,10 +56,10 @@ module RSpecApprovals
57
56
 
58
57
  # Called by RSpec when there is a failure
59
58
  def failure_message
60
- return "actual string is empty" if actual.empty?
59
+ return 'actual string is empty' if actual.empty?
61
60
 
62
61
  result = "expected: #{actual}\nto match: #{expected}"
63
-
62
+
64
63
  if distance
65
64
  result = "#{result}\n(actual distance is #{actual_distance} instead of the expected #{distance})"
66
65
  end
@@ -80,7 +79,7 @@ module RSpecApprovals
80
79
  end
81
80
 
82
81
  # Returns true if RSpec is configured to allow interactivity.
83
- # By default, interactivity is enabled unless the environment
82
+ # By default, interactivity is enabled unless the environment
84
83
  # variable `CI` is set.
85
84
  def interactive?
86
85
  RSpec.configuration.interactive_approvals
@@ -96,7 +95,7 @@ module RSpecApprovals
96
95
  def approval_file
97
96
  "#{approvals_dir}/#{approval_name}"
98
97
  end
99
-
98
+
100
99
  protected
101
100
 
102
101
  # Asks for user approval. Used by child classes.
@@ -110,21 +109,21 @@ module RSpecApprovals
110
109
  File.exist?(approval_file) ? File.read(approval_file) : ''
111
110
  end
112
111
 
113
- # Do the actual test.
112
+ # Do the actual test.
114
113
  # - If .before() was used, we foreward the actual output to the
115
114
  # proc for processing first.
116
115
  # - If before_approval proc was configured, forward the acual output
117
116
  # to the proc for processing.
118
- # - If .diff() was used, then distance will be set and then
119
- # we "levenshtein it".
117
+ # - If .diff() was used, then distance will be set and then
118
+ # we "levenshtein it".
120
119
  # - Otherwise, compare with ==
121
120
  def strings_match?
122
121
  if @before
123
122
  @before.each do |proc|
124
- @actual = proc.call actual
123
+ @actual = proc.call actual
125
124
  end
126
125
  end
127
-
126
+
128
127
  if RSpec.configuration.before_approval.is_a? Proc
129
128
  @actual = RSpec.configuration.before_approval.call actual
130
129
  end
@@ -137,12 +136,11 @@ module RSpecApprovals
137
136
  end
138
137
  end
139
138
 
140
- # Returns the input string stripped of ANSI escape codes if the
139
+ # Returns the input string stripped of ANSI escape codes if the
141
140
  # strip_ansi_escape configuration setting was set to true
142
141
  def sanitize(string)
143
142
  sanitize? ? Strings::ANSI.sanitize(string) : string
144
143
  end
145
144
  end
146
-
147
145
  end
148
146
  end
@@ -7,9 +7,11 @@ module RSpecApprovals
7
7
  def match_approval(expected)
8
8
  MatchApproval.new expected
9
9
  end
10
-
10
+
11
11
  class MatchApproval < Base
12
+ def description
13
+ %[match approval "#{approval_name}"]
14
+ end
12
15
  end
13
-
14
16
  end
15
- end
17
+ end
@@ -5,11 +5,12 @@ module RSpecApprovals
5
5
  def output_approval(expected)
6
6
  OutputApproval.new expected
7
7
  end
8
-
8
+
9
9
  class OutputApproval < Base
10
10
  # Called by RSpec
11
11
  def matches?(block)
12
12
  return false unless block.is_a? Proc
13
+
13
14
  @actual = stream_capturer.capture block
14
15
  super
15
16
  end
@@ -19,6 +20,10 @@ module RSpecApprovals
19
20
  true
20
21
  end
21
22
 
23
+ def description
24
+ %[output approval "#{approval_name}"]
25
+ end
26
+
22
27
  # Adds chained matcher, to allow:
23
28
  # expect { stream }.to output_approval(file).to_stdout
24
29
  # This is the default, and only provided for completeness.
@@ -37,7 +42,6 @@ module RSpecApprovals
37
42
  def stream_capturer
38
43
  @stream_capturer ||= Stream::Stdout
39
44
  end
40
-
41
45
  end
42
46
  end
43
- end
47
+ end
@@ -5,11 +5,12 @@ module RSpecApprovals
5
5
  def raise_approval(expected)
6
6
  RaiseApproval.new expected
7
7
  end
8
-
8
+
9
9
  class RaiseApproval < Base
10
10
  # Called by RSpec
11
11
  def matches?(block)
12
12
  return false unless block.is_a? Proc
13
+
13
14
  @actual = 'Nothing raised'
14
15
 
15
16
  begin
@@ -25,6 +26,10 @@ module RSpecApprovals
25
26
  def supports_block_expectations?
26
27
  true
27
28
  end
29
+
30
+ def description
31
+ %[raise approval "#{approval_name}"]
32
+ end
28
33
  end
29
34
  end
30
- end
35
+ end
@@ -8,4 +8,4 @@ module RSpecApprovals
8
8
  @stderr ||= StringIO.new
9
9
  end
10
10
  end
11
- end
11
+ end
@@ -8,18 +8,18 @@ module RSpecApprovals
8
8
 
9
9
  def select(prompt, default, options)
10
10
  options.each do |key, config|
11
- color = key == default ? 'txtred' : 'txtgrn'
12
- say "!#{color}!#{key}!txtrst!) #{config.first}"
11
+ color = key == default ? 'r' : 'g'
12
+ say "#{color}`#{key}`) #{config.first}"
13
13
  end
14
-
15
- say "\n!txtblu!#{prompt}!txtrst! "
16
- response = STDIN.getch.downcase
17
-
14
+
15
+ say "\nb`#{prompt}` "
16
+ response = $stdin.getch.downcase
17
+
18
18
  response = default unless options.has_key? response
19
-
20
- resay "!txtpur!#{options[response].first}"
19
+
20
+ say "m`#{options[response].first}`", replace: true
21
21
  options[response].last
22
22
  end
23
23
  end
24
24
  end
25
- end
25
+ end
@@ -6,36 +6,35 @@ module RSpecApprovals
6
6
  # These methods are borrowed from rspec's built in matchers
7
7
  # https://github.com/rspec/rspec-expectations/blob/add9b271ecb1d65f7da5bc8a9dd8c64d81d92303/lib/rspec/matchers/built_in/output.rb
8
8
  module Stream
9
- module Stdout
10
- def self.capture(block)
9
+ module Capture
10
+ def self.capture(stream, block)
11
11
  RSpecApprovals.stdout.truncate 0
12
12
  RSpecApprovals.stdout.rewind
13
+ RSpecApprovals.stderr.truncate 0
14
+ RSpecApprovals.stderr.rewind
13
15
 
14
- original_stream = $stdout
16
+ stdout_original_stream = $stdout
17
+ stderr_original_stream = $stderr
15
18
  $stdout = RSpecApprovals.stdout
19
+ $stderr = RSpecApprovals.stderr
16
20
  block.call
17
- RSpecApprovals.stdout.string.dup
18
-
21
+ RSpecApprovals.send(stream).string.dup
19
22
  ensure
20
- $stdout = original_stream
23
+ $stdout = stdout_original_stream
24
+ $stderr = stderr_original_stream
25
+ end
26
+ end
21
27
 
28
+ module Stdout
29
+ def self.capture(block)
30
+ Capture.capture :stdout, block
22
31
  end
23
32
  end
24
33
 
25
34
  module Stderr
26
35
  def self.capture(block)
27
- RSpecApprovals.stderr.truncate 0
28
- RSpecApprovals.stderr.rewind
29
-
30
- original_stream = $stderr
31
- $stderr = RSpecApprovals.stderr
32
- block.call
33
- RSpecApprovals.stderr.string.dup
34
-
35
- ensure
36
- $stderr = original_stream
37
-
36
+ Capture.capture :stderr, block
38
37
  end
39
38
  end
40
39
  end
41
- end
40
+ end
@@ -1,3 +1,3 @@
1
1
  module RSpecApprovals
2
- VERSION = "0.9.1"
3
- end
2
+ VERSION = '0.9.3'
3
+ end
@@ -11,4 +11,3 @@ require 'rspec_approvals/matchers/output_approval'
11
11
  require 'rspec_approvals/matchers/raise_approval'
12
12
 
13
13
  require 'rspec_approvals/rspec_config'
14
-
metadata CHANGED
@@ -1,71 +1,77 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rspec_approvals
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.1
4
+ version: 0.9.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Danny Ben Shitrit
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-10-25 00:00:00.000000000 Z
11
+ date: 2023-01-31 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: colsole
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "~>"
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: 0.8.1
20
+ - - "<"
18
21
  - !ruby/object:Gem::Version
19
- version: '0.5'
22
+ version: '2'
20
23
  type: :runtime
21
24
  prerelease: false
22
25
  version_requirements: !ruby/object:Gem::Requirement
23
26
  requirements:
24
- - - "~>"
27
+ - - ">="
25
28
  - !ruby/object:Gem::Version
26
- version: '0.5'
29
+ version: 0.8.1
30
+ - - "<"
31
+ - !ruby/object:Gem::Version
32
+ version: '2'
27
33
  - !ruby/object:Gem::Dependency
28
- name: string-similarity
34
+ name: diffy
29
35
  requirement: !ruby/object:Gem::Requirement
30
36
  requirements:
31
37
  - - "~>"
32
38
  - !ruby/object:Gem::Version
33
- version: '2.0'
39
+ version: '3.4'
34
40
  type: :runtime
35
41
  prerelease: false
36
42
  version_requirements: !ruby/object:Gem::Requirement
37
43
  requirements:
38
44
  - - "~>"
39
45
  - !ruby/object:Gem::Version
40
- version: '2.0'
46
+ version: '3.4'
41
47
  - !ruby/object:Gem::Dependency
42
- name: diffy
48
+ name: strings-ansi
43
49
  requirement: !ruby/object:Gem::Requirement
44
50
  requirements:
45
51
  - - "~>"
46
52
  - !ruby/object:Gem::Version
47
- version: '3.3'
53
+ version: '0.2'
48
54
  type: :runtime
49
55
  prerelease: false
50
56
  version_requirements: !ruby/object:Gem::Requirement
51
57
  requirements:
52
58
  - - "~>"
53
59
  - !ruby/object:Gem::Version
54
- version: '3.3'
60
+ version: '0.2'
55
61
  - !ruby/object:Gem::Dependency
56
- name: strings-ansi
62
+ name: string-similarity
57
63
  requirement: !ruby/object:Gem::Requirement
58
64
  requirements:
59
65
  - - "~>"
60
66
  - !ruby/object:Gem::Version
61
- version: '0.1'
67
+ version: '2.1'
62
68
  type: :runtime
63
69
  prerelease: false
64
70
  version_requirements: !ruby/object:Gem::Requirement
65
71
  requirements:
66
72
  - - "~>"
67
73
  - !ruby/object:Gem::Version
68
- version: '0.1'
74
+ version: '2.1'
69
75
  description: Automatic interactive approvals for rspec
70
76
  email: db@dannyben.com
71
77
  executables: []
@@ -89,7 +95,8 @@ files:
89
95
  homepage: https://github.com/DannyBen/rspec_approvals
90
96
  licenses:
91
97
  - MIT
92
- metadata: {}
98
+ metadata:
99
+ rubygems_mfa_required: 'true'
93
100
  post_install_message:
94
101
  rdoc_options: []
95
102
  require_paths:
@@ -98,14 +105,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
98
105
  requirements:
99
106
  - - ">="
100
107
  - !ruby/object:Gem::Version
101
- version: 2.3.0
108
+ version: 2.6.0
102
109
  required_rubygems_version: !ruby/object:Gem::Requirement
103
110
  requirements:
104
111
  - - ">="
105
112
  - !ruby/object:Gem::Version
106
113
  version: '0'
107
114
  requirements: []
108
- rubygems_version: 3.1.4
115
+ rubygems_version: 3.4.5
109
116
  signing_key:
110
117
  specification_version: 4
111
118
  summary: Interactive RSpec Approvals