fantasy_foobar 0.1.4

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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: c83f0ff5bb7fea00c5a1c606c831b3edf0e0ade3f93d026a23574f68f0ffb594
4
+ data.tar.gz: 9557bd0f5bca7181e1f45683ef03238edd6d144500e8ee3e1bf763e68cf05a2a
5
+ SHA512:
6
+ metadata.gz: 10c6fa46121ff14dd9ec99a3fb07708863687edc89abff39645ba26830cb48659a6f6ea89611dd1c093a05e8d42fd2ab5d563ba6721655c9c40193b50ca72623
7
+ data.tar.gz: bd2c18dd0d21e3f86fd1ee39f1d03963d76855dbea419a30c753107b37579bf67f25f46c318aa4b255e50b6b24c7cb3a897abbc139bcc1e6f250b4d0eef04639
@@ -0,0 +1,36 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'fantasy_foobar'
4
+ require 'paint'
5
+ require 'json'
6
+ require 'net/http'
7
+
8
+ FILE_PATH = File.expand_path(File.dirname(__FILE__)).split('/exe')[0]
9
+
10
+ file = File.read "#{FILE_PATH}/lib/fantasy_foobar/data/teams.json"
11
+ TEAMS = JSON.parse(file)
12
+
13
+ CURRENT_TEAM = if File.exist?("#{FILE_PATH}/lib/fantasy_foobar/data/current_team.json")
14
+ JSON.parse(File.read("#{FILE_PATH}/lib/fantasy_foobar/data/current_team.json"))
15
+ else
16
+ []
17
+ end
18
+
19
+ current_games = {}
20
+ url = 'http://www.nfl.com/liveupdate/scorestrip/ss.xml'
21
+ test_url = 'http://www.nfl.com/ajax/scorestrip?season=2017&seasonType=REG&week=11'
22
+
23
+ req = Net::HTTP.get_response(URI.parse(url)).body
24
+ doc = Nokogiri::XML(req)
25
+
26
+ doc.xpath('//g').each do |x|
27
+ eid = x.attribute('eid').value
28
+ current_games[x.attribute('h').value.to_s] = { 'eid' => eid, 'location' => 'home' }
29
+ current_games[x.attribute('v').value.to_s] = { 'eid' => eid, 'location' => 'away' }
30
+ end
31
+
32
+ File.write("#{FILE_PATH}/lib/fantasy_foobar/data/current_games.json", current_games.to_json)
33
+ CURRENT_GAMES = current_games.to_json
34
+
35
+ fantasy_foobar = FantasyFoobar::Team.new
36
+ fantasy_foobar.start_app
@@ -0,0 +1,21 @@
1
+ require 'fantasy_foobar/app_flow'
2
+ require 'fantasy_foobar/players'
3
+ require 'fantasy_foobar/stats'
4
+ require 'fantasy_foobar/version'
5
+ require 'fantasy_foobar/kickers_included'
6
+
7
+ module FantasyFoobar
8
+ class Team
9
+ def start_app
10
+ if update_team?
11
+ remove_players if CURRENT_TEAM.any? && remove_players?
12
+ add_players if add_players?
13
+
14
+ File.write("#{FILE_PATH}/lib/fantasy_foobar/data/current_team.json", CURRENT_TEAM.to_json)
15
+ end
16
+
17
+ puts
18
+ print_stats
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,31 @@
1
+ def add_players?
2
+ input = ''
3
+ while !input.casecmp('y').zero? && !input.casecmp('n').zero?
4
+ printf 'Would you like to add players to your team? (y/n) '
5
+ input = gets.chomp
6
+ end
7
+
8
+ input == 'y'
9
+ end
10
+
11
+ def remove_players?
12
+ input = ''
13
+ while !input.casecmp('y').zero? && !input.casecmp('n').zero?
14
+ printf 'Would you like to remove players from your team? (y/n) '
15
+ input = gets.chomp
16
+ end
17
+
18
+ input == 'y'
19
+ end
20
+
21
+ def update_team?
22
+ print_current_team
23
+
24
+ input = ''
25
+ while !input.casecmp('y').zero? && !input.casecmp('n').zero?
26
+ printf 'Would you like to update your current team? (y/n) '
27
+ input = gets.chomp
28
+ end
29
+
30
+ input == 'y'
31
+ end
@@ -0,0 +1,162 @@
1
+ {
2
+ "ARI": {
3
+ "name": "Arizona Cardinals",
4
+ "primary_color": "#97233F",
5
+ "secondary_color": "#101820"
6
+ },
7
+ "ATL": {
8
+ "name": "Atlanta Falcons",
9
+ "primary_color": "#A6192E",
10
+ "secondary_color": "#101820"
11
+ },
12
+ "BAL": {
13
+ "name": "Baltimore Ravens",
14
+ "primary_color": "#241773",
15
+ "secondary_color": "#D0B240"
16
+ },
17
+ "BUF": {
18
+ "name": "Buffalo Bills",
19
+ "primary_color": "#00338D",
20
+ "secondary_color": "#C8102E"
21
+ },
22
+ "CAR": {
23
+ "name": "Carolina Panthers",
24
+ "primary_color": "#0085CA",
25
+ "secondary_color": "#101820"
26
+ },
27
+ "CHI": {
28
+ "name": "Chicago Bears",
29
+ "primary_color": "#051C2C",
30
+ "secondary_color": "#DC4405"
31
+ },
32
+ "CIN": {
33
+ "name": "Cincinnati Bengals",
34
+ "primary_color": "#FC4C02",
35
+ "secondary_color": "#101820"
36
+ },
37
+ "CLE": {
38
+ "name": "Cleveland Browns",
39
+ "primary_color": "#382F2D",
40
+ "secondary_color": "#EB3300"
41
+ },
42
+ "DAL": {
43
+ "name": "Dallas Cowboys",
44
+ "primary_color": "#041E42",
45
+ "secondary_color": "#869397"
46
+ },
47
+ "DEN": {
48
+ "name": "Denver Broncos",
49
+ "primary_color": "#FC4C02",
50
+ "secondary_color": "#0C2340"
51
+ },
52
+ "DET": {
53
+ "name": "Detroit Lions",
54
+ "primary_color": "#0069B1",
55
+ "secondary_color": "#A2AAAD"
56
+ },
57
+ "GB": {
58
+ "name": "Green Bay Packers",
59
+ "primary_color": "#175E33",
60
+ "secondary_color": "#FFB81C"
61
+ },
62
+ "HOU": {
63
+ "name": "Houston Texans",
64
+ "primary_color": "#091F2C",
65
+ "secondary_color": "#A6192E"
66
+ },
67
+ "IND": {
68
+ "name": "Indianapolis Colts",
69
+ "primary_color": "#001489",
70
+ "secondary_color": "#FFFFFF"
71
+ },
72
+ "JAX": {
73
+ "name": "Jacksonville Jaguars",
74
+ "primary_color": "#D49F12",
75
+ "secondary_color": "#006073"
76
+ },
77
+ "KC": {
78
+ "name": "Kansas City Chiefs",
79
+ "primary_color": "#C8102E",
80
+ "secondary_color": "#FFB81C"
81
+ },
82
+ "LAC": {
83
+ "name": "Los Angeles Chargers",
84
+ "primary_color": "#0C2340",
85
+ "secondary_color": "#FFB81C"
86
+ },
87
+ "LA": {
88
+ "name": "Los Angeles Rams",
89
+ "primary_color": "#002244",
90
+ "secondary_color": "#FFFFFF"
91
+ },
92
+ "MIA": {
93
+ "name": "Miami Dolphins",
94
+ "primary_color": "#008E97",
95
+ "secondary_color": "#F58220"
96
+ },
97
+ "MIN": {
98
+ "name": "Minnesota Vikings",
99
+ "primary_color": "#512D6D",
100
+ "secondary_color": "#FFB81C"
101
+ },
102
+ "NE": {
103
+ "name": "New England Patriots",
104
+ "primary_color": "#0C2340",
105
+ "secondary_color": "#C8102E"
106
+ },
107
+ "NO": {
108
+ "name": "New Orleans Saints",
109
+ "primary_color": "#A28D5B",
110
+ "secondary_color": "#101820"
111
+ },
112
+ "NYG": {
113
+ "name": "New York Giants",
114
+ "primary_color": "#001E62",
115
+ "secondary_color": "#A6192E"
116
+ },
117
+ "NYJ": {
118
+ "name": "New York Jets",
119
+ "primary_color": "#0C371D",
120
+ "secondary_color": "#FFFFFF"
121
+ },
122
+ "OAK": {
123
+ "name": "Oakland Raiders",
124
+ "primary_color": "#101820",
125
+ "secondary_color": "#A5ACAF"
126
+ },
127
+ "PHI": {
128
+ "name": "Philadelphia Eagles",
129
+ "primary_color": "#064C53",
130
+ "secondary_color": "#D3A205"
131
+ },
132
+ "PIT": {
133
+ "name": "Pittsburgh Steelers",
134
+ "primary_color": "#FFB81C",
135
+ "secondary_color": "#101820"
136
+ },
137
+ "SF": {
138
+ "name": "San Francisco 49ers",
139
+ "primary_color": "#9B2743",
140
+ "secondary_color": "#896C4C"
141
+ },
142
+ "SEA": {
143
+ "name": "Seattle Seahawks",
144
+ "primary_color": "#001433",
145
+ "secondary_color": "#4DFF00"
146
+ },
147
+ "TB": {
148
+ "name": "Tampa Bay Buccaneers",
149
+ "primary_color": "#C8102E",
150
+ "secondary_color": "#FF8200"
151
+ },
152
+ "TEN": {
153
+ "name": "Tennessee Titans",
154
+ "primary_color": "#0C2340",
155
+ "secondary_color": "#4B92DB"
156
+ },
157
+ "WAS": {
158
+ "name": "Washington Redskins",
159
+ "primary_color": "#862633",
160
+ "secondary_color": "#FFCD00"
161
+ }
162
+ }
@@ -0,0 +1,27 @@
1
+ require 'nfl_data'
2
+
3
+ module NflData
4
+ class PlayerParser
5
+ include ParserHelper
6
+
7
+ attr_reader :base_url
8
+
9
+ def initialize
10
+ @base_url = 'http://www.nfl.com/players/search?category=position&conferenceAbbr=null&playerType=current&conference=ALL&filter='
11
+ end
12
+
13
+ def get_by_position(position)
14
+ if position == :all
15
+ {
16
+ quarterbacks: get('quarterback'),
17
+ runningbacks: get('runningback'),
18
+ wide_receivers: get('widereceiver'),
19
+ tight_ends: get('tightend'),
20
+ kickers: get('kicker')
21
+ }
22
+ else
23
+ { position => get(position.to_s.gsub(/s|_/, '')) }
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,133 @@
1
+ def add_player(player, players)
2
+ opts = players.find_all { |i| i['last_name'].casecmp(player).zero? }
3
+ unless opts.any?
4
+ puts
5
+ puts "Player with the last name '#{player}' does not exist"
6
+ return
7
+ end
8
+ selection = {}
9
+
10
+ puts
11
+ opts.each_with_index do |opt, i|
12
+ team = TEAMS[opt['team']]
13
+ primary_color = team['primary_color']
14
+ secondary_color = team['secondary_color']
15
+ stat_categories = stat_categories(opt['position'])
16
+ gsid = get_player_gsid(opt['profile_link'])
17
+ selection[(i + 1).to_s] = opt.merge(stat_categories).merge(gsid)
18
+
19
+ puts "#{i + 1}. #{Paint[opt['full_name'], :bright]} from the #{Paint[team['name'], secondary_color, primary_color, :bright]} "
20
+ end
21
+
22
+ puts
23
+ puts '----------------------------------------------------- 🏈'
24
+
25
+ selected_player = get_selected_player(selection)
26
+
27
+ if selected_player.nil?
28
+ puts
29
+ puts 'YOUR TEAM HAS NOT BEEN UPDATED'
30
+ return
31
+ end
32
+
33
+ CURRENT_TEAM << selected_player
34
+
35
+ puts
36
+ puts "You added #{Paint[CURRENT_TEAM.last['full_name'], :bright]} "
37
+ end
38
+
39
+ def add_players
40
+ players = JSON.parse(NflData::API::Player.get_all)
41
+ player_pool = players['quarterbacks'] + players['wide_receivers'] + players['runningbacks'] + players['tight_ends'] + players['kickers']
42
+ print_current_team
43
+
44
+ input = 'y'
45
+
46
+ while input.casecmp('y').zero?
47
+ printf 'Add a player to your team: '
48
+ player = gets.chomp
49
+ add_player(player, player_pool)
50
+
51
+ inner_input = ''
52
+ while !inner_input.casecmp('y').zero? && !inner_input.casecmp('n').zero?
53
+ print_current_team
54
+ printf 'Add another player? (y/n) '
55
+ inner_input = gets.chomp
56
+ end
57
+ input = inner_input
58
+ end
59
+ end
60
+
61
+ def bye_week?(player)
62
+ if JSON.parse(CURRENT_GAMES)[player['team']].nil?
63
+ puts "#{player['full_name']} does not have a game this week"
64
+ return true
65
+ end
66
+ false
67
+ end
68
+
69
+ def get_player_gsid(url)
70
+ req = Net::HTTP.get_response(URI.parse(url)).body
71
+ doc = Nokogiri::HTML(req)
72
+
73
+ gsid = doc.xpath("//comment()[contains(.,'GSIS ID')]").first.text.split('GSIS ID: ')[1].split("\n\t")[0]
74
+
75
+ { 'gsid' => gsid }
76
+ end
77
+
78
+ def get_selected_player(selection)
79
+ puts
80
+ printf "Input number to confirm player above you'd like to add (enter any other value to cancel): "
81
+ player = gets.chomp
82
+
83
+ if player.to_i.zero?
84
+ return nil
85
+ end
86
+
87
+ selection[player]
88
+ end
89
+
90
+ def print_current_team
91
+ puts
92
+ CURRENT_TEAM.each_with_index do |player, i|
93
+ team = TEAMS[player['team']]
94
+ primary_color = team['primary_color']
95
+ secondary_color = team['secondary_color']
96
+ puts "#{i + 1}. #{Paint[player['full_name'], :bright]} from the #{Paint[team['name'], secondary_color, primary_color, :bright]} "
97
+ end
98
+ puts
99
+ end
100
+
101
+ def remove_player
102
+ printf "Input the number of player above you'd like to remove (enter any other value to cancel): "
103
+ player = gets.chomp
104
+
105
+ if player.to_i.zero?
106
+ puts
107
+ puts 'YOUR TEAM HAS NOT BEEN UPDATED'
108
+ return
109
+ end
110
+
111
+ unless CURRENT_TEAM.delete_at(player.to_i - 1)
112
+ puts
113
+ puts 'YOUR TEAM HAS NOT BEEN UPDATED'
114
+ end
115
+ end
116
+
117
+ def remove_players
118
+ input = 'y'
119
+
120
+ while input.casecmp('y').zero?
121
+ print_current_team
122
+ remove_player
123
+
124
+ inner_input = ''
125
+ while !inner_input.casecmp('y').zero? && !inner_input.casecmp('n').zero?
126
+ inner_input = 'n' && break unless CURRENT_TEAM.any?
127
+ print_current_team
128
+ printf 'Remove another player? (y/n) '
129
+ inner_input = gets.chomp
130
+ end
131
+ input = inner_input
132
+ end
133
+ end
@@ -0,0 +1,137 @@
1
+ STAT_LINE = {}
2
+ STAT_CACHE = {}
3
+
4
+ def calculate_points(stat_category, data)
5
+ case stat_category
6
+ when 'passing' then calculate_passing(data)
7
+ when 'rushing' then calculate_rushing(data)
8
+ when 'receiving' then calculate_receiving(data)
9
+ when 'kicking' then calculate_kicking(data)
10
+ when 'fumbles' then calculate_fumbles(data)
11
+ else 0
12
+ end
13
+ end
14
+
15
+ def calculate_passing(data)
16
+ return 0 if data.empty?
17
+ (data['yds'] * 0.04) + (data['tds'] * 4) + (data['twoptm'] * 2) - (data['ints'] * 2)
18
+ end
19
+
20
+ def calculate_rushing(data)
21
+ return 0 if data.empty?
22
+ (data['yds'] * 0.1) + (data['tds'] * 6) + (data['twoptm'] * 2)
23
+ end
24
+
25
+ def calculate_receiving(data)
26
+ return 0 if data.empty?
27
+ (data['yds'] * 0.1) + (data['tds'] * 6) + (data['twoptm'] * 2) + (data['rec'] * 0.5)
28
+ end
29
+
30
+ def calculate_kicking(data)
31
+ return 0 if data.empty?
32
+ data['xpmade'] + (data['fgm'] * 3) - (data['fga'] - data['fgm'])
33
+ end
34
+
35
+ def calculate_fumbles(data)
36
+ return 0 if data.empty?
37
+ data['lost'] * -2
38
+ end
39
+
40
+ def find_or_create_statline(player)
41
+ STAT_LINE[player['gsid']] ||= {}
42
+
43
+ player['stat_categories'].each do |stat|
44
+ STAT_LINE[player['gsid']][stat] ||= {}
45
+ end
46
+ end
47
+
48
+ def print_player_feed(player)
49
+ return if bye_week?(player)
50
+
51
+ player_gsid = player['gsid']
52
+ team = TEAMS[player['team']]
53
+ primary_color = team['primary_color']
54
+ secondary_color = team['secondary_color']
55
+ STAT_CACHE[player_gsid] = {}
56
+ eid = JSON.parse(CURRENT_GAMES)[player['team']]['eid']
57
+
58
+ loop.with_index do |_, i|
59
+ begin
60
+ data = Net::HTTP.get_response(URI.parse("http://www.nfl.com/liveupdate/game-center/#{eid}/#{eid}_gtd.json")).body
61
+ JSON.parse(data)[eid]['drives'].each do |drive_key, drive_value|
62
+ STAT_CACHE[player_gsid][drive_key] ||= {}
63
+
64
+ next if drive_key == 'crntdrv'
65
+ drive_value['plays'].each do |play_key, play_value|
66
+ next if STAT_CACHE[player_gsid][drive_key][play_key]
67
+ STAT_CACHE[player_gsid][drive_key][play_key] = play_value['desc']
68
+
69
+ next unless play_value['players'][player_gsid]
70
+ puts Paint[play_value['desc'], secondary_color, primary_color, :bright]
71
+ player['stat_categories'].each do |stat_category|
72
+ updated_statline(player, data, stat_category)
73
+ end
74
+ updated_fantasy_points(player)
75
+ end
76
+ end
77
+ rescue
78
+ i.zero? && (puts "#{player['full_name']}'s game has not yet started")
79
+ end
80
+ sleep 30
81
+ end
82
+ end
83
+
84
+ def print_stats
85
+ threads = []
86
+ CURRENT_TEAM.each do |player|
87
+ threads << Thread.new(player) do |my_player|
88
+ find_or_create_statline(my_player)
89
+ print_player_feed(my_player)
90
+ end
91
+ end
92
+
93
+ threads.each(&:join)
94
+ end
95
+
96
+ def stat_categories(pos)
97
+ categories = case pos
98
+ when 'QB' then { 'stat_categories' => %w[passing rushing fumbles] }
99
+ when 'K' then { 'stat_categories' => %w[kicking] }
100
+ when 'TE' then { 'stat_categories' => %w[receiving fumbles] }
101
+ else { 'stat_categories' => %w[receiving rushing fumbles] }
102
+ end
103
+ categories
104
+ end
105
+
106
+ def updated_fantasy_points(player)
107
+ points = 0
108
+ STAT_LINE[player['gsid']].each do |k,v|
109
+ points += calculate_points(k, v)
110
+ end
111
+ STAT_LINE[player['gsid']]['fantasy_points'] = points
112
+ puts "#{player['full_name']}: #{'%g' % ('%.1f' % points)} fantasy points"
113
+ end
114
+
115
+ def updated_statline(player, data, stat_category)
116
+ player_name = "#{player['first_name'][0]}.#{player['last_name']}"
117
+ player_gsid = player['gsid']
118
+ eid = JSON.parse(CURRENT_GAMES)[player['team']]['eid']
119
+ location = JSON.parse(CURRENT_GAMES)[player['team']]['location']
120
+ team_stat_category = JSON.parse(data)[eid][location]['stats'][stat_category]
121
+ return if team_stat_category.nil?
122
+ player_data = team_stat_category[player_gsid]
123
+ return if player_data.nil?
124
+
125
+ STAT_LINE[player_gsid] ||= {}
126
+ STAT_LINE[player_gsid][stat_category] = player_data
127
+
128
+ result = case stat_category
129
+ when 'passing' then "#{player_name}: #{player_data['cmp']}/#{player_data['att']} for #{player_data['yds']} yards with #{player_data['tds']} touchdowns and #{player_data['ints']} interceptions"
130
+ when 'rushing' then "#{player_name}: #{player_data['att']} attempts for #{player_data['yds']} yards and #{player_data['tds']} touchdowns"
131
+ when 'receiving' then "#{player_name}: #{player_data['rec']} receptions for #{player_data['yds']} yards and #{player_data['tds']} touchdowns"
132
+ when 'kicking' then "#{player_name}: #{player_data['fgm']}/#{player_data['fga']} in FGs and #{player_data['xpmade']}/#{player_data['xpa']} in extra points"
133
+ when 'fumbles' then "#{player_name}: #{player_data['lost']} fumble lost"
134
+ else ''
135
+ end
136
+ puts result
137
+ end
@@ -0,0 +1,3 @@
1
+ module FantasyFoobar
2
+ VERSION = '0.1.4'
3
+ end
metadata ADDED
@@ -0,0 +1,123 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: fantasy_foobar
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.4
5
+ platform: ruby
6
+ authors:
7
+ - Chris Garvin
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2017-12-14 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: nfl_data
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 0.0.12
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 0.0.12
27
+ - !ruby/object:Gem::Dependency
28
+ name: paint
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: bundler
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '1.15'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '1.15'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rake
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '10.0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '10.0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rspec
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '3.0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '3.0'
83
+ description:
84
+ email:
85
+ - chris.garvin@me.com
86
+ executables:
87
+ - fantasy_foobar
88
+ extensions: []
89
+ extra_rdoc_files: []
90
+ files:
91
+ - exe/fantasy_foobar
92
+ - lib/fantasy_foobar.rb
93
+ - lib/fantasy_foobar/app_flow.rb
94
+ - lib/fantasy_foobar/data/teams.json
95
+ - lib/fantasy_foobar/kickers_included.rb
96
+ - lib/fantasy_foobar/players.rb
97
+ - lib/fantasy_foobar/stats.rb
98
+ - lib/fantasy_foobar/version.rb
99
+ homepage: https://www.github.com/chrisgarvin/fantasy_foobar
100
+ licenses:
101
+ - MIT
102
+ metadata: {}
103
+ post_install_message:
104
+ rdoc_options: []
105
+ require_paths:
106
+ - lib
107
+ required_ruby_version: !ruby/object:Gem::Requirement
108
+ requirements:
109
+ - - ">="
110
+ - !ruby/object:Gem::Version
111
+ version: '0'
112
+ required_rubygems_version: !ruby/object:Gem::Requirement
113
+ requirements:
114
+ - - ">="
115
+ - !ruby/object:Gem::Version
116
+ version: '0'
117
+ requirements: []
118
+ rubyforge_project:
119
+ rubygems_version: 2.7.3
120
+ signing_key:
121
+ specification_version: 4
122
+ summary: Live console view of your Fantasy Football teams stats
123
+ test_files: []