acts_as_newsletter 0.1

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.
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