sports-odds-api 1.2.2 → 1.3.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.
Files changed (56) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +38 -0
  3. data/README.md +11 -1
  4. data/lib/sports_odds_api/client.rb +28 -1
  5. data/lib/sports_odds_api/internal/transport/base_client.rb +5 -0
  6. data/lib/sports_odds_api/internal/transport/pooled_net_requester.rb +13 -11
  7. data/lib/sports_odds_api/internal/util.rb +61 -10
  8. data/lib/sports_odds_api/models/event.rb +197 -4
  9. data/lib/sports_odds_api/models/event_get_params.rb +22 -4
  10. data/lib/sports_odds_api/models/market.rb +206 -0
  11. data/lib/sports_odds_api/models/market_get_params.rb +150 -0
  12. data/lib/sports_odds_api/models/player_get_params.rb +3 -3
  13. data/lib/sports_odds_api/models/team.rb +107 -2
  14. data/lib/sports_odds_api/models/team_get_params.rb +3 -3
  15. data/lib/sports_odds_api/models.rb +4 -0
  16. data/lib/sports_odds_api/resources/account.rb +1 -0
  17. data/lib/sports_odds_api/resources/events.rb +11 -3
  18. data/lib/sports_odds_api/resources/leagues.rb +3 -1
  19. data/lib/sports_odds_api/resources/markets.rb +87 -0
  20. data/lib/sports_odds_api/resources/players.rb +4 -2
  21. data/lib/sports_odds_api/resources/sports.rb +1 -0
  22. data/lib/sports_odds_api/resources/stats.rb +3 -1
  23. data/lib/sports_odds_api/resources/stream.rb +3 -1
  24. data/lib/sports_odds_api/resources/teams.rb +4 -2
  25. data/lib/sports_odds_api/version.rb +1 -1
  26. data/lib/sports_odds_api.rb +3 -0
  27. data/rbi/sports_odds_api/client.rbi +12 -0
  28. data/rbi/sports_odds_api/internal/util.rbi +29 -1
  29. data/rbi/sports_odds_api/models/event.rbi +387 -3
  30. data/rbi/sports_odds_api/models/event_get_params.rbi +30 -4
  31. data/rbi/sports_odds_api/models/market.rbi +326 -0
  32. data/rbi/sports_odds_api/models/market_get_params.rbi +224 -0
  33. data/rbi/sports_odds_api/models/player_get_params.rbi +4 -4
  34. data/rbi/sports_odds_api/models/team.rbi +186 -3
  35. data/rbi/sports_odds_api/models/team_get_params.rbi +4 -4
  36. data/rbi/sports_odds_api/models.rbi +4 -0
  37. data/rbi/sports_odds_api/resources/account.rbi +1 -0
  38. data/rbi/sports_odds_api/resources/events.rbi +11 -2
  39. data/rbi/sports_odds_api/resources/leagues.rbi +1 -0
  40. data/rbi/sports_odds_api/resources/markets.rbi +79 -0
  41. data/rbi/sports_odds_api/resources/players.rbi +3 -2
  42. data/rbi/sports_odds_api/resources/sports.rbi +1 -0
  43. data/rbi/sports_odds_api/resources/stats.rbi +1 -0
  44. data/rbi/sports_odds_api/resources/stream.rbi +1 -0
  45. data/rbi/sports_odds_api/resources/teams.rbi +3 -2
  46. data/sig/sports_odds_api/client.rbs +2 -0
  47. data/sig/sports_odds_api/internal/util.rbs +14 -0
  48. data/sig/sports_odds_api/models/event.rbs +246 -3
  49. data/sig/sports_odds_api/models/event_get_params.rbs +14 -0
  50. data/sig/sports_odds_api/models/market.rbs +186 -0
  51. data/sig/sports_odds_api/models/market_get_params.rbs +133 -0
  52. data/sig/sports_odds_api/models/team.rbs +130 -3
  53. data/sig/sports_odds_api/models.rbs +4 -0
  54. data/sig/sports_odds_api/resources/events.rbs +2 -0
  55. data/sig/sports_odds_api/resources/markets.rbs +27 -0
  56. metadata +39 -2
