Class: Judges::Baza

Inherits:
Object show all
Defined in:
lib/judges/baza.rb

Overview

Interface to the API of zerocracy.com.

You make an instance of this class and then call one of its methods. The object will make HTTP request to www.zerocracy.com and interpret the results returned.

Author

Yegor Bugayenko ([email protected])

Copyright

Copyright © 2024 Yegor Bugayenko

License

MIT

Instance Method Summary collapse

Constructor Details

#initialize(host, port, token, ssl: true, timeout: 30, retries: 3, loog: Loog::NULL) ⇒ Baza



41
42
43
44
45
46
47
48
49
# File 'lib/judges/baza.rb', line 41

def initialize(host, port, token, ssl: true, timeout: 30, retries: 3, loog: Loog::NULL)
  @host = host
  @port = port
  @ssl = ssl
  @token = token
  @timeout = timeout
  @loog = loog
  @retries = retries
end

Instance Method Details

#finished?(id) ⇒ Boolean

The job with this ID is finished already?



117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
# File 'lib/judges/baza.rb', line 117

def finished?(id)
  finished = false
  elapsed(@loog) do
    ret = with_retries(max_tries: @retries) do
      checked(
        Typhoeus::Request.get(
          home.append('finished').append(id).to_s,
          headers:
        )
      )
    end
    finished = ret.body == 'yes'
    throw :"The job ##{id} is #{finished ? '' : 'not yet '}finished at #{@host}"
  end
  finished
end

#lock(name, owner) ⇒ Object

Lock the name.



137
138
139
140
141
142
143
144
145
146
147
148
149
# File 'lib/judges/baza.rb', line 137

def lock(name, owner)
  elapsed(@loog) do
    with_retries(max_tries: @retries) do
      checked(
        Typhoeus::Request.get(
          home.append('lock').append(name).add(owner:).to_s,
          headers:
        ),
        302
      )
    end
  end
end

#name_exists?(name) ⇒ Boolean

Check whether the name of the job exists on the server.



191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
# File 'lib/judges/baza.rb', line 191

def name_exists?(name)
  exists = 0
  elapsed(@loog) do
    ret = with_retries(max_tries: @retries) do
      checked(
        Typhoeus::Request.get(
          home.append('exists').append(name).to_s,
          headers:
        )
      )
    end
    exists = ret.body == 'yes'
    throw :"The name \"#{name}\" #{exists ? 'exists' : "doesn't exist"} at #{@host}"
  end
  exists
end

#pull(id) ⇒ Bytes

Pull factbase from the server.



86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
# File 'lib/judges/baza.rb', line 86

def pull(id)
  data = 0
  elapsed(@loog) do
    Tempfile.open do |file|
      File.open(file, 'wb') do |f|
        request = Typhoeus::Request.new(
          home.append('pull').append("#{id}.fb").to_s,
          headers: headers.merge(
            'Accept' => 'application/octet-stream'
          ),
          connecttimeout: @timeout,
          timeout: @timeout
        )
        request.on_body do |chunk|
          f.write(chunk)
        end
        with_retries(max_tries: @retries) do
          request.run
        end
        checked(request.response)
      end
      data = File.binread(file)
      throw :"Pulled #{data.size} bytes of job ##{id} factbase at #{@host}"
    end
  end
  data
end

#push(name, data, meta) ⇒ Integer

Push factbase to the server.



56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
# File 'lib/judges/baza.rb', line 56

def push(name, data, meta)
  id = 0
  hdrs = headers.merge(
    'Content-Type' => 'application/octet-stream',
    'Content-Length' => data.size
  )
  unless meta.empty?
    hdrs = hdrs.merge('X-Zerocracy-Meta' => meta.map { |v| Base64.encode64(v).gsub("\n", '') }.join(' '))
  end
  elapsed(@loog) do
    ret = with_retries(max_tries: @retries) do
      checked(
        Typhoeus::Request.put(
          home.append('push').append(name).to_s,
          body: data,
          headers: hdrs,
          connecttimeout: @timeout,
          timeout: @timeout
        )
      )
    end
    id = ret.body.to_i
    throw :"Pushed #{data.size} bytes to #{@host}, job ID is ##{id}"
  end
  id
end

#recent(name) ⇒ Integer

Get the ID of the job by the name.



171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
# File 'lib/judges/baza.rb', line 171

def recent(name)
  job = 0
  elapsed(@loog) do
    ret = with_retries(max_tries: @retries) do
      checked(
        Typhoeus::Request.get(
          home.append('recent').append("#{name}.txt").to_s,
          headers:
        )
      )
    end
    job = ret.body.to_i
    throw :"The recent \"#{name}\" job's ID is ##{job} at #{@host}"
  end
  job
end

#unlock(name, owner) ⇒ Object

Unlock the name.



154
155
156
157
158
159
160
161
162
163
164
165
166
# File 'lib/judges/baza.rb', line 154

def unlock(name, owner)
  elapsed(@loog) do
    with_retries(max_tries: @retries) do
      checked(
        Typhoeus::Request.get(
          home.append('unlock').append(name).add(owner:).to_s,
          headers:
        ),
        302
      )
    end
  end
end