rspec-match_ignoring_whitespace 1.0.0 → 1.1.0

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
- SHA256:
3
- metadata.gz: ad3b8354fd617b6a2db5a077cfa3b1c49ab2394f6d481e722d5158013ae378b7
4
- data.tar.gz: acfabac792eee53f6f9f7ec4ee1c19498815a3e7524553fe1735845e9931f398
2
+ SHA1:
3
+ metadata.gz: '038c5481ebb263e376683226b2fd191925332aaa'
4
+ data.tar.gz: a9adcd0d707bfe6edfeb7d40c8907596410690a3
5
5
  SHA512:
6
- metadata.gz: bebec84b9e47ae4b9db953703125bc23e017a5bdd3ae90ce6724b207bc9c48fd3c7df8c61d546a66fc651a4c95a755dc9f6eee860c41ac137779259746c93c90
7
- data.tar.gz: 72a52d8d2b77a41d27ba668cb8d59769de5d2c329e06def7503b3ea28a3530e69f36c68dcb26c430fa9021b3fc6206e8950dd9c5d3f0d72c603eac641f0a5e21
6
+ metadata.gz: af7a58d59630c3659262105e78a27eb83b976d5318a96e13f032bf9c7130a15c5ba0893479ac2c79b77fd85a82948b014b02ad325dce6ef9e8d2a7160fcc1fd9
7
+ data.tar.gz: f64cc00d6510940eb8cd4bda53c79b8ea894c3f7a6ea0dd9d32398805d538a07b08b789d6735d6b48b285e6cd9c968367990a420f8733e9d8066c00860395516
data/.gitignore CHANGED
@@ -1,5 +1,6 @@
1
1
  .*.swp
2
2
  .*.swo
3
+ /.bundle
3
4
  /.ruby-version
4
5
  /.ruby-gemset
5
6
  /pkg
data/README.md CHANGED
@@ -19,7 +19,7 @@ Installation
19
19
  Add this line to your application's Gemfile:
20
20
 
21
21
  ```ruby
22
- gem 'rspec-match_fuzzy'
22
+ gem 'rspec-match_ignoring_whitespace'
23
23
  ```
24
24
 
25
25
  And then execute:
@@ -28,7 +28,7 @@ And then execute:
28
28
 
29
29
  Or install it yourself as:
30
30
 
31
- $ gem install rspec-match_fuzzy
31
+ $ gem install rspec-match_ignoring_whitespace
32
32
 
33
33
 
34
34
  Usage
@@ -1,30 +1,84 @@
1
1
  require 'rspec'
2
+ require 'levenstein_with_path'
3
+ require 'word_wrap'
4
+
5
+ def collapse_spaces(str)
6
+ str.gsub(/[\n[[:blank:]]]+/, ' ').strip
7
+ end
2
8
 
3
9
  RSpec::Matchers.define :match_ignoring_whitespace do |expected|
4
10
  expected = expected.to_s
5
11
 
6
12
  match do |actual|
7
13
  actual = actual.to_s
8
- actual.gsub(/[\n[[:blank:]]]+/, ' ').strip == expected.gsub(/[\n[[:blank:]]]+/, ' ').strip
14
+ collapse_spaces(actual) == collapse_spaces(expected)
9
15
  end
10
16
 
11
17
  failure_message do |actual|
12
18
  actual = actual.to_s
13
- actual_normalized = actual.gsub(/[\n[[:blank:]]]+/, ' ').strip
14
- expected_normalized = expected.gsub(/[\n[[:blank:]]]+/, ' ').strip
15
-
16
- message = <<-EOF.strip
17
- expected: #{expected_normalized.inspect}
18
- got: #{actual_normalized.inspect}
19
- EOF
20
-
21
- diff = RSpec::Expectations.differ.diff(actual_normalized, expected_normalized)
19
+ actual_normalized = collapse_spaces(actual)
20
+ expected_normalized = collapse_spaces(expected)
22
21
 
