rumble 0.8.0 → 0.9.0

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 8e041e9a4e4a28a7a5d1785af0ca019c8f5200b695818e3152eafba7b7423ecd
4
- data.tar.gz: 5a67e3e764e69a175a25b60745d9cdb85ede848097ccd92349370f0ce4dc7e8d
3
+ metadata.gz: 8c20964e58895fdeea22718df431e8d62641ca63a9cdeea5392c56de5ec83d1f
4
+ data.tar.gz: 98b2eb4b246660e42970eddf45d57baf9bf9a8548464520414eaabff0e7e4bfe
5
5
  SHA512:
6
- metadata.gz: '078546d82d6ec2ead16d5e22a19864816eea7534db7ac6f28782b2487644b3c3270e57c2fbd6329da077644422717e69c52c2cc83aef6f1a3ff5ccf40e9e6d1a'
7
- data.tar.gz: f185066166adc0c1a50090bc67ea2e99622fce2cdbaf9ec6ee39385f8cc6353d521a49b258dd5506102ce21f407d3eda9eb5537bb09c0130e52b915bee2695d7
6
+ metadata.gz: 84b5a137fd6033a1ae42f629f4008e4f895889be84311e445625f5e5d7c0f0f9431ef4113c36b3ee8ce400dbd69d9ec1cdf0c368eb93e26446da4133b6853e7e
7
+ data.tar.gz: '0687de7a94ad1b70df386bad7a83382e06f9b9dcd0efcc412f408f292e163e7d4bc4fd090ef19cf3da78a33b985f6530271a043492854c632db80e35c6bcfe60'
data/.0pdd.yml CHANGED
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2018-2024 Yegor Bugayenko
1
+ # Copyright (c) 2018-2025 Yegor Bugayenko
2
2
  #
3
3
  # Permission is hereby granted, free of charge, to any person obtaining a copy
4
4
  # of this software and associated documentation files (the 'Software'), to deal
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2018-2024 Yegor Bugayenko
1
+ # Copyright (c) 2018-2025 Yegor Bugayenko
2
2
  #
3
3
  # Permission is hereby granted, free of charge, to any person obtaining a copy
4
4
  # of this software and associated documentation files (the 'Software'), to deal
@@ -28,7 +28,8 @@ name: actionlint
28
28
  - master
29
29
  jobs:
30
30
  actionlint:
31
- runs-on: ubuntu-22.04
31
+ timeout-minutes: 15
32
+ runs-on: ubuntu-24.04
32
33
  steps:
33
34
  - uses: actions/checkout@v4
34
35
  - name: Download actionlint
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2018-2024 Yegor Bugayenko
1
+ # Copyright (c) 2018-2025 Yegor Bugayenko
2
2
  #
3
3
  # Permission is hereby granted, free of charge, to any person obtaining a copy
4
4
  # of this software and associated documentation files (the 'Software'), to deal
@@ -25,15 +25,17 @@ name: codecov
25
25
  - master
26
26
  jobs:
27
27
  codecov:
28
- runs-on: ubuntu-22.04
28
+ timeout-minutes: 15
29
+ runs-on: ubuntu-24.04
29
30
  steps:
30
31
  - uses: actions/checkout@v4
31
32
  - uses: ruby/setup-ruby@v1
32
33
  with:
33
- ruby-version: 3.2
34
+ ruby-version: 3.3
34
35
  bundler-cache: true
36
+ - run: bundle config set --global path "$(pwd)/vendor/bundle"
35
37
  - run: bundle install
36
38
  - run: bundle exec rake
37
- - uses: codecov/codecov-action@v4.0.0-beta.3
39
+ - uses: codecov/codecov-action@v5
38
40
  with:
39
41
  token: ${{ secrets.CODECOV_TOKEN }}
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2018-2024 Yegor Bugayenko
1
+ # Copyright (c) 2018-2025 Yegor Bugayenko
2
2
  #
3
3
  # Permission is hereby granted, free of charge, to any person obtaining a copy
4
4
  # of this software and associated documentation files (the 'Software'), to deal
@@ -24,7 +24,8 @@ name: copyrights
24
24
  pull_request:
25
25
  jobs:
26
26
  copyrights:
27
- runs-on: ubuntu-22.04
27
+ timeout-minutes: 15
28
+ runs-on: ubuntu-24.04
28
29
  steps:
29
30
  - uses: actions/checkout@v4
30
- - uses: yegor256/copyrights-action@0.0.4
31
+ - uses: yegor256/copyrights-action@0.0.8
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2018-2024 Yegor Bugayenko
1
+ # Copyright (c) 2018-2025 Yegor Bugayenko
2
2
  #
3
3
  # Permission is hereby granted, free of charge, to any person obtaining a copy
4
4
  # of this software and associated documentation files (the 'Software'), to deal
@@ -32,7 +32,8 @@ concurrency:
32
32
  cancel-in-progress: true
33
33
  jobs:
34
34
  markdown-lint:
35
- runs-on: ubuntu-22.04
35
+ timeout-minutes: 15
36
+ runs-on: ubuntu-24.04
36
37
  steps:
37
38
  - uses: actions/checkout@v4
