fbe 0.23.0 → 0.23.2
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 +4 -4
- data/Gemfile.lock +1 -0
- data/fbe.gemspec +1 -0
- data/lib/fbe/middleware/sqlite_store.rb +0 -1
- data/lib/fbe/middleware/trace.rb +11 -7
- data/lib/fbe/octo.rb +17 -7
- data/lib/fbe.rb +1 -1
- data/test/fbe/test_octo.rb +56 -25
- data/test/test__helper.rb +1 -1
- metadata +15 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ee5e623e0dd6b64525eb62f7dcad447a595c3c963c747acec37dda308cabcf98
|
4
|
+
data.tar.gz: c422fd60aba87180dc2ab7265abe5458928b7df765b86e7c3eaea9f8b3884c34
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0fcd4bf85f7ae73caab3b4b2a834b1978c2fb4aee2c58a83fcb53098d25d6208f25f99ded13ac5efbd441d6f7eeb24f22d5c74249f802353568781d38e9e0d93
|
7
|
+
data.tar.gz: 3b4aab5363b741fb8f9054a32a84e008a9ad5487d8f668580cbe6d6fdbe0b447511f6c999bcad9b4d906cbd017566e50bfb31ac881c2271c793fe0ce111700b9
|
data/Gemfile.lock
CHANGED
data/fbe.gemspec
CHANGED
@@ -25,6 +25,7 @@ Gem::Specification.new do |s|
|
|
25
25
|
s.add_dependency 'backtrace', '~>0.4'
|
26
26
|
s.add_dependency 'baza.rb', '~>0.5'
|
27
27
|
s.add_dependency 'decoor', '~>0.0'
|
28
|
+
s.add_dependency 'ellipsized', '~>0.3'
|
28
29
|
s.add_dependency 'factbase', '~>0.11'
|
29
30
|
s.add_dependency 'faraday', '~>2.0'
|
30
31
|
s.add_dependency 'faraday-http-cache', '~>2.5'
|
data/lib/fbe/middleware/trace.rb
CHANGED
@@ -31,9 +31,11 @@ class Fbe::Middleware::Trace < Faraday::Middleware
|
|
31
31
|
#
|
32
32
|
# @param [Object] app The next middleware in the stack
|
33
33
|
# @param [Array] trace The array to store trace entries
|
34
|
-
|
34
|
+
# @param [Boolean] all Print ALL requests, even very fast?
|
35
|
+
def initialize(app, trace, all: true)
|
35
36
|
super(app)
|
36
37
|
@trace = trace
|
38
|
+
@all = all
|
37
39
|
end
|
38
40
|
|
39
41
|
# Processes the HTTP request and records trace information.
|
@@ -41,18 +43,20 @@ class Fbe::Middleware::Trace < Faraday::Middleware
|
|
41
43
|
# @param [Faraday::Env] env The request environment
|
42
44
|
# @return [Faraday::Response] The response from the next middleware
|
43
45
|
def call(env)
|
44
|
-
started = Time.now
|
45
46
|
entry = {
|
46
47
|
method: env.method,
|
47
48
|
url: env.url.to_s,
|
48
|
-
started_at:
|
49
|
+
started_at: Time.now
|
49
50
|
}
|
50
51
|
@app.call(env).on_complete do |response_env|
|
51
52
|
finished = Time.now
|
52
|
-
entry[:
|
53
|
-
|
54
|
-
|
55
|
-
|
53
|
+
duration = finished - entry[:started_at]
|
54
|
+
if duration > 0.01 || @all
|
55
|
+
entry[:status] = response_env.status
|
56
|
+
entry[:finished_at] = finished
|
57
|
+
entry[:duration] = duration
|
58
|
+
@trace << entry
|
59
|
+
end
|
56
60
|
end
|
57
61
|
end
|
58
62
|
end
|
data/lib/fbe/octo.rb
CHANGED
@@ -3,11 +3,12 @@
|
|
3
3
|
# SPDX-FileCopyrightText: Copyright (c) 2024-2025 Zerocracy
|
4
4
|
# SPDX-License-Identifier: MIT
|
5
5
|
|
6
|
-
require 'json'
|
7
6
|
require 'decoor'
|
7
|
+
require 'ellipsized'
|
8
8
|
require 'faraday/http_cache'
|
9
9
|
require 'faraday/retry'
|
10
10
|
require 'filesize'
|
11
|
+
require 'json'
|
11
12
|
require 'loog'
|
12
13
|
require 'obk'
|
13
14
|
require 'octokit'
|
@@ -17,8 +18,8 @@ require 'verbose'
|
|
17
18
|
require_relative '../fbe'
|
18
19
|
require_relative 'middleware'
|
19
20
|
require_relative 'middleware/formatter'
|
20
|
-
require_relative 'middleware/trace'
|
21
21
|
require_relative 'middleware/sqlite_store'
|
22
|
+
require_relative 'middleware/trace'
|
22
23
|
|
23
24
|
# Makes a call to the GitHub API.
|
24
25
|
#
|
@@ -104,7 +105,7 @@ def Fbe.octo(options: $options, global: $global, loog: $loog)
|
|
104
105
|
end
|
105
106
|
builder.use(Octokit::Response::RaiseError)
|
106
107
|
builder.use(Faraday::Response::Logger, loog, formatter: Fbe::Middleware::Formatter)
|
107
|
-
builder.use(Fbe::Middleware::Trace, trace)
|
108
|
+
builder.use(Fbe::Middleware::Trace, trace, all: false)
|
108
109
|
builder.adapter(Faraday.default_adapter)
|
109
110
|
end
|
110
111
|
o.middleware = stack
|
@@ -128,13 +129,18 @@ def Fbe.octo(options: $options, global: $global, loog: $loog)
|
|
128
129
|
grouped =
|
129
130
|
@trace.group_by do |entry|
|
130
131
|
uri = URI.parse(entry[:url])
|
131
|
-
|
132
|
+
query = uri.query
|
133
|
+
query = "?#{query.ellipsized(40)}" if query
|
134
|
+
"#{uri.scheme}://#{uri.host}#{uri.path}#{query}"
|
132
135
|
end
|
133
136
|
message = grouped
|
134
137
|
.sort_by { |_path, entries| -entries.count }
|
135
|
-
.map { |path, entries| " #{path}: #{entries.count}" }
|
138
|
+
.map { |path, entries| " #{path.gsub(%r{^https://api.github.com/}, '/')}: #{entries.count}" }
|
136
139
|
.join("\n")
|
137
|
-
@loog.info(
|
140
|
+
@loog.info(
|
141
|
+
"GitHub API trace (#{grouped.count} URLs vs #{@trace.count} requests, " \
|
142
|
+
"#{@origin.rate_limit.remaining} quota left):\n#{message}"
|
143
|
+
)
|
138
144
|
@trace.clear
|
139
145
|
end
|
140
146
|
end
|
@@ -689,10 +695,14 @@ class Fbe::FakeOctokit
|
|
689
695
|
repo: {
|
690
696
|
full_name: repo
|
691
697
|
},
|
698
|
+
user: { login: 'yegor256', id: 526_301, type: 'User' },
|
699
|
+
head: { ref: 'master', sha: '6dcb09b5b57875f334f61aebed695e2e4193db5e' },
|
692
700
|
additions: 12,
|
693
701
|
deletions: 5,
|
694
702
|
changed_files: 3,
|
695
|
-
|
703
|
+
comments: 2,
|
704
|
+
review_comments: 2,
|
705
|
+
created_at: Time.parse('2024-09-20 19:00:00 UTC')
|
696
706
|
}
|
697
707
|
end
|
698
708
|
|
data/lib/fbe.rb
CHANGED
data/test/fbe/test_octo.rb
CHANGED
@@ -366,30 +366,66 @@ class TestOcto < Fbe::Test
|
|
366
366
|
stub_request(:get, 'https://api.github.com/rate_limit').to_return(
|
367
367
|
{ body: '{}', headers: { 'X-RateLimit-Remaining' => '222' } }
|
368
368
|
)
|
369
|
-
stub_request(:get, 'https://api.github.com/user/123').to_return
|
370
|
-
|
371
|
-
|
372
|
-
|
373
|
-
|
374
|
-
|
375
|
-
|
376
|
-
|
377
|
-
|
378
|
-
|
369
|
+
stub_request(:get, 'https://api.github.com/user/123').to_return do
|
370
|
+
sleep(0.02)
|
371
|
+
{
|
372
|
+
status: 200,
|
373
|
+
body: '{"id":123,"login":"test"}',
|
374
|
+
headers: { 'X-RateLimit-Remaining' => '222' }
|
375
|
+
}
|
376
|
+
end
|
377
|
+
stub_request(:get, 'https://api.github.com/repos/foo/bar').to_return do
|
378
|
+
sleep(0.02)
|
379
|
+
{
|
380
|
+
status: 200,
|
381
|
+
body: '{"id":456,"full_name":"foo/bar"}',
|
382
|
+
headers: { 'X-RateLimit-Remaining' => '222' }
|
383
|
+
}
|
384
|
+
end
|
379
385
|
octo = Fbe.octo(loog:, global: {}, options: Judges::Options.new)
|
380
386
|
octo.user(123)
|
381
387
|
octo.repository('foo/bar')
|
382
388
|
octo.repository('foo/bar')
|
383
389
|
octo.print_trace!
|
384
390
|
output = loog.to_s
|
385
|
-
assert_includes output, '
|
386
|
-
assert_includes output, '
|
387
|
-
assert_includes output, '
|
388
|
-
|
389
|
-
|
391
|
+
assert_includes output, '2 URLs vs 3 requests'
|
392
|
+
assert_includes output, '222 quota left'
|
393
|
+
assert_includes output, '/user/123: 1'
|
394
|
+
assert_includes output, '/repos/foo/bar: 2'
|
395
|
+
repo_index = output.index('/repos/foo/bar: 2')
|
396
|
+
user_index = output.index('/user/123: 1')
|
390
397
|
assert_operator repo_index, :<, user_index, 'URLs should be sorted by request count (highest first)'
|
391
398
|
end
|
392
399
|
|
400
|
+
def test_prints_only_real_requests
|
401
|
+
WebMock.disable_net_connect!
|
402
|
+
stub_request(:get, 'https://api.github.com/rate_limit').to_return(
|
403
|
+
{ body: '{}', headers: { 'X-RateLimit-Remaining' => '222' } }
|
404
|
+
)
|
405
|
+
stub = stub_request(:get, 'https://api.github.com/user/123').to_return(
|
406
|
+
status: 200,
|
407
|
+
body: '{"id":123,"login":"test"}',
|
408
|
+
headers: {
|
409
|
+
'X-RateLimit-Remaining' => '222',
|
410
|
+
'Content-Type' => 'application/json',
|
411
|
+
'Cache-Control' => 'public, max-age=60, s-maxage=60',
|
412
|
+
'Etag' => 'W/"2ff9dd4c3153f006830b2b8b721f6a4bb400a1eb81a2e1fa0a3b846ad349b9ec"',
|
413
|
+
'Last-Modified' => 'Wed, 01 May 2025 20:00:00 GMT'
|
414
|
+
}
|
415
|
+
)
|
416
|
+
Dir.mktmpdir do |dir|
|
417
|
+
fcache = File.expand_path('test.db', dir)
|
418
|
+
octo = Fbe.octo(loog: Loog::NULL, global: {}, options: Judges::Options.new({ 'sqlite_cache' => fcache }))
|
419
|
+
octo.user(123)
|
420
|
+
loog = Loog::Buffer.new
|
421
|
+
octo = Fbe.octo(loog: fake_loog, global: {}, options: Judges::Options.new({ 'sqlite_cache' => fcache }))
|
422
|
+
WebMock.remove_request_stub(stub)
|
423
|
+
octo.user(123)
|
424
|
+
octo.print_trace!
|
425
|
+
assert_empty(loog.to_s)
|
426
|
+
end
|
427
|
+
end
|
428
|
+
|
393
429
|
def test_trace_gets_cleared_after_print
|
394
430
|
WebMock.disable_net_connect!
|
395
431
|
stub_request(:get, 'https://api.github.com/rate_limit').to_return(
|
@@ -414,9 +450,8 @@ class TestOcto < Fbe::Test
|
|
414
450
|
{ body: '{}', headers: { 'X-RateLimit-Remaining' => '222' } }
|
415
451
|
)
|
416
452
|
Dir.mktmpdir do |dir|
|
417
|
-
global = {}
|
418
453
|
sqlite_cache = File.expand_path('test.db', dir)
|
419
|
-
o = Fbe.octo(loog: Loog::NULL, global
|
454
|
+
o = Fbe.octo(loog: Loog::NULL, global: {}, options: Judges::Options.new({ 'sqlite_cache' => sqlite_cache }))
|
420
455
|
stub = stub_request(:get, 'https://api.github.com/user/42').to_return(
|
421
456
|
status: 200,
|
422
457
|
body: { login: 'user1' }.to_json,
|
@@ -429,8 +464,7 @@ class TestOcto < Fbe::Test
|
|
429
464
|
)
|
430
465
|
assert_equal('user1', o.user_name_by_id(42))
|
431
466
|
WebMock.remove_request_stub(stub)
|
432
|
-
|
433
|
-
o = Fbe.octo(loog: Loog::NULL, global:, options: Judges::Options.new({ 'sqlite_cache' => sqlite_cache }))
|
467
|
+
o = Fbe.octo(loog: Loog::NULL, global: {}, options: Judges::Options.new({ 'sqlite_cache' => sqlite_cache }))
|
434
468
|
assert_equal('user1', o.user_name_by_id(42))
|
435
469
|
end
|
436
470
|
end
|
@@ -441,10 +475,9 @@ class TestOcto < Fbe::Test
|
|
441
475
|
{ body: '{}', headers: { 'X-RateLimit-Remaining' => '222' } }
|
442
476
|
)
|
443
477
|
Dir.mktmpdir do |dir|
|
444
|
-
global = {}
|
445
478
|
file = File.expand_path('test.db', dir)
|
446
479
|
stub_request(:get, 'https://api.github.com/user/4242').to_return(status: 401)
|
447
|
-
o = Fbe.octo(loog: Loog::NULL, global
|
480
|
+
o = Fbe.octo(loog: Loog::NULL, global: {}, options: Judges::Options.new({ 'sqlite_cache' => file }))
|
448
481
|
assert_raises(StandardError) do
|
449
482
|
assert_equal('user1', o.user_name_by_id(4242))
|
450
483
|
end
|
@@ -458,7 +491,6 @@ class TestOcto < Fbe::Test
|
|
458
491
|
{ body: '{}', headers: { 'X-RateLimit-Remaining' => '222' } }
|
459
492
|
)
|
460
493
|
Dir.mktmpdir do |dir|
|
461
|
-
global = {}
|
462
494
|
stub =
|
463
495
|
stub_request(:get, 'https://api.github.com/user/42')
|
464
496
|
.to_return(
|
@@ -473,7 +505,7 @@ class TestOcto < Fbe::Test
|
|
473
505
|
)
|
474
506
|
sqlite_cache = File.expand_path('test.db', dir)
|
475
507
|
Fbe.stub_const(:VERSION, '0.0.1') do
|
476
|
-
o = Fbe.octo(loog: Loog::NULL, global
|
508
|
+
o = Fbe.octo(loog: Loog::NULL, global: {}, options: Judges::Options.new({ 'sqlite_cache' => sqlite_cache }))
|
477
509
|
assert_equal('user1', o.user_name_by_id(42))
|
478
510
|
end
|
479
511
|
WebMock.remove_request_stub(stub)
|
@@ -488,9 +520,8 @@ class TestOcto < Fbe::Test
|
|
488
520
|
'Last-Modified' => 'Wed, 01 May 2025 20:00:00 GMT'
|
489
521
|
}
|
490
522
|
)
|
491
|
-
global = {}
|
492
523
|
Fbe.stub_const(:VERSION, '0.0.2') do
|
493
|
-
o = Fbe.octo(loog: Loog::NULL, global
|
524
|
+
o = Fbe.octo(loog: Loog::NULL, global: {}, options: Judges::Options.new({ 'sqlite_cache' => sqlite_cache }))
|
494
525
|
assert_equal('user2', o.user_name_by_id(42))
|
495
526
|
end
|
496
527
|
end
|
data/test/test__helper.rb
CHANGED
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.23.
|
4
|
+
version: 0.23.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Yegor Bugayenko
|
@@ -51,6 +51,20 @@ dependencies:
|
|
51
51
|
- - "~>"
|
52
52
|
- !ruby/object:Gem::Version
|
53
53
|
version: '0.0'
|
54
|
+
- !ruby/object:Gem::Dependency
|
55
|
+
name: ellipsized
|
56
|
+
requirement: !ruby/object:Gem::Requirement
|
57
|
+
requirements:
|
58
|
+
- - "~>"
|
59
|
+
- !ruby/object:Gem::Version
|
60
|
+
version: '0.3'
|
61
|
+
type: :runtime
|
62
|
+
prerelease: false
|
63
|
+
version_requirements: !ruby/object:Gem::Requirement
|
64
|
+
requirements:
|
65
|
+
- - "~>"
|
66
|
+
- !ruby/object:Gem::Version
|
67
|
+
version: '0.3'
|
54
68
|
- !ruby/object:Gem::Dependency
|
55
69
|
name: factbase
|
56
70
|
requirement: !ruby/object:Gem::Requirement
|