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.
Files changed (140) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +15 -0
  3. data/.rspec +3 -0
  4. data/.rubocop.yml +18 -0
  5. data/.travis.yml +8 -0
  6. data/CHANGELOG.md +9 -0
  7. data/CODE_OF_CONDUCT.md +84 -0
  8. data/Gemfile +14 -0
  9. data/Gemfile.lock +91 -0
  10. data/LICENSE.txt +21 -0
  11. data/README.md +92 -0
  12. data/Rakefile +24 -0
  13. data/bin/console +15 -0
  14. data/bin/setup +8 -0
  15. data/docs/SleeperRb/BadRequest.html +106 -0
  16. data/docs/SleeperRb/Client.html +354 -0
  17. data/docs/SleeperRb/NotFound.html +106 -0
  18. data/docs/SleeperRb/RateLimitExceeded.html +106 -0
  19. data/docs/SleeperRb/Resources/Avatar.html +231 -0
  20. data/docs/SleeperRb/Resources/Draft/Metadata.html +419 -0
  21. data/docs/SleeperRb/Resources/Draft/Pick/Metadata.html +346 -0
  22. data/docs/SleeperRb/Resources/Draft/Pick.html +430 -0
  23. data/docs/SleeperRb/Resources/Draft/PickArray.html +108 -0
  24. data/docs/SleeperRb/Resources/Draft/Settings.html +361 -0
  25. data/docs/SleeperRb/Resources/Draft.html +560 -0
  26. data/docs/SleeperRb/Resources/DraftArray.html +198 -0
  27. data/docs/SleeperRb/Resources/League/Matchup.html +349 -0
  28. data/docs/SleeperRb/Resources/League/MatchupArray.html +108 -0
  29. data/docs/SleeperRb/Resources/League/Roster/Settings.html +415 -0
  30. data/docs/SleeperRb/Resources/League/Roster.html +409 -0
  31. data/docs/SleeperRb/Resources/League/RosterArray.html +108 -0
  32. data/docs/SleeperRb/Resources/League/ScoringSettings.html +808 -0
  33. data/docs/SleeperRb/Resources/League/Settings.html +648 -0
  34. data/docs/SleeperRb/Resources/League/Transaction/Metadata.html +119 -0
  35. data/docs/SleeperRb/Resources/League/Transaction/Settings.html +140 -0
  36. data/docs/SleeperRb/Resources/League/Transaction/WaiverBudget.html +292 -0
  37. data/docs/SleeperRb/Resources/League/Transaction.html +679 -0
  38. data/docs/SleeperRb/Resources/League/TransactionArray.html +272 -0
  39. data/docs/SleeperRb/Resources/League.html +688 -0
  40. data/docs/SleeperRb/Resources/LeagueArray.html +272 -0
  41. data/docs/SleeperRb/Resources/NflState.html +252 -0
  42. data/docs/SleeperRb/Resources/Player.html +860 -0
  43. data/docs/SleeperRb/Resources/PlayerArray.html +108 -0
  44. data/docs/SleeperRb/Resources/TradedPick.html +345 -0
  45. data/docs/SleeperRb/Resources/TradedPickArray.html +108 -0
  46. data/docs/SleeperRb/Resources/User/Metadata.html +140 -0
  47. data/docs/SleeperRb/Resources/User.html +406 -0
  48. data/docs/SleeperRb/Resources/UserArray.html +108 -0
  49. data/docs/SleeperRb/Resources.html +99 -0
  50. data/docs/SleeperRb/ServerError.html +106 -0
  51. data/docs/SleeperRb/Utilities/ArrayProxy.html +184 -0
  52. data/docs/SleeperRb/Utilities/Cache/ClassMethods.html +326 -0
  53. data/docs/SleeperRb/Utilities/Cache.html +253 -0
  54. data/docs/SleeperRb/Utilities/Request.html +120 -0
  55. data/docs/SleeperRb/Utilities/RosterPosition.html +239 -0
  56. data/docs/SleeperRb/Utilities.html +99 -0
  57. data/docs/SleeperRb.html +113 -0
  58. data/docs/created.rid +38 -0
  59. data/docs/css/fonts.css +167 -0
  60. data/docs/css/rdoc.css +619 -0
  61. data/docs/fonts/Lato-Light.ttf +0 -0
  62. data/docs/fonts/Lato-LightItalic.ttf +0 -0
  63. data/docs/fonts/Lato-Regular.ttf +0 -0
  64. data/docs/fonts/Lato-RegularItalic.ttf +0 -0
  65. data/docs/fonts/SourceCodePro-Bold.ttf +0 -0
  66. data/docs/fonts/SourceCodePro-Regular.ttf +0 -0
  67. data/docs/images/add.png +0 -0
  68. data/docs/images/arrow_up.png +0 -0
  69. data/docs/images/brick.png +0 -0
  70. data/docs/images/brick_link.png +0 -0
  71. data/docs/images/bug.png +0 -0
  72. data/docs/images/bullet_black.png +0 -0
  73. data/docs/images/bullet_toggle_minus.png +0 -0
  74. data/docs/images/bullet_toggle_plus.png +0 -0
  75. data/docs/images/date.png +0 -0
  76. data/docs/images/delete.png +0 -0
  77. data/docs/images/find.png +0 -0
  78. data/docs/images/loadingAnimation.gif +0 -0
  79. data/docs/images/macFFBgHack.png +0 -0
  80. data/docs/images/package.png +0 -0
  81. data/docs/images/page_green.png +0 -0
  82. data/docs/images/page_white_text.png +0 -0
  83. data/docs/images/page_white_width.png +0 -0
  84. data/docs/images/plugin.png +0 -0
  85. data/docs/images/ruby.png +0 -0
  86. data/docs/images/tag_blue.png +0 -0
  87. data/docs/images/tag_green.png +0 -0
  88. data/docs/images/transparent.png +0 -0
  89. data/docs/images/wrench.png +0 -0
  90. data/docs/images/wrench_orange.png +0 -0
  91. data/docs/images/zoom.png +0 -0
  92. data/docs/index.html +171 -0
  93. data/docs/js/darkfish.js +84 -0
  94. data/docs/js/navigation.js +105 -0
  95. data/docs/js/navigation.js.gz +0 -0
  96. data/docs/js/search.js +110 -0
  97. data/docs/js/search_index.js +1 -0
  98. data/docs/js/search_index.js.gz +0 -0
  99. data/docs/js/searcher.js +229 -0
  100. data/docs/js/searcher.js.gz +0 -0
  101. data/docs/table_of_contents.html +770 -0
  102. data/lib/sleeper_rb/client.rb +80 -0
  103. data/lib/sleeper_rb/resources/avatar.rb +43 -0
  104. data/lib/sleeper_rb/resources/draft/metadata.rb +83 -0
  105. data/lib/sleeper_rb/resources/draft/pick/metadata.rb +64 -0
  106. data/lib/sleeper_rb/resources/draft/pick.rb +85 -0
  107. data/lib/sleeper_rb/resources/draft/pick_array.rb +11 -0
  108. data/lib/sleeper_rb/resources/draft/settings.rb +73 -0
  109. data/lib/sleeper_rb/resources/draft.rb +129 -0
  110. data/lib/sleeper_rb/resources/draft_array.rb +25 -0
  111. data/lib/sleeper_rb/resources/league/matchup.rb +66 -0
  112. data/lib/sleeper_rb/resources/league/matchup_array.rb +11 -0
  113. data/lib/sleeper_rb/resources/league/roster/settings.rb +76 -0
  114. data/lib/sleeper_rb/resources/league/roster.rb +73 -0
  115. data/lib/sleeper_rb/resources/league/roster_array.rb +11 -0
  116. data/lib/sleeper_rb/resources/league/scoring_settings.rb +172 -0
  117. data/lib/sleeper_rb/resources/league/settings.rb +148 -0
  118. data/lib/sleeper_rb/resources/league/transaction/metadata.rb +22 -0
  119. data/lib/sleeper_rb/resources/league/transaction/settings.rb +22 -0
  120. data/lib/sleeper_rb/resources/league/transaction/waiver_budget.rb +52 -0
  121. data/lib/sleeper_rb/resources/league/transaction.rb +153 -0
  122. data/lib/sleeper_rb/resources/league/transaction_array.rb +43 -0
  123. data/lib/sleeper_rb/resources/league.rb +197 -0
  124. data/lib/sleeper_rb/resources/league_array.rb +41 -0
  125. data/lib/sleeper_rb/resources/nfl_state.rb +51 -0
  126. data/lib/sleeper_rb/resources/player.rb +189 -0
  127. data/lib/sleeper_rb/resources/player_array.rb +16 -0
  128. data/lib/sleeper_rb/resources/traded_pick.rb +63 -0
  129. data/lib/sleeper_rb/resources/traded_pick_array.rb +9 -0
  130. data/lib/sleeper_rb/resources/user/metadata.rb +20 -0
  131. data/lib/sleeper_rb/resources/user.rb +104 -0
  132. data/lib/sleeper_rb/resources/user_array.rb +9 -0
  133. data/lib/sleeper_rb/utilities/array_proxy.rb +47 -0
  134. data/lib/sleeper_rb/utilities/cache.rb +132 -0
  135. data/lib/sleeper_rb/utilities/request.rb +42 -0
  136. data/lib/sleeper_rb/utilities/roster_position.rb +30 -0
  137. data/lib/sleeper_rb/version.rb +5 -0
  138. data/lib/sleeper_rb.rb +15 -0
  139. data/sleeper_rb.gemspec +35 -0
  140. 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,9 @@
1
+ # frozen-string-literal: true
2
+
3
+ module SleeperRb
4
+ module Resources
5
+ ##
6
+ # Implements {SleeperRb::Utilities::ArrayProxy} and wraps TradedPick objects.
7
+ class TradedPickArray < SleeperRb::Utilities::ArrayProxy; end
8
+ end
9
+ 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,9 @@
1
+ # frozen-string-literal: true
2
+
3
+ module SleeperRb
4
+ module Resources
5
+ ##
6
+ # Implements {SleeperRb::Utilities::ArrayProxy}[rdoc-ref:SleeperRb::Utilities::ArrayProxy] and wraps User objects.
7
+ class UserArray < SleeperRb::Utilities::ArrayProxy; end
8
+ end
9
+ 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
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SleeperRb
4
+ VERSION = "0.2.0"
5
+ 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
@@ -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