38
39
  - uses: articulate/actions-markdownlint@v1
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2018-2024 Yegor Bugayenko
1
+ # Copyright (c) 2018-2025 Yegor Bugayenko
2
2
  #
3
3
  # Permission is hereby granted, free of charge, to any person obtaining a copy
4
4
  # of this software and associated documentation files (the 'Software'), to deal
@@ -28,7 +28,8 @@ name: pdd
28
28
  - master
29
29
  jobs:
30
30
  pdd:
31
- runs-on: ubuntu-22.04
31
+ timeout-minutes: 15
32
+ runs-on: ubuntu-24.04
32
33
  steps:
33
34
  - uses: actions/checkout@v4
34
35
  - uses: volodya-lombrozo/pdd-action@master
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2018-2024 Yegor Bugayenko
1
+ # Copyright (c) 2018-2025 Yegor Bugayenko
2
2
  #
3
3
  # Permission is hereby granted, free of charge, to any person obtaining a copy
4
4
  # of this software and associated documentation files (the 'Software'), to deal
@@ -28,11 +28,10 @@ name: rake
28
28
  - master
29
29
  jobs:
30
30
  rake:
31
- name: test
32
31
  strategy:
33
32
  matrix:
34
- os: [ubuntu-20.04, macos-12, windows-2022]
35
- ruby: [3.2]
33
+ os: [ubuntu-24.04, macos-15, windows-2022]
34
+ ruby: [3.3]
36
35
  runs-on: ${{ matrix.os }}
37
36
  steps:
38
37
  - uses: actions/checkout@v4
@@ -40,5 +39,6 @@ jobs:
40
39
  with:
41
40
  ruby-version: ${{ matrix.ruby }}
42
41
  bundler-cache: true
42
+ - run: bundle config set --global path "$(pwd)/vendor/bundle"
43
43
  - run: bundle install
44
44
  - run: bundle exec rake
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2018-2024 Yegor Bugayenko
1
+ # Copyright (c) 2018-2025 Yegor Bugayenko
2
2
  #
3
3
  # Permission is hereby granted, free of charge, to any person obtaining a copy
4
4
  # of this software and associated documentation files (the 'Software'), to deal
@@ -24,7 +24,8 @@ name: xcop
24
24
  pull_request:
25
25
  jobs:
26
26
  xcop:
27
- runs-on: ubuntu-22.04
27
+ timeout-minutes: 15
28
+ runs-on: ubuntu-24.04
28
29
  steps:
29
30
  - uses: actions/checkout@v4
30
31
  - uses: g4s8/xcop-action@master
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2018-2024 Yegor Bugayenko
1
+ # Copyright (c) 2018-2025 Yegor Bugayenko
2
2
  #
3
3
  # Permission is hereby granted, free of charge, to any person obtaining a copy
4
4
  # of this software and associated documentation files (the 'Software'), to deal
@@ -28,7 +28,8 @@ name: yamllint
28
28
  - master
29
29
  jobs:
30
30
  yamllint:
31
- runs-on: ubuntu-22.04
31
+ timeout-minutes: 15
32
+ runs-on: ubuntu-24.04
32
33
  steps:
33
34
  - uses: actions/checkout@v4
34
35
  - uses: ibiqlik/action-yamllint@v3
data/.gitignore CHANGED
@@ -5,4 +5,4 @@ coverage/
5
5
  .DS_Store
6
6
  rdoc/
7
7
  doc/
8
- .yardoc/
8
+ .yardoc/
data/.rubocop.yml CHANGED
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2018-2024 Yegor Bugayenko
1
+ # Copyright (c) 2018-2025 Yegor Bugayenko
2
2
  #
3
3
  # Permission is hereby granted, free of charge, to any person obtaining a copy
4
4
  # of this software and associated documentation files (the 'Software'), to deal
@@ -24,14 +24,20 @@ AllCops:
24
24
  - 'assets/**/*'
25
25
  - 'vendor/**/**'
26
26
  DisplayCopNames: true
27
- TargetRubyVersion: 2.3
27
+ TargetRubyVersion: 3.0
28
28
  NewCops: enable
29
29
  SuggestExtensions: false
30
+ require:
31
+ - rubocop-minitest
32
+ - rubocop-performance
33
+ - rubocop-rake
30
34
 
31
35
  Layout/EndOfLine:
32
36
  EnforcedStyle: lf
33
37
  Metrics/CyclomaticComplexity:
34
38
  Max: 22
39
+ Metrics/ClassLength:
40
+ Max: 200
35
41
  Metrics/MethodLength:
36
42
  Enabled: false
37
43
  Layout/MultilineMethodCallIndentation:
data/.rultor.yml CHANGED
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2018-2024 Yegor Bugayenko
1
+ # Copyright (c) 2018-2025 Yegor Bugayenko
2
2
  #
3
3
  # Permission is hereby granted, free of charge, to any person obtaining a copy
4
4
  # of this software and associated documentation files (the 'Software'), to deal
@@ -19,7 +19,7 @@
19
19
  # SOFTWARE.
20
20
  ---
21
21
  docker:
22
- image: yegor256/rultor-image:1.23.1
22
+ image: yegor256/rultor-ruby
23
23
  assets:
24
24
  rubygems.yml: yegor256/home#assets/rubygems.yml
25
25
  install: |
@@ -29,7 +29,7 @@ release:
29
29
  pre: false
30
30
  script: |-
31
31
  [[ "${tag}" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]] || exit -1
32
- bundle exec rake
32
+ DOCKER_SUDO=true bundle exec rake
33
33
  rm -rf *.gem
34
34
  sed -i "s/0\.0\.0/${tag}/g" lib/rumble/version.rb
35
35
  git add lib/rumble/version.rb
data/.simplecov CHANGED
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # Copyright (c) 2018-2024 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
data/Gemfile CHANGED
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # Copyright (c) 2018-2024 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
@@ -23,14 +23,18 @@
23
23
  source 'https://rubygems.org'
24
24
  gemspec
25
25
 
26
- gem 'cucumber', '9.2.0', require: false
27
- gem 'minitest', '5.24.0', require: false
26
+ gem 'cucumber', '9.2.1', require: false
27
+ gem 'minitest', '5.25.4', require: false
28
+ gem 'os', '1.1.4', require: false
29
+ gem 'qbash', '>=0.3.1', require: false
28
30
  gem 'rake', '13.2.1', require: false
29
- gem 'rspec-rails', '6.1.3', require: false
30
- gem 'rubocop', '1.64.1', require: false
31
- gem 'rubocop-performance', '1.21.1', require: false
31
+ gem 'random-port', '>=0.7.5', require: false
32
+ gem 'rspec-rails', '7.1.0', require: false
33
+ gem 'rubocop', '1.71.2', require: false
34
+ gem 'rubocop-minitest', '0.36.0', require: false
35
+ gem 'rubocop-performance', '1.23.1', require: false
32
36
  gem 'rubocop-rake', '0.6.0', require: false
33
- gem 'rubocop-rspec', '3.0.1', require: false
37
+ gem 'rubocop-rspec', '3.4.0', require: false
34
38
  gem 'simplecov', '0.22.0', require: false
35
39
  gem 'simplecov-cobertura', '2.1.0', require: false
36
- gem 'yard', '0.9.36', require: false
40
+ gem 'yard', '0.9.37', require: false
data/Gemfile.lock CHANGED
@@ -6,6 +6,7 @@ PATH
6
6
  mail (= 2.8.1)
7
7
  net-smtp (= 0.5.0)
8
8
  net-smtp-proxy (= 2.0.0)
9
+ openssl (~> 3.0)
9
10
  rainbow (= 3.1.1)
10
11
  redcarpet (= 3.6.0)
11
12
  slop (= 4.10.1)
@@ -14,40 +15,45 @@ PATH
14
15
  GEM
15
16
  remote: https://rubygems.org/
16
17
  specs:
17
- actionpack (7.1.3.4)
18
- actionview (= 7.1.3.4)
19
- activesupport (= 7.1.3.4)
18
+ actionpack (8.0.1)
19
+ actionview (= 8.0.1)
20
+ activesupport (= 8.0.1)
20
21
  nokogiri (>= 1.8.5)
21
- racc
22
22
  rack (>= 2.2.4)
23
23
  rack-session (>= 1.0.1)
24
24
  rack-test (>= 0.6.3)
25
25
  rails-dom-testing (~> 2.2)
26
26
  rails-html-sanitizer (~> 1.6)
27
- actionview (7.1.3.4)
28
- activesupport (= 7.1.3.4)
27
+ useragent (~> 0.16)
28
+ actionview (8.0.1)
29
+ activesupport (= 8.0.1)
29
30
  builder (~> 3.1)
30
31
  erubi (~> 1.11)
31
32
  rails-dom-testing (~> 2.2)
32
33
  rails-html-sanitizer (~> 1.6)
33
- activesupport (7.1.3.4)
34
+ activesupport (8.0.1)
34
35
  base64
36
+ benchmark (>= 0.3)
35
37
  bigdecimal
36
- concurrent-ruby (~> 1.0, >= 1.0.2)
38
+ concurrent-ruby (~> 1.0, >= 1.3.1)
37
39
  connection_pool (>= 2.2.5)
38
40
  drb
39
41
  i18n (>= 1.6, < 2)
42
+ logger (>= 1.4.2)
40
43
  minitest (>= 5.1)
41
- mutex_m
42
- tzinfo (~> 2.0)
44
+ securerandom (>= 0.3)
45
+ tzinfo (~> 2.0, >= 2.0.5)
46
+ uri (>= 0.13.1)
43
47
  ast (2.4.2)
48
+ backtrace (0.4.0)
44
49
  base64 (0.2.0)
45
- bigdecimal (3.1.8)
50
+ benchmark (0.4.0)
51
+ bigdecimal (3.1.9)
46
52
  builder (3.3.0)
47
- concurrent-ruby (1.3.3)
48
- connection_pool (2.4.1)
53
+ concurrent-ruby (1.3.5)
54
+ connection_pool (2.5.0)
49
55
  crass (1.0.6)
50
- cucumber (9.2.0)
56
+ cucumber (9.2.1)
51
57
  builder (~> 3.2)
