acts_as_newsletter 0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (55) hide show
  1. data/MIT-LICENSE +20 -0
  2. data/README.md +81 -0
  3. data/Rakefile +35 -0
  4. data/lib/acts_as_newsletter.rb +32 -0
  5. data/lib/acts_as_newsletter/mailer.rb +20 -0
  6. data/lib/acts_as_newsletter/model.rb +155 -0
  7. data/lib/acts_as_newsletter/model/config.rb +21 -0
  8. data/lib/acts_as_newsletter/railtie.rb +19 -0
  9. data/lib/acts_as_newsletter/version.rb +3 -0
  10. data/lib/generators/acts_as_newsletter/acts_as_newsletter_generator.rb +35 -0
  11. data/lib/generators/acts_as_newsletter/install/install_generator.rb +12 -0
  12. data/lib/generators/acts_as_newsletter/install/templates/initializer.rb +22 -0
  13. data/lib/generators/acts_as_newsletter/templates/migration.erb +17 -0
  14. data/lib/tasks/acts_as_newsletter.rake +18 -0
  15. data/spec/acts_as_newsletter_generator_spec.rb +20 -0
  16. data/spec/config_spec.rb +23 -0
  17. data/spec/dummy/README.rdoc +261 -0
  18. data/spec/dummy/Rakefile +7 -0
  19. data/spec/dummy/app/assets/javascripts/application.js +15 -0
  20. data/spec/dummy/app/assets/stylesheets/application.css +13 -0
  21. data/spec/dummy/app/controllers/application_controller.rb +3 -0
  22. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  23. data/spec/dummy/app/views/layouts/application.html.erb +14 -0
  24. data/spec/dummy/config.ru +4 -0
  25. data/spec/dummy/config/application.rb +65 -0
  26. data/spec/dummy/config/boot.rb +10 -0
  27. data/spec/dummy/config/database.yml +25 -0
  28. data/spec/dummy/config/environment.rb +5 -0
  29. data/spec/dummy/config/environments/development.rb +37 -0
  30. data/spec/dummy/config/environments/production.rb +67 -0
  31. data/spec/dummy/config/environments/test.rb +37 -0
  32. data/spec/dummy/config/initializers/acts_as_newsletter.rb +6 -0
  33. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  34. data/spec/dummy/config/initializers/inflections.rb +15 -0
  35. data/spec/dummy/config/initializers/mime_types.rb +5 -0
  36. data/spec/dummy/config/initializers/secret_token.rb +7 -0
  37. data/spec/dummy/config/initializers/session_store.rb +8 -0
  38. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
  39. data/spec/dummy/config/locales/en.yml +5 -0
  40. data/spec/dummy/config/routes.rb +58 -0
  41. data/spec/dummy/db/development.sqlite3 +0 -0
  42. data/spec/dummy/db/schema.rb +36 -0
  43. data/spec/dummy/db/test.sqlite3 +0 -0
  44. data/spec/dummy/log/development.log +29 -0
  45. data/spec/dummy/log/test.log +111434 -0
  46. data/spec/dummy/public/404.html +26 -0
  47. data/spec/dummy/public/422.html +26 -0
  48. data/spec/dummy/public/500.html +25 -0
  49. data/spec/dummy/public/favicon.ico +0 -0
  50. data/spec/dummy/script/rails +6 -0
  51. data/spec/install_generator_spec.rb +18 -0
  52. data/spec/model_spec.rb +90 -0
  53. data/spec/spec_helper.rb +40 -0
  54. data/spec/support/active_record.rb +46 -0
  55. metadata +219 -0
