zuora_connect 3.0.0l → 3.0.0.pre.a

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
2
  SHA256:
3
- metadata.gz: b9a8f69b209e1762d0c1972e864b17330becc946114bd8c78313bf5221e7f4fc
4
- data.tar.gz: ff25b1fe4224b67bd2e8c387406a04237b9828e3e21adf3ed75ab282694f061d
3
+ metadata.gz: e63c10c8405375ad7cb2c28073c6181ed055266fb8d61e3ac5725e8f5b8ca8d5
4
+ data.tar.gz: c5124fe3590fd14c0acdad0cfe6e567997195eaa728245f620bfff5bbda285fe
5
5
  SHA512:
6
- metadata.gz: 13fb0d5ad358b91fa77a23fe72091482df39bf2dbd5acc846419666550d7f1d1078cf1e150444237c3554eebb1c8d6484beec541562ce1e5180507a1cbd8a6da
7
- data.tar.gz: 99007a267042763f665a2d195e160682a346d96388f081c548f26c6730a7c0ef6adc9633e9576f230ac4665e91e073289de110a212e9f41f66e964704e55e6f1
6
+ metadata.gz: 1beb3e3c0531b3035051711670de269814122c20269086ffd31257b02dc4e6ff8c515ac812abc436360ebc9f1506e3ae8e15e859d6098913e08f2dfed67e1284
7
+ data.tar.gz: bff9fca90e302be4fe97b3cac4ac54bb8dc6c841ad6762939f9b0b2c6c7e66417bb108105d6d8372965ae9090d813c97cff8a4a4a6b513665beed63c9229f0e4
data/Rakefile CHANGED
@@ -15,7 +15,7 @@ RDoc::Task.new(:rdoc) do |rdoc|
15
15
  rdoc.rdoc_files.include('lib/**/*.rb')
16
16
  end
17
17
 
18
- APP_RAKEFILE = File.expand_path("../spec/dummy/Rakefile", __FILE__)
18
+ APP_RAKEFILE = File.expand_path("../test/dummy/Rakefile", __FILE__)
19
19
  load 'rails/tasks/engine.rake'
20
20
 
21
21
 
@@ -152,8 +152,7 @@ module ZuoraConnect
152
152
  if ZuoraConnect.configuration.mode != "Production"
153
153
  mock_task_data = {
154
154
  "id" => ZuoraConnect.configuration.dev_mode_appinstance,
155
- "mode" => ZuoraConnect.configuration.dev_mode_mode,
156
- "name" => "Developer Instance"
155
+ "mode" => ZuoraConnect.configuration.dev_mode_mode
157
156
  }
158
157
 
159
158
  case ZuoraConnect.configuration.dev_mode_options.class
@@ -169,7 +168,6 @@ module ZuoraConnect
169
168
  end
170
169
 
171
170
  self.build_task(task_data: mock_task_data, session: session)
172
- self.set_backup_creds if !self['zuora_logins'].present?
173
171
  self.last_refresh = Time.now.to_i
174
172
  else
175
173
  time_expire = (session["#{self.id}::last_refresh"] || Time.now).to_i - INSTANCE_REFRESH_WINDOW.ago.to_i
@@ -291,7 +289,10 @@ module ZuoraConnect
291
289
  elsif type == :user
292
290
  begin
293
291
  sql = <<-eos
294
- SELECT zuora_users.zuora_identity_response FROM "#{self.id}".zuora_users ORDER BY zuora_users.updated_at DESC LIMIT 1;
292
+ SELECT zuora_users.zuora_identity_response
293
+ FROM "#{self.id}".zuora_users
294
+ ORDER BY zuora_users.updated_at DESC
295
+ LIMIT 1;
295
296
  eos
296
297
  user = ActiveRecord::Base.connection.execute(sql).to_a.first
297
298
 
@@ -351,7 +352,7 @@ module ZuoraConnect
351
352
  skip_connect ||= false
