fbe 0.36.1 → 0.38.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: b06cd95d05dd6dfa4e79d2c3e128bb3c8bae254dae8abe5842cc59e12adf26f5
4
- data.tar.gz: 626b6720065bfdf41480b3728545963fc2477e5baa7d6e07f404a396b52df9ca
3
+ metadata.gz: 04d71d826c4bd4c4ee4a8b22f04561ca31cc997f4e398f129e7d792d65a898ef
4
+ data.tar.gz: 7a95d256e71402d57fcf2e5f47d77a70c1edb4112bd961344b879470ededfe77
5
5
  SHA512:
6
- metadata.gz: 9df729eb9a4e4733ccf08c68fa289c2c05da96e3360a285e7432bc7e2ba0a1cbce56e74b5b1c34dc12023eca1395b045af9ad2f8698ce63a7d47ad5ffdd1273e
7
- data.tar.gz: 24fc078561ad2d0a6169a2aebf965325497f8feca78446fcc6c4f6890c3e685c3bae9ba9c2da049dbdd8090b4363ab9b4acdbfa476c8c1a9f6222d6cf7b28910
6
+ metadata.gz: 2e21419e49aeebc86275f380df70423c030fad50c83626d8b45a28716589d75047fce9e8ee0ea81b5c5b6dd6bf7324a1f0d07625d28c750bef3de1d3324a4e28
7
+ data.tar.gz: e8c45307769eea587953ecb193c2516da44020007a5b8e0c45516f8f71a78100758e38fdc3224c707f50e95459ad37695a0848b7129dae868be2989b4351a5a7
data/Gemfile.lock CHANGED
@@ -76,7 +76,7 @@ GEM
76
76
  ellipsized (0.3.0)
77
77
  ethon (0.15.0)
78
78
  ffi (>= 1.15.0)
79
- factbase (0.16.5)
79
+ factbase (0.16.7)
80
80
  backtrace (~> 0.4)
81
81
  decoor (~> 0.1)
82
82
  ellipsized (~> 0.3)
@@ -262,6 +262,7 @@ PLATFORMS
262
262
  x64-mingw-ucrt
263
263
  x86_64-darwin-20
264
264
  x86_64-darwin-21
265
+ x86_64-darwin-23
265
266
  x86_64-linux
266
267
 
267
268
  DEPENDENCIES
data/lib/fbe/conclude.rb CHANGED
@@ -16,17 +16,19 @@ require_relative 'octo'
16
16
  # @param [Hash] global The hash for global caching
17
17
  # @param [Judges::Options] options The options coming from the +judges+ tool
18
18
  # @param [Loog] loog The logging facility
19
+ # @param [Time] epoch When the entire update started
20
+ # @param [Time] kickoff When the particular judge started
19
21
  # @yield [Factbase::Fact] The fact
20
22
  def Fbe.conclude(
21
23
  fb: Fbe.fb, judge: $judge, loog: $loog, options: $options, global: $global,
22
- start: $start, &
24
+ epoch: $epoch || Time.now, kickoff: $kickoff || Time.now, &
23
25
  )
24
26
  raise 'The fb is nil' if fb.nil?
25
27
  raise 'The $judge is not set' if judge.nil?
26
28
  raise 'The $global is not set' if global.nil?
27
29
  raise 'The $options is not set' if options.nil?
28
30
  raise 'The $loog is not set' if loog.nil?
29
- c = Fbe::Conclude.new(fb:, judge:, loog:, options:, global:, start:)
31
+ c = Fbe::Conclude.new(fb:, judge:, loog:, options:, global:, epoch:, kickoff:)
30
32
  c.instance_eval(&)
31
33
  end
32
34
 
@@ -61,13 +63,16 @@ class Fbe::Conclude
61
63
  # @param [Hash] global The hash for global caching
62
64
  # @param [Judges::Options] options The options coming from the +judges+ tool
63
65
  # @param [Loog] loog The logging facility
64
- def initialize(fb:, judge:, global:, options:, loog:, start:)
66
+ # @param [Time] epoch When the entire update started
67
+ # @param [Time] kickoff When the particular judge started
68
+ def initialize(fb:, judge:, global:, options:, loog:, epoch:, kickoff:)
65
69
  @fb = fb
66
70
  @judge = judge
67
71
  @loog = loog
68
72
  @options = options
69
73
  @global = global
70
- @start = start
74
+ @epoch = epoch
75
+ @kickoff = kickoff
71
76
  @query = nil
72
77
  @follows = []
73
78
  @lifetime_aware = true
@@ -192,18 +197,17 @@ class Fbe::Conclude
192
197
  def roll(&)
193
198
  passed = 0
194
199
  oct = Fbe.octo(loog: @loog, options: @options, global: @global)
195
- started = Time.now
196
200
  @fb.query(@query).each do |a|
197
201
  if @quota_aware && oct.off_quota?
198
202
  @loog.info('We ran out of GitHub quota, must stop here')
199
203
  break
200
204
  end
201
- if @lifetime_aware && @options.lifetime && Time.now - @start > @options.lifetime - 10
202
- @loog.debug("We ran out of lifetime (#{@start.ago} already), must stop here")
205
+ if @lifetime_aware && @options.lifetime && Time.now - @epoch > @options.lifetime * 0.9
206
+ @loog.debug("We ran out of lifetime (#{@epoch.ago} already), must stop here")
203
207
  break
204
208
  end
205
- if @timeout_aware && @options.timeout && Time.now - started > @options.timeout - 5
206
- @loog.debug("We've spent more than #{started.ago}, must stop here")
209
+ if @timeout_aware && @options.timeout && Time.now - @kickoff > @options.timeout * 0.9
210
+ @loog.debug("We've spent more than #{kickoff.ago}, must stop here")
207
211
  break
208
212
  end
209
213
  @fb.txn do |fbt|
data/lib/fbe/consider.rb CHANGED
@@ -15,13 +15,15 @@ require_relative 'fb'
15
15
  # @param [Hash] global The hash for global caching
16
16
  # @param [Judges::Options] options The options coming from the +judges+ tool
17
17
  # @param [Loog] loog The logging facility
18
+ # @param [Time] epoch When the entire update started
19
+ # @param [Time] kickoff When the particular judge started
18
20
  # @yield [Factbase::Fact] The fact
19
21
  def Fbe.consider(
20
22
  query,
21
23
  fb: Fbe.fb, judge: $judge, loog: $loog, options: $options, global: $global,
22
- start: $start, &
24
+ epoch: $epoch || Time.now, kickoff: $kickoff || Time.now, &
23
25
  )
24
- Fbe.conclude(fb:, judge:, loog:, options:, global:, start:) do
26
+ Fbe.conclude(fb:, judge:, loog:, options:, global:, epoch:, kickoff:) do
25
27
  on query
26
28
  consider(&)
27
29
  end
data/lib/fbe/iterate.rb CHANGED
@@ -37,12 +37,15 @@ require_relative 'unmask_repos'
37
37
  # issue_id + 1
38
38
  # end
39
39
  # end
40
- def Fbe.iterate(fb: Fbe.fb, loog: $loog, options: $options, global: $global, start: $start, &)
40
+ def Fbe.iterate(
41
+ fb: Fbe.fb, loog: $loog, options: $options, global: $global,
42
+ epoch: $epoch || Time.now, kickoff: $kickoff || Time.now, &
43
+ )
41
44
  raise 'The fb is nil' if fb.nil?
42
45
  raise 'The $global is not set' if global.nil?
43
46
  raise 'The $options is not set' if options.nil?
44
47
  raise 'The $loog is not set' if loog.nil?
45
- c = Fbe::Iterate.new(fb:, loog:, options:, global:, start:)
48
+ c = Fbe::Iterate.new(fb:, loog:, options:, global:, epoch:, kickoff:)
46
49
  c.instance_eval(&)
47
50
  end
48
51
 
@@ -84,12 +87,13 @@ class Fbe::Iterate
84
87
  # @param [Loog] loog The logging facility for debug output
85
88
  # @param [Judges::Options] options The options containing repository configuration
86
89
  # @param [Hash] global The hash for global caching of API responses
87
- def initialize(fb:, loog:, options:, global:, start:)
90
+ def initialize(fb:, loog:, options:, global:, epoch:, kickoff:)
88
91
  @fb = fb
89
92
  @loog = loog
90
93
  @options = options
91
94
  @global = global
92
- @start = start
95
+ @epoch = epoch
96
+ @kickoff = kickoff
93
97
  @label = nil
94
98
  @since = 0
95
99
  @query = nil
@@ -227,7 +231,6 @@ class Fbe::Iterate
227
231
  loog: @loog, options: @options, global: @global, quota_aware: @quota_aware
228
232
  ).map { |n| oct.repo_id_by_name(n) }
229
233
  restarted = []
230
- started = Time.now
231
234
  before =
232
235
  repos.to_h do |repo|
