-
Notifications
You must be signed in to change notification settings - Fork 21
/
Copy pathsimple-client.rb
74 lines (59 loc) · 1.67 KB
/
simple-client.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
require "json"
require "uri"
require "open-uri"
def snake(str)
str
.gsub(/::/, '/')
.gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2')
.gsub(/([a-z\d])([A-Z])/,'\1_\2')
.tr("-", "_")
.downcase
end
# this client doesn't implement parameter validation, though it can be derived
# from the JSON data as well.
module NbaClient
DATA = JSON.parse(File.read(File.expand_path("../../nba.json", __FILE__)))
class Endpoint
@@parameters = {}
DATA["parameters"].each do |item|
@@parameters[item["name"]] = item
end
attr_accessor :name, :defaults, :url
def initialize(info)
@parameters = info["parameters"]
@name = snake(info["name"])
@url = info["url"]
@defaults = @parameters.inject({}) do |defaults, param|
defaults[param] = @@parameters[param]["default"]
defaults
end
end
end
# there's gotta be a built-in way of doing this but I couldn't find it quickly so... w/e
class QueryString
def initialize(params)
query = []
params.each {|param, value| query << URI.encode("#{param}=#{value}") }
@query_str = "?" + query.join("&")
end
def to_s
@query_str
end
end
DATA["stats_endpoints"].each do |ep|
endpoint = Endpoint.new ep
define_method(endpoint.name) do |args|
params = endpoint.defaults.merge args
query_str = QueryString.new(params).to_s
uri = URI(endpoint.url + query_str)
JSON.parse open(uri, {
"User-Agent" => DATA["user_agent"],
"Referer" => DATA["referrer"],
"Origin" => DATA["origin"],
}).read
end
end
extend self
end
# usage:
puts NbaClient.player_profile({ "PlayerID" => 201939 })