mandriller 0.0.7 → 0.1.0

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
  SHA1:
3
- metadata.gz: e6471be440ee6fe69a9383bebf2ea69fb6d05ad5
4
- data.tar.gz: 88888794cc5c8b1528b1a1e34d9fa81b74c48744
3
+ metadata.gz: f6f8a21fe30516b7591eac904689150c3231f3a3
4
+ data.tar.gz: 5e70cb7b74773ff237770cde06c4f8afec9db816
5
5
  SHA512:
6
- metadata.gz: 8884f892a5f9531decc1c96e9eccbecd222cab9a00d2b9df82c8842caf982f1b44595b6afa268c27b95b2221d12efd3eae19e7ae904d280e1e88cb782082fbe4
7
- data.tar.gz: a485da59610919903d1ff3b123cde479f22240ca7d79e6e060a9279fc7d0af96811a2ed4ca49d1e16d38c4f96b4366c2f2ea340188e2d2c255f8fa9da448aaca
6
+ metadata.gz: 0167c5e60881e6427b01508055339a3ccfc4b7dd05c7031735d7132b9e5a1042093c048bdf70f0e8c49f36365f651804be506ef8fa98a215661b31d0a27de557
7
+ data.tar.gz: b6eda0ad6ca15ef2b287b14d0234ed3056e78f9584a69e166d426c7b008c5ff042dee068c0bd8d974246e626d5fc7f44dba6b97225366d2e7486be0c83658fbe
@@ -31,13 +31,16 @@ class Mandriller::Base < ActionMailer::Base
31
31
  google_analytics: 'X-MC-GoogleAnalytics',
32
32
  tags: 'X-MC-Tags',
33
33
  }
34
- define_settings_methods BOOLEAN_SETTINGS.keys, default: true
35
- define_settings_methods STRING_SETTINGS.keys
36
- define_settings_methods JSON_SETTINGS.keys
37
- define_settings_methods ARRAY_SETTINGS.keys
34
+ DATETIME_SETTINGS = {
35
+ send_at: 'X-MC-SendAt',
36
+ }
37
+ define_settings_methods BOOLEAN_SETTINGS.keys, default: true, getter: lambda { |v| v ? 'true' : 'false' }
38
+ define_settings_methods STRING_SETTINGS.keys, getter: lambda { |v| v.to_s }
39
+ define_settings_methods JSON_SETTINGS.keys, getter: lambda { |v| MultiJson.dump(v) }
40
+ define_settings_methods ARRAY_SETTINGS.keys, getter: lambda { |v| Array(v).join(',') }
41
+ define_settings_methods DATETIME_SETTINGS.keys, getter: lambda { |v| v.to_time.utc.strftime('%Y-%m-%d %H:%M:%S') }
38
42
  define_settings_methods :open_track, default: true
39
43
  define_settings_methods :click_track, default: 'all'
40
- define_settings_methods :send_at
41
44
 
42
45
  class_attribute :mandrill_template
43
46
 
@@ -53,8 +56,8 @@ class Mandriller::Base < ActionMailer::Base
53
56
 
54
57
  def mail(*args)
55
58
  tracks = []
56
- tracks << (get_mandrill_setting("open_track") ? 'opens' : nil)
57
- if v = get_mandrill_setting("click_track")
59
+ tracks << (mandrill_open_track ? 'opens' : nil)
60
+ if v = mandrill_click_track
58
61
  tracks << "clicks_#{v}"
59
62
  end
60
63
  tracks = tracks.compact.map(&:to_s)
@@ -65,30 +68,13 @@ class Mandriller::Base < ActionMailer::Base
65
68
  self.headers['X-MC-Track'] = tracks.join(',')
66
69
  end
67
70
 
68
- v = get_mandrill_setting("template")
71
+ v = mandrill_template
69
72
  self.headers['X-MC-Template'] = v.join('|') unless v.nil? || v.empty?
70
73
 
