correole 0.0.5 → 0.0.6

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: bd23680d484c3a44bbd64e36a11ad473bda7953d
4
- data.tar.gz: de2e5d476329234d2ab91e48ebb784edd442e59b
2
+ SHA256:
3
+ metadata.gz: f8f2fe3a7de80d7791152fd8a3763666393e9126af594aa3f67b4cba3e468342
4
+ data.tar.gz: beb208a8c5f5798cd60f8ace8a62b7b949f1c363a2c85e8e2bc85267fb22de6d
5
5
  SHA512:
6
- metadata.gz: b2bd2286ee6a39ed7abb65f86909dc54234ecd2bab9fdf1d3b72643fb08b4f05ebc3690257d5b09fae0a004fbf45ede5640993300296ae88221fbfebff589f42
7
- data.tar.gz: 0eea183a91b61e868d30a2425568de437c939782cd49e8191e82a3321a90aa92a7c8205b07c83d68416b02f8e5bca2aea65fd9076305184b56858c7da79bd8ae
6
+ metadata.gz: c3b3d63f74a0be04f81a0ccee3cb48d467f3920701e6cc3cd0bf8a1e516effc8a0c8cecb3c3725e8e0d410d987811a38267dd26702abf06d2d412311a6deddb2
7
+ data.tar.gz: 32bdbf7124e7aed3474111af567c7cb8b1390d92807764285af43efe19be0c562c2dc8079667edaf07a7a3dd2857a1559ecbd5276dbb52a1d5b0086957604691
@@ -12,6 +12,9 @@ Configuration.quiet = ARGV.second == '-q'
12
12
  case ARGV.first
13
13
  when 'send'
14
14
  Send.run!
15
+ when 'test'
16
+ Configuration.dry_run = true
17
+ Send.run!
15
18
  when 'purge'
16
19
  Purge.run!
17
20
  else
@@ -6,9 +6,15 @@ ENV['CONFIG_FILE'] ||= File.expand_path "../#{DEFAULT_CONFIG_FILE}", __FILE__
6
6
 
7
7
  class Configuration
8
8
 
9
- CONFIG_KEYS = [
9
+ BOOLEAN_KEYS = [
10
10
  'QUIET',
11
+ 'DRY_RUN',
12
+ 'SMTP_TTLS'
13
+ ]
14
+ CONFIG_KEYS = [
15
+ 'DRY_RUN_EMAIL',
11
16
  'FEED',
17
+ 'UNSUBSCRIBE_URI',
12
18
  'CONFIRMATION_URI',
13
19
  'BASE_URI',
14
20
  'SUBJECT',
@@ -20,7 +26,7 @@ class Configuration
20
26
  'SMTP_USER',
21
27
  'SMTP_PASS',
22
28
  'SMTP_AUTH',
23
- 'SMTP_TTLS' ]
29
+ ] + BOOLEAN_KEYS
24
30
 
25
31
  class << self
26
32
  CONFIG_KEYS.each do |k|
@@ -31,12 +37,12 @@ class Configuration
31
37
  def self.load!
32
38
 
33
39
  YAML.load_file(ENV['CONFIG_FILE'])[ENV['RACK_ENV']].each_pair do |k, v|
34
- ENV[k.upcase] ||= v.to_s rescue abort "Cannot load configuration key #{k}."
35
- end rescue qputs "Could not load configuration file #{ENV['CONFIG_FILE']}."
40
+ ENV[k.upcase] ||= v.to_s rescue abort("Cannot load configuration key #{k}.")
41
+ end rescue qputs "Cannot load configuration file #{ENV['CONFIG_FILE']}. Using configuration given by environment."
36
42
 
37
43
  CONFIG_KEYS.each do |k|
38
44
  case k
39
- when 'QUIET', 'SMTP_TTLS'
45
+ when *BOOLEAN_KEYS
40
46
  # Cannot store boolean values in ENV, thus this.
41
47
  self.send("#{k.downcase}=".to_sym, ENV[k] == 'true')
42
48
  when 'HTML_TEMPLATE', 'PLAIN_TEMPLATE'
@@ -1,5 +1,6 @@
1
1
  require 'sinatra/base'
2
2
  require 'sinatra/activerecord'