52
58
  cucumber-ci-environment (> 9, < 11)
53
59
  cucumber-core (> 13, < 14)
@@ -60,7 +66,7 @@ GEM
60
66
  multi_test (~> 1.1)
61
67
  sys-uname (~> 1.2)
62
68
  cucumber-ci-environment (10.0.1)
63
- cucumber-core (13.0.2)
69
+ cucumber-core (13.0.3)
64
70
  cucumber-gherkin (>= 27, < 28)
65
71
  cucumber-messages (>= 20, < 23)
66
72
  cucumber-tag-expressions (> 5, < 7)
@@ -68,48 +74,54 @@ GEM
68
74
  bigdecimal
69
75
  cucumber-gherkin (27.0.0)
70
76
  cucumber-messages (>= 19.1.4, < 23)
71
- cucumber-html-formatter (21.4.0)
72
- cucumber-messages (> 19, < 25)
77
+ cucumber-html-formatter (21.9.0)
78
+ cucumber-messages (> 19, < 28)
73
79
  cucumber-messages (22.0.0)
74
- cucumber-tag-expressions (6.1.0)
75
- date (3.3.4)
80
+ cucumber-tag-expressions (6.1.2)
81
+ date (3.4.1)
76
82
  diff-lcs (1.5.1)
77
- docile (1.4.0)
83
+ docile (1.4.1)
78
84
  drb (2.2.1)
79
- erubi (1.13.0)
80
- ffi (1.17.0-aarch64-linux-gnu)
81
- ffi (1.17.0-aarch64-linux-musl)
82
- ffi (1.17.0-arm-linux-gnu)
83
- ffi (1.17.0-arm-linux-musl)
84
- ffi (1.17.0-arm64-darwin)
85
- ffi (1.17.0-x64-mingw-ucrt)
86
- ffi (1.17.0-x86-linux-gnu)
87
- ffi (1.17.0-x86-linux-musl)
88
- ffi (1.17.0-x86_64-darwin)
89
- ffi (1.17.0-x86_64-linux-gnu)
90
- ffi (1.17.0-x86_64-linux-musl)
91
- i18n (1.14.5)
85
+ elapsed (0.0.1)
86
+ loog (> 0)
87
+ tago (> 0)
88
+ erubi (1.13.1)
89
+ ffi (1.17.1-aarch64-linux-gnu)
90
+ ffi (1.17.1-aarch64-linux-musl)
91
+ ffi (1.17.1-arm-linux-gnu)
92
+ ffi (1.17.1-arm-linux-musl)
93
+ ffi (1.17.1-arm64-darwin)
94
+ ffi (1.17.1-x64-mingw-ucrt)
95
+ ffi (1.17.1-x86-linux-gnu)
96
+ ffi (1.17.1-x86-linux-musl)
97
+ ffi (1.17.1-x86_64-darwin)
98
+ ffi (1.17.1-x86_64-linux-gnu)
99
+ ffi (1.17.1-x86_64-linux-musl)
100
+ i18n (1.14.7)
92
101
  concurrent-ruby (~> 1.0)
93
- io-console (0.7.2)
94
- irb (1.13.2)
102
+ io-console (0.8.0)
103
+ irb (1.15.1)
104
+ pp (>= 0.6.0)
95
105
  rdoc (>= 4.0.0)
96
106
  reline (>= 0.4.2)
97
- json (2.7.2)
98
- language_server-protocol (3.17.0.3)
107
+ json (2.9.1)
108
+ language_server-protocol (3.17.0.4)
99
109
  liquid (5.5.0)
100
- loofah (2.22.0)
110
+ logger (1.6.5)
111
+ loofah (2.24.0)
101
112
  crass (~> 1.0.2)
102
113
  nokogiri (>= 1.12.0)
114
+ loog (0.6.0)
103
115
  mail (2.8.1)
104
116
  mini_mime (>= 0.1.1)
105
117
  net-imap
106
118
  net-pop
107
119
  net-smtp
108
120
  mini_mime (1.1.5)
109
- minitest (5.24.0)
121
+ mini_portile2 (2.8.8)
122
+ minitest (5.25.4)
110
123
  multi_test (1.1.0)
111
- mutex_m (0.2.0)
112
- net-imap (0.4.14)
124
+ net-imap (0.5.5)
113
125
  date
114
126
  net-protocol
115
127
  net-pop (0.1.2)
@@ -120,99 +132,121 @@ GEM
120
132
  net-protocol
121
133
  net-smtp-proxy (2.0.0)
122
134
  proxifier (~> 1.0)
123
- nokogiri (1.16.6-aarch64-linux)
135
+ nokogiri (1.18.2)
136
+ mini_portile2 (~> 2.8.2)
137
+ racc (~> 1.4)
138
+ nokogiri (1.18.2-aarch64-linux-gnu)
139
+ racc (~> 1.4)
140
+ nokogiri (1.18.2-aarch64-linux-musl)
124
141
  racc (~> 1.4)
125
- nokogiri (1.16.6-arm-linux)
142
+ nokogiri (1.18.2-arm-linux-gnu)
126
143
  racc (~> 1.4)
