baza.rb 0.0.1 → 0.0.2

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: d4be56cc9f4d1ff997e1cfd2d933a61d12e6967218efd73020929ee5a799f94f
4
- data.tar.gz: 5e63ac9c9a4f1dcd418aca195edaa7f41567d9ce038bc94527e6937e02e01ba7
3
+ metadata.gz: 014c248d64a458634ae5e0230dbffb3efe583b3290ba939b8dce3ed1f91f502b
4
+ data.tar.gz: 735858245c3ab0bf9d362d325a47e5304813a3b281e4cc78cafaf6ee066086cb
5
5
  SHA512:
6
- metadata.gz: 67c9cfaedc2d58204e98a5a743a12427688fc18942833d60ddc7b740a283540f34daf73afbc3a31735e46a6c03dd4aee6bf95d07481750f3ddb3c3f93fb3d3c2
7
- data.tar.gz: 6141cbec72e2f26f93848bd3316f3cee5c3b41172817a40b43b1acc636fcd3f28b1fa43bfea90bb2ec6671cea41fd552732f1d74fe13d8b31cfa69d97d601c29
6
+ metadata.gz: da30b50601a6354138e593fffc3680cd2648b6c7b9eeb62d949301ef72e89c9446643f9b15dbca0b252d4e062af8a4b63f5ab3b71cf1ab2abad632427c7f7254
7
+ data.tar.gz: 3b394b41273005c73431ca4e191e6f3a653db0498504d59422ef5dacb4d8b8bc59d5cc4ee8c890a79cd2d05100109e8e6151e9f82686ede138bb0f00109bb0bd
@@ -31,7 +31,7 @@ jobs:
31
31
  name: test
32
32
  strategy:
33
33
  matrix:
34
- os: [ubuntu-24.04, macos-12, windows-2022]
34
+ os: [ubuntu-24.04, macos-12]
35
35
  ruby: [3.3]
36
36
  runs-on: ${{ matrix.os }}
37
37
  steps:
data/Gemfile.lock CHANGED
@@ -10,37 +10,40 @@ PATH
10
10
  iri (> 0)
11
11
  loog (> 0)
12
12
  retries (~> 0)
13
+ tago (~> 0)
13
14
  typhoeus (~> 1.3)
14
15
 
15
16
  GEM
16
17
  remote: https://rubygems.org/
17
18
  specs:
18
- actionpack (7.1.3.4)
19
- actionview (= 7.1.3.4)
20
- activesupport (= 7.1.3.4)
19
+ actionpack (7.2.0)
20
+ actionview (= 7.2.0)
21
+ activesupport (= 7.2.0)
21
22
  nokogiri (>= 1.8.5)
22
23
  racc
23
- rack (>= 2.2.4)
24
+ rack (>= 2.2.4, < 3.2)
24
25
  rack-session (>= 1.0.1)
25
26
  rack-test (>= 0.6.3)
26
27
  rails-dom-testing (~> 2.2)
27
28
  rails-html-sanitizer (~> 1.6)
28
- actionview (7.1.3.4)
29
- activesupport (= 7.1.3.4)
29
+ useragent (~> 0.16)
30
+ actionview (7.2.0)
31
+ activesupport (= 7.2.0)
30
32
  builder (~> 3.1)
31
33
  erubi (~> 1.11)
32
34
  rails-dom-testing (~> 2.2)
33
35
  rails-html-sanitizer (~> 1.6)
34
- activesupport (7.1.3.4)
36
+ activesupport (7.2.0)
35
37
  base64
36
38
  bigdecimal
37
- concurrent-ruby (~> 1.0, >= 1.0.2)
39
+ concurrent-ruby (~> 1.0, >= 1.3.1)
38
40
  connection_pool (>= 2.2.5)
39
41
  drb
40
42
  i18n (>= 1.6, < 2)
43
+ logger (>= 1.4.2)
41
44
  minitest (>= 5.1)
42
- mutex_m
43
- tzinfo (~> 2.0)
45
+ securerandom (>= 0.3)
46
+ tzinfo (~> 2.0, >= 2.0.5)
44
47
  addressable (2.8.7)
45
48
  public_suffix (>= 2.0.2, < 7.0)
46
49
  ansi (1.5.0)
@@ -49,7 +52,7 @@ GEM
49
52
  base64 (0.2.0)
50
53
  bigdecimal (3.1.8)
51
54
  builder (3.3.0)
52
- concurrent-ruby (1.3.3)
55
+ concurrent-ruby (1.3.4)
53
56
  connection_pool (2.4.1)
54
57
  crack (1.0.0)
55
58
  bigdecimal
@@ -108,7 +111,6 @@ GEM
108
111
  minitest (>= 5.0)
109
112
  ruby-progressbar
110
113
  multipart-post (2.4.1)
111
- mutex_m (0.2.0)
112
114
  net-http (0.4.1)
113
115
  uri
114
116
  net-ping (2.0.8)
@@ -144,10 +146,10 @@ GEM
144
146
  rails-html-sanitizer (1.6.0)
145
147
  loofah (~> 2.21)
146
148
  nokogiri (~> 1.14)
147
- railties (7.1.3.4)
148
- actionpack (= 7.1.3.4)
149
- activesupport (= 7.1.3.4)
150
- irb
149
+ railties (7.2.0)
150
+ actionpack (= 7.2.0)
151
+ activesupport (= 7.2.0)
152
+ irb (~> 1.13)
151
153
  rackup (>= 1.0.0)
152
154
  rake (>= 12.2)
153
155
  thor (~> 1.0, >= 1.2.2)
@@ -199,6 +201,7 @@ GEM
199
201
  rubocop-rspec (3.0.4)
200
202
  rubocop (~> 1.61)
201
203
  ruby-progressbar (1.13.0)
204
+ securerandom (0.3.1)
202
205
  simplecov (0.22.0)
203
206
  docile (~> 1.1)
204
207
  simplecov-html (~> 0.11)
@@ -218,6 +221,7 @@ GEM
218
221
  concurrent-ruby (~> 1.0)
219
222
  unicode-display_width (2.5.0)
220
223
  uri (0.13.0)
224
+ useragent (0.16.10)
221
225
  webmock (3.23.1)
222
226
  addressable (>= 2.8.0)
223
227
  crack (>= 0.3.2)
data/baza.rb.gemspec CHANGED
@@ -31,7 +31,9 @@ Gem::Specification.new do |s|
31
31
  s.license = 'MIT'
32
32
  s.summary = 'Zerocracy API Ruby Client'
33
33
  s.description =
34
- 'It is a Ruby client for Zerocracy API'
34
+ 'It is a Ruby client for Zerocracy API, allowing you to check your jobs ' \
35
+ 'statuses, upload and download binaries, lock/unlock them, manage durables, ' \
36
+ 'and do everything else that is possible to do via the HTTP API.'
35
37
  s.authors = ['Yegor Bugayenko']
36
38
  s.email = 'yegor256@gmail.com'
37
39
  s.homepage = 'http://github.com/zerocracy/baza.rb'
@@ -46,6 +48,7 @@ Gem::Specification.new do |s|
46
48
  s.add_dependency 'iri', '>0'
47
49
  s.add_dependency 'loog', '>0'
48
50
  s.add_dependency 'retries', '~>0'
51
+ s.add_dependency 'tago', '~>0'
49
52
  s.add_dependency 'typhoeus', '~>1.3'
50
53
  s.metadata['rubygems_mfa_required'] = 'true'
51
54
  end
data/lib/baza/version.rb CHANGED
@@ -26,5 +26,5 @@
26
26
  # Copyright:: Copyright (c) 2024 Yegor Bugayenko
27
27
  # License:: MIT
28
28
  class Baza
29
- VERSION = '0.0.1'
29
+ VERSION = '0.0.2'
30
30
  end
data/lib/baza.rb CHANGED
@@ -25,7 +25,8 @@ require 'retries'
25
25
  require 'iri'
26
26
  require 'loog'
27
27
  require 'base64'
28
- require_relative 'baza/elapsed'
28
+ require 'tago'
29
+ require_relative 'baza/version'
29
30
 
30
31
  # Interface to the API of zerocracy.com.
31
32
  #
@@ -37,8 +38,6 @@ require_relative 'baza/elapsed'
37
38
  # Copyright:: Copyright (c) 2024 Yegor Bugayenko
38
39
  # License:: MIT
39
40
  class Baza
40
- VERSION = '0.0.0'
41
-
42
41
  def initialize(host, port, token, ssl: true, timeout: 30, retries: 3, loog: Loog::NULL, compression: true)
43
42
  @host = host
44
43
  @port = port
@@ -96,6 +95,7 @@ class Baza
96
95
  File.open(file, 'wb') do |f|
97
96
  request = Typhoeus::Request.new(
98
97
  home.append('pull').append("#{id}.fb").to_s,
98
+ method: :get,
99
99
  headers: headers.merge(
100
100
  'Accept' => 'application/octet-stream'
101
101
  ),
@@ -154,7 +154,7 @@ class Baza
154
154
  )
155
155
  end
156
156
  stdout = ret.body
157
- throw :"The stdout of the job ##{id} has #{stdout.split("\n")} lines"
157
+ throw :"The stdout of the job ##{id} has #{stdout.split("\n").count} lines"
158
158
  end
159
159
  stdout
