Skip to content

Commit 8d926aa

Browse files
committed
Merge pull request #25 from IFTTT/fix-custom-strategies
Fix Custom Strategy
2 parents 791d8c0 + b79e48e commit 8d926aa

File tree

4 files changed

+35
-5
lines changed

4 files changed

+35
-5
lines changed

lib/polo/configuration.rb

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,28 @@ class Configuration
66
def initialize(options={})
77
options = { on_duplicate: nil, obfuscate: {} }.merge(options)
88
@on_duplicate_strategy = options[:on_duplicate]
9-
@blacklist = options[:obfuscate]
9+
obfuscate(options[:obfuscate])
1010
end
1111

12+
# TODO: document this
13+
# This normalizes an array or hash of fields to a hash of
14+
# { field_name => strategy }
1215
def obfuscate(*fields)
13-
@blacklist = fields
16+
if fields.is_a?(Array)
17+
fields = fields.flatten
18+
end
19+
20+
fields_and_strategies = {}
21+
22+
fields.each do |field|
23+
if field.is_a?(Symbol) || field.is_a?(String)
24+
fields_and_strategies[field] = nil
25+
elsif field.is_a?(Hash)
26+
fields_and_strategies = fields_and_strategies.merge(field)
27+
end
28+
end
29+
30+
@blacklist = fields_and_strategies
1431
end
1532

1633
def on_duplicate(strategy)

lib/polo/translator.rb

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ def instances
3636
def obfuscate!(instances, fields)
3737
instances.each do |instance|
3838
next if intersection(instance.attributes.keys, fields).empty?
39+
3940
fields.each do |field, strategy|
4041
value = instance.attributes[field.to_s] || ''
4142
instance.send("#{field}=", new_field_value(field, strategy, value))
@@ -44,7 +45,7 @@ def obfuscate!(instances, fields)
4445
end
4546

4647
def intersection(attrs, fields)
47-
attrs & fields.to_a.flatten.map(&:to_s)
48+
attrs & fields.keys.map(&:to_s)
4849
end
4950

5051
def new_field_value(field, strategy, value)

spec/configuration_spec.rb

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,18 +28,20 @@
2828
end
2929

3030
defaults = Polo.defaults
31-
expect(defaults.blacklist).to eq([:email, :password])
31+
expect(defaults.blacklist).to eq({ :email => nil, :password => nil })
3232
end
3333

3434
it 'allows for the user to define fields with strategies in blacklist' do
3535
Polo.configure do
36+
3637
email_strategy = lambda {|e| "#{e.split("@")[0]}_test@example.com" }
3738
credit_card_strategy = lambda {|_| "4111111111111111"}
39+
3840
obfuscate({email: email_strategy, credit_card: credit_card_strategy})
3941
end
4042

4143
defaults = Polo.defaults
42-
expect(defaults.blacklist.first[:email].call("a@b.com")).to eq("a_test@example.com")
44+
expect(defaults.blacklist[:email].call("a@b.com")).to eq("a_test@example.com")
4345
end
4446
end
4547
end

spec/polo_spec.rb

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,16 @@
7878
expect(scrambled_email).to_not eq('nettofarah@gmail.com')
7979
expect(insert).to match(exp.first)
8080
end
81+
82+
it 'can apply custom strategies' do
83+
Polo.configure do
84+
obfuscate(email: lambda { |_| 'changeme' })
85+
end
86+
87+
inserts = Polo.explore(AR::Chef, 1)
88+
89+
expect(inserts).to eq [ %q{INSERT INTO `chefs` (`id`, `name`, `email`) VALUES (1, 'Netto', 'changeme')} ]
90+
end
8191
end
8292

8393
describe 'on_duplicate' do

0 commit comments

Comments
 (0)