rumble 0.7.0 → 0.9.0

Sign up to get free protection for your applications and to get access to all the features.
data/rumble.gemspec CHANGED
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # Copyright (c) 2018-2022 Yegor Bugayenko
3
+ # Copyright (c) 2018-2025 Yegor Bugayenko
4
4
  #
5
5
  # Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  # of this software and associated documentation files (the 'Software'), to deal
@@ -27,7 +27,7 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
27
27
  require_relative 'lib/rumble/version'
28
28
  Gem::Specification.new do |s|
29
29
  s.required_rubygems_version = Gem::Requirement.new('>= 0') if s.respond_to? :required_rubygems_version=
30
- s.required_ruby_version = '>= 2.3'
30
+ s.required_ruby_version = '>= 3.0'
31
31
  s.name = 'rumble'
32
32
  s.version = Rumble::VERSION
33
33
  s.license = 'MIT'
@@ -40,20 +40,14 @@ Gem::Specification.new do |s|
40
40
  s.executables = s.files.grep(%r{^bin/}) { |f| File.basename(f) }
41
41
  s.rdoc_options = ['--charset=UTF-8']
42
42
  s.extra_rdoc_files = ['README.md', 'LICENSE.txt']
43
- s.add_runtime_dependency 'liquid', '5.3.0'
44
- s.add_runtime_dependency 'mail', '2.7.1'
45
- s.add_runtime_dependency 'net-smtp-proxy', '2.0.0'
46
- s.add_runtime_dependency 'rainbow', '3.1.1'
47
- s.add_runtime_dependency 'redcarpet', '3.5.1'
48
- s.add_runtime_dependency 'slop', '4.9.2'
49
- s.add_runtime_dependency 'uuidtools', '2.2.0'
50
- s.add_development_dependency 'codecov', '0.6.0'
51
- s.add_development_dependency 'cucumber', '8.0.0'
52
- s.add_development_dependency 'minitest', '5.16.1'
53
- s.add_development_dependency 'rake', '13.0.6'
54
- s.add_development_dependency 'rdoc', '6.4.0'
55
- s.add_development_dependency 'rspec-rails', '5.1.2'
56
- s.add_development_dependency 'rubocop', '1.31.1'
57
- s.add_development_dependency 'rubocop-rspec', '2.11.1'
43
+ s.add_dependency 'liquid', '5.5.0'
44
+ s.add_dependency 'mail', '2.8.1'
45
+ s.add_dependency 'net-smtp', '0.5.0'
46
+ s.add_dependency 'net-smtp-proxy', '2.0.0'
47
+ s.add_dependency 'openssl', '~>3.0'
48
+ s.add_dependency 'rainbow', '3.1.1'
49
+ s.add_dependency 'redcarpet', '3.6.0'
50
+ s.add_dependency 'slop', '4.10.1'
51
+ s.add_dependency 'uuidtools', '2.2.0'
58
52
  s.metadata['rubygems_mfa_required'] = 'true'
59
53
  end
data/test/test__helper.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # Copyright (c) 2018-2022 Yegor Bugayenko
3
+ # Copyright (c) 2018-2025 Yegor Bugayenko
4
4
  #
5
5
  # Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  # of this software and associated documentation files (the 'Software'), to deal
@@ -24,10 +24,8 @@ $stdout.sync = true
24
24
 
25
25
  require 'simplecov'
26
26
  SimpleCov.start
27
- if ENV['CI'] == 'true'
28
- require 'codecov'
29
- SimpleCov.formatter = SimpleCov::Formatter::Codecov
30
- end
27
+
28
+ require 'simplecov-cobertura'
29
+ SimpleCov.formatter = SimpleCov::Formatter::CoberturaFormatter
31
30
 
32
31
  require 'minitest/autorun'
33
- require_relative '../lib/rumble'
data/test/test_rumble.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # Copyright (c) 2018-2022 Yegor Bugayenko
3
+ # Copyright (c) 2018-2025 Yegor Bugayenko
4
4
  #
5
5
  # Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  # of this software and associated documentation files (the 'Software'), to deal
@@ -21,18 +21,22 @@
21
21
  # SOFTWARE.
22
22
 
23
23
  require 'minitest/autorun'
24
- require 'tmpdir'
24
+ require 'os'
25
+ require 'qbash'
26
+ require 'random-port'
27
+ require 'shellwords'
25
28
  require 'slop'
29
+ require 'tmpdir'
26
30
  require_relative '../lib/rumble'
27
31
  require_relative '../lib/rumble/cli'
28
32
 
29
33
  # Rumble main module test.
30
34
  # Author:: Yegor Bugayenko (yegor256@gmail.com)
31
- # Copyright:: Copyright (c) 2018-2022 Yegor Bugayenko
35
+ # Copyright:: Copyright (c) 2018-2025 Yegor Bugayenko
32
36
  # License:: MIT
33
37
  class TestRumble < Minitest::Test
34
38
  def test_basic
35
- Dir.mktmpdir 'test' do |dir|
39
+ Dir.mktmpdir do |dir|
36
40
  letter = File.join(dir, 'letter.liquid')
37
41
  File.write(letter, 'Hi {{first}}, how are you?')
38
42
  Rumble::CLI.new(
@@ -44,4 +48,122 @@ class TestRumble < Minitest::Test
44
48
  ).send
45
49
  end
46
50
  end
51
+
52
+ def test_with_mailhog
53
+ skip('Works only on Ubuntu') if OS.mac? || OS.windows?
54
+ Dir.mktmpdir do |home|
55
+ flag = File.join(home, 'sent.txt')
56
+ letter = File.join(home, 'letter.liquid')
57
+ File.write(letter, 'Hi!')
58
+ host = 'localhost'
59
+ RandomPort::Pool::SINGLETON.acquire(2) do |smtp, http|
60
+ daemon("#{docker} run --rm -p #{smtp}:1025 -p #{http}:8025 mailhog/mailhog", flag)
61
+ wait_for(host, http)
62
+ qbash(
63
+ [
64
+ Shellwords.escape(File.join(__dir__, '../bin/rumble')),
65
+ '--method=smtp',
66
+ '--port', smtp,
67
+ '--host', host,
68
+ '--user=foo', '--password=foo',
69
+ '--subject', 'testing',
70
+ '--test', 'to@example.com',
71
+ '--from', Shellwords.escape('tester <from@example.com>'),
72
+ '--letter', Shellwords.escape(letter)
73
+ ]
74
+ )
75
+ FileUtils.touch(flag)
76
+ end
77
+ end
78
+ end
79
+
80
+ def test_with_mailhog_with_tls
81
+ skip('Works only on Ubuntu') if OS.mac? || OS.windows?
82
+ Dir.mktmpdir do |home|
83
+ flag = File.join(home, 'sent.txt')
84
+ letter = File.join(home, 'letter.liquid')
85
+ File.write(letter, 'Hi!')
86
+ host = 'localhost'
87
+ certs = File.join(home, 'certs')
88
+ FileUtils.mkdir_p(certs)
89
+ qbash("openssl genrsa -out #{Shellwords.escape(File.join(certs, 'key.pem'))} 2048", log: $stdout)
90
+ qbash(
91
+ [
92
+ 'openssl req -x509 -new -nodes',
93
+ "-key #{Shellwords.escape(File.join(certs, 'key.pem'))}",
94
+ '-sha256 -days 1024',
95
+ "-out #{Shellwords.escape(File.join(certs, 'cert.pem'))}",
96
+ '-subj "/C=US/ST=State/L=City/O=Organization/CN=localhost"'
97
+ ],
98
+ log: $stdout
99
+ )
100
+ RandomPort::Pool::SINGLETON.acquire(2) do |smtp, http|
101
+ daemon(
102
+ [
103
+ "#{docker} run --rm",
104
+ "-p #{smtp}:1025",
105
+ "-p #{http}:8025",
106
+ "-v #{Shellwords.escape(certs)}:/etc/certs",
107
+ '-e MH_TLS_BIND_ADDR=:1025',
108
+ '-e MH_STORAGE=maildir',
109
+ '-e MH_MAILDIR_PATH=/tmp/mailhog',
110
+ '-e MH_TLS_CERT_FILE=/etc/certs/cert.pem',
111
+ '-e MH_TLS_PRIV_KEY=/etc/certs/key.pem',
112
+ 'mailhog/mailhog'
113
+ ],
114
+ flag
115
+ )
116
+ wait_for(host, http)
117
+ qbash(
118
+ [
119
+ Shellwords.escape(File.join(__dir__, '../bin/rumble')),
120
+ '--method=smtp',
121
+ '--port', smtp,
122
+ '--host', host,
123
+ '--tls',
124
+ '--user=foo', '--password=foo',
125
+ '--subject', 'testing',
126
+ '--test', 'to@example.com',
127
+ '--from', Shellwords.escape('tester <from@example.com>'),
128
+ '--letter', Shellwords.escape(letter)
129
+ ]
130
+ )
131
+ FileUtils.touch(flag)
132
+ end
133
+ end
134
+ end
135
+
136
+ private
137
+
138
+ def docker
139
+ if ENV['DOCKER_SUDO'] == 'true'
140
+ 'sudo docker'
141
+ else
142
+ 'docker'
143
+ end
144
+ end
145
+
146
+ def wait_for(host, port)
147
+ start = Time.now
148
+ loop do
149
+ TCPSocket.new(host, port).close
150
+ break
151
+ rescue Errno::ECONNREFUSED => e
152
+ sleep(1)
153
+ puts "Waiting for mailhog at #{host}:#{port}: #{e.message}"
154
+ raise e if Time.now - start > 120
155
+ retry
156
+ end
157
+ end
158
+
159
+ def daemon(cmd, flag)
160
+ Thread.new do
161
+ qbash(cmd, log: $stdout) do |pid|
162
+ loop do
163
+ break if File.exist?(flag)
164
+ end
165
+ Process.kill('KILL', pid)
166
+ end
167
+ end
168
+ end
47
169
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rumble
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.0
4
+ version: 0.9.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Yegor Bugayenko
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-06-29 00:00:00.000000000 Z
11
+ date: 2025-02-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: liquid
@@ -16,210 +16,126 @@ dependencies:
16
16
  requirements:
17
17
  - - '='
18
18
  - !ruby/object:Gem::Version
19
- version: 5.3.0
19
+ version: 5.5.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: 5.3.0
26
+ version: 5.5.0
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: mail
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - '='
32
32
  - !ruby/object:Gem::Version
33
- version: 2.7.1
33
+ version: 2.8.1
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - '='
39
39
  - !ruby/object:Gem::Version
40
- version: 2.7.1
40
+ version: 2.8.1
41
41
  - !ruby/object:Gem::Dependency
42
- name: net-smtp-proxy
42
+ name: net-smtp
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - '='
46
46
  - !ruby/object:Gem::Version
47
- version: 2.0.0
47
+ version: 0.5.0
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - '='
53
53
  - !ruby/object:Gem::Version
54
- version: 2.0.0
54
+ version: 0.5.0
55
55
  - !ruby/object:Gem::Dependency
56
- name: rainbow
56
+ name: net-smtp-proxy
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
59
  - - '='
60
60
  - !ruby/object:Gem::Version
61
- version: 3.1.1
61
+ version: 2.0.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: 3.1.1
68
+ version: 2.0.0
69
69
  - !ruby/object:Gem::Dependency
70
- name: redcarpet
70
+ name: openssl
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
- - - '='
73
+ - - "~>"
74
74
  - !ruby/object:Gem::Version
75
- version: 3.5.1
75
+ version: '3.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: 3.5.1
82
+ version: '3.0'
83
83
  - !ruby/object:Gem::Dependency
84
- name: slop
84
+ name: rainbow
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
87
  - - '='
88
88
  - !ruby/object:Gem::Version
89
- version: 4.9.2
89
+ version: 3.1.1
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: 4.9.2
96
+ version: 3.1.1
97
97
  - !ruby/object:Gem::Dependency
98
- name: uuidtools
98
+ name: redcarpet
99
99
  requirement: !ruby/object:Gem::Requirement
100
100
  requirements:
101
101
  - - '='
102
102
  - !ruby/object:Gem::Version
103
- version: 2.2.0
103
+ version: 3.6.0
104
104
  type: :runtime