@@ -2,19 +2,20 @@
2
2
 
3
3
  module SportsOddsAPI
4
4
  module Resources
5
+ # Get info about Events (includes odds, results, teams, and other metadata)
5
6
  class Events
6
7
  # Some parameter documentations has been truncated, see
7
8
  # {SportsOddsAPI::Models::EventGetParams} for more details.
8
9
  #
9
10
  # Get a list of Events
10
11
  #
11
- # @overload get(bookmaker_id: nil, cancelled: nil, cursor: nil, ended: nil, event_id: nil, event_ids: nil, finalized: nil, include_alt_lines: nil, include_opposing_odds: nil, league_id: nil, limit: nil, live: nil, odd_id: nil, odds_available: nil, odds_present: nil, player_id: nil, sport_id: nil, started: nil, starts_after: nil, starts_before: nil, team_id: nil, type: nil, request_options: {})
12
+ # @overload get(bookmaker_id: nil, cancelled: nil, cursor: nil, ended: nil, event_id: nil, event_ids: nil, expand_results: nil, finalized: nil, include_alt_lines: nil, include_open_close_odds: nil, include_opposing_odds: nil, league_id: nil, limit: nil, live: nil, odd_id: nil, odds_available: nil, odds_present: nil, player_id: nil, sport_id: nil, started: nil, starts_after: nil, starts_before: nil, team_id: nil, type: nil, request_options: {})
12
13
  #
13
14
  # @param bookmaker_id [String] A bookmakerID or comma-separated list of bookmakerIDs to include odds for
14
15
  #
15
16
  # @param cancelled [Boolean] Only include cancelled Events (true), only non-cancelled Events (false) or all E
16
17
  #
17
- # @param cursor [String] The cursor for the request. Used to get the next group of Events. This should be
18
+ # @param cursor [String] The cursor for the request. Used to get the next group of Events. This is an opa
18
19
  #
19
20
  # @param ended [Boolean] Only include Events which have have ended (true), only Events which have not end
20
21
  #
@@ -22,10 +23,14 @@ module SportsOddsAPI
22
23
  #
23
24
  # @param event_ids [String] A comma separated list of eventIDs to get Event data for
24
25
  #
26
+ # @param expand_results [Boolean] Whether to expand the results object to include all stat values rather than just
27
+ #
25
28
  # @param finalized [Boolean] Only include finalized Events (true), exclude unfinalized Events (false) or all
26
29
  #
27
30
  # @param include_alt_lines [Boolean] Whether to include alternate lines in the odds byBookmaker data
28
31
  #
32
+ # @param include_open_close_odds [Boolean] Whether to include open and close odds values (openOdds, closeOdds, openSpread,
33
+ #
29
34
  # @param include_opposing_odds [Boolean] Whether to include opposing odds for each included oddID
30
35
  #
31
36
  # @param league_id [String] A leagueID or comma-separated list of leagueIDs to get Events for
@@ -61,14 +66,17 @@ module SportsOddsAPI
61
66
  # @see SportsOddsAPI::Models::EventGetParams
62
67
  def get(params = {})
63
68
  parsed, options = SportsOddsAPI::EventGetParams.dump_request(params)
