chimpmunk 0.0.3 → 0.0.4
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/.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
|