judges 0.15.6 → 0.17.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: 7d43bd3ebf5cea4ae2ca7c8d5deb723e01730ea24a2b849e5a7601049b354a3f
4
- data.tar.gz: 5b7e845e02b248d8d3eb6c877ee29e7fa92a423eb472aada3112d4efa772feb4
3
+ metadata.gz: 6fde2252d089419bf5cb20dabc6368db3b70b7a7e6fb116624b3ec2f04811544
4
+ data.tar.gz: 80accd532717b42f176b2bcfc9510610e1dc43d9396ed670196782b923ef2c70
5
5
  SHA512:
6
- metadata.gz: 2e263f81a023f86ac28fd69d122120e29c74adc91ba141d65ec9bfb76266c89b9d072f5134b858c089f43d136ca53fee5fff0c93cf40d453970c8fc8f25a84d0
7
- data.tar.gz: d36e3c2b7e80a15d2194645e8756adfdd6077e1895e6d9e6035c421842be38f04e2ce6188a3672ea3d8c0ef590ff1d5362adc547d31d55c88709ad1dc6dc77cd
6
+ metadata.gz: 3bbdd338bea78fe3d8890b7f581d80081828e3391b738fdbf7a507751f5fab1897764e13dea952ecb5fa2c210c2baa577fb72b1b4d5b6e3994aec49d78eea1b4
7
+ data.tar.gz: 1e514af2b34b531fbdc70337d3183aeb54d47f8127cda4145ce735724dc7a029e237e09b3c445876c413c1e3c0c660015c648bceef20661fb8b430e00d739692
data/Gemfile CHANGED
@@ -31,7 +31,7 @@ gem 'random-port', '~>0.0', require: false
31
31
  gem 'rspec-rails', '6.1.3', require: false
32
32
  gem 'rubocop', '1.65.0', require: false
33
33
  gem 'rubocop-performance', '1.21.1', require: false
34
- gem 'rubocop-rspec', '3.0.2', require: false
34
+ gem 'rubocop-rspec', '3.0.3', require: false
35
35
  gem 'simplecov', '0.22.0', require: false
36
36
  gem 'simplecov-cobertura', '2.1.0', require: false
37
37
  gem 'webmock', '3.23.1', require: false
data/Gemfile.lock CHANGED
@@ -2,17 +2,17 @@ PATH
2
2
  remote: .
3
3
  specs:
4
4
  judges (0.0.0)
5
- backtrace
5
+ backtrace (~> 0)
6
6
  concurrent-ruby (~> 1.2)
7
- factbase
7
+ factbase (~> 0)
8
8
  gli (~> 2.21)
9
- iri
10
- loog
9
+ iri (~> 0)
10
+ loog (~> 0)
11
11
  moments (~> 0.3)
12
12
  nokogiri (~> 1.10)
13
- others
14
- retries
15
- tago
13
+ others (~> 0)
14
+ retries (~> 0)
15
+ tago (~> 0)
16
16
  typhoeus (~> 1.3)
17
17
 
18
18
  GEM
@@ -216,7 +216,7 @@ GEM
216
216
  rubocop-performance (1.21.1)
217
217
  rubocop (>= 1.48.1, < 2.0)
218
218
  rubocop-ast (>= 1.31.1, < 2.0)
219
- rubocop-rspec (3.0.2)
219
+ rubocop-rspec (3.0.3)
220
220
  rubocop (~> 1.61)
221
221
  ruby-progressbar (1.13.0)
222
222
  simplecov (0.22.0)
@@ -267,7 +267,7 @@ DEPENDENCIES
267
267
  rspec-rails (= 6.1.3)
268
268
  rubocop (= 1.65.0)
269
269
  rubocop-performance (= 1.21.1)
270
- rubocop-rspec (= 3.0.2)
270
+ rubocop-rspec (= 3.0.3)
271
271
  simplecov (= 0.22.0)
272
272
  simplecov-cobertura (= 2.1.0)
273
273
  webmock (= 3.23.1)
data/bin/judges CHANGED
@@ -177,6 +177,10 @@ class App
177
177
  c.switch([:ssl], default_value: true)
178
178
  c.desc 'A unique name to use for a lock/unlock'
179
179
  c.flag([:owner], default_value: 'default', type: String)
180
+ c.desc 'Supplementary meta information about the upload (key:value)'
181
+ c.flag([:meta], type: String, multiple: true)
182
+ c.desc 'How many times to retry'
183
+ c.flag([:retries], type: Integer, default_value: 3)
180
184
  c.action do |global, options, args|
181
185
  require_relative '../lib/judges/commands/push'
182
186
  Judges::Push.new(loog).run(options, args)
@@ -199,6 +203,8 @@ class App
199
203
  c.switch([:ssl], default_value: true)
200
204
  c.desc 'A unique name to use for a lock/unlock'
201
205
  c.flag([:owner], default_value: 'default', type: String)
206
+ c.desc 'How many times to retry'
207
+ c.flag([:retries], type: Integer, default_value: 3)
202
208
  c.action do |global, options, args|
203
209
  require_relative '../lib/judges/commands/pull'
204
210
  Judges::Pull.new(loog).run(options, args)
@@ -6,7 +6,6 @@ Feature: Push
6
6
  Given I make a temp directory
7
7
  Then I run bin/judges with "--verbose eval simple.fb '(0..1000).each { $fb.insert.foo = 42 }'"
8
8
  And Exit code is zero
9
- Then I run bin/judges with "push --token 00000000-0000-0000-0000-000000000000 simple simple.fb"
9
+ Then I run bin/judges with "push --token 00000000-0000-0000-0000-000000000000 --meta a:b --meta foo:bar --meta=pages_url:https://zerocracy.github.io/zerocracy.html --meta=duration:1055 simple simple.fb"
10
10
  Then Stdout contains "Pushed"
11
11
  And Exit code is zero
12
-
data/judges.gemspec CHANGED
@@ -26,7 +26,7 @@ Gem::Specification.new do |s|
26
26
  s.required_rubygems_version = Gem::Requirement.new('>= 0') if s.respond_to? :required_rubygems_version=
27
27
  s.required_ruby_version = '>=3.2'
28
28
  s.name = 'judges'
29
- s.version = '0.15.6'
29
+ s.version = '0.17.0'
30
30
  s.license = 'MIT'
31
31
  s.summary = 'Command-Line Tool for a Factbase'
32
32
  s.description =
@@ -42,17 +42,17 @@ Gem::Specification.new do |s|
42
42
  s.executables = s.files.grep(%r{^bin/}) { |f| File.basename(f) }
43
43
  s.rdoc_options = ['--charset=UTF-8']
44
44
  s.extra_rdoc_files = ['README.md', 'LICENSE.txt']
45
- s.add_dependency 'backtrace'
45
+ s.add_dependency 'backtrace', '~>0'
46
46
  s.add_dependency 'concurrent-ruby', '~>1.2'
47
- s.add_dependency 'factbase'
47
+ s.add_dependency 'factbase', '~>0'
48
48
  s.add_dependency 'gli', '~>2.21'
49
- s.add_dependency 'iri'
50
- s.add_dependency 'loog'
49
+ s.add_dependency 'iri', '~>0'
50
+ s.add_dependency 'loog', '~>0'
51
51
  s.add_dependency 'moments', '~>0.3'
52
52
  s.add_dependency 'nokogiri', '~>1.10'
53
- s.add_dependency 'others'
54
- s.add_dependency 'retries'
55
- s.add_dependency 'tago'
53
+ s.add_dependency 'others', '~>0'
54
+ s.add_dependency 'retries', '~>0'
55
+ s.add_dependency 'tago', '~>0'
56
56
  s.add_dependency 'typhoeus', '~>1.3'
57
57
  s.metadata['rubygems_mfa_required'] = 'true'
58
58
  end
data/lib/judges/baza.rb CHANGED
@@ -24,6 +24,7 @@ require 'typhoeus'
24
24
  require 'retries'
25
25
  require 'iri'
26
26
  require 'loog'
27
+ require 'base64'
27
28
  require_relative '../judges'
28
29
  require_relative '../judges/elapsed'
29
30
 
@@ -33,7 +34,7 @@ require_relative '../judges/elapsed'
33
34
  # License:: MIT
34
35
  class Judges::Baza
35
36
  # rubocop:disable Metrics/ParameterLists
36
- def initialize(host, port, token, ssl: true, timeout: 30, loog: Loog::NULL)
37
+ def initialize(host, port, token, ssl: true, timeout: 30, retries: 3, loog: Loog::NULL)
37
38
  # rubocop:enable Metrics/ParameterLists
38
39
  @host = host
39
40
  @port = port
@@ -41,20 +42,25 @@ class Judges::Baza
41
42
  @token = token
42
43
  @timeout = timeout
43
44
  @loog = loog
45
+ @retries = retries
44
46
  end
45
47
 
46
- def push(name, data)
48
+ def push(name, data, meta)
47
49
  id = 0
50
+ hdrs = headers.merge(
51
+ 'Content-Type' => 'application/octet-stream',
52
+ 'Content-Length' => data.size
53
+ )
54
+ unless meta.empty?
55
+ hdrs = hdrs.merge('X-Zerocracy-Meta' => meta.map { |v| Base64.encode64(v).gsub("\n", '') }.join(' '))
56
+ end
48
57
  elapsed(@loog) do
49
- ret = with_retries do
58
+ ret = with_retries(max_tries: @retries) do
50
59
  checked(
51
60
  Typhoeus::Request.put(
52
61
  home.append('push').append(name).to_s,
53
62
  body: data,
54
- headers: headers.merge(
55
- 'Content-Type' => 'application/octet-stream',
56
- 'Content-Length' => data.size
57
- ),
63
+ headers: hdrs,
58
64
  connecttimeout: @timeout,
59
65
  timeout: @timeout
60
66
  )
@@ -82,7 +88,9 @@ class Judges::Baza
82
88
  request.on_body do |chunk|
83
89
  f.write(chunk)
84
90
  end
85
- request.run
91
+ with_retries(max_tries: @retries) do
92
+ request.run
93
+ end
86
94
  checked(request.response)
87
95
  end
88
96
  data = File.binread(file)
@@ -96,7 +104,7 @@ class Judges::Baza
96
104
  def finished?(id)
97
105
  finished = false
98
106
  elapsed(@loog) do
99
- ret = with_retries do
107
+ ret = with_retries(max_tries: @retries) do
100
108
  checked(
101
109
  Typhoeus::Request.get(
102
110
  home.append('finished').append(id).to_s,
@@ -113,7 +121,7 @@ class Judges::Baza
113
121
  # Lock the name.
114
122
  def lock(name, owner)
115
123
  elapsed(@loog) do
116
- with_retries do
124
+ with_retries(max_tries: @retries) do
117
125
  checked(
118
126
  Typhoeus::Request.get(
119
127
  home.append('lock').append(name).add(owner:).to_s,
@@ -128,7 +136,7 @@ class Judges::Baza
128
136
  # Unlock the name.
129
137
  def unlock(name, owner)
130
138
  elapsed(@loog) do
131
- with_retries do
139
+ with_retries(max_tries: @retries) do
132
140
  checked(
133
141
  Typhoeus::Request.get(
134
142
  home.append('unlock').append(name).add(owner:).to_s,
@@ -143,7 +151,7 @@ class Judges::Baza
143
151
  def recent(name)
144
152
  job = 0
145
153
  elapsed(@loog) do
146
- ret = with_retries do
154
+ ret = with_retries(max_tries: @retries) do
147
155
  checked(
148
156
  Typhoeus::Request.get(
149
157
  home.append('recent').append("#{name}.txt").to_s,
@@ -160,7 +168,7 @@ class Judges::Baza
160
168
  def name_exists?(name)
161
169
  exists = 0
162
170
  elapsed(@loog) do
163
- ret = with_retries do
171
+ ret = with_retries(max_tries: @retries) do
164
172
  checked(
165
173
  Typhoeus::Request.get(
166
174
  home.append('exists').append(name).to_s,
@@ -203,12 +211,17 @@ class Judges::Baza
203
211
  @loog.debug("#{log}\n #{(ret.headers || {}).map { |k, v| "#{k}: #{v}" }.join("\n ")}")
204
212
  msg =
205
213
  "Invalid response code ##{ret.code} " \
206
- "at #{mtd} #{url} (#{ret.headers['X-Zerocracy-Flash']})"
207
- if ret.code == 503
214
+ "at #{mtd} #{url} (#{ret.headers['X-Zerocracy-Flash'].inspect})"
215
+ case ret.code
216
+ when 500
208
217
  msg +=
209
218
  ', most probably it\'s an internal error on the server, ' \
219
+ 'please report this to https://github.com/zerocracy/baza'
220
+ when 503
221
+ msg +=
222
+ ", most probably it's an internal error on the server (#{ret.headers['X-Zerocracy-Failure'].inspect}), " \
210
223
  'please report this to https://github.com/yegor256/judges'
211
- elsif ret.code == 404
224
+ when 404
212
225
  msg +=
213
226
  ', most probably you are trying to reach a wrong server, which doesn\'t ' \
214
227
  'have the URL that it is expected to have'
@@ -42,7 +42,8 @@ class Judges::Pull
42
42
  opts['host'], opts['port'].to_i, opts['token'],
43
43
  ssl: opts['ssl'],
44
44
  timeout: (opts['timeout'] || 30).to_i,
45
- loog: @loog
45
+ loog: @loog,
46
+ retries: (opts['retries'] || 3).to_i
46
47
  )
47
48
  name = args[0]
48
49
  elapsed(@loog) do
@@ -43,11 +43,12 @@ class Judges::Push
43
43
  opts['host'], opts['port'].to_i, opts['token'],
44
44
  ssl: opts['ssl'],
45
45
  timeout: (opts['timeout'] || 30).to_i,
46
- loog: @loog
46
+ loog: @loog,
47
+ retries: (opts['retries'] || 3).to_i
47
48
  )
48
49
  elapsed(@loog) do
49
50
  baza.lock(name, opts['owner'])
50
- id = baza.push(name, fb.export)
51
+ id = baza.push(name, fb.export, opts['meta'] || [])
51
52
  baza.unlock(name, opts['owner'])
52
53
  throw :"Pushed #{fb.size} facts, job ID is #{id}"
53
54
  end
data/lib/judges.rb CHANGED
@@ -25,5 +25,5 @@
25
25
  # Copyright:: Copyright (c) 2024 Yegor Bugayenko
26
26
  # License:: MIT
27
27
  module Judges
28
- VERSION = '0.15.6'
28
+ VERSION = '0.17.0'
29
29
  end
data/test/test_baza.rb CHANGED
@@ -40,7 +40,7 @@ class TestBaza < Minitest::Test
40
40
  )
41
41
  assert_equal(
42
42
  42,
43
- Judges::Baza.new('example.org', 443, '000').push('simple', 'hello, world!')
43
+ Judges::Baza.new('example.org', 443, '000').push('simple', 'hello, world!', [])
44
44
  )
45
45
  end
46
46
 
@@ -76,6 +76,37 @@ class TestBaza < Minitest::Test
76
76
  end
77
77
 
78
78
  def test_real_http
79
+ req = with_http_server(200, 'yes') do |baza|
80
+ baza.name_exists?('simple')
81
+ end
82
+ assert(req.include?("User-Agent: judges #{Judges::VERSION}\r\n"))
83
+ end
84
+
85
+ def test_push_with_meta
86
+ req = with_http_server(200, 'yes') do |baza|
87
+ baza.push('simple', 'hello, world!', ['boom!', 'хей!'])
88
+ end
89
+ assert(req.include?("X-Zerocracy-Meta: Ym9vbSE= 0YXQtdC5IQ==\r\n"))
90
+ end
91
+
92
+ def test_push_with_big_meta
93
+ req = with_http_server(200, 'yes') do |baza|
94
+ baza.push(
95
+ 'simple',
96
+ 'hello, world!',
97
+ [
98
+ 'pages_url:https://zerocracy.github.io/zerocracy.html',
99
+ 'others:https://zerocracy.github.io/zerocracy.html',
100
+ 'duration:59595'
101
+ ]
102
+ )
103
+ end
104
+ assert(req.join.include?('X-Zerocracy-Meta: '))
105
+ end
106
+
107
+ private
108
+
109
+ def with_http_server(code, response)
79
110
  WebMock.enable_net_connect!
80
111
  req = []
81
112
  host = '127.0.0.1'
@@ -88,12 +119,12 @@ class TestBaza < Minitest::Test
88
119
  break if line == "\r\n"
89
120
  req << line
90
121
  end
91
- socket.puts "HTTP/1.1 200 OK\r\nContent-Length: 3\r\n\r\nyes"
122
+ socket.puts "HTTP/1.1 #{code} OK\r\nContent-Length: #{response.length}\r\n\r\n#{response}"
92
123
  socket.close
93
124
  end
94
- Judges::Baza.new(host, port, '0000', ssl: false, timeout: 1).name_exists?('simple')
125
+ yield Judges::Baza.new(host, port, '0000', ssl: false, timeout: 1)
95
126
  t.join
96
127
  end
97
- assert(req.include?("User-Agent: judges #{Judges::VERSION}\r\n"))
128
+ req
98
129
  end
99
130
  end
metadata CHANGED
@@ -1,27 +1,27 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: judges
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.15.6
4
+ version: 0.17.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Yegor Bugayenko
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-07-11 00:00:00.000000000 Z
11
+ date: 2024-07-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: backtrace
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ">="
17
+ - - "~>"
18
18
  - !ruby/object:Gem::Version
19
19
  version: '0'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - ">="
24
+ - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0'
27
27
  - !ruby/object:Gem::Dependency
@@ -42,14 +42,14 @@ dependencies:
42
42
  name: factbase
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - ">="
45
+ - - "~>"
46
46
  - !ruby/object:Gem::Version
47
47
  version: '0'
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - ">="
52
+ - - "~>"
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
55
  - !ruby/object:Gem::Dependency
@@ -70,28 +70,28 @@ dependencies:
70
70
  name: iri
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
- - - ">="
73
+ - - "~>"
74
74
  - !ruby/object:Gem::Version
75
75
  version: '0'
76
76
  type: :runtime
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
- - - ">="
80
+ - - "~>"
81
81
  - !ruby/object:Gem::Version
82
82
  version: '0'
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: loog
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
- - - ">="
87
+ - - "~>"
88
88
  - !ruby/object:Gem::Version
89
89
  version: '0'
90
90
  type: :runtime
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
- - - ">="
94
+ - - "~>"
95
95
  - !ruby/object:Gem::Version
96
96
  version: '0'
97
97
  - !ruby/object:Gem::Dependency
@@ -126,42 +126,42 @@ dependencies:
126
126
  name: others
127
127
  requirement: !ruby/object:Gem::Requirement
128
128
  requirements:
129
- - - ">="
129
+ - - "~>"
130
130
  - !ruby/object:Gem::Version
131
131
  version: '0'
132
132
  type: :runtime
133
133
  prerelease: false
134
134
  version_requirements: !ruby/object:Gem::Requirement
135
135
  requirements:
136
- - - ">="
136
+ - - "~>"
137
137
  - !ruby/object:Gem::Version
138
138
  version: '0'
139
139
  - !ruby/object:Gem::Dependency
140
140
  name: retries
141
141
  requirement: !ruby/object:Gem::Requirement
142
142
  requirements:
143
- - - ">="
143
+ - - "~>"
144
144
  - !ruby/object:Gem::Version
145
145
  version: '0'
146
146
  type: :runtime
147
147
  prerelease: false
148
148
  version_requirements: !ruby/object:Gem::Requirement
149
149
  requirements:
150
- - - ">="
150
+ - - "~>"
151
151
  - !ruby/object:Gem::Version
152
152
  version: '0'
153
153
  - !ruby/object:Gem::Dependency
154
154
  name: tago
155
155
  requirement: !ruby/object:Gem::Requirement
156
156
  requirements:
157
- - - ">="
157
+ - - "~>"
158
158
  - !ruby/object:Gem::Version
159
159
  version: '0'
160
160
  type: :runtime
161
161
  prerelease: false
162
162
  version_requirements: !ruby/object:Gem::Requirement
163
163
  requirements:
164
- - - ">="
164
+ - - "~>"
165
165
  - !ruby/object:Gem::Version
166
166
  version: '0'
167
167
  - !ruby/object:Gem::Dependency