127
- nokogiri (1.16.6-arm64-darwin)
144
+ nokogiri (1.18.2-arm-linux-musl)
128
145
  racc (~> 1.4)
129
- nokogiri (1.16.6-x64-mingw-ucrt)
146
+ nokogiri (1.18.2-arm64-darwin)
130
147
  racc (~> 1.4)
131
- nokogiri (1.16.6-x86-linux)
148
+ nokogiri (1.18.2-x64-mingw-ucrt)
132
149
  racc (~> 1.4)
133
- nokogiri (1.16.6-x86_64-darwin)
150
+ nokogiri (1.18.2-x86_64-darwin)
134
151
  racc (~> 1.4)
135
- nokogiri (1.16.6-x86_64-linux)
152
+ nokogiri (1.18.2-x86_64-linux-gnu)
136
153
  racc (~> 1.4)
137
- parallel (1.25.1)
138
- parser (3.3.3.0)
154
+ nokogiri (1.18.2-x86_64-linux-musl)
155
+ racc (~> 1.4)
156
+ openssl (3.3.0)
157
+ os (1.1.4)
158
+ parallel (1.26.3)
159
+ parser (3.3.7.0)
139
160
  ast (~> 2.4.1)
140
161
  racc
162
+ pp (0.6.2)
163
+ prettyprint
164
+ prettyprint (0.2.0)
141
165
  proxifier (1.0.3)
142
- psych (5.1.2)
166
+ psych (5.2.3)
167
+ date
143
168
  stringio
144
- racc (1.8.0)
145
- rack (3.1.4)
146
- rack-session (2.0.0)
169
+ qbash (0.3.2)
170
+ backtrace (> 0)
171
+ elapsed (> 0)
172
+ loog (> 0)
173
+ tago (> 0)
174
+ racc (1.8.1)
175
+ rack (3.1.9)
176
+ rack-session (2.1.0)
177
+ base64 (>= 0.1.0)
147
178
  rack (>= 3.0.0)
148
- rack-test (2.1.0)
179
+ rack-test (2.2.0)
149
180
  rack (>= 1.3)
150
- rackup (2.1.0)
181
+ rackup (2.2.1)
151
182
  rack (>= 3)
152
- webrick (~> 1.8)
153
183
  rails-dom-testing (2.2.0)
154
184
  activesupport (>= 5.0.0)
155
185
  minitest
156
186
  nokogiri (>= 1.6)
157
- rails-html-sanitizer (1.6.0)
187
+ rails-html-sanitizer (1.6.2)
158
188
  loofah (~> 2.21)
159
- nokogiri (~> 1.14)
160
- railties (7.1.3.4)
161
- actionpack (= 7.1.3.4)
162
- activesupport (= 7.1.3.4)
163
- irb
189
+ nokogiri (>= 1.15.7, != 1.16.7, != 1.16.6, != 1.16.5, != 1.16.4, != 1.16.3, != 1.16.2, != 1.16.1, != 1.16.0.rc1, != 1.16.0)
190
+ railties (8.0.1)
191
+ actionpack (= 8.0.1)
192
+ activesupport (= 8.0.1)
193
+ irb (~> 1.13)
164
194
  rackup (>= 1.0.0)
165
195
  rake (>= 12.2)
166
196
  thor (~> 1.0, >= 1.2.2)
167
197
  zeitwerk (~> 2.6)
168
198
  rainbow (3.1.1)
169
199
  rake (13.2.1)
170
- rdoc (6.7.0)
200
+ random-port (0.7.5)
201
+ tago (> 0)
202
+ rdoc (6.11.0)
171
203
  psych (>= 4.0.0)
172
204
  redcarpet (3.6.0)
173
- regexp_parser (2.9.2)
174
- reline (0.5.9)
205
+ regexp_parser (2.10.0)
206
+ reline (0.6.0)
175
207
  io-console (~> 0.5)
176
- rexml (3.3.0)
177
- strscan
178
- rspec-core (3.13.0)
208
+ rexml (3.4.0)
209
+ rspec-core (3.13.2)
179
210
  rspec-support (~> 3.13.0)
180
- rspec-expectations (3.13.1)
211
+ rspec-expectations (3.13.3)
181
212
  diff-lcs (>= 1.2.0, < 2.0)
182
213
  rspec-support (~> 3.13.0)
183
- rspec-mocks (3.13.1)
214
+ rspec-mocks (3.13.2)
184
215
  diff-lcs (>= 1.2.0, < 2.0)
185
216
  rspec-support (~> 3.13.0)
186
- rspec-rails (6.1.3)
187
- actionpack (>= 6.1)
188
- activesupport (>= 6.1)
189
- railties (>= 6.1)
217
+ rspec-rails (7.1.0)
218
+ actionpack (>= 7.0)
219
+ activesupport (>= 7.0)
220
+ railties (>= 7.0)
190
221
  rspec-core (~> 3.13)
191
222
  rspec-expectations (~> 3.13)
192
223
  rspec-mocks (~> 3.13)
193
224
  rspec-support (~> 3.13)
194
- rspec-support (3.13.1)
195
- rubocop (1.64.1)
225
+ rspec-support (3.13.2)
226
+ rubocop (1.71.2)
196
227
  json (~> 2.3)
197
228
  language_server-protocol (>= 3.17.0)
198
229
  parallel (~> 1.10)
199
230
  parser (>= 3.3.0.2)
200
231
  rainbow (>= 2.2.2, < 4.0)
201
- regexp_parser (>= 1.8, < 3.0)
202
- rexml (>= 3.2.5, < 4.0)
203
- rubocop-ast (>= 1.31.1, < 2.0)
232
+ regexp_parser (>= 2.9.3, < 3.0)
233
+ rubocop-ast (>= 1.38.0, < 2.0)
204
234
  ruby-progressbar (~> 1.7)
205
- unicode-display_width (>= 2.4.0, < 3.0)
206
- rubocop-ast (1.31.3)
235
+ unicode-display_width (>= 2.4.0, < 4.0)
236
+ rubocop-ast (1.38.0)
207
237
  parser (>= 3.3.1.0)
208
- rubocop-performance (1.21.1)
238
+ rubocop-minitest (0.36.0)
239
+ rubocop (>= 1.61, < 2.0)
240
+ rubocop-ast (>= 1.31.1, < 2.0)
241
+ rubocop-performance (1.23.1)
209
242
  rubocop (>= 1.48.1, < 2.0)
210
243
  rubocop-ast (>= 1.31.1, < 2.0)
211
244
  rubocop-rake (0.6.0)
212
245
  rubocop (~> 1.0)
213
- rubocop-rspec (3.0.1)
246
+ rubocop-rspec (3.4.0)
214
247
  rubocop (~> 1.61)
215
248
  ruby-progressbar (1.13.0)
249
+ securerandom (0.4.1)
216
250
  simplecov (0.22.0)
217
251
  docile (~> 1.1)
218
252
  simplecov-html (~> 0.11)
@@ -220,22 +254,25 @@ GEM
220
254
  simplecov-cobertura (2.1.0)
221
255
  rexml
222
256
  simplecov (~> 0.19)
223
- simplecov-html (0.12.3)
257
+ simplecov-html (0.13.1)
224
258
  simplecov_json_formatter (0.1.4)
225
259
  slop (4.10.1)
226
- stringio (3.1.1)
227
- strscan (3.1.0)
228
- sys-uname (1.3.0)
260
+ stringio (3.1.2)
261
+ sys-uname (1.3.1)
229
262
  ffi (~> 1.1)
230
- thor (1.3.1)
231
- timeout (0.4.1)
263
+ tago (0.0.2)
264
+ thor (1.3.2)
265
+ timeout (0.4.3)
232
266
  tzinfo (2.0.6)
233
267
  concurrent-ruby (~> 1.0)
234
- unicode-display_width (2.5.0)
268
+ unicode-display_width (3.1.4)
269
+ unicode-emoji (~> 4.0, >= 4.0.4)
270
+ unicode-emoji (4.0.4)
271
+ uri (1.0.2)
272
+ useragent (0.16.11)
235
273
  uuidtools (2.2.0)
236
- webrick (1.8.1)
237
- yard (0.9.36)
238
- zeitwerk (2.6.16)
274
+ yard (0.9.37)
275
+ zeitwerk (2.7.1)
239
276
 
240
277
  PLATFORMS
241
278
  aarch64-linux
@@ -245,6 +282,7 @@ PLATFORMS
245
282
  arm-linux-gnu
246
283
  arm-linux-musl
247
284
  arm64-darwin
285
+ arm64-darwin-23
248
286
  x64-mingw-ucrt
249
287
  x86-linux
250
288
  x86-linux-gnu
@@ -255,18 +293,22 @@ PLATFORMS
255
293
  x86_64-linux-musl
256
294
 
257
295
  DEPENDENCIES
258
- cucumber (= 9.2.0)
259
- minitest (= 5.24.0)
296
+ cucumber (= 9.2.1)
297
+ minitest (= 5.25.4)
298
+ os (= 1.1.4)
299
+ qbash (>= 0.3.1)
260
300
  rake (= 13.2.1)
261
- rspec-rails (= 6.1.3)
262
- rubocop (= 1.64.1)
263
- rubocop-performance (= 1.21.1)
301
+ random-port (>= 0.7.5)
302
+ rspec-rails (= 7.1.0)
303
+ rubocop (= 1.71.2)
304
+ rubocop-minitest (= 0.36.0)
305
+ rubocop-performance (= 1.23.1)
264
306
  rubocop-rake (= 0.6.0)
265
- rubocop-rspec (= 3.0.1)
307
+ rubocop-rspec (= 3.4.0)
266
308
  rumble!
267
309
  simplecov (= 0.22.0)
268
310
  simplecov-cobertura (= 2.1.0)
269
- yard (= 0.9.36)
311
+ yard (= 0.9.37)
270
312
 
271
313
  BUNDLED WITH
272
- 2.5.6
314
+ 2.5.16
data/LICENSE.txt CHANGED
@@ -1,6 +1,6 @@
1
1
  (The MIT License)
2
2
 
3
- Copyright (c) 2018-2024 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
data/Rakefile CHANGED
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # Copyright (c) 2018-2024 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
@@ -33,7 +33,7 @@ def version
33
33
  Gem::Specification.load(Dir['*.gemspec'].first).version
