chimpmunk 0.0.4 → 0.0.5
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/README.md +1 -9
- data/chimpmunk.gemspec +2 -1
- data/db/migrate/1_chimpmunk_migration.rb +1 -0
- data/lib/chimpmunk/email_campaign.rb +142 -67
- data/lib/chimpmunk/email_campaign_header.rb +1 -1
- data/lib/chimpmunk/email_campaign_image.rb +8 -2
- data/lib/chimpmunk/email_campaign_text.rb +3 -1
- data/lib/chimpmunk/email_list.rb +20 -24
- data/lib/chimpmunk/email_list_group.rb +20 -21
- data/lib/chimpmunk/email_list_grouping.rb +10 -11
- data/lib/chimpmunk/email_subscriber.rb +22 -23
- data/lib/chimpmunk/email_template.rb +23 -24
- data/lib/chimpmunk/version.rb +1 -1
- data/spec/chimpmunk/email_campaign_spec.rb +15 -2
- data/spec/spec_helper.rb +5 -0
- data/spec/support/stubs.rb +19 -10
- metadata +18 -4
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: a980ab3ac42186d0fe40586f7cbded021271d44f
|
|
4
|
+
data.tar.gz: 383c24bcdcbf03f459f5a6ca33cde42c19e15516
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 8123420f18835fc092dee804515bf778eb1c5146e423f074e944b3bc95120f6eeb9d23cee70a34dd00c329a5826b45bb3d5fb2d51b8aec8ce434eb427d8edf3a
|
|
7
|
+
data.tar.gz: 68c2147e4611ef3c6e865cbb550028b1eeed9fb5d237995148100ef6c1fbc854fbedc76cb83f70f26e8d11618a6206bc037ac6dd60486a5b319f5193ce486649
|
data/README.md
CHANGED
|
@@ -78,14 +78,6 @@ in `app/models` :
|
|
|
78
78
|
associated :one, :user # will have one :email_campaign_comment
|
|
79
79
|
editable_areas :posts
|
|
80
80
|
|
|
81
|
-
#
|
|
82
|
-
# must have a content method
|
|
83
|
-
#
|
|
84
|
-
def content
|
|
85
|
-
sections = {}
|
|
86
|
-
{sections: sections}
|
|
87
|
-
end
|
|
88
|
-
|
|
89
81
|
rails_admin do
|
|
90
82
|
edit do
|
|
91
83
|
field :title
|
|
@@ -111,7 +103,7 @@ in `app/models` :
|
|
|
111
103
|
in `app/views/chimpmunk/_posts.html.haml`, you should have an `mc:edit` somewhere in your template called 'posts'
|
|
112
104
|
|
|
113
105
|
```
|
|
114
|
-
-
|
|
106
|
+
- posts.each do |post|
|
|
115
107
|
.post.span-6
|
|
116
108
|
%h1= post.name
|
|
117
109
|
%p= post.body
|
data/chimpmunk.gemspec
CHANGED
|
@@ -20,7 +20,8 @@ Gem::Specification.new do |spec|
|
|
|
20
20
|
|
|
21
21
|
spec.add_dependency 'activerecord', ['>= 3.2', '< 5']
|
|
22
22
|
spec.add_dependency 'gibbon', '>= 1.1'
|
|
23
|
-
spec.add_dependency 'paperclip', '>= 4
|
|
23
|
+
spec.add_dependency 'paperclip', '>= 3.4'
|
|
24
|
+
spec.add_development_dependency 'rspec-rails'
|
|
24
25
|
|
|
25
26
|
spec.add_development_dependency "bundler", "~> 1.6"
|
|
26
27
|
spec.add_development_dependency "rake"
|
|
@@ -3,17 +3,6 @@ module Chimpmunk
|
|
|
3
3
|
class EmailCampaign < ::ActiveRecord::Base
|
|
4
4
|
attr_accessor :skip_update_callbacks, :skip_create_callbacks
|
|
5
5
|
|
|
6
|
-
#
|
|
7
|
-
# dynamic class methods for all mc_edit types
|
|
8
|
-
#
|
|
9
|
-
[:tags, :headers, :texts, :images].each do |mc_edit_type|
|
|
10
|
-
self.class_eval <<-EOF
|
|
11
|
-
def self.mc_edit_#{mc_edit_type}
|
|
12
|
-
@@mc_edit_#{mc_edit_type}
|
|
13
|
-
end
|
|
14
|
-
EOF
|
|
15
|
-
end
|
|
16
|
-
|
|
17
6
|
# rails 3
|
|
18
7
|
attr_accessible :title, :from_email, :from_name, :email_list_id, :subject, :email_template_id, :mailchimp_list_id, :send_date,
|
|
19
8
|
:mailchimp_campaign_id, :emails_sent, :clicked, :opened, :status, :hard_bounces, :soft_bounces, :unsubscribes, :forwards,
|
|
@@ -46,9 +35,16 @@ module Chimpmunk
|
|
|
46
35
|
# create header associations
|
|
47
36
|
#
|
|
48
37
|
def self.headers(*headers)
|
|
49
|
-
|
|
38
|
+
class << self; attr_accessor :mc_edit_headers; end
|
|
39
|
+
@mc_edit_headers = headers
|
|
40
|
+
|
|
50
41
|
headers.each do |header|
|
|
51
|
-
|
|
42
|
+
if Rails::VERSION::MAJOR == 4
|
|
43
|
+
has_one header.to_sym, -> { where(name: header.to_s) }, class_name: 'Chimpmunk::EmailCampaignHeader', foreign_key: :email_campaign_id, dependent: :destroy
|
|
44
|
+
else
|
|
45
|
+
attr_accessible[:default] << "#{header}_attributes"
|
|
46
|
+
has_one header.to_sym, conditions: { name: header.to_s }, class_name: 'Chimpmunk::EmailCampaignHeader', foreign_key: :email_campaign_id, dependent: :destroy
|
|
47
|
+
end
|
|
52
48
|
accepts_nested_attributes_for header.to_sym, allow_destroy: true
|
|
53
49
|
end
|
|
54
50
|
end
|
|
@@ -57,9 +53,16 @@ module Chimpmunk
|
|
|
57
53
|
# create text associations
|
|
58
54
|
#
|
|
59
55
|
def self.texts(*texts)
|
|
60
|
-
|
|
56
|
+
class << self; attr_accessor :mc_edit_texts; end
|
|
57
|
+
@mc_edit_texts = texts
|
|
58
|
+
|
|
61
59
|
texts.each do |text|
|
|
62
|
-
|
|
60
|
+
if Rails::VERSION::MAJOR == 4
|
|
61
|
+
has_one text.to_sym, -> { where(name: text.to_s) }, class_name: 'Chimpmunk::EmailCampaignText', foreign_key: :email_campaign_id, dependent: :destroy
|
|
62
|
+
else
|
|
63
|
+
attr_accessible[:default] << "#{text}_attributes"
|
|
64
|
+
has_one text.to_sym, conditions: { name: text.to_s }, class_name: 'Chimpmunk::EmailCampaignText', foreign_key: :email_campaign_id, dependent: :destroy
|
|
65
|
+
end
|
|
63
66
|
accepts_nested_attributes_for text.to_sym, allow_destroy: true
|
|
64
67
|
end
|
|
65
68
|
end
|
|
@@ -68,9 +71,16 @@ module Chimpmunk
|
|
|
68
71
|
# create image associations
|
|
69
72
|
#
|
|
70
73
|
def self.images(*images)
|
|
71
|
-
|
|
74
|
+
class << self; attr_accessor :mc_edit_images; end
|
|
75
|
+
@mc_edit_images = images
|
|
76
|
+
|
|
72
77
|
images.each do |image|
|
|
73
|
-
|
|
78
|
+
if Rails::VERSION::MAJOR == 4
|
|
79
|
+
has_one image.to_sym, -> { where(name: image.to_s) }, class_name: 'Chimpmunk::EmailCampaignImage', foreign_key: :email_campaign_id, dependent: :destroy
|
|
80
|
+
else
|
|
81
|
+
attr_accessible[:default] << "#{image}_attributes"
|
|
82
|
+
has_one image.to_sym, conditions: { name: image.to_s }, class_name: 'Chimpmunk::EmailCampaignImage', foreign_key: :email_campaign_id, dependent: :destroy
|
|
83
|
+
end
|
|
74
84
|
accepts_nested_attributes_for image.to_sym, allow_destroy: true
|
|
75
85
|
end
|
|
76
86
|
end
|
|
@@ -79,16 +89,57 @@ module Chimpmunk
|
|
|
79
89
|
# store mc:edit tag names
|
|
80
90
|
#
|
|
81
91
|
def self.editable_areas(*mc_edit_tags)
|
|
82
|
-
|
|
92
|
+
class << self; attr_accessor :mc_edit_editable_areas; end
|
|
93
|
+
@mc_edit_editable_areas = mc_edit_tags
|
|
83
94
|
end
|
|
84
95
|
|
|
85
96
|
#
|
|
86
97
|
# create has_many associations
|
|
87
98
|
#
|
|
88
99
|
def self.associated(association_type, *associations)
|
|
100
|
+
if association_type == :many
|
|
101
|
+
class << self; attr_accessor :mc_edit_has_many; end
|
|
102
|
+
@mc_edit_has_many = associations
|
|
103
|
+
else
|
|
104
|
+
class << self; attr_accessor :mc_edit_has_one; end
|
|
105
|
+
@mc_edit_has_one = associations
|
|
106
|
+
end
|
|
107
|
+
|
|
89
108
|
associations.each do |association|
|
|
109
|
+
# TODO: figure out has_one attr_accessible
|
|
110
|
+
# TODO: test relations in rails 4
|
|
111
|
+
if association_type == :many
|
|
112
|
+
if Rails::VERSION::MAJOR == 3
|
|
113
|
+
attr_accessible[:default] << "#{association.to_s.singularize}_ids"
|
|
114
|
+
|
|
115
|
+
self.class_eval <<-EOF
|
|
116
|
+
after_save do
|
|
117
|
+
self.email_campaign_#{association}.destroy_all
|
|
118
|
+
self.#{association.to_s.singularize}_ids.each{|xid| self.email_campaign_#{association}.create(#{association.to_s.singularize}_id: xid)}
|
|
119
|
+
end
|
|
120
|
+
EOF
|
|
121
|
+
end
|
|
122
|
+
else
|
|
123
|
+
if Rails::VERSION::MAJOR == 3
|
|
124
|
+
singular = association.to_s.singularize
|
|
125
|
+
singular_id = "#{singular}_id"
|
|
126
|
+
attr_accessible[:default] << singular_id
|
|
127
|
+
attr_accessor singular_id.to_sym
|
|
128
|
+
self.class_eval <<-EOF
|
|
129
|
+
after_save do
|
|
130
|
+
if self.property_id
|
|
131
|
+
e = EmailCampaign#{singular.titleize}.where(email_campaign_id: self.id).first_or_initialize
|
|
132
|
+
e.#{singular_id} = self.#{singular_id}
|
|
133
|
+
e.save
|
|
134
|
+
end
|
|
135
|
+
end
|
|
136
|
+
EOF
|
|
137
|
+
end
|
|
138
|
+
end
|
|
139
|
+
|
|
90
140
|
association_name = "email_campaign_#{association}".to_sym
|
|
91
|
-
send("has_#{association_type}", association_name, foreign_key: 'email_campaign_id')
|
|
141
|
+
send("has_#{association_type}", association_name, foreign_key: 'email_campaign_id', dependent: :destroy)
|
|
142
|
+
send("has_#{association_type}", association, through: association_name )
|
|
92
143
|
accepts_nested_attributes_for association_name, allow_destroy: true
|
|
93
144
|
end
|
|
94
145
|
end
|
|
@@ -198,24 +249,50 @@ module Chimpmunk
|
|
|
198
249
|
sections = {}
|
|
199
250
|
|
|
200
251
|
# headers
|
|
201
|
-
|
|
202
|
-
|
|
252
|
+
if headers = self.class.instance_variable_get('@mc_edit_headers')
|
|
253
|
+
headers.each do |tag|
|
|
254
|
+
sections[tag] = self.send(tag).text
|
|
255
|
+
end
|
|
203
256
|
end
|
|
204
257
|
|
|
205
258
|
# texts
|
|
206
|
-
|
|
207
|
-
|
|
259
|
+
if texts = self.class.instance_variable_get('@mc_edit_texts')
|
|
260
|
+
texts.each do |tag|
|
|
261
|
+
sections[tag] = self.send(tag).text
|
|
262
|
+
end
|
|
208
263
|
end
|
|
209
264
|
|
|
210
265
|
# images
|
|
211
|
-
|
|
212
|
-
|
|
266
|
+
if images = self.class.instance_variable_get('@mc_edit_images')
|
|
267
|
+
images.each do |tag|
|
|
268
|
+
sections[tag] = "<img src='http://#{Chimpmunk.domain_name}#{self.send(tag).image.url}' />"
|
|
269
|
+
end
|
|
270
|
+
end
|
|
271
|
+
|
|
272
|
+
# has_many
|
|
273
|
+
if has_many = self.class.instance_variable_get('@mc_edit_has_many')
|
|
274
|
+
has_many.each do |tag|
|
|
275
|
+
if File.directory?("app/views/chimpmunk") && !Dir["app/views/chimpmunk/_#{tag}**"].empty?
|
|
276
|
+
sections[tag] = action_view.render "chimpmunk/#{tag}", campaign: self, tag.to_sym => self.send(tag)
|
|
277
|
+
end
|
|
278
|
+
end
|
|
279
|
+
end
|
|
280
|
+
|
|
281
|
+
# has_one
|
|
282
|
+
if has_one = self.class.instance_variable_get('@mc_edit_has_one')
|
|
283
|
+
has_one.each do |tag|
|
|
284
|
+
if File.directory?("app/views/chimpmunk") && !Dir["app/views/chimpmunk/_#{tag}**"].empty?
|
|
285
|
+
sections[tag] = action_view.render "chimpmunk/#{tag}", campaign: self, tag.to_sym => self.send(tag)
|
|
286
|
+
end
|
|
287
|
+
end
|
|
213
288
|
end
|
|
214
289
|
|
|
215
290
|
# editable areas (partials)
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
291
|
+
if editable_areas = self.class.instance_variable_get('@mc_edit_editable_areas')
|
|
292
|
+
editable_areas.each do |tag|
|
|
293
|
+
if File.directory?("app/views/chimpmunk") && !Dir["app/views/chimpmunk/_#{tag}**"].empty?
|
|
294
|
+
sections[tag] = action_view.render "chimpmunk/#{tag}", campaign: self
|
|
295
|
+
end
|
|
219
296
|
end
|
|
220
297
|
end
|
|
221
298
|
|
|
@@ -328,7 +405,7 @@ module Chimpmunk
|
|
|
328
405
|
else
|
|
329
406
|
opts[:options][:list_id] = self.email_list.try(:mailchimp_id)
|
|
330
407
|
end
|
|
331
|
-
|
|
408
|
+
|
|
332
409
|
response = Chimpmunk.mailchimp.campaigns.create(opts)
|
|
333
410
|
if response["errors"].nil?
|
|
334
411
|
self.skip_update_callbacks = true
|
|
@@ -338,48 +415,46 @@ module Chimpmunk
|
|
|
338
415
|
end
|
|
339
416
|
end
|
|
340
417
|
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
rails_admin do
|
|
344
|
-
navigation_label 'Mailchimp'
|
|
418
|
+
rails_admin do
|
|
419
|
+
navigation_label 'Mailchimp'
|
|
345
420
|
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
end
|
|
354
|
-
field :clicked_percentage do
|
|
355
|
-
label "Clicked"
|
|
356
|
-
end
|
|
357
|
-
field :subject
|
|
358
|
-
field :from_email
|
|
359
|
-
field :from_name
|
|
421
|
+
list do
|
|
422
|
+
field :title
|
|
423
|
+
field :email_list
|
|
424
|
+
field :status
|
|
425
|
+
field :emails_sent
|
|
426
|
+
field :opened_percentage do
|
|
427
|
+
label "Opened"
|
|
360
428
|
end
|
|
429
|
+
field :clicked_percentage do
|
|
430
|
+
label "Clicked"
|
|
431
|
+
end
|
|
432
|
+
field :subject
|
|
433
|
+
field :from_email
|
|
434
|
+
field :from_name
|
|
435
|
+
end
|
|
361
436
|
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
end
|
|
368
|
-
field :email_list_group
|
|
369
|
-
field :email_template do
|
|
370
|
-
inline_add false
|
|
371
|
-
inline_edit false
|
|
372
|
-
end
|
|
373
|
-
field :subject
|
|
374
|
-
field :from_name do
|
|
375
|
-
default_value 'FIXME'
|
|
376
|
-
end
|
|
377
|
-
field :from_email do
|
|
378
|
-
default_value 'FIXME'
|
|
379
|
-
end
|
|
380
|
-
field :send_date
|
|
437
|
+
edit do
|
|
438
|
+
field :title
|
|
439
|
+
field :email_list do
|
|
440
|
+
inline_add false
|
|
441
|
+
inline_edit false
|
|
381
442
|
end
|
|
443
|
+
field :email_list_group
|
|
444
|
+
field :email_template do
|
|
445
|
+
inline_add false
|
|
446
|
+
inline_edit false
|
|
447
|
+
end
|
|
448
|
+
field :subject
|
|
449
|
+
field :from_name do
|
|
450
|
+
default_value 'FIXME'
|
|
451
|
+
end
|
|
452
|
+
field :from_email do
|
|
453
|
+
default_value 'FIXME'
|
|
454
|
+
end
|
|
455
|
+
field :send_date
|
|
382
456
|
end
|
|
383
|
-
end
|
|
457
|
+
end if defined?(RailsAdmin)
|
|
458
|
+
|
|
384
459
|
end
|
|
385
460
|
end
|
|
@@ -5,11 +5,17 @@ module Chimpmunk
|
|
|
5
5
|
has_attached_file :image, styles: {original: '1000x1000>'}
|
|
6
6
|
validates_attachment_content_type :image, :content_type => /\Aimage\/.*\Z/
|
|
7
7
|
|
|
8
|
+
attr_accessible :image if defined?(ActiveModel::MassAssignmentSecurity)
|
|
9
|
+
|
|
8
10
|
rails_admin do
|
|
9
11
|
visible false
|
|
10
12
|
edit do
|
|
11
|
-
field :image
|
|
13
|
+
field :image do
|
|
14
|
+
label do
|
|
15
|
+
bindings[:object].name
|
|
16
|
+
end
|
|
17
|
+
end
|
|
12
18
|
end
|
|
13
|
-
end
|
|
19
|
+
end if defined?(RailsAdmin)
|
|
14
20
|
end
|
|
15
21
|
end
|
|
@@ -3,6 +3,8 @@ module Chimpmunk
|
|
|
3
3
|
class EmailCampaignText < ::ActiveRecord::Base
|
|
4
4
|
belongs_to :email_campaign
|
|
5
5
|
|
|
6
|
+
attr_accessible :text if defined?(ActiveModel::MassAssignmentSecurity)
|
|
7
|
+
|
|
6
8
|
rails_admin do
|
|
7
9
|
visible false
|
|
8
10
|
edit do
|
|
@@ -12,6 +14,6 @@ module Chimpmunk
|
|
|
12
14
|
end
|
|
13
15
|
end
|
|
14
16
|
end
|
|
15
|
-
end
|
|
17
|
+
end if defined?(RailsAdmin)
|
|
16
18
|
end
|
|
17
19
|
end
|
data/lib/chimpmunk/email_list.rb
CHANGED
|
@@ -37,33 +37,29 @@ module Chimpmunk
|
|
|
37
37
|
|
|
38
38
|
private
|
|
39
39
|
|
|
40
|
-
|
|
40
|
+
rails_admin do
|
|
41
|
+
navigation_label 'Mailchimp'
|
|
41
42
|
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
end
|
|
56
|
-
field :default_from_email do
|
|
57
|
-
read_only true
|
|
58
|
-
end
|
|
59
|
-
field :default_subject do
|
|
60
|
-
read_only true
|
|
61
|
-
end
|
|
62
|
-
field :email_list_groupings
|
|
43
|
+
edit do
|
|
44
|
+
field :mailchimp_id do
|
|
45
|
+
label 'Mailchimp ID'
|
|
46
|
+
read_only true
|
|
47
|
+
end
|
|
48
|
+
field :name do
|
|
49
|
+
read_only true
|
|
50
|
+
end
|
|
51
|
+
field :default_from_name do
|
|
52
|
+
read_only true
|
|
53
|
+
end
|
|
54
|
+
field :default_from_email do
|
|
55
|
+
read_only true
|
|
63
56
|
end
|
|
57
|
+
field :default_subject do
|
|
58
|
+
read_only true
|
|
59
|
+
end
|
|
60
|
+
field :email_list_groupings
|
|
64
61
|
end
|
|
65
|
-
|
|
66
|
-
end
|
|
62
|
+
end if defined?(RailsAdmin)
|
|
67
63
|
|
|
68
64
|
end
|
|
69
65
|
end
|
|
@@ -69,30 +69,29 @@ module Chimpmunk
|
|
|
69
69
|
)
|
|
70
70
|
end
|
|
71
71
|
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
binding_object.email_list_grouping.email_list
|
|
87
|
-
end
|
|
88
|
-
|
|
89
|
-
Proc.new { |scope|
|
|
90
|
-
scope = scope.where(email_list_id: list.id, subscribed: true)
|
|
91
|
-
} if list
|
|
72
|
+
rails_admin do
|
|
73
|
+
navigation_label 'Mailchimp'
|
|
74
|
+
visible false
|
|
75
|
+
edit do
|
|
76
|
+
field :name
|
|
77
|
+
field :email_subscribers do
|
|
78
|
+
column_width 1200
|
|
79
|
+
associated_collection_scope do
|
|
80
|
+
form = bindings[:form]
|
|
81
|
+
binding_object = bindings[:object]
|
|
82
|
+
list = if form
|
|
83
|
+
bindings[:form].options[:parent_builder].options[:parent_builder].object
|
|
84
|
+
elsif binding_object
|
|
85
|
+
binding_object.email_list_grouping.email_list
|
|
92
86
|
end
|
|
87
|
+
|
|
88
|
+
Proc.new { |scope|
|
|
89
|
+
scope = scope.where(email_list_id: list.id, subscribed: true)
|
|
90
|
+
} if list
|
|
93
91
|
end
|
|
94
92
|
end
|
|
95
93
|
end
|
|
96
|
-
end
|
|
94
|
+
end if defined?(RailsAdmin)
|
|
95
|
+
|
|
97
96
|
end
|
|
98
97
|
end
|
|
@@ -86,17 +86,16 @@ module Chimpmunk
|
|
|
86
86
|
end
|
|
87
87
|
end
|
|
88
88
|
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
field :email_list_groups
|
|
98
|
-
end
|
|
89
|
+
rails_admin do
|
|
90
|
+
navigation_label 'Mailchimp'
|
|
91
|
+
visible false
|
|
92
|
+
|
|
93
|
+
edit do
|
|
94
|
+
field :email_list
|
|
95
|
+
field :name
|
|
96
|
+
field :email_list_groups
|
|
99
97
|
end
|
|
100
|
-
end
|
|
98
|
+
end if defined?(RailsAdmin)
|
|
99
|
+
|
|
101
100
|
end
|
|
102
101
|
end
|
|
@@ -44,31 +44,30 @@ module Chimpmunk
|
|
|
44
44
|
|
|
45
45
|
private
|
|
46
46
|
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
47
|
+
rails_admin do
|
|
48
|
+
navigation_label 'Mailchimp'
|
|
49
|
+
list do
|
|
50
|
+
field :mailchimp_id
|
|
51
|
+
field :first_name
|
|
52
|
+
field :last_name
|
|
53
|
+
field :email
|
|
54
|
+
field :subscribed
|
|
55
|
+
field :email_list
|
|
56
|
+
end
|
|
57
|
+
edit do
|
|
58
|
+
field :email_list do
|
|
59
|
+
inline_add false
|
|
60
|
+
inline_edit false
|
|
57
61
|
end
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
inline_edit false
|
|
62
|
-
end
|
|
63
|
-
field :mailchimp_id do
|
|
64
|
-
label "Mailchimp ID"
|
|
65
|
-
read_only true
|
|
66
|
-
end
|
|
67
|
-
field :first_name
|
|
68
|
-
field :last_name
|
|
69
|
-
field :email
|
|
62
|
+
field :mailchimp_id do
|
|
63
|
+
label "Mailchimp ID"
|
|
64
|
+
read_only true
|
|
70
65
|
end
|
|
66
|
+
field :first_name
|
|
67
|
+
field :last_name
|
|
68
|
+
field :email
|
|
71
69
|
end
|
|
72
|
-
end
|
|
70
|
+
end if defined?(RailsAdmin)
|
|
71
|
+
|
|
73
72
|
end
|
|
74
73
|
end
|
|
@@ -13,42 +13,41 @@ module Chimpmunk
|
|
|
13
13
|
#
|
|
14
14
|
def self.refresh_email_templates
|
|
15
15
|
Chimpmunk.mailchimp.templates.list()["user"].each do |template|
|
|
16
|
-
EmailTemplate.
|
|
16
|
+
EmailTemplate.where(
|
|
17
17
|
mailchimp_id: "#{template["id"]}",
|
|
18
18
|
name: template["name"],
|
|
19
19
|
layout: template["layout"],
|
|
20
20
|
preview_image: template["preview_image"]
|
|
21
|
-
)
|
|
21
|
+
).first_or_create
|
|
22
22
|
end
|
|
23
23
|
end
|
|
24
24
|
|
|
25
25
|
private
|
|
26
26
|
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
"<img src='#{value}' />".html_safe
|
|
37
|
-
end
|
|
27
|
+
rails_admin do
|
|
28
|
+
navigation_label 'Mailchimp'
|
|
29
|
+
# visible false
|
|
30
|
+
show do
|
|
31
|
+
field :name
|
|
32
|
+
field :layout
|
|
33
|
+
field :preview_image do
|
|
34
|
+
pretty_value do
|
|
35
|
+
"<img src='#{value}' />".html_safe
|
|
38
36
|
end
|
|
39
37
|
end
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
38
|
+
end
|
|
39
|
+
edit do
|
|
40
|
+
field :mailchimp_id do
|
|
41
|
+
read_only true
|
|
42
|
+
end
|
|
43
|
+
field :name do
|
|
44
|
+
read_only true
|
|
45
|
+
end
|
|
46
|
+
field :preview_image do
|
|
47
|
+
read_only :true
|
|
50
48
|
end
|
|
51
49
|
end
|
|
52
|
-
end
|
|
50
|
+
end if defined?(RailsAdmin)
|
|
51
|
+
|
|
53
52
|
end
|
|
54
53
|
end
|
data/lib/chimpmunk/version.rb
CHANGED
|
@@ -134,7 +134,7 @@ describe Chimpmunk::EmailCampaign do
|
|
|
134
134
|
|
|
135
135
|
describe 'editable areas' do
|
|
136
136
|
it 'should have the correct editable areas' do
|
|
137
|
-
expect(TestEmailCampaign.
|
|
137
|
+
expect(TestEmailCampaign.mc_edit_editable_areas).to include(:first)
|
|
138
138
|
end
|
|
139
139
|
end
|
|
140
140
|
|
|
@@ -156,9 +156,22 @@ describe Chimpmunk::EmailCampaign do
|
|
|
156
156
|
end
|
|
157
157
|
|
|
158
158
|
describe 'refresh_email_campaign_stats' do
|
|
159
|
-
|
|
159
|
+
it 'should update the email campaign with the stats' do
|
|
160
|
+
@email_campaign.mailchimp_campaign_id = "1"
|
|
161
|
+
Chimpmunk::EmailCampaign.texts
|
|
162
|
+
Chimpmunk::EmailCampaign.headers
|
|
163
|
+
Chimpmunk::EmailCampaign.images
|
|
164
|
+
@email_campaign.save
|
|
165
|
+
expect{Chimpmunk::EmailCampaign.refresh_email_campaign_stats}.to change{@email_campaign.reload.emails_sent}.from(nil).to(100)
|
|
166
|
+
end
|
|
160
167
|
end
|
|
161
168
|
end
|
|
162
169
|
|
|
170
|
+
describe 'instance methods' do
|
|
171
|
+
|
|
172
|
+
end
|
|
173
|
+
describe 'send_campaign' do
|
|
174
|
+
|
|
175
|
+
end
|
|
163
176
|
end
|
|
164
177
|
end
|
data/spec/spec_helper.rb
CHANGED
|
@@ -2,6 +2,7 @@ $LOAD_PATH << '.' unless $LOAD_PATH.include?('.')
|
|
|
2
2
|
$LOAD_PATH.unshift(File.expand_path('../../lib', __FILE__))
|
|
3
3
|
require 'logger'
|
|
4
4
|
|
|
5
|
+
require 'rails'
|
|
5
6
|
require 'active_record'
|
|
6
7
|
require 'gibbon'
|
|
7
8
|
|
|
@@ -22,6 +23,10 @@ module Chimpmunk
|
|
|
22
23
|
def self.mailchimp
|
|
23
24
|
@mailchimp ||= ::Gibbon::API.new
|
|
24
25
|
end
|
|
26
|
+
|
|
27
|
+
def self.domain_name
|
|
28
|
+
'test.com'
|
|
29
|
+
end
|
|
25
30
|
end
|
|
26
31
|
|
|
27
32
|
# require 'rails'
|
data/spec/support/stubs.rb
CHANGED
|
@@ -24,16 +24,25 @@ def gibbon_stubs
|
|
|
24
24
|
)
|
|
25
25
|
allow_any_instance_of(Gibbon::APICategory).to receive(:list).with({status:"sent"}).and_return(
|
|
26
26
|
{'data' => [
|
|
27
|
+
'id' => '1',
|
|
28
|
+
'summary' =>
|
|
27
29
|
{
|
|
28
|
-
'
|
|
29
|
-
'
|
|
30
|
-
'
|
|
31
|
-
'
|
|
32
|
-
'
|
|
33
|
-
'
|
|
34
|
-
'
|
|
35
|
-
'
|
|
36
|
-
|
|
37
|
-
|
|
30
|
+
'emails_sent' => 100,
|
|
31
|
+
'unique_opens' => 100,
|
|
32
|
+
'unique_clicked' => 100,
|
|
33
|
+
'hard_bounces' => 100,
|
|
34
|
+
'soft_bounces' => 100,
|
|
35
|
+
'unsubscribes' => 100,
|
|
36
|
+
'forwards' => 100,
|
|
37
|
+
'forwards_opens' => 100,
|
|
38
|
+
'opens' => 100,
|
|
39
|
+
'last_open' => Time.now,
|
|
40
|
+
'unique_opens' => 100,
|
|
41
|
+
'non_unique_clicks' => 100,
|
|
42
|
+
'users_who_clicked' => 100,
|
|
43
|
+
'unique_likes' => 100,
|
|
44
|
+
'facebook_likes' => 100
|
|
45
|
+
}]
|
|
46
|
+
}
|
|
38
47
|
)
|
|
39
48
|
end
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: chimpmunk
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.0.
|
|
4
|
+
version: 0.0.5
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Nick Franken
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2015-02-
|
|
11
|
+
date: 2015-02-23 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: activerecord
|
|
@@ -50,14 +50,28 @@ dependencies:
|
|
|
50
50
|
requirements:
|
|
51
51
|
- - ">="
|
|
52
52
|
- !ruby/object:Gem::Version
|
|
53
|
-
version: '4
|
|
53
|
+
version: '3.4'
|
|
54
54
|
type: :runtime
|
|
55
55
|
prerelease: false
|
|
56
56
|
version_requirements: !ruby/object:Gem::Requirement
|
|
57
57
|
requirements:
|
|
58
58
|
- - ">="
|
|
59
59
|
- !ruby/object:Gem::Version
|
|
60
|
-
version: '4
|
|
60
|
+
version: '3.4'
|
|
61
|
+
- !ruby/object:Gem::Dependency
|
|
62
|
+
name: rspec-rails
|
|
63
|
+
requirement: !ruby/object:Gem::Requirement
|
|
64
|
+
requirements:
|
|
65
|
+
- - ">="
|
|
66
|
+
- !ruby/object:Gem::Version
|
|
67
|
+
version: '0'
|
|
68
|
+
type: :development
|
|
69
|
+
prerelease: false
|
|
70
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
71
|
+
requirements:
|
|
72
|
+
- - ">="
|
|
73
|
+
- !ruby/object:Gem::Version
|
|
74
|
+
version: '0'
|
|
61
75
|
- !ruby/object:Gem::Dependency
|
|
62
76
|
name: bundler
|
|
63
77
|
requirement: !ruby/object:Gem::Requirement
|