71
- v = get_mandrill_setting("send_at")
72
- self.headers['X-MC-SendAt'] = v.to_time.utc.strftime('%Y-%m-%d %H:%M:%S') unless v.nil?
73
-
74
- BOOLEAN_SETTINGS.each do |key, header_name|
75
- v = get_mandrill_setting(key)
76
- self.headers[header_name] = v ? 'true' : 'false' unless v.nil?
77
- end
78
-
79
- STRING_SETTINGS.each do |key, header_name|
80
- v = get_mandrill_setting(key)
81
- self.headers[header_name] = v.to_s unless v.nil?
82
- end
83
-
84
- JSON_SETTINGS.each do |key, header_name|
85
- v = get_mandrill_setting(key)
86
- self.headers[header_name] = MultiJson.dump(v) unless v.nil?
87
- end
88
-
89
- ARRAY_SETTINGS.each do |key, header_name|
90
- v = get_mandrill_setting(key)
91
- self.headers[header_name] = Array(v).join(',') unless v.nil?
74
+ [BOOLEAN_SETTINGS, STRING_SETTINGS, JSON_SETTINGS, ARRAY_SETTINGS, DATETIME_SETTINGS].inject({}, :merge).each do |key, header_name|
75
+ if is_mandrill_setting_defined?(key)
76
+ self.headers[header_name] = get_mandrill_setting(key)
77
+ end
92
78
  end
93
79
 
94
80
  super(*args)
@@ -7,30 +7,59 @@ module Mandriller
7
7
  module ClassMethods
8
8
  def define_settings_methods(*keys)
9
9
  options = keys[-1].is_a?(Hash) ? keys.pop : {}
10
+
11
+ keys.flatten.each do |key|
12
+ class_attribute "mandrill_#{key}"
13
+
14
+ define_mandrill_setter(key, options)
15
+ define_mandrill_getter(key, options)
16
+ end
17
+ end
18
+
19
+ private
20
+
21
+ def define_mandrill_setter(key, options = {})
10
22
  if default = options[:default]
11
23
  arg_s = "v = #{default.inspect}"
12
24
  else
13
25
  arg_s = "v"
14
26
  end
15
27
 
16
- keys.flatten.each do |key|
17
- class_eval <<-EOS
18
- class_attribute :mandrill_#{key}
19
- def self.set_#{key}(#{arg_s})
28
+ method_name = "set_mandrill_setting_#{key}"
29
+ [self, singleton_class].each do |base|
30
+ base.class_eval <<-EOS
31
+ def #{method_name}(#{arg_s})
20
32
  self.mandrill_#{key} = v
21
33
  end
22
- private_class_method :set_#{key}
23
- def set_#{key}(#{arg_s})
24
- @mandrill_#{key} = v
25
- end
26
- private :set_#{key}
34
+ private :#{method_name}
35
+ alias_method :set_#{key}, :#{method_name}
27
36
  EOS
28
37
  end
29
38
  end
39
+
40
+ def define_mandrill_getter(key, options = {})
41
+ getter = options[:getter]
42
+
43
+ method_name = "get_mandrill_setting_#{key}"
44
+ define_method method_name do
45
+ v = __send__("mandrill_#{key}")
46
+ if getter
47
+ getter.call(v)
48
+ else
49
+ v
50
+ end
51
+ end
52
+ private method_name
53
+ end
54
+ end
55
+
56
+ def is_mandrill_setting_defined?(key)
57
+ !__send__("mandrill_#{key}").nil?
30
58
  end
59
+ private :is_mandrill_setting_defined?
31
60
 
32
61
  def get_mandrill_setting(key)
33
- instance_variable_defined?("@mandrill_#{key}") ? instance_variable_get("@mandrill_#{key}") : __send__("mandrill_#{key}")
62
+ __send__ "get_mandrill_setting_#{key}"
34
63
  end
35
64
  private :get_mandrill_setting
36
65
  end
@@ -1,3 +1,3 @@
1
1
  module Mandriller
2
- VERSION = '0.0.7'
2
+ VERSION = '0.1.0'
3
3
  end
@@ -154,7 +154,7 @@ describe Mandriller::Base do
154
154
  tags: 'X-MC-Tags',
155
155
  }
156
156
  ARRAY_SETTINGS.each do |key, header|
157
- describe "X-MC-GoogleAnalytics header" do
157
+ describe "#{header} header" do
158
158
  context "no set" do
159
159
  it_behaves_like "without header", header
160
160
  end
@@ -181,6 +181,37 @@ describe Mandriller::Base do
181
181
  end
182
182
  end
183
183
 
