nfl_data 0.0.10 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (59) hide show
  1. checksums.yaml +5 -5
  2. data/.envrc +7 -0
  3. data/.gitignore +3 -3
  4. data/.rspec +1 -0
  5. data/.standard.yml +2 -0
  6. data/.travis.yml +6 -0
  7. data/CHANGELOG.md +7 -0
  8. data/Gemfile +1 -1
  9. data/README.md +94 -21
  10. data/Rakefile +5 -6
  11. data/bin/console +1 -1
  12. data/bin/setup +8 -0
  13. data/lib/nfl_data.rb +10 -18
  14. data/lib/nfl_data/api/player.rb +8 -30
  15. data/lib/nfl_data/api/schedule.rb +19 -0
  16. data/lib/nfl_data/api/statline.rb +8 -23
  17. data/lib/nfl_data/models/game.rb +5 -0
  18. data/lib/nfl_data/models/player.rb +11 -19
  19. data/lib/nfl_data/models/schedule.rb +12 -0
  20. data/lib/nfl_data/models/statline.rb +18 -28
  21. data/lib/nfl_data/my_sports_feeds/client.rb +45 -0
  22. data/lib/nfl_data/my_sports_feeds/players_feed.rb +18 -0
  23. data/lib/nfl_data/my_sports_feeds/seasonal_games_feed.rb +22 -0
  24. data/lib/nfl_data/my_sports_feeds/weekly_player_gamelogs.rb +21 -0
  25. data/lib/nfl_data/parsers/player_parser.rb +21 -81
  26. data/lib/nfl_data/parsers/schedule_parser.rb +20 -0
  27. data/lib/nfl_data/parsers/statline_parser.rb +27 -76
  28. data/lib/nfl_data/version.rb +1 -1
  29. data/nfl_data.gemspec +23 -21
  30. data/spec/api/player_spec.rb +24 -0
  31. data/spec/api/schedule_spec.rb +20 -0
  32. data/spec/api/statline_spec.rb +31 -0
  33. data/spec/models/game_spec.rb +15 -0
  34. data/spec/models/player_spec.rb +42 -0
  35. data/spec/models/schedule_spec.rb +17 -0
  36. data/spec/models/statline_spec.rb +63 -0
  37. data/spec/my_sports_feeds/client_spec.rb +17 -0
  38. data/spec/my_sports_feeds/players_feed_spec.rb +49 -0
  39. data/spec/my_sports_feeds/seasonal_games_feed_spec.rb +41 -0
  40. data/spec/my_sports_feeds/weekly_player_gamelogs_spec.rb +144 -0
  41. data/spec/parsers/player_parser_spec.rb +63 -0
  42. data/spec/parsers/schedule_parser_spec.rb +41 -0
  43. data/spec/parsers/statline_parser_spec.rb +68 -0
  44. data/spec/spec_helper.rb +55 -0
  45. metadata +107 -45
  46. data/lib/nfl_data/api/team.rb +0 -26
  47. data/lib/nfl_data/models/team.rb +0 -39
  48. data/lib/nfl_data/parsers/parser_helper.rb +0 -6
  49. data/lib/nfl_data/parsers/team_parser.rb +0 -91
  50. data/test/nfl_data/api/player_test.rb +0 -25
  51. data/test/nfl_data/api/statline_test.rb +0 -21
  52. data/test/nfl_data/api/team_test.rb +0 -13
  53. data/test/nfl_data/models/player_test.rb +0 -75
  54. data/test/nfl_data/models/statline_test.rb +0 -126
  55. data/test/nfl_data/models/team_test.rb +0 -45
  56. data/test/nfl_data/parsers/player_parser_test.rb +0 -80
  57. data/test/nfl_data/parsers/statline_parser_test.rb +0 -35
  58. data/test/nfl_data/parsers/team_parser_test.rb +0 -41
  59. data/test/test_helper.rb +0 -12
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 9fd1960572c8ad1676477b259f550f616665d587
4
- data.tar.gz: 23369e62b15791b7885d8b21ab5ab85a9c2cab04
2
+ SHA256:
3
+ metadata.gz: e8aae3b48befa5e49a3400e2e4955cca323f7e3ed4aa7e4ecd17d888eea7029c
4
+ data.tar.gz: 9e03e003f759db815c8d8be2eca6592ce610fa1148b709f8156002ffe86a26a7
5
5
  SHA512:
