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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 2698032788d8346a7291346483e585502611d69c
4
- data.tar.gz: f40553268c0458012235f9fbd7aa9a1eed690ec5
3
+ metadata.gz: 625692bc57c7cf12b02b4a08f18029b2fdbf2df8
4
+ data.tar.gz: b7e4e3d49b1fa36c78d93bd535a34533d6caf0bb
5
5
  SHA512:
6
- metadata.gz: bf8ab2090846cafbb6c9673067247455c4607cad4a9fd89f852967ba70ad341661031e1b3d7b511ea2324e1e599f629074cfc216b397d0a60bc631f00f1e44ce
7
- data.tar.gz: 53ec77865e458b19a4261b15bdd3fdabee440a171133cc3fe077ca71037aac79f76231c096be2c0a6178d484430dab2b0fbfd194e57576747808039ab709255e
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
- def get( service )
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
- headers = if @token
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, headers )
108
+ req = Net::HTTP::Get.new( request_uri, request_headers )
42
109
 
43
110
  res = @http.request(req)
44
111
 
45
- ## todo/fix: add check for res.code == "200"
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
- p "#{key} => #{value}"
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 # methdo get
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
@@ -5,7 +5,7 @@ class Kittyverse
5
5
 
6
6
  MAJOR = 0
7
7
  MINOR = 4
8
- PATCH = 2
8
+ PATCH = 3
9
9
  VERSION = [MAJOR,MINOR,PATCH].join('.')
10
10
 
11
11
  def self.version
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.2
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-17 00:00:00.000000000 Z
11
+ date: 2019-05-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: base32-alphabets