sleeper_rb 0.2.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 +7 -0
- data/.gitignore +15 -0
- data/.rspec +3 -0
- data/.rubocop.yml +18 -0
- data/.travis.yml +8 -0
- data/CHANGELOG.md +9 -0
- data/CODE_OF_CONDUCT.md +84 -0
- data/Gemfile +14 -0
- data/Gemfile.lock +91 -0
- data/LICENSE.txt +21 -0
- data/README.md +92 -0
- data/Rakefile +24 -0
- data/bin/console +15 -0
- data/bin/setup +8 -0
- data/docs/SleeperRb/BadRequest.html +106 -0
- data/docs/SleeperRb/Client.html +354 -0
- data/docs/SleeperRb/NotFound.html +106 -0
- data/docs/SleeperRb/RateLimitExceeded.html +106 -0
- data/docs/SleeperRb/Resources/Avatar.html +231 -0
- data/docs/SleeperRb/Resources/Draft/Metadata.html +419 -0
- data/docs/SleeperRb/Resources/Draft/Pick/Metadata.html +346 -0
- data/docs/SleeperRb/Resources/Draft/Pick.html +430 -0
- data/docs/SleeperRb/Resources/Draft/PickArray.html +108 -0
- data/docs/SleeperRb/Resources/Draft/Settings.html +361 -0
- data/docs/SleeperRb/Resources/Draft.html +560 -0
- data/docs/SleeperRb/Resources/DraftArray.html +198 -0
- data/docs/SleeperRb/Resources/League/Matchup.html +349 -0
- data/docs/SleeperRb/Resources/League/MatchupArray.html +108 -0
- data/docs/SleeperRb/Resources/League/Roster/Settings.html +415 -0
- data/docs/SleeperRb/Resources/League/Roster.html +409 -0
- data/docs/SleeperRb/Resources/League/RosterArray.html +108 -0
- data/docs/SleeperRb/Resources/League/ScoringSettings.html +808 -0
- data/docs/SleeperRb/Resources/League/Settings.html +648 -0
- data/docs/SleeperRb/Resources/League/Transaction/Metadata.html +119 -0
- data/docs/SleeperRb/Resources/League/Transaction/Settings.html +140 -0
- data/docs/SleeperRb/Resources/League/Transaction/WaiverBudget.html +292 -0
- data/docs/SleeperRb/Resources/League/Transaction.html +679 -0
- data/docs/SleeperRb/Resources/League/TransactionArray.html +272 -0
- data/docs/SleeperRb/Resources/League.html +688 -0
- data/docs/SleeperRb/Resources/LeagueArray.html +272 -0
- data/docs/SleeperRb/Resources/NflState.html +252 -0
- data/docs/SleeperRb/Resources/Player.html +860 -0
- data/docs/SleeperRb/Resources/PlayerArray.html +108 -0
- data/docs/SleeperRb/Resources/TradedPick.html +345 -0
- data/docs/SleeperRb/Resources/TradedPickArray.html +108 -0
- data/docs/SleeperRb/Resources/User/Metadata.html +140 -0
- data/docs/SleeperRb/Resources/User.html +406 -0
- data/docs/SleeperRb/Resources/UserArray.html +108 -0
- data/docs/SleeperRb/Resources.html +99 -0
- data/docs/SleeperRb/ServerError.html +106 -0
- data/docs/SleeperRb/Utilities/ArrayProxy.html +184 -0
- data/docs/SleeperRb/Utilities/Cache/ClassMethods.html +326 -0
- data/docs/SleeperRb/Utilities/Cache.html +253 -0
- data/docs/SleeperRb/Utilities/Request.html +120 -0
- data/docs/SleeperRb/Utilities/RosterPosition.html +239 -0
- data/docs/SleeperRb/Utilities.html +99 -0
- data/docs/SleeperRb.html +113 -0
- data/docs/created.rid +38 -0
- data/docs/css/fonts.css +167 -0
- data/docs/css/rdoc.css +619 -0
- data/docs/fonts/Lato-Light.ttf +0 -0
- data/docs/fonts/Lato-LightItalic.ttf +0 -0
- data/docs/fonts/Lato-Regular.ttf +0 -0
- data/docs/fonts/Lato-RegularItalic.ttf +0 -0
- data/docs/fonts/SourceCodePro-Bold.ttf +0 -0
- data/docs/fonts/SourceCodePro-Regular.ttf +0 -0
- data/docs/images/add.png +0 -0
- data/docs/images/arrow_up.png +0 -0
- data/docs/images/brick.png +0 -0
- data/docs/images/brick_link.png +0 -0
- data/docs/images/bug.png +0 -0
- data/docs/images/bullet_black.png +0 -0
- data/docs/images/bullet_toggle_minus.png +0 -0
- data/docs/images/bullet_toggle_plus.png +0 -0
- data/docs/images/date.png +0 -0
- data/docs/images/delete.png +0 -0
- data/docs/images/find.png +0 -0
- data/docs/images/loadingAnimation.gif +0 -0
- data/docs/images/macFFBgHack.png +0 -0
- data/docs/images/package.png +0 -0
- data/docs/images/page_green.png +0 -0
- data/docs/images/page_white_text.png +0 -0
- data/docs/images/page_white_width.png +0 -0
- data/docs/images/plugin.png +0 -0
- data/docs/images/ruby.png +0 -0
- data/docs/images/tag_blue.png +0 -0
- data/docs/images/tag_green.png +0 -0
- data/docs/images/transparent.png +0 -0
- data/docs/images/wrench.png +0 -0
- data/docs/images/wrench_orange.png +0 -0
- data/docs/images/zoom.png +0 -0
- data/docs/index.html +171 -0
- data/docs/js/darkfish.js +84 -0
- data/docs/js/navigation.js +105 -0
- data/docs/js/navigation.js.gz +0 -0
- data/docs/js/search.js +110 -0
- data/docs/js/search_index.js +1 -0
- data/docs/js/search_index.js.gz +0 -0
- data/docs/js/searcher.js +229 -0
- data/docs/js/searcher.js.gz +0 -0
- data/docs/table_of_contents.html +770 -0
- data/lib/sleeper_rb/client.rb +80 -0
- data/lib/sleeper_rb/resources/avatar.rb +43 -0
- data/lib/sleeper_rb/resources/draft/metadata.rb +83 -0
- data/lib/sleeper_rb/resources/draft/pick/metadata.rb +64 -0
- data/lib/sleeper_rb/resources/draft/pick.rb +85 -0
- data/lib/sleeper_rb/resources/draft/pick_array.rb +11 -0
- data/lib/sleeper_rb/resources/draft/settings.rb +73 -0
- data/lib/sleeper_rb/resources/draft.rb +129 -0
- data/lib/sleeper_rb/resources/draft_array.rb +25 -0
- data/lib/sleeper_rb/resources/league/matchup.rb +66 -0
- data/lib/sleeper_rb/resources/league/matchup_array.rb +11 -0
- data/lib/sleeper_rb/resources/league/roster/settings.rb +76 -0
- data/lib/sleeper_rb/resources/league/roster.rb +73 -0
- data/lib/sleeper_rb/resources/league/roster_array.rb +11 -0
- data/lib/sleeper_rb/resources/league/scoring_settings.rb +172 -0
- data/lib/sleeper_rb/resources/league/settings.rb +148 -0
- data/lib/sleeper_rb/resources/league/transaction/metadata.rb +22 -0
- data/lib/sleeper_rb/resources/league/transaction/settings.rb +22 -0
- data/lib/sleeper_rb/resources/league/transaction/waiver_budget.rb +52 -0
- data/lib/sleeper_rb/resources/league/transaction.rb +153 -0
- data/lib/sleeper_rb/resources/league/transaction_array.rb +43 -0
- data/lib/sleeper_rb/resources/league.rb +197 -0
- data/lib/sleeper_rb/resources/league_array.rb +41 -0
- data/lib/sleeper_rb/resources/nfl_state.rb +51 -0
- data/lib/sleeper_rb/resources/player.rb +189 -0
- data/lib/sleeper_rb/resources/player_array.rb +16 -0
- data/lib/sleeper_rb/resources/traded_pick.rb +63 -0
- data/lib/sleeper_rb/resources/traded_pick_array.rb +9 -0
- data/lib/sleeper_rb/resources/user/metadata.rb +20 -0
- data/lib/sleeper_rb/resources/user.rb +104 -0
- data/lib/sleeper_rb/resources/user_array.rb +9 -0
- data/lib/sleeper_rb/utilities/array_proxy.rb +47 -0
- data/lib/sleeper_rb/utilities/cache.rb +132 -0
- data/lib/sleeper_rb/utilities/request.rb +42 -0
- data/lib/sleeper_rb/utilities/roster_position.rb +30 -0
- data/lib/sleeper_rb/version.rb +5 -0
- data/lib/sleeper_rb.rb +15 -0
- data/sleeper_rb.gemspec +35 -0
- metadata +185 -0
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
# frozen-string-literal: true
|
|
2
|
+
|
|
3
|
+
module SleeperRb
|
|
4
|
+
module Resources
|
|
5
|
+
##
|
|
6
|
+
# Represents a traded draft pick for any season of the League.
|
|
7
|
+
class TradedPick
|
|
8
|
+
include SleeperRb::Utilities::Cache
|
|
9
|
+
|
|
10
|
+
##
|
|
11
|
+
# :attr_reader: league
|
|
12
|
+
|
|
13
|
+
##
|
|
14
|
+
# :attr_reader: season
|
|
15
|
+
|
|
16
|
+
##
|
|
17
|
+
# :attr_reader: round
|
|
18
|
+
|
|
19
|
+
##
|
|
20
|
+
# :attr_reader: previous_owner_id
|
|
21
|
+
|
|
22
|
+
##
|
|
23
|
+
# :attr_reader: roster_id
|
|
24
|
+
|
|
25
|
+
##
|
|
26
|
+
# :attr_reader: owner_id
|
|
27
|
+
|
|
28
|
+
##
|
|
29
|
+
# :attr_reader: draft
|
|
30
|
+
|
|
31
|
+
cached_attr :league, :draft, :season, :round, :roster_id, :previous_owner_id, :owner_id
|
|
32
|
+
|
|
33
|
+
skip_refresh :all
|
|
34
|
+
|
|
35
|
+
##
|
|
36
|
+
# :method: original_roster
|
|
37
|
+
# The roster which originally owned this pick.
|
|
38
|
+
#
|
|
39
|
+
# @return [{SleeperRb::Resources::League::Roster}[SleeperRb::Resources::league::Roster]]
|
|
40
|
+
cached_association :original_roster do
|
|
41
|
+
league.rosters.detect { |roster| roster.roster_id == roster_id }
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
##
|
|
45
|
+
# :method: previous_roster
|
|
46
|
+
# The last roster to have owned this pick before the current one (can be same as original_roster).
|
|
47
|
+
#
|
|
48
|
+
# @return [{SleeperRb::Resources::League::Roster}[SleeperRb::Resources::league::Roster]]
|
|
49
|
+
cached_association :previous_roster do
|
|
50
|
+
league.rosters.detect { |roster| roster.roster_id == previous_owner_id }
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
##
|
|
54
|
+
# :method: current_roster
|
|
55
|
+
# The roster which currently owns this pick.
|
|
56
|
+
#
|
|
57
|
+
# @return [{SleeperRb::Resources::League::Roster}[SleeperRb::Resources::league::Roster]]
|
|
58
|
+
cached_association :current_roster do
|
|
59
|
+
league.rosters.detect { |roster| roster.roster_id == owner_id }
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
end
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# frozen-string-literal: true
|
|
2
|
+
|
|
3
|
+
module SleeperRb
|
|
4
|
+
module Resources
|
|
5
|
+
class User
|
|
6
|
+
##
|
|
7
|
+
# Metadata exists only when the User object was retrieved from a league. Includes team_name for that league.
|
|
8
|
+
class Metadata
|
|
9
|
+
include SleeperRb::Utilities::Cache
|
|
10
|
+
|
|
11
|
+
##
|
|
12
|
+
# :attr_reader: team_name
|
|
13
|
+
|
|
14
|
+
cached_attr :team_name
|
|
15
|
+
|
|
16
|
+
skip_refresh :all
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative "user/metadata"
|
|
4
|
+
|
|
5
|
+
module SleeperRb
|
|
6
|
+
module Resources
|
|
7
|
+
##
|
|
8
|
+
# The User resource represents a single user in Sleeper. This also serves as the access points for associated data.
|
|
9
|
+
class User
|
|
10
|
+
include SleeperRb::Utilities::Request
|
|
11
|
+
include SleeperRb::Utilities::Cache
|
|
12
|
+
|
|
13
|
+
##
|
|
14
|
+
# :attr_reader: user_id
|
|
15
|
+
|
|
16
|
+
##
|
|
17
|
+
# :attr_reader: username
|
|
18
|
+
|
|
19
|
+
##
|
|
20
|
+
# :attr_reader: display_name
|
|
21
|
+
|
|
22
|
+
##
|
|
23
|
+
# :attr_reader: is_owner
|
|
24
|
+
|
|
25
|
+
##
|
|
26
|
+
# :method: metadata
|
|
27
|
+
#
|
|
28
|
+
# @return [{SleeperRb::Resources::User::Metadata}[rdoc-ref:SleeperRb::Resources::User::Metadata]]
|
|
29
|
+
|
|
30
|
+
##
|
|
31
|
+
# :method: metadata
|
|
32
|
+
#
|
|
33
|
+
# @return [{SleeperRb::Resources::User::Metadata}[rdoc-ref:SleeperRb::Resources::User::Metadata]]
|
|
34
|
+
|
|
35
|
+
##
|
|
36
|
+
# :method: avatar
|
|
37
|
+
#
|
|
38
|
+
# @return [{SleeperRb::Resources::Avatar}[rdoc-ref:SleeperRb::Resources::Avatar]]
|
|
39
|
+
|
|
40
|
+
cached_attr :user_id, :username, :display_name, :is_owner,
|
|
41
|
+
metadata: ->(hash) { Metadata.new(hash) },
|
|
42
|
+
avatar: ->(id) { id ? Resources::Avatar.new(avatar_id: id) : nil }
|
|
43
|
+
|
|
44
|
+
delegate(*Metadata.cached_attrs.keys, to: :metadata)
|
|
45
|
+
|
|
46
|
+
##
|
|
47
|
+
# :method: leagues
|
|
48
|
+
# Retrieves leagues for the user for the given season.
|
|
49
|
+
# :call-seq:
|
|
50
|
+
# leagues(season_year)
|
|
51
|
+
#
|
|
52
|
+
# @param season_year [String] The year in which the leagues were played
|
|
53
|
+
#
|
|
54
|
+
# @return [{SleeperRb::Resources::LeagueArray}[rdoc-ref:SleeperRb::Resources::LeagueArray]]
|
|
55
|
+
cached_association :leagues do |season_year|
|
|
56
|
+
retrieve_leagues!(season_year)
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
##
|
|
60
|
+
# :method: drafts
|
|
61
|
+
# Retrieves all drafts for the user for the given season
|
|
62
|
+
# :call-seq:
|
|
63
|
+
# drafts(season_year)
|
|
64
|
+
#
|
|
65
|
+
# @param season_year [String] The year in which the leagues were played
|
|
66
|
+
#
|
|
67
|
+
# @return [{SleeperRb::Resources::DraftArray}[rdoc-ref:SleeperRb::Resources::DraftArray]]
|
|
68
|
+
cached_association :drafts do |season_year|
|
|
69
|
+
retrieve_drafts!(season_year)
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
##
|
|
73
|
+
# Initializes a user, with either username or user_id.
|
|
74
|
+
#
|
|
75
|
+
# @param username [String] The current username
|
|
76
|
+
#
|
|
77
|
+
# @param user_id [String] The numerical user_id
|
|
78
|
+
def initialize(opts)
|
|
79
|
+
raise ArgumentError, "must provide either user_id or username" unless opts[:user_id] || opts[:username]
|
|
80
|
+
|
|
81
|
+
super
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
private
|
|
85
|
+
|
|
86
|
+
def retrieve_values!
|
|
87
|
+
uri = URI("#{BASE_URL}/user/#{@user_id || @username}")
|
|
88
|
+
execute_request(uri)
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
def retrieve_leagues!(season_year)
|
|
92
|
+
uri = URI("#{BASE_URL}/user/#{user_id}/leagues/nfl/#{season_year}")
|
|
93
|
+
response = execute_request(uri)
|
|
94
|
+
LeagueArray.new(response.map { |hash| Resources::League.new(hash) })
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
def retrieve_drafts!(season_year)
|
|
98
|
+
uri = URI("#{BASE_URL}/user/#{user_id}/drafts/nfl/#{season_year}")
|
|
99
|
+
response = execute_request(uri)
|
|
100
|
+
DraftArray.new(response.map { |hash| Resources::Draft.new(hash) })
|
|
101
|
+
end
|
|
102
|
+
end
|
|
103
|
+
end
|
|
104
|
+
end
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
# frozen-string-literal: true
|
|
2
|
+
|
|
3
|
+
require "delegate"
|
|
4
|
+
|
|
5
|
+
module SleeperRb
|
|
6
|
+
module Utilities
|
|
7
|
+
##
|
|
8
|
+
# A wrapper for arrays of various SleeperRb::Resources that implements a light ActiveRecord-inspired syntax
|
|
9
|
+
# for filtering the underlying collection.
|
|
10
|
+
#
|
|
11
|
+
# Valid operators for use in #where are: gt, gte, lt, lte, not.
|
|
12
|
+
class ArrayProxy < SimpleDelegator
|
|
13
|
+
VALID_OPERATORS = {
|
|
14
|
+
gt: ->(element, comparison) { element > comparison },
|
|
15
|
+
gte: ->(element, comparison) { element >= comparison },
|
|
16
|
+
lt: ->(element, comparison) { element < comparison },
|
|
17
|
+
lte: ->(element, comparison) { element <= comparison },
|
|
18
|
+
not: ->(element, comparison) { element != comparison },
|
|
19
|
+
eq: ->(element, comparison) { element == comparison },
|
|
20
|
+
in: ->(element, comparison) { comparison.include?(element) }
|
|
21
|
+
}.freeze
|
|
22
|
+
|
|
23
|
+
def where(options = {})
|
|
24
|
+
filtered = __getobj__.dup
|
|
25
|
+
options.each do |field, value|
|
|
26
|
+
value = { eq: value } unless value.is_a?(Hash)
|
|
27
|
+
raise ArgumentError, "Invalid operator, must be one of: #{valid_operators}" unless valid_keys?(value)
|
|
28
|
+
|
|
29
|
+
value.each do |operator, comparison|
|
|
30
|
+
filtered = filtered.select { |object| VALID_OPERATORS[operator].call(object.send(field), comparison) }
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
self.class.new(filtered)
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
private
|
|
37
|
+
|
|
38
|
+
def valid_operators
|
|
39
|
+
VALID_OPERATORS.keys.join(", ")
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def valid_keys?(hash)
|
|
43
|
+
hash.keys.all? { |key| VALID_OPERATORS.keys.include?(key) }
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module SleeperRb
|
|
4
|
+
module Utilities
|
|
5
|
+
##
|
|
6
|
+
# This module encapsulates the logic for caching and refreshing values retrieved from the Sleeper API.
|
|
7
|
+
module Cache
|
|
8
|
+
##
|
|
9
|
+
# Methods to be extended into the class when included.
|
|
10
|
+
module ClassMethods
|
|
11
|
+
DEFAULT_TRANSLATORS = {
|
|
12
|
+
int_to_bool: ->(int) { int == 1 },
|
|
13
|
+
float: ->(float) { float.to_f.round(2) },
|
|
14
|
+
timestamp: ->(epoch_string) { Time.at(epoch_string.to_i / 1000).utc }
|
|
15
|
+
}.freeze
|
|
16
|
+
##
|
|
17
|
+
# Creates a memoized attribute reader for the named attributes.
|
|
18
|
+
#
|
|
19
|
+
# = Example
|
|
20
|
+
# +cached_attr :display_name, :username, foo: ->(x) { x + 3 }+
|
|
21
|
+
def cached_attr(*attrs)
|
|
22
|
+
attrs.each do |attr|
|
|
23
|
+
if attr.is_a?(Hash)
|
|
24
|
+
attr.each do |field_name, translator|
|
|
25
|
+
translator = DEFAULT_TRANSLATORS[translator] if translator.is_a?(Symbol)
|
|
26
|
+
create_method(field_name, translator)
|
|
27
|
+
end
|
|
28
|
+
else
|
|
29
|
+
create_method(attr, ->(x) { x })
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
##
|
|
35
|
+
# Creates a memoized association that returns another resource.
|
|
36
|
+
def cached_association(name, &block)
|
|
37
|
+
define_method(name) do |arg = nil|
|
|
38
|
+
if arg
|
|
39
|
+
cached_associations[name] ||= {}
|
|
40
|
+
cached_associations[name][arg.to_s] ||= instance_exec(arg, &block)
|
|
41
|
+
else
|
|
42
|
+
cached_associations[name] ||= instance_exec(&block)
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
##
|
|
48
|
+
# Takes in a list of fields which should be excluded from refresh. Use :all for models which do not have
|
|
49
|
+
# any endpoint but only retrieve their data from another object. These models have no API source to refresh
|
|
50
|
+
# themselves, but they still have associations.
|
|
51
|
+
def skip_refresh(*fields)
|
|
52
|
+
fields.any? { |field| field == :all } ? @skip_refresh_fields = :all : skip_refresh_fields.concat(fields)
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
##
|
|
56
|
+
# The stored mapping of cached attribute names to their translator functions.
|
|
57
|
+
def cached_attrs
|
|
58
|
+
@cached_attrs ||= {}
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
##
|
|
62
|
+
# The stored list of fields which should be excluded from refresh.
|
|
63
|
+
def skip_refresh_fields
|
|
64
|
+
@skip_refresh_fields ||= []
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
private
|
|
68
|
+
|
|
69
|
+
def create_method(field_name, translator)
|
|
70
|
+
cached_attrs[field_name.to_sym] = translator
|
|
71
|
+
skip_refresh_fields << field_name.to_sym if field_name.to_s =~ /\w+_id/
|
|
72
|
+
define_method(field_name) do
|
|
73
|
+
ivar = :"@#{field_name}"
|
|
74
|
+
instance_variable_get(ivar) || instance_variable_set(ivar, translator.call(values[field_name.to_sym]))
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
##
|
|
80
|
+
# Ensures that ClassMethods are extended into the base class when including.
|
|
81
|
+
def self.included(base)
|
|
82
|
+
base.extend ClassMethods
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
##
|
|
86
|
+
# Sets up an object with values for any cached_attrs pre-initialized if provided.
|
|
87
|
+
#
|
|
88
|
+
# @param opts [Hash] Key/value pairs that can match any cached_attr.
|
|
89
|
+
def initialize(opts = {})
|
|
90
|
+
opts.slice(*cached_attrs.keys).each do |key, val|
|
|
91
|
+
instance_variable_set(:"@#{key}", cached_attrs[key].call(val))
|
|
92
|
+
end
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
##
|
|
96
|
+
# Refreshes all associations and memoized values set by cached_attr.
|
|
97
|
+
#
|
|
98
|
+
# @return [self]
|
|
99
|
+
def refresh
|
|
100
|
+
cached_attrs.keys.reject { |k| skip_refresh_fields == :all || skip_refresh_fields.include?(k) }.each do |attr|
|
|
101
|
+
ivar = :"@#{attr}"
|
|
102
|
+
instance_variable_set(ivar, nil)
|
|
103
|
+
end
|
|
104
|
+
@values = nil
|
|
105
|
+
@cached_associations = {}
|
|
106
|
+
self
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
private
|
|
110
|
+
|
|
111
|
+
def cached_attrs
|
|
112
|
+
self.class.cached_attrs
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
def skip_refresh_fields
|
|
116
|
+
self.class.skip_refresh_fields
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
def cached_associations
|
|
120
|
+
@cached_associations ||= {}
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
def values
|
|
124
|
+
@values ||= retrieve_values!
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
def retrieve_values!
|
|
128
|
+
{}
|
|
129
|
+
end
|
|
130
|
+
end
|
|
131
|
+
end
|
|
132
|
+
end
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "net/http"
|
|
4
|
+
require "json"
|
|
5
|
+
require "tempfile"
|
|
6
|
+
|
|
7
|
+
module SleeperRb
|
|
8
|
+
module Utilities
|
|
9
|
+
##
|
|
10
|
+
# This module encapsulates the logic for handling the response when querying from the Sleeper API.
|
|
11
|
+
module Request
|
|
12
|
+
BASE_URL = "https://api.sleeper.app/v1"
|
|
13
|
+
CDN_BASE_URL = "https://sleepercdn.com"
|
|
14
|
+
|
|
15
|
+
private
|
|
16
|
+
|
|
17
|
+
def execute_request(url)
|
|
18
|
+
response = Net::HTTP.get_response(URI(url))
|
|
19
|
+
|
|
20
|
+
case response.code.to_i
|
|
21
|
+
when 200 then JSON.parse(response.body, symbolize_names: true)
|
|
22
|
+
when 400 then raise BadRequest
|
|
23
|
+
when 404 then raise NotFound
|
|
24
|
+
when 429 then raise RateLimitExceeded
|
|
25
|
+
else raise ServerError
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def download_file(url, filename)
|
|
30
|
+
uri = URI(url)
|
|
31
|
+
Net::HTTP.start(uri.host, uri.port, use_ssl: true) do |http|
|
|
32
|
+
resp = http.get(uri.path)
|
|
33
|
+
file = Tempfile.new(filename)
|
|
34
|
+
file.binmode
|
|
35
|
+
file.write(resp.body)
|
|
36
|
+
file.flush
|
|
37
|
+
file
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module SleeperRb
|
|
4
|
+
module Utilities
|
|
5
|
+
##
|
|
6
|
+
# A string representing a roster position. See VALID_ROSTER_POSITIONS.
|
|
7
|
+
# For every possible position in VALID_ROSTER_POSITIONS, there is a corresponding predicate method (e.g. `qb?`).
|
|
8
|
+
class RosterPosition
|
|
9
|
+
attr_reader :position
|
|
10
|
+
|
|
11
|
+
def initialize(position)
|
|
12
|
+
@position = position.upcase
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
VALID_ROSTER_POSITIONS = %w[
|
|
16
|
+
qb rb wr te k dst flex bn ir super_flex ol dl de lb olb mlb fs ss db cb nb c rg lg lt rt ot g
|
|
17
|
+
].freeze
|
|
18
|
+
|
|
19
|
+
VALID_ROSTER_POSITIONS.each do |position_key|
|
|
20
|
+
define_method("#{position_key}?") { position == position_key.upcase }
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def ==(other)
|
|
24
|
+
return position == other.position.upcase if other.respond_to?(:position)
|
|
25
|
+
|
|
26
|
+
position == other.upcase
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
data/lib/sleeper_rb.rb
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "active_support/core_ext/module/delegation"
|
|
4
|
+
require_relative "sleeper_rb/version"
|
|
5
|
+
require_relative "sleeper_rb/client"
|
|
6
|
+
|
|
7
|
+
module SleeperRb
|
|
8
|
+
class BadRequest < StandardError; end
|
|
9
|
+
|
|
10
|
+
class NotFound < StandardError; end
|
|
11
|
+
|
|
12
|
+
class ServerError < StandardError; end
|
|
13
|
+
|
|
14
|
+
class RateLimitExceeded < StandardError; end
|
|
15
|
+
end
|
data/sleeper_rb.gemspec
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative "lib/sleeper_rb/version"
|
|
4
|
+
|
|
5
|
+
Gem::Specification.new do |spec|
|
|
6
|
+
spec.name = "sleeper_rb"
|
|
7
|
+
spec.version = SleeperRb::VERSION
|
|
8
|
+
spec.authors = ["Stephen Weil"]
|
|
9
|
+
spec.email = ["stephen.weil@gmail.com"]
|
|
10
|
+
|
|
11
|
+
spec.summary = "A wrapper for interacting with the Sleeper Fantasy Football API."
|
|
12
|
+
spec.description = "Provides an object-oriented interface for the Sleeper Fantasy Football API."
|
|
13
|
+
spec.homepage = "https://github.com/sjweil9/sleeper_rb"
|
|
14
|
+
spec.license = "MIT"
|
|
15
|
+
spec.required_ruby_version = ">= 2.5.0"
|
|
16
|
+
|
|
17
|
+
spec.metadata["homepage_uri"] = spec.homepage
|
|
18
|
+
spec.metadata["source_code_uri"] = "https://github.com/sjweil9/sleeper_rb"
|
|
19
|
+
spec.metadata["changelog_uri"] = "https://github.com/sjweil9/sleeper_rb/CHANGELOG.md"
|
|
20
|
+
|
|
21
|
+
# Specify which files should be added to the gem when it is released.
|
|
22
|
+
# The `git ls-files -z` loads the files in the RubyGem that have been added into git.
|
|
23
|
+
spec.files = Dir.chdir(File.expand_path(__dir__)) do
|
|
24
|
+
`git ls-files -z`.split("\x0").reject { |f| f.match(%r{\A(?:test|spec|features)/}) }
|
|
25
|
+
end
|
|
26
|
+
spec.bindir = "exe"
|
|
27
|
+
spec.executables = spec.files.grep(%r{\Aexe/}) { |f| File.basename(f) }
|
|
28
|
+
spec.require_paths = ["lib"]
|
|
29
|
+
|
|
30
|
+
# Uncomment to register a new dependency of your gem
|
|
31
|
+
# spec.add_dependency "example-gem", "~> 1.0"
|
|
32
|
+
|
|
33
|
+
# For more information and examples about making a new gem, checkout our
|
|
34
|
+
# guide at: https://bundler.io/guides/creating_gem.html
|
|
35
|
+
end
|