6
- metadata.gz: 393b22f179d6c5eb1d7e986d727e634ba647fdd8534bdc6a40f00e9e8ec0a33837f5a795f264d8966e3db74f523c3291ce10e386e09a3215cd18dfbd588ff653
7
- data.tar.gz: 3473ede86be3f67842d75ba6fe118d70625781e71bb8bd1cf555908722bfe4bc62815fad05466cfdeb30b26e5871a1bc6c97cc402877a79e9b1c1ca3872b4798
6
+ metadata.gz: 10f022e51cec852029038277ffeaff0887946bb44129ee309e32329f427cea141980fbb5f98d34d5cd9feca1c7537c8f7367e7497546fa5a738b93e1ef618e47
7
+ data.tar.gz: 73788afad7732273a27f4daf8f66028b0baf7b96b0f66a15a6174a73c16778775647712ac3b1f69f67ddb57dd91d8c1ec0d2b27bae836fe89fec357dacd05a64
data/.envrc ADDED
@@ -0,0 +1,7 @@
1
+ # Load .env variables automatically with direnv
2
+ # http://direnv.net/
3
+
4
+ if [ -e ./.env ]
5
+ then
6
+ dotenv
7
+ fi
data/.gitignore CHANGED
@@ -12,14 +12,14 @@ lib/bundler/man
12
12
  pkg
13
13
  rdoc
14
14
  spec/reports
15
- test/tmp
16
- test/version_tmp
17
15
  tmp
18
16
  *.bundle
19
17
  *.so
20
18
  *.o
21
19
  *.a
22
20
  mkmf.log
23
- test/fixtures/cassettes
24
21
  .ruby-version
25
22
  .ruby-gemset
