mlb 0.7.0 → 0.8.0
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 +5 -5
- data/CHANGELOG.md +2 -0
- data/LICENSE.txt +21 -0
- data/README.md +115 -103
- data/bin/console +10 -0
- data/bin/setup +6 -0
- data/lib/mlb/client.rb +73 -0
- data/lib/mlb/connection.rb +80 -0
- data/lib/mlb/errors/bad_gateway.rb +5 -0
- data/lib/mlb/errors/bad_request.rb +5 -0
- data/lib/mlb/errors/client_error.rb +5 -0
- data/lib/mlb/errors/connection_exception.rb +5 -0
- data/lib/mlb/errors/error.rb +3 -0
- data/lib/mlb/errors/forbidden.rb +5 -0
- data/lib/mlb/errors/gateway_timeout.rb +5 -0
- data/lib/mlb/errors/gone.rb +5 -0
- data/lib/mlb/errors/http_error.rb +14 -0
- data/lib/mlb/errors/internal_server_error.rb +5 -0
- data/lib/mlb/errors/network_error.rb +5 -0
- data/lib/mlb/errors/not_acceptable.rb +5 -0
- data/lib/mlb/errors/not_found.rb +5 -0
- data/lib/mlb/errors/payload_too_large.rb +5 -0
- data/lib/mlb/errors/server_error.rb +5 -0
- data/lib/mlb/errors/service_unavailable.rb +5 -0
- data/lib/mlb/errors/too_many_redirects.rb +5 -0
- data/lib/mlb/errors/too_many_requests.rb +5 -0
- data/lib/mlb/errors/unauthorized.rb +5 -0
- data/lib/mlb/errors/unprocessable_entity.rb +5 -0
- data/lib/mlb/player.rb +17 -20
- data/lib/mlb/redirect_handler.rb +55 -0
- data/lib/mlb/request_builder.rb +48 -0
- data/lib/mlb/response_parser.rb +61 -0
- data/lib/mlb/team.rb +33 -131
- data/lib/mlb/transaction.rb +37 -0
- data/lib/mlb/version.rb +3 -13
- data/lib/mlb.rb +3 -3
- data/sig/mlb.rbs +191 -0
- metadata +55 -114
- checksums.yaml.gz.sig +0 -0
- data/.yardopts +0 -5
- data/CONTRIBUTING.md +0 -49
- data/LICENSE.md +0 -20
- data/Rakefile +0 -48
- data/lib/mlb/request.rb +0 -24
- data/mlb.gemspec +0 -27
- data/spec/helper.rb +0 -32
- data/spec/mlb_spec.rb +0 -114
- data.tar.gz.sig +0 -1
- metadata.gz.sig +0 -0
@@ -0,0 +1,55 @@
|
|
1
|
+
require "net/http"
|
2
|
+
require "uri"
|
3
|
+
require_relative "connection"
|
4
|
+
require_relative "errors/too_many_redirects"
|
5
|
+
require_relative "request_builder"
|
6
|
+
|
7
|
+
module MLB
|
8
|
+
class RedirectHandler
|
9
|
+
DEFAULT_MAX_REDIRECTS = 10
|
10
|
+
|
11
|
+
attr_accessor :max_redirects
|
12
|
+
attr_reader :connection, :request_builder
|
13
|
+
|
14
|
+
def initialize(connection: Connection.new, request_builder: RequestBuilder.new,
|
15
|
+
max_redirects: DEFAULT_MAX_REDIRECTS)
|
16
|
+
@connection = connection
|
17
|
+
@request_builder = request_builder
|
18
|
+
@max_redirects = max_redirects
|
19
|
+
end
|
20
|
+
|
21
|
+
def handle(response:, request:, base_url:, redirect_count: 0)
|
22
|
+
if response.is_a?(Net::HTTPRedirection)
|
23
|
+
raise TooManyRedirects, "Too many redirects" if redirect_count > max_redirects
|
24
|
+
|
25
|
+
new_uri = build_new_uri(response, base_url)
|
26
|
+
|
27
|
+
new_request = build_request(request, new_uri, Integer(response.code))
|
28
|
+
new_response = connection.perform(request: new_request)
|
29
|
+
|
30
|
+
handle(response: new_response, request: new_request, base_url:, redirect_count: redirect_count + 1)
|
31
|
+
else
|
32
|
+
response
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
private
|
37
|
+
|
38
|
+
def build_new_uri(response, base_url)
|
39
|
+
location = response.fetch("location")
|
40
|
+
# If location is relative, it will join with the original base URL, otherwise it will overwrite it
|
41
|
+
URI.join(base_url, location)
|
42
|
+
end
|
43
|
+
|
44
|
+
def build_request(request, uri, response_code)
|
45
|
+
http_method, body = case response_code
|
46
|
+
in 307 | 308
|
47
|
+
[request.method.downcase.to_sym, request.body]
|
48
|
+
else
|
49
|
+
[:get, nil]
|
50
|
+
end
|
51
|
+
|
52
|
+
request_builder.build(http_method:, uri:, body:)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
require "net/http"
|
2
|
+
require "uri"
|
3
|
+
require_relative "version"
|
4
|
+
|
5
|
+
module MLB
|
6
|
+
class RequestBuilder
|
7
|
+
DEFAULT_HEADERS = {
|
8
|
+
"Content-Type" => "application/json; charset=utf-8",
|
9
|
+
"User-Agent" => "MLB-Client/#{VERSION} #{RUBY_ENGINE}/#{RUBY_VERSION} (#{RUBY_PLATFORM})"
|
10
|
+
}.freeze
|
11
|
+
HTTP_METHODS = {
|
12
|
+
get: Net::HTTP::Get,
|
13
|
+
post: Net::HTTP::Post,
|
14
|
+
put: Net::HTTP::Put,
|
15
|
+
delete: Net::HTTP::Delete
|
16
|
+
}.freeze
|
17
|
+
|
18
|
+
def build(http_method:, uri:, body: nil, headers: {})
|
19
|
+
request = create_request(http_method:, uri:, body:)
|
20
|
+
add_headers(request:, headers:)
|
21
|
+
request
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
|
26
|
+
def create_request(http_method:, uri:, body:)
|
27
|
+
http_method_class = HTTP_METHODS[http_method]
|
28
|
+
|
29
|
+
raise ArgumentError, "Unsupported HTTP method: #{http_method}" unless http_method_class
|
30
|
+
|
31
|
+
escaped_uri = escape_query_params(uri)
|
32
|
+
request = http_method_class.new(escaped_uri)
|
33
|
+
request.body = body
|
34
|
+
request
|
35
|
+
end
|
36
|
+
|
37
|
+
def add_headers(request:, headers:)
|
38
|
+
DEFAULT_HEADERS.merge(headers).each do |key, value|
|
39
|
+
request.delete(key)
|
40
|
+
request.add_field(key, value)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def escape_query_params(uri)
|
45
|
+
URI(uri).tap { |u| u.query = URI.encode_www_form(URI.decode_www_form(u.query)) if u.query }
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
require "json"
|
2
|
+
require "net/http"
|
3
|
+
require_relative "errors/bad_gateway"
|
4
|
+
require_relative "errors/bad_request"
|
5
|
+
require_relative "errors/connection_exception"
|
6
|
+
require_relative "errors/http_error"
|
7
|
+
require_relative "errors/forbidden"
|
8
|
+
require_relative "errors/gateway_timeout"
|
9
|
+
require_relative "errors/gone"
|
10
|
+
require_relative "errors/internal_server_error"
|
11
|
+
require_relative "errors/not_acceptable"
|
12
|
+
require_relative "errors/not_found"
|
13
|
+
require_relative "errors/payload_too_large"
|
14
|
+
require_relative "errors/service_unavailable"
|
15
|
+
require_relative "errors/too_many_requests"
|
16
|
+
require_relative "errors/unauthorized"
|
17
|
+
require_relative "errors/unprocessable_entity"
|
18
|
+
|
19
|
+
module MLB
|
20
|
+
class ResponseParser
|
21
|
+
ERROR_MAP = {
|
22
|
+
400 => BadRequest,
|
23
|
+
401 => Unauthorized,
|
24
|
+
403 => Forbidden,
|
25
|
+
404 => NotFound,
|
26
|
+
406 => NotAcceptable,
|
27
|
+
409 => ConnectionException,
|
28
|
+
410 => Gone,
|
29
|
+
413 => PayloadTooLarge,
|
30
|
+
422 => UnprocessableEntity,
|
31
|
+
429 => TooManyRequests,
|
32
|
+
500 => InternalServerError,
|
33
|
+
502 => BadGateway,
|
34
|
+
503 => ServiceUnavailable,
|
35
|
+
504 => GatewayTimeout
|
36
|
+
}.freeze
|
37
|
+
JSON_CONTENT_TYPE_REGEXP = %r{application/json}
|
38
|
+
|
39
|
+
def parse(response:, array_class: nil, object_class: nil)
|
40
|
+
raise error(response) unless response.is_a?(Net::HTTPSuccess)
|
41
|
+
|
42
|
+
return unless json?(response)
|
43
|
+
|
44
|
+
JSON.parse(response.body, array_class:, object_class:, symbolize_names: true)
|
45
|
+
end
|
46
|
+
|
47
|
+
private
|
48
|
+
|
49
|
+
def error(response)
|
50
|
+
error_class(response).new(response:)
|
51
|
+
end
|
52
|
+
|
53
|
+
def error_class(response)
|
54
|
+
ERROR_MAP[Integer(response.code)] || HTTPError
|
55
|
+
end
|
56
|
+
|
57
|
+
def json?(response)
|
58
|
+
JSON_CONTENT_TYPE_REGEXP.match?(response["content-type"])
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
data/lib/mlb/team.rb
CHANGED
@@ -1,136 +1,38 @@
|
|
1
|
-
require
|
2
|
-
require 'multi_json'
|
1
|
+
require "uri"
|
3
2
|
|
4
3
|
module MLB
|
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
|
-
private
|
39
|
-
|
40
|
-
def initialize(attributes = {})
|
41
|
-
attributes.each do |key, value|
|
42
|
-
instance_variable_set("@#{key}", value) if self.respond_to?(key)
|
43
|
-
end
|
44
|
-
end
|
45
|
-
|
46
|
-
def self.results_from_freebase
|
47
|
-
Request.get('/freebase/v1/mqlread', :query => mql_query)
|
48
|
-
end
|
49
|
-
|
50
|
-
def self.results_from_cache
|
51
|
-
JSON.load(file_from_cache('teams.json').read)
|
52
|
-
end
|
53
|
-
|
54
|
-
def self.file_from_cache(file_name)
|
55
|
-
File.new(File.expand_path('../../../cache', __FILE__) + '/' + file_name)
|
56
|
-
end
|
57
|
-
|
58
|
-
def self.results_to_team(results) # rubocop:disable CyclomaticComplexity, MethodLength
|
59
|
-
results['result'].map do |result|
|
60
|
-
league = result['league']
|
61
|
-
division = result['division']
|
62
|
-
manager = result['current_manager']
|
63
|
-
stats = result['team_stats'].first
|
64
|
-
founded = result['/sports/sports_team/founded'].first
|
65
|
-
mascot = result['/sports/sports_team/team_mascot'].first
|
66
|
-
ballpark = result['/sports/sports_team/arena_stadium'].first
|
67
|
-
logo_prefix = 'http://img.freebase.com/api/trans/image_thumb'
|
68
|
-
logo_suffix = result['/common/topic/image'].first
|
69
|
-
players = result['/sports/sports_team/roster']
|
70
|
-
|
71
|
-
new(:name => result['name'],
|
72
|
-
:league => (league ? league['name'] : nil),
|
73
|
-
:division => (division ? division['name'] : nil),
|
74
|
-
:manager => (manager ? manager['name'] : nil),
|
75
|
-
:wins => (stats ? stats['wins'].to_i : nil),
|
76
|
-
:losses => (stats ? stats['losses'].to_i : nil),
|
77
|
-
:founded => (founded ? founded['value'].to_i : nil),
|
78
|
-
:mascot => (mascot ? mascot['name'] : nil),
|
79
|
-
:ballpark => (ballpark ? ballpark['name'] : nil),
|
80
|
-
:logo_url => (logo_suffix ? logo_prefix + logo_suffix['id'] : nil),
|
81
|
-
:players => (players ? Player.all_from_roster(players) : []))
|
82
|
-
end
|
83
|
-
end
|
84
|
-
|
85
|
-
# Returns the MQL query for teams, as a Ruby hash
|
86
|
-
def self.mql_query # rubocop:disable MethodLength
|
87
|
-
query = <<-eos
|
88
|
-
[{
|
89
|
-
"name": null,
|
90
|
-
"league": {
|
91
|
-
"name": null
|
92
|
-
},
|
93
|
-
"division": {
|
94
|
-
"name": null
|
95
|
-
},
|
96
|
-
"current_manager": {
|
97
|
-
"optional": true,
|
98
|
-
"name": null
|
99
|
-
},
|
100
|
-
"team_stats": [{
|
101
|
-
"wins": null,
|
102
|
-
"losses": null,
|
103
|
-
"season": null,
|
104
|
-
"limit": 1,
|
105
|
-
"sort": "-season"
|
106
|
-
}],
|
107
|
-
"/sports/sports_team/roster": [{
|
108
|
-
"player": null,
|
109
|
-
"number": null,
|
110
|
-
"from": null,
|
111
|
-
"to": null,
|
112
|
-
"position": [],
|
113
|
-
"sort": "player"
|
114
|
-
}],
|
115
|
-
"/sports/sports_team/founded": [{
|
116
|
-
"value": null
|
117
|
-
}],
|
118
|
-
"/sports/sports_team/team_mascot": [{}],
|
119
|
-
"/sports/sports_team/arena_stadium": [{
|
120
|
-
"name": null
|
121
|
-
}],
|
122
|
-
"/common/topic/image": [{
|
123
|
-
"optional": true,
|
124
|
-
"id": null,
|
125
|
-
"timestamp": null,
|
126
|
-
"sort": "-timestamp",
|
127
|
-
"limit": 1
|
128
|
-
}],
|
129
|
-
"sort": "name",
|
130
|
-
"type": "/baseball/baseball_team"
|
131
|
-
}]
|
132
|
-
eos
|
133
|
-
query.gsub!("\n", '').gsub!(' ', '')
|
4
|
+
Team = Struct.new(:active_sw, :address, :address_city,
|
5
|
+
:address_country, :address_intl, :address_line1, :address_line2,
|
6
|
+
:address_line3, :address_province, :address_state, :address_zip, :all_star_sw,
|
7
|
+
:base_url, :bis_team_code, :city, :division, :division_abbrev, :division_full,
|
8
|
+
:division_id, :file_code, :first_year_of_play, :franchise_code, :home_opener,
|
9
|
+
:home_opener_time, :last_year_of_play, :league, :league_abbrev, :league_full,
|
10
|
+
:league_id, :mlb_org, :mlb_org_abbrev, :mlb_org_brief, :mlb_org_id,
|
11
|
+
:mlb_org_short, :name, :name_abbrev, :name_display_brief, :name_display_full,
|
12
|
+
:name_display_long, :name_display_short, :name_short, :phone_number, :season,
|
13
|
+
:sport_code, :sport_code_display, :sport_code_name, :sport_id, :spring_league,
|
14
|
+
:spring_league_abbrev, :spring_league_full, :spring_league_id, :state,
|
15
|
+
:store_url, :team_code, :team_id, :time_zone, :time_zone_alt,
|
16
|
+
:time_zone_generic, :time_zone_num, :time_zone_text, :venue_id, :venue_name,
|
17
|
+
:venue_short, :website_url, keyword_init: true) do
|
18
|
+
def self.all(season: Time.now.year, sort_order: "name_asc", all_star: false)
|
19
|
+
sport_code = "'mlb'"
|
20
|
+
season = "'#{season}'"
|
21
|
+
all_star_sw = all_star ? "'Y'" : "'N'"
|
22
|
+
params = {sport_code:, season:, sort_order:, all_star_sw:}
|
23
|
+
query_string = URI.encode_www_form(params)
|
24
|
+
response = CLIENT.get("named.team_all_season.bam?#{query_string}")
|
25
|
+
teams = response[:team_all_season][:queryResults][:row]
|
26
|
+
teams.collect { |team| Team.new(**team) }
|
27
|
+
end
|
28
|
+
|
29
|
+
def roster
|
30
|
+
require_relative "player"
|
31
|
+
params = {team_id:}
|
32
|
+
query_string = URI.encode_www_form(params)
|
33
|
+
response = CLIENT.get("named.roster_40.bam?#{query_string}")
|
34
|
+
players = response[:roster_40][:queryResults][:row]
|
35
|
+
players.collect { |player| Player.new(**player) }
|
134
36
|
end
|
135
37
|
end
|
136
38
|
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require "date"
|
2
|
+
require "uri"
|
3
|
+
|
4
|
+
module MLB
|
5
|
+
Transaction = Struct.new(:conditional_sw, :effective_date, :final_asset,
|
6
|
+
:final_asset_type, :from_team, :from_team_id, :name_display_first_last,
|
7
|
+
:name_display_last_first, :name_sort, :note, :orig_asset, :orig_asset_type,
|
8
|
+
:player, :player_id, :resolution_cd, :resolution_date, :team, :team_id,
|
9
|
+
:trans_date, :trans_date_cd, :transaction_id, :type, :type_cd, keyword_init: true) do
|
10
|
+
def self.all(start_date: Date.today, end_date: Date.today)
|
11
|
+
sport_code = "'mlb'"
|
12
|
+
start_date = Date.parse(start_date.to_s).strftime("%Y%m%d")
|
13
|
+
end_date = Date.parse(end_date.to_s).strftime("%Y%m%d")
|
14
|
+
params = {sport_code:, start_date:, end_date:}
|
15
|
+
query_string = URI.encode_www_form(params)
|
16
|
+
response = CLIENT.get("named.transaction_all.bam?#{query_string}")
|
17
|
+
transactions = response.fetch(:transaction_all, {}).fetch(:queryResults, {}).fetch(:row, [])
|
18
|
+
transactions.collect { |transaction| Transaction.new(**transaction) }
|
19
|
+
end
|
20
|
+
|
21
|
+
def team
|
22
|
+
require_relative "team"
|
23
|
+
teams = effective_date.to_s.empty? ? Team.all : Team.all(season: effective_date.to_s[0...4].to_i)
|
24
|
+
teams.find { |t| t[:team_id] == team_id.to_s }
|
25
|
+
end
|
26
|
+
|
27
|
+
def player
|
28
|
+
params = {team_id:}
|
29
|
+
query_string = URI.encode_www_form(params)
|
30
|
+
response = CLIENT.get("named.roster_40.bam?#{query_string}")
|
31
|
+
players = response[:roster_40][:queryResults][:row]
|
32
|
+
player = players.find { |p| p[:player_id] == player_id.to_s }
|
33
|
+
require_relative "player"
|
34
|
+
Player.new(**player)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
data/lib/mlb/version.rb
CHANGED
@@ -1,15 +1,5 @@
|
|
1
|
-
|
2
|
-
class Version
|
3
|
-
MAJOR = 0
|
4
|
-
MINOR = 7
|
5
|
-
PATCH = 0
|
6
|
-
PRE = nil
|
1
|
+
require "rubygems/version"
|
7
2
|
|
8
|
-
|
9
|
-
|
10
|
-
def to_s
|
11
|
-
[MAJOR, MINOR, PATCH, PRE].compact.join('.')
|
12
|
-
end
|
13
|
-
end
|
14
|
-
end
|
3
|
+
module MLB
|
4
|
+
VERSION = Gem::Version.create("0.8.0")
|
15
5
|
end
|
data/lib/mlb.rb
CHANGED
@@ -1,3 +1,3 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
1
|
+
require_relative "mlb/client"
|
2
|
+
require_relative "mlb/team"
|
3
|
+
require_relative "mlb/transaction"
|
data/sig/mlb.rbs
ADDED
@@ -0,0 +1,191 @@
|
|
1
|
+
module MLB
|
2
|
+
CLIENT: Client
|
3
|
+
VERSION: Gem::Version
|
4
|
+
|
5
|
+
class Error < StandardError
|
6
|
+
end
|
7
|
+
|
8
|
+
class ClientError < HTTPError
|
9
|
+
end
|
10
|
+
|
11
|
+
class BadGateway < ClientError
|
12
|
+
end
|
13
|
+
|
14
|
+
class BadRequest < ClientError
|
15
|
+
end
|
16
|
+
|
17
|
+
class ConnectionException < ClientError
|
18
|
+
end
|
19
|
+
|
20
|
+
class HTTPError < Error
|
21
|
+
attr_reader response : Net::HTTPResponse
|
22
|
+
attr_reader code : String
|
23
|
+
|
24
|
+
def initialize: (response: Net::HTTPResponse) -> void
|
25
|
+
end
|
26
|
+
|
27
|
+
class Forbidden < ClientError
|
28
|
+
end
|
29
|
+
|
30
|
+
class GatewayTimeout < ClientError
|
31
|
+
end
|
32
|
+
|
33
|
+
class Gone < ClientError
|
34
|
+
end
|
35
|
+
|
36
|
+
class InternalServerError < ServerError
|
37
|
+
end
|
38
|
+
|
39
|
+
class NetworkError < Error
|
40
|
+
end
|
41
|
+
|
42
|
+
class NotAcceptable < ClientError
|
43
|
+
end
|
44
|
+
|
45
|
+
class NotFound < ClientError
|
46
|
+
end
|
47
|
+
|
48
|
+
class PayloadTooLarge < ClientError
|
49
|
+
end
|
50
|
+
|
51
|
+
class ServerError < HTTPError
|
52
|
+
end
|
53
|
+
|
54
|
+
class ServiceUnavailable < ServerError
|
55
|
+
end
|
56
|
+
|
57
|
+
class TooManyRedirects < Error
|
58
|
+
end
|
59
|
+
|
60
|
+
class TooManyRequests < ClientError
|
61
|
+
end
|
62
|
+
|
63
|
+
class Unauthorized < ClientError
|
64
|
+
end
|
65
|
+
|
66
|
+
class UnprocessableEntity < ClientError
|
67
|
+
end
|
68
|
+
|
69
|
+
class Connection
|
70
|
+
DEFAULT_HOST: String
|
71
|
+
DEFAULT_PORT: Integer
|
72
|
+
DEFAULT_OPEN_TIMEOUT: Integer
|
73
|
+
DEFAULT_READ_TIMEOUT: Integer
|
74
|
+
DEFAULT_WRITE_TIMEOUT: Integer
|
75
|
+
DEFAULT_DEBUG_OUTPUT: IO
|
76
|
+
NETWORK_ERRORS: Array[(singleton(Errno::ECONNREFUSED) | singleton(Errno::ECONNRESET) | singleton(Net::OpenTimeout) | singleton(Net::ReadTimeout) | singleton(OpenSSL::SSL::SSLError))]
|
77
|
+
|
78
|
+
@proxy_url: URI::Generic | String
|
79
|
+
|
80
|
+
extend Forwardable
|
81
|
+
|
82
|
+
attr_accessor open_timeout : Float | Integer
|
83
|
+
attr_accessor read_timeout : Float | Integer
|
84
|
+
attr_accessor write_timeout : Float | Integer
|
85
|
+
attr_accessor debug_output : IO
|
86
|
+
|
87
|
+
attr_reader proxy_uri: URI::Generic?
|
88
|
+
attr_reader proxy_host : String?
|
89
|
+
attr_reader proxy_port : Integer?
|
90
|
+
attr_reader proxy_user : String?
|
91
|
+
attr_reader proxy_pass : String?
|
92
|
+
|
93
|
+
def initialize: (?open_timeout: Float | Integer, ?read_timeout: Float | Integer, ?write_timeout: Float | Integer, ?proxy_url: URI::Generic? | String?, ?debug_output: IO) -> void
|
94
|
+
def proxy_url=: (URI::Generic | String proxy_url) -> void
|
95
|
+
def perform: (request: Net::HTTPRequest) -> Net::HTTPResponse
|
96
|
+
|
97
|
+
private
|
98
|
+
def build_http_client: (?String host, ?Integer port) -> Net::HTTP
|
99
|
+
def configure_http_client: (Net::HTTP http_client) -> Net::HTTP
|
100
|
+
end
|
101
|
+
|
102
|
+
class RequestBuilder
|
103
|
+
HTTP_METHODS: Hash[Symbol, (singleton(Net::HTTP::Get) | singleton(Net::HTTP::Post) | singleton(Net::HTTP::Put) | singleton(Net::HTTP::Delete))]
|
104
|
+
DEFAULT_HEADERS: Hash[String, String]
|
105
|
+
|
106
|
+
def initialize: (?content_type: String, ?user_agent: String) -> void
|
107
|
+
def build: (http_method: Symbol, uri: URI::Generic, ?body: String?, ?headers: Hash[String, String]) -> (Net::HTTPRequest)
|
108
|
+
|
109
|
+
private
|
110
|
+
def create_request: (http_method: Symbol, uri: URI::Generic, body: String?) -> (Net::HTTPRequest)
|
111
|
+
def add_headers: (request: Net::HTTPRequest, headers: Hash[String, String]) -> void
|
112
|
+
def escape_query_params: (URI::Generic uri) -> URI::Generic
|
113
|
+
end
|
114
|
+
|
115
|
+
class RedirectHandler
|
116
|
+
DEFAULT_MAX_REDIRECTS: Integer
|
117
|
+
|
118
|
+
attr_reader connection: Connection
|
119
|
+
attr_reader request_builder: RequestBuilder
|
120
|
+
attr_reader max_redirects: Integer
|
121
|
+
def initialize: (?connection: Connection, ?request_builder: RequestBuilder, ?max_redirects: Integer) -> void
|
122
|
+
def handle: (response: Net::HTTPResponse, request: Net::HTTPRequest, base_url: String, ?redirect_count: Integer) -> Net::HTTPResponse
|
123
|
+
|
124
|
+
private
|
125
|
+
def build_new_uri: (Net::HTTPResponse response, String base_url) -> URI::Generic
|
126
|
+
def build_request: (Net::HTTPRequest request, URI::Generic new_uri, Integer response_code) -> Net::HTTPRequest
|
127
|
+
def send_new_request: (URI::Generic new_uri, Net::HTTPRequest new_request) -> Net::HTTPResponse
|
128
|
+
end
|
129
|
+
|
130
|
+
class ResponseParser
|
131
|
+
ERROR_MAP: Hash[Integer, singleton(BadGateway) | singleton(BadRequest) | singleton(ConnectionException) | singleton(Forbidden) | singleton(GatewayTimeout) | singleton(Gone) | singleton(InternalServerError) | singleton(NotAcceptable) | singleton(NotFound) | singleton(PayloadTooLarge) | singleton(ServiceUnavailable) | singleton(TooManyRequests) | singleton(Unauthorized) | singleton(UnprocessableEntity)]
|
132
|
+
JSON_CONTENT_TYPE_REGEXP: Regexp
|
133
|
+
|
134
|
+
def parse: (response: Net::HTTPResponse, ?array_class: Class?, ?object_class: Class?) -> untyped
|
135
|
+
|
136
|
+
private
|
137
|
+
def error: (Net::HTTPResponse response) -> HTTPError
|
138
|
+
def error_class: (Net::HTTPResponse response) -> (singleton(BadGateway) | singleton(BadRequest) | singleton(ConnectionException) | singleton(Forbidden) | singleton(GatewayTimeout) | singleton(Gone) | singleton(InternalServerError) | singleton(NotAcceptable) | singleton(NotFound) | singleton(PayloadTooLarge) | singleton(ServiceUnavailable) | singleton(TooManyRequests) | singleton(Unauthorized) | singleton(UnprocessableEntity))
|
139
|
+
def json?: (Net::HTTPResponse response) -> bool
|
140
|
+
end
|
141
|
+
|
142
|
+
class Client
|
143
|
+
DEFAULT_BASE_URL: String
|
144
|
+
DEFAULT_ARRAY_CLASS: singleton(Array)
|
145
|
+
DEFAULT_OBJECT_CLASS: singleton(Hash)
|
146
|
+
extend Forwardable
|
147
|
+
@connection: Connection
|
148
|
+
@request_builder: RequestBuilder
|
149
|
+
@redirect_handler: RedirectHandler
|
150
|
+
@response_parser: ResponseParser
|
151
|
+
|
152
|
+
attr_accessor base_url: String
|
153
|
+
attr_accessor default_array_class: singleton(Array)
|
154
|
+
attr_accessor default_object_class: singleton(Hash)
|
155
|
+
def initialize: (?base_url: String, ?open_timeout: Integer, ?read_timeout: Integer, ?write_timeout: Integer, ?debug_output: untyped, ?proxy_url: nil, ?default_array_class: singleton(Array), ?default_object_class: singleton(Hash), ?max_redirects: Integer) -> void
|
156
|
+
def get: (String endpoint, ?headers: Hash[String, String], ?array_class: Class, ?object_class: Class) -> untyped
|
157
|
+
def post: (String endpoint, ?String? body, ?headers: Hash[String, String], ?array_class: Class, ?object_class: Class) -> untyped
|
158
|
+
def put: (String endpoint, ?String? body, ?headers: Hash[String, String], ?array_class: Class, ?object_class: Class) -> untyped
|
159
|
+
def delete: (String endpoint, ?headers: Hash[String, String], ?array_class: Class, ?object_class: Class) -> untyped
|
160
|
+
|
161
|
+
private
|
162
|
+
def initialize_default_classes: (singleton(Array) default_array_class, singleton(Hash) default_object_class) -> singleton(Hash)
|
163
|
+
def execute_request: (:delete | :get | :post | :put http_method, String endpoint, ?body: String?, ?headers: Hash[String, String], ?array_class: Class, ?object_class: Class) -> nil
|
164
|
+
end
|
165
|
+
|
166
|
+
attr_accessor effective_date: String
|
167
|
+
attr_accessor player_id: String
|
168
|
+
attr_accessor team_id: String
|
169
|
+
|
170
|
+
class Team < Struct[untyped]
|
171
|
+
attr_accessor team_id: String
|
172
|
+
def self.new: -> void
|
173
|
+
def self.all: (?season: Integer, ?sort_order: String, ?all_star: false) -> Array[Team]
|
174
|
+
def roster: -> Array[Player]
|
175
|
+
end
|
176
|
+
|
177
|
+
class Transaction < Struct[untyped]
|
178
|
+
attr_accessor player_id: String
|
179
|
+
attr_accessor team_id: String
|
180
|
+
def self.new: -> void
|
181
|
+
def self.all: (?season: Integer, ?sort_order: String, ?all_star: false) -> Array[Team]
|
182
|
+
def team: -> Team
|
183
|
+
def player: -> Player
|
184
|
+
end
|
185
|
+
|
186
|
+
class Player < Struct[untyped]
|
187
|
+
attr_accessor player_id: String
|
188
|
+
def self.new: -> void
|
189
|
+
def team: -> Team
|
190
|
+
end
|
191
|
+
end
|