184
+ DATETIME_SETTINGS = {
185
+ send_at: 'X-MC-SendAt',
186
+ }
187
+ DATETIME_SETTINGS.each do |key, header|
188
+ describe "#{header} header" do
189
+ context "no set" do
190
+ it_behaves_like "without header", header
191
+ end
192
+ context "set by #set_#{key}" do
193
+ let(:local_settings) { lambda{ __send__("set_#{key}", DateTime.new(2001, 1, 2, 3, 4, 5)) } }
194
+ it_behaves_like "with header", header, '2001-01-02 03:04:05'
195
+ end
196
+ context "set by ::set_#{key}" do
197
+ let(:global_settings) { lambda{ __send__("set_#{key}", DateTime.new(2001, 1, 2, 3, 4, 5)) } }
198
+ it_behaves_like "with header", header, '2001-01-02 03:04:05'
199
+ end
200
+ context "set by both #set_#{key} and ::set_#{key}" do
201
+ context "set value globally and set value locally" do
202
+ let(:global_settings) { lambda{ __send__("set_#{key}", DateTime.new(2001, 1, 2, 3, 4, 5)) } }
203
+ let(:local_settings) { lambda{ __send__("set_#{key}", DateTime.new(2001, 1, 2, 3, 4, 6)) } }
204
+ it_behaves_like "with header", header, '2001-01-02 03:04:06'
205
+ end
206
+ context "set value globally but set nil locally" do
207
+ let(:global_settings) { lambda{ __send__("set_#{key}", DateTime.new(2001, 1, 2, 3, 4, 5)) } }
208
+ let(:local_settings) { lambda{ __send__("set_#{key}", nil) } }
209
+ it_behaves_like "without header", header
210
+ end
211
+ end
212
+ end
213
+ end
214
+
184
215
  describe "X-MC-Track header" do
185
216
  header = "X-MC-Track"
186
217
  context "no set" do
@@ -241,32 +272,4 @@ describe Mandriller::Base do
241
272
  end
242
273
  end
243
274
  end
244
-
245
- describe "X-MC-SendAt header" do
246
- key = 'send_at'
247
- header = "X-MC-SendAt"
248
- context "no set" do
249
- it_behaves_like "without header", header
250
- end
251
- context "set by #set_#{key}" do
252
- let(:local_settings) { lambda{ __send__("set_#{key}", DateTime.new(2001, 1, 2, 3, 4, 5)) } }
253
- it_behaves_like "with header", header, '2001-01-02 03:04:05'
254
- end
255
- context "set by ::set_#{key}" do
256
- let(:global_settings) { lambda{ __send__("set_#{key}", DateTime.new(2001, 1, 2, 3, 4, 5)) } }
257
- it_behaves_like "with header", header, '2001-01-02 03:04:05'
258
- end
259
- context "set by both #set_#{key} and ::set_#{key}" do
260
- context "set value globally and set value locally" do
261
- let(:global_settings) { lambda{ __send__("set_#{key}", DateTime.new(2001, 1, 2, 3, 4, 5)) } }
262
- let(:local_settings) { lambda{ __send__("set_#{key}", DateTime.new(2001, 1, 2, 3, 4, 6)) } }
263
- it_behaves_like "with header", header, '2001-01-02 03:04:06'
264
- end
265
- context "set value globally but set nil locally" do
266
- let(:global_settings) { lambda{ __send__("set_#{key}", DateTime.new(2001, 1, 2, 3, 4, 5)) } }
267
- let(:local_settings) { lambda{ __send__("set_#{key}", nil) } }
268
- it_behaves_like "without header", header
269
- end
270
- end
271
- end
272
275
  end
@@ -13,58 +13,90 @@ describe Mandriller::SettingsMethods do
13
13
  klass
14
14
  end
15
15
 
16
- it "defines the methods" do
17
- expect(subject.private_methods).to include(:set_foo)
18
- expect(subject).to respond_to(:mandrill_foo)
19
- expect(subject.private_instance_methods).to include(:set_foo)
16
+ describe "::define_settings_methods" do
17
+ it "defines the methods" do
18
+ expect(subject.private_methods).to include(:set_mandrill_setting_foo)
19
+ expect(subject.private_methods).to include(:set_foo)
20
+ expect(subject).to respond_to(:mandrill_foo)
21
+ expect(subject.private_instance_methods).to include(:set_mandrill_setting_foo)
22
+ expect(subject.private_instance_methods).to include(:set_foo)
23
+ expect(subject.private_instance_methods).to include(:get_mandrill_setting_foo)
20
24
 