3
+ require 'active_support/core_ext/hash'
3
4
  require 'correole/qputs'
4
5
  require 'correole/subscriber'
5
6
  require 'correole/item'
@@ -1,7 +1,10 @@
1
1
  production: &prod
2
2
  quiet: false
3
+ dry_run: false
4
+ dry_run_email: your.email@mail.com
3
5
  base_uri: http://newsletter.ruslanledesma.com
4
6
  feed: http://ruslanledesma.com/feed.xml
7
+ unsubscribe_uri: 'http://ruslanledesma.com/unsubscribe/?email=<%= recipient %>'
5
8
  confirmation_uri: http://ruslanledesma.com/unsubscribed/
6
9
  subject: '<%= title %>: newsletter for <%= date %>'
7
10
  from: '<%= title %> <no-reply@ruslanledesma.com>'
@@ -1,8 +1,11 @@
1
1
  test:
2
2
  quiet: true
3
+ dry_run: false
4
+ dry_run_email: test@mail.com
3
5
  base_uri: http://test.ruslanledesma.com
4
6
  feed: http://ruslanledesma.com/feed.xml # reset by env for end-to-end test
5
- confirmation_uri: http://newsletter.ruslanledesma.com
7
+ unsubscribe_uri: 'http://newsletter.ruslanledesma.com/unsubscribe/?email=<%= recipient %>'
8
+ confirmation_uri: http://newsletter.ruslanledesma.com/unsubscribed/
6
9
  subject: 'Test <%= title %> - <%= date %>'
7
10
  from: '<%= title %> <no-reply@ruslanledesma.com>'
8
11
  html_template: test.html.erb
@@ -9,7 +9,7 @@ class Api < Sinatra::Base
9
9
  set :server, :thin
10
10
  enable :logging
11
11
  disable :show_exceptions
12
- use ActiveRecord::ConnectionAdapters::ConnectionManagement
12
+ # use ActiveRecord::ConnectionAdapters::ConnectionManagement
13
13
 
14
14
  before do
15
15
  content_type 'text/plain'
@@ -26,7 +26,7 @@ class Api < Sinatra::Base
26
26
  logger.info("Already subscribed #{params[:email]}.")
27
27
  Subscriber.find_by_email(params[:email]).touch
28
28
  end
29
- "#{params[:email]}\n"
29
+ [201, "#{params[:email]}\n"]
30
30
  end
31
31
 
32
32
  def unsubscribe(params)
@@ -44,16 +44,19 @@ class Api < Sinatra::Base
44
44
  end
45
45
 
46
46
  def subscribers_method_not_allowed
47
+ response.headers['Allow'] = SUBSCRIBERS_ALLOWED_METHODS
47
48
  response.headers['Access-Control-Allow-Methods'] = SUBSCRIBERS_ALLOWED_METHODS
48
49
  405
49
50
  end
50
51
 
51
52
  def unsubscribe_method_not_allowed
53
+ response.headers['Allow'] = UNSUBSCRIBE_ALLOWED_METHODS
52
54
  response.headers['Access-Control-Allow-Methods'] = UNSUBSCRIBE_ALLOWED_METHODS
53
55
  405
54
56
  end
55
57
 
56
58
  options '/subscribers/:email' do
59
+ response.headers['Allow'] = SUBSCRIBERS_ALLOWED_METHODS
57
60
  response.headers['Access-Control-Allow-Methods'] = SUBSCRIBERS_ALLOWED_METHODS
58
61
  response.headers['Access-Control-Allow-Origin'] = SUBSCRIBERS_ALLOWED_ORIGIN
59
62
  200
@@ -77,6 +80,7 @@ class Api < Sinatra::Base
77
80
  end
78
81
 
79
82
  options "#{UNSUBSCRIBE_PATH}/:email" do
83
+ response.headers['Allow'] = UNSUBSCRIBE_ALLOWED_METHODS
80
84
  response.headers['Access-Control-Allow-Methods'] = UNSUBSCRIBE_ALLOWED_METHODS
81
85
  response.headers['Access-Control-Allow-Origin'] = UNSUBSCRIBE_ALLOWED_ORIGIN
82
86
  200
@@ -12,47 +12,57 @@ class Send
12
12
  split_feed[:unsent_item].each_with_index { |i, j| qputs "[#{j+1}] #{i.link}" }
13
13
  html = compose_html split_feed
14
14
  plain = compose_plain split_feed
15
- count = Subscriber.count
16
- Subscriber.find_each.with_index do |s, i|
17
- html_s = personalize html, s.email
18
- plain_s = personalize plain, s.email
19
- qputs "[#{i+1}/#{count}] Send newsletter to #{s.email}."
15
+ rr = recipients
16
+ rr.each_with_index do |r, i|
17
+ html_r = personalize html, r.email
18
+ plain_r = personalize plain, r.email
19
+ qputs "[#{i+1}/#{rr.size}] Send newsletter to #{r.email}."
20
20
  begin
21
- send_out feed[:title], html_s, plain_s, s.email
21
+ send_out feed[:title], html_r, plain_r, r.email
22
22
  rescue => exc
23
- qputs "Could not send newsletter to #{s.email} for the following reason."
23
+ qputs "Could not send newsletter to #{r.email} for the following reason."
24
24
  qputs exc.message
25
25
  end
26
26
  end
27
- qputs 'Remember new items.'
28
- split_feed[:unsent_item].each { |i| i.save }
27
+ if not Configuration.dry_run
28
+ qputs 'Remember new items.'
29
+ split_feed[:unsent_item].each { |i| i.save }
30
+ end
29
31
  qputs 'Done.'
30
32
  end
31
33
 
32
34
  private
33
35
 
36
+ def self.recipients
37
+ if Configuration.dry_run
38
+ s = Subscriber.new(email: Configuration.dry_run_email)
39
+ return [s].each
40
+ end
41
+ return Subscriber.find_each
42
+ end
43
+
34
44
  def self.template_bindings(split_feed)
35
45
  title = split_feed[:title]
36
- unsent_items = split_feed[:unsent_item]
37
- sent_items = split_feed[:sent_item]
38
- unsubscribe_uri = nil # supress unused variable warning
39
- unsubscribe_uri = "#{Configuration.base_uri}#{Api::UNSUBSCRIBE_PATH}/<%= recipient %>"
40
46
  title = '' if !title.is_a?(String)
47
+ unsent_items = split_feed[:unsent_item]
41
48
  unsent_items = [] if !unsent_items.is_a?(Array)
42
- sent_items = [] if !unsent_items.is_a?(Array)
49
+ sent_items = split_feed[:sent_item]
50
+ sent_items = [] if !sent_items.is_a?(Array)
51
+ unsubscribe_uri = Configuration.unsubscribe_uri
52
+ if false then unsubscribe_uri end # suppress unused variable warning
43
53
  return binding
44
54
  end
45
55
 
46
56
  def self.compose_html(split_feed)
47
57
  template = Configuration.html_template
48
58
  bindings = template_bindings(split_feed)
49
- return ERB.new(template, nil, '-').result(bindings)
59
+ return ERB.new(template, trim_mode: '-').result(bindings)
50
60
  end
51
61
 
52
62
  def self.compose_plain(split_feed)
53
63
  template = Configuration.plain_template
54
64
  bindings = template_bindings(split_feed)
55
- return ERB.new(template, nil, '-').result(bindings)
65
+ return ERB.new(template, trim_mode: '-').result(bindings)
56
66
  end
57
67
 
58
68
  def self.personalize(message, recipient)
@@ -60,8 +70,8 @@ class Send
60
70
  end
61
71
 
62
72
  def self.send_out(title, html, plain, recipient)
63
- date = nil # supress unused variable warning
64
73
  date = Date.today.strftime('%a, %d %b %Y')
74
+ if false then date end # suppress unused variable warning
65
75
  Mail.deliver do
66
76
  to recipient
67
77
  from ERB.new(Configuration.from).result(binding)
@@ -1,4 +1,4 @@
1
1
  module Correole
2
- VERSION = '0.0.5'
3
- DATE = '2016-07-26'
2
+ VERSION = '0.0.6'
3
+ DATE = '2020-07-19'
4
4
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: correole
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.5
4
+ version: 0.0.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ruslan Ledesma Garza
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-07-26 00:00:00.000000000 Z
11
+ date: 2020-07-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: sinatra
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '1.4'
19
+ version: '2.0'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '1.4'
26
+ version: '2.0'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: thin
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -58,42 +58,42 @@ dependencies:
58
58
  requirements:
59
59
  - - "~>"
60
60
  - !ruby/object:Gem::Version
61
- version: '4.2'
61
+ version: '6.0'
62
62
  type: :runtime
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
- version: '4.2'
68
+ version: '6.0'
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: activesupport
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
73
  - - "~>"
74
74
  - !ruby/object:Gem::Version
75
- version: '4.2'
75
+ version: '6.0'
76
76
  type: :runtime
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
80
  - - "~>"
81
81
  - !ruby/object:Gem::Version
82
- version: '4.2'
82
+ version: '6.0'
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: mail
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
87
  - - "~>"
88
88
  - !ruby/object:Gem::Version
89
- version: '2.6'
89
+ version: '2.7'
90
90
  type: :runtime
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
94
  - - "~>"
95
95
  - !ruby/object:Gem::Version
96
- version: '2.6'
96
+ version: '2.7'
97
97
  - !ruby/object:Gem::Dependency
98
98
  name: pg
99
99
  requirement: !ruby/object:Gem::Requirement
@@ -114,42 +114,42 @@ dependencies:
114
114
  requirements:
115
115
  - - "~>"
116
116
  - !ruby/object:Gem::Version
117
- version: '1.3'
117
+ version: '1.4'
118
118
  type: :development
119
119
  prerelease: false
120
120
  version_requirements: !ruby/object:Gem::Requirement
121
121
  requirements:
122
122
  - - "~>"
123
123
  - !ruby/object:Gem::Version
124
- version: '1.3'
124
+ version: '1.4'
125
125
  - !ruby/object:Gem::Dependency
126
126
  name: minitest
127
127
  requirement: !ruby/object:Gem::Requirement
128
128
  requirements:
129
129
  - - "~>"
130
130
  - !ruby/object:Gem::Version
131
- version: '5.9'
131
+ version: '5.14'
132
132
  type: :development
133
133
  prerelease: false
134
134
  version_requirements: !ruby/object:Gem::Requirement
135
135
  requirements:
136
136
  - - "~>"
137
137
  - !ruby/object:Gem::Version
138
- version: '5.9'
138
+ version: '5.14'
139
139
  - !ruby/object:Gem::Dependency
140
140
  name: rack-test
141
141
  requirement: !ruby/object:Gem::Requirement
142
142
  requirements:
143
143
  - - "~>"
144
144
  - !ruby/object:Gem::Version
145
- version: '0.6'
145
+ version: '1.1'
146
146
  type: :development
147
147
  prerelease: false
148
148
  version_requirements: !ruby/object:Gem::Requirement
149
149
  requirements:
150
150
  - - "~>"
151
151
  - !ruby/object:Gem::Version
152
- version: '0.6'
152
+ version: '1.1'
153
153
  - !ruby/object:Gem::Dependency
154
154
  name: mini-smtp-server
155
155
  requirement: !ruby/object:Gem::Requirement
@@ -184,14 +184,14 @@ dependencies:
184
184
  requirements:
185
185
  - - "~>"
186
186
  - !ruby/object:Gem::Version
187
- version: '11.2'
187
+ version: '13.0'
188
188
  type: :development
189
189
  prerelease: false
190
190
  version_requirements: !ruby/object:Gem::Requirement
191
191
  requirements:
192
192
  - - "~>"
193
193
  - !ruby/object:Gem::Version
194
- version: '11.2'
194
+ version: '13.0'
195
195
  description: |
196
196
  Correole is a webservice that subscribes and unsubscribes readers from
197
197
  a newsletter.
@@ -234,15 +234,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
234
234
  requirements:
235
235
  - - "~>"
236
236
  - !ruby/object:Gem::Version
237
- version: 2.3.1
237
+ version: 2.7.1
238
238
  required_rubygems_version: !ruby/object:Gem::Requirement
239
239
  requirements:
240
240
  - - ">="
241
241
  - !ruby/object:Gem::Version
242
242
  version: '0'
243
243
  requirements: []
244
- rubyforge_project:
245
- rubygems_version: 2.5.1
244
+ rubygems_version: 3.1.2
246
245
  signing_key:
247
246
  specification_version: 4
248
247
  summary: A newsletter webservice