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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b8545ab8342d8437069c4f8bae1096cc88a541932086c29a1a697fc5ddf53bd1
4
- data.tar.gz: c72134e33df3909b77734d554c68c7ee3db58f037a04ef3bd1b4f7fcc7847eb0
3
+ metadata.gz: e56f4f1b02dc729c6fd52202cb2b66815dcb9c4d69ae0506c8c47d31f9b68b6f
4
+ data.tar.gz: 7074c0a9068a95c5a3e8fdd7a21bffcac609f4022e04b2d24376c797bbef9742
5
5
  SHA512:
6
- metadata.gz: 215018d5e8bce4ee3bc2e49b733a28b92803bb747947ff44b3e95fe3e73a899ad1c7691a4fa274df44188d19678119c0e1b46568c6f65c3e3fa90a4e049fb9ea
7
- data.tar.gz: f346a8deedd06161621330767bded0b3858d5ba07bc2742eb19a4ed0c2cd92694fb14d7258bdae50835880525e58b74201e91172da75d1b71d0ce7259d34e113
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 process_identities(identities)
14
- return [] if identities.blank?
13
+ def process(value)
14
+ return value if value.nil? || value.empty?
15
15
 
16
- mapped_identities = map_identities(identities)
16
+ mapped_value = map_value(value)
17
17
 
18
- if fallback_strategy && mapped_identities.empty?
19
- fallback_strategy.process_identities(identities)
18
+ if fallback_strategy && mapped_value.empty?
19
+ fallback_strategy.process(value)
20
20
  else
21
- mapped_identities
21
+ mapped_value
22
22
  end
23
23
  end
24
24
 
25
25
  private
26
26
 
27
- def map_identities(identities)
28
- identities.map do |identity|
29
- bucket_map.find do |bucket, _|
30
- Regexp.new(bucket).match?(identity)
31
- end&.second
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 :replace_identities
6
+ attr_reader :replace_value
7
7
 
8
- def initialize(replace_identities)
9
- @replace_identities = replace_identities
8
+ def initialize(replace_value)
9
+ @replace_value = replace_value
10
10
  end
11
11
 
12
- def process_identities(identities)
13
- if identities.blank?
14
- []
12
+ def process(value)
13
+ if value.nil? || value.empty?
14
+ value
15
15
  else
16
- replace_identities
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 process_identities(identities)
14
- return [] if identities.blank?
13
+ def process(value)
14
+ return value if value.nil? || value.empty?
15
15
 
16
- white_listed_identities = white_list_identities(identities)
16
+ white_listed_value = white_list_value(value)
17
17
 
18
- if fallback_strategy && white_listed_identities.empty?
19
- fallback_strategy.process_identities(identities)
18
+ if fallback_strategy && white_listed_value.empty?
19
+ fallback_strategy.process(value)
20
20
  else
21
- white_listed_identities
21
+ white_listed_value
22
22
  end
23
23
  end
24
24
 
25
25
  private
26
26
 
27
- def white_list_identities(identities)
28
- identities.select do |identity|
29
- white_list.find do |regex|
30
- Regexp.new(regex).match?(identity)
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
@@ -1,3 +1,3 @@
1
1
  module Intercept
2
- VERSION = "0.2.0"
2
+ VERSION = '0.2.1'
3
3
  end
@@ -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.process_identities(message.public_send field))
32
+ message.public_send("#{field}=", strategy.process(message.public_send field))
32
33
  end
33
34
  end
34
35
 
data/lib/intercept.rb CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  require 'intercept/version'
4
4
  require 'intercept/worker'
5
+ require 'intercept_builder'
5
6
 
6
7
  module Intercept
7
-
8
8
  end
@@ -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
@@ -1,9 +1,80 @@
1
1
  RSpec.describe Intercept do
2
- it "has a version number" do
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 "does something useful" do
7
- expect(false).to eq(true)
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.0
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-20 00:00:00.000000000 Z
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