23
+ spec/examples.txt
24
+ spec/cassettes
25
+ .env
data/.rspec ADDED
@@ -0,0 +1 @@
1
+ --require spec_helper
@@ -0,0 +1,2 @@
1
+ parallel: true
2
+ format: progress
@@ -0,0 +1,6 @@
1
+ language: ruby
2
+ cache: bundler
3
+ rvm:
4
+ - 2.7
5
+ - 2.6
6
+ - 2.5
@@ -0,0 +1,7 @@
1
+ ## 0.1.0 / 2020-08-31
2
+
3
+ * No more NFL.com parsing, using MySportsFeeds API instead. This will require users to acquire their own MySportsFeeds accounts and API tokens. Please see the README or [the MySportsFeeds website](https://www.mysportsfeeds.com for more details.
4
+
5
+ ## 0.0.14 and previous
6
+
7
+ * This version and previous used Nokogiri to parse NFL.com. NFL has since changed their website and broken all of the parsing code. Any version before here probably won't work and should be upgraded.
data/Gemfile CHANGED
@@ -1,4 +1,4 @@
1
- source 'https://rubygems.org'
1
+ source "https://rubygems.org"
2
2
 
3
3
  # Specify your gem's dependencies in nfl_data.gemspec
4
4
  gemspec
data/README.md CHANGED
@@ -1,11 +1,21 @@
1
1
  # NflData
2
2
 
3
- This gem is for parsing data from NFL.com and returning a JSON blob that can be used for any fantasy related activities you may wish to pursue.
3
+ This gem is for parsing data from NFL.com and returning a JSON blob that can be used
4
+ for any fantasy related activities you may wish to pursue.
4
5
 
5
- This was written by @mikesells and @thetizzo
6
+ **However** since NFL.com has updated their website to a much more difficult to parse version,
7
+ this gem is now going to be using [MySportsFeeds API](https://www.mysportsfeeds.com/data-feeds/) instead.
8
+
9
+ Thanks to the people at [MySportsFeeds](https://www.mysportsfeeds.com) for providing an affordable
10
+ service for this type of data. If you would like to use this gem I encourage you to head over to their
11
+ website and sign up for an account.
12
+
13
+ This gem was written by @mikesells and @thetizzo
6
14
 
7
15
  [![Gem Version](https://badge.fury.io/rb/nfl_data.svg)](http://badge.fury.io/rb/nfl_data)
8
16
 
17
+ [![Build Status](https://travis-ci.com/thetizzo/nfl_data.svg?branch=master)](https://travis-ci.com/thetizzo/nfl_data)
18
+
9
19
  ## Installation
10
20
 
11
21
  Add this line to your application's Gemfile:
@@ -20,24 +30,56 @@ Or install it yourself as:
20
30
 
21
31
  $ gem install nfl_data
22
32
 
23
- ## Usage
33
+ ## Configuration
24
34
 
25
- To use this gem there are some simple calls that can be made. Everything should return JSON.
35
+ Configuration for [MySportsFeeds API](https://www.mysportsfeeds.com/data-feeds/) credentials
36
+ can be set with the following Environment Variables:
26
37
 
27
- ### Players
38
+ ```
39
+ MYSPORTSFEEDS_API_KEY
40
+ MYSPORTSFEEDS_API_HOST
41
+ MYSPORTSFEEDS_API_VERSION
42
+ ```
28
43
 
29
- Pull players by position:
44
+ ### MySportsFeeds API Docs
30
45
 
31
- ```ruby
32
- NflData::API::Player.get_all
46
+ https://www.mysportsfeeds.com/data-feeds/api-docs/
33
47
 
34
- NflData::API::Player.get_quarterbacks
48
+ I've written this to use >= v2.1 of the MSF API.
35
49
 
36
- NflData::API::Player.get_runningbacks
50
+ ## Usage
37
51
 
38
- NflData::API::Player.get_wide_receivers
52
+ To use this gem there are some simple calls that can be made. Everything will return JSON.
53
+
54
+ ### Players
39
55
 
40
- NflData::API::Player.get_tight_ends
56
+ Pull players by position. Not passing a position param will pull all players.
57
+
58
+ Position param is passed through to MySportsFeeds and can be any value they accept. Please see
59
+ their docs above.
60
+
61
+ ```ruby
62
+ NflData::API::Player.new.players(position: "qb")
63
+ ```
64
+
65
+ #### Example Response
66
+
67
+ ```json
68
+ {
69
+ "players": [
70
+ {
71
+ "first_name": "John",
72
+ "last_name": "Elway",
73
+ "full_name": "John Elway",
74
+ "position": "QB",
75
+ "number": 7,
76
+ "team": "DEN",
77
+ "msf_player_id": 12345,
78
+ "image_source":""
79
+ },
80
+ ...
81
+ ]
82
+ }
41
83
  ```
42
84
 
43
85
  ### Statlines
@@ -45,21 +87,52 @@ Pull players by position:
45
87
  Pull statlines by week and year:
46
88
 
47
89
  ```ruby
48
- NflData::API::Statline.get_passing(1, 2014)
49
-
50
- NflData::API::Statline.get_rushing(1, 2014)
51
-
52
- NflData::API::Statline.get_receiving(1, 2014)
90
+ NflData::API::Statline.new.statlines(year: 2020, week: 1)
53
91
  ```
54
92
 
55
- ### Teams
93
+ #### Example Response
94
+
95
+ ```json
96
+ {
97
+ "statlines": [
98
+ {
99
+ "rush_atts": 2,
100
+ "rush_yards": 11,
101
+ "rush_tds": 1,
102
+ "fumbles": 0,
103
+ "pass_comp": 11,
104
+ "pass_att": 23,
105
+ "pass_yards": 123,
106
+ "pass_tds": 2,
107
+ "ints": 1,
108
+ "qb_rating": 92.6,
109
+ "receptions": 3,
110
+ "rec_yards": 10,
111
+ "rec_tds": 0,
112
+ "msf_game_id": 51465,
113
+ "msf_player_id": 6826
114
+ }
115
+ ...
116
+ ]
117
+ }
118
+ ```
56
119
 
57
- Pull teams by year with or without schedules:
120
+ ### Schedule
58
121
 
122
+ Pull season schedule by year:
59
123
  ```ruby
60
- NflData::API::Team.get_all(2014)
124
+ NflData::Api::Schedule.new.season(year: 2020)
125
+ ```
126
+
127
+ #### Example Response
61
128
 
62
- NflData::API::Team.get_all_with_schedule(2014)
129
+ ```json
130
+ {
131
+ "games": [
132
+ {"week":1,"away_team":"HOU","home_team":"KC","start_time":"2020-09-10T04:25:00.000Z"}
133
+ ...
134
+ ]
135
+ }
63
136
  ```
64
137
 
65
138
  ## Contributing
data/Rakefile CHANGED
@@ -1,8 +1,7 @@
1
- require 'bundler/gem_tasks'
1
+ require "bundler/gem_tasks"
2
+ require "standard/rake"
3
+ require "rspec/core/rake_task"
2
4
 
3
- require 'rake/testtask'
5
+ RSpec::Core::RakeTask.new(:spec)
4
6
 
5
- Rake::TestTask.new do |t|
6
- t.libs << 'test'
7
- t.pattern = "test/**/*_test.rb"
8
- end
7
+ task default: [:spec, :standard]
@@ -5,4 +5,4 @@ require 'irb'
5
5
  require 'irb/completion'
6
6
  require 'nfl_data'
7
7
 
8
- IRB.start
8
+ IRB.start(__FILE__)
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
@@ -1,21 +1,13 @@
1
- require 'nfl_data/version'
2
-
3
- require 'nokogiri'
4
- require 'open-uri'
5
- require 'json'
6
-
7
- require 'nfl_data/models/player'
8
- require 'nfl_data/models/statline'
9
- require 'nfl_data/models/team'
10
-
11
- require 'nfl_data/parsers/parser_helper'
12
- require 'nfl_data/parsers/player_parser'
13
- require 'nfl_data/parsers/statline_parser'
14
- require 'nfl_data/parsers/team_parser'
15
-
16
- require 'nfl_data/api/player'
17
- require 'nfl_data/api/statline'
18
- require 'nfl_data/api/team'
1
+ require "nokogiri"
2
+ require "open-uri"
3
+ require "json"
4
+ require "typhoeus"
5
+ require "base64"
6
+ require "zeitwerk"
7
+
8
+ loader = Zeitwerk::Loader.for_gem
9
+ loader.collapse("lib/nfl_data/models")
10
+ loader.setup
19
11
 
20
12
  module NflData
21
13
  end
@@ -1,39 +1,17 @@
1
1
  module NflData
2
- module API
2
+ module Api
3
3
  class Player
4
+ attr_reader :parser, :feed
4
5
 
5
- def initialize
6
- @parser = PlayerParser.new
6
+ def initialize(parser: Parsers::PlayerParser.new, feed: MySportsFeeds::PlayersFeed.new)
7
+ @parser = parser
8
+ @feed = feed
7
9
  end
8
10
 
9
- def get(position)
10
- @parser.get_by_position(position).to_json
11
+ def players(position: nil)
12
+ player_data = feed.feed(position: position)
13
+ {players: parser.parse(player_data: player_data).map(&:to_h)}.to_json
11
14
  end
12
-
13
- class << self
14
-
15
- def get_all
16
- self.new.get(:all)
17
- end
18
-
19
- def get_quarterbacks
20
- self.new.get(:quarterbacks)
21
- end
22
-
23
- def get_runningbacks
24
- self.new.get(:runningbacks)
25
- end
26
-
27
- def get_wide_receivers
28
- self.new.get(:wide_receivers)
29
- end
30
-
31
- def get_tight_ends
32
- self.new.get(:tight_ends)
33
- end
34
-
35
- end
36
-
37
15
  end
38
16
  end
39
17
  end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module NflData
4
+ module Api
5
+ class Schedule
6
+ attr_reader :parser, :feed
7
+
8
+ def initialize(parser: Parsers::ScheduleParser.new, feed: MySportsFeeds::SeasonalGamesFeed.new)
9
+ @parser = parser
10
+ @feed = feed
11
+ end
12
+
13
+ def season(year:)
14
+ schedule_data = feed.feed(season_start_year: year)
15
+ parser.parse(schedule_data: schedule_data).to_h.to_json
16
+ end
17
+ end
18
+ end
19
+ end
@@ -1,31 +1,16 @@
1
1
  module NflData
2
- module API
2
+ module Api
3
3
  class Statline
4
+ attr_reader :parser, :feed
4
5
 
5
- def initialize
6
- @parser = StatlineParser.new
6
+ def initialize(parser: Parsers::StatlineParser.new, feed: MySportsFeeds::WeeklyPlayerGamelogs.new)
7
+ @parser = parser
8
+ @feed = feed
7
9
  end
8
10
 
9
- def get(week, year, stat_type)
10
- @parser.get(week, year, stat_type).to_json
11
- end
12
-
13
- class << self
14
- def get_all(week, year)
15
- self.new.get(week, year, :all)
16
- end
17
-
18
- def get_passing(week, year)
19
- self.new.get(week, year, :passing)
20
- end
21
-
22
- def get_rushing(week, year)
23
- self.new.get(week, year, :rushing)
24
- end
25
-
26
- def get_receiving(week, year)
27
- self.new.get(week, year, :receiving)
28
- end
11
+ def statlines(year:, week:)
12
+ statline_data = feed.feed(season_start_year: year, week: week)
13
+ {statlines: parser.parse(statline_data: statline_data).map(&:to_h)}.to_json
29
14
  end
30
15
  end
31
16
  end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module NflData
4
+ Game = Struct.new(:week, :away_team, :home_team, :start_time, keyword_init: true)
5
+ end
@@ -1,21 +1,13 @@
1
1
  module NflData
2
-
3
- class Player
4
- attr_accessor :first_name, :last_name, :full_name, :position, :number, :status, :team, :nfl_player_id
5
-
6
- def to_hash
7
- {
8
- first_name: first_name,
9
- last_name: last_name,
10
- full_name: full_name,
11
- position: position,
12
- number: number,
13
- status: status,
14
- team: team,
15
- nfl_player_id: nfl_player_id
16
- }
17
- end
18
-
19
- end
20
-
2
+ Player = Struct.new(
3
+ :first_name,
4
+ :last_name,
5
+ :full_name,
6
+ :position,
7
+ :number,
8
+ :team,
9
+ :msf_player_id,
10
+ :image_source,
11
+ keyword_init: true
12
+ )
21
13
  end
@@ -0,0 +1,12 @@
1
+ module NflData
2
+ Schedule = Struct.new(:games, keyword_init: true) {
3
+ def initialize(games: [])
4
+ super
5
+ end
6
+
7
+ def to_h
8
+ games.map!(&:to_h)
9
+ super
10
+ end
11
+ }
12
+ end