352
353
  begin
353
354
  #Check how app was deployed
354
- if !self.auto_deployed? && !skip_connect
355
+ if self.id < 25000000 && !skip_connect
355
356
  self.check_oauth_state
356
357
  response = HTTParty.get(ZuoraConnect.configuration.url + "/api/#{self.api_version}/tools/tasks/#{self.id}.json",:body => {:access_token => self.access_token})
357
358
 
@@ -362,9 +363,17 @@ module ZuoraConnect
362
363
  raise ZuoraConnect::Exceptions::ConnectCommunicationError.new("JSON parse error", response.body, response.code)
363
364
  end
364
365
 
365
- self.build_task(task_data: parsed_json, session: session)
366
- self.set_backup_creds
367
- self.save(validate: false) if self.changed?
366
+ self.build_task(task_data: parsed_json, session: session)
367
+ if self.kms_key.present? && self.kms_key.match(/^arn:aws:.*/)
368
+ begin
369
+ self.zuora_logins = self.strip_cache_data(object: parsed_json.dup, keys: ['applications', 'tokens', 'user_settings'])
370
+ self.save(:validate => false)
371
+ rescue Aws::KMS::Errors::ValidationException, *AWS_AUTH_ERRORS => ex
372
+ Rails.logger.warn(AWS_AUTH_ERRORS_MSG, ex)
373
+ rescue => ex
374
+ Rails.logger.error(AWS_AUTH_ERRORS_MSG, ex)
375
+ end
376
+ end
368
377
  else
369
378
  raise ZuoraConnect::Exceptions::ConnectCommunicationError.new("Error Communicating with Connect", response.body, response.code)
370
379
  end
@@ -409,16 +418,8 @@ module ZuoraConnect
409
418
  end
410
419
 
411
420
  #### START KMS ENCRYPTION Methods ####
412
- def set_backup_creds
413
- if self.kms_key.present? && self.kms_key.match(/^arn:aws:.*/) && self.task_data.present?
414
- self.zuora_logins = self.strip_cache_data(object: self.task_data.dup, keys: ['applications', 'tokens', 'user_settings'])
415
- end
416
- end
417
-
418
421
  def zuora_logins=(val)
419
422
  write_attribute(:zuora_logins, kms_encrypt(val.to_json))
420
- rescue Aws::KMS::Errors::ValidationException, Aws::KMS::Errors::NotFoundException, *AWS_AUTH_ERRORS => ex
421
- Rails.logger.warn(AWS_AUTH_ERRORS_MSG, ex)
422
423
  end
423
424
 
424
425
  def zuora_logins
@@ -581,7 +582,7 @@ module ZuoraConnect
581
582
  parsed_json = JSON.parse(response.body)
582
583
 
583
584
  #Set Org
584
- if self.auto_deployed? && parsed_json['organization'].present?
585
+ if self.id >= 25000000 && parsed_json['organization'].present?
585
586
  login_cache = self.zuora_logins
586
587
  login_cache.delete('organization')
587
588
  self.zuora_logins = login_cache.merge({'organizations' => [parsed_json['organization']]})
@@ -1029,7 +1030,7 @@ module ZuoraConnect
1029
1030
  catalog_container = catalog_container[object_id]
1030
1031
  end
1031
1032
 
1032
- return catalog_container || {}
1033
+ return catalog_container
1033
1034
  end
1034
1035
 
1035
1036
  if defined?(Redis.current) && object_id.present? && object_id.class == String && object_id.present?
@@ -26,7 +26,7 @@ module ActiveRecord
26
26
  if oids
27
27
  query += "WHERE t.oid::integer IN (%s)" % oids.join(", ")
28
28
  else
29
- query += initializer.query_conditions_for_initial_load
29
+ query += initializer.query_conditions_for_initial_load(type_map)
30
30
  end
31
31
 
32
32
  execute_and_clear(query, "SCHEMA", []) do |records|
@@ -34,3 +34,15 @@ Resque.module_eval do
34
34
  Hash[queue_names.zip(sizes)]
35
35
  end
36
36
  end
37
+
38
+ if defined?(Resque.logger)
39
+ Resque.logger = ZuoraObservability::Logger.custom_logger(name: "Resque", type: 'Monologger', level: MonoLogger::INFO)
40
+ Resque::Scheduler.logger = ZuoraObservability::Logger.custom_logger(name: "ResqueScheduler") if defined?(Resque::Scheduler)
41
+ end
42
+ if defined?(Delayed::Worker.logger)
43
+ Delayed::Worker.logger = ZuoraObservability::Logger.custom_logger(name: "DelayedJob", type: 'Monologger', level: MonoLogger::INFO)
44
+ end
45
+
46
+ Makara::Logging::Logger.logger = ZuoraObservability::Logger.custom_logger(name: "Makara") if defined?(Makara)
47
+ ElasticAPM.agent.config.logger = ZuoraObservability::Logger.custom_logger(name: "ElasticAPM", level: MonoLogger::WARN) if defined?(ElasticAPM) && ElasticAPM.running?
48
+ ActionMailer::Base.logger = ZuoraObservability::Logger.custom_logger(name: "ActionMailer", type: 'Monologger') if defined?(ActionMailer)
@@ -1,6 +1,37 @@
1
1
  module ZuoraConnect
2
2
  require 'uri'
3
3
 
4
+ # Object of this class is passed to the ActiveSupport::Notification hook
5
+ class PageRequest
6
+
7
+ # This method is triggered when a non error page is loaded (not 404)
8
+ def call(name, started, finished, unique_id, payload)
9
+ # If the url contains any css or JavaScript files then do not collect metrics for them
10
+ return nil if ["css", "assets", "jpg", "png", "jpeg", "ico"].any? { |word| payload[:path].include?(word) }
11
+
12
+ # Getting the endpoint and the content_type
13
+ content_hash = {:html => "text/html", :js => "application/javascript", :json => "application/json", :csv => "text/csv"}
14
+ content_type = content_hash.key?(payload[:format]) ? content_hash[payload[:format]] : payload[:format]
15
+ content_type = content_type.to_s.gsub('text/javascript', 'application/javascript')
16
+
17
+ # payloads with 500 requests do not have status as it is not set by the controller
18
+ # https://github.com/rails/rails/issues/33335
19
+ #status_code = payload[:status] ? payload[:status] : payload[:exception_object].present? ? 500 : ""
20
+ if payload[:exception].present?
21
+ status_code, exception = [500, payload[:exception].first]
22
+ else
23
+ status_code, exception = [payload[:status], nil]
24
+ end
25
+
26
+ tags = {method: payload[:method], status: status_code, error_type: exception, content_type: content_type, controller: payload[:controller], action: payload[:action]}.compact
27
+
28
+ values = {view_time: payload[:view_runtime], db_time: payload[:db_runtime], response_time: ((finished-started)*1000)}.compact
29
+ values = values.map{ |k,v| [k,v.round(2)]}.to_h
30
+
31
+ ZuoraObservability::Metrics.write_to_telegraf(direction: :inbound, tags: tags, values: values)
32
+ end
33
+ end
34
+
4
35
  class MetricsMiddleware
5
36
 
6
37
  require "zuora_connect/version"
@@ -34,11 +65,8 @@ module ZuoraConnect
34
65
  @bad_headers.each { |header| env.delete(header) }
35
66
 
36
67
  if defined?(Prometheus) && env['PATH_INFO'] == '/connect/internal/metrics'
37
-
38
68
  # Prometheus Stuff
39
- metrics = ZuoraObservability::Metrics.resque
40
- metrics = defined?(ZuoraConnect::AppInstance.get_metrics) ? ZuoraConnect::AppInstance.get_metrics(metrics) : metrics
41
-
69
+ metrics = ZuoraObservability::Metrics.resque
42
70
  redis_up = metrics.present? && metrics.dig(:Resque, :Workers_Total).present? ? 1 : 0
