sidekiq-instrumental 0.3.1 → 0.3.4

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: 2e3b5be832d57b3a1a67741a65b46b983f0580b56a7ff24db58fb8da85b59ee8
4
- data.tar.gz: e2465ae0bad37bd73903c6cd7e4c518c1e3350d508684a30178a6f9929d8a393
3
+ metadata.gz: d14f250c271b145a6c61534eff188d74ed8f8382d57ab5528222a3a2bb924756
4
+ data.tar.gz: 8dddb6c4aa02f3d71f6e43ed09e78d9f3da62f6ab3c453eed266ca15fa7c4ef7
5
5
  SHA512:
6
- metadata.gz: 90e026453667bb00ebf30e992a3b38e1cca3aeb6273e914ef68fb6cdff4340c1e9a8129def78672a9bd64b58d0d71f7f5c9a022a83ea250e59310f412bb9a64d
7
- data.tar.gz: f3050927c14134accfba8316f4394bd8ef6bd35aafef32a5ca7c7b1145491a9ab67996e13c6d2c27514e61369ba85ebec8893407b11d6077f658ae819eef3583
6
+ metadata.gz: f4e2f11e879c4c6af1fc88a1df84cc8ce2bb373ba7c1c7c8ce2674e1997a793c361ecd77fe9d539002e387aebae8e66cfe48d186a4ba889da2f7e978776c8b4a
7
+ data.tar.gz: dcaa77759c298e69e5400b72cf0cddcdb479430e21786a15a020c6b647393fd773c9359aa950a38b127714644aa398708d0756220c159bb3dc5693cc620d3cc7
@@ -0,0 +1,24 @@
1
+ ## Change description
2
+
3
+ > Please include a summary of the change and which issue is fixed. Please also include
4
+ relevant motivation and context. List any dependencies that are required for this change.
5
+
6
+ ## Related issues
7
+
8
+ - Source: <Issue link or Spec Link>
9
+ - UAT: <UAT Link>
10
+ - QA: <QA Task Link here>
11
+ - Review app: <Link to Heroku>
12
+
13
+ ## Checklists
14
+
15
+ ### Development
16
+
17
+ - [ ] The commit message follows our [guidelines](https://docs.hubstaff.com/hubstaff-docs/latest/great_commit_messages.html)
18
+ - [ ] I have performed a self-review of my own code
19
+ - [ ] I have thoroughly tested the changes
20
+ - [ ] I have added tests that prove my fix is effective or that my feature works
21
+
22
+ ### Security
23
+
24
+ - [ ] Security impact of change has been considered
@@ -0,0 +1,39 @@
1
+ ---
2
+ name: CI PR Builds
3
+ 'on':
4
+ push:
5
+ branches:
6
+ - master
7
+ pull_request:
8
+ concurrency:
9
+ group: ci-${{ github.ref }}
10
+ cancel-in-progress: true
11
+ jobs:
12
+ test:
13
+ runs-on: ubuntu-latest
14
+ strategy:
15
+ fail-fast: false
16
+ matrix:
17
+ ruby:
18
+ - '2.5'
19
+ - '2.7'
20
+ sidekiq:
21
+ - '4'
22
+ - '5'
23
+ env:
24
+ BUNDLE_GEMFILE: "${{ github.workspace }}/gemfiles/Gemfile.sidekiq${{ matrix.sidekiq }}"
25
+ steps:
26
+ - uses: actions/checkout@v2
27
+ - name: Set up Ruby
28
+ uses: ruby/setup-ruby@v1
29
+ with:
30
+ ruby-version: "${{ matrix.ruby }}"
31
+ bundler-cache: true
32
+ - name: Run bundle update
33
+ run: bundle update
34
+ - name: Run tests
35
+ run: bundle exec rake spec
36
+ - name: Rubocop
37
+ run: bundle exec rubocop
38
+ - name: Build gem
39
+ run: gem build *.gemspec
data/.gitignore CHANGED
@@ -4,6 +4,7 @@
4
4
  /.ruby-version
5
5
  /.ruby-gemset
6
6
  /Gemfile.lock
7
+ /gemfiles/*.lock
7
8
  /_yardoc/
8
9
  /coverage/
9
10
  /doc/
data/CHANGELOG.md CHANGED
@@ -9,6 +9,19 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
9
9
  ### Changed
10
10
  ### Fixed
11
11
 
12
+ ## [0.3.4]
13
+ ### Fixed
14
+ - cover multiple possible returns types of display_class
15
+
16
+ ## [0.3.3]
17
+ ### Fixed
18
+ - Fix unwrap_class_name, it was wrongly expecting an instance not a class.
19
+
20
+ ## [0.3.2]
21
+ ### Added
22
+ - Implement a custom version of Sidekiq's display\_class\_name that fix an issues with ActiveJob > 6 when the job's class is passed as class not String
23
+ - Limit support up to Sidekiq < 6.
24
+
12
25
  ## [0.3.1]
13
26
  ### Fixed
14
27
  - class name calculation needs to filter out unsupported characters by instrumental
@@ -1,3 +1,3 @@
1
- mkdir ~/.gem
1
+ mkdir -p ~/.gem
2
2
  echo -e "---\n:rubygems_api_key: $RUBYGEMS_API_KEY" > ~/.gem/credentials
3
3
  chmod 0600 ~/.gem/credentials
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+ gemspec path: File.expand_path('..', __FILE__)
3
+
4
+ File.exist?(gemfile_local = File.expand_path('../Gemfile.local', __FILE__)) and eval File.read(gemfile_local), binding, gemfile_local
@@ -0,0 +1,4 @@
1
+ base_gemfile = File.expand_path('../Gemfile.base', __FILE__)
2
+ eval File.read(base_gemfile)
3
+
4
+ gem "sidekiq", ">= 4.0", "< 5.0"
@@ -0,0 +1,4 @@
1
+ base_gemfile = File.expand_path('../Gemfile.base', __FILE__)
2
+ eval File.read(base_gemfile)
3
+
4
+ gem "sidekiq", ">= 5.0", "< 6.0"
@@ -41,12 +41,42 @@ module Sidekiq
41
41
  end
42
42
 
43
43
  def build_class_key(klass_name)
44
- key = klass_name.underscore
44
+ key = underscore(klass_name)
45
45
  .gsub(/[^\d\w\-_\.]/, '_')
46
46
  .gsub(/\.{2,}/, '.')
47
47
  key.chomp!('.') while key[-1] == '.'
48
48
  key
49
49
  end
50
+
51
+ # Borrowed from active support so we do not depend on it.
52
+ def underscore(camel_cased_word)
53
+ return camel_cased_word unless /[A-Z-]|::/.match?(camel_cased_word)
54
+
55
+ word = camel_cased_word.to_s.gsub('::', '/')
56
+ word.gsub!(/([A-Z\d]+)([A-Z][a-z])/, '\1_\2')
57
+ word.gsub!(/([a-z\d])([A-Z])/, '\1_\2')
58
+ word.tr!('-', '_')
59
+ word.downcase!
60
+ word
61
+ end
62
+
63
+ # Returns the human-friendly class name, if its a known wrapper we unwrap it.
64
+ # Previously, this was done by the +display_name+ method of Sidekiq::Job,
65
+ # but after this change (https://github.com/rails/rails/commit/0e64348ccaf513de731f403259ec5b49e7b3f028)
66
+ # the method (https://github.com/mperham/sidekiq/blob/main/lib/sidekiq/api.rb#L342)
67
+ # no longer works as expected as it compares a class against a string,
68
+ # returning the wrapped job class not the class behind it as String.
69
+ def unwrap_class_name(job)
70
+ display_class = job.display_class
71
+
72
+ if %w[ActionMailer::DeliveryJob ActionMailer::MailDeliveryJob]
73
+ .include?(display_class.to_s)
74
+ # The class name was not unwrapped correctly by the +display_class+ method
75
+ job.args[0]['arguments'][0..1].join('#')
76
+ else
77
+ display_class.to_s
78
+ end
79
+ end
50
80
  end
51
81
  end
52
82
  end
@@ -13,7 +13,8 @@ module Sidekiq
13
13
  base_key = "sidekiq.#{queue}."
14
14
  increment(base_key + 'queued')
15
15
 
16
- base_key += build_class_key(msg.display_class) + '.'
16
+ display_class = unwrap_class_name(msg)
17
+ base_key += build_class_key(display_class) + '.'
17
18
 
18
19
  increment(base_key + 'queued')
19
20
  end
@@ -18,7 +18,9 @@ module Sidekiq
18
18
  gauge(base_key + 'time', elapsed)
19
19
  gauge(base_key + 'enqueued', stats.queues[queue].to_i)
20
20
  gauge(base_key + 'latency', Sidekiq::Queue.new(queue.to_s).latency)
21
- base_key += build_class_key(msg.display_class) + '.'
21
+
22
+ display_class = unwrap_class_name(msg)
23
+ base_key += build_class_key(display_class) + '.'
22
24
 
23
25
  increment(base_key + 'processed')
24
26
  gauge(base_key + 'time', elapsed)
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Sidekiq
4
4
  module Instrumental
5
- VERSION = '0.3.1'
5
+ VERSION = '0.3.4'
6
6
  end
7
7
  end
@@ -24,10 +24,9 @@ Gem::Specification.new do |spec|
24
24
  spec.required_ruby_version = '>= 2.3'
25
25
 
26
26
  spec.add_runtime_dependency 'instrumental_agent', '>= 0.13'
27
- spec.add_runtime_dependency 'sidekiq', '>= 3.5'
27
+ spec.add_runtime_dependency 'sidekiq', '>= 4.0', '< 6.0'
28
28
 
29
- spec.add_development_dependency 'activesupport', '~> 5.0'
30
- spec.add_development_dependency 'bundler', '~> 1.9'
29
+ spec.add_development_dependency 'bundler'
31
30
  spec.add_development_dependency 'rake', '>= 10.0'
32
31
  spec.add_development_dependency 'rspec', '~> 3.4'
33
32
  spec.add_development_dependency 'simplecov', '~> 0.11'
@@ -2,8 +2,6 @@
2
2
 
3
3
  require 'spec_helper'
4
4
 
5
- require 'active_support/core_ext/string/inflections'
6
-
7
5
  RSpec.describe Sidekiq::Instrumental::Middleware::Client do
8
6
  let(:config) { Sidekiq::Instrumental::Configuration.new }
9
7
  let(:middleware) { described_class.new(config) }
@@ -71,6 +69,16 @@ RSpec.describe Sidekiq::Instrumental::Middleware::Client do
71
69
  subject
72
70
  end
73
71
  end
72
+
73
+ context 'when the class is not passed as a string' do
74
+ let(:msg) { { 'class' => stub_const('MyClassName', Class.new) } }
75
+
76
+ it 'increments the queued metric for the queue' do
77
+ expect(middleware).to receive(:increment).with("sidekiq.#{queue}.queued")
78
+
79
+ subject
80
+ end
81
+ end
74
82
  end
75
83
 
76
84
  it 'calls display_class to get the class name' do
@@ -86,4 +94,72 @@ RSpec.describe Sidekiq::Instrumental::Middleware::Client do
86
94
 
87
95
  subject
88
96
  end
97
+
98
+ describe 'Unwrap sidekiq job class name' do
99
+ let(:msg) do
100
+ {
101
+ 'class' => 'ActiveJob::QueueAdapters::SidekiqAdapter::JobWrapper',
102
+ 'wrapped' => passed_class,
103
+ 'args' => args
104
+ }
105
+ end
106
+ let(:args) { [] }
107
+
108
+ context "when sidekiq's wrapped class is a mail delivery job" do
109
+ let(:wrapped_class) { stub_const('ActionMailer::DeliveryJob', Class.new) }
110
+ let(:args) { [{ 'arguments' => %w[UserMailer confirm_account deliver_now User] }] }
111
+
112
+ context 'when passed as a String' do
113
+ let(:passed_class) { wrapped_class.to_s }
114
+
115
+ it 'unwraps the class name and increments the metric' do
116
+ expect(middleware)
117
+ .to receive(:increment)
118
+ .with("sidekiq.#{queue}.user_mailer_confirm_account.queued")
119
+
120
+ subject
121
+ end
122
+ end
123
+
124
+ context 'when passed as a Class' do
125
+ let(:passed_class) { wrapped_class }
126
+
127
+ it 'unwraps the class name and increments the metric' do
128
+ expect(middleware)
129
+ .to receive(:increment)
130
+ .with("sidekiq.#{queue}.user_mailer_confirm_account.queued")
131
+
132
+ subject
133
+ end
134
+ end
135
+ end
136
+
137
+ context "when sidekiq's wrapped class is not a mail delivery job" do
138
+ let(:wrapped_class) { stub_const('Jobs::Job', Class.new) }
139
+
140
+ context 'when passed as a String' do
141
+ let(:passed_class) { wrapped_class.to_s }
142
+
143
+ it 'unwraps the class name and increments the metric' do
144
+ expect(middleware)
145
+ .to receive(:increment)
146
+ .with("sidekiq.#{queue}.jobs_job.queued")
147
+
148
+ subject
149
+ end
150
+ end
151
+
152
+ context 'when passed as a Class' do
153
+ let(:passed_class) { wrapped_class }
154
+
155
+ it 'unwraps the class name and increments the metric' do
156
+ expect(middleware)
157
+ .to receive(:increment)
158
+ .with("sidekiq.#{queue}.jobs_job.queued")
159
+
160
+ subject
161
+ end
162
+ end
163
+ end
164
+ end
89
165
  end
@@ -2,8 +2,6 @@
2
2
 
3
3
  require 'spec_helper'
4
4
 
5
- require 'active_support/core_ext/string/inflections'
6
-
7
5
  RSpec.describe Sidekiq::Instrumental::Middleware::Server do
8
6
  let(:config) { Sidekiq::Instrumental::Configuration.new }
9
7
  let(:middleware) { described_class.new(config) }
@@ -124,6 +122,16 @@ RSpec.describe Sidekiq::Instrumental::Middleware::Server do
124
122
  subject
125
123
  end
126
124
  end
125
+
126
+ context 'when the class is not passed as a string' do
127
+ let(:msg) { { 'class' => stub_const('MyClassName', Class.new) } }
128
+
129
+ it 'increments the queued metric for the queue' do
130
+ expect(middleware).to receive(:increment).with("sidekiq.#{queue}.processed")
131
+
132
+ subject
133
+ end
134
+ end
127
135
  end
128
136
 
129
137
  it 'gauge elapsed time metric for the class' do
@@ -135,4 +143,72 @@ RSpec.describe Sidekiq::Instrumental::Middleware::Server do
135
143
 
136
144
  subject
137
145
  end
146
+
147
+ describe 'Unwrap sidekiq job class name' do
148
+ let(:msg) do
149
+ {
150
+ 'class' => 'ActiveJob::QueueAdapters::SidekiqAdapter::JobWrapper',
151
+ 'wrapped' => passed_class,
152
+ 'args' => args
153
+ }
154
+ end
155
+ let(:args) { [] }
156
+
157
+ context "when sidekiq's wrapped class is a mail delivery job" do
158
+ let(:wrapped_class) { stub_const('ActionMailer::DeliveryJob', Class.new) }
159
+ let(:args) { [{ 'arguments' => %w[UserMailer confirm_account deliver_now User] }] }
160
+
161
+ context 'when passed as a String' do
162
+ let(:passed_class) { wrapped_class.to_s }
163
+
164
+ it 'unwraps the class name and increments the metric' do
165
+ expect(middleware)
166
+ .to receive(:increment)
167
+ .with("sidekiq.#{queue}.user_mailer_confirm_account.processed")
168
+
169
+ subject
170
+ end
171
+ end
172
+
173
+ context 'when passed as a Class' do
174
+ let(:passed_class) { wrapped_class }
175
+
176
+ it 'unwraps the class name and increments the metric' do
177
+ expect(middleware)
178
+ .to receive(:increment)
179
+ .with("sidekiq.#{queue}.user_mailer_confirm_account.processed")
180
+
181
+ subject
182
+ end
183
+ end
184
+ end
185
+
186
+ context "when sidekiq's wrapped class is not a mail delivery job" do
187
+ let(:wrapped_class) { stub_const('Jobs::Job', Class.new) }
188
+
189
+ context 'when passed as a String' do
190
+ let(:passed_class) { wrapped_class.to_s }
191
+
192
+ it 'unwraps the class name and increments the metric' do
193
+ expect(middleware)
194
+ .to receive(:increment)
195
+ .with("sidekiq.#{queue}.jobs_job.processed")
196
+
197
+ subject
198
+ end
199
+ end
200
+
201
+ context 'when passed as a Class' do
202
+ let(:passed_class) { wrapped_class }
203
+
204
+ it 'unwraps the class name and increments the metric' do
205
+ expect(middleware)
206
+ .to receive(:increment)
207
+ .with("sidekiq.#{queue}.jobs_job.processed")
208
+
209
+ subject
210
+ end
211
+ end
212
+ end
213
+ end
138
214
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sidekiq-instrumental
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.1
4
+ version: 0.3.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Edward Rudd
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-03-13 00:00:00.000000000 Z
11
+ date: 2022-05-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: instrumental_agent
@@ -30,42 +30,34 @@ dependencies:
30
30
  requirements:
31
31
  - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: '3.5'
33
+ version: '4.0'
34
+ - - "<"
35
+ - !ruby/object:Gem::Version
36
+ version: '6.0'
34
37
  type: :runtime
35
38
  prerelease: false
36
39
  version_requirements: !ruby/object:Gem::Requirement
37
40
  requirements:
38
41
  - - ">="
39
42
  - !ruby/object:Gem::Version
40
- version: '3.5'
41
- - !ruby/object:Gem::Dependency
42
- name: activesupport
43
- requirement: !ruby/object:Gem::Requirement
44
- requirements:
45
- - - "~>"
43
+ version: '4.0'
44
+ - - "<"
46
45
  - !ruby/object:Gem::Version
47
- version: '5.0'
48
- type: :development
49
- prerelease: false
50
- version_requirements: !ruby/object:Gem::Requirement
51
- requirements:
52
- - - "~>"
53
- - !ruby/object:Gem::Version
54
- version: '5.0'
46
+ version: '6.0'
55
47
  - !ruby/object:Gem::Dependency
56
48
  name: bundler
57
49
  requirement: !ruby/object:Gem::Requirement
58
50
  requirements:
59
- - - "~>"
51
+ - - ">="
60
52
  - !ruby/object:Gem::Version
61
- version: '1.9'
53
+ version: '0'
62
54
  type: :development
63
55
  prerelease: false
64
56
  version_requirements: !ruby/object:Gem::Requirement
65
57
  requirements:
66
- - - "~>"
58
+ - - ">="
67
59
  - !ruby/object:Gem::Version
68
- version: '1.9'
60
+ version: '0'
69
61
  - !ruby/object:Gem::Dependency
70
62
  name: rake
71
63
  requirement: !ruby/object:Gem::Requirement
@@ -150,14 +142,15 @@ dependencies:
150
142
  - - "~>"
151
143
  - !ruby/object:Gem::Version
152
144
  version: 1.37.1
153
- description:
145
+ description:
154
146
  email:
155
147
  - urkle@outoforder.cc
156
148
  executables: []
157
149
  extensions: []
158
150
  extra_rdoc_files: []
159
151
  files:
160
- - ".circleci/config.yml"
152
+ - ".github/PULL_REQUEST_TEMPLATE.md"
153
+ - ".github/workflows/prs.yml"
161
154
  - ".gitignore"
162
155
  - ".rspec"
163
156
  - ".rubocop.yml"
@@ -171,6 +164,9 @@ files:
171
164
  - bin/setup
172
165
  - bin/setup-rubygems.sh
173
166
  - bin/tag_check.sh
167
+ - gemfiles/Gemfile.base
168
+ - gemfiles/Gemfile.sidekiq4
169
+ - gemfiles/Gemfile.sidekiq5
174
170
  - lib/sidekiq/instrumental.rb
175
171
  - lib/sidekiq/instrumental/configuration.rb
176
172
  - lib/sidekiq/instrumental/middleware/base.rb
@@ -187,7 +183,7 @@ homepage: https://github.com/NetsoftHoldings/sidekiq-instrumental/
187
183
  licenses:
188
184
  - MIT
189
185
  metadata: {}
190
- post_install_message:
186
+ post_install_message:
191
187
  rdoc_options: []
192
188
  require_paths:
193
189
  - lib
@@ -202,8 +198,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
202
198
  - !ruby/object:Gem::Version
203
199
  version: '0'
204
200
  requirements: []
205
- rubygems_version: 3.0.6
206
- signing_key:
201
+ rubygems_version: 3.1.6
202
+ signing_key:
207
203
  specification_version: 4
208
204
  summary: Send Sidekiq status into Instrumental after every job
209
205
  test_files:
data/.circleci/config.yml DELETED
@@ -1,135 +0,0 @@
1
- version: 2
2
-
3
- defaults: &defaults
4
- docker: &ruby_image
5
- - &ruby_image
6
- image: circleci/ruby:2.5-stretch
7
- environment:
8
- RUBYOPT: '-KU -E utf-8:utf-8'
9
- BUNDLE_PATH: vendor/bundle
10
- BUNDLE_VERSION: 1.17.3
11
- BUNDLE_JOBS: 4
12
- BUNDLE_RETRY: 3
13
-
14
- filters:
15
- test: &filter_test
16
- filters:
17
- tags:
18
- ignore: /^v.*/
19
- beta: &filter_beta
20
- filters:
21
- branches:
22
- ignore: /.*/
23
- tags:
24
- only: /^v[0-9]+(\.[0-9]+)+(\.[a-z].+).*/
25
- release: &filter_release
26
- filters:
27
- branches:
28
- ignore: /.*/
29
- tags:
30
- only: /^v[0-9]+(\.[0-9]+)+/
31
-
32
- workflows:
33
- version: 2
34
- build_test:
35
- jobs:
36
- - "Checkout":
37
- <<: *filter_test
38
- context: org-global
39
- - "Test":
40
- <<: *filter_test
41
- context: org-global
42
- requires:
43
- - "Checkout"
44
- build_test_beta:
45
- jobs:
46
- - "Checkout":
47
- <<: *filter_beta
48
- context: org-global
49
- - "Test":
50
- <<: *filter_beta
51
- context: org-global
52
- requires:
53
- - "Checkout"
54
- - "Publish":
55
- <<: *filter_beta
56
- context: org-global
57
- requires:
58
- - "Test"
59
- build_test_release:
60
- jobs:
61
- - "Checkout":
62
- <<: *filter_release
63
- context: org-global
64
- - "Test":
65
- <<: *filter_release
66
- context: org-global
67
- requires:
68
- - "Checkout"
69
- - "Publish":
70
- <<: *filter_release
71
- context: org-global
72
- requires:
73
- - "Test"
74
-
75
- jobs:
76
- "Checkout":
77
- <<: *defaults
78
- steps:
79
- - attach_workspace:
80
- at: .
81
- - checkout
82
-
83
- - restore_cache:
84
- keys:
85
- - sidekiq-instrumental-bundle-v2-{{ checksum "Gemfile" }}-{{ checksum "sidekiq-instrumental.gemspec" }}
86
- - run:
87
- name: Install bundler
88
- command: gem install bundler --version=$BUNDLE_VERSION
89
- - run:
90
- name: Bundle Install
91
- command: |-
92
- bundle _${BUNDLE_VERSION}_ check || bundle _${BUNDLE_VERSION}_ install --retry=$BUNDLE_RETRY
93
- - save_cache:
94
- key: sidekiq-instrumental-bundle-v2-{{ checksum "Gemfile" }}-{{ checksum "sidekiq-instrumental.gemspec" }}
95
- paths:
96
- - vendor/bundle
97
- - Gemfile.lock
98
-
99
- - persist_to_workspace:
100
- root: .
101
- paths: .
102
- "Test":
103
- <<: *defaults
104
- steps:
105
- - attach_workspace:
106
- at: .
107
- - run:
108
- name: Install bundler
109
- command: gem install bundler --version=$BUNDLE_VERSION
110
- - run:
111
- name: RSpec
112
- command: bundle exec rspec
113
- - run:
114
- name: Rubocop
115
- command: bundle exec rubocop
116
- - run:
117
- name: Build gem
118
- command: |-
119
- gem build *.gemspec
120
- "Publish":
121
- <<: *defaults
122
- steps:
123
- - attach_workspace:
124
- at: .
125
- - run:
126
- name: Install bundler
127
- command: gem install bundler --version=$BUNDLE_VERSION
128
- - run:
129
- name: Deploy to gem server
130
- command: |-
131
- ./bin/tag_check.sh
132
- ./bin/setup-rubygems.sh
133
- rm -rf pkg
134
- rake build
135
- gem push pkg/*.gem