specdiff 0.1.0 → 0.2.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 +4 -4
- data/CHANGELOG.md +19 -0
- data/Gemfile.lock +1 -1
- data/README.md +64 -3
- data/examples/webmock/Gemfile.lock +1 -1
- data/glossary.txt +27 -5
- data/lib/specdiff/compare.rb +95 -0
- data/lib/specdiff/config.rb +9 -6
- data/lib/specdiff/diff.rb +2 -1
- data/lib/specdiff/differ/hashdiff.rb +5 -4
- data/lib/specdiff/differ/text.rb +6 -0
- data/lib/specdiff/differ.rb +1 -94
- data/lib/specdiff/plugins.rb +5 -7
- data/lib/specdiff/version.rb +1 -1
- data/lib/specdiff.rb +2 -2
- metadata +3 -3
- data/lib/specdiff/threadlocal.rb +0 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8d698240eae3e0f8f38c22b66df23efb1076b14879a7093c3d3e33aebddd37c9
|
4
|
+
data.tar.gz: 29e6198145c5a9ede875a26066a33e599561fe82277c6eb8bdb475c291304c9b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cb5b52f47732689bc8322b840436d4c27fb048dbe20e9e0d8501b3120137500b7a9230a9818c31e049aa22715c251166d807b4e01111695406470c6b314c13c5
|
7
|
+
data.tar.gz: 103362c058c1e260dc9a9c3f1bd06b06d39ab25c1818e001c7160eb61ceb741d549b4f9c6fb974bb27614456ab2d34dfae6732bc6d842d42346bd62abe1fc331
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,24 @@
|
|
1
|
+
# Changelog
|
2
|
+
|
3
|
+
All notable changes to this project will be documented in this file.
|
4
|
+
|
5
|
+
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
6
|
+
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
7
|
+
|
1
8
|
## [Unreleased]
|
2
9
|
|
10
|
+
## [0.2.0] - 2023-12-04
|
11
|
+
|
12
|
+
### Changed
|
13
|
+
|
14
|
+
- Stop using thread locals ([#1](https://github.com/odinhb/specdiff/pull/1))
|
15
|
+
|
16
|
+
## [0.1.1] - 2023-12-04
|
17
|
+
|
18
|
+
### Fixed
|
19
|
+
|
20
|
+
- Fix #empty? not returning true when the diff is actually empty
|
21
|
+
|
3
22
|
## [0.1.0] - 2023-11-30
|
4
23
|
|
5
24
|
- Initial release
|
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -47,8 +47,10 @@ Specdiff.configure do |config|
|
|
47
47
|
end
|
48
48
|
```
|
49
49
|
|
50
|
-
|
51
|
-
|
50
|
+
### WebMock
|
51
|
+
|
52
|
+
The webmock patch should make webmock show request body diffs by using the
|
53
|
+
specdiff gem when stubs mismatch. It only applies to request bodies.
|
52
54
|
|
53
55
|
### Direct usage
|
54
56
|
|
@@ -61,18 +63,68 @@ diff.empty? # => true/false, if it is empty you might want to not print the diff
|
|
61
63
|
diff.to_s # => a string for showing to a developer who may or may not be scratching their head
|
62
64
|
```
|
63
65
|
|
66
|
+
### Registering plugins
|
67
|
+
|
68
|
+
```rb
|
69
|
+
# Specdiff comes with json support, but it must be loaded like so:
|
70
|
+
Specdiff.load!(:json)
|
71
|
+
|
72
|
+
# Custom plugins can be loaded like this:
|
73
|
+
Specdiff.load!(MyCustomType)
|
74
|
+
```
|
75
|
+
|
76
|
+
[Check out the source code](./lib/specdiff/plugins/json.rb) to learn the plugin interface.
|
77
|
+
|
64
78
|
## Development
|
65
79
|
|
80
|
+
Check out the [glossary](./glossary.txt) to make sure you (and I) are using the
|
81
|
+
same words for things ;)
|
82
|
+
|
66
83
|
Install the software versions specified in `.tool-versions`.
|
67
84
|
|
68
85
|
Run `bin/setup` to install dependencies. Then, run `bundle exec rake` to run the tests and linter and make sure they're green before starting to make your changes.
|
69
86
|
|
70
|
-
Run `bundle exec rake -AD`
|
87
|
+
Run `bundle exec rake -AD` for a full list of all the available tasks you may use for development purposes.
|
71
88
|
|
72
89
|
You can also run `bin/console` for an interactive prompt that will allow you to experiment with the gem code loaded.
|
73
90
|
|
91
|
+
Remember to update the unreleased section of the [changelog](./CHANGELOG.md) before you submit your pull request.
|
92
|
+
|
93
|
+
## How it works/"Architecture"
|
94
|
+
|
95
|
+
High level description of the heuristic specdiff implements
|
96
|
+
|
97
|
+
1. receive 2 pieces of data: `a` and `b`
|
98
|
+
2. determine types for `a` and `b`
|
99
|
+
1. test against plugin types
|
100
|
+
2. test against built in types
|
101
|
+
3. fall back to the `:unknown` type
|
102
|
+
3. determine which differ is appropriate for the types
|
103
|
+
1. test against plugin differs
|
104
|
+
2. test against built in differs
|
105
|
+
3. fall back to the null differ (`NotFound`)
|
106
|
+
7. run the selected differ with a and b
|
107
|
+
8. package it into a `::Specdiff::Diff` which records the detected types
|
108
|
+
|
109
|
+
\<time passes>
|
110
|
+
|
111
|
+
6. at some point later when `#to_s` is invoked, stringify the diff using the differ's `#stringify`
|
112
|
+
|
74
113
|
## Releasing
|
75
114
|
|
115
|
+
### Release procedure
|
116
|
+
|
117
|
+
- [ ] unit tests are passing (`$ bundle exec rake test`)
|
118
|
+
- [ ] linter is happy (`$ bundle exec rake lint`)
|
119
|
+
- [ ] `$ cd examples/webmock && bundle install && bundle exec ruby json.rb` looks good
|
120
|
+
- [ ] `$ bundle exec ruby text.rb` looks good
|
121
|
+
- [ ] update the version number in `version.rb`
|
122
|
+
- [ ] make sure the `examples/` `Gemfile.lock` files are updated
|
123
|
+
- [ ] move unreleased changes to the next version in the [changelog](./CHANGELOG.md)
|
124
|
+
- [ ] commit in the form "vX.X.X" and push
|
125
|
+
- [ ] make sure the pipeline is green
|
126
|
+
- [ ] `$ bundle exec rake release`
|
127
|
+
|
76
128
|
To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and the created tag, and push the `.gem` file to [rubygems.org](https://rubygems.org).
|
77
129
|
|
78
130
|
## Contributing
|
@@ -82,3 +134,12 @@ Bug reports and pull requests are welcome on GitHub at https://github.com/odinhb
|
|
82
134
|
## License
|
83
135
|
|
84
136
|
The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
|
137
|
+
|
138
|
+
## TODO
|
139
|
+
|
140
|
+
This documents potential improvements/issues I know about or have thought about.
|
141
|
+
|
142
|
+
- [ ] test the webmock monkey-patch. currently there is an empty webmock_spec.rb (should we do this using rspec?) and the examples/ directory contains a few webmock examples (which are a good idea to run before releasing) but it would be nice to have the pipeline fail if it doesn't work for whatever reason
|
143
|
+
- [ ] finalize plugin interface (are the methods named intuitively? should we split type detector definitions and differ definitions?)
|
144
|
+
- [ ] document how to define a plugin properly (instead of just linking to the source code)
|
145
|
+
- [ ] is the stringification of hashdiff's output really better than pretty print? or just more wordy? (the colors are definitely nice)
|
data/glossary.txt
CHANGED
@@ -1,3 +1,8 @@
|
|
1
|
+
"raw diff"
|
2
|
+
the return value from a differ or plugin's #diff method
|
3
|
+
this can be anything, from an array of arrays (hashdiff) to a string with a
|
4
|
+
git diff inside
|
5
|
+
|
1
6
|
diff
|
2
7
|
the return value from the Specdiff::diff method.
|
3
8
|
this is not the direct return value from a plugin/differ, that is the
|
@@ -8,17 +13,34 @@ differ
|
|
8
13
|
human-comprehensible diff output for your terminal
|
9
14
|
|
10
15
|
plugin
|
11
|
-
external differ (
|
12
|
-
|
16
|
+
external differ (has to respond to more methods)
|
17
|
+
may be provided from outside the gem (for example by a user drowning in xml)
|
18
|
+
|
19
|
+
"built in differ"
|
20
|
+
differ living in the specdiff/differ directory
|
21
|
+
|
22
|
+
"built in plugin"
|
23
|
+
plugin shipped with the gem, but needs to be loaded using Specdiff.load!
|
13
24
|
|
14
25
|
type
|
15
26
|
a symbol like :text, :json or :hash which denotes the type of data in a way
|
16
27
|
which is useful for picking a differ
|
17
28
|
|
29
|
+
a plugin returns a type from its #id method
|
30
|
+
|
18
31
|
:text
|
19
32
|
a string which likely contains plaintext data of some kind
|
20
33
|
|
34
|
+
"plugin type"
|
35
|
+
a type added by loading a plugin (not built into specdiff)
|
36
|
+
|
21
37
|
side
|
22
|
-
an object containing
|
23
|
-
|
24
|
-
|
38
|
+
an object containing a value and a type
|
39
|
+
|
40
|
+
used to represent the two sides to a comparison
|
41
|
+
|
42
|
+
when defining a plugin, you receive two sides: a and b, to various methods
|
43
|
+
|
44
|
+
compare
|
45
|
+
the procedure that implements the main function of specdiff including
|
46
|
+
accounting for any plugin types and differs
|
@@ -0,0 +1,95 @@
|
|
1
|
+
class Specdiff::Compare
|
2
|
+
Side = Struct.new(:value, :type, keyword_init: true)
|
3
|
+
|
4
|
+
def self.call(...)
|
5
|
+
new.call(...)
|
6
|
+
end
|
7
|
+
|
8
|
+
def call(raw_a, raw_b)
|
9
|
+
a = parse_side(raw_a)
|
10
|
+
b = parse_side(raw_b)
|
11
|
+
|
12
|
+
if a.type == :text && b.type == :binary
|
13
|
+
new_b = try_reencode(b.value, a.value.encoding)
|
14
|
+
if new_b
|
15
|
+
b = b.dup
|
16
|
+
b.type = :text
|
17
|
+
b.value = new_b
|
18
|
+
end
|
19
|
+
elsif a.type == :binary && b.type == :text
|
20
|
+
new_a = try_reencode(a.value, b.value.encoding)
|
21
|
+
if new_a
|
22
|
+
a = a.dup
|
23
|
+
a.type = :text
|
24
|
+
a.value = new_a
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
differ = pick_differ(a, b)
|
29
|
+
raw = differ.diff(a, b)
|
30
|
+
|
31
|
+
if raw.is_a?(::Specdiff::Diff) # detect recursive plugins, such as json
|
32
|
+
raw
|
33
|
+
else
|
34
|
+
::Specdiff::Diff.new(raw: raw, differ: differ, a: a, b: b)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
private
|
39
|
+
|
40
|
+
def parse_side(raw_value)
|
41
|
+
type = detect_type(raw_value)
|
42
|
+
|
43
|
+
Side.new(value: raw_value, type: type)
|
44
|
+
end
|
45
|
+
|
46
|
+
def detect_type(thing)
|
47
|
+
if (type = detect_plugin_types(thing))
|
48
|
+
type
|
49
|
+
elsif thing.is_a?(Hash)
|
50
|
+
:hash
|
51
|
+
elsif thing.is_a?(Array)
|
52
|
+
:array
|
53
|
+
elsif thing.is_a?(String) && thing.encoding == Encoding::BINARY
|
54
|
+
:binary
|
55
|
+
elsif thing.is_a?(String)
|
56
|
+
:text
|
57
|
+
elsif thing.nil?
|
58
|
+
:nil
|
59
|
+
else
|
60
|
+
:unknown
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
def detect_plugin_types(thing)
|
65
|
+
Specdiff.plugins
|
66
|
+
.filter { |plugin| plugin.respond_to?(:detect_type) }
|
67
|
+
.detect { |plugin| plugin.detect_type(thing) }
|
68
|
+
&.id
|
69
|
+
end
|
70
|
+
|
71
|
+
def try_reencode(binary_string, target_encoding)
|
72
|
+
binary_string.encode(target_encoding)
|
73
|
+
rescue StandardError
|
74
|
+
nil
|
75
|
+
end
|
76
|
+
|
77
|
+
def pick_differ(a, b)
|
78
|
+
if (differ = pick_plugin_differ(a, b))
|
79
|
+
differ
|
80
|
+
elsif a.type == :text && b.type == :text
|
81
|
+
Specdiff::Differ::Text
|
82
|
+
elsif a.type == :hash && b.type == :hash
|
83
|
+
Specdiff::Differ::Hashdiff
|
84
|
+
elsif a.type == :array && b.type == :array
|
85
|
+
Specdiff::Differ::Hashdiff
|
86
|
+
else
|
87
|
+
Specdiff::Differ::NotFound
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
def pick_plugin_differ(a, b)
|
92
|
+
Specdiff.plugins
|
93
|
+
.detect { |plugin| plugin.compatible?(a, b) }
|
94
|
+
end
|
95
|
+
end
|
data/lib/specdiff/config.rb
CHANGED
@@ -5,23 +5,26 @@ module Specdiff
|
|
5
5
|
end
|
6
6
|
end
|
7
7
|
|
8
|
-
|
9
|
-
|
10
|
-
threadlocal[:config] ||= default_configuration
|
8
|
+
class << self
|
9
|
+
attr_reader :config
|
11
10
|
end
|
12
11
|
|
12
|
+
DEFAULT = Config.new(colorize: true).freeze
|
13
|
+
@config = DEFAULT.dup
|
14
|
+
|
13
15
|
# private, used for testing
|
14
16
|
def self._set_config(new_config)
|
15
|
-
|
17
|
+
@config = new_config
|
16
18
|
end
|
17
19
|
|
18
20
|
# Set the configuration
|
19
21
|
def self.configure
|
20
|
-
yield(config)
|
22
|
+
yield(@config)
|
23
|
+
@config
|
21
24
|
end
|
22
25
|
|
23
26
|
# Generates the default configuration
|
24
27
|
def self.default_configuration
|
25
|
-
|
28
|
+
DEFAULT
|
26
29
|
end
|
27
30
|
end
|
data/lib/specdiff/diff.rb
CHANGED
@@ -1,5 +1,4 @@
|
|
1
1
|
require "hashdiff"
|
2
|
-
require "pp"
|
3
2
|
|
4
3
|
class Specdiff::Differ::Hashdiff
|
5
4
|
extend ::Specdiff::Colorize
|
@@ -10,16 +9,18 @@ class Specdiff::Differ::Hashdiff
|
|
10
9
|
# representation does not.
|
11
10
|
# hmm it really seems like use_lcs: true gives much less human-readable
|
12
11
|
# (human-comprehensible) output when arrays are involved.
|
13
|
-
Hashdiff.diff(
|
12
|
+
::Hashdiff.diff(
|
14
13
|
a.value, b.value,
|
15
14
|
array_path: true,
|
16
15
|
use_lcs: false,
|
17
16
|
)
|
18
17
|
end
|
19
18
|
|
20
|
-
def self.
|
21
|
-
diff.raw.
|
19
|
+
def self.empty?(diff)
|
20
|
+
diff.raw.empty?
|
21
|
+
end
|
22
22
|
|
23
|
+
def self.stringify(diff)
|
23
24
|
result = +""
|
24
25
|
|
25
26
|
diff.raw.each do |change|
|
data/lib/specdiff/differ/text.rb
CHANGED
@@ -47,6 +47,8 @@ class Specdiff::Differ::Text
|
|
47
47
|
diff << hunks.last.diff(:unified).to_s
|
48
48
|
end
|
49
49
|
|
50
|
+
return diff if diff == ""
|
51
|
+
|
50
52
|
diff << "\n"
|
51
53
|
|
52
54
|
return colorize_by_line(diff) do |line|
|
@@ -67,6 +69,10 @@ class Specdiff::Differ::Text
|
|
67
69
|
end
|
68
70
|
end
|
69
71
|
|
72
|
+
def self.empty?(diff)
|
73
|
+
diff.raw == ""
|
74
|
+
end
|
75
|
+
|
70
76
|
def self.stringify(diff)
|
71
77
|
diff.raw
|
72
78
|
end
|
data/lib/specdiff/differ.rb
CHANGED
@@ -1,97 +1,4 @@
|
|
1
|
-
|
2
|
-
Side = Struct.new(:value, :type, keyword_init: true)
|
3
|
-
|
4
|
-
def self.call(...)
|
5
|
-
new.call(...)
|
6
|
-
end
|
7
|
-
|
8
|
-
def call(raw_a, raw_b)
|
9
|
-
a = parse_side(raw_a)
|
10
|
-
b = parse_side(raw_b)
|
11
|
-
|
12
|
-
if a.type == :text && b.type == :binary
|
13
|
-
new_b = try_reencode(b.value, a.value.encoding)
|
14
|
-
if new_b
|
15
|
-
b = b.dup
|
16
|
-
b.type = :text
|
17
|
-
b.value = new_b
|
18
|
-
end
|
19
|
-
elsif a.type == :binary && b.type == :text
|
20
|
-
new_a = try_reencode(a.value, b.value.encoding)
|
21
|
-
if new_a
|
22
|
-
a = a.dup
|
23
|
-
a.type = :text
|
24
|
-
a.value = new_a
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
28
|
-
differ = pick_differ(a, b)
|
29
|
-
raw = differ.diff(a, b)
|
30
|
-
|
31
|
-
if raw.is_a?(::Specdiff::Diff) # detect recursive plugins, such as json
|
32
|
-
raw
|
33
|
-
else
|
34
|
-
::Specdiff::Diff.new(raw: raw, differ: differ, a: a, b: b)
|
35
|
-
end
|
36
|
-
end
|
37
|
-
|
38
|
-
private
|
39
|
-
|
40
|
-
def parse_side(raw_value)
|
41
|
-
type = detect_type(raw_value)
|
42
|
-
|
43
|
-
Side.new(value: raw_value, type: type)
|
44
|
-
end
|
45
|
-
|
46
|
-
def detect_type(thing)
|
47
|
-
if (type = detect_plugin_types(thing))
|
48
|
-
type
|
49
|
-
elsif thing.is_a?(Hash)
|
50
|
-
:hash
|
51
|
-
elsif thing.is_a?(Array)
|
52
|
-
:array
|
53
|
-
elsif thing.is_a?(String) && thing.encoding == Encoding::BINARY
|
54
|
-
:binary
|
55
|
-
elsif thing.is_a?(String)
|
56
|
-
:text
|
57
|
-
elsif thing.nil?
|
58
|
-
:nil
|
59
|
-
else
|
60
|
-
:unknown
|
61
|
-
end
|
62
|
-
end
|
63
|
-
|
64
|
-
def detect_plugin_types(thing)
|
65
|
-
Specdiff.plugins
|
66
|
-
.filter { |plugin| plugin.respond_to?(:detect_type) }
|
67
|
-
.detect { |plugin| plugin.detect_type(thing) }
|
68
|
-
&.id
|
69
|
-
end
|
70
|
-
|
71
|
-
def try_reencode(binary_string, target_encoding)
|
72
|
-
binary_string.encode(target_encoding)
|
73
|
-
rescue StandardError
|
74
|
-
nil
|
75
|
-
end
|
76
|
-
|
77
|
-
def pick_differ(a, b)
|
78
|
-
if (differ = pick_plugin_differ(a, b))
|
79
|
-
differ
|
80
|
-
elsif a.type == :text && b.type == :text
|
81
|
-
Specdiff::Differ::Text
|
82
|
-
elsif a.type == :hash && b.type == :hash
|
83
|
-
Specdiff::Differ::Hashdiff
|
84
|
-
elsif a.type == :array && b.type == :array
|
85
|
-
Specdiff::Differ::Hashdiff
|
86
|
-
else
|
87
|
-
Specdiff::Differ::NotFound
|
88
|
-
end
|
89
|
-
end
|
90
|
-
|
91
|
-
def pick_plugin_differ(a, b)
|
92
|
-
Specdiff.plugins
|
93
|
-
.detect { |plugin| plugin.compatible?(a, b) }
|
94
|
-
end
|
1
|
+
module Specdiff::Differ
|
95
2
|
end
|
96
3
|
|
97
4
|
# require only the builtin differs, plugins are optionally loaded later
|
data/lib/specdiff/plugins.rb
CHANGED
@@ -1,9 +1,8 @@
|
|
1
1
|
module Specdiff
|
2
|
-
|
3
|
-
|
4
|
-
def self.plugins
|
5
|
-
threadlocal[THREADLOCAL_PLUGINS_KEY]
|
2
|
+
class << self
|
3
|
+
attr_reader :plugins
|
6
4
|
end
|
5
|
+
@plugins = []
|
7
6
|
|
8
7
|
BUILTIN_PLUGINS = %i[json]
|
9
8
|
BUILTIN_TYPES = %i[hash array binary text nil]
|
@@ -59,14 +58,13 @@ module Specdiff
|
|
59
58
|
MSG
|
60
59
|
end
|
61
60
|
|
62
|
-
|
61
|
+
@plugins << plugin
|
63
62
|
end
|
64
63
|
|
65
64
|
# private
|
66
65
|
def self._clear_plugins!
|
67
|
-
|
66
|
+
@plugins = []
|
68
67
|
end
|
69
|
-
_clear_plugins!
|
70
68
|
|
71
69
|
module Plugins
|
72
70
|
end
|
data/lib/specdiff/version.rb
CHANGED
data/lib/specdiff.rb
CHANGED
@@ -1,12 +1,12 @@
|
|
1
1
|
require_relative "specdiff/version"
|
2
|
-
require_relative "specdiff/threadlocal"
|
3
2
|
require_relative "specdiff/config"
|
4
3
|
require_relative "specdiff/colorize"
|
4
|
+
require_relative "specdiff/compare"
|
5
5
|
|
6
6
|
module Specdiff
|
7
7
|
# Diff two things
|
8
8
|
def self.diff(...)
|
9
|
-
::Specdiff::
|
9
|
+
::Specdiff::Compare.call(...)
|
10
10
|
end
|
11
11
|
end
|
12
12
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: specdiff
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Odin Heggvold Bekkelund
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-
|
11
|
+
date: 2023-12-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: hashdiff
|
@@ -61,6 +61,7 @@ files:
|
|
61
61
|
- glossary.txt
|
62
62
|
- lib/specdiff.rb
|
63
63
|
- lib/specdiff/colorize.rb
|
64
|
+
- lib/specdiff/compare.rb
|
64
65
|
- lib/specdiff/config.rb
|
65
66
|
- lib/specdiff/diff.rb
|
66
67
|
- lib/specdiff/differ.rb
|
@@ -70,7 +71,6 @@ files:
|
|
70
71
|
- lib/specdiff/plugin.rb
|
71
72
|
- lib/specdiff/plugins.rb
|
72
73
|
- lib/specdiff/plugins/json.rb
|
73
|
-
- lib/specdiff/threadlocal.rb
|
74
74
|
- lib/specdiff/version.rb
|
75
75
|
- lib/specdiff/webmock.rb
|
76
76
|
- lib/specdiff/webmock/request_body_diff.rb
|