105
105
  prerelease: false
106
106
  version_requirements: !ruby/object:Gem::Requirement
107
107
  requirements:
108
108
  - - '='
109
109
  - !ruby/object:Gem::Version
110
- version: 2.2.0
111
- - !ruby/object:Gem::Dependency
112
- name: codecov
113
- requirement: !ruby/object:Gem::Requirement
114
- requirements:
115
- - - '='
116
- - !ruby/object:Gem::Version
117
- version: 0.6.0
118
- type: :development
119
- prerelease: false
120
- version_requirements: !ruby/object:Gem::Requirement
121
- requirements:
122
- - - '='
123
- - !ruby/object:Gem::Version
124
- version: 0.6.0
125
- - !ruby/object:Gem::Dependency
126
- name: cucumber
127
- requirement: !ruby/object:Gem::Requirement
128
- requirements:
129
- - - '='
130
- - !ruby/object:Gem::Version
131
- version: 8.0.0
132
- type: :development
133
- prerelease: false
134
- version_requirements: !ruby/object:Gem::Requirement
135
- requirements:
136
- - - '='
137
- - !ruby/object:Gem::Version
138
- version: 8.0.0
139
- - !ruby/object:Gem::Dependency
140
- name: minitest
141
- requirement: !ruby/object:Gem::Requirement
142
- requirements:
143
- - - '='
144
- - !ruby/object:Gem::Version
145
- version: 5.16.1
146
- type: :development
147
- prerelease: false
148
- version_requirements: !ruby/object:Gem::Requirement
149
- requirements:
150
- - - '='
151
- - !ruby/object:Gem::Version
152
- version: 5.16.1
153
- - !ruby/object:Gem::Dependency
154
- name: rake
155
- requirement: !ruby/object:Gem::Requirement
156
- requirements:
157
- - - '='
158
- - !ruby/object:Gem::Version
159
- version: 13.0.6
160
- type: :development
161
- prerelease: false
162
- version_requirements: !ruby/object:Gem::Requirement
163
- requirements:
164
- - - '='
165
- - !ruby/object:Gem::Version
166
- version: 13.0.6
110
+ version: 3.6.0
167
111
  - !ruby/object:Gem::Dependency
168
- name: rdoc
169
- requirement: !ruby/object:Gem::Requirement
170
- requirements:
171
- - - '='
172
- - !ruby/object:Gem::Version
173
- version: 6.4.0
174
- type: :development
175
- prerelease: false
176
- version_requirements: !ruby/object:Gem::Requirement
177
- requirements:
178
- - - '='
179
- - !ruby/object:Gem::Version
180
- version: 6.4.0
181
- - !ruby/object:Gem::Dependency
182
- name: rspec-rails
183
- requirement: !ruby/object:Gem::Requirement
184
- requirements:
185
- - - '='
186
- - !ruby/object:Gem::Version
187
- version: 5.1.2
188
- type: :development
189
- prerelease: false
190
- version_requirements: !ruby/object:Gem::Requirement
191
- requirements:
192
- - - '='
193
- - !ruby/object:Gem::Version
194
- version: 5.1.2
195
- - !ruby/object:Gem::Dependency
196
- name: rubocop
112
+ name: slop
197
113
  requirement: !ruby/object:Gem::Requirement
198
114
  requirements:
199
115
  - - '='
200
116
  - !ruby/object:Gem::Version
201
- version: 1.31.1
202
- type: :development
117
+ version: 4.10.1
118
+ type: :runtime
203
119
  prerelease: false
204
120
  version_requirements: !ruby/object:Gem::Requirement
205
121
  requirements:
206
122
  - - '='
207
123
  - !ruby/object:Gem::Version
208
- version: 1.31.1
124
+ version: 4.10.1
209
125
  - !ruby/object:Gem::Dependency
210
- name: rubocop-rspec
126
+ name: uuidtools
211
127
  requirement: !ruby/object:Gem::Requirement
212
128
  requirements:
213
129
  - - '='
214
130
  - !ruby/object:Gem::Version
215
- version: 2.11.1
216
- type: :development
131
+ version: 2.2.0
132
+ type: :runtime
217
133
  prerelease: false
