mailfox 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 1ace07536211ef8f493dc0df1cb9f2421eb709fe
4
+ data.tar.gz: 4cbb42a06cf3ad587643c00e8c89bdbb9d25b166
5
+ SHA512:
6
+ metadata.gz: af1a2c0c9f40e0527ddecc9163915845e8c3e828b4f329e680dfcc797e8863ae8bcdd57dd0313576a832c9c36591aad5c4e269a39822e6fc09b2e4bdedccce16
7
+ data.tar.gz: 2a7cfe37ff6350e8be7fd5f51d65b0ce7f8f7e8b927a6004c7dc1f5eda5da2d142dd9e470fc39398939bebff35cec565fe2fc204bfc2a53be15c5dc2e56f2c49
@@ -0,0 +1,20 @@
1
+ Copyright 2015 Adam Bahlke
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,30 @@
1
+ begin
2
+ require 'bundler/setup'
3
+ rescue LoadError
4
+ puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
5
+ end
6
+
7
+ require 'rdoc/task'
8
+
9
+ RDoc::Task.new(:rdoc) do |rdoc|
10
+ rdoc.rdoc_dir = 'rdoc'
11
+ rdoc.title = 'Mailfox'
12
+ rdoc.options << '--line-numbers'
13
+ rdoc.rdoc_files.include('README.rdoc')
14
+ rdoc.rdoc_files.include('lib/**/*.rb')
15
+ end
16
+
17
+ APP_RAKEFILE = File.expand_path("../spec/dummy/Rakefile", __FILE__)
18
+ load 'rails/tasks/engine.rake'
19
+
20
+
21
+ load 'rails/tasks/statistics.rake'
22
+
23
+
24
+
25
+ Bundler::GemHelper.install_tasks
26
+
27
+ task :routes => 'app:environment' do
28
+ Rails.application.reload_routes!
29
+ all_routes = Mailfox::Engine.routes.routes
30
+ end
@@ -0,0 +1,15 @@
1
+ // This is a manifest file that'll be compiled into application.js, which will include all the files
2
+ // listed below.
3
+ //
4
+ // Any JavaScript/Coffee file within this directory, lib/assets/javascripts, vendor/assets/javascripts,
5
+ // or any plugin's vendor/assets/javascripts directory can be referenced here using a relative path.
6
+ //
7
+ // It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
8
+ // compiled file.
9
+ //
10
+ // Read Sprockets README (https://github.com/rails/sprockets#sprockets-directives) for details
11
+ // about supported directives.
12
+ //
13
+ //= require jquery
14
+ //= require jquery_ujs
15
+ //= require_tree .
@@ -0,0 +1,15 @@
1
+ /*
2
+ * This is a manifest file that'll be compiled into application.css, which will include all the files
3
+ * listed below.
4
+ *
5
+ * Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets,
6
+ * or any plugin's vendor/assets/stylesheets directory can be referenced here using a relative path.
7
+ *
8
+ * You're free to add application-wide styles to this file and they'll appear at the bottom of the
9
+ * compiled file so the styles you add here take precedence over styles defined in any styles
10
+ * defined in the other CSS/SCSS files in this directory. It is generally better to create a new
11
+ * file per style scope.
12
+ *
13
+ *= require_tree .
14
+ *= require_self
15
+ */
@@ -0,0 +1,6 @@
1
+ {{ cms:field:newsletter.list_id }}
2
+ {{ cms:field:newsletter.placeholder }}
3
+ {{ cms:field:newsletter.disable_with_message }}
4
+ {{ cms:field:newsletter.button }}
5
+
6
+ {{ cms:partial:mailfox/newsletters/cms/form }}
@@ -0,0 +1,5 @@
1
+ module Mailfox
2
+ class ApplicationController < ActionController::Base
3
+ helper Mailfox::ApplicationHelper
4
+ end
5
+ end
@@ -0,0 +1,71 @@
1
+ module Mailfox
2
+ class NewslettersController < Mailfox::ApplicationController
3
+
4
+ #
5
+ # Settings
6
+ # ---------------------------------------------------------------------------------------
7
+ #
8
+ #
9
+ #
10
+ #
11
+
12
+ layout false
13
+
14
+ #
15
+ # Filter
16
+ # ---------------------------------------------------------------------------------------
17
+ #
18
+ #
19
+ #
20
+ #
21
+
22
+ #
23
+ # Plugins
24
+ # ---------------------------------------------------------------------------------------
25
+ #
26
+ #
27
+ #
28
+ #
29
+
30
+ #
31
+ # Actions
32
+ # ---------------------------------------------------------------------------------------
33
+ #
34
+ #
35
+ #
36
+ #
37
+
38
+ def create
39
+ @customer = MailService::Customer.create(permitted_params)
40
+
41
+ respond_to do |format|
42
+ format.js
43
+ end
44
+ end
45
+
46
+ #
47
+ # Protected
48
+ # ---------------------------------------------------------------------------------------
49
+ #
50
+ #
51
+ #
52
+ #
53
+
54
+ protected
55
+
56
+ #
57
+ # Private
58
+ # ---------------------------------------------------------------------------------------
59
+ #
60
+ #
61
+ #
62
+ #
63
+
64
+ private
65
+
66
+ def permitted_params
67
+ params.require(:newsletter).permit(:email, :list_id)
68
+ end
69
+
70
+ end
71
+ end
@@ -0,0 +1,13 @@
1
+ module Mailfox
2
+ module ApplicationHelper
3
+ def error_messages_for(object, options = {})
4
+ messages = options[:length] ? [object.errors.full_messages[options[:length] - 1]] : object.errors.full_messages
5
+
6
+ content_tag :ul, class: 'error-messages' do
7
+ messages.each do |msg|
8
+ concat content_tag(:li, msg)
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,16 @@
1
+ require 'mail_service/member'
2
+ require 'mail_service/customer'
3
+
4
+ module MailService
5
+ autoload :Member, 'mail_service/member'
6
+ autoload :Customer, 'mail_service/customer'
7
+
8
+ Gibbon::API.api_key = Mailfox.mailservices['mailchimp']['api_key']
9
+ Gibbon::API.timeout = 15
10
+ Gibbon::API.throws_exceptions = false
11
+
12
+ def self.connection(api_key = nil)
13
+ Gibbon::API.new(api_key)
14
+ end
15
+
16
+ end
@@ -0,0 +1,103 @@
1
+ module MailService
2
+ class Customer < Member
3
+
4
+ #
5
+ # Concerns
6
+ # ---------------------------------------------------------------------------------------
7
+ #
8
+ #
9
+ #
10
+ #
11
+
12
+ #
13
+ # Constants
14
+ # ---------------------------------------------------------------------------------------
15
+ #
16
+ #
17
+ #
18
+ #
19
+
20
+ #
21
+ # Index
22
+ # ---------------------------------------------------------------------------------------
23
+ #
24
+ #
25
+ #
26
+ #
27
+
28
+ #
29
+ # Attribute Settings
30
+ # ---------------------------------------------------------------------------------------
31
+ #
32
+ #
33
+ #
34
+ #
35
+
36
+ #
37
+ # Validations
38
+ # ---------------------------------------------------------------------------------------
39
+ #
40
+ #
41
+ #
42
+ #
43
+
44
+ #
45
+ # Callbacks
46
+ # ---------------------------------------------------------------------------------------
47
+ #
48
+ #
49
+ #
50
+ #
51
+
52
+ #
53
+ # Constructor
54
+ # ---------------------------------------------------------------------------------------
55
+ #
56
+ #
57
+ #
58
+ #
59
+
60
+ def initialize(attributes = {})
61
+ defaults = { list_id: Mailfox.mailservices['mailchimp']['list_id']['customer'] }
62
+ attributes = defaults.merge(attributes).symbolize_keys
63
+
64
+ super
65
+ end
66
+
67
+ #
68
+ # Instance Methods
69
+ # ---------------------------------------------------------------------------------------
70
+ #
71
+ #
72
+ #
73
+ #
74
+
75
+ #
76
+ # Class Methods
77
+ # ---------------------------------------------------------------------------------------
78
+ #
79
+ #
80
+ #
81
+ #
82
+ #
83
+ # Protected Methods
84
+ # ---------------------------------------------------------------------------------------
85
+ #
86
+ #
87
+ #
88
+ #
89
+
90
+ protected
91
+
92
+ #
93
+ # Private Methods
94
+ # ---------------------------------------------------------------------------------------
95
+ #
96
+ #
97
+ #
98
+ #
99
+
100
+ private
101
+
102
+ end
103
+ end
@@ -0,0 +1,128 @@
1
+ module MailService
2
+ class List
3
+
4
+ #
5
+ # Concerns
6
+ # ---------------------------------------------------------------------------------------
7
+ #
8
+ #
9
+ #
10
+ #
11
+
12
+ include ActiveModel::Model
13
+
14
+ #
15
+ # Constants
16
+ # ---------------------------------------------------------------------------------------
17
+ #
18
+ #
19
+ #
20
+ #
21
+
22
+ #
23
+ # Index
24
+ # ---------------------------------------------------------------------------------------
25
+ #
26
+ #
27
+ #
28
+ #
29
+
30
+ #
31
+ # Attribute Settings
32
+ # ---------------------------------------------------------------------------------------
33
+ #
34
+ #
35
+ #
36
+ #
37
+
38
+ #
39
+ # Validations
40
+ # ---------------------------------------------------------------------------------------
41
+ #
42
+ #
43
+ #
44
+ #
45
+
46
+ #
47
+ # Callbacks
48
+ # ---------------------------------------------------------------------------------------
49
+ #
50
+ #
51
+ #
52
+ #
53
+
54
+ #
55
+ # Constructor
56
+ # ---------------------------------------------------------------------------------------
57
+ #
58
+ #
59
+ #
60
+ #
61
+
62
+ #
63
+ # Instance Methods
64
+ # ---------------------------------------------------------------------------------------
65
+ #
66
+ #
67
+ #
68
+ #
69
+
70
+ #
71
+ # Class Methods
72
+ # ---------------------------------------------------------------------------------------
73
+ #
74
+ #
75
+ #
76
+ #
77
+
78
+ def self.exists?(id)
79
+ find_by_id(id).present?
80
+ end
81
+
82
+ def self.find_by_id(id)
83
+ return nil unless id
84
+
85
+ response = fetch(filters: { list_id: id }).try(:with_indifferent_access)
86
+ response[:data].try(:map, &:with_indifferent_access).try(:first) if response[:total] == 1
87
+ end
88
+
89
+ def self.all(options = {})
90
+ fetch(options)[:data].try(:map, &:with_indifferent_access)
91
+ end
92
+
93
+ def self.count(options = {})
94
+ fetch(options)[:total]
95
+ end
96
+
97
+ def self.fetch(options = {})
98
+ begin
99
+ parent.connection.lists.list(options).with_indifferent_access
100
+ rescue => e
101
+ Rails.logger.info "**[MailService Error][Exists] #{e.message}"
102
+ Rails.logger.warn "**[MailService Error][Exists] #{e.backtrace.join("\n")}" if Rails.env.development?
103
+ {}
104
+ end
105
+ end
106
+
107
+ #
108
+ # Protected Methods
109
+ # ---------------------------------------------------------------------------------------
110
+ #
111
+ #
112
+ #
113
+ #
114
+
115
+ protected
116
+
117
+ #
118
+ # Private Methods
119
+ # ---------------------------------------------------------------------------------------
120
+ #
121
+ #
122
+ #
123
+ #
124
+
125
+ private
126
+
127
+ end
128
+ end
@@ -0,0 +1,224 @@
1
+ module MailService
2
+ class Member
3
+
4
+ #
5
+ # Concerns
6
+ # ---------------------------------------------------------------------------------------
7
+ #
8
+ #
9
+ #
10
+ #
11
+
12
+ include ActiveModel::Model
13
+
14
+ #
15
+ # Constants
16
+ # ---------------------------------------------------------------------------------------
17
+ #
18
+ #
19
+ #
20
+ #
21
+
22
+ #
23
+ # Index
24
+ # ---------------------------------------------------------------------------------------
25
+ #
26
+ #
27
+ #
28
+ #
29
+
30
+ #
31
+ # Attribute Settings
32
+ # ---------------------------------------------------------------------------------------
33
+ #
34
+ #
35
+ #
36
+ #
37
+
38
+ attr_accessor :email, :list_id, :locale
39
+
40
+ attr_reader :connection, :subscriber_id, :double_optin
41
+
42
+ alias_method :name, :email
43
+
44
+ #
45
+ # Validations
46
+ # ---------------------------------------------------------------------------------------
47
+ #
48
+ #
49
+ #
50
+ #
51
+
52
+ validates :email, :list_id, presence: true
53
+
54
+ validates :email, email: true, allow_blank: true
55
+
56
+ validate :uniqueness_of_email
57
+
58
+ #
59
+ # Callbacks
60
+ # ---------------------------------------------------------------------------------------
61
+ #
62
+ #
63
+ #
64
+ #
65
+
66
+ #
67
+ # Constructor
68
+ # ---------------------------------------------------------------------------------------
69
+ #
70
+ #
71
+ #
72
+ #
73
+
74
+ def initialize(attributes = {})
75
+ defaults = {
76
+ locale: I18n.locale,
77
+ double_optin: true
78
+ }
79
+
80
+ attributes = defaults.merge(attributes).symbolize_keys
81
+
82
+ @email = attributes[:email]
83
+ @locale = attributes[:locale]
84
+ @connection = self.class.parent.connection
85
+ @double_optin = attributes[:double_optin]
86
+ @list_id = attributes[:list_id]
87
+
88
+ yield self if block_given?
89
+ end
90
+
91
+ #
92
+ # Instance Methods
93
+ # ---------------------------------------------------------------------------------------
94
+ #
95
+ #
96
+ #
97
+ #
98
+
99
+ def list
100
+ List.find_by_list_id(list_id) if list_id
101
+ end
102
+
103
+ def info
104
+ begin
105
+ unless @info
106
+ response = connection.lists.member_info(id: list_id, emails: [{ email: email}]).with_indifferent_access
107
+ @info = response[:data].first if response[:success_count] && response[:success_count] >= 1
108
+ end
109
+ rescue => e
110
+ Rails.logger.info "**[MailService Error][Info] #{e.message}"
111
+ Rails.logger.warn "**[MailService Error][Info] #{e.backtrace.join("\n")}" if Rails.env.development?
112
+ end
113
+
114
+ @info || {}
115
+ end
116
+
117
+ def persisted?
118
+ false
119
+ end
120
+
121
+ def save
122
+ return false unless valid?
123
+
124
+ return true if Rails.env.test?
125
+
126
+ begin
127
+ connection.lists.subscribe(
128
+ id: list_id,
129
+ email: { email: email },
130
+ double_optin: double_optin,
131
+ merge_vars: { mc_language: locale }
132
+ )
133
+ rescue => e
134
+ Rails.logger.info "**[MailService Error][Save] #{e.message}"
135
+ Rails.logger.warn "**[MailService Error][Save] #{e.backtrace.join("\n")}" if Rails.env.development?
136
+ false
137
+ end
138
+ end
139
+
140
+ def destroy
141
+ begin
142
+ connection.lists.unsubscribe(
143
+ id: list_id,
144
+ email: { email: email }
145
+ )
146
+ rescue => e
147
+ Rails.logger.info "**[MailService Error][Destroy] #{e.message}"
148
+ Rails.logger.warn "**[MailService Error][Destroy] #{e.backtrace.join("\n")}" if Rails.env.development?
149
+ end
150
+ end
151
+
152
+ def confirmed?
153
+ info[:timestamp_opt].present?
154
+ end
155
+
156
+ def method_missing(method_name, *args, &block)
157
+ if info.keys.include?(method_name.to_s)
158
+ info[method_name]
159
+ else
160
+ super
161
+ end
162
+ end
163
+
164
+ #
165
+ # Class Methods
166
+ # ---------------------------------------------------------------------------------------
167
+ #
168
+ #
169
+ #
170
+ #
171
+
172
+ def self.create(attributes = {})
173
+ mailservice = new(attributes)
174
+ mailservice.save
175
+ mailservice
176
+ end
177
+
178
+ def self.find_by_email(email)
179
+ new(new(email: email).info.symbolize_keys)
180
+ end
181
+
182
+ def self.exists?(options = {})
183
+ return false if options.blank?
184
+
185
+ begin
186
+ new(options.slice(:email, :list_id)).info.present?
187
+ rescue => e
188
+ Rails.logger.info "**[MailService Error][Exists] #{e.message}"
189
+ Rails.logger.warn "**[MailService Error][Exists] #{e.backtrace.join("\n")}" if Rails.env.development?
190
+ e.message
191
+ end
192
+ end
193
+
194
+ #
195
+ # Protected Methods
196
+ # ---------------------------------------------------------------------------------------
197
+ #
198
+ #
199
+ #
200
+ #
201
+
202
+ protected
203
+
204
+ #
205
+ # Private Methods
206
+ # ---------------------------------------------------------------------------------------
207
+ #
208
+ #
209
+ #
210
+ #
211
+
212
+ private
213
+
214
+ def uniqueness_of_email
215
+ existence = self.class.exists?(email: email, list_id: list_id)
216
+
217
+ case existence
218
+ when TrueClass then errors.add(:email, :taken)
219
+ when String then errors.add(:email, existence)
220
+ end
221
+ end
222
+
223
+ end
224
+ end
@@ -0,0 +1,14 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>Mailfox</title>
5
+ <%= stylesheet_link_tag "mailfox/application", media: "all" %>
6
+ <%= javascript_include_tag "mailfox/application" %>
7
+ <%= csrf_meta_tags %>
8
+ </head>
9
+ <body>
10
+
11
+ <%= yield %>
12
+
13
+ </body>
14
+ </html>
@@ -0,0 +1,6 @@
1
+ <%= form_for MailService::Customer.new, url: mailfox.newsletter_subscribe_path, as: :newsletter, remote: true, html: { class: 'mailfox-newsletter-form' } do |f| %>
2
+ <%= f.hidden_field :list_id, value: list_id %>
3
+ <%= f.text_field :email, placeholder: placeholder, class: 'mailfox-newsletter-input' %>
4
+ <%= f.submit submit_button_message, class: 'mailfox-newsletter-submit', data: { disable_with: disable_with_message } %>
5
+ <div class="mailfox-newsletter-msg"></div>
6
+ <% end %>
@@ -0,0 +1 @@
1
+ <%= render partial: "mailfox/newsletters/form", locals: {placeholder: cms_block_content("newsletter.placeholder"), list_id: cms_block_content("newsletter.list_id"), disable_with_message: cms_block_content("newsletter.disable_with_message"), submit_button_message: cms_block_content("newsletter.button")} %>
@@ -0,0 +1,16 @@
1
+ <% if @customer.errors.empty? %>
2
+
3
+ $('.mailfox-newsletter-msg').html('<%= t(".success") %>');
4
+ $('.mailfox-newsletter-input').val('');
5
+ $('.mailfox-newsletter-form').removeClass('mailfox-newsletter-error').addClass('mailfox-newsletter-success');
6
+
7
+ setTimeout(function() {
8
+ $('.mailfox-newsletter-form').removeClass('mailfox-newsletter-success');
9
+ }, 5000);
10
+
11
+ <% else %>
12
+
13
+ $('.mailfox-newsletter-msg').html('<%= error_messages_for(@customer, length: 1).html_safe %>');
14
+ $('.mailfox-newsletter-form').removeClass('mailfox-newsletter-success').addClass('mailfox-newsletter-error');
15
+
16
+ <% end %>
@@ -0,0 +1,6 @@
1
+ Mailfox::Engine.routes.draw do
2
+ # resource :newsletters, only: :create
3
+ controller :newsletters do
4
+ post "/newsletters", to: "newsletters#create", as: :newsletter_subscribe
5
+ end
6
+ end
@@ -0,0 +1,10 @@
1
+ require "mailfox/engine"
2
+
3
+ module Mailfox
4
+ mattr_accessor :mailservices
5
+ @@mailservices = nil
6
+
7
+ def self.setup
8
+ yield self
9
+ end
10
+ end
@@ -0,0 +1,13 @@
1
+ require "gibbon"
2
+ require "jquery-rails"
3
+ require "email_validator"
4
+
5
+ module Mailfox
6
+ class Engine < ::Rails::Engine
7
+ isolate_namespace Mailfox
8
+
9
+ config.generators do |g|
10
+ g.test_framework :rspec
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,14 @@
1
+ module Mailfox
2
+ def self.gem_version
3
+ Gem::Version.new VERSION::STRING
4
+ end
5
+
6
+ module VERSION
7
+ MAJOR = 0
8
+ MINOR = 0
9
+ TINY = 1
10
+ PRE = nil
11
+
12
+ STRING = [MAJOR, MINOR, TINY, PRE].compact.join(".")
13
+ end
14
+ end
@@ -0,0 +1,7 @@
1
+ require_relative 'gem_version'
2
+
3
+ module Mailfox
4
+ def self.version
5
+ gem_version
6
+ end
7
+ end
@@ -0,0 +1,4 @@
1
+ # desc "Explaining what the task does"
2
+ # task :mailfox do
3
+ # # Task goes here
4
+ # end
metadata ADDED
@@ -0,0 +1,138 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: mailfox
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Adam Bahlke
8
+ - Michael Rüffer
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2015-11-27 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rails
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - ">="
19
+ - !ruby/object:Gem::Version
20
+ version: '4.0'
21
+ type: :runtime
22
+ prerelease: false
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - ">="
26
+ - !ruby/object:Gem::Version
27
+ version: '4.0'
28
+ - !ruby/object:Gem::Dependency
29
+ name: sqlite3
30
+ requirement: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - ">="
33
+ - !ruby/object:Gem::Version
34
+ version: '0'
35
+ type: :development
36
+ prerelease: false
37
+ version_requirements: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - ">="
40
+ - !ruby/object:Gem::Version
41
+ version: '0'
42
+ - !ruby/object:Gem::Dependency
43
+ name: gibbon
44
+ requirement: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - "~>"
47
+ - !ruby/object:Gem::Version
48
+ version: 1.1.5
49
+ type: :runtime
50
+ prerelease: false
51
+ version_requirements: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - "~>"
54
+ - !ruby/object:Gem::Version
55
+ version: 1.1.5
56
+ - !ruby/object:Gem::Dependency
57
+ name: jquery-rails
58
+ requirement: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - ">="
61
+ - !ruby/object:Gem::Version
62
+ version: '4.0'
63
+ type: :runtime
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - ">="
68
+ - !ruby/object:Gem::Version
69
+ version: '4.0'
70
+ - !ruby/object:Gem::Dependency
71
+ name: email_validator
72
+ requirement: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - '='
75
+ - !ruby/object:Gem::Version
76
+ version: 1.6.0
77
+ type: :runtime
78
+ prerelease: false
79
+ version_requirements: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - '='
82
+ - !ruby/object:Gem::Version
83
+ version: 1.6.0
84
+ description: An easy-to-implement, reusable newsletter subscribe widget that connects
85
+ with Mailchimp.
86
+ email:
87
+ - develop@hitfoxgroup.com
88
+ executables: []
89
+ extensions: []
90
+ extra_rdoc_files: []
91
+ files:
92
+ - MIT-LICENSE
93
+ - Rakefile
94
+ - app/assets/javascripts/mailfox/application.js
95
+ - app/assets/stylesheets/mailfox/application.css
96
+ - app/cms/snippets/newsletter_partial.snippet
97
+ - app/controllers/mailfox/application_controller.rb
98
+ - app/controllers/mailfox/newsletters_controller.rb
99
+ - app/helpers/mailfox/application_helper.rb
100
+ - app/services/mail_service.rb
101
+ - app/services/mail_service/customer.rb
102
+ - app/services/mail_service/list.rb
103
+ - app/services/mail_service/member.rb
104
+ - app/views/layouts/mailfox/application.html.erb
105
+ - app/views/mailfox/newsletters/_form.html.erb
106
+ - app/views/mailfox/newsletters/cms/_form.html.erb
107
+ - app/views/mailfox/newsletters/create.js.erb
108
+ - config/routes.rb
109
+ - lib/mailfox.rb
110
+ - lib/mailfox/engine.rb
111
+ - lib/mailfox/gem_version.rb
112
+ - lib/mailfox/version.rb
113
+ - lib/tasks/mailfox_tasks.rake
114
+ homepage: http://hitfoxgroup.com
115
+ licenses:
116
+ - MIT
117
+ metadata: {}
118
+ post_install_message:
119
+ rdoc_options: []
120
+ require_paths:
121
+ - lib
122
+ required_ruby_version: !ruby/object:Gem::Requirement
123
+ requirements:
124
+ - - ">="
125
+ - !ruby/object:Gem::Version
126
+ version: '0'
127
+ required_rubygems_version: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ requirements: []
133
+ rubyforge_project:
134
+ rubygems_version: 2.4.8
135
+ signing_key:
136
+ specification_version: 4
137
+ summary: Quickly plugin Mailchimp, including a CMS-snippet
138
+ test_files: []