69
+ query = SportsOddsAPI::Internal::Util.encode_query_params(parsed)
64
70
  @client.request(
65
71
  method: :get,
66
72
  path: "events/",
67
- query: parsed.transform_keys(
73
+ query: query.transform_keys(
68
74
  bookmaker_id: "bookmakerID",
69
75
  event_id: "eventID",
70
76
  event_ids: "eventIDs",
77
+ expand_results: "expandResults",
71
78
  include_alt_lines: "includeAltLines",
79
+ include_open_close_odds: "includeOpenCloseOdds",
72
80
  include_opposing_odds: "includeOpposingOdds",
73
81
  league_id: "leagueID",
74
82
  odd_id: "oddID",
@@ -2,6 +2,7 @@
2
2
 
3
3
  module SportsOddsAPI
4
4
  module Resources
5
+ # Get League-related data
5
6
  class Leagues
6
7
  # Get a list of Leagues
7
8
  #
@@ -18,10 +19,11 @@ module SportsOddsAPI
18
19
  # @see SportsOddsAPI::Models::LeagueGetParams
19
20
  def get(params = {})
20
21
  parsed, options = SportsOddsAPI::LeagueGetParams.dump_request(params)
22
+ query = SportsOddsAPI::Internal::Util.encode_query_params(parsed)
21
23
  @client.request(
22
24
  method: :get,
23
25
  path: "leagues/",
24
- query: parsed.transform_keys(league_id: "leagueID", sport_id: "sportID"),
26
+ query: query.transform_keys(league_id: "leagueID", sport_id: "sportID"),
25
27
  unwrap: :data,
26
28
  model: SportsOddsAPI::Internal::Type::ArrayOf[SportsOddsAPI::League],
27
29
  options: options
@@ -0,0 +1,87 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SportsOddsAPI
4
+ module Resources
5
+ # Get metadata on supported Markets
6
+ class Markets
7
+ # Some parameter documentations has been truncated, see
8
+ # {SportsOddsAPI::Models::MarketGetParams} for more details.
9
+ #
10
+ # Get a list of Markets
11
+ #
12
+ # @overload get(bet_type_id: nil, bookmaker_id: nil, cursor: nil, is_main_market: nil, is_prop: nil, is_sub_period: nil, is_supported: nil, league_id: nil, limit: nil, odd_id: nil, period_id: nil, prop_type: nil, side_id: nil, sport_id: nil, stat_entity_id: nil, stat_id: nil, request_options: {})
13
+ #
14
+ # @param bet_type_id [String] A single betTypeID or comma-separated list of betTypeIDs to filter Markets by
15
+ #
16
+ # @param bookmaker_id [String] A single bookmakerID or comma-separated list of bookmakerIDs to filter Markets b
17
+ #
18
+ # @param cursor [String] The cursor for pagination. Use nextCursor from prior response.
19
+ #
20
+ # @param is_main_market [Boolean] Filter to only include main markets (main period moneyline, spread, and over/und
21
+ #
22
+ # @param is_prop [Boolean] Filter by whether it is any type of prop bet market
23
+ #
24
+ # @param is_sub_period [Boolean] Filter by whether it tracks a sub/non-main period
25
+ #
26
+ # @param is_supported [Boolean] Filter whether this market is fully supported by at least 1 bookmaker in at leas
27
+ #
28
+ # @param league_id [String] A single leagueID or comma-separated list of leagueIDs to filter Markets by
29
+ #
30
+ # @param limit [Float] The maximum number of Markets to return (default: 100, max: 10000)
31
+ #
32
+ # @param odd_id [String] A single oddID or comma-separated list of oddIDs. Used to specify specific Marke
33
+ #
34
+ # @param period_id [String] A single periodID or comma-separated list of periodIDs to filter Markets by
35
+ #
36
+ # @param prop_type [String] Filter by prop type (game_prop, team_prop, player_prop, other_prop)
37
+ #
38
+ # @param side_id [String] A single sideID or comma-separated list of sideIDs to filter Markets by
39
+ #
40
+ # @param sport_id [String] A single sportID or comma-separated list of sportIDs to filter Markets by
41
+ #
42
+ # @param stat_entity_id [String] A single statEntityID or comma-separated list of statEntityIDs to filter Markets
43
+ #
44
+ # @param stat_id [String] A single statID or comma-separated list of statIDs to filter Markets by
45
+ #
46
+ # @param request_options [SportsOddsAPI::RequestOptions, Hash{Symbol=>Object}, nil]
47
+ #
48
+ # @return [SportsOddsAPI::Internal::NextCursorPage<SportsOddsAPI::Models::Market>]
49
+ #
50
+ # @see SportsOddsAPI::Models::MarketGetParams
51
+ def get(params = {})
52
+ parsed, options = SportsOddsAPI::MarketGetParams.dump_request(params)
53
+ query = SportsOddsAPI::Internal::Util.encode_query_params(parsed)
54
+ @client.request(
55
+ method: :get,
56
+ path: "markets/",
57
+ query: query.transform_keys(
58
+ bet_type_id: "betTypeID",
59
+ bookmaker_id: "bookmakerID",
60
+ is_main_market: "isMainMarket",
61
+ is_prop: "isProp",
62
+ is_sub_period: "isSubPeriod",
63
+ is_supported: "isSupported",
64
+ league_id: "leagueID",
65
+ odd_id: "oddID",
66
+ period_id: "periodID",
67
+ prop_type: "propType",
68
+ side_id: "sideID",
69
+ sport_id: "sportID",
70
+ stat_entity_id: "statEntityID",
71
+ stat_id: "statID"
72
+ ),
73
+ page: SportsOddsAPI::Internal::NextCursorPage,
74
+ model: SportsOddsAPI::Market,
75
+ options: options
76
+ )
77
+ end
78
+
79
+ # @api private
80
+ #
81
+ # @param client [SportsOddsAPI::Client]
82
+ def initialize(client:)
83
+ @client = client
84
+ end
85
+ end
86
+ end
87
+ end
@@ -2,6 +2,7 @@
2
2
 
3
3
  module SportsOddsAPI
4
4
  module Resources
5
+ # Get Player-related data
5
6
  class Players
6
7
  # Some parameter documentations has been truncated, see
7
8
  # {SportsOddsAPI::Models::PlayerGetParams} for more details.
@@ -10,7 +11,7 @@ module SportsOddsAPI
10
11
  #
11
12
  # @overload get(cursor: nil, event_id: nil, limit: nil, player_id: nil, team_id: nil, request_options: {})
12
13
  #
13
- # @param cursor [String] The cursor for the request. Used to get the next group of Players. This should b
14
+ # @param cursor [String] The cursor for the request. Used to get the next group of Players. This is an op
14
15
  #
15
16
  # @param event_id [String] EventID to get Players data for
16
17
  #
@@ -27,10 +28,11 @@ module SportsOddsAPI
27
28
  # @see SportsOddsAPI::Models::PlayerGetParams
28
29
  def get(params = {})
29
30
  parsed, options = SportsOddsAPI::PlayerGetParams.dump_request(params)
31
+ query = SportsOddsAPI::Internal::Util.encode_query_params(parsed)
30
32
  @client.request(
31
33
  method: :get,
32
34
  path: "players/",
33
- query: parsed.transform_keys(event_id: "eventID", player_id: "playerID", team_id: "teamID"),
35
+ query: query.transform_keys(event_id: "eventID", player_id: "playerID", team_id: "teamID"),
34
36
  page: SportsOddsAPI::Internal::NextCursorPage,
35
37
  model: SportsOddsAPI::Player,
36
38
  options: options
@@ -2,6 +2,7 @@
2
2
 
3
3
  module SportsOddsAPI
4
4
  module Resources
5
+ # Get Sport-related data
5
6
  class Sports
6
7
  # Get a list of sports
7
8
  #
@@ -2,6 +2,7 @@
2
2
 
3
3
  module SportsOddsAPI
4
4
  module Resources
5
+ # Get data on specific Stats
5
6
  class Stats
6
7
  # Some parameter documentations has been truncated, see
7
8
  # {SportsOddsAPI::Models::StatGetParams} for more details.
@@ -23,10 +24,11 @@ module SportsOddsAPI
23
24
  # @see SportsOddsAPI::Models::StatGetParams
24
25
  def get(params = {})
25
26
  parsed, options = SportsOddsAPI::StatGetParams.dump_request(params)
27
+ query = SportsOddsAPI::Internal::Util.encode_query_params(parsed)
26
28
  @client.request(
27
29
  method: :get,
28
30
  path: "stats/",
29
- query: parsed.transform_keys(sport_id: "sportID", stat_id: "statID", stat_level: "statLevel"),
31
+ query: query.transform_keys(sport_id: "sportID", stat_id: "statID", stat_level: "statLevel"),
30
32
  unwrap: :data,
31
33
  model: SportsOddsAPI::Internal::Type::ArrayOf[SportsOddsAPI::Stat],
32
34
  options: options
@@ -2,6 +2,7 @@
2
2
 
3
3
  module SportsOddsAPI
4
4
  module Resources
5
+ # Get info about Events (includes odds, results, teams, and other metadata)
5
6
  class Stream
6
7
  # Setup streamed (WebSocket) connection
7
8
  #
@@ -20,10 +21,11 @@ module SportsOddsAPI
20
21
  # @see SportsOddsAPI::Models::StreamEventsParams
21
22
  def events(params = {})
22
23
  parsed, options = SportsOddsAPI::StreamEventsParams.dump_request(params)
24
+ query = SportsOddsAPI::Internal::Util.encode_query_params(parsed)
23
25
  @client.request(
24
26
  method: :get,
25
27
  path: "stream/events",
26
- query: parsed.transform_keys(event_id: "eventID", league_id: "leagueID"),
28
+ query: query.transform_keys(event_id: "eventID", league_id: "leagueID"),
27
29
  model: SportsOddsAPI::Models::StreamEventsResponse,
28
30
  options: options
29
31
  )
@@ -2,6 +2,7 @@
2
2
 
3
3
  module SportsOddsAPI
4
4
  module Resources
5
+ # Get Team-related data
5
6
  class Teams
6
7
  # Some parameter documentations has been truncated, see
7
8
  # {SportsOddsAPI::Models::TeamGetParams} for more details.
@@ -10,7 +11,7 @@ module SportsOddsAPI
10
11
  #
11
12
  # @overload get(cursor: nil, league_id: nil, limit: nil, sport_id: nil, team_id: nil, request_options: {})
12
13
  #
13
- # @param cursor [String] The cursor for the request. Used to get the next group of Teams. This should be
14
+ # @param cursor [String] The cursor for the request. Used to get the next group of Teams. This is an opaq
14
15
  #
15
16
  # @param league_id [String] A single leagueID or comma-separated list of leagueIDs to get Teams for
16
17
  #
@@ -27,10 +28,11 @@ module SportsOddsAPI
27
28
  # @see SportsOddsAPI::Models::TeamGetParams
28
29
  def get(params = {})
29
30
  parsed, options = SportsOddsAPI::TeamGetParams.dump_request(params)
31
+ query = SportsOddsAPI::Internal::Util.encode_query_params(parsed)
30
32
  @client.request(
31
33
  method: :get,
32
34
  path: "teams/",
33
- query: parsed.transform_keys(league_id: "leagueID", sport_id: "sportID", team_id: "teamID"),
35
+ query: query.transform_keys(league_id: "leagueID", sport_id: "sportID", team_id: "teamID"),
34
36
  page: SportsOddsAPI::Internal::NextCursorPage,
35
37
  model: SportsOddsAPI::Team,
36
38
  options: options
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module SportsOddsAPI
4
- VERSION = "1.2.2"
4
+ VERSION = "1.3.0"
5
5
  end
@@ -60,6 +60,8 @@ require_relative "sports_odds_api/models/event_get_params"
60
60
  require_relative "sports_odds_api/models/league"
61
61
  require_relative "sports_odds_api/models/league_get_params"
62
62
  require_relative "sports_odds_api/models/league_get_response"
63
+ require_relative "sports_odds_api/models/market"
64
+ require_relative "sports_odds_api/models/market_get_params"
63
65
  require_relative "sports_odds_api/models/player"
64
66
  require_relative "sports_odds_api/models/player_get_params"
65
67
  require_relative "sports_odds_api/models/rate_limit_interval"
@@ -77,6 +79,7 @@ require_relative "sports_odds_api/models"
77
79
  require_relative "sports_odds_api/resources/account"
78
80
  require_relative "sports_odds_api/resources/events"
79
81
  require_relative "sports_odds_api/resources/leagues"
82
+ require_relative "sports_odds_api/resources/markets"
80
83
  require_relative "sports_odds_api/resources/players"
81
84
  require_relative "sports_odds_api/resources/sports"
82
85
  require_relative "sports_odds_api/resources/stats"
@@ -18,27 +18,39 @@ module SportsOddsAPI
18
18
  sig { returns(T.nilable(String)) }
19
19
  attr_reader :api_key_param
20
20
 
21
+ # Get info about Events (includes odds, results, teams, and other metadata)
21
22
  sig { returns(SportsOddsAPI::Resources::Events) }
22
23
  attr_reader :events
23
24
 
25
+ # Get metadata on supported Markets
26
+ sig { returns(SportsOddsAPI::Resources::Markets) }
27
+ attr_reader :markets
28
+
29
+ # Get Team-related data
24
30
  sig { returns(SportsOddsAPI::Resources::Teams) }
25
31
  attr_reader :teams
26
32
 
33
+ # Get Player-related data
27
34
  sig { returns(SportsOddsAPI::Resources::Players) }
28
35
  attr_reader :players
29
36
 
37
+ # Get League-related data
30
38
  sig { returns(SportsOddsAPI::Resources::Leagues) }
31
39
  attr_reader :leagues
32
40
 
41
+ # Get Sport-related data
33
42
  sig { returns(SportsOddsAPI::Resources::Sports) }
34
43
  attr_reader :sports
35
44
 
45
+ # Get data on specific Stats
36
46
  sig { returns(SportsOddsAPI::Resources::Stats) }
37
47
  attr_reader :stats
38
48
 
49
+ # Get data related to your Account & API key
39
50
  sig { returns(SportsOddsAPI::Resources::Account) }
40
51
  attr_reader :account
41
52
 
53
+ # Get info about Events (includes odds, results, teams, and other metadata)
42
54
  sig { returns(SportsOddsAPI::Resources::Stream) }
43
55
  attr_reader :stream
44
56
 
@@ -148,12 +148,20 @@ module SportsOddsAPI
148
148
  end
149
149
  end
150
150
 
151
+ # https://www.rfc-editor.org/rfc/rfc3986.html#section-3.3
152
+ RFC_3986_NOT_PCHARS = T.let(/[^A-Za-z0-9\-._~!$&'()*+,;=:@]+/, Regexp)
153
+
151
154
  class << self
152
155
  # @api private
153
156
  sig { params(uri: URI::Generic).returns(String) }
154
157
  def uri_origin(uri)
155
158
  end
156
159
 
160
+ # @api private
161
+ sig { params(path: T.any(String, Integer)).returns(String) }
162
+ def encode_path(path)
163
+ end
164
+
157
165
  # @api private
158
166
  sig { params(path: T.any(String, T::Array[String])).returns(String) }
159
167
  def interpolate_path(path)
@@ -296,11 +304,31 @@ module SportsOddsAPI
296
304
  end
297
305
 
298
306
  JSON_CONTENT =
299
- T.let(%r{^application/(?:vnd(?:\.[^.]+)*\+)?json(?!l)}, Regexp)
307
+ T.let(%r{^application/(?:[a-zA-Z0-9.-]+\+)?json(?!l)}, Regexp)
300
308
  JSONL_CONTENT =
301
309
  T.let(%r{^application/(:?x-(?:n|l)djson)|(:?(?:x-)?jsonl)}, Regexp)
302
310
 
303
311
  class << self
312
+ # @api private
313
+ sig do
314
+ params(query: SportsOddsAPI::Internal::AnyHash).returns(
315
+ SportsOddsAPI::Internal::AnyHash
316
+ )
317
+ end
318
+ def encode_query_params(query)
319
+ end
320
+
321
+ # @api private
322
+ sig do
323
+ params(
324
+ collection: SportsOddsAPI::Internal::AnyHash,
325
+ key: String,
326
+ element: T.anything
327
+ ).void
328
+ end
329
+ private def write_query_param_element!(collection, key, element)
330
+ end
331
+
304
332
  # @api private
305
333
  sig do
306
334
  params(