judges 0.15.6 → 0.17.0

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