23
- unless diff.strip.empty?
24
- diff_label = RSpec::Matchers::ExpectedsForMultipleDiffs::DEFAULT_DIFF_LABEL
25
- message << "\n\n" << diff_label << diff
22
+ diff = LevensteinWithPath::Path.new(
23
+ expected_normalized.split(' '),
24
+ actual_normalized.split(' ')
25
+ )
26
+ runs = []
27
+ last_edit = nil
28
+ diff.edits.each do |edit|
29
+ last_edit = runs.last
30
+ if last_edit.class == edit.class
31
+ runs.pop
32
+ case edit
33
+ when LevensteinWithPath::Keep
34
+ runs << LevensteinWithPath::Keep.new(last_edit.token + [edit.token])
35
+ when LevensteinWithPath::Swap
36
+ runs << LevensteinWithPath::Swap.new(last_edit.token1 + [edit.token1], last_edit.token2 + [edit.token2])
37
+ when LevensteinWithPath::Insert
38
+ runs << LevensteinWithPath::Insert.new(last_edit.token + [edit.token])
39
+ when LevensteinWithPath::Delete
40
+ runs << LevensteinWithPath::Delete.new(last_edit.token + [edit.token])
41
+ else
42
+ raise "Unknown class: #{edit}"
43
+ end
44
+ else
45
+ case edit
46
+ when LevensteinWithPath::Keep
47
+ runs << LevensteinWithPath::Keep.new([edit.token])
48
+ when LevensteinWithPath::Swap
49
+ runs << LevensteinWithPath::Swap.new([edit.token1], [edit.token2])
50
+ when LevensteinWithPath::Insert
51
+ runs << LevensteinWithPath::Insert.new([edit.token])
52
+ when LevensteinWithPath::Delete
53
+ runs << LevensteinWithPath::Delete.new([edit.token])
54
+ else
55
+ raise "Unknown class: #{edit}"
56
+ end
57
+ end
26
58
  end
27
59
 
28
- message
60
+ message = runs.flat_map do |run|
61
+ case run
62
+ when LevensteinWithPath::Keep
63
+ WordWrap.ww(run.token.join(' '), 80).split("\n")
64
+ when LevensteinWithPath::Swap
65
+ WordWrap.ww(run.token1.join(' '), 78).split("\n").map do |line|
66
+ "- #{line}"
67
+ end +
68
+ WordWrap.ww(run.token2.join(' '), 78).split("\n").map do |line|
69
+ "+ #{line}"
70
+ end
71
+ when LevensteinWithPath::Insert
72
+ WordWrap.ww(run.token.join(' '), 78).split("\n").map do |line|
73
+ "+ #{line}"
74
+ end
75
+ when LevensteinWithPath::Delete
76
+ WordWrap.ww(run.token.join(' '), 78).split("\n").map do |line|
77
+ "- #{line}"
78
+ end
79
+ else
80
+ raise "Unknown class: #{run}"
81
+ end
82
+ end.join("\n")
29
83
  end
30
84
  end
@@ -1,5 +1,5 @@
1
1
  module RSpec
2
2
  module MatchIgnoringWhitespace
3
- VERSION = '1.0.0'.freeze
3
+ VERSION = '1.1.0'.freeze
4
4
  end
5
5
  end
@@ -21,6 +21,8 @@ Gem::Specification.new do |s|
21
21
  s.test_files = `git ls-files -- {test,spec,fixtures}/*`.split("\n")
22
22
 
23
23
  s.add_dependency 'rspec', '>= 3.2.0'
24
+ s.add_dependency 'levenstein_with_path'
25
+ s.add_dependency 'word_wrap'
24
26
  s.add_development_dependency 'rake'
25
27
  s.add_development_dependency 'bundler'
26
28
  s.add_development_dependency 'simplecov'
@@ -43,23 +43,43 @@ describe 'match_ignoring_whitespace' do
43
43
  end
44
44
 
45
45
  context "doesn't match" do
46
+ let(:matcher) { match_ignoring_whitespace(expected) }
46
47
  specify 'nil' do
