espn_rb 0.0.3 → 0.0.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.
- data/README.md +45 -2
- data/lib/espn_rb/api_definitions/headline_methods.yaml +3 -0
- data/lib/espn_rb/headline.rb +64 -13
- data/lib/espn_rb/headline_item.rb +81 -0
- data/lib/espn_rb/headline_response.rb +28 -27
- data/lib/espn_rb/utilities.rb +5 -5
- data/lib/espn_rb/version.rb +1 -1
- data/lib/espn_rb.rb +6 -0
- data/spec/espn_rb_spec.rb +29 -4
- metadata +4 -2
data/README.md
CHANGED
@@ -4,9 +4,30 @@ A ruby wrapper for the ESPN api. It allows you to interact, in a semantically p
|
|
4
4
|
|
5
5
|
## Installation
|
6
6
|
|
7
|
+
### As of Version 0.0.3
|
8
|
+
|
7
9
|
Add this line to your application's Gemfile:
|
8
10
|
|
9
11
|
gem 'espn_rb'
|
12
|
+
|
13
|
+
In order to use espn_rb you need to first get an API key from ESPN [ESPN api request](http://developer.espn.com/member/register). Once you've gotten that squared away you can use the public requests straight away.
|
14
|
+
|
15
|
+
|
16
|
+
## Set your API key
|
17
|
+
|
18
|
+
The easiest way to set your api key for use with espn_rb is to export it as an environment variable. Do that like so:
|
19
|
+
|
20
|
+
```sh
|
21
|
+
$ export espn_api_key=YOUR_SUPER_SECRET_API_KEY
|
22
|
+
```
|
23
|
+
|
24
|
+
If you want to pass it in to your objects you may do so explicitly like so:
|
25
|
+
|
26
|
+
```ruby
|
27
|
+
espn = EspnRb.headlines(:api_key => YOUR_SUPER_SECRET_API_KEY)
|
28
|
+
```
|
29
|
+
|
30
|
+
For the sake of simplicity all my examples will assume that you have exported the API key as an environment variable.
|
10
31
|
|
11
32
|
## Espn Headines
|
12
33
|
|
@@ -21,10 +42,12 @@ espn = Espn.headlines
|
|
21
42
|
espn.all
|
22
43
|
```
|
23
44
|
|
24
|
-
Which will return an HeadlineResponse object.
|
45
|
+
Which will return an HeadlineResponse object.
|
25
46
|
|
26
47
|
#### Get ESPN response as JSON
|
27
48
|
|
49
|
+
To get the response straight from the horses' mouth:
|
50
|
+
|
28
51
|
```ruby
|
29
52
|
# from above
|
30
53
|
|
@@ -32,10 +55,12 @@ espn.all.response
|
|
32
55
|
#=> ESPN's response string as JSON
|
33
56
|
```
|
34
57
|
|
35
|
-
The raw response from ESPN will give you the top ten stories meeting your criteria.
|
58
|
+
The raw response from ESPN will give you the top ten stories meeting your criteria.
|
36
59
|
|
37
60
|
#### Collections
|
38
61
|
|
62
|
+
Since the above response is a basic collection and each headline share many common attributes there are collection methods defined on the HeadlineResponse object. Use them like so.
|
63
|
+
|
39
64
|
```ruby
|
40
65
|
# from above
|
41
66
|
|
@@ -59,6 +84,24 @@ espn = EspnRb.headlines
|
|
59
84
|
|
60
85
|
espn.nba(:news) #=> HeadlineResponse
|
61
86
|
espn.nba(:top) #=> HeadlineResponse
|
87
|
+
espn.nba({:for_date => "2012-03-09"}) #=> HeadlineResponse
|
88
|
+
|
89
|
+
```
|
90
|
+
|
91
|
+
#### HeadlineItem
|
92
|
+
|
93
|
+
The HeadlineResponse Object holdes in it the headlines split into HeadlineItems. Here is where you can get Specific information about each story. Here are some of the options.
|
94
|
+
|
95
|
+
```ruby
|
96
|
+
espn = EspnRb.headlines
|
97
|
+
headline_response = espn.nba[2] #=> HeadlineItem
|
98
|
+
|
99
|
+
headline_response.web_url #=> "http://sports.espn.go.com/espn/wire?section=nba&id=7664408&ex_cid=espnapi_public"
|
100
|
+
headline_response.id #=> 7664408
|
101
|
+
headline_response.title #=> "Mavericks-Kings Preview"
|
102
|
+
|
103
|
+
# More to come in future versions.
|
104
|
+
headline_response.headline #=> JSON hash from original response.
|
62
105
|
```
|
63
106
|
|
64
107
|
#### HELP
|
data/lib/espn_rb/headline.rb
CHANGED
@@ -2,20 +2,40 @@ module EspnRb
|
|
2
2
|
class Headline
|
3
3
|
attr_reader :api_key
|
4
4
|
|
5
|
+
# @raise [StandardError] Will raise StandardError if api_key isn't specified by either options passed into initialize or set from ENV
|
5
6
|
def initialize(opts)
|
6
|
-
@api_key = opts && opts[:api_key].nil? ? opts[:api_key] : ENV['espn_api_key']
|
7
|
+
@api_key = opts && !opts[:api_key].nil? ? opts[:api_key] : ENV['espn_api_key']
|
7
8
|
raise StandardError, "You must specify an API key." if @api_key.nil?
|
9
|
+
|
8
10
|
create_headline_methods
|
9
11
|
end
|
10
12
|
|
13
|
+
# Returns the ESPN resources as defined [here](http://developer.espn.com/docs/headlines#parameters).
|
14
|
+
#
|
15
|
+
# @return [Hash] of sports, urls and their descriptions.
|
11
16
|
def api_resources
|
12
|
-
@api_resources ||= YAML::load(File.read('
|
17
|
+
@api_resources ||= YAML::load(File.read(File.expand_path(File.join(File.dirname(__FILE__), "..", 'espn_rb/api_definitions/headline_resources.yaml'))))
|
13
18
|
end
|
14
19
|
|
20
|
+
# Returns the ESPN methods as defined [here](http://developer.espn.com/docs/headlines#parameters).
|
21
|
+
#
|
22
|
+
# @return [Hash] methods, and their associated urls and brief description.
|
15
23
|
def api_methods
|
16
|
-
@api_methods ||= YAML::load(File.read('
|
24
|
+
@api_methods ||= YAML::load(File.read(File.expand_path(File.join(File.dirname(__FILE__), "..", 'espn_rb/api_definitions/headline_methods.yaml'))))
|
17
25
|
end
|
18
26
|
|
27
|
+
# The final request to ESPN api after all option parsing has been completed.
|
28
|
+
# @return [HeadlineResponse] a headline response object.
|
29
|
+
def get_results(resource, method)
|
30
|
+
http = Net::HTTP.new("api.espn.com")
|
31
|
+
request = Net::HTTP::Get.new("/#{EspnRb::API_VERSION}#{resource}#{method}?apikey=#{@api_key}")
|
32
|
+
HeadlineResponse.new JSON.parse(http.request(request).body)
|
33
|
+
end
|
34
|
+
|
35
|
+
# This will define singleton methods for all resources defined
|
36
|
+
# in EspnRb::Headline.api_resources
|
37
|
+
#
|
38
|
+
# @return [HeadlineResponse] which contains the espn response object and assocated methods.
|
19
39
|
def create_headline_methods
|
20
40
|
api_resources.each do |k,v|
|
21
41
|
define_singleton_method(k) do |opt=nil|
|
@@ -24,26 +44,57 @@ module EspnRb
|
|
24
44
|
end
|
25
45
|
end
|
26
46
|
|
47
|
+
# Attempts to parse which EspnRb::Headline.api_methods the user has passed to
|
48
|
+
# method defined by EspnRb::Headline.create_headline_methods.
|
49
|
+
#
|
50
|
+
# @param [Hash] options the options passed in by user.
|
51
|
+
# @note This will accept either a string or a hash.
|
52
|
+
#
|
53
|
+
# @example Call with string
|
54
|
+
# get_api_method("news") #=> '/news'
|
55
|
+
#
|
56
|
+
# @example Call with Hash (for_date)
|
57
|
+
# get_api_method({:for_date => "2012-01-01"}) #=> '/news/dates/20120101'
|
58
|
+
# @option options [String] :arg When string is passed and :arg
|
59
|
+
# is available it will return the url associated with that :arg from EspnRb::Headline.api_methods
|
60
|
+
# @option options [Hash] :arg When Hash will pass :arg to opt_from_hash
|
61
|
+
#
|
62
|
+
# @return [String] a url entry from EspnRb::Headline.api_methods defaults to :news
|
27
63
|
def get_api_method(opt)
|
28
64
|
case opt.class.to_s
|
29
65
|
when "Symbol"
|
30
|
-
|
66
|
+
api_method = api_methods.keys.include?(opt) ? api_methods[opt][:url] : (raise StandardError, "The parameter you sent is not available.")
|
31
67
|
when "Hash"
|
32
|
-
|
33
|
-
api_method = api_methods[:for_date][:url].gsub(":yyyymmdd", Date.parse(opt[:for_date]).strftime("%Y%m%d"))
|
34
|
-
else
|
35
|
-
end
|
68
|
+
api_method = opt_from_hash(opt)
|
36
69
|
else
|
37
|
-
|
70
|
+
api_method = api_methods[:news][:url]
|
38
71
|
end
|
39
72
|
end
|
40
73
|
|
41
|
-
def
|
42
|
-
|
43
|
-
|
44
|
-
|
74
|
+
def opt_from_hash(opt)
|
75
|
+
if !opt[:for_date].nil?
|
76
|
+
for_date opt
|
77
|
+
elsif !opt[:for_athlete].nil?
|
78
|
+
for_athlete opt
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
# Takes EspnRb::Headline.api_methods[:for_athlete][:url] and subs out the options passed by user
|
83
|
+
# @example internal call
|
84
|
+
# for_athlete({:for_athlete => "123"}) => '/athletes/123/news'
|
85
|
+
def for_athlete(opt)
|
86
|
+
api_methods[:for_athlete][:url].gsub(":athleteId", opt[:for_athlete])
|
87
|
+
end
|
88
|
+
|
89
|
+
# Takes EspnRb::Headline.api_methods[:for_date][:url] and subs out the options passed by user
|
90
|
+
# @example internal call
|
91
|
+
# for_date({:for_date => "2012-01-01"}) => '/news/dates/20120101'
|
92
|
+
def for_date(opt)
|
93
|
+
api_methods[:for_date][:url].gsub(":yyyymmdd", Date.parse(opt[:for_date]).strftime("%Y%m%d"))
|
45
94
|
end
|
46
95
|
|
96
|
+
# Provides help text. Passes the methods available from create_headline_methods all prettified into a set of
|
97
|
+
# strings and passes them to EspnRb::Utilities.help which then inserts it below some nice ascii art.
|
47
98
|
def help
|
48
99
|
EspnRb::Utilities.help api_resources.map {|k,v| "\t#{(':' + k.to_s).ljust(25)} #{v[:description]}"}.join("\n")
|
49
100
|
end
|
@@ -0,0 +1,81 @@
|
|
1
|
+
class HeadlineResponse
|
2
|
+
class HeadlineItem
|
3
|
+
attr_reader :headline
|
4
|
+
|
5
|
+
def initialize(opts)
|
6
|
+
@headline = opts
|
7
|
+
end
|
8
|
+
|
9
|
+
# @example
|
10
|
+
# espn = EspnRb::Headline
|
11
|
+
# espn.nba.first.web_url => "http://some-valid-nba-article"
|
12
|
+
# @return [String] web_url for Item
|
13
|
+
def web_url(mobile=false)
|
14
|
+
(mobile == true) ? @headline["links"]["mobile"]["href"] : @headline["links"]["web"]["href"]
|
15
|
+
end
|
16
|
+
|
17
|
+
# @example
|
18
|
+
# espn = EspnRb::Headline
|
19
|
+
# espn.ncaa_football.first.title => "Gators Win!!"
|
20
|
+
# @return [String] title for Item
|
21
|
+
def title
|
22
|
+
@headline["headline"]
|
23
|
+
end
|
24
|
+
|
25
|
+
|
26
|
+
# @example
|
27
|
+
# espn = EspnRb::Headline
|
28
|
+
# espn.ncaa_football.first.id => 1234
|
29
|
+
# @return [Integer] id for Item
|
30
|
+
def id
|
31
|
+
@headline["id"]
|
32
|
+
end
|
33
|
+
|
34
|
+
# @example
|
35
|
+
# espn = EspnRb::Headline
|
36
|
+
# espn.nba.first.api_url => "http://some-valid-nba-article"
|
37
|
+
# @return [String] api_url for Item
|
38
|
+
def api_url
|
39
|
+
@headline["links"]["api"]["news"]["href"]
|
40
|
+
end
|
41
|
+
|
42
|
+
|
43
|
+
def collect_category(sym)
|
44
|
+
@headline["categories"].inject([]) {|m, i| m << i[sym.to_s] unless i[sym.to_s].nil?; m}
|
45
|
+
end
|
46
|
+
|
47
|
+
# Provides access to categories sub-hash. If available
|
48
|
+
#
|
49
|
+
# @example
|
50
|
+
# espn = EspnRb::Headline
|
51
|
+
# espn.nba.first.athletes
|
52
|
+
# #=> ["Johnny B", "Freddie Flintstone", "Etc"]
|
53
|
+
def athletes
|
54
|
+
return collect_category(:description)
|
55
|
+
end
|
56
|
+
|
57
|
+
# Provides access to categories sub-hash. If available
|
58
|
+
#
|
59
|
+
# @example
|
60
|
+
# espn = EspnRb::Headline
|
61
|
+
# espn.nba.first.leagues
|
62
|
+
# #=> ["46"]
|
63
|
+
def leagues
|
64
|
+
return collect_category(:leagueId)
|
65
|
+
end
|
66
|
+
|
67
|
+
# Provides access to categories sub-hash. If available
|
68
|
+
#
|
69
|
+
# @example
|
70
|
+
# espn = EspnRb::Headline
|
71
|
+
# espn.nba.first.athlete_ids
|
72
|
+
# #=> ["123", "132", "123"]
|
73
|
+
def athlete_ids
|
74
|
+
return collect_category(:athleteId)
|
75
|
+
end
|
76
|
+
|
77
|
+
def categories
|
78
|
+
@headline["categories"]
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
@@ -1,45 +1,46 @@
|
|
1
1
|
class HeadlineResponse
|
2
|
+
include Enumerable
|
3
|
+
|
2
4
|
attr_reader :response,:responses
|
3
5
|
|
6
|
+
# Sets response from EspnRb::Headline.get_results. Splits response object into composite parts
|
7
|
+
# so that we can include enumerable
|
4
8
|
def initialize(response)
|
5
|
-
@response
|
9
|
+
@response = @response || response
|
6
10
|
@responses = @response['headlines'].map {|h| HeadlineItem.new(h)}
|
7
|
-
@reports = create_reports(reponse)
|
8
11
|
end
|
9
12
|
|
13
|
+
# define each so that Enumerable methods work properly.
|
14
|
+
def each &block
|
15
|
+
@responses.each do |response|
|
16
|
+
if block_given?
|
17
|
+
block.call response
|
18
|
+
else
|
19
|
+
yield response
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
# Allows the user to specify which HeadlineItem they'd like to work with via it's index in the @responses array
|
25
|
+
#
|
26
|
+
# @return [HeadlineItem] HeadlineItem specified by responses index
|
10
27
|
def [](int)
|
11
28
|
@responses[int]
|
12
29
|
end
|
13
30
|
|
31
|
+
# Defines a few collection methods to allow the user to view all of the @response like attributes
|
32
|
+
# @note available methods are headlines, descriptions, sources, bylines, types
|
33
|
+
#
|
34
|
+
# @example Valid method call
|
35
|
+
# EspnRb::Headline.nba.titles #=> ['title1', 'title2', 'title3', 'title4', 'etc']
|
36
|
+
# @example Invalid method call
|
37
|
+
# EspnRb::Headline.nba.not_an_available_method #=> nil
|
38
|
+
# @return [Array] array of like items or nil
|
14
39
|
def method_missing(sym, *args)
|
15
|
-
sym.to_s == "titles"? sym = :headlines : sym
|
40
|
+
sym.to_s == "titles" ? sym = :headlines : sym
|
16
41
|
|
17
42
|
if %w{headlines descriptions sources bylines types}.include?(sym.to_s)
|
18
43
|
@response["headlines"].map {|h| h[sym.to_s[0..-2]] }
|
19
44
|
end
|
20
45
|
end
|
21
|
-
|
22
|
-
class HeadlineItem
|
23
|
-
attr_reader :headline
|
24
|
-
|
25
|
-
def initialize(opts)
|
26
|
-
@headline = opts
|
27
|
-
end
|
28
|
-
|
29
|
-
def web_url(mobile=false)
|
30
|
-
(mobile == true) ? @headline["links"]["mobile"]["href"] : @headline["links"]["web"]["href"]
|
31
|
-
end
|
32
|
-
|
33
|
-
def title
|
34
|
-
@headline["headline"]
|
35
|
-
end
|
36
|
-
|
37
|
-
def id
|
38
|
-
@headline["id"]
|
39
|
-
end
|
40
|
-
|
41
|
-
def api_url
|
42
|
-
@headline["links"]["api"]["news"]["href"]
|
43
|
-
end
|
44
|
-
end
|
45
46
|
end
|
data/lib/espn_rb/utilities.rb
CHANGED
@@ -3,11 +3,11 @@ module EspnRb
|
|
3
3
|
def self.help(str)
|
4
4
|
puts "-----------------------------Welcome to EspnRb.---------------------------------\n\n"
|
5
5
|
puts s = <<EOF
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
6
|
+
_.-=""=-._
|
7
|
+
.'\\\\-++++-//'.
|
8
|
+
( || || )
|
9
|
+
'.// \\\\.'
|
10
|
+
`'-=..=-'`
|
11
11
|
EOF
|
12
12
|
puts "--------------------------------------------------------------------------------"
|
13
13
|
puts "You are currently using the headlines api from here you can do the follow:\n\n"
|
data/lib/espn_rb/version.rb
CHANGED
data/lib/espn_rb.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
require "espn_rb/version"
|
2
2
|
require "espn_rb/headline.rb"
|
3
3
|
require 'espn_rb/headline_response.rb'
|
4
|
+
require 'espn_rb/headline_item.rb'
|
4
5
|
require 'espn_rb/utilities.rb'
|
5
6
|
|
6
7
|
require 'json'
|
@@ -9,6 +10,11 @@ require "net/http"
|
|
9
10
|
module EspnRb
|
10
11
|
include EspnRb::Utilities
|
11
12
|
|
13
|
+
# Returns an EspnRb::Headline object.
|
14
|
+
#
|
15
|
+
# @param [Hash] options the options to create the Headline object.
|
16
|
+
# @option options [String] :api_key Your ESPN developer api key.
|
17
|
+
# @return [EspnRb::Headline] entry point to Espn Headline API.
|
12
18
|
def self.headlines(options=nil)
|
13
19
|
EspnRb::Headline.new(options)
|
14
20
|
end
|
data/spec/espn_rb_spec.rb
CHANGED
@@ -11,14 +11,19 @@ describe EspnRb::Headline do
|
|
11
11
|
:headers => {})
|
12
12
|
end
|
13
13
|
|
14
|
-
it "should return valid HeadlineResponse
|
14
|
+
it "#all should return valid HeadlineResponse" do
|
15
15
|
@espn.all.class.should eq(HeadlineResponse)
|
16
16
|
end
|
17
17
|
|
18
|
-
it "get_results from api.espn.com" do
|
18
|
+
it "#get_results from api.espn.com" do
|
19
19
|
@espn.get_results(@espn.api_resources[:all][:url], @espn.api_methods[:news][:url]).class.should eq(HeadlineResponse)
|
20
20
|
end
|
21
21
|
|
22
|
+
it "@api_key should be set" do
|
23
|
+
espn = EspnRb.headlines(:api_key => "abc123")
|
24
|
+
espn.api_key.should eq "abc123"
|
25
|
+
end
|
26
|
+
|
22
27
|
context "api_resources and api_methods should be defined properly (Ensure no typos)" do
|
23
28
|
it {@espn.api_resources[:nba][:url].should eq("/sports/basketball/nba") }
|
24
29
|
it {@espn.api_resources[:all][:url].should eq("/sports") }
|
@@ -40,9 +45,29 @@ describe EspnRb::Headline do
|
|
40
45
|
|
41
46
|
|
42
47
|
describe HeadlineResponse do
|
43
|
-
context "
|
48
|
+
context "Method missing provides correct collection methods." do
|
44
49
|
it {@espn.all.titles.first.should eq("Trail Blazers 86, Hornets 74")}
|
45
|
-
it {@espn.all.
|
50
|
+
it {@espn.all.descriptions.last.should eq("With the score deadlocked in overtime and the ball bouncing free, opposing guards Matthew Dellavedova and Kevin Pangos collided near the scorer's table.") }
|
51
|
+
it {@espn.all.sources.last.should eq("Associated Press") }
|
52
|
+
it {@espn.all.types.last.should eq("Wire") }
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
describe HeadlineResponse::HeadlineItem do
|
57
|
+
context "HeadlineItem returns proper item info when requested" do
|
58
|
+
it { @espn.all[1].web_url.should == 'http://sports.espn.go.com/espn/wire?section=nhl&id=7651009&ex_cid=espnapi_public' }
|
59
|
+
it { @espn.all[1].title.should == 'Oilers-Sharks Preview' }
|
60
|
+
it { @espn.all[1].api_url.should == 'http://api.espn.com/v1/sports/news/7651009' }
|
61
|
+
it { @espn.all[1].id.should == 7651009 }
|
62
|
+
end
|
63
|
+
|
64
|
+
context "HeadlineItem should return an array of requested entries from categories sub-hash" do
|
65
|
+
it {@espn.all[1].athletes.should == ["NHL", "San Jose Sharks", "Edmonton Oilers", "Douglas Murray",
|
66
|
+
"Logan Couture", "Patrick Marleau", "Joe Thornton", "Anaheim Ducks",
|
67
|
+
"Jordan Eberle", "Shawn Horcoff", "Taylor Hall"] }
|
68
|
+
|
69
|
+
it {@espn.all[1].leagues.should == [90] }
|
70
|
+
it {@espn.all[1].athlete_ids.should == [2100, 3773, 576, 939, 5032, 1080, 5428] }
|
46
71
|
end
|
47
72
|
end
|
48
73
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: espn_rb
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.4
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-03-
|
12
|
+
date: 2012-03-11 00:00:00.000000000 Z
|
13
13
|
dependencies: []
|
14
14
|
description: A Ruby wrapper for ESPN's api.
|
15
15
|
email:
|
@@ -29,6 +29,7 @@ files:
|
|
29
29
|
- lib/espn_rb/api_definitions/headline_methods.yaml
|
30
30
|
- lib/espn_rb/api_definitions/headline_resources.yaml
|
31
31
|
- lib/espn_rb/headline.rb
|
32
|
+
- lib/espn_rb/headline_item.rb
|
32
33
|
- lib/espn_rb/headline_response.rb
|
33
34
|
- lib/espn_rb/utilities.rb
|
34
35
|
- lib/espn_rb/version.rb
|
@@ -63,3 +64,4 @@ test_files:
|
|
63
64
|
- spec/espn_rb_spec.rb
|
64
65
|
- spec/mock_requests/all_headlines_request.txt
|
65
66
|
- spec/spec_helper.rb
|
67
|
+
has_rdoc:
|