233
236
  [
@@ -247,12 +250,12 @@ class Fbe::Iterate
247
250
  @loog.info("We are off GitHub quota, time to stop after #{started.ago}")
248
251
  break
249
252
  end
250
- if @lifetime_aware && @options.lifetime && Time.now - @start > @options.lifetime - 10
251
- @loog.debug("We ran out of lifetime (#{@start.ago} already), must stop here")
253
+ if @lifetime_aware && @options.lifetime && Time.now - @epoch > @options.lifetime * 0.9
254
+ @loog.debug("We ran out of lifetime (#{@epoch.ago} already), must stop here")
252
255
  break
253
256
  end
254
- if @timeout_aware && @options.timeout && Time.now - started > @options.timeout - 5
255
- @loog.debug("We've spent more than #{started.ago}, must stop here")
257
+ if @timeout_aware && @options.timeout && Time.now - @kickoff > @options.timeout * 0.9
258
+ @loog.debug("We've spent more than #{@kickoff.ago}, must stop here")
256
259
  break
257
260
  end
258
261
  repos.each do |repo|
@@ -260,12 +263,12 @@ class Fbe::Iterate
260
263
  @loog.info("We are off GitHub quota, we must skip #{repo}")
261
264
  break
262
265
  end
263
- if @lifetime_aware && @options.lifetime && Time.now - @start > @options.lifetime - 10
264
- @loog.info("We are working for #{@start.ago} already, won't check repository ##{repo}")
266
+ if @lifetime_aware && @options.lifetime && Time.now - @epoch > @options.lifetime * 0.9
267
+ @loog.info("We are working for #{@epoch.ago} already, won't check repository ##{repo}")
265
268
  next
266
269
  end
267
- if @timeout_aware && @options.timeout && Time.now - started > @options.timeout - 5
268
- @loog.debug("We've spent more than #{started.ago}, won't check repository ##{repo}")
270
+ if @timeout_aware && @options.timeout && Time.now - @kickoff > @options.timeout * 0.9
271
+ @loog.debug("We've spent more than #{@kickoff.ago}, won't check repository ##{repo}")
269
272
  break
270
273
  end
271
274
  next if restarted.include?(repo)
@@ -290,11 +293,11 @@ class Fbe::Iterate
290
293
  seen[repo] += 1
291
294
  end
292
295
  unless seen.any? { |r, v| v < @repeats && !restarted.include?(r) }
293
- @loog.debug("No more repos to scan (out of #{repos.size}), quitting after #{started.ago}")
296
+ @loog.debug("No more repos to scan (out of #{repos.size}), quitting after #{@kickoff.ago}")
294
297
  break
295
298
  end
296
299
  if restarted.size == repos.size
297
- @loog.debug("All #{repos.size} repos restarted, quitting after #{started.ago}")
300
+ @loog.debug("All #{repos.size} repos restarted, quitting after #{@kickoff.ago}")
298
301
  break
299
302
  end
300
303
  end
@@ -308,6 +311,6 @@ class Fbe::Iterate
308
311
  end
309
312
  Fbe.overwrite(f, @label, before[repo], fb: @fb)
310
313
  end
311
- @loog.debug("Finished scanning #{repos.size} repos in #{started.ago}: #{seen.map { |k, v| "#{k}:#{v}" }.joined}")
314
+ @loog.debug("Finished scanning #{repos.size} repos in #{@kickoff.ago}: #{seen.map { |k, v| "#{k}:#{v}" }.joined}")
312
315
  end
313
316
  end
data/lib/fbe/octo.rb CHANGED
@@ -44,6 +44,7 @@ def Fbe.octo(options: $options, global: $global, loog: $loog)
44
44
  raise 'The $loog is not set' if loog.nil?
45
45
  global[:octo] ||=
46
46
  begin
47
+ loog.info("Fbe version is #{Fbe::VERSION}")
47
48
  trace = []
48
49
  if options.testing.nil?
49
50
  o = Octokit::Client.new
data/lib/fbe/overwrite.rb CHANGED
@@ -16,8 +16,8 @@ require_relative 'fb'
16
16
  # an exception will be raised.
17
17
  #
18
18
  # @param [Factbase::Fact] fact The fact to modify (must have _id property)
19
- # @param [String] property The name of the property to set
20
- # @param [Any] values The value to set (can be any type, including array)
19
+ # @param [String, Hash] property_or_hash The name of the property to set, or a hash of properties
20
+ # @param [Any] values The value to set (can be any type, including array) - ignored if first param is Hash
21
21
  # @param [Factbase] fb The factbase to use (defaults to Fbe.fb)
22
22
  # @return [nil] Nothing
23
23
  # @raise [RuntimeError] If fact is nil, has no _id, or property is not a String
@@ -25,11 +25,39 @@ require_relative 'fb'
25
25
  # @note If property already has the same single value, no changes are made
26
26
  # @example Update a user's status
27
27
  # user = fb.query('(eq login "john")').first
28
- # updated_user = Fbe.overwrite(user, 'status', 'active')
28
+ # Fbe.overwrite(user, 'status', 'active')
29
29
  # # All properties preserved, only 'status' is set to 'active'
30
- def Fbe.overwrite(fact, property, values, fb: Fbe.fb, fid: '_id')
30
+ # @example Update multiple properties at once
31
+ # user = fb.query('(eq login "john")').first
32
+ # Fbe.overwrite(user, status: 'active', role: 'admin')
33
+ # # All properties preserved, 'status' and 'role' are updated
34
+ def Fbe.overwrite(fact, property_or_hash, values = nil, fb: Fbe.fb, fid: '_id')
31
35
  raise 'The fact is nil' if fact.nil?
32
36
  raise 'The fb is nil' if fb.nil?
37
+ if property_or_hash.is_a?(Hash)
38
+ before = {}
39
+ fact.all_properties.each do |k|
40
+ before[k.to_s] = fact[k]
41
+ end
42
+ property_or_hash.each do |k, v|
43
+ raise "The value for #{k} is nil" if v.nil?
44
+ before[k.to_s] = v.is_a?(Array) ? v : [v]
45
+ end
46
+ id = fact[fid]&.first
47
+ raise "There is no #{fid} in the fact, cannot use Fbe.overwrite" if id.nil?
48
+ raise "No facts by #{fid} = #{id}" if fb.query("(eq #{fid} #{id})").delete!.zero?
49
+ fb.txn do |fbt|
50
+ n = fbt.insert
51
+ before.each do |k, vv|
52
+ next unless n[k].nil?
53
+ vv.each do |v|
54
+ n.send(:"#{k}=", v)
55
+ end
56
+ end
57
+ end
58
+ return
59
+ end
60
+ property = property_or_hash
33
61
  raise "The property is not a String but #{property.class} (#{property})" unless property.is_a?(String)
34
62
  raise 'The values is nil' if values.nil?
35
63
  values = [values] unless values.is_a?(Array)
@@ -41,8 +69,8 @@ def Fbe.overwrite(fact, property, values, fb: Fbe.fb, fid: '_id')
41
69
  return
42
70
  end
43
71
  before = {}
44
- fact.all_properties.each do |prop|
45
- before[prop.to_s] = fact[prop]
72
+ fact.all_properties.each do |k|
73
+ before[k.to_s] = fact[k]
46
74
  end
47
75
  id = fact[fid]&.first
48
76
  raise "There is no #{fid} in the fact, cannot use Fbe.overwrite" if id.nil?
@@ -49,16 +49,18 @@ end
49
49
  # @param [Judges::Options] options Options containing 'repositories' field with masks
50
50
  # @param [Hash] global Global cache for storing API responses
51
51
  # @param [Loog] loog Logger for debug output
52
- # @param [Time] start When did we start the entire pipeline
52
+ # @param [Time] epoch When the entire update started
53
+ # @param [Time] kickoff When the particular judge started
53
54
  # @param [quota_aware] Boolean Should we stop if quota is off?
54
55
  # @param [lifetime_aware] Boolean Should we stop if lifetime is over?
56
+ # @param [timeout_aware] Boolean Should we stop if timeout is over?
55
57
  # @return [Array<String>] Shuffled list of repository full names (e.g., 'org/repo')
56
58
  # @raise [RuntimeError] If no repositories match the provided masks
57
59
  # @note Exclusion patterns must start with '-' (e.g., '-org/pattern*')
58
60
  # @note Results are shuffled to distribute load when processing
59
61
  def Fbe.unmask_repos(
60
- options: $options, global: $global, loog: $loog, start: $start,
61
- quota_aware: true, lifetime_aware: true
62
+ options: $options, global: $global, loog: $loog, epoch: $epoch || Time.now, kickoff: $kickoff || Time.now,
63
+ quota_aware: true, lifetime_aware: true, timeout_aware: true
62
64
  )
63
65
  raise 'Repositories mask is not specified' unless options.repositories
64
66
  raise 'Repositories mask is empty' if options.repositories.empty?
@@ -90,7 +92,11 @@ def Fbe.unmask_repos(
90
92
  loog.info("No GitHub quota left, it is time to stop at #{repo}")
91
93
  break
92
94
  end
93
- if lifetime_aware && options.lifetime && Time.now - start > options.lifetime - 10
95
+ if lifetime_aware && options.lifetime && Time.now - epoch > options.lifetime * 0.9
96
+ loog.info("No time left, it is time to stop at #{repo}")
97
+ break
98
+ end
99
+ if timeout_aware && options.timeout && Time.now - kickoff > options.timeout * 0.9
94
100
  loog.info("No time left, it is time to stop at #{repo}")
95
101
  break
96
102
  end
data/lib/fbe.rb CHANGED
@@ -10,5 +10,5 @@
10
10
  # License:: MIT
11
11
  module Fbe
12
12
  # Current version of the gem (changed by +.rultor.yml+ on every release)
13
- VERSION = '0.36.1' unless const_defined?(:VERSION)
13
+ VERSION = '0.38.0' unless const_defined?(:VERSION)
14
14
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fbe
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.36.1
4
+ version: 0.38.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Yegor Bugayenko