chimpmunk 0.0.3 → 0.0.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rspec +2 -0
- data/Gemfile +11 -0
- data/README.md +7 -3
- data/config/locales/chimpmunk.en.yml +6 -1
- data/db/migrate/1_chimpmunk_migration.rb +1 -0
- data/lib/chimpmunk.rb +10 -0
- data/lib/chimpmunk/email_campaign.rb +35 -15
- data/lib/chimpmunk/email_template.rb +26 -1
- data/lib/chimpmunk/version.rb +1 -1
- data/lib/generators/chimpmunk/install_generator.rb +4 -0
- data/lib/rails_admin/chimpmunk_custom_actions.rb +19 -0
- data/spec/chimpmunk/email_campaign_spec.rb +164 -0
- data/spec/internal/db/schema.rb +121 -0
- data/spec/spec_helper.rb +36 -0
- data/spec/support/active_record.rb +30 -0
- data/spec/support/stubs.rb +39 -0
- metadata +14 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c60fcdbf6b7dfda454a5d0061d798af3c67d8973
|
4
|
+
data.tar.gz: 305e8d6ea4982a9dd33b117c6c0ee8e7bfd6ffac
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0f45bdfb37ae8b43fa769e396c57459cef38d1a5f065361a8318cc203a2cd532500556343dd09881556b5d221655c8bacc5790cdb4eccbcf91e879038a54e563
|
7
|
+
data.tar.gz: 7552591f37ca4ba7e9648429999f8c8ae943f50a4f1432d883106e60a5d627c5faaa533812fc6530247944554824e8004d23e1d52b62442e1ae5e19dc0cb0b59
|
data/.rspec
ADDED
data/Gemfile
CHANGED
@@ -2,3 +2,14 @@ source 'https://rubygems.org'
|
|
2
2
|
|
3
3
|
# Specify your gem's dependencies in chimpmunk.gemspec
|
4
4
|
gemspec
|
5
|
+
|
6
|
+
group :local_development do
|
7
|
+
gem 'pry'
|
8
|
+
gem 'rspec'
|
9
|
+
gem 'activerecord'
|
10
|
+
gem 'database_cleaner'
|
11
|
+
gem 'sqlite3'
|
12
|
+
gem 'shoulda-matchers'
|
13
|
+
gem 'gibbon'
|
14
|
+
gem 'paperclip'
|
15
|
+
end
|
data/README.md
CHANGED
@@ -26,15 +26,19 @@ Run migrations
|
|
26
26
|
|
27
27
|
$ rake db:migrate
|
28
28
|
|
29
|
-
Set your mailchimp api key:
|
29
|
+
Set your mailchimp api key in an initializer:
|
30
30
|
|
31
31
|
Gibbon::API.api_key = "your_api_key"
|
32
32
|
|
33
|
+
Set your domain name in an initializer:
|
34
|
+
|
35
|
+
Chimpmunk.domain_name = 'example.com'
|
36
|
+
|
33
37
|
## Usage
|
34
38
|
|
35
|
-
1.
|
39
|
+
1. Create a new model for your campaign `app/models/test_email_campaign.rb` that extends `Chimpmunk::EmailCampaign`
|
36
40
|
|
37
|
-
2.
|
41
|
+
2. Create headers, texts and images definitions for any strings, text or images needed in the campaign. These will be the same name as the MC:EDIT areas in your template
|
38
42
|
|
39
43
|
```
|
40
44
|
headers :hero_header, :bottom_header
|
@@ -50,4 +50,9 @@ en:
|
|
50
50
|
title: 'Refresh Email Lists'
|
51
51
|
menu: 'Refresh Email Lists'
|
52
52
|
breadcrumb: 'Refresh Email Lists'
|
53
|
-
link: 'Refresh Email Lists'
|
53
|
+
link: 'Refresh Email Lists'
|
54
|
+
refresh_email_templates:
|
55
|
+
title: 'Refresh Email Templates'
|
56
|
+
menu: 'Refresh Email Templates'
|
57
|
+
breadcrumb: 'Refresh Email Templates'
|
58
|
+
link: 'Refresh Email Templates'
|
data/lib/chimpmunk.rb
CHANGED
@@ -7,6 +7,8 @@ require 'rails_admin/chimpmunk_custom_actions.rb'
|
|
7
7
|
module Chimpmunk
|
8
8
|
extend ActiveSupport::Autoload
|
9
9
|
|
10
|
+
@domain_name = nil
|
11
|
+
|
10
12
|
autoload :EmailCampaign
|
11
13
|
autoload :EmailList
|
12
14
|
autoload :EmailListGroup
|
@@ -21,4 +23,12 @@ module Chimpmunk
|
|
21
23
|
def self.mailchimp
|
22
24
|
@mailchimp ||= ::Gibbon::API.new
|
23
25
|
end
|
26
|
+
|
27
|
+
def self.domain_name=(key)
|
28
|
+
@domain_name = key
|
29
|
+
end
|
30
|
+
|
31
|
+
def self.domain_name
|
32
|
+
@domain_name
|
33
|
+
end
|
24
34
|
end
|
@@ -3,8 +3,16 @@ module Chimpmunk
|
|
3
3
|
class EmailCampaign < ::ActiveRecord::Base
|
4
4
|
attr_accessor :skip_update_callbacks, :skip_create_callbacks
|
5
5
|
|
6
|
-
#
|
7
|
-
|
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
|
8
16
|
|
9
17
|
# rails 3
|
10
18
|
attr_accessible :title, :from_email, :from_name, :email_list_id, :subject, :email_template_id, :mailchimp_list_id, :send_date,
|
@@ -16,7 +24,6 @@ module Chimpmunk
|
|
16
24
|
belongs_to :email_list
|
17
25
|
belongs_to :email_template
|
18
26
|
belongs_to :email_list_group
|
19
|
-
belongs_to :email_template
|
20
27
|
|
21
28
|
# Validations
|
22
29
|
validates :subject, presence: true
|
@@ -39,6 +46,7 @@ module Chimpmunk
|
|
39
46
|
# create header associations
|
40
47
|
#
|
41
48
|
def self.headers(*headers)
|
49
|
+
@@mc_edit_headers = headers
|
42
50
|
headers.each do |header|
|
43
51
|
has_one header.to_sym, -> { where(name: header.to_s) }, class_name: 'Chimpmunk::EmailCampaignHeader', foreign_key: :email_campaign_id
|
44
52
|
accepts_nested_attributes_for header.to_sym, allow_destroy: true
|
@@ -49,6 +57,7 @@ module Chimpmunk
|
|
49
57
|
# create text associations
|
50
58
|
#
|
51
59
|
def self.texts(*texts)
|
60
|
+
@@mc_edit_texts = texts
|
52
61
|
texts.each do |text|
|
53
62
|
has_one text.to_sym, -> { where(name: text.to_s) }, class_name: 'Chimpmunk::EmailCampaignText', foreign_key: :email_campaign_id
|
54
63
|
accepts_nested_attributes_for text.to_sym, allow_destroy: true
|
@@ -59,6 +68,7 @@ module Chimpmunk
|
|
59
68
|
# create image associations
|
60
69
|
#
|
61
70
|
def self.images(*images)
|
71
|
+
@@mc_edit_images = images
|
62
72
|
images.each do |image|
|
63
73
|
has_one image.to_sym, -> { where(name: image.to_s) }, class_name: 'Chimpmunk::EmailCampaignImage', foreign_key: :email_campaign_id
|
64
74
|
accepts_nested_attributes_for image.to_sym, allow_destroy: true
|
@@ -72,14 +82,10 @@ module Chimpmunk
|
|
72
82
|
@@mc_edit_tags = mc_edit_tags
|
73
83
|
end
|
74
84
|
|
75
|
-
def self.mc_edit_tags
|
76
|
-
@@mc_edit_tags
|
77
|
-
end
|
78
|
-
|
79
85
|
#
|
80
86
|
# create has_many associations
|
81
87
|
#
|
82
|
-
def self.associated(association_type
|
88
|
+
def self.associated(association_type, *associations)
|
83
89
|
associations.each do |association|
|
84
90
|
association_name = "email_campaign_#{association}".to_sym
|
85
91
|
send("has_#{association_type}", association_name, foreign_key: 'email_campaign_id')
|
@@ -95,11 +101,11 @@ module Chimpmunk
|
|
95
101
|
title: campaign["title"],
|
96
102
|
campaign_kind: campaign["type"],
|
97
103
|
mailchimp_list_id: campaign["list_id"],
|
98
|
-
email_list_id: Chimpmunk::EmailList.find_by_mailchimp_id(campaign["list_id"]),
|
104
|
+
email_list_id: Chimpmunk::EmailList.find_by_mailchimp_id(campaign["list_id"]).try(:id),
|
99
105
|
subject: campaign["subject"],
|
100
106
|
from_email: campaign["from_email"],
|
101
107
|
from_name: campaign["from_name"],
|
102
|
-
|
108
|
+
email_template_id: campaign["template_id"],
|
103
109
|
mailchimp_campaign_id: campaign["id"]
|
104
110
|
}
|
105
111
|
unless self.where(campaign_attributes).any?
|
@@ -191,11 +197,25 @@ module Chimpmunk
|
|
191
197
|
def content
|
192
198
|
sections = {}
|
193
199
|
|
194
|
-
|
195
|
-
|
200
|
+
# headers
|
201
|
+
@@mc_edit_headers.each do |tag|
|
202
|
+
sections[tag] = self.send(tag).text
|
203
|
+
end
|
204
|
+
|
205
|
+
# texts
|
206
|
+
@@mc_edit_texts.each do |tag|
|
207
|
+
sections[tag] = self.send(tag).text
|
208
|
+
end
|
209
|
+
|
210
|
+
# images
|
211
|
+
@@mc_edit_images.each do |tag|
|
212
|
+
sections[tag] = "<img src='http://#{Chimpmunk.domain_name}#{self.send(tag).image.url}' />"
|
213
|
+
end
|
196
214
|
|
197
|
-
|
198
|
-
|
215
|
+
# editable areas (partials)
|
216
|
+
@@mc_edit_tags.each do |tag|
|
217
|
+
if File.directory?("app/views/chimpmunk") && !Dir["app/views/chimpmunk/_#{tag}**"].empty?
|
218
|
+
sections[tag] = action_view.render "chimpmunk/#{tag}", campaign: self
|
199
219
|
end
|
200
220
|
end
|
201
221
|
|
@@ -252,7 +272,7 @@ module Chimpmunk
|
|
252
272
|
return false
|
253
273
|
end
|
254
274
|
|
255
|
-
if response["errors"].
|
275
|
+
if response["errors"].blank?
|
256
276
|
data = response["data"]
|
257
277
|
self.mailchimp_list_id = data["list_id"]
|
258
278
|
self.title = data["title"]
|
@@ -8,12 +8,26 @@ module Chimpmunk
|
|
8
8
|
# Assocaitions
|
9
9
|
has_many :email_campaigns
|
10
10
|
|
11
|
+
#
|
12
|
+
# refresh list of templates from mailchimp
|
13
|
+
#
|
14
|
+
def self.refresh_email_templates
|
15
|
+
Chimpmunk.mailchimp.templates.list()["user"].each do |template|
|
16
|
+
EmailTemplate.find_or_create_by(
|
17
|
+
mailchimp_id: "#{template["id"]}",
|
18
|
+
name: template["name"],
|
19
|
+
layout: template["layout"],
|
20
|
+
preview_image: template["preview_image"]
|
21
|
+
)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
11
25
|
private
|
12
26
|
|
13
27
|
if defined?(RailsAdmin)
|
14
28
|
rails_admin do
|
15
29
|
navigation_label 'Mailchimp'
|
16
|
-
visible false
|
30
|
+
# visible false
|
17
31
|
show do
|
18
32
|
field :name
|
19
33
|
field :layout
|
@@ -23,6 +37,17 @@ module Chimpmunk
|
|
23
37
|
end
|
24
38
|
end
|
25
39
|
end
|
40
|
+
edit do
|
41
|
+
field :mailchimp_id do
|
42
|
+
read_only true
|
43
|
+
end
|
44
|
+
field :name do
|
45
|
+
read_only true
|
46
|
+
end
|
47
|
+
field :preview_image do
|
48
|
+
read_only :true
|
49
|
+
end
|
50
|
+
end
|
26
51
|
end
|
27
52
|
end
|
28
53
|
end
|
data/lib/chimpmunk/version.rb
CHANGED
@@ -20,6 +20,10 @@ module Chimpmunk
|
|
20
20
|
|
21
21
|
inject_into_file rails_admin_initializer, after: 'config.actions do' do <<-'TEMPLATE'
|
22
22
|
|
23
|
+
refresh_email_templates do
|
24
|
+
only 'Chimpmunk::EmailTemplate'
|
25
|
+
end
|
26
|
+
|
23
27
|
refresh_email_campaigns do
|
24
28
|
only 'Chimpmunk::EmailCampaign'
|
25
29
|
end
|
@@ -5,6 +5,25 @@ module RailsAdmin
|
|
5
5
|
module Config
|
6
6
|
module Actions
|
7
7
|
|
8
|
+
class RefreshEmailTemplates < RailsAdmin::Config::Actions::Base
|
9
|
+
RailsAdmin::Config::Actions.register(self)
|
10
|
+
|
11
|
+
register_instance_option :collection? do
|
12
|
+
true
|
13
|
+
end
|
14
|
+
|
15
|
+
register_instance_option :link_icon do
|
16
|
+
'icon-refresh'
|
17
|
+
end
|
18
|
+
|
19
|
+
register_instance_option :controller do
|
20
|
+
Proc.new do
|
21
|
+
@abstract_model.model_name.constantize.refresh_email_templates()
|
22
|
+
redirect_to rails_admin.index_path('chimpmunk~email_template')
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
8
27
|
#
|
9
28
|
# Refresh Email Lists
|
10
29
|
#
|
@@ -0,0 +1,164 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Chimpmunk::EmailCampaign do
|
4
|
+
before do
|
5
|
+
@email_list = Chimpmunk::EmailList.new(name: 'test list', mailchimp_id: 1)
|
6
|
+
@email_list.id = 1
|
7
|
+
@email_list.save
|
8
|
+
@email_template = Chimpmunk::EmailTemplate.new(name: 'test template')
|
9
|
+
@email_template.id = 1
|
10
|
+
@email_template.save
|
11
|
+
paperclip_stubs()
|
12
|
+
gibbon_stubs()
|
13
|
+
end
|
14
|
+
|
15
|
+
let(:email_campaign) { Chimpmunk::EmailCampaign.create(email_list: @email_list, email_template: @email_template, subject: 'test subject', from_email: 'nf@the42.com', from_name: 'test') }
|
16
|
+
|
17
|
+
describe 'Associations' do
|
18
|
+
it { should belong_to(:email_list) }
|
19
|
+
it { should belong_to(:email_template) }
|
20
|
+
it { should belong_to(:email_list_group) }
|
21
|
+
end
|
22
|
+
|
23
|
+
describe 'Validations' do
|
24
|
+
it { should validate_presence_of(:subject) }
|
25
|
+
it { should validate_presence_of(:from_email) }
|
26
|
+
it { should validate_presence_of(:from_name) }
|
27
|
+
it { should validate_presence_of(:email_list) }
|
28
|
+
it { should validate_presence_of(:email_template) }
|
29
|
+
end
|
30
|
+
|
31
|
+
describe "Filters" do
|
32
|
+
|
33
|
+
before(:each) do
|
34
|
+
@email_campaign = Chimpmunk::EmailCampaign.new(email_list: @email_list, email_template: @email_template, subject: 'test subject', from_email: 'nf@the42.com', from_name: 'test')
|
35
|
+
end
|
36
|
+
|
37
|
+
describe 'create' do
|
38
|
+
it "should call 'create_campaign' on create" do
|
39
|
+
expect(@email_campaign).to receive(:create_campaign)
|
40
|
+
@email_campaign.save
|
41
|
+
end
|
42
|
+
|
43
|
+
it 'should skip create_campaign callback' do
|
44
|
+
expect(@email_campaign).to_not receive(:create_campaign)
|
45
|
+
@email_campaign.skip_create_callbacks = true
|
46
|
+
@email_campaign.save
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
describe 'update' do
|
51
|
+
it "should call 'update_campaign' on update" do
|
52
|
+
@email_campaign.save
|
53
|
+
@email_campaign.skip_update_callbacks = false
|
54
|
+
expect(@email_campaign).to receive(:update_campaign)
|
55
|
+
@email_campaign.update(subject: 'test update')
|
56
|
+
end
|
57
|
+
|
58
|
+
it "should not call 'update_campaign' on update" do
|
59
|
+
@email_campaign.save
|
60
|
+
@email_campaign.skip_update_callbacks = true
|
61
|
+
expect(@email_campaign).to_not receive(:update_campaign)
|
62
|
+
@email_campaign.update(subject: 'test update')
|
63
|
+
end
|
64
|
+
|
65
|
+
it "should call 'update_content' on update if the template id changed" do
|
66
|
+
@email_campaign.save
|
67
|
+
@email_campaign.skip_update_callbacks = false
|
68
|
+
|
69
|
+
expect(@email_campaign).to receive(:update_content)
|
70
|
+
new_template = Chimpmunk::EmailTemplate.create(name: 'new template')
|
71
|
+
@email_campaign.update(email_template_id: new_template.id)
|
72
|
+
end
|
73
|
+
|
74
|
+
it "should not call 'update_content' on update if the template id didn't change" do
|
75
|
+
@email_campaign.save
|
76
|
+
@email_campaign.skip_update_callbacks = false
|
77
|
+
|
78
|
+
expect(@email_campaign).to_not receive(:update_content)
|
79
|
+
@email_campaign.update(subject: 'new subject')
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
describe 'destroy' do
|
84
|
+
it "should call 'destroy_mailcimp_campaign' on destroy" do
|
85
|
+
@email_campaign.save
|
86
|
+
expect(@email_campaign).to receive(:destroy_mailchimp_campaign)
|
87
|
+
@email_campaign.destroy
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
describe 'class methods' do
|
92
|
+
before do
|
93
|
+
class TestEmailCampaign < Chimpmunk::EmailCampaign
|
94
|
+
headers :header_one
|
95
|
+
texts :text_one, :text_two
|
96
|
+
images :image_one, :image_two
|
97
|
+
editable_areas :first
|
98
|
+
associated :many, :posts
|
99
|
+
associated :one, :trip_hop_album
|
100
|
+
end
|
101
|
+
@test_email_campaign = TestEmailCampaign.new
|
102
|
+
end
|
103
|
+
|
104
|
+
describe 'dynamic associations' do
|
105
|
+
describe 'headers' do
|
106
|
+
it 'should create the correct header associations' do
|
107
|
+
expect(@test_email_campaign).to respond_to(:header_one)
|
108
|
+
end
|
109
|
+
|
110
|
+
it 'should create the correct type for header' do
|
111
|
+
expect(@test_email_campaign.build_header_one).to be_a(Chimpmunk::EmailCampaignHeader)
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
describe 'texts' do
|
116
|
+
it 'should create the correct text associations' do
|
117
|
+
expect(@test_email_campaign).to respond_to(:text_one) && respond_to(:text_two)
|
118
|
+
end
|
119
|
+
|
120
|
+
it 'should create the correct type for text' do
|
121
|
+
expect(@test_email_campaign.build_text_one).to be_a(Chimpmunk::EmailCampaignText)
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
describe 'images' do
|
126
|
+
it 'should create the correct image associations' do
|
127
|
+
expect(@test_email_campaign).to respond_to(:text_one) && respond_to(:text_two)
|
128
|
+
end
|
129
|
+
|
130
|
+
it 'should create the correct type for image' do
|
131
|
+
expect(@test_email_campaign.build_image_one).to be_a(Chimpmunk::EmailCampaignImage)
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
135
|
+
describe 'editable areas' do
|
136
|
+
it 'should have the correct editable areas' do
|
137
|
+
expect(TestEmailCampaign.mc_edit_tags).to include(:first)
|
138
|
+
end
|
139
|
+
end
|
140
|
+
|
141
|
+
describe 'associated' do
|
142
|
+
it 'should have_many :posts' do
|
143
|
+
expect(TestEmailCampaign.reflect_on_all_associations(:has_many).map(&:name)).to include(:email_campaign_posts)
|
144
|
+
end
|
145
|
+
|
146
|
+
it 'should have_one :trip_hop_album' do
|
147
|
+
expect(TestEmailCampaign.reflect_on_all_associations(:has_one).map(&:name)).to include(:email_campaign_trip_hop_album)
|
148
|
+
end
|
149
|
+
end
|
150
|
+
end
|
151
|
+
|
152
|
+
describe 'refresh_email_campaigns' do
|
153
|
+
it 'should create a new campaign' do
|
154
|
+
expect{Chimpmunk::EmailCampaign.refresh_email_campaigns}.to change{Chimpmunk::EmailCampaign.count}.by(1)
|
155
|
+
end
|
156
|
+
end
|
157
|
+
|
158
|
+
describe 'refresh_email_campaign_stats' do
|
159
|
+
|
160
|
+
end
|
161
|
+
end
|
162
|
+
|
163
|
+
end
|
164
|
+
end
|
@@ -0,0 +1,121 @@
|
|
1
|
+
ActiveRecord::Schema.define version: 0 do
|
2
|
+
# create email lists
|
3
|
+
create_table :email_lists do |t|
|
4
|
+
t.string :default_from_email
|
5
|
+
t.string :default_from_name
|
6
|
+
t.string :default_subject
|
7
|
+
t.string :mailchimp_id
|
8
|
+
t.string :name
|
9
|
+
|
10
|
+
t.timestamps
|
11
|
+
end
|
12
|
+
|
13
|
+
# create email campaigns
|
14
|
+
create_table :email_campaigns do |t|
|
15
|
+
t.string :title
|
16
|
+
t.string :from_email
|
17
|
+
t.string :from_name
|
18
|
+
t.references :email_list, index: true
|
19
|
+
t.string :subject
|
20
|
+
t.references :email_template, index: true
|
21
|
+
t.string :mailchimp_list_id
|
22
|
+
t.datetime :send_date
|
23
|
+
t.string :mailchimp_campaign_id
|
24
|
+
t.string :mailchimp_list_id
|
25
|
+
t.integer :emails_sent
|
26
|
+
t.integer :clicked
|
27
|
+
t.integer :opened
|
28
|
+
t.string :status
|
29
|
+
t.integer :hard_bounces
|
30
|
+
t.integer :soft_bounces
|
31
|
+
t.integer :unsubscribes
|
32
|
+
t.integer :forwards
|
33
|
+
t.integer :forwards_opens
|
34
|
+
t.integer :opens
|
35
|
+
t.datetime :last_open
|
36
|
+
t.integer :unique_opens
|
37
|
+
t.integer :non_unique_clicks
|
38
|
+
t.integer :users_who_clicked
|
39
|
+
t.integer :unique_likes
|
40
|
+
t.integer :facebook_likes
|
41
|
+
t.string :campaign_kind
|
42
|
+
t.integer :template_id
|
43
|
+
t.references :email_list_group, index: true
|
44
|
+
|
45
|
+
t.timestamps
|
46
|
+
end
|
47
|
+
|
48
|
+
# create email list groups
|
49
|
+
create_table :email_list_groups do |t|
|
50
|
+
t.string :name
|
51
|
+
t.references :grouping, index: true
|
52
|
+
|
53
|
+
t.timestamps
|
54
|
+
end
|
55
|
+
|
56
|
+
# create email templates
|
57
|
+
create_table :email_templates do |t|
|
58
|
+
t.string :mailchimp_id
|
59
|
+
t.string :name
|
60
|
+
t.string :layout
|
61
|
+
t.string :preview_image
|
62
|
+
|
63
|
+
t.timestamps
|
64
|
+
end
|
65
|
+
|
66
|
+
# create email list groupings
|
67
|
+
create_table :email_list_groupings do |t|
|
68
|
+
t.string :name
|
69
|
+
t.references :email_list, index: true
|
70
|
+
t.integer :mailchimp_grouping_id
|
71
|
+
|
72
|
+
t.timestamps
|
73
|
+
end
|
74
|
+
|
75
|
+
# ceate email subscribers
|
76
|
+
create_table :email_subscribers do |t|
|
77
|
+
t.string :mailchimp_id
|
78
|
+
t.string :first_name
|
79
|
+
t.string :last_name
|
80
|
+
t.string :email
|
81
|
+
t.boolean :subscribed
|
82
|
+
t.references :email_list, index: true
|
83
|
+
|
84
|
+
t.timestamps
|
85
|
+
end
|
86
|
+
|
87
|
+
# create email list group subscribers join table
|
88
|
+
create_table :email_list_groups_subscribers, id: false do |t|
|
89
|
+
t.integer :email_list_group_id
|
90
|
+
t.integer :email_subscriber_id
|
91
|
+
end
|
92
|
+
|
93
|
+
create_table :email_campaign_headers do |t|
|
94
|
+
t.references :email_campaign, index: true
|
95
|
+
t.string :text
|
96
|
+
t.string :name
|
97
|
+
|
98
|
+
t.timestamps
|
99
|
+
end
|
100
|
+
|
101
|
+
create_table :email_campaign_texts do |t|
|
102
|
+
t.references :email_campaign, index: true
|
103
|
+
t.text :text
|
104
|
+
t.string :name
|
105
|
+
|
106
|
+
t.timestamps
|
107
|
+
end
|
108
|
+
|
109
|
+
create_table :email_campaign_images do |t|
|
110
|
+
t.references :email_campaign, index: true
|
111
|
+
t.string :name
|
112
|
+
t.string :image_file_name
|
113
|
+
t.string :image_content_type
|
114
|
+
t.integer :image_file_size
|
115
|
+
t.datetime :image_updated_at
|
116
|
+
|
117
|
+
t.timestamps
|
118
|
+
end
|
119
|
+
|
120
|
+
# add_attachment :email_campaign_images, :image
|
121
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,36 @@
|
|
1
|
+
$LOAD_PATH << '.' unless $LOAD_PATH.include?('.')
|
2
|
+
$LOAD_PATH.unshift(File.expand_path('../../lib', __FILE__))
|
3
|
+
require 'logger'
|
4
|
+
|
5
|
+
require 'active_record'
|
6
|
+
require 'gibbon'
|
7
|
+
|
8
|
+
module Chimpmunk
|
9
|
+
extend ActiveSupport::Autoload
|
10
|
+
|
11
|
+
autoload :EmailCampaign
|
12
|
+
autoload :EmailList
|
13
|
+
autoload :EmailListGroup
|
14
|
+
autoload :EmailListGrouping
|
15
|
+
autoload :EmailSubscriber
|
16
|
+
autoload :EmailTemplate
|
17
|
+
autoload :EmailCampaignHeader
|
18
|
+
autoload :EmailCampaignText
|
19
|
+
autoload :EmailCampaignImage
|
20
|
+
autoload :VERSION
|
21
|
+
|
22
|
+
def self.mailchimp
|
23
|
+
@mailchimp ||= ::Gibbon::API.new
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
# require 'rails'
|
28
|
+
require 'paperclip'
|
29
|
+
require 'rspec'
|
30
|
+
require 'database_cleaner'
|
31
|
+
require 'shoulda/matchers'
|
32
|
+
require 'pry'
|
33
|
+
|
34
|
+
Gibbon::API.api_key = '12345678'
|
35
|
+
|
36
|
+
Dir['./spec/support/**/*.rb'].sort.each { |f| require f }
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require 'logger'
|
2
|
+
|
3
|
+
ActiveRecord::Base.establish_connection(adapter: 'sqlite3', database: ':memory:')
|
4
|
+
# ActiveRecord::Base.logger = Logger.new(STDOUT)
|
5
|
+
|
6
|
+
load(File.dirname(__FILE__) + '/../internal/db/schema.rb')
|
7
|
+
|
8
|
+
require 'database_cleaner'
|
9
|
+
|
10
|
+
RSpec.configure do |config|
|
11
|
+
|
12
|
+
config.before(:suite) do
|
13
|
+
DatabaseCleaner.clean_with(:truncation)
|
14
|
+
DatabaseCleaner.strategy = :transaction
|
15
|
+
DatabaseCleaner.clean
|
16
|
+
end
|
17
|
+
|
18
|
+
config.after(:suite) do
|
19
|
+
DatabaseCleaner.clean
|
20
|
+
end
|
21
|
+
|
22
|
+
config.before(:each) do
|
23
|
+
DatabaseCleaner.start
|
24
|
+
end
|
25
|
+
|
26
|
+
config.after(:each) do
|
27
|
+
DatabaseCleaner.clean
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
def paperclip_stubs
|
2
|
+
allow_any_instance_of(Object).to receive(:rails_admin)
|
3
|
+
allow_any_instance_of(Object).to receive(:has_attached_file)
|
4
|
+
allow_any_instance_of(Object).to receive(:validates_attachment_content_type)
|
5
|
+
end
|
6
|
+
|
7
|
+
def gibbon_stubs
|
8
|
+
allow_any_instance_of(Gibbon::APICategory).to receive(:create).and_return({})
|
9
|
+
allow_any_instance_of(Gibbon::APICategory).to receive(:update).and_return({'data' => {'list_id' => 9999, 'title' => 'title', 'subject' => 'subject', 'from_name' => 'from name', 'from_email' => 'from email'}})
|
10
|
+
allow_any_instance_of(Gibbon::APICategory).to receive(:delete)
|
11
|
+
allow_any_instance_of(Gibbon::APICategory).to receive(:list).and_return(
|
12
|
+
{'data' => [
|
13
|
+
{
|
14
|
+
'title' => 'refreshed',
|
15
|
+
'type' => 'test',
|
16
|
+
'list_id' => 1,
|
17
|
+
'subject' => 'test subject',
|
18
|
+
'from_email' => 'new@from.test',
|
19
|
+
'from_name' => 'test name',
|
20
|
+
'template_id' => 1,
|
21
|
+
'id' => 99999
|
22
|
+
}
|
23
|
+
]}
|
24
|
+
)
|
25
|
+
allow_any_instance_of(Gibbon::APICategory).to receive(:list).with({status:"sent"}).and_return(
|
26
|
+
{'data' => [
|
27
|
+
{
|
28
|
+
'title' => 'refreshed',
|
29
|
+
'type' => 'test',
|
30
|
+
'list_id' => 1,
|
31
|
+
'subject' => 'test subject',
|
32
|
+
'from_email' => 'new@from.test',
|
33
|
+
'from_name' => 'test name',
|
34
|
+
'template_id' => 1,
|
35
|
+
'id' => 99999
|
36
|
+
}
|
37
|
+
]}
|
38
|
+
)
|
39
|
+
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.4
|
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-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activerecord
|
@@ -94,6 +94,7 @@ extensions: []
|
|
94
94
|
extra_rdoc_files: []
|
95
95
|
files:
|
96
96
|
- ".gitignore"
|
97
|
+
- ".rspec"
|
97
98
|
- Gemfile
|
98
99
|
- LICENSE.txt
|
99
100
|
- README.md
|
@@ -115,6 +116,11 @@ files:
|
|
115
116
|
- lib/chimpmunk/version.rb
|
116
117
|
- lib/generators/chimpmunk/install_generator.rb
|
117
118
|
- lib/rails_admin/chimpmunk_custom_actions.rb
|
119
|
+
- spec/chimpmunk/email_campaign_spec.rb
|
120
|
+
- spec/internal/db/schema.rb
|
121
|
+
- spec/spec_helper.rb
|
122
|
+
- spec/support/active_record.rb
|
123
|
+
- spec/support/stubs.rb
|
118
124
|
homepage: https://bitbucket.org/42dev/chimpmunk
|
119
125
|
licenses:
|
120
126
|
- MIT
|
@@ -139,4 +145,9 @@ rubygems_version: 2.2.2
|
|
139
145
|
signing_key:
|
140
146
|
specification_version: 4
|
141
147
|
summary: Mailchimp list administration and Campaign builder.
|
142
|
-
test_files:
|
148
|
+
test_files:
|
149
|
+
- spec/chimpmunk/email_campaign_spec.rb
|
150
|
+
- spec/internal/db/schema.rb
|
151
|
+
- spec/spec_helper.rb
|
152
|
+
- spec/support/active_record.rb
|
153
|
+
- spec/support/stubs.rb
|