218
134
  version_requirements: !ruby/object:Gem::Requirement
219
135
  requirements:
220
136
  - - '='
221
137
  - !ruby/object:Gem::Version
222
- version: 2.11.1
138
+ version: 2.2.0
223
139
  description: Sends newsletters to recipients
224
140
  email: yegor256@gmail.com
225
141
  executables:
@@ -231,16 +147,21 @@ extra_rdoc_files:
231
147
  files:
232
148
  - ".0pdd.yml"
233
149
  - ".gitattributes"
234
- - ".github/ISSUE_TEMPLATE.md"
235
- - ".github/PULL_REQUEST_TEMPLATE.md"
150
+ - ".github/workflows/actionlint.yml"
236
151
  - ".github/workflows/codecov.yml"
152
+ - ".github/workflows/copyrights.yml"
153
+ - ".github/workflows/markdown-lint.yml"
154
+ - ".github/workflows/pdd.yml"
237
155
  - ".github/workflows/rake.yml"
156
+ - ".github/workflows/xcop.yml"
157
+ - ".github/workflows/yamllint.yml"
238
158
  - ".gitignore"
239
159
  - ".pdd"
240
160
  - ".rubocop.yml"
241
161
  - ".rultor.yml"
242
162
  - ".simplecov"
243
163
  - Gemfile
164
+ - Gemfile.lock
244
165
  - LICENSE.txt
245
166
  - README.md
246
167
  - Rakefile
@@ -254,6 +175,7 @@ files:
254
175
  - lib/rumble/cli.rb
255
176
  - lib/rumble/version.rb
256
177
  - logo.svg
178
+ - renovate.json
257
179
  - rumble.gemspec
258
180
  - test/test__helper.rb
259
181
  - test/test_rumble.rb
@@ -262,7 +184,7 @@ licenses:
262
184
  - MIT
263
185
  metadata:
264
186
  rubygems_mfa_required: 'true'
265
- post_install_message:
187
+ post_install_message:
266
188
  rdoc_options:
267
189
  - "--charset=UTF-8"
268
190
  require_paths:
@@ -271,15 +193,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
271
193
  requirements:
272
194
  - - ">="
273
195
  - !ruby/object:Gem::Version
274
- version: '2.3'
196
+ version: '3.0'
275
197
  required_rubygems_version: !ruby/object:Gem::Requirement
276
198
  requirements:
277
199
  - - ">="
278
200
  - !ruby/object:Gem::Version
279
201
  version: '0'
280
202
  requirements: []
281
- rubygems_version: 3.1.2
282
- signing_key:
203
+ rubygems_version: 3.4.10
204
+ signing_key:
283
205
  specification_version: 4
284
206
  summary: Command Line Newsletter Sending Tool
285
207
  test_files: []
@@ -1,12 +0,0 @@
1
- Make sure the title of the issue explains the problem you are having. Also, the description of the issue must clearly explain what is broken, not what you want us to implement. Go through this checklist and make sure you answer "YES" to all points:
2
-
3
- - You have all pre-requisites listed in README.md installed
4
- - You are sure that you are not reporting a duplicate (search all issues)
5
- - You say "is broken" or "doesn't work" in the title
6
- - You tell us what you are trying to do
7
- - You explain the results you are getting
8
- - You suggest an alternative result you would like to see
9
-
10
- This article will help you understand what we are looking for: http://www.yegor256.com/2014/11/24/principles-of-bug-tracking.html
11
-
12
- Thank you for your contribution!
@@ -1,11 +0,0 @@
1
- Many thanks for your contribution, we truly appreciate it. We will appreciate it even more, if you make sure that you can say "YES" to each point in this short checklist:
2
-
3
- - You made a small amount of changes (less than 100 lines, less than 10 files)
4
- - You made changes related to only one bug (create separate PRs for separate problems)
5
- - You are ready to defend your changes (there will be a code review)
6
- - You don't touch what you don't understand
7
- - You ran the build locally and it passed
8
-
9
- This article will help you understand what we are looking for: http://www.yegor256.com/2015/02/09/serious-code-reviewer.html
10
-
11
- Thank you for your contribution!