34
34
  end
35
35
 
36
- task default: %i[clean test features rubocop yard copyright]
36
+ task default: %i[clean test features rubocop yard]
37
37
 
38
38
  require 'rake/testtask'
39
39
  desc 'Run all unit tests'
@@ -64,11 +64,3 @@ end
64
64
  Cucumber::Rake::Task.new(:'features:html') do |t|
65
65
  t.profile = 'html_report'
66
66
  end
67
-
68
- task :copyright do
69
- sh "grep -q -r '#{Date.today.strftime('%Y')}' \
70
- --include '*.rb' \
71
- --include '*.txt' \
72
- --include 'Rakefile' \
73
- ."
74
- end
data/bin/rumble CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env ruby
2
- # Copyright (c) 2018-2024 Yegor Bugayenko
2
+ # Copyright (c) 2018-2025 Yegor Bugayenko
3
3
  #
4
4
  # Permission is hereby granted, free of charge, to any person obtaining a copy
5
5
  # of this software and associated documentation files (the 'Software'), to deal
@@ -21,18 +21,21 @@
21
21
 
22
22
  STDOUT.sync = true
23
23
 
24
- require 'slop'
25
24
  require 'mail'
25
+ require 'openssl'
26
+ require 'slop'
26
27
  require_relative '../lib/rumble'
27
- require_relative '../lib/rumble/version'
28
28
  require_relative '../lib/rumble/cli'
29
+ require_relative '../lib/rumble/version'
29
30
 
30
31
  begin
31
32
  args = []
32
33
  config = File.expand_path('~/.rumble')
33
34
  if File.exist?(config)
34
35
  body = File.read(config)
35
- extra = body.split(/[\r\n]+/).map(&:strip)
36
+ extra = body.split(/[\r\n]+/).map(&:strip).map do |ln|
37
+ ln.gsub(/^(--(?:user|password)=).+$/, '\1***skipped***')
38
+ end
36
39
  args += extra
37
40
  puts "Found #{body.split(/\n/).length} lines in #{config}:
38
41
  #{extra.join("\n ")}"
@@ -59,8 +62,11 @@ begin
59
62
  o.string '--method',
60
63
  'How to deliver them: "smtp" or "sendmail" (default: sendmail)',
61
64
  default: 'sendmail'
65
+ o.bool '--tls',
66
+ 'Whether TLS must be used or not (default: true)',
67
+ default: false
62
68
  o.string '--host', 'SMTP host name'
63
- o.integer '--port', 'SMTP port number (25 by default)', default: 25
69
+ o.integer '--port', 'SMTP port number (default: 25)', default: 25
64
70
  o.string '--user', 'SMTP user name'
65
71
  o.string '--password', 'SMTP password'
66
72
  o.string '--proxy', 'HTTP/SOCKS proxy, e.g. "socks:192.168.0.1:8080"'
@@ -70,9 +76,9 @@ begin
70
76
  o.string '--resume', 'Email address from which we should resume'
71
77
  o.string '--skip', 'File name with emails that opted-out (black list)'
72
78
  o.string '--test', 'Email address to use instead of the real user list'
73
- o.string '--col-first', 'First name columm (0 by default)', default: 0
74
- o.string '--col-last', 'Last name columm (1 by default)', default: 1
75
- o.string '--col-email', 'Email columm (2 by default)', default: 2
79
+ o.string '--col-first', 'First name columm (default: 0)', default: 0
80
+ o.string '--col-last', 'Last name columm (default: 1)', default: 1
81
+ o.string '--col-email', 'Email columm (default: 2)', default: 2
76
82
  o.string '--attach', 'The script to run on each email'
77
83
  end
78
84
  rescue Slop::Error => ex
@@ -98,15 +104,16 @@ begin
98
104
  raise '--user is required' unless opts[:user]
99
105
  raise '--password is required' unless opts[:password]
100
106
  from = Mail::Address.new(opts[:from])
101
- raise 'The --proxy option is not supporte' if opts[:proxy]
107
+ raise 'The --proxy option is not supported' if opts[:proxy]
108
+ puts "Sending to #{opts[:host]}:#{opts[:port]} from #{opts[:from]}"
102
109
  delivery_method :smtp, {
103
110
  domain: from.domain,
104
111
  address: opts[:host],
105
112
  port: opts[:port],
106
113
  user_name: opts[:user],
107
114
  password: opts[:password],
108
- enable_starttls: true,
109
- enable_starttls_auto: true
115
+ authentication: 'plain',
116
+ enable_starttls_auto: opts[:tls]
110
117
  }
111
118
  else
112
119
  raise "Delivery method #{opts[:method]} is not supported"
data/cucumber.yml CHANGED
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2018-2024 Yegor Bugayenko
1
+ # Copyright (c) 2018-2025 Yegor Bugayenko
2
2
  #
3
3
  # Permission is hereby granted, free of charge, to any person obtaining a copy
4
4
  # of this software and associated documentation files (the 'Software'), to deal
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # Copyright (c) 2018-2024 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
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # Copyright (c) 2018-2024 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
data/lib/rumble/cli.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # Copyright (c) 2018-2024 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
@@ -20,20 +20,20 @@
20
20
  # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
