golfscrape 0.0.1

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.
data/.gitignore ADDED
@@ -0,0 +1,4 @@
1
+ *.gem
2
+ .bundle
3
+ Gemfile.lock
4
+ pkg/*
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in golfscrape.gemspec
4
+ gemspec
data/README.md ADDED
@@ -0,0 +1,41 @@
1
+ # Golfscrape - PGA Tour Data
2
+
3
+ Ruby class to get data from the PGA Tour
4
+
5
+ Leaderboard from Yahoo
6
+
7
+ Rankings from SportsNetwork
8
+
9
+ Events from ESPN
10
+
11
+ ## Installation
12
+
13
+ Inside your Gemfile:
14
+ gem 'golfscrape'
15
+
16
+ ## Usage
17
+
18
+ ### Instantiate a client
19
+
20
+ >> @client = Golfscrape::Client.new
21
+
22
+ ## Examples
23
+
24
+ #### Leaderboard
25
+
26
+ >> @leaderboard = @client.leaderboard
27
+ => [<#Hashie::Mash first_round="56" fourth_round="-" name="Michael Bradley" position="1" second_round="-" strokes="56" third_round="-" thru="16" today="-6" total="-6">, <#Hashie::Mash first_round="61" fourth_round="-" name="Chris Couch" position="T2" second_round="-" strokes="61" third_round="-" thru="17" today="-5" total="-5">, <#Hashie::Mash first_round="57" fourth_round="-" name="Bryce Molder" position="T2" second_round="-" strokes="57" third_round="-" thru="16" today="-5" total="-5">, <#Hashie::Mash first_round="54" fourth_round="-" name="John Rollins" position="T2" second_round="-" strokes="54" third_round="-" thru="15" today="-5" total="-5">...]
28
+
29
+ #### Rankings
30
+ >> @rankings = @client.rankings
31
+ => [<#Hashie::Mash avg=nil country=nil events=nil name=nil points=nil rank=nil>, <#Hashie::Mash avg="9.06" country="Eng" events="53" name="Luke Donald" points="480.41" rank="1">, <#Hashie::Mash avg="8.80" country="Eng" events="48" name="Lee Westwood" points="422.59" rank="2">, <#Hashie::Mash avg="7.22" country="Deu" events="49" name="Martin Kaymer" points="353.89" rank="3">, <#Hashie::Mash avg="7.19" country="Nir" events="53" name="Rory McIlroy" points="380.93" rank="4">, <#Hashie::Mash avg="6.50" country="USA" events="41" name="Steve Stricker" points="266.51" rank="5">, <#Hashie::Mash avg="6.01" country="USA" events="45" name="Phil Mickelson" points="270.50" rank="6">, <#Hashie::Mash avg="5.67" country="USA" events="52" name="Matt Kuchar" points="295.08" rank="7">, <#Hashie::Mash avg="5.53" country="Nir" events="55" name="Graeme McDowell" points="304.12" rank="8">, <#Hashie::Mash avg="5.47" country="Aus" events="44" name="Jason Day" points="240.69" rank="9">, <#Hashie::Mash avg="5.24" country="Zaf" events="56" name="Charl Schwartzel" points="293.59" rank="10">, <#Hashie::Mash avg="5.11" country="USA" events="49" name="Dustin Johnson" points="250.37" rank="11">, <#Hashie::Mash avg="4.99" country="Eng" events="44" name="Paul Casey" points="219.57" rank="12">, <#Hashie::Mash avg="4.87" country="USA" events="47" name="Bubba Watson" points="228.66" rank="13">, <#Hashie::Mash avg="4.72" country="Eng" events="52" name="Ian Poulter" points="245.49" rank="14">, <#Hashie::Mash avg="4.64" country="USA" events="51" name="Nick Watney" points="236.54" rank="15">, <#Hashie::Mash avg="4.39" country="Kor" events="53" name="K.J. Choi" points="232.59" rank="16">..]
32
+
33
+ #### Events
34
+ >> @events = @client.events
35
+ => [<#Hashie::Mash end_date=Sun Jul 03 00:00:00 -0500 2011 location="Aronimink Golf Club, Newtown Square, PA" name="AT&T National" start_date=Thu Jun 30 00:00:00 -0500 2011>, <#Hashie::Mash end_date=Sun Jul 10 00:00:00 -0500 2011 location="TPC Deere Run, Silvis, IL" name="John Deere Classic" start_date=Thu Jul 07 00:00:00 -0500 2011>, <#Hashie::Mash end_date=Sun Jul 17 00:00:00 -0500 2011 location="Annandale Golf Club, Madison, MS" name="Viking Classic" start_date=Thu Jul 14 00:00:00 -0500 2011>, <#Hashie::Mash end_date=Sun Jul 17 00:00:00 -0500 2011 location="Royal St. Georges Golf Club, Sandwich, England" name="British OpenRoyal St. Georges Golf Club, Sandwich, England" start_date=Thu Jul 14 00:00:00 -0500 2011>...]
36
+
37
+ ## Copyright
38
+
39
+ Contact me if you have any suggestions and feel free to fork it!
40
+
41
+ Copyright (c) 2009 Johnny Khai Nguyen, released under the MIT license
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require 'bundler/gem_tasks'
@@ -0,0 +1,26 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "golfscrape/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "golfscrape"
7
+ s.version = Golfscrape::VERSION
8
+ s.authors = ["Johnny Khai Nguyen"]
9
+ s.email = ["johnnyn@gmail.com"]
10
+ s.homepage = ""
11
+ s.summary = %q{Ruby class to scrape PGA Tour golf data}
12
+ s.description = %q{Use this gem to get PGA Tour data for tournaments, world rankings, and the leaderboard}
13
+
14
+ s.rubyforge_project = "golfscrape"
15
+
16
+ s.files = `git ls-files`.split("\n")
17
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
18
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
19
+ s.require_paths = ["lib"]
20
+
21
+ s.add_dependency 'nokogiri'
22
+ s.add_dependency 'hashie'
23
+ s.add_development_dependency 'rspec'
24
+ s.add_development_dependency 'webmock'
25
+ s.add_development_dependency 'vcr'
26
+ end
@@ -0,0 +1,82 @@
1
+ module Golfscrape
2
+
3
+ class Client
4
+ def initialize
5
+ end
6
+
7
+ def leaderboard
8
+ response = []
9
+ url = "http://sports.yahoo.com/golf/pga/leaderboard"
10
+ doc = Nokogiri::HTML(open(url))
11
+ doc.css('div#leaderboardtable table.sportsTable').first.css('tbody tr').each do |player|
12
+ begin
13
+ @position = player.css('td.position').children.last.content.gsub("\n", "")
14
+ @name = player.css('td.player').css('a').first.children.last.content
15
+ @first = player.css('td')[2].children.last.content.gsub("\n", "")
16
+ @second = player.css('td')[3].children.last.content.gsub("\n", "")
17
+ @third = player.css('td')[4].children.last.content.gsub("\n", "")
18
+ @fourth = player.css('td')[5].children.last.content.gsub("\n", "")
19
+ @today = player.css('td')[6].children.last.content.gsub("\n", "")
20
+ @thru = player.css('td')[7].children.last.content.gsub("\n", "")
21
+ @total = player.css('td')[8].children.last.content.gsub("\n", "")
22
+ @strokes = player.css('td')[9].children.last.content.gsub("\n", "")
23
+ rescue
24
+ end
25
+
26
+ response << Hashie::Mash.new(:position => @position, :name => @name, :first_round => @first, :second_round => @second, :third_round => @third,
27
+ :fourth_round => @fourth, :today => @today, :thru => @thru, :total => @total, :strokes => @strokes)
28
+ end
29
+
30
+ response
31
+ end
32
+
33
+ def rankings
34
+ response = []
35
+ url = "http://www.sportsnetwork.com/merge/tsnform.aspx?c=azcentral&page=golf-m/stand/WORLD-MEN-GOLF-RANK.htm"
36
+ doc = Nokogiri::HTML(open(url))
37
+ doc.css('table')[1].css('table tr').each do |player|
38
+ begin
39
+
40
+ unless player.css('td').first.content == "Rank" || player.css('td').first.content.match(/NOTES/)
41
+ @rank = player.css('td').first.content
42
+ @name = player.css('td')[1].content
43
+ @country = player.css('td')[2].content
44
+ @avg = player.css('td')[3].content
45
+ @points = player.css('td')[4].content
46
+ @events = player.css('td')[5].content
47
+ end
48
+
49
+ rescue
50
+ end
51
+
52
+ response << Hashie::Mash.new(:rank => @rank, :name => @name, :country => @country, :avg => @avg, :points => @points, :events => @events)
53
+ end
54
+
55
+ response.uniq
56
+ end
57
+
58
+ def events
59
+ response = []
60
+ url = "http://espn.go.com/golf/schedule"
61
+ doc = Nokogiri::HTML(open(url))
62
+ events = doc.css('table.tablehead')[2].css('tr')
63
+ events.each do |event|
64
+ begin
65
+ unless events.index(event) == 0 || events.index(event) == 1
66
+ @dates = event.css('td').css('nobr').first.children.first.content.split(" - ")
67
+ @start_date = Time.parse(@dates.first)
68
+ @end_date = Time.parse(@dates.last)
69
+ @name = event.css('td')[1].children.first.content
70
+ @location = event.css('td')[1].css('em').first.children.first.content
71
+ end
72
+ rescue
73
+ end
74
+
75
+ response << Hashie::Mash.new(:start_date => @start_date, :end_date => @end_date, :name => @name, :location => @location)
76
+ end
77
+
78
+ response.uniq
79
+ end
80
+
81
+ end
82
+ end
@@ -0,0 +1,3 @@
1
+ module Golfscrape
2
+ VERSION = "0.0.1"
3
+ end
data/lib/golfscrape.rb ADDED
@@ -0,0 +1,18 @@
1
+ require 'rubygems'
2
+ require 'open-uri'
3
+ require 'hashie'
4
+ require 'nokogiri'
5
+ require 'time'
6
+
7
+ directory = File.expand_path(File.dirname(__FILE__))
8
+
9
+ module Golfscrape
10
+
11
+ def self.configure
12
+ yield self
13
+ true
14
+ end
15
+
16
+ end
17
+
18
+ require File.join(directory, 'golfscrape', 'client')
@@ -0,0 +1,37 @@
1
+ require 'spec_helper'
2
+
3
+ describe Golfscrape::Client do
4
+ context "leaderboard" do
5
+ use_vcr_cassette 'leaderboard'
6
+
7
+ it "should return leaderboard" do
8
+ @client = Golfscrape::Client.new
9
+ @leaderboard = @client.leaderboard
10
+ @leaderboard.last.name.should match /\S+/
11
+ @leaderboard.size.should_not == 0
12
+ end
13
+ end
14
+
15
+ context "events" do
16
+ use_vcr_cassette 'events'
17
+
18
+ it "should return events" do
19
+ @client = Golfscrape::Client.new
20
+ @events = @client.events
21
+ @events.last.name.should match /\S+/
22
+ @events.size.should_not == 0
23
+ end
24
+ end
25
+
26
+ context "rankings" do
27
+ use_vcr_cassette 'rankings'
28
+
29
+ it "should return rankings" do
30
+ @client = Golfscrape::Client.new
31
+ @rankings = @client.rankings
32
+ @rankings.last.name.should match /\S+/
33
+ @rankings.size.should_not == 0
34
+ end
35
+ end
36
+
37
+ end
@@ -0,0 +1,9 @@
1
+ require 'rubygems'
2
+ require 'bundler/setup'
3
+ require 'rspec'
4
+ require 'vcr_setup'
5
+ require 'golfscrape'
6
+
7
+ RSpec.configure do |config|
8
+ config.extend VCR::RSpec::Macros
9
+ end