160
160
  end
@@ -194,6 +194,7 @@ class Baza
194
194
  302
195
195
  )
196
196
  end
197
+ throw :"Job name '#{name}' locked at #{@host}"
197
198
  end
198
199
  end
199
200
 
@@ -211,6 +212,7 @@ class Baza
211
212
  302
212
213
  )
213
214
  end
215
+ throw :"Job name '#{name}' unlocked at #{@host}"
214
216
  end
215
217
  end
216
218
 
@@ -256,6 +258,118 @@ class Baza
256
258
  exists
257
259
  end
258
260
 
261
+ # Place a single durable.
262
+ # @param [String] jname The name of the job on the server
263
+ # @param [String] file The file name
264
+ def durable_place(jname, file)
265
+ id = nil
266
+ elapsed(@loog) do
267
+ ret =
268
+ with_retries(max_tries: @retries) do
269
+ checked(
270
+ Typhoeus::Request.post(
271
+ home.append('durables').append('place').to_s,
272
+ body: {
273
+ 'jname' => jname,
274
+ 'file' => File.basename(file),
275
+ 'zip' => File.open(file, 'r')
276
+ },
277
+ headers:,
278
+ connecttimeout: @timeout,
279
+ timeout: @timeout
280
+ ),
281
+ 302
282
+ )
283
+ end
284
+ id = ret.headers['X-Zerocracy-DurableId'].to_i
285
+ throw :"Durable ##{id} placed for job \"#{jname}\" at #{@host}"
286
+ end
287
+ id
288
+ end
289
+
290
+ # Save a single durable from local file to server.
291
+ # @param [Integer] id The ID of the durable
292
+ # @param [String] file The file to upload
293
+ def durable_save(id, file)
294
+ elapsed(@loog) do
295
+ with_retries(max_tries: @retries) do
296
+ checked(
297
+ Typhoeus::Request.put(
298
+ home.append('durables').append(id).to_s,
299
+ body: File.binread(file),
300
+ headers:,
301
+ connecttimeout: @timeout,
302
+ timeout: @timeout
303
+ )
304
+ )
305
+ end
306
+ throw :"Durable ##{id} saved #{File.size(file)} bytes to #{@host}"
307
+ end
308
+ end
309
+
310
+ # Load a single durable from server to local file.
311
+ # @param [Integer] id The ID of the durable
312
+ # @param [String] file The file to upload
313
+ def durable_load(id, file)
314
+ elapsed(@loog) do
315
+ File.open(file, 'wb') do |f|
316
+ request = Typhoeus::Request.new(
317
+ home.append('durables').append(id).to_s,
318
+ method: :get,
319
+ headers: headers.merge(
320
+ 'Accept' => 'application/octet-stream'
321
+ ),
322
+ connecttimeout: @timeout,
323
+ timeout: @timeout
324
+ )
325
+ request.on_body do |chunk|
326
+ f.write(chunk)
327
+ end
328
+ with_retries(max_tries: @retries) do
329
+ request.run
330
+ end
331
+ checked(request.response)
332
+ end
333
+ throw :"Durable ##{id} loaded #{File.size(file)} bytes from #{@host}"
334
+ end
335
+ end
336
+
337
+ # Lock a single durable.
338
+ # @param [Integer] id The ID of the durable
339
+ # @param [String] owner The owner of the lock
340
+ def durable_lock(id, owner)
341
+ elapsed(@loog) do
342
+ with_retries(max_tries: @retries) do
343
+ checked(
344
+ Typhoeus::Request.get(
345
+ home.append('durables').append(id).append('lock').add(owner:).to_s,
346
+ headers:
347
+ ),
348
+ 302
349
+ )
350
+ end
351
+ throw :"Durable ##{id} locked at #{@host}"
352
+ end
353
+ end
354
+
355
+ # Unlock a single durable.
356
+ # @param [Integer] id The ID of the durable
357
+ # @param [String] owner The owner of the lock
358
+ def durable_unlock(id, owner)
359
+ elapsed(@loog) do
360
+ with_retries(max_tries: @retries) do
361
+ checked(
362
+ Typhoeus::Request.get(
363
+ home.append('durables').append(id).append('unlock').add(owner:).to_s,
364
+ headers:
365
+ ),
366
+ 302
367
+ )
368
+ end
369
+ throw :"Durable ##{id} unlocked at #{@host}"
370
+ end
371
+ end
372
+
259
373
  private
260
374
 
261
375
  def headers
@@ -280,6 +394,17 @@ class Baza
280
394
  params.merge(body:, headers:)
281
395
  end
282
396
 
