coverband 4.2.2 → 4.2.3.rc.1

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: 33ec68822b5c228e86048d62ded36cfeba06adf77022d07b39cdcb897c215f6f
4
- data.tar.gz: 7494e163926def8f8406da850efe02f5cd79f6ba6377abaf14ccb09aedc6ca85
3
+ metadata.gz: f9f8a71fc670b19d665c9234dec871025649f29f958a5cc853992a2d3e05d95a
4
+ data.tar.gz: 210bd1569609d05d4d480152d64ae00cfcc3a233473f13d61192207b584d8314
5
5
  SHA512:
6
- metadata.gz: fda6dd49e21244819834f20e857ba2f4c8fddec4b1096a2b7ecfad7acdf6352cb2d4a8783f1cb5efc1ea2dc1ef5d03e7712f709fb928e29461dd41fc2dff76d8
7
- data.tar.gz: b318161bc9c3709d41a35bb8a4e108a5ab38bea2feb095b1fc8d900f6e8a9bcfcc37dbf90392408d2efa3d510a58ceff5c69d19a422e4923049c08ee69d20c9c
6
+ metadata.gz: 49e039fe18d8c049524b807af2e0005d7857cc550b65c61f1814ea2fdd64b304c2d5eeb7b6b653622054b338985bec217b245b87bbf6b8139d590609f977a980
7
+ data.tar.gz: 4985b01cb295f64dbee3543fc721e445d9066d956a71966672185eabc6ae87549ce893993dfef3dc142775836aef2b0102f10eb234fa564a0067049376a6b331
data/Rakefile CHANGED
@@ -30,7 +30,7 @@ end
30
30
  desc 'load irb with this gem'
31
31
  task :console do
32
32
  puts 'running console'
33
- exec 'bundle exec console'
33
+ exec 'bundle console'
34
34
  end
35
35
 
36
36
  # This is really just for testing and development because without configuration
@@ -104,7 +104,8 @@ module Coverband
104
104
 
105
105
  data = coverage_data_from_redis(data_from_redis)
106
106
  hash[file] = data_from_redis.select { |meta_data_key, _value| META_DATA_KEYS.include?(meta_data_key) }.merge!('data' => data)
107
- hash[file].merge!(LAST_UPDATED_KEY => hash[file][LAST_UPDATED_KEY].to_i, FIRST_UPDATED_KEY => hash[file][FIRST_UPDATED_KEY].to_i)
107
+ hash[file][LAST_UPDATED_KEY] = hash[file][LAST_UPDATED_KEY].blank? ? nil : hash[file][LAST_UPDATED_KEY].to_i
108
+ hash[file].merge!(LAST_UPDATED_KEY => hash[file][LAST_UPDATED_KEY], FIRST_UPDATED_KEY => hash[file][FIRST_UPDATED_KEY].to_i)
108
109
  end
109
110
 
110
111
  def coverage_data_from_redis(data_from_redis)
@@ -7,7 +7,8 @@ module Coverband
7
7
  ###
8
8
  # This class tracks view file usage via ActiveSupport::Notifications
9
9
  #
10
- # This is a port of Flatfoot, a project I open sourced years ago, but am now rolling into Coverband
10
+ # This is a port of Flatfoot, a project I open sourced years ago,
11
+ # but am now rolling into Coverband
11
12
  # https://github.com/livingsocial/flatfoot
12
13
  #
13
14
  # TODO: test and ensure slim, haml, and other support
@@ -31,6 +32,7 @@ module Coverband
31
32
 
32
33
  @logged_views = []
33
34
  @views_to_record = []
35
+ redis_store.set(tracker_time_key, Time.now.to_i) unless redis_store.exists(tracker_time_key)
34
36
  end
35
37
 
36
38
  ###
@@ -59,26 +61,43 @@ module Coverband
59
61
  end
60
62
 
61
63
  def used_views
62
- views = redis_store.smembers(tracker_key)
63
- normalized_views = []
64
- views.each do |view|
64
+ views = redis_store.hgetall(tracker_key)
65
+ normalized_views = {}
66
+ views.each_pair do |view, time|
65
67
  roots.each do |root|
