kittyverse 0.4.2 → 0.4.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/kittyverse/api/client.rb +88 -11
- data/lib/kittyverse/api/versions.rb +14 -0
- data/lib/kittyverse/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 625692bc57c7cf12b02b4a08f18029b2fdbf2df8
|
4
|
+
data.tar.gz: b7e4e3d49b1fa36c78d93bd535a34533d6caf0bb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4bc09276dc61fb29354e1af34ff88e6221b4c6a268d1e92fdaab8c35ce9c621e60afad1baaad5c52f8ce6683b8dbf6fd8a0b5fa6696b6f279639fd3090e78e85
|
7
|
+
data.tar.gz: 0ec559282248dcc5c17ff83d984d30e7ea306c393b74c6b3cea39e433be76c9a4c5fd7a4eb9c862e58cdb4206c369ed964dd0708e1b04f58731c296d179a3554
|
@@ -2,13 +2,71 @@
|
|
2
2
|
|
3
3
|
module Kitties
|
4
4
|
|
5
|
+
class Error < StandardError
|
6
|
+
end
|
7
|
+
|
8
|
+
####
|
9
|
+
# todo/check:
|
10
|
+
# rename to HttpRequestError or similar??
|
11
|
+
# use "common" error class - why? why not?
|
12
|
+
class HttpError < Error
|
13
|
+
attr_reader :code, :message
|
14
|
+
|
15
|
+
def initialize( code, message )
|
16
|
+
@code, @message = code, message
|
17
|
+
end
|
18
|
+
|
19
|
+
def to_s
|
20
|
+
"HTTP request failed (NOK) => #{@code} #{@message}"
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
|
25
|
+
class Response ## track last response
|
26
|
+
attr_accessor :code, :message,
|
27
|
+
:headers, :body
|
28
|
+
|
29
|
+
def initialize( code, message, headers, body )
|
30
|
+
@code, @message, @headers, @body = code, message, headers, body
|
31
|
+
end
|
32
|
+
|
33
|
+
## ratelimit convenience helpers (for headers)
|
34
|
+
## note: all values of headers are arrays e.g.:
|
35
|
+
## {"x-ratelimit-limit"=>["20"],
|
36
|
+
## "x-ratelimit-remaining"=>["19"],
|
37
|
+
## "x-ratelimit-reset"=>["1558206970"],
|
38
|
+
## "content-length"=>["776"], ... }
|
39
|
+
|
40
|
+
def ratelimit_limit
|
41
|
+
limit = @headers['x-ratelimit-limit']
|
42
|
+
limit ? limit[0].to_i : nil
|
43
|
+
end
|
44
|
+
|
45
|
+
def ratelimit_remaining
|
46
|
+
remaining = @headers['x-ratelimit-remaining']
|
47
|
+
remaining ? remaining[0].to_i : nil
|
48
|
+
end
|
49
|
+
|
50
|
+
def ratelimit_reset?
|
51
|
+
## x-ratelimit-reset => 1558079593 ## - assume it's unix epoch time
|
52
|
+
reset = @headers['x-ratelimit-reset']
|
53
|
+
reset ? (reset[0].to_i < Time.now.to_i) : true ## always assume true (unlimited requests)
|
54
|
+
end
|
55
|
+
|
56
|
+
def ratelimit_reset
|
57
|
+
## x-ratelimit-reset => 1558079593 ## - assume it's unix epoch time
|
58
|
+
reset = @headers['x-ratelimit-reset']
|
59
|
+
reset ? Time.at(reset[0].to_i) : nil
|
60
|
+
end
|
61
|
+
end ## class Response (used for tracking last(_response))
|
62
|
+
|
63
|
+
|
5
64
|
|
6
65
|
class Client
|
7
66
|
|
8
67
|
##
|
9
68
|
## todo: add (optional) close with @http.close - why? why not?
|
10
69
|
|
11
|
-
|
12
70
|
def initialize( base_uri:, token: nil )
|
13
71
|
uri = URI.parse( base_uri )
|
14
72
|
@http = Net::HTTP.new( uri.host, uri.port )
|
@@ -23,7 +81,16 @@ def initialize( base_uri:, token: nil )
|
|
23
81
|
@token = token
|
24
82
|
end # method initialize
|
25
83
|
|
26
|
-
|
84
|
+
|
85
|
+
|
86
|
+
def get( service, **params )
|
87
|
+
|
88
|
+
## add url-encoded query string from params hash e.g. ?limit=100&type=sale
|
89
|
+
unless params.empty?
|
90
|
+
query = URI.encode_www_form( params )
|
91
|
+
service += "?#{query}"
|
92
|
+
end
|
93
|
+
|
27
94
|
puts "GET #{service}"
|
28
95
|
|
29
96
|
request_uri = if @base_request_uri == "/"
|
@@ -32,25 +99,24 @@ def get( service )
|
|
32
99
|
"#{@base_request_uri}#{service}" ## e.g. add /v1 etc.
|
33
100
|
end
|
34
101
|
|
35
|
-
|
102
|
+
request_headers = if @token
|
36
103
|
{ "x-api-token" => @token }
|
37
104
|
else
|
38
105
|
{}
|
39
106
|
end
|
40
107
|
|
41
|
-
req = Net::HTTP::Get.new( request_uri,
|
108
|
+
req = Net::HTTP::Get.new( request_uri, request_headers )
|
42
109
|
|
43
110
|
res = @http.request(req)
|
44
111
|
|
45
|
-
##
|
46
|
-
## throw exception of fail
|
47
|
-
|
112
|
+
headers = res.to_hash ## get all response headers
|
48
113
|
|
49
114
|
if Kitties.debug?
|
50
115
|
# Iterate all response headers.
|
51
|
-
res.each_header do |key, value|
|
52
|
-
|
53
|
-
end
|
116
|
+
# res.each_header do |key, value|
|
117
|
+
# p "#{key} => #{value}"
|
118
|
+
# end
|
119
|
+
pp headers
|
54
120
|
# => "content-type => application/json; charset=utf-8"
|
55
121
|
# => "x-ratelimit-limit => 20"
|
56
122
|
# => "x-ratelimit-remaining => 19"
|
@@ -61,10 +127,21 @@ def get( service )
|
|
61
127
|
body = res.read_body
|
62
128
|
## pp body
|
63
129
|
|
130
|
+
## track last response
|
131
|
+
Kitties.last_response = Response.new( res.code,
|
132
|
+
res.message,
|
133
|
+
headers,
|
134
|
+
body )
|
135
|
+
|
136
|
+
if res.code != '200'
|
137
|
+
raise HttpError.new( res.code, res.message )
|
138
|
+
end
|
139
|
+
|
140
|
+
|
64
141
|
json = JSON.parse( body ) ## use just body (any difference?) - why? why not?
|
65
142
|
## pp json
|
66
143
|
json
|
67
|
-
end #
|
144
|
+
end # method get
|
68
145
|
|
69
146
|
end ## class Client
|
70
147
|
|
@@ -30,6 +30,10 @@ def self.debug?() configuration.debug; end
|
|
30
30
|
def self.debug=(value) configuration.debug = value; end
|
31
31
|
|
32
32
|
|
33
|
+
## track last response
|
34
|
+
def self.last_response() @last_response; end
|
35
|
+
def self.last_response=(value) @last_response = value; end
|
36
|
+
|
33
37
|
|
34
38
|
|
35
39
|
module V0
|
@@ -40,6 +44,14 @@ class Client < ::Kitties::Client
|
|
40
44
|
|
41
45
|
def get_cattributes() get('/cattributes'); end
|
42
46
|
def get_kitty( id ) get("/kitties/#{id}"); end ## use get_kitty_by_id - why? why not?
|
47
|
+
alias_method :get_kitten, :get_kitty
|
48
|
+
|
49
|
+
def get_kitties( **params ) get( '/kitties', **params ); end
|
50
|
+
def get_auctions( **params ) get( '/auctions', **params ); end
|
51
|
+
def get_user( addr ) get( "/user/#{addr}" ); end
|
52
|
+
|
53
|
+
def get_network_status() get( '/network-status' ); end
|
54
|
+
|
43
55
|
end # class Client
|
44
56
|
end # module V0
|
45
57
|
|
@@ -58,6 +70,8 @@ class Client < ::Kitties::Client
|
|
58
70
|
|
59
71
|
def get_cattributes() get('/cattributes'); end
|
60
72
|
def get_kitty( id ) get("/kitties/#{id}"); end ## use get_kitty_by_id - why? why not?
|
73
|
+
alias_method :get_kitten, :get_kitty
|
74
|
+
|
61
75
|
def get_colors_body() get('/colors/body'); end
|
62
76
|
def get_colors_eyes() get('/colors/eyes'); end
|
63
77
|
def get_colors_secondary() get('/colors/secondary'); end
|
data/lib/kittyverse/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: kittyverse
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Gerald Bauer
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-05-
|
11
|
+
date: 2019-05-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: base32-alphabets
|