@@ -0,0 +1,26 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>The page you were looking for doesn't exist (404)</title>
5
+ <style type="text/css">
6
+ body { background-color: #fff; color: #666; text-align: center; font-family: arial, sans-serif; }
7
+ div.dialog {
8
+ width: 25em;
9
+ padding: 0 4em;
10
+ margin: 4em auto 0 auto;
11
+ border: 1px solid #ccc;
12
+ border-right-color: #999;
13
+ border-bottom-color: #999;
14
+ }
15
+ h1 { font-size: 100%; color: #f00; line-height: 1.5em; }
16
+ </style>
17
+ </head>
18
+
19
+ <body>
20
+ <!-- This file lives in public/404.html -->
21
+ <div class="dialog">
22
+ <h1>The page you were looking for doesn't exist.</h1>
23
+ <p>You may have mistyped the address or the page may have moved.</p>
24
+ </div>
25
+ </body>
26
+ </html>
@@ -0,0 +1,26 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>The change you wanted was rejected (422)</title>
5
+ <style type="text/css">
6
+ body { background-color: #fff; color: #666; text-align: center; font-family: arial, sans-serif; }
7
+ div.dialog {
8
+ width: 25em;
9
+ padding: 0 4em;
10
+ margin: 4em auto 0 auto;
11
+ border: 1px solid #ccc;
12
+ border-right-color: #999;
13
+ border-bottom-color: #999;
14
+ }
15
+ h1 { font-size: 100%; color: #f00; line-height: 1.5em; }
16
+ </style>
17
+ </head>
18
+
19
+ <body>
20
+ <!-- This file lives in public/422.html -->
21
+ <div class="dialog">
22
+ <h1>The change you wanted was rejected.</h1>
23
+ <p>Maybe you tried to change something you didn't have access to.</p>
24
+ </div>
25
+ </body>
26
+ </html>
@@ -0,0 +1,25 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>We're sorry, but something went wrong (500)</title>
5
+ <style type="text/css">
6
+ body { background-color: #fff; color: #666; text-align: center; font-family: arial, sans-serif; }
7
+ div.dialog {
8
+ width: 25em;
9
+ padding: 0 4em;
10
+ margin: 4em auto 0 auto;
11
+ border: 1px solid #ccc;
12
+ border-right-color: #999;
13
+ border-bottom-color: #999;
14
+ }
15
+ h1 { font-size: 100%; color: #f00; line-height: 1.5em; }
16
+ </style>
17
+ </head>
18
+
19
+ <body>
20
+ <!-- This file lives in public/500.html -->
21
+ <div class="dialog">
22
+ <h1>We're sorry, but something went wrong.</h1>
23
+ </div>
24
+ </body>
25
+ </html>
File without changes
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env ruby
2
+ # This command will automatically be run when you run "rails" with Rails 3 gems installed from the root of your application.
3
+
4
+ APP_PATH = File.expand_path('../../config/application', __FILE__)
5
+ require File.expand_path('../../config/boot', __FILE__)
6
+ require 'rails/commands'
@@ -0,0 +1,18 @@
1
+ require 'spec_helper'
2
+ require 'generator_spec/test_case'
3
+
4
+ require 'generators/acts_as_newsletter/install/install_generator'
5
+
6
+ describe ActsAsNewsletter::Generators::InstallGenerator do
7
+ include GeneratorSpec::TestCase
8
+ destination File.expand_path("../../tmp", __FILE__)
9
+
10
+ before do
11
+ prepare_destination
12
+ run_generator
13
+ end
14
+
15
+ it "should create an initializer file" do
16
+ assert_file "config/initializers/acts_as_newsletter.rb"
17
+ end
18
+ end
@@ -0,0 +1,90 @@
1
+ require 'spec_helper'
2
+
3
+ describe TestNewsletter do
4
+ before(:each) do
5
+ # Empty deliveries
6
+ ActionMailer::Base.deliveries = []
7
+ # Ensure config specs doesn't edit current chunks size
8
+ ActsAsNewsletter::Model.emails_chunk_size = EMAILS_CHUNK_SIZE
9
+ @newsletter = TestNewsletter.new
10
+ end
11
+
12
+ it "should be initialized as a draft" do
13
+ @newsletter.draft?.should be_true
14
+ end
15
+
16
+ it "should transition to ready state when readied switch is set to true" do
17
+ @newsletter.readied = true
18
+ @newsletter.save
19
+ @newsletter.state_name.should eq :ready
20
+ end
21
+
22
+ it "should transition back to draft state if readied is set to false" do
23
+ @newsletter.readied = true
24
+ @newsletter.save
25
+ @newsletter.readied = false
26
+ @newsletter.save
27
+ @newsletter.state_name.should eq :draft
28
+ end
29
+
30
+ it "should prepare sending when #send_newsletter! is called" do
31
+ @newsletter.readied = true
32
+ @newsletter.save
33
+ @newsletter.send_newsletter!
34
+ @newsletter.emails.length.should eq EMAILS_CHUNK_SIZE
35
+ end
36
+
37
+ it "should prepare recipients when asked to" do
38
+ @newsletter.readied = true
39
+ @newsletter.save
40
+ @newsletter.prepare_sending!
41
+ @newsletter.state_name.should eq :sending
42
+ @newsletter.emails.should include("user-0@example.com")
43
+ @newsletter.emails.length.should eq EMAILS_CHUNK_SIZE
44
+ @newsletter.sent_count.should eq 0
45
+ @newsletter.recipients_count.should eq RECIPIENTS_COUNT
46
+ end
47
+
48
+ context "Sending" do
49
+ before(:each) do
50
+ @newsletter.readied = true
51
+ @newsletter.save
52
+ @newsletter.prepare_sending!
53
+ end
54
+
55
+ context "emails" do
56
+ it "should contain the next recipients to send emails to" do
57
+ @newsletter.emails.should eq RECIPIENTS_EMAILS.take EMAILS_CHUNK_SIZE
58
+ end
59
+
60
+ it "should contain different emails on each sending" do
61
+ first_emails = @newsletter.emails
62
+ @newsletter.send_newsletter!
63
+ second_emails = @newsletter.emails
64
+ second_emails.should_not eq first_emails
65
+ end
66
+ end
67
+
68
+ it "should update sent emails counter when a chunk is sent" do
69
+ expected_recipients = @newsletter.emails
70
+ @newsletter.send_newsletter!
71
+ @newsletter.save
72
+ @newsletter.sent_count.should eq EMAILS_CHUNK_SIZE
73
+
74
+ actual_recipients = ActionMailer::Base.deliveries.map(&:to).flatten
75
+ expected_recipients.should eq actual_recipients
76
+ end
77
+
78
+ it "should send to all recipients and transition to :sent state when called enough times" do
79
+ expected_recipients = @newsletter.available_emails.dup
80
+ 3.times { @newsletter.send_newsletter! }
81
+ @newsletter.sent_count.should eq RECIPIENTS_COUNT
82
+
83
+ @newsletter.state_name.should eq :sent
84
+
85
+ actual_recipients = ActionMailer::Base.deliveries.map(&:to).flatten
86
+ actual_recipients.should eq expected_recipients
87
+ end
88
+
89
+ end
90
+ end
@@ -0,0 +1,40 @@
1
+ # This file is copied to spec/ when you run 'rails generate rspec:install'
2
+ ENV["RAILS_ENV"] ||= 'test'
3
+ require File.expand_path("../dummy/config/environment", __FILE__)
4
+ require 'rspec/rails'
5
+ require 'rspec/autorun'
6
+
7
+ # Requires supporting ruby files with custom matchers and macros, etc,
8
+ # in spec/support/ and its subdirectories.
9
+ Dir[Rails.root.join("spec/support/**/*.rb")].each {|f| require f}
10
+
11
+ RSpec.configure do |config|
12
+ # ## Mock Framework
13
+ #
14
+ # If you prefer to use mocha, flexmock or RR, uncomment the appropriate line:
15
+ #
16
+ # config.mock_with :mocha
17
+ # config.mock_with :flexmock
18
+ # config.mock_with :rr
19
+
20
+ # Remove this line if you're not using ActiveRecord or ActiveRecord fixtures
21
+ config.fixture_path = "#{::Rails.root}/spec/fixtures"
22
+
23
+ # If you're not using ActiveRecord, or you'd prefer not to run each of your
24
+ # examples within a transaction, remove the following line or assign false
25
+ # instead of true.
26
+ config.use_transactional_fixtures = true
27
+
28
+ # If true, the base class of anonymous controllers will be inferred
29
+ # automatically. This will be the default behavior in future versions of
30
+ # rspec-rails.
31
+ config.infer_base_class_for_anonymous_controllers = false
32
+
33
+ # Run specs in random order to surface order dependencies. If you find an
34
+ # order dependency and want to debug it, you can fix the order by providing
35
+ # the seed, which is printed after each run.
36
+ # --seed 1234
37
+ config.order = "random"
38
+ end
39
+
40
+ require 'support/active_record'
@@ -0,0 +1,46 @@
1
+ unless defined? TestNewsletter
2
+ require 'active_record'
3
+
4
+ ActiveRecord::Base.establish_connection adapter: "sqlite3", database: ":memory:"
5
+
6
+ ActiveRecord::Migration.create_table :test_newsletters do |t|
7
+ t.string :subject
8
+ t.text :content
9
+ t.string :state
10
+ t.text :recipients
11
+ t.integer :recipients_count
12
+ t.integer :sent_count
13
+ t.boolean :readied, default: false
14
+ end
15
+
16
+ ActsAsNewsletter::Mailer.from = "contact@example.com"
17
+
18
+ EMAILS_CHUNK_SIZE = 2
19
+ RECIPIENTS_COUNT = (2.5 * EMAILS_CHUNK_SIZE).to_i
20
+ RECIPIENTS_EMAILS = RECIPIENTS_COUNT.times.map { |n| "user-#{ n }@example.com" }
21
+
22
+ class TestNewsletter < ActiveRecord::Base
23
+ include ActsAsNewsletter::Model
24
+
25
+ # Model specific fields
26
+ attr_accessor :subject, :content
27
+ # AcsAsNewsletter created fields
28
+ attr_accessor :state, :recipients, :recipients_count, :sent_count, :readied
29
+
30
+ acts_as_newsletter do
31
+ emails model.temp_emails
32
+ # template_name ""
33
+ # template_path ""
34
+ layout false
35
+ end
36
+
37
+ def initialize(*)
38
+ super
39
+ send(:initialize_state_machines, :dynamic => :force)
40
+ end
41
+
42
+ def temp_emails
43
+ RECIPIENTS_EMAILS
44
+ end
45
+ end
46
+ end
metadata ADDED
@@ -0,0 +1,219 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: acts_as_newsletter
3
+ version: !ruby/object:Gem::Version
4
+ version: '0.1'
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Valentin Ballestrino
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2013-04-15 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rails
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ~>
20
+ - !ruby/object:Gem::Version
21
+ version: 3.2.12
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ~>
28
+ - !ruby/object:Gem::Version
29
+ version: 3.2.12
30
+ - !ruby/object:Gem::Dependency
31
+ name: state_machine
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ type: :runtime
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
46
+ - !ruby/object:Gem::Dependency
47
+ name: rspec-rails
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ - !ruby/object:Gem::Dependency
63
+ name: generator_spec
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ! '>='
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ type: :development
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ! '>='
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
78
+ - !ruby/object:Gem::Dependency
79
+ name: sqlite3
80
+ requirement: !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - ! '>='
84
+ - !ruby/object:Gem::Version
85
+ version: '0'
86
+ type: :development
87
+ prerelease: false
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ! '>='
92
+ - !ruby/object:Gem::Version
93
+ version: '0'
94
+ description: Allows to send a models content as a batch e-mail to a list
95
+ email:
96
+ - vala@glyph.fr
97
+ executables: []
98
+ extensions: []
99
+ extra_rdoc_files: []
100
+ files:
101
+ - lib/acts_as_newsletter/mailer.rb
102
+ - lib/acts_as_newsletter/model/config.rb
103
+ - lib/acts_as_newsletter/model.rb
104
+ - lib/acts_as_newsletter/railtie.rb
105
+ - lib/acts_as_newsletter/version.rb
106
+ - lib/acts_as_newsletter.rb
107
+ - lib/generators/acts_as_newsletter/acts_as_newsletter_generator.rb
108
+ - lib/generators/acts_as_newsletter/install/install_generator.rb
109
+ - lib/generators/acts_as_newsletter/install/templates/initializer.rb
110
+ - lib/generators/acts_as_newsletter/templates/migration.erb
111
+ - lib/tasks/acts_as_newsletter.rake
112
+ - MIT-LICENSE
113
+ - Rakefile
114
+ - README.md
115
+ - spec/acts_as_newsletter_generator_spec.rb
116
+ - spec/config_spec.rb
117
+ - spec/dummy/README.rdoc
118
+ - spec/dummy/Rakefile
119
+ - spec/dummy/app/assets/javascripts/application.js
120
+ - spec/dummy/app/assets/stylesheets/application.css
121
+ - spec/dummy/app/controllers/application_controller.rb
122
+ - spec/dummy/app/helpers/application_helper.rb
123
+ - spec/dummy/app/views/layouts/application.html.erb
124
+ - spec/dummy/config/application.rb
125
+ - spec/dummy/config/boot.rb
126
+ - spec/dummy/config/database.yml
127
+ - spec/dummy/config/environment.rb
128
+ - spec/dummy/config/environments/development.rb
129
+ - spec/dummy/config/environments/production.rb
130
+ - spec/dummy/config/environments/test.rb
131
+ - spec/dummy/config/initializers/acts_as_newsletter.rb
132
+ - spec/dummy/config/initializers/backtrace_silencers.rb
133
+ - spec/dummy/config/initializers/inflections.rb
134
+ - spec/dummy/config/initializers/mime_types.rb
135
+ - spec/dummy/config/initializers/secret_token.rb
136
+ - spec/dummy/config/initializers/session_store.rb
137
+ - spec/dummy/config/initializers/wrap_parameters.rb
138
+ - spec/dummy/config/locales/en.yml
139
+ - spec/dummy/config/routes.rb
140
+ - spec/dummy/config.ru
141
+ - spec/dummy/db/development.sqlite3
142
+ - spec/dummy/db/schema.rb
143
+ - spec/dummy/db/test.sqlite3
144
+ - spec/dummy/log/development.log
145
+ - spec/dummy/log/test.log
146
+ - spec/dummy/public/404.html
147
+ - spec/dummy/public/422.html
148
+ - spec/dummy/public/500.html
149
+ - spec/dummy/public/favicon.ico
150
+ - spec/dummy/script/rails
151
+ - spec/install_generator_spec.rb
152
+ - spec/model_spec.rb
153
+ - spec/spec_helper.rb
154
+ - spec/support/active_record.rb
155
+ homepage: http://www.glyph.fr
156
+ licenses: []
157
+ post_install_message:
158
+ rdoc_options: []
159
+ require_paths:
160
+ - lib
161
+ required_ruby_version: !ruby/object:Gem::Requirement
162
+ none: false
163
+ requirements:
164
+ - - ! '>='
165
+ - !ruby/object:Gem::Version
166
+ version: '0'
167
+ required_rubygems_version: !ruby/object:Gem::Requirement
168
+ none: false
169
+ requirements:
170
+ - - ! '>='
171
+ - !ruby/object:Gem::Version
172
+ version: '0'
173
+ requirements: []
174
+ rubyforge_project:
175
+ rubygems_version: 1.8.24
176
+ signing_key:
177
+ specification_version: 3
178
+ summary: Allows to send a models content as a batch e-mail to a list
179
+ test_files:
180
+ - spec/acts_as_newsletter_generator_spec.rb
181
+ - spec/config_spec.rb
182
+ - spec/dummy/README.rdoc
183
+ - spec/dummy/Rakefile
184
+ - spec/dummy/app/assets/javascripts/application.js
185
+ - spec/dummy/app/assets/stylesheets/application.css
186
+ - spec/dummy/app/controllers/application_controller.rb
187
+ - spec/dummy/app/helpers/application_helper.rb
188
+ - spec/dummy/app/views/layouts/application.html.erb
189
+ - spec/dummy/config/application.rb
190
+ - spec/dummy/config/boot.rb
191
+ - spec/dummy/config/database.yml
192
+ - spec/dummy/config/environment.rb
193
+ - spec/dummy/config/environments/development.rb
194
+ - spec/dummy/config/environments/production.rb
195
+ - spec/dummy/config/environments/test.rb
196
+ - spec/dummy/config/initializers/acts_as_newsletter.rb
197
+ - spec/dummy/config/initializers/backtrace_silencers.rb
198
+ - spec/dummy/config/initializers/inflections.rb
199
+ - spec/dummy/config/initializers/mime_types.rb
200
+ - spec/dummy/config/initializers/secret_token.rb
201
+ - spec/dummy/config/initializers/session_store.rb
202
+ - spec/dummy/config/initializers/wrap_parameters.rb
203
+ - spec/dummy/config/locales/en.yml
204
+ - spec/dummy/config/routes.rb
205
+ - spec/dummy/config.ru
206
+ - spec/dummy/db/development.sqlite3
207
+ - spec/dummy/db/schema.rb
208
+ - spec/dummy/db/test.sqlite3
209
+ - spec/dummy/log/development.log
210
+ - spec/dummy/log/test.log
211
+ - spec/dummy/public/404.html
212
+ - spec/dummy/public/422.html
213
+ - spec/dummy/public/500.html
214
+ - spec/dummy/public/favicon.ico
215
+ - spec/dummy/script/rails
216
+ - spec/install_generator_spec.rb
217
+ - spec/model_spec.rb
218
+ - spec/spec_helper.rb
219
+ - spec/support/active_record.rb