43
71
  Prometheus::REDIS_CONNECTION.set(redis_up)
44
72
 
@@ -58,6 +86,13 @@ module ZuoraConnect
58
86
  @status, @headers, @response = @app.call(env)
59
87
  ensure
60
88
 
89
+ # If the url contains any CSS or JavaScript files then do not collect metrics for them
90
+ if ["css", "assets", "jpg", "png", "jpeg", "ico"].any? { |word| env['PATH_INFO'].include?(word) } || /.*\.js$/.match(env['PATH_INFO'])
91
+ tags = {status: @status, controller: 'ActionController', action: 'Assets', app_instance: 0}
92
+ values = {response_time: ((Time.now - start_time)*1000).round(2) }
93
+ ZuoraObservability::Metrics.write_to_telegraf(direction: 'request-inbound-assets', tags: tags, values: values)
94
+ end
95
+
61
96
  # Uncomment following block of code for handling engine requests/requests without controller
62
97
  # else
63
98
  # # Handling requests which do not have controllers (engines)
@@ -12,14 +12,14 @@ module Resque
12
12
  when "Hash"
13
13
  data = args.merge({:worker_class => self.to_s})
14
14
  end
15
- if Rails.logger.is_a?(Ougai::Logger) && !Rails.env.development?
15
+ if Rails.logger.is_a?(Ougai::Logger)
16
16
  Rails.logger.with_fields = {job: data, trace_id: SecureRandom.uuid, name: "RailsWorker"}
17
17
  end
18
18
 
19
19
  begin
20
- connection_count ||= 0
20
+ connection_count ||= 0
21
21
  @appinstance = ZuoraConnect::AppInstance.find(args['app_instance_id'].to_i)
22
- job_start_log(args)
22
+ Rails.logger.info('Starting job')
23
23
 
24
24
  @appinstance.new_session(holding_pattern: true)
25
25
  rescue ActiveRecord::RecordNotFound => exception
@@ -52,12 +52,12 @@ module Resque
52
52
  return
53
53
  rescue ZuoraConnect::Exceptions::ConnectCommunicationError => exception
54
54
  Rails.logger.warn("Enqueue Job Again ~ 2 mins", exception)
55
- @appinstance.queue_pause(time: 2.minutes.to_i)
55
+ @appinstance.queue_pause(time: 2.minutes.to_i)
56
56
  Resque.enqueue_to(self.job.queue, self.job.payload['class'], args)
57
57
  return
58
58
  rescue Net::ReadTimeout, Net::OpenTimeout, Errno::ECONNRESET, Errno::ECONNREFUSED, SocketError => exception
59
59
  Rails.logger.warn("Enqueue Job Again ~ 2 mins", exception)
60
- @appinstance.queue_pause(time: 2.minutes.to_i)
60
+ @appinstance.queue_pause(time: 2.minutes.to_i)
61
61
  Resque.enqueue_to(self.job.queue, self.job.payload['class'], args)
62
62
  return
63
63
  end
@@ -68,10 +68,6 @@ module Resque
68
68
  @appinstance.cache_app_instance if defined?(@appinstance)
69
69
  Rails.logger.flush if Rails.logger.methods.include?(:flush)
70
70
  end
71
-
72
- def job_start_log(args)
73
- Rails.logger.info("Starting job")
74
- end
75
71
  end
76
72
  end
77
- end
73
+ end
@@ -17,7 +17,7 @@ module Resque
17
17
  when "Hash"
18
18
  data = args.merge({:worker_class => self.to_s})
19
19
  end
20
- if Rails.logger.is_a?(Ougai::Logger) && !Rails.env.development?
20
+ if Rails.logger.is_a?(Ougai::Logger)
21
21
  Rails.logger.with_fields = {job: data, trace_id: SecureRandom.uuid, name: "RailsWorker"}