66
68
  view = view.gsub(/#{root}/, '')
67
69
  end
68
- normalized_views << view
70
+ normalized_views[view] = time
69
71
  end
70
72
  normalized_views
71
73
  end
72
74
 
73
75
  def unused_views
74
- recently_used_views = used_views
76
+ recently_used_views = used_views.keys
75
77
  all_views = target.reject { |view| recently_used_views.include?(view) }
76
78
  # since layouts don't include format we count them used if they match with ANY formats
77
79
  all_views.reject { |view| view.match(/\/layouts\//) && recently_used_views.any? { |used_view| view.include?(used_view) } }
78
80
  end
79
81
 
82
+ def tracking_since
83
+ if (tracking_time = redis_store.get(tracker_time_key))
84
+ Time.at(tracking_time.to_i).iso8601
85
+ else
86
+ 'N/A'
87
+ end
88
+ end
89
+
80
90
  def reset_recordings
81
91
  redis_store.del(tracker_key)
92
+ redis_store.del(tracker_time_key)
93
+ end
94
+
95
+ def clear_file!(filename)
96
+ return unless filename
97
+
98
+ filename = "#{@project_directory}/#{filename}"
99
+ redis_store.hdel(tracker_key, filename)
100
+ logged_views.delete(filename)
82
101
  end
83
102
 
84
103
  def self.supported_version?
@@ -86,8 +105,9 @@ module Coverband
86
105
  end
87
106
 
88
107
  def report_views_tracked
108
+ reported_time = Time.now.to_i
89
109
  views_to_record.each do |file|
90
- redis_store.sadd(tracker_key, file)
110
+ redis_store.hset(tracker_key, file, reported_time)
91
111
  end
92
112
  self.views_to_record = []
93
113
  rescue StandardError => e
@@ -117,7 +137,11 @@ module Coverband
117
137
  end
118
138
 
119
139
  def tracker_key
120
- 'render_tracker'
140
+ 'render_tracker_2'
141
+ end
142
+
143
+ def tracker_time_key
144
+ 'render_tracker_time'
121
145
  end
122
146
  end
123
147
  end
@@ -109,6 +109,11 @@ module Coverband
109
109
  def store=(store)
110
110
  raise 'Pass in an instance of Coverband::Adapters' unless store.is_a?(Coverband::Adapters::Base)
111
111
 
112
+ # Default to 5 minutes if using the hash redis store
113
+ # This is a safer default for the high server volumes that need the hash store
114
+ # it should avoid overloading the redis with lots of load
115
+ @background_reporting_sleep_seconds = 300 if store.is_a?(Coverband::Adapters::HashRedisStore)
116
+
112
117
  @store = store
113
118
  end
114
119
 
@@ -34,6 +34,10 @@ module Coverband
34
34
 
35
35
  if request.post?
36
36
  case request.path_info
37
+ when %r{\/clear_view_tracking_file}
38
+ clear_view_tracking_file
39
+ when %r{\/clear_view_tracking}
40
+ clear_view_tracking
37
41
  when %r{\/clear_file}
38
42
  clear_file
39
43
  when %r{\/clear}
@@ -76,7 +80,11 @@ module Coverband
76
80
  end
77
81
 
78
82
  def view_tracker
79
- Coverband::Utils::HTMLFormatter.new(nil, base_path: base_path).format_view_tracker!
83
+ notice = "<strong>Notice:</strong> #{Rack::Utils.escape_html(request.params['notice'])}<br/>"
84
+ notice = request.params['notice'] ? notice : ''
85
+ Coverband::Utils::HTMLFormatter.new(nil,
86
+ notice: notice,
87
+ base_path: base_path).format_view_tracker!
80
88
  end
81
89
 
82
90
  def debug_data
@@ -112,6 +120,29 @@ module Coverband
112
120
  [301, { 'Location' => "#{base_path}?notice=#{notice}" }, []]
113
121
  end
114
122
 
123
+ def clear_view_tracking
124
+ if Coverband.configuration.web_enable_clear
125
+ tracker = Coverband::Collectors::ViewTracker.new(store: Coverband.configuration.store)
126
+ tracker.reset_recordings
127
+ notice = 'view tracking reset'
128
+ else
129
+ notice = 'web_enable_clear isnt enabled in your configuration'
130
+ end
131
+ [301, { 'Location' => "#{base_path}/view_tracker?notice=#{notice}" }, []]
132
+ end
133
+
134
+ def clear_view_tracking_file
135
+ if Coverband.configuration.web_enable_clear
136
+ tracker = Coverband::Collectors::ViewTracker.new(store: Coverband.configuration.store)
137
+ filename = request.params['filename']
138
+ tracker.clear_file!(filename)
139
+ notice = "coverage for file #{filename} cleared"
140
+ else
141
+ notice = 'web_enable_clear isnt enabled in your configuration'
142
+ end
143
+ [301, { 'Location' => "#{base_path}/view_tracker?notice=#{notice}" }, []]
144
+ end
145
+
115
146
  private
116
147
 
117
148
  # This method should get the root mounted endpoint
@@ -55,11 +55,14 @@ module Coverband
55
55
  # the line-by-line coverage to zero (if relevant) or nil (comments / whitespace etc).
56
56
  def self.add_not_loaded_files(result, tracked_files)
57
57
  if tracked_files
58
+ # TODO: Can we get rid of this dup it wastes memory
58
59
  result = result.dup
59
60
  Dir[tracked_files].each do |file|
60
61
  absolute = File.expand_path(file)
61
-
62
- result[absolute] ||= Coverband::Utils::LinesClassifier.new.classify(File.foreach(absolute))
62
+ result[absolute] ||= {
63
+ 'data' => Array.new(File.foreach(absolute).count) { 0 },
64
+ 'never_loaded' => true
65
+ }
63
66
  end
64
67
  end
65
68
 
@@ -87,6 +87,8 @@ module Coverband
87
87
  attr_reader :first_updated_at
88
88
  # the date this version of the file last saw any coverage activity
89
89
  attr_reader :last_updated_at
90
+ # meta data that the file was never loaded during boot or runtime
91
+ attr_reader :never_loaded
90
92
  NOT_AVAILABLE = 'not available'
91
93
 
92
94
  def initialize(filename, file_data)
@@ -97,6 +99,7 @@ module Coverband
97
99
  @first_updated_at = @last_updated_at = NOT_AVAILABLE
98
100
  @first_updated_at = Time.at(file_data['first_updated_at']) if file_data['first_updated_at']
99
101
  @last_updated_at = Time.at(file_data['last_updated_at']) if file_data['last_updated_at']
102
+ @never_loaded = file_data['never_loaded'] || false
100
103
  else
101
104
  # TODO: Deprecate this code path this was backwards compatability from 3-4
102
105
  @coverage = file_data
@@ -5,5 +5,5 @@
5
5
  # use format '4.2.1.rc.1' ~> 4.2.1.rc to prerelease versions like v4.2.1.rc.2 and v4.2.1.rc.3
6
6
  ###
7
7
  module Coverband
8
- VERSION = '4.2.2'
8
+ VERSION = '4.2.3.rc.1'
9
9
  end
@@ -687,6 +687,10 @@ a.src_link {
687
687
  background: url("./magnify.png") no-repeat left 50%;
688
688
  padding-left: 18px; }
689
689
 
690
+ .red a.src_link {
691
+ color: #990000;
692
+ }
693
+
690
694
  tr, td {
691
695
  margin: 0;
692
696
  padding: 0; }
@@ -784,6 +788,10 @@ td {
784
788
  display: inline-block;
785
789
  }
786
790
 
791
+ .last_seen_at {
792
+ font-size: 8px;
793
+ }
794
+
787
795
  .notice {
788
796
  color: #856404;
789
797
  background-color: #fff3cd;
@@ -134,13 +134,17 @@ class HashRedisStoreTest < Minitest::Test
134
134
  @store.save_report(data)
135
135
  assert_equal 1, @store.coverage.length
136
136
  assert_equal [0, nil, 1, 2], @store.coverage['./dog.rb']['data']
137
+ # eager_loading doesn't set last_updated_at
138
+ assert_nil @store.coverage['./dog.rb']['last_updated_at']
137
139
  @store.type = Coverband::RUNTIME_TYPE
138
140
  data = {
139
141
  'app_path/cat.rb' => [1, 2, 0, 1, 5]
140
142
  }
143
+ current_time = Time.now.to_i
141
144
  @store.save_report(data)
142
145
  assert_equal 1, @store.coverage.length
143
146
  assert_equal [1, 2, 0, 1, 5], @store.coverage['./cat.rb']['data']
147
+ assert current_time <= @store.coverage['./cat.rb']['last_updated_at']
144
148
  end
145
149
 
146
150
  def test_coverage_type
@@ -33,8 +33,10 @@ unless ENV['COVERBAND_HASH_REDIS_STORE']
33
33
  @store.coverage.each_pair do |key, data|
34
34
  assert_equal expected[key], data['data']
35
35
  end
36
+ current_time = Time.now.to_i
36
37
  @store.save_report(basic_coverage.dup)
37
38
  assert_equal [0, 2, 4], @store.coverage['app_path/dog.rb']['data']
39
+ assert current_time <= @store.coverage['app_path/dog.rb']['last_updated_at']
38
40
  end
39
41
 
40
42
  def test_store_coverage_by_type
@@ -46,7 +48,6 @@ unless ENV['COVERBAND_HASH_REDIS_STORE']
46
48
  @store.coverage.each_pair do |key, data|
47
49
  assert_equal expected[key], data['data']
48
50
  end
49
-
50
51
  @store.type = Coverband::RUNTIME_TYPE
51
52
  assert_equal [], @store.coverage.keys
52
53
  end
@@ -56,9 +57,13 @@ unless ENV['COVERBAND_HASH_REDIS_STORE']
56
57
  assert_equal Coverband::RUNTIME_TYPE, @store.type
57
58
  @store.type = :eager_loading
58
59
  @store.save_report('app_path/dog.rb' => [0, 1, 1])
60
+ # eager_loading doesn't set last_updated_at
61
+ assert_nil @store.coverage['app_path/dog.rb']['last_updated_at']
59
62
  @store.type = Coverband::RUNTIME_TYPE
63
+ current_time = Time.now.to_i
60
64
  @store.save_report('app_path/dog.rb' => [1, 0, 1])
61
65
  assert_equal [1, 1, 2], @store.get_coverage_report[:merged]['app_path/dog.rb']['data']
66
+ assert current_time <= @store.coverage['app_path/dog.rb']['last_updated_at']
62
67
  assert_equal Coverband::RUNTIME_TYPE, @store.type
63
68
  end
64
69
 
@@ -2,16 +2,20 @@ require File.expand_path('../../test_helper', File.dirname(__FILE__))
2
2
 
3
3
  class ReporterTest < Minitest::Test
4
4
 
5
+ def tracker_key
6
+ 'render_tracker_2'
7
+ end
8
+
5
9
  def setup
6
10
  super
7
- fake_store.raw_store.del('render_tracker')
11
+ fake_store.raw_store.del(tracker_key)
8
12
  end
9
13
 
10
14
  test "init correctly" do
11
15
  Coverband::Collectors::ViewTracker.expects(:supported_version?).returns(true)
12
- tracker = Coverband::Collectors::ViewTracker.new(:store => "store", :roots => 'dir')
16
+ tracker = Coverband::Collectors::ViewTracker.new(:store => fake_store, :roots => 'dir')
13
17
  assert_equal 'dir', tracker.roots.first
14
- assert_equal 'store', tracker.store
18
+ assert tracker.store != nil
15
19
  assert_equal [], tracker.target
16
20
  assert_equal [], tracker.logged_views
17
21
  end
@@ -20,7 +24,7 @@ class ReporterTest < Minitest::Test
20
24
  Coverband::Collectors::ViewTracker.expects(:supported_version?).returns(true)
21
25
  store = fake_store
22
26
  file_path = "#{File.expand_path(Coverband.configuration.root)}/file"
23
- store.raw_store.expects(:sadd).with('render_tracker', file_path)
27
+ store.raw_store.expects(:hset).with(tracker_key, file_path, anything)
24
28
  tracker = Coverband::Collectors::ViewTracker.new(store: store, roots: 'dir')
25
29
  tracker.track_views('name', 'start', 'finish', 'id', {:identifier => file_path})
26
30
  tracker.report_views_tracked
@@ -31,7 +35,7 @@ class ReporterTest < Minitest::Test
31
35
  Coverband::Collectors::ViewTracker.expects(:supported_version?).returns(true)
32
36
  store = fake_store
33
37
  file_path = "#{File.expand_path(Coverband.configuration.root)}/layout"
34
- store.raw_store.expects(:sadd).with('render_tracker', file_path)
38
+ store.raw_store.expects(:hset).with(tracker_key, file_path, anything)
35
39
  tracker = Coverband::Collectors::ViewTracker.new(store: store, roots: 'dir')
36
40
  tracker.track_views('name', 'start', 'finish', 'id', {:layout => file_path})
37
41
  tracker.report_views_tracked
@@ -45,7 +49,7 @@ class ReporterTest < Minitest::Test
45
49
  tracker = Coverband::Collectors::ViewTracker.new(store: store, roots: 'dir')
46
50
  tracker.track_views('name', 'start', 'finish', 'id', {:identifier => file_path})
47
51
  tracker.report_views_tracked
48
- assert_equal [file_path], tracker.used_views
52
+ assert_equal [file_path], tracker.used_views.keys
49
53
  end
50
54
 
51
55
  test "report unused partials" do
@@ -62,12 +66,24 @@ class ReporterTest < Minitest::Test
62
66
  test "reset store" do
63
67
  Coverband::Collectors::ViewTracker.expects(:supported_version?).returns(true)
64
68
  store = fake_store
65
- store.raw_store.expects(:del).with('render_tracker')
69
+ store.raw_store.expects(:del).with(tracker_key)
70
+ store.raw_store.expects(:del).with('render_tracker_time')
66
71
  tracker = Coverband::Collectors::ViewTracker.new(store: store, roots: 'dir')
67
72
  tracker.track_views('name', 'start', 'finish', 'id', {:identifier => 'file'})
68
73
  tracker.reset_recordings
69
74
  end
70
75
 
76
+ test "clear_file" do
77
+ Coverband::Collectors::ViewTracker.expects(:supported_version?).returns(true)
78
+ store = fake_store
79
+ file_path = "#{File.expand_path(Coverband.configuration.root)}/file"
80
+ store.raw_store.expects(:hdel).with(tracker_key, file_path)
81
+ tracker = Coverband::Collectors::ViewTracker.new(store: store, roots: 'dir')
82
+ tracker.track_views('name', 'start', 'finish', 'id', {:identifier => file_path})
83
+ tracker.clear_file!('file')
84
+ assert_equal [], tracker.logged_views
85
+ end
86
+
71
87
  protected
72
88
 
73
89
  def fake_store
@@ -36,6 +36,19 @@ class ReportHTMLTest < Minitest::Test
36
36
  assert_match 'app/models/user.rb', html
37
37
  end
38
38
 
39
+ test 'files with no Coverage but in project details page list warning' do
40
+ @store.send(:save_report, basic_coverage_full_path)
41
+
42
+ filename = basic_coverage_file_full_path
43
+ base_path = Dir.pwd
44
+ # in project, but not in coverage data
45
+ html = Coverband::Reporters::HTMLReport.new(Coverband.configuration.store,
46
+ filename: "#{Dir.pwd}/test/fixtures/app/models/user.rb",
47
+ base_path: base_path,
48
+ open_report: false).file_details
49
+ assert_match 'This file was never loaded', html
50
+ end
51
+
39
52
  test 'generate static HTML report file' do
40
53
  @store.send(:save_report, basic_coverage)
41
54
 
@@ -62,6 +62,10 @@ describe Coverband::Utils::SourceFile do
62
62
  it 'has 80% covered_percent' do
63
63
  assert_equal 80.0, subject.covered_percent
64
64
  end
65
+
66
+ it 'working for nil last_updated_at' do
67
+ assert_equal "not available", subject.last_updated_at
68
+ end
65
69
  end
66
70
 
67
71
  describe 'simulating potential Ruby 1.9 defect -- see Issue #56' do
@@ -35,7 +35,8 @@
35
35
  <tbody>
36
36
  <% source_files.each do |source_file| %>
37
37
  <tr>
38
- <td class="strong">
38
+ <% source_class = source_file.never_loaded ? 'strong red' : 'strong'%>
39
+ <td class="<%= source_class %>">
39
40
  <%= link_to_source_file(source_file) %>
40
41
  </td>
41
42
  <td class="<%= coverage_css_class(source_file.covered_percent) %> strong"><%= source_file.covered_percent.round(2).to_s %> %</td>
@@ -10,7 +10,7 @@
10
10
  <% end %>
11
11
  </div>
12
12
  <% if notice.to_s.length > 0 %>
13
- <div class="notice"><%= notice %></div>
13
+ <div class="notice"><%= notice %></div>
14
14
  <% end %>
15
15
  <div class="timestamp">Generated <%= timeago(Time.now) %></div>
16
16
  <br/>
@@ -15,6 +15,13 @@
15
15
  <% if Coverband.configuration.web_enable_clear %>
16
16
  <%= button("#{base_path}clear_file?filename=#{source_file.relative_path}", 'clear file coverage') %> &nbsp;
17
17
  <% end %>
18
+
19
+ <% if source_file.never_loaded %>
20
+ <br/>
21
+ <span class="red">
22
+ <strong>This file was never loaded during app runtime or loading!</strong>
23
+ </span>
24
+ <% end %>
18
25
  </h4>
19
26
  <div>
20
27
  <b><%= source_file.lines_of_code %></b> relevant lines.
@@ -3,6 +3,7 @@
3
3
  <head>
4
4
  <title>Coverband Info: <%= Coverband::VERSION %></title>
5
5
  <meta http-equiv="content-type" content="text/html; charset=utf-8" />
6
+ <script src='<%= assets_path('dependencies.js') %>' type='text/javascript'></script>
6
7
  <script src='<%= assets_path('application.js') %>' type='text/javascript'></script>
7
8
  <link href='<%= assets_path('application.css') %>' media='screen, projection, print' rel='stylesheet' type='text/css'>
8
9
  <link rel="icon" type="image/png" href="<%= assets_path('favicon.png') %>" />
@@ -13,8 +14,13 @@
13
14
  <%= display_nav(show_coverage_link: true) %>
14
15
  <div id="content">
15
16
  <% tracker = Coverband::Collectors::ViewTracker.new(store: Coverband.configuration.store) %>
17
+ <h3>
18
+ <% if Coverband.configuration.web_enable_clear %>
19
+ <%= button("#{base_path}clear_view_tracking", 'reset view tracker', delete: true) %>
20
+ <% end %>
21
+ </h3>
16
22
  <h2>Unused Views: (<%= tracker.unused_views.length %>)</h2>
17
- <p>These views have never been rendered</p>
23
+ <p>These views have not been rendered since recording started at <%= tracker.tracking_since %></p>
18
24
  <ul>
19
25
  <% tracker.unused_views.each do |view_file| %>
20
26
  <li><%= view_file %></li>
@@ -24,8 +30,14 @@
24
30
  <h2>Used Views: (<%= tracker.used_views.length %>)</h2>
25
31
  <p>These views have been rendered at least once</p>
26
32
  <ul>
27
- <% tracker.used_views.each do |view_file| %>
28
- <li><%= view_file %></li>
33
+ <% tracker.used_views.each_pair do |view_file, time_at| %>
34
+ <li>
35
+ <%= view_file %>
36
+ <span class="last_seen_at">last activity recorded <%= Time.at(time_at.to_i)%></span>
37
+ <% if Coverband.configuration.web_enable_clear %>
38
+ <%= button("#{base_path}clear_view_tracking_file?filename=#{view_file}", 'reset tracked file', delete: true) %>
39
+ <% end %>
40
+ </li>
29
41
  <% end %>
30
42
  </ul>
31
43
  </div>
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: coverband
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.2.2
4
+ version: 4.2.3.rc.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dan Mayer
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2019-08-20 00:00:00.000000000 Z
12
+ date: 2019-09-17 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: aws-sdk-s3
@@ -426,9 +426,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
426
426
  version: '0'
427
427
  required_rubygems_version: !ruby/object:Gem::Requirement
428
428
  requirements:
429
- - - ">="
429
+ - - ">"
430
430
  - !ruby/object:Gem::Version
431
- version: '0'
431
+ version: 1.3.1
432
432
  requirements: []
433
433
  rubygems_version: 3.0.3
434
434
  signing_key: