sub_diff 1.1.0 → 1.1.1
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/Gemfile.lock +1 -1
- data/lib/sub_diff.rb +1 -0
- data/lib/sub_diff/adapter.rb +10 -12
- data/lib/sub_diff/buildable.rb +22 -0
- data/lib/sub_diff/builder.rb +7 -1
- data/lib/sub_diff/collection.rb +10 -0
- data/lib/sub_diff/core_ext/string.rb +8 -0
- data/lib/sub_diff/diff.rb +12 -0
- data/lib/sub_diff/differ.rb +20 -12
- data/lib/sub_diff/gsub.rb +9 -8
- data/lib/sub_diff/sub.rb +10 -8
- data/lib/sub_diff/version.rb +1 -1
- data/spec/spec_helper.rb +6 -71
- data/spec/sub_diff/collection_spec.rb +3 -2
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6a95327c2f9868be0c23e279dbc32c577a4c45c2
|
4
|
+
data.tar.gz: 17c3721197874d746bc1d0377469d5971694195f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: dbf615e3a719b9508cff821a11c30ba6ad82adfa7d5cf9fac082b2d48975b9c6e0f630000063c0e9fe31939bce2d0ce0eac6ce9560c5e5a33ac69edf3ad86292
|
7
|
+
data.tar.gz: 35005311dee8874633c3d6e497177d316474eebc86eacf80d0ed296a90d1d5dbf78adea076ec5867f3f7fa8cdbca2028e5f296c3cdf23f779747715878f3bc6b
|
data/Gemfile.lock
CHANGED
data/lib/sub_diff.rb
CHANGED
data/lib/sub_diff/adapter.rb
CHANGED
@@ -1,21 +1,19 @@
|
|
1
1
|
module SubDiff
|
2
|
+
# Constructs an instance of {Sub} or {Gsub} to be
|
3
|
+
# used as a receiver for delegated calls to `diff`.
|
4
|
+
#
|
5
|
+
# Used internally by {Builder}.
|
6
|
+
#
|
7
|
+
# @api private
|
2
8
|
class Adapter
|
3
|
-
|
9
|
+
include Buildable
|
4
10
|
|
5
|
-
def_delegators :
|
6
|
-
def_delegators :builder, :diff_method
|
7
|
-
def_delegators :instance, :diff
|
8
|
-
|
9
|
-
attr_reader :differ
|
10
|
-
|
11
|
-
def initialize(differ)
|
12
|
-
@differ = differ
|
13
|
-
end
|
11
|
+
def_delegators :adapter, :diff
|
14
12
|
|
15
13
|
private
|
16
14
|
|
17
|
-
def
|
18
|
-
adapter_class.new(
|
15
|
+
def adapter
|
16
|
+
adapter_class.new(builder)
|
19
17
|
end
|
20
18
|
|
21
19
|
def adapter_class
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module SubDiff
|
2
|
+
# This module allows classes to accept a {Builder} object as
|
3
|
+
# an initializer argument and defines an `attr_reader` for it.
|
4
|
+
#
|
5
|
+
# It also delegates commonly used methods to the {Builder} instance.
|
6
|
+
#
|
7
|
+
# Used internally by {Adapter}, {Differ}, and {Sub}.
|
8
|
+
#
|
9
|
+
# @api private
|
10
|
+
module Buildable
|
11
|
+
attr_reader :builder
|
12
|
+
|
13
|
+
def initialize(builder)
|
14
|
+
@builder = builder
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.included(base)
|
18
|
+
base.extend(Forwardable)
|
19
|
+
base.def_delegators(:builder, :diff_method, :differ, :string)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
data/lib/sub_diff/builder.rb
CHANGED
@@ -1,4 +1,10 @@
|
|
1
1
|
module SubDiff
|
2
|
+
# Performs a {Sub} or {Gsub} replacement and returns
|
3
|
+
# the resulting {Collection} of {Diff} objects.
|
4
|
+
#
|
5
|
+
# Used internally by {CoreExt::String#sub_diff} and {CoreExt::String#gsub_diff}.
|
6
|
+
#
|
7
|
+
# @api private
|
2
8
|
class Builder
|
3
9
|
attr_reader :string, :diff_method
|
4
10
|
|
@@ -32,7 +38,7 @@ module SubDiff
|
|
32
38
|
end
|
33
39
|
|
34
40
|
def adapter
|
35
|
-
@adapter ||= Adapter.new(
|
41
|
+
@adapter ||= Adapter.new(self)
|
36
42
|
end
|
37
43
|
|
38
44
|
def differ
|
data/lib/sub_diff/collection.rb
CHANGED
@@ -1,4 +1,14 @@
|
|
1
1
|
module SubDiff
|
2
|
+
# Stores a collection of {Diff} objects for all matches from
|
3
|
+
# a {String#sub_diff} or {String#gsub_diff} replacement.
|
4
|
+
#
|
5
|
+
# It behaves like a {String} that represents the entire
|
6
|
+
# replacement result from {String#sub} or {String#gsub}.
|
7
|
+
#
|
8
|
+
# It also behaves like an {Enumerable} by delegating to
|
9
|
+
# {Collection#diffs} - an {Array} containing each {Diff}.
|
10
|
+
#
|
11
|
+
# @api public
|
2
12
|
class Collection < SimpleDelegator
|
3
13
|
extend Forwardable
|
4
14
|
include Enumerable
|
@@ -1,10 +1,18 @@
|
|
1
1
|
module SubDiff
|
2
2
|
module CoreExt
|
3
3
|
module String
|
4
|
+
# Behaves just like {String#sub} but wraps the returned replacement
|
5
|
+
# string in an enumerable {Collection} of {Diff} objects.
|
6
|
+
#
|
7
|
+
# See http://ruby-doc.org/core-2.2.0/String.html#method-i-sub
|
4
8
|
def sub_diff(*args, &block)
|
5
9
|
Builder.new(self, :sub).diff(*args, &block)
|
6
10
|
end
|
7
11
|
|
12
|
+
# Behaves just like {String#gsub} but wraps the returned replacement
|
13
|
+
# string in an enumerable {Collection} of {Diff} objects.
|
14
|
+
#
|
15
|
+
# See http://ruby-doc.org/core-2.2.0/String.html#method-i-gsub
|
8
16
|
def gsub_diff(*args, &block)
|
9
17
|
Builder.new(self, :gsub).diff(*args, &block)
|
10
18
|
end
|
data/lib/sub_diff/diff.rb
CHANGED
@@ -1,4 +1,16 @@
|
|
1
1
|
module SubDiff
|
2
|
+
# Stores a single match (and optional replacement)
|
3
|
+
# from a {String#sub} or {String#gsub} replacement.
|
4
|
+
#
|
5
|
+
# It behaves just like a {String} and represents the
|
6
|
+
# newly replaced string if a replacement was made, or
|
7
|
+
# the matched string itself if no changes occurred.
|
8
|
+
#
|
9
|
+
# It also has additional methods that provide access
|
10
|
+
# to the old string, the newly replaced string, and a
|
11
|
+
# boolean to determine if a replacement was actually made.
|
12
|
+
#
|
13
|
+
# @api public
|
2
14
|
class Diff < SimpleDelegator
|
3
15
|
attr_reader :value_was
|
4
16
|
|
data/lib/sub_diff/differ.rb
CHANGED
@@ -1,20 +1,28 @@
|
|
1
1
|
module SubDiff
|
2
|
+
# Performs a {String#sub} or {String#gsub} replacement
|
3
|
+
# while yielding each match "diff payload" to a block.
|
4
|
+
#
|
5
|
+
# The payload contains:
|
6
|
+
#
|
7
|
+
# match - the string matching the search.
|
8
|
+
# prefix - the string preceding the match.
|
9
|
+
# suffix - the string trailing the match.
|
10
|
+
# replacement - the string replacing the match.
|
11
|
+
#
|
12
|
+
# This class uses some special global variables: $` and $'.
|
13
|
+
# See http://ruby-doc.org/core-2.2.0/doc/globals_rdoc.html
|
14
|
+
#
|
15
|
+
# Used internally by {Sub}.
|
16
|
+
#
|
17
|
+
# @api private
|
2
18
|
class Differ
|
3
|
-
|
19
|
+
include Buildable
|
4
20
|
|
5
|
-
|
6
|
-
|
7
|
-
attr_reader :builder
|
8
|
-
|
9
|
-
def initialize(builder)
|
10
|
-
@builder = builder
|
11
|
-
end
|
12
|
-
|
13
|
-
def each_diff(search, *args, block)
|
21
|
+
def match(search, *args, replacement)
|
14
22
|
string.send(diff_method, search) do |match|
|
15
23
|
diff = { match: match, prefix: $`, suffix: $' }
|
16
|
-
diff[:replacement] = match.sub(search, *args, &
|
17
|
-
yield(
|
24
|
+
diff[:replacement] = match.sub(search, *args, &replacement)
|
25
|
+
yield(diff)
|
18
26
|
end
|
19
27
|
end
|
20
28
|
end
|
data/lib/sub_diff/gsub.rb
CHANGED
@@ -1,8 +1,14 @@
|
|
1
1
|
module SubDiff
|
2
|
+
# Processes matches for {String#gsub} replacements
|
3
|
+
# by pushing diffs into a {Builder} instance.
|
4
|
+
#
|
5
|
+
# Used internally by {Adapter}.
|
6
|
+
#
|
7
|
+
# @api private
|
2
8
|
class Gsub < Sub
|
3
9
|
private
|
4
10
|
|
5
|
-
def
|
11
|
+
def append_diff_to_builder(diff, _search)
|
6
12
|
super
|
7
13
|
last_prefix << prefix(diff) << diff[:match]
|
8
14
|
end
|
@@ -17,13 +23,8 @@ module SubDiff
|
|
17
23
|
|
18
24
|
def suffix(_diff, search)
|
19
25
|
suffix = super
|
20
|
-
|
21
|
-
|
22
|
-
suffix unless skip_suffix
|
23
|
-
end
|
24
|
-
|
25
|
-
def suffix_matcher(search)
|
26
|
-
search.is_a?(Regexp) ? :match : :include?
|
26
|
+
regex = Regexp.new(search)
|
27
|
+
suffix unless suffix.match(regex)
|
27
28
|
end
|
28
29
|
end
|
29
30
|
end
|
data/lib/sub_diff/sub.rb
CHANGED
@@ -1,20 +1,22 @@
|
|
1
1
|
module SubDiff
|
2
|
+
# Processes matches for {String#gsub} replacements
|
3
|
+
# by pushing diffs into a {Builder} instance.
|
4
|
+
#
|
5
|
+
# Used internally by {Adapter}.
|
6
|
+
#
|
7
|
+
# @api private
|
2
8
|
class Sub
|
3
|
-
|
4
|
-
|
5
|
-
def initialize(differ)
|
6
|
-
@differ = differ
|
7
|
-
end
|
9
|
+
include Buildable
|
8
10
|
|
9
11
|
def diff(search, *args, &block)
|
10
|
-
differ.
|
11
|
-
|
12
|
+
differ.match(search, *args, block) do |diff|
|
13
|
+
append_diff_to_builder(diff, search)
|
12
14
|
end
|
13
15
|
end
|
14
16
|
|
15
17
|
private
|
16
18
|
|
17
|
-
def
|
19
|
+
def append_diff_to_builder(diff, search)
|
18
20
|
builder << prefix(diff)
|
19
21
|
builder.push(diff[:replacement], diff[:match])
|
20
22
|
builder << suffix(diff, search)
|
data/lib/sub_diff/version.rb
CHANGED
data/spec/spec_helper.rb
CHANGED
@@ -1,13 +1,9 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
SimpleCov.start { add_filter('/vendor/bundle/') }
|
8
|
-
end
|
9
|
-
rescue LoadError
|
10
|
-
# Ignore when testing with Ruby 1.8.7
|
1
|
+
if ENV['CODECLIMATE_REPO_TOKEN']
|
2
|
+
require 'codeclimate-test-reporter'
|
3
|
+
CodeClimate::TestReporter.start
|
4
|
+
else
|
5
|
+
require 'simplecov'
|
6
|
+
SimpleCov.start { add_filter('/vendor/bundle/') }
|
11
7
|
end
|
12
8
|
|
13
9
|
require File.expand_path('../../lib/sub_diff', __FILE__)
|
@@ -17,64 +13,3 @@ RSpec.configure do |config|
|
|
17
13
|
config.raise_errors_for_deprecations!
|
18
14
|
config.run_all_when_everything_filtered = true
|
19
15
|
end
|
20
|
-
|
21
|
-
# RSpec matcher to spec delegations.
|
22
|
-
# Forked from https://gist.github.com/ssimeonov/5942729 with fixes
|
23
|
-
# for arity + custom prefix.
|
24
|
-
#
|
25
|
-
# Usage:
|
26
|
-
#
|
27
|
-
# describe Post do
|
28
|
-
# it { should delegate(:name).to(:author).with_prefix } # post.author_name
|
29
|
-
# it { should delegate(:name).to(:author).with_prefix(:any) } # post.any_name
|
30
|
-
# it { should delegate(:month).to(:created_at) }
|
31
|
-
# it { should delegate(:year).to(:created_at) }
|
32
|
-
# it { should delegate(:something).to(:'@instance_var') }
|
33
|
-
# end
|
34
|
-
RSpec::Matchers.define :delegate do |method|
|
35
|
-
match do |delegator|
|
36
|
-
@prefix ||= nil
|
37
|
-
@method = @prefix ? :"#{@prefix}_#{method}" : method
|
38
|
-
@delegator = delegator
|
39
|
-
|
40
|
-
if @to.to_s[0] == '@'
|
41
|
-
# Delegation to an instance variable
|
42
|
-
old_value = @delegator.instance_variable_get(@to)
|
43
|
-
begin
|
44
|
-
@delegator.instance_variable_set(@to, receiver_double(method))
|
45
|
-
@delegator.send(@method) == :called
|
46
|
-
ensure
|
47
|
-
@delegator.instance_variable_set(@to, old_value)
|
48
|
-
end
|
49
|
-
elsif @delegator.respond_to?(@to, true)
|
50
|
-
unless [0,-1].include?(@delegator.method(@to).arity)
|
51
|
-
raise "#{@delegator}'s' #{@to} method does not have zero or -1 arity (it expects parameters)"
|
52
|
-
end
|
53
|
-
allow(@delegator).to receive(@to).and_return(receiver_double(method))
|
54
|
-
@delegator.send(@method) == :called
|
55
|
-
else
|
56
|
-
raise "#{@delegator} does not respond to #{@to}"
|
57
|
-
end
|
58
|
-
end
|
59
|
-
|
60
|
-
description do
|
61
|
-
"delegate :#{@method} to its #{@to}#{@prefix ? ' with prefix' : ''}"
|
62
|
-
end
|
63
|
-
|
64
|
-
failure_message do |text|
|
65
|
-
"expected #{@delegator} to delegate :#{@method} to its #{@to}#{@prefix ? ' with prefix' : ''}"
|
66
|
-
end
|
67
|
-
|
68
|
-
failure_message_when_negated do |text|
|
69
|
-
"expected #{@delegator} not to delegate :#{@method} to its #{@to}#{@prefix ? ' with prefix' : ''}"
|
70
|
-
end
|
71
|
-
|
72
|
-
chain(:to) { |receiver| @to = receiver }
|
73
|
-
chain(:with_prefix) { |prefix| @prefix = prefix || @to }
|
74
|
-
|
75
|
-
def receiver_double(method)
|
76
|
-
double('receiver').tap do |receiver|
|
77
|
-
allow(receiver).to receive(method).and_return(:called)
|
78
|
-
end
|
79
|
-
end
|
80
|
-
end
|
@@ -43,7 +43,6 @@ RSpec.describe SubDiff::Collection do
|
|
43
43
|
|
44
44
|
describe '#each' do
|
45
45
|
it { is_expected.to be_an(Enumerable) }
|
46
|
-
it { is_expected.to delegate(:each).to(:diffs) }
|
47
46
|
end
|
48
47
|
|
49
48
|
describe '#push' do
|
@@ -88,7 +87,9 @@ RSpec.describe SubDiff::Collection do
|
|
88
87
|
end
|
89
88
|
|
90
89
|
describe '#size' do
|
91
|
-
it
|
90
|
+
it 'should use the diffs size' do
|
91
|
+
expect(subject.size).to eq(subject.diffs.size)
|
92
|
+
end
|
92
93
|
|
93
94
|
it 'should not use the string size' do
|
94
95
|
expect(subject.size).not_to eq(subject.to_s.size)
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sub_diff
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.1.
|
4
|
+
version: 1.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sean Huber
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-06-
|
11
|
+
date: 2015-06-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rspec
|
@@ -40,6 +40,7 @@ files:
|
|
40
40
|
- README.md
|
41
41
|
- lib/sub_diff.rb
|
42
42
|
- lib/sub_diff/adapter.rb
|
43
|
+
- lib/sub_diff/buildable.rb
|
43
44
|
- lib/sub_diff/builder.rb
|
44
45
|
- lib/sub_diff/collection.rb
|
45
46
|
- lib/sub_diff/core_ext/string.rb
|