intercept 0.2.0 → 0.2.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 +35 -0
- data/lib/intercept/strategy/mapper.rb +21 -13
- data/lib/intercept/strategy/replace.rb +18 -8
- data/lib/intercept/strategy/white_list.rb +20 -12
- data/lib/intercept/strategy_builder.rb +20 -0
- data/lib/intercept/version.rb +1 -1
- data/lib/intercept/worker.rb +2 -1
- data/lib/intercept.rb +1 -1
- data/lib/intercept_builder.rb +16 -0
- data/spec/intercept_spec.rb +74 -3
- metadata +5 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e56f4f1b02dc729c6fd52202cb2b66815dcb9c4d69ae0506c8c47d31f9b68b6f
|
4
|
+
data.tar.gz: 7074c0a9068a95c5a3e8fdd7a21bffcac609f4022e04b2d24376c797bbef9742
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 32c8330a345f09525f72f3302adee6fa15ac8d93fbf37a07e4a3adec06a9d782a17bbd3fec3a9e4a049e3e908c9f5ab73b336de0bd109ae4369bce724f69d411
|
7
|
+
data.tar.gz: ba6ff84415a592f27b46d786a9292fc3a33d9d4232f6fc7078b8e474dd22067d2ffe38c60256b1958d175cd7bdca07fc0e0869efcad875e45b8589ea525945d6
|
data/Gemfile.lock
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
intercept (0.2.1)
|
5
|
+
|
6
|
+
GEM
|
7
|
+
remote: https://rubygems.org/
|
8
|
+
specs:
|
9
|
+
diff-lcs (1.3)
|
10
|
+
rake (10.5.0)
|
11
|
+
rspec (3.8.0)
|
12
|
+
rspec-core (~> 3.8.0)
|
13
|
+
rspec-expectations (~> 3.8.0)
|
14
|
+
rspec-mocks (~> 3.8.0)
|
15
|
+
rspec-core (3.8.0)
|
16
|
+
rspec-support (~> 3.8.0)
|
17
|
+
rspec-expectations (3.8.2)
|
18
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
19
|
+
rspec-support (~> 3.8.0)
|
20
|
+
rspec-mocks (3.8.0)
|
21
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
22
|
+
rspec-support (~> 3.8.0)
|
23
|
+
rspec-support (3.8.0)
|
24
|
+
|
25
|
+
PLATFORMS
|
26
|
+
ruby
|
27
|
+
|
28
|
+
DEPENDENCIES
|
29
|
+
bundler (~> 1.16)
|
30
|
+
intercept!
|
31
|
+
rake (~> 10.0)
|
32
|
+
rspec (~> 3.0)
|
33
|
+
|
34
|
+
BUNDLED WITH
|
35
|
+
1.16.2
|
@@ -6,31 +6,39 @@ module Intercept
|
|
6
6
|
attr_reader :bucket_map, :fallback_strategy
|
7
7
|
|
8
8
|
def initialize(bucket_map, fallback_strategy = nil)
|
9
|
-
@bucket_map = bucket_map
|
9
|
+
@bucket_map = parse_bucket_map bucket_map
|
10
10
|
@fallback_strategy = fallback_strategy
|
11
11
|
end
|
12
12
|
|
13
|
-
def
|
14
|
-
return
|
13
|
+
def process(value)
|
14
|
+
return value if value.nil? || value.empty?
|
15
15
|
|
16
|
-
|
16
|
+
mapped_value = map_value(value)
|
17
17
|
|
18
|
-
if fallback_strategy &&
|
19
|
-
fallback_strategy.
|
18
|
+
if fallback_strategy && mapped_value.empty?
|
19
|
+
fallback_strategy.process(value)
|
20
20
|
else
|
21
|
-
|
21
|
+
mapped_value
|
22
22
|
end
|
23
23
|
end
|
24
24
|
|
25
25
|
private
|
26
26
|
|
27
|
-
def
|
28
|
-
|
29
|
-
bucket_map
|
30
|
-
|
31
|
-
|
27
|
+
def parse_bucket_map(bucket_map)
|
28
|
+
if bucket_map.respond_to?(:call)
|
29
|
+
bucket_map
|
30
|
+
else
|
31
|
+
raise '@param bucket_map must respond to #call'
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def map_value(value)
|
36
|
+
value.map do |unit|
|
37
|
+
bucket_map.call.find do |bucket, _|
|
38
|
+
bucket.match?(unit)
|
39
|
+
end&.fetch(1)
|
32
40
|
end.compact.uniq
|
33
41
|
end
|
34
42
|
end
|
35
43
|
end
|
36
|
-
end
|
44
|
+
end
|
@@ -3,19 +3,29 @@
|
|
3
3
|
module Intercept
|
4
4
|
module Strategy
|
5
5
|
class Replace
|
6
|
-
attr_reader :
|
6
|
+
attr_reader :replace_value
|
7
7
|
|
8
|
-
def initialize(
|
9
|
-
@
|
8
|
+
def initialize(replace_value)
|
9
|
+
@replace_value = replace_value
|
10
10
|
end
|
11
11
|
|
12
|
-
def
|
13
|
-
if
|
14
|
-
|
12
|
+
def process(value)
|
13
|
+
if value.nil? || value.empty?
|
14
|
+
value
|
15
15
|
else
|
16
|
-
|
16
|
+
replace_value.call
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
private
|
21
|
+
|
22
|
+
def parse_replace_value(replace_value)
|
23
|
+
if replace_value.respond_to?(:call)
|
24
|
+
replace_value
|
25
|
+
else
|
26
|
+
raise '@param replace_value must respond to #call'
|
17
27
|
end
|
18
28
|
end
|
19
29
|
end
|
20
30
|
end
|
21
|
-
end
|
31
|
+
end
|
@@ -6,31 +6,39 @@ module Intercept
|
|
6
6
|
attr_reader :white_list, :fallback_strategy
|
7
7
|
|
8
8
|
def initialize(white_list, fallback_strategy = nil)
|
9
|
-
@white_list = white_list
|
9
|
+
@white_list = parse_white_list white_list
|
10
10
|
@fallback_strategy = fallback_strategy
|
11
11
|
end
|
12
12
|
|
13
|
-
def
|
14
|
-
return
|
13
|
+
def process(value)
|
14
|
+
return value if value.nil? || value.empty?
|
15
15
|
|
16
|
-
|
16
|
+
white_listed_value = white_list_value(value)
|
17
17
|
|
18
|
-
if fallback_strategy &&
|
19
|
-
fallback_strategy.
|
18
|
+
if fallback_strategy && white_listed_value.empty?
|
19
|
+
fallback_strategy.process(value)
|
20
20
|
else
|
21
|
-
|
21
|
+
white_listed_value
|
22
22
|
end
|
23
23
|
end
|
24
24
|
|
25
25
|
private
|
26
26
|
|
27
|
-
def
|
28
|
-
|
29
|
-
white_list
|
30
|
-
|
27
|
+
def parse_white_list(white_list)
|
28
|
+
if white_list.respond_to?(:call)
|
29
|
+
white_list
|
30
|
+
else
|
31
|
+
raise '@param white_list must respond to #call'
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def white_list_value(value)
|
36
|
+
value.select do |unit|
|
37
|
+
white_list.call.find do |regex|
|
38
|
+
regex.match?(unit)
|
31
39
|
end
|
32
40
|
end.compact.uniq
|
33
41
|
end
|
34
42
|
end
|
35
43
|
end
|
36
|
-
end
|
44
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Intercept
|
4
|
+
class StrategyBuilder
|
5
|
+
def self.from_hash(strategy)
|
6
|
+
return unless strategy
|
7
|
+
strategy_class = get_class(strategy[:name])
|
8
|
+
|
9
|
+
if fallback = Intercept::StrategyBuilder.from_hash(strategy[:fallback])
|
10
|
+
strategy_class.new(strategy[:args], fallback)
|
11
|
+
else
|
12
|
+
strategy_class.new(strategy[:args])
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.get_class(symbol)
|
17
|
+
Object.const_get "Intercept::Strategy::#{symbol.to_s.split('_').map{ |w| w.capitalize }.join}"
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
data/lib/intercept/version.rb
CHANGED
data/lib/intercept/worker.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require 'intercept/strategy_builder'
|
3
4
|
require 'intercept/strategy/replace'
|
4
5
|
require 'intercept/strategy/mapper'
|
5
6
|
require 'intercept/strategy/white_list'
|
@@ -28,7 +29,7 @@ module Intercept
|
|
28
29
|
def intercept(message)
|
29
30
|
interceptor_map.each do |field, strategy|
|
30
31
|
if message.respond_to?(field) && message.respond_to?("#{field}=")
|
31
|
-
message.public_send("#{field}=", strategy.
|
32
|
+
message.public_send("#{field}=", strategy.process(message.public_send field))
|
32
33
|
end
|
33
34
|
end
|
34
35
|
|
data/lib/intercept.rb
CHANGED
@@ -0,0 +1,16 @@
|
|
1
|
+
class InterceptBuilder
|
2
|
+
def self.build_worker(callback, description)
|
3
|
+
interceptor_map = {}
|
4
|
+
decorator_map = {}
|
5
|
+
|
6
|
+
description[:interception].each do |unit|
|
7
|
+
strategy = Intercept::StrategyBuilder.from_hash(unit[:strategy])
|
8
|
+
|
9
|
+
unit[:fields].each do |field|
|
10
|
+
interceptor_map[field] = strategy
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
Intercept::Worker.new(callback, interceptor_map, decorator_map)
|
15
|
+
end
|
16
|
+
end
|
data/spec/intercept_spec.rb
CHANGED
@@ -1,9 +1,80 @@
|
|
1
1
|
RSpec.describe Intercept do
|
2
|
-
|
2
|
+
class TestMessage
|
3
|
+
attr_accessor :to, :bcc
|
4
|
+
|
5
|
+
def initialize(to, bcc)
|
6
|
+
@to = to; @bcc = bcc
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
let(:white_list) { Proc.new { [Regexp.new('^\\S+@me.in$'), Regexp.new('^\\S+@me.com$')] } }
|
11
|
+
let(:mapper) { Proc.new { { Regexp.new('^\\S+.g.p@you.com$') => 'g.p@you.in' } } }
|
12
|
+
let(:replace) { Proc.new { %w(g.p@me.in k.@me.in) } }
|
13
|
+
|
14
|
+
let(:interceptor_description) {
|
15
|
+
{
|
16
|
+
interception: [
|
17
|
+
{
|
18
|
+
fields: [:to],
|
19
|
+
strategy: {
|
20
|
+
name: :white_list,
|
21
|
+
args: white_list,
|
22
|
+
fallback: {
|
23
|
+
name: :mapper,
|
24
|
+
args: mapper,
|
25
|
+
fallback: {
|
26
|
+
name: :replace,
|
27
|
+
args: replace
|
28
|
+
}
|
29
|
+
}
|
30
|
+
}
|
31
|
+
},
|
32
|
+
{
|
33
|
+
fields: [:cc, :bcc],
|
34
|
+
strategy: {
|
35
|
+
name: :white_list,
|
36
|
+
args: white_list,
|
37
|
+
fallback: {
|
38
|
+
name: :mapper,
|
39
|
+
args: mapper
|
40
|
+
}
|
41
|
+
}
|
42
|
+
}
|
43
|
+
],
|
44
|
+
decoration: []
|
45
|
+
}
|
46
|
+
}
|
47
|
+
|
48
|
+
let(:callback) { :delivering_message }
|
49
|
+
|
50
|
+
let(:interceptor) { InterceptBuilder.build_worker(callback, interceptor_description) }
|
51
|
+
|
52
|
+
it 'has a version number' do
|
3
53
|
expect(Intercept::VERSION).not_to be nil
|
4
54
|
end
|
5
55
|
|
6
|
-
it
|
7
|
-
expect(
|
56
|
+
it 'responds to callback method' do
|
57
|
+
expect(interceptor.respond_to? callback).to eq true
|
58
|
+
end
|
59
|
+
|
60
|
+
it 'when white_list is enough' do
|
61
|
+
message = TestMessage.new(%w(a@a.a a@me.in b@b.b a@me.com), %w(a@a.a a@me.in b@b.b a@me.com))
|
62
|
+
interceptor.intercept(message)
|
63
|
+
expect(message.to).to eq(%w(a@me.in a@me.com))
|
64
|
+
expect(message.bcc).to eq(%w(a@me.in a@me.com))
|
65
|
+
end
|
66
|
+
|
67
|
+
it 'when mapper is enough' do
|
68
|
+
message = TestMessage.new(%w(a@a.a 1.g.p@you.in b@b.b 1.g.p@you.com), %w(a@a.a 1.g.p@you.in b@b.b 1.g.p@you.com))
|
69
|
+
interceptor.intercept(message)
|
70
|
+
expect(message.to).to eq(%w(g.p@you.in))
|
71
|
+
expect(message.bcc).to eq(%w(g.p@you.in))
|
72
|
+
end
|
73
|
+
|
74
|
+
it 'when fallback is needed' do
|
75
|
+
message = TestMessage.new(%w(a@a.a 1.a.p@you.in b@b.b 1.a.p@you.com), %w(a@a.a 1.a.p@you.in b@b.b 1.a.p@you.com))
|
76
|
+
interceptor.intercept(message)
|
77
|
+
expect(message.to).to eq(%w(g.p@me.in k.@me.in))
|
78
|
+
expect(message.bcc).to eq([])
|
8
79
|
end
|
9
80
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: intercept
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Gemin Patel
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-11-
|
11
|
+
date: 2018-11-22 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -64,6 +64,7 @@ files:
|
|
64
64
|
- ".travis.yml"
|
65
65
|
- CODE_OF_CONDUCT.md
|
66
66
|
- Gemfile
|
67
|
+
- Gemfile.lock
|
67
68
|
- LICENSE.txt
|
68
69
|
- README.md
|
69
70
|
- Rakefile
|
@@ -74,8 +75,10 @@ files:
|
|
74
75
|
- lib/intercept/strategy/mapper.rb
|
75
76
|
- lib/intercept/strategy/replace.rb
|
76
77
|
- lib/intercept/strategy/white_list.rb
|
78
|
+
- lib/intercept/strategy_builder.rb
|
77
79
|
- lib/intercept/version.rb
|
78
80
|
- lib/intercept/worker.rb
|
81
|
+
- lib/intercept_builder.rb
|
79
82
|
- spec/intercept_spec.rb
|
80
83
|
- spec/spec_helper.rb
|
81
84
|
homepage: https://github.com/GeminPatel/intercept
|