22
22
  end
23
23
  data = {:msg => 'Starting job', :job => data}
@@ -280,7 +280,6 @@ module ZuoraConnect
280
280
  next_instance_id,
281
281
  zuora_entity_id,
282
282
  rest_domain,
283
- tenant_id: request.headers['zuora-tenant-id'],
284
283
  retry_count: retry_count
285
284
  )
286
285
  rescue ActiveRecord::RecordNotUnique
@@ -303,8 +302,7 @@ module ZuoraConnect
303
302
  private
304
303
  def setup_instance_via_prod_mode
305
304
  zuora_entity_id = request.headers['ZuoraCurrentEntity'] || cookies['ZuoraCurrentEntity']
306
- ZuoraConnect::ZuoraUser.current_user_id = nil
307
-
305
+
308
306
  if zuora_entity_id.present?
309
307
  zuora_tenant_id = cookies['Zuora-Tenant-Id']
310
308
  zuora_user_id = cookies['Zuora-User-Id']
@@ -638,7 +636,7 @@ module ZuoraConnect
638
636
  (ZuoraConnect::AppInstance.all.where("id > #{min_instance_id}").order(id: :desc).limit(1).pluck(:id).first || min_instance_id) + 1
639
637
  end
640
638
 
641
- def new_instance(id, zuora_entity_id, rest_domain, tenant_id: nil, task_data: nil, retry_count: 0)
639
+ def new_instance(id, zuora_entity_id, rest_domain, task_data: nil, retry_count: 0)
642
640
  app_instance = ZuoraConnect::AppInstance.new(
643
641
  :id => id,
644
642
  :api_token => generate_token,
@@ -648,8 +646,6 @@ module ZuoraConnect
648
646
  :zuora_entity_ids => [zuora_entity_id]
649
647
  )
650
648
 
651
- app_instance[:zuora_tenant_ids] = [tenant_id.to_s] if tenant_id.present?
652
-
653
649
  if task_data.nil?
654
650
  # no encryption
655
651
  app_instance['zuora_logins'] = task_data
@@ -681,30 +677,27 @@ module ZuoraConnect
681
677
 
682
678
  def setup_instance_via_dev_mode
683
679
  session["appInstance"] = ZuoraConnect.configuration.dev_mode_appinstance
684
- session["#{ZuoraConnect.configuration.dev_mode_appinstance}::admin"] = ZuoraConnect.configuration.dev_mode_admin
685
-
686
- values = {
687
- id: ZuoraConnect.configuration.dev_mode_appinstance,
688
- access_token: ZuoraConnect.configuration.dev_mode_user,
689
- refresh_token: ZuoraConnect.configuration.dev_mode_pass,
690
- token: ZuoraConnect.configuration.dev_mode_pass+ZuoraConnect.configuration.dev_mode_pass,
691
- api_token: ZuoraConnect.configuration.dev_mode_pass+ZuoraConnect.configuration.dev_mode_pass
692
- }
693
-
694
- @appinstance = ZuoraConnect::AppInstance.find_by(:id => ZuoraConnect.configuration.dev_mode_appinstance.to_i)
680
+ user = ZuoraConnect.configuration.dev_mode_user
681
+ key = ZuoraConnect.configuration.dev_mode_pass
682
+ values = {:user => user , :key => key, :appinstance => session["appInstance"]}
683
+ @appinstance = ZuoraConnect::AppInstance.find_by(:id => values[:appinstance].to_i)
695
684
  ZuoraConnect::ZuoraUser.current_user_id = 0
696
685
  if @appinstance.blank?
697
686
  Apartment::Tenant.switch!("public")
698
687
  begin
699
- Apartment::Tenant.create(ZuoraConnect.configuration.dev_mode_appinstance.to_s)
688
+ Apartment::Tenant.create(values[:appinstance].to_s)
700
689
  rescue Apartment::TenantExists => ex
701
- Apartment::Tenant.drop(ZuoraConnect.configuration.dev_mode_appinstance.to_s)
690
+ Apartment::Tenant.drop(values[:appinstance].to_s)
702
691
  retry
703
692
  end
704
- @appinstance = ZuoraConnect::AppInstance.new()
693
+
694
+ @appinstance = ZuoraConnect::AppInstance.new(:id => values[:appinstance].to_i, :access_token => values[:user], :refresh_token => values[:key], :token => "#{values[:key]}#{values[:key]}", :api_token => "#{values[:key]}#{values[:key]}")
695
+ @appinstance.save(:validate => false)
696
+ end
697
+ if @appinstance.access_token.blank? || @appinstance.refresh_token.blank? || @appinstance.token.blank? || @appinstance.api_token.blank?
698
+ @appinstance.update_attributes!(:access_token => values["user"], :refresh_token => values["key"], :token => "#{values[:key]}#{values[:key]}", :api_token => "#{values[:key]}#{values[:key]}")
705
699
  end
706
- @appinstance.assign_attributes(values)
707
- @appinstance.save(:validate => false)
700
+ session["#{@appinstance.id}::admin"] = ZuoraConnect.configuration.dev_mode_admin
708
701
  end
709
702
  end
710
703
  end
@@ -5,6 +5,17 @@ require 'middleware/bad_multipart_form_data_sanitizer'
5
5
 
6
6
  module ZuoraConnect
7
7
  class Railtie < Rails::Railtie
8
+ REQUEST_HEADERS_TO_IGNORE = %W(
9
+ RAW_POST_DATA
10
+ REQUEST_METHOD
11
+ REQUEST_URI
12
+ REQUEST_PATH
13
+ PATH_INFO
14
+ CONTENT_TYPE
15
+ ORIGINAL_FULLPATH
16
+ QUERY_STRING
17
+ )
18
+
8
19
  config.before_initialize do
9
20
  version = Rails.version
10
21
  if version >= "5.0.0"
@@ -32,5 +43,8 @@ module ZuoraConnect
32
43
  app.config.middleware.use Rack::Deflater, if: ->(env, *) { env['PATH_INFO'] == '/connect/internal/metrics' }
33
44
  end
34
45
  end
46
+
47
+ # hook to process_action
48
+ ActiveSupport::Notifications.subscribe('process_action.action_controller', ZuoraConnect::PageRequest.new)
35
49
  end
36
50
  end
@@ -1,3 +1,3 @@
1
1
  module ZuoraConnect
2
- VERSION = "3.0.0l"
2
+ VERSION = "3.0.0-a"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: zuora_connect
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.0.0l
4
+ version: 3.0.0.pre.a
5
5
  platform: ruby
6
6
  authors:
7
7
  - Connect Team
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-12-11 00:00:00.000000000 Z
11
+ date: 2020-11-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: apartment
@@ -56,40 +56,40 @@ dependencies:
56
56
  name: zuora_api
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - "~>"
59
+ - - ">="
60
60
  - !ruby/object:Gem::Version
61
61
  version: 1.7.00
62
- - - ">="
62
+ - - "~>"
63
63
  - !ruby/object:Gem::Version
64
64
  version: 1.7.00
65
65
  type: :runtime
66
66
  prerelease: false
67
67
  version_requirements: !ruby/object:Gem::Requirement
68
68
  requirements:
69
- - - "~>"
69
+ - - ">="
70
70
  - !ruby/object:Gem::Version
71
71
  version: 1.7.00
72
- - - ">="
72
+ - - "~>"
73
73
  - !ruby/object:Gem::Version
74
74
  version: 1.7.00
75
75
  - !ruby/object:Gem::Dependency
76
76
  name: httparty
77
77
  requirement: !ruby/object:Gem::Requirement
78
78
  requirements:
79
- - - "~>"
79
+ - - ">="
80
80
  - !ruby/object:Gem::Version
81
81
  version: 0.16.4
82
- - - ">="
82
+ - - "~>"
83
83
  - !ruby/object:Gem::Version
84
84
  version: 0.16.4
85
85
  type: :runtime
86
86
  prerelease: false
87
87
  version_requirements: !ruby/object:Gem::Requirement
88
88
  requirements:
89
- - - "~>"
89
+ - - ">="
90
90
  - !ruby/object:Gem::Version
91
91
  version: 0.16.4
92
- - - ">="
92
+ - - "~>"
93
93
  - !ruby/object:Gem::Version
94
94
  version: 0.16.4
95
95
  - !ruby/object:Gem::Dependency
@@ -186,16 +186,16 @@ dependencies:
186
186
  name: zuora_observability
187
187
  requirement: !ruby/object:Gem::Requirement
188
188
  requirements:
189
- - - '='
189
+ - - ">="
190
190
  - !ruby/object:Gem::Version
191
- version: 0.1.0.pre.b
191
+ version: '0'
192
192
  type: :runtime
193
193
  prerelease: false
194
194
  version_requirements: !ruby/object:Gem::Requirement
195
195
  requirements:
196
- - - '='
196
+ - - ">="
197
197
  - !ruby/object:Gem::Version
198
- version: 0.1.0.pre.b
198
+ version: '0'
199
199
  - !ruby/object:Gem::Dependency
200
200
  name: rspec
201
201
  requirement: !ruby/object:Gem::Requirement
@@ -210,20 +210,6 @@ dependencies:
210
210
  - - "~>"
211
211
  - !ruby/object:Gem::Version
212
212
  version: '3.0'
213
- - !ruby/object:Gem::Dependency
214
- name: rspec_junit_formatter
215
- requirement: !ruby/object:Gem::Requirement
216
- requirements:
217
- - - ">="
218
- - !ruby/object:Gem::Version
219
- version: '0'
220
- type: :development
221
- prerelease: false
222
- version_requirements: !ruby/object:Gem::Requirement
223
- requirements:
224
- - - ">="
225
- - !ruby/object:Gem::Version
226
- version: '0'
227
213
  - !ruby/object:Gem::Dependency
228
214
  name: rspec-rails
229
215
  requirement: !ruby/object:Gem::Requirement
@@ -252,34 +238,6 @@ dependencies:
252
238
  - - ">="
253
239
  - !ruby/object:Gem::Version
254
240
  version: '0'
255
- - !ruby/object:Gem::Dependency
256
- name: simplecov
257
- requirement: !ruby/object:Gem::Requirement
258
- requirements:
259
- - - ">="
260
- - !ruby/object:Gem::Version
261
- version: '0'
262
- type: :development
263
- prerelease: false
264
- version_requirements: !ruby/object:Gem::Requirement
265
- requirements:
266
- - - ">="
267
- - !ruby/object:Gem::Version
268
- version: '0'
269
- - !ruby/object:Gem::Dependency
270
- name: simplecov-cobertura
271
- requirement: !ruby/object:Gem::Requirement
272
- requirements:
273
- - - ">="
274
- - !ruby/object:Gem::Version
275
- version: '0'
276
- type: :development
277
- prerelease: false
278
- version_requirements: !ruby/object:Gem::Requirement
279
- requirements:
280
- - - ">="
281
- - !ruby/object:Gem::Version
282
- version: '0'
283
241
  - !ruby/object:Gem::Dependency
284
242
  name: factory_bot
285
243
  requirement: !ruby/object:Gem::Requirement
@@ -487,7 +445,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
487
445
  - !ruby/object:Gem::Version
488
446
  version: 1.3.1
489
447
  requirements: []
490
- rubygems_version: 3.1.4
448
+ rubygems_version: 3.0.3
491
449
  signing_key:
492
450
  specification_version: 4
493
451
  summary: Summary of Connect.