47
- expect(nil).not_to match_ignoring_whitespace expected
48
+ expect(nil).not_to matcher
49
+ expect(matcher.failure_message).to eq '- πόλλ΄ οἶδ΄ ἀλώπηξ, ἀλλ΄ ἐχῖνος ἓν μέγα.'
48
50
  end
49
51
  specify 'an empty string' do
50
- expect('').not_to match_ignoring_whitespace expected
52
+ expect('').not_to matcher
53
+ expect(matcher.failure_message).to eq '- πόλλ΄ οἶδ΄ ἀλώπηξ, ἀλλ΄ ἐχῖνος ἓν μέγα.'
51
54
  end
52
55
  specify 'a single space' do
53
- expect(' ').not_to match_ignoring_whitespace expected
56
+ expect(' ').not_to matcher
57
+ expect(matcher.failure_message).to eq '- πόλλ΄ οἶδ΄ ἀλώπηξ, ἀλλ΄ ἐχῖνος ἓν μέγα.'
54
58
  end
55
59
  specify 'a different string' do
56
- expect('χρημάτων ἄελπτον οὐδέν ἐστιν οὐδ᾽ ἀπώμιον οὐδὲ θαυμάσιον').not_to match_ignoring_whitespace expected
60
+ expect('χρημάτων ἄελπτον οὐδέν ἐστιν οὐδ᾽ ἀπώμιον οὐδὲ θαυμάσιον').not_to matcher
61
+ expect(matcher.failure_message).to eq [
62
+ # TODO: Even Insert+Swap (like here) is joinable I think:
63
+ '+ χρημάτων',
64
+ '- πόλλ΄ οἶδ΄ ἀλώπηξ, ἀλλ΄ ἐχῖνος ἓν μέγα.',
65
+ '+ ἄελπτον οὐδέν ἐστιν οὐδ᾽ ἀπώμιον οὐδὲ θαυμάσιον',
66
+ ].join("\n")
57
67
  end
58
68
  specify 'a string missing a space' do
59
- expect("πόλλ΄ οἶδ΄ ἀλώπηξ,ἀλλ΄ ἐχῖνος ἓν μέγα.").not_to match_ignoring_whitespace expected
69
+ expect("πόλλ΄ οἶδ΄ ἀλώπηξ,ἀλλ΄ ἐχῖνος ἓν μέγα.").not_to matcher
70
+ expect(matcher.failure_message).to eq [
71
+ 'πόλλ΄ οἶδ΄',
72
+ # TODO: It would be nice to join things like Delete+Swap or Swap+Insert:
73
+ '- ἀλώπηξ,',
74
+ '- ἀλλ΄',
75
+ '+ ἀλώπηξ,ἀλλ΄',
76
+ 'ἐχῖνος ἓν μέγα.',
77
+ ].join("\n")
60
78
  end
61
79
  specify 'expecting nil' do
62
- expect('anything').not_to match_ignoring_whitespace(nil)
80
+ matcher = match_ignoring_whitespace(nil)
81
+ expect('anything').not_to matcher
82
+ expect(matcher.failure_message).to eq '+ anything'
63
83
  end
64
84
  end
65
85
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rspec-match_ignoring_whitespace
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Paul A. Jungwirth
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-07-19 00:00:00.000000000 Z
11
+ date: 2018-07-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rspec
@@ -24,6 +24,34 @@ dependencies:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
26
  version: 3.2.0
27
+ - !ruby/object:Gem::Dependency
28
+ name: levenstein_with_path
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: word_wrap
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
27
55
  - !ruby/object:Gem::Dependency
28
56
  name: rake
29
57
  requirement: !ruby/object:Gem::Requirement
@@ -121,8 +149,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
121
149
  version: '0'
122
150
  requirements: []
123
151
  rubyforge_project:
124
- rubygems_version: 2.7.6
152
+ rubygems_version: 2.6.14
125
153
  signing_key:
126
154
  specification_version: 4
127
155
  summary: RSpec matcher to compare strings ignoring whitespace
128
- test_files: []
156
+ test_files:
157
+ - spec/match_ignoring_whitespace_spec.rb
158
+ - spec/spec_helper.rb