coverband 4.2.2 → 4.2.3.rc.1

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: 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: