intercept 0.2.0 → 0.2.1
Sign up to get free protection for your applications and to get access to all the features.
- 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
|