397
+ def elapsed(loog)
398
+ start = Time.now
399
+ begin
400
+ yield
401
+ rescue UncaughtThrowError => e
402
+ tag = e.tag
403
+ throw e unless tag.is_a?(Symbol)
404
+ loog.info("#{tag} in #{start.ago}")
405
+ end
406
+ end
407
+
283
408
  def gzip(data)
284
409
  ''.dup.tap do |result|
285
410
  io = StringIO.new(result)
data/test/test_baza.rb CHANGED
@@ -40,7 +40,7 @@ class TestBaza < Minitest::Test
40
40
  TOKEN = '00000000-0000-0000-0000-000000000000'
41
41
  HOST = 'api.zerocracy.com'
42
42
  PORT = 443
43
- LIVE = Baza.new(HOST, PORT, TOKEN)
43
+ LIVE = Baza.new(HOST, PORT, TOKEN, loog: Loog::VERBOSE)
44
44
 
45
45
  def test_live_recent_check
46
46
  WebMock.enable_net_connect!
@@ -110,6 +110,33 @@ class TestBaza < Minitest::Test
110
110
  assert(!LIVE.unlock(n, owner).nil?)
111
111
  end
112
112
 
113
+ def test_live_durable_lock_unlock
114
+ WebMock.enable_net_connect!
115
+ skip unless we_are_online
116
+ Dir.mktmpdir do |dir|
117
+ file = File.join(dir, 'test.bin')
118
+ File.binwrite(file, 'hello')
119
+ id = LIVE.durable_place(fake_name, file)
120
+ owner = 'judges teesting'
121
+ LIVE.durable_lock(id, owner)
122
+ LIVE.durable_load(id, file)
123
+ LIVE.durable_save(id, file)
124
+ LIVE.durable_unlock(id, owner)
125
+ end
126
+ end
127
+
128
+ def test_durable_place
129
+ WebMock.disable_net_connect!
130
+ stub_request(:post, 'https://example.org/durables/place').to_return(
131
+ status: 302, headers: { 'X-Zerocracy-DurableId' => '42' }
132
+ )
133
+ Dir.mktmpdir do |dir|
134
+ file = File.join(dir, 'test.bin')
135
+ File.binwrite(file, 'hello')
136
+ assert_equal(42, Baza.new('example.org', 443, '000').durable_place('simple', file))
137
+ end
138
+ end
139
+
113
140
  def test_simple_push
114
141
  WebMock.disable_net_connect!
115
142
  stub_request(:put, 'https://example.org/push/simple').to_return(
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: baza.rb
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
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-08-09 00:00:00.000000000 Z
11
+ date: 2024-08-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: backtrace
@@ -122,6 +122,20 @@ dependencies:
122
122
  - - "~>"
123
123
  - !ruby/object:Gem::Version
124
124
  version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: tago
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - "~>"
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :runtime
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - "~>"
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
125
139
  - !ruby/object:Gem::Dependency
126
140
  name: typhoeus
127
141
  requirement: !ruby/object:Gem::Requirement
@@ -136,7 +150,9 @@ dependencies:
136
150
  - - "~>"
137
151
  - !ruby/object:Gem::Version
138
152
  version: '1.3'
139
- description: It is a Ruby client for Zerocracy API
153
+ description: It is a Ruby client for Zerocracy API, allowing you to check your jobs
154
+ statuses, upload and download binaries, lock/unlock them, manage durables, and do
155
+ everything else that is possible to do via the HTTP API.
140
156
  email: yegor256@gmail.com
141
157
  executables: []
142
158
  extensions: []
@@ -167,7 +183,6 @@ files:
167
183
  - Rakefile
168
184
  - baza.rb.gemspec
169
185
  - lib/baza.rb
170
- - lib/baza/elapsed.rb
171
186
  - lib/baza/version.rb
172
187
  - renovate.json
173
188
  - test/test__helper.rb
data/lib/baza/elapsed.rb DELETED
@@ -1,34 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # Copyright (c) 2024 Zerocracy
4
- #
5
- # Permission is hereby granted, free of charge, to any person obtaining a copy
6
- # of this software and associated documentation files (the 'Software'), to deal
7
- # in the Software without restriction, including without limitation the rights
8
- # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- # copies of the Software, and to permit persons to whom the Software is
10
- # furnished to do so, subject to the following conditions:
11
- #
12
- # The above copyright notice and this permission notice shall be included in all
13
- # copies or substantial portions of the Software.
14
- #
15
- # THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- # SOFTWARE.
22
-
23
- require 'tago'
24
-
25
- def elapsed(loog)
26
- start = Time.now
27
- begin
28
- yield
29
- rescue UncaughtThrowError => e
30
- tag = e.tag
31
- throw e unless tag.is_a?(Symbol)
32
- loog.info("#{tag} in #{start.ago}")
33
- end
34
- end