kittyverse 0.4.2 → 0.4.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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