21
  # SOFTWARE.
22
22
 
23
+ require 'csv'
23
24
  require 'English'
24
- require 'mail'
25
- require 'uuidtools'
26
25
  require 'liquid'
27
- require 'csv'
28
- require 'tmpdir'
26
+ require 'mail'
27
+ require 'rainbow'
29
28
  require 'redcarpet'
30
29
  require 'redcarpet/render_strip'
31
- require 'rainbow'
30
+ require 'tmpdir'
31
+ require 'uuidtools'
32
32
  require_relative 'version'
33
33
 
34
34
  # Rumble main script.
35
35
  # Author:: Yegor Bugayenko (yegor256@gmail.com)
36
- # Copyright:: Copyright (c) 2018-2024 Yegor Bugayenko
36
+ # Copyright:: Copyright (c) 2018-2025 Yegor Bugayenko
37
37
  # License:: MIT
38
38
  class Rumble::CLI
39
39
  # Make an instance.
@@ -66,8 +66,9 @@ class Rumble::CLI
66
66
  emails.each do |array|
67
67
  email = array[@opts['col-email'].to_i]
68
68
  unless email
69
- puts "Email is #{Rainbow('absent').red} \
70
- at the column ##{@opts['col-email'].to_i}: #{array}"
69
+ puts \
70
+ "Email is #{Rainbow('absent').red} " \
71
+ "at the column ##{@opts['col-email'].to_i}: #{array}"
71
72
  next
72
73
  end
73
74
  email = email.strip.downcase
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # Copyright (c) 2018-2024 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
@@ -22,8 +22,8 @@
22
22
 
23
23
  # Rumble main module.
24
24
  # Author:: Yegor Bugayenko (yegor256@gmail.com)
25
- # Copyright:: Copyright (c) 2018-2024 Yegor Bugayenko
25
+ # Copyright:: Copyright (c) 2018-2025 Yegor Bugayenko
26
26
  # License:: MIT
27
27
  module Rumble
28
- VERSION = '0.8.0'
28
+ VERSION = '0.9.0'
29
29
  end
data/lib/rumble.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # Copyright (c) 2018-2024 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
@@ -22,7 +22,7 @@
22
22
 
23
23
  # Rumble module.
24
24
  # Author:: Yegor Bugayenko (yegor256@gmail.com)
25
- # Copyright:: Copyright (c) 2018-2024 Yegor Bugayenko
25
+ # Copyright:: Copyright (c) 2018-2025 Yegor Bugayenko
26
26
  # License:: MIT
27
27
  module Rumble
28
28
  # Nothing
data/logo.svg CHANGED
@@ -16,4 +16,4 @@
16
16
  </g>
17
17
  </g>
18
18
  </g>
19
- </svg>
19
+ </svg>
data/rumble.gemspec CHANGED
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # Copyright (c) 2018-2024 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,13 +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.5.0'
44
- s.add_runtime_dependency 'mail', '2.8.1'
45
- s.add_runtime_dependency 'net-smtp', '0.5.0'
46
- s.add_runtime_dependency 'net-smtp-proxy', '2.0.0'
47
- s.add_runtime_dependency 'rainbow', '3.1.1'
48
- s.add_runtime_dependency 'redcarpet', '3.6.0'
49
- s.add_runtime_dependency 'slop', '4.10.1'
50
- s.add_runtime_dependency 'uuidtools', '2.2.0'
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'
51
52
  s.metadata['rubygems_mfa_required'] = 'true'
52
53
  end
data/test/test__helper.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # Copyright (c) 2018-2024 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
data/test/test_rumble.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # Copyright (c) 2018-2024 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-2024 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.8.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: 2024-06-23 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
@@ -66,6 +66,20 @@ dependencies:
66
66
  - - '='
67
67
  - !ruby/object:Gem::Version
68
68
  version: 2.0.0
69
+ - !ruby/object:Gem::Dependency
70
+ name: openssl
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '3.0'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '3.0'
69
83
  - !ruby/object:Gem::Dependency
70
84
  name: rainbow
71
85
  requirement: !ruby/object:Gem::Requirement
@@ -170,7 +184,7 @@ licenses:
170
184
  - MIT
171
185
  metadata:
172
186
  rubygems_mfa_required: 'true'
173
- post_install_message:
187
+ post_install_message:
174
188
  rdoc_options:
175
189
  - "--charset=UTF-8"
176
190
  require_paths:
@@ -179,7 +193,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
179
193
  requirements:
180
194
  - - ">="
181
195
  - !ruby/object:Gem::Version
182
- version: '2.3'
196
+ version: '3.0'
183
197
  required_rubygems_version: !ruby/object:Gem::Requirement
184
198
  requirements:
185
199
  - - ">="
@@ -187,7 +201,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
187
201
  version: '0'
188
202
  requirements: []
189
203
  rubygems_version: 3.4.10
190
- signing_key:
204
+ signing_key:
191
205
  specification_version: 4
192
206
  summary: Command Line Newsletter Sending Tool
193
207
  test_files: []