21
- instance = subject.new
22
- expect(instance.instance_variable_defined?("@mandrill_foo")).to eq(false)
23
- end
24
- it "sets the instance variable" do
25
- instance = subject.new
26
- instance.send :set_foo, 'foo'
27
- expect(instance.instance_variable_get("@mandrill_foo")).to eq('foo')
28
- end
29
- it "sets the class attribute" do
30
- subject.send :set_foo, 'foo'
31
- expect(subject.mandrill_foo).to eq('foo')
32
- end
25
+ instance = subject.new
26
+ expect(instance.instance_variable_defined?("@mandrill_foo")).to eq(false)
27
+ end
33
28
 
34
- context "with default option" do
35
- subject do
36
- klass.class_eval do
37
- define_settings_methods :foo, default: 'bar'
38
- end
39
- klass
29
+ it "sets the instance variable" do
30
+ instance = subject.new
31
+ instance.send :set_mandrill_setting_foo, 'foo'
32
+ expect(instance.instance_variable_get("@mandrill_foo")).to eq('foo')
33
+ end
34
+ it "sets the class attribute" do
35
+ subject.send :set_mandrill_setting_foo, 'foo'
36
+ expect(subject.mandrill_foo).to eq('foo')
40
37
  end
41
- it "sets the instance variable with default value" do
38
+ it "gets the value as is" do
42
39
  instance = subject.new
43
- instance.send :set_foo
44
- expect(instance.instance_variable_get("@mandrill_foo")).to eq('bar')
40
+ instance.send :set_mandrill_setting_foo, 'foo'
41
+ expect(instance.send(:get_mandrill_setting_foo)).to eq('foo')
42
+ end
43
+
44
+ context "with default option" do
45
+ subject do
46
+ klass.class_eval do
47
+ define_settings_methods :foo, default: 'bar'
48
+ end
49
+ klass
50
+ end
51
+ it "sets the instance variable with default value" do
52
+ instance = subject.new
53
+ instance.send :set_mandrill_setting_foo
54
+ expect(instance.instance_variable_get("@mandrill_foo")).to eq('bar')
55
+ end
56
+ it "sets the class attribute with default value" do
57
+ subject.send :set_mandrill_setting_foo
58
+ expect(subject.mandrill_foo).to eq('bar')
59
+ end
45
60
  end
46
- it "sets the class attribute with default value" do
47
- subject.send :set_foo
48
- expect(subject.mandrill_foo).to eq('bar')
61
+
62
+ context "with getter option" do
63
+ subject do
64
+ klass.class_eval do
65
+ define_settings_methods :foo, getter: lambda { |v| v.to_sym }
66
+ end
67
+ klass
68
+ end
69
+ it "gets the value as is" do
70
+ instance = subject.new
71
+ instance.send :set_mandrill_setting_foo, 'foo'
72
+ expect(instance.send(:get_mandrill_setting_foo)).to eq(:foo)
73
+ end
49
74
  end
50
75
  end
51
76
 
52
- describe "#get_mandrill_setting" do
53
- it "returns class_attribute" do
54
- subject.send :set_foo, 1
77
+ describe "#is_mandrill_setting_defined?" do
78
+ it "returns true for the value set globally" do
79
+ subject.send :set_mandrill_setting_foo, 1
55
80
  instance = subject.new
56
- expect(instance.send(:get_mandrill_setting, :foo)).to eq(1)
81
+ expect(instance.send(:is_mandrill_setting_defined?, :foo)).to eq(true)
57
82
  end
58
- it "returns instance_variable" do
83
+ it "returns true for the value set localy" do
59
84
  instance = subject.new
60
- instance.send :set_foo, 2
61
- expect(instance.send(:get_mandrill_setting, :foo)).to eq(2)
85
+ instance.send :set_mandrill_setting_foo, 2
86
+ expect(instance.send(:is_mandrill_setting_defined?, :foo)).to eq(true)
62
87
  end
63
- it "returns instance_variable over class_attribute" do
64
- subject.send :set_foo, 1
88
+ it "returns false for non set value" do
89
+ instance = subject.new
90
+ expect(instance.send(:is_mandrill_setting_defined?, :foo)).to eq(false)
91
+ end
92
+ end
93
+
94
+ describe "#get_mandrill_setting" do
95
+ it "delegates to the setting method" do
65
96
  instance = subject.new
66
- instance.send :set_foo, 2
67
- expect(instance.send(:get_mandrill_setting, :foo)).to eq(2)
97
+ ret = double
98
+ expect(instance).to receive(:get_mandrill_setting_foo).and_return(ret)
99
+ expect(instance.send(:get_mandrill_setting, :foo)).to eq(ret)
68
100
  end
69
101
  end
70
102
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mandriller
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.7
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Daisuke Taniwaki