mlb 0.3.0 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile.lock +10 -15
- data/Rakefile +11 -0
- data/{spec/fixtures → cache}/teams.json +1 -1
- data/lib/mlb.rb +3 -4
- data/lib/mlb/player.rb +5 -4
- data/lib/mlb/request.rb +5 -5
- data/lib/mlb/team.rb +27 -93
- data/lib/mlb/version.rb +1 -1
- data/mlb.gemspec +1 -2
- data/spec/mlb_spec.rb +16 -4
- data/spec/spec_helper.rb +1 -1
- metadata +8 -27
- data/db/cleanup.sql +0 -36
- data/db/mlb.sqlite3 +0 -0
data/Gemfile.lock
CHANGED
@@ -1,9 +1,8 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
mlb (0.
|
4
|
+
mlb (0.4.0)
|
5
5
|
faraday (~> 0.5.2)
|
6
|
-
sqlite3-ruby (~> 1.3.2)
|
7
6
|
yajl-ruby (~> 0.7.8)
|
8
7
|
|
9
8
|
GEM
|
@@ -21,17 +20,14 @@ GEM
|
|
21
20
|
rack (1.2.1)
|
22
21
|
rake (0.8.7)
|
23
22
|
rcov (0.9.9)
|
24
|
-
rspec (2.0
|
25
|
-
rspec-core (~> 2.0
|
26
|
-
rspec-expectations (~> 2.0
|
27
|
-
rspec-mocks (~> 2.0
|
28
|
-
rspec-core (2.0
|
29
|
-
rspec-expectations (2.0
|
30
|
-
diff-lcs (
|
31
|
-
rspec-mocks (2.0
|
32
|
-
rspec-core (~> 2.0.1)
|
33
|
-
rspec-expectations (~> 2.0.1)
|
34
|
-
sqlite3-ruby (1.3.2)
|
23
|
+
rspec (2.1.0)
|
24
|
+
rspec-core (~> 2.1.0)
|
25
|
+
rspec-expectations (~> 2.1.0)
|
26
|
+
rspec-mocks (~> 2.1.0)
|
27
|
+
rspec-core (2.1.0)
|
28
|
+
rspec-expectations (2.1.0)
|
29
|
+
diff-lcs (~> 1.1.2)
|
30
|
+
rspec-mocks (2.1.0)
|
35
31
|
webmock (1.5.0)
|
36
32
|
addressable (>= 2.2.2)
|
37
33
|
crack (>= 0.1.7)
|
@@ -48,8 +44,7 @@ DEPENDENCIES
|
|
48
44
|
mlb!
|
49
45
|
rake (~> 0.8)
|
50
46
|
rcov (~> 0.9)
|
51
|
-
rspec (~> 2.
|
52
|
-
sqlite3-ruby (~> 1.3.2)
|
47
|
+
rspec (~> 2.1)
|
53
48
|
webmock (~> 1.5)
|
54
49
|
yajl-ruby (~> 0.7.8)
|
55
50
|
yard (~> 0.6)
|
data/Rakefile
CHANGED
@@ -28,3 +28,14 @@ namespace :doc do
|
|
28
28
|
]
|
29
29
|
end
|
30
30
|
end
|
31
|
+
|
32
|
+
namespace :cache do
|
33
|
+
require File.expand_path('../lib/mlb', __FILE__)
|
34
|
+
desc "Update the teams file cache"
|
35
|
+
task :update do
|
36
|
+
doc = MLB::Team.results_from_freebase(true)
|
37
|
+
File.open('cache/teams.json', 'w') do |file|
|
38
|
+
file.write(doc.body)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
data/lib/mlb.rb
CHANGED
@@ -1,6 +1,5 @@
|
|
1
1
|
module MLB
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
autoload :Player, 'mlb/player'
|
2
|
+
require File.expand_path('../mlb/request', __FILE__)
|
3
|
+
require File.expand_path('../mlb/team', __FILE__)
|
4
|
+
require File.expand_path('../mlb/player', __FILE__)
|
6
5
|
end
|
data/lib/mlb/player.rb
CHANGED
@@ -1,15 +1,16 @@
|
|
1
1
|
module MLB
|
2
2
|
class Player
|
3
|
-
|
3
|
+
private_class_method :new
|
4
|
+
attr_reader :name, :number, :position
|
5
|
+
|
6
|
+
private
|
4
7
|
|
5
8
|
def initialize(attributes={})
|
6
9
|
attributes.each_pair do |key, value|
|
7
|
-
|
10
|
+
instance_eval("@#{key}=value") if self.respond_to?(key)
|
8
11
|
end
|
9
12
|
end
|
10
13
|
|
11
|
-
protected
|
12
|
-
|
13
14
|
# Returns an array of Player objects given a team roster
|
14
15
|
def self.all_from_roster(players)
|
15
16
|
players.map do |player|
|
data/lib/mlb/request.rb
CHANGED
@@ -4,18 +4,18 @@ module MLB
|
|
4
4
|
# @private
|
5
5
|
class Request
|
6
6
|
# Perform an HTTP GET request
|
7
|
-
def self.get(path, options={})
|
8
|
-
response = connection.get do |request|
|
7
|
+
def self.get(path, options={}, raw=false)
|
8
|
+
response = connection(raw).get do |request|
|
9
9
|
request.url(path, options)
|
10
10
|
end
|
11
|
-
response.body
|
11
|
+
raw ? response : response.body
|
12
12
|
end
|
13
13
|
|
14
14
|
private
|
15
15
|
|
16
|
-
def self.connection
|
16
|
+
def self.connection(raw=false)
|
17
17
|
Faraday::Connection.new(:url => 'http://api.freebase.com') do |connection|
|
18
|
-
connection.use Faraday::Response::Yajl
|
18
|
+
connection.use Faraday::Response::Yajl unless raw
|
19
19
|
connection.adapter Faraday.default_adapter
|
20
20
|
end
|
21
21
|
end
|
data/lib/mlb/team.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
module MLB
|
2
2
|
class Team
|
3
|
-
|
3
|
+
private_class_method :new
|
4
|
+
attr_reader :name, :league, :division, :manager, :wins, :losses, :founded, :mascot, :ballpark, :logo_url, :players
|
4
5
|
|
5
6
|
# Returns an array of Team objects
|
6
7
|
#
|
@@ -19,29 +20,41 @@ module MLB
|
|
19
20
|
# MLB::Team.all.first.players.first.number # => 28
|
20
21
|
# MLB::Team.all.first.players.first.position # => "Right fielder"
|
21
22
|
def self.all
|
22
|
-
|
23
|
+
# Attempt to fetch the result from the Freebase API unless there is a
|
24
|
+
# connection error, in which case read from a fixture file
|
25
|
+
@all ||= begin
|
26
|
+
results_to_team(results_from_freebase)
|
27
|
+
rescue SocketError, Errno::ECONNREFUSED, Timeout::Error
|
28
|
+
results_to_team(results_from_cache)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def self.reset
|
33
|
+
@all = nil
|
23
34
|
end
|
24
35
|
|
36
|
+
private
|
37
|
+
|
25
38
|
def initialize(attributes={})
|
26
39
|
attributes.each_pair do |key, value|
|
27
|
-
|
40
|
+
instance_eval("@#{key}=value") if self.respond_to?(key)
|
28
41
|
end
|
29
42
|
end
|
30
43
|
|
31
|
-
|
44
|
+
def self.results_from_freebase(raw=false)
|
45
|
+
options = {:query => mql_query}
|
46
|
+
Request.get('/api/service/mqlread', options, raw)
|
47
|
+
end
|
32
48
|
|
33
|
-
|
34
|
-
|
35
|
-
begin
|
36
|
-
run_team_mql
|
37
|
-
rescue SocketError, Errno::ECONNREFUSED
|
38
|
-
run_team_sql
|
39
|
-
end
|
49
|
+
def self.results_from_cache
|
50
|
+
Yajl::Parser.parse(file_from_cache("teams.json"))
|
40
51
|
end
|
41
52
|
|
42
|
-
def self.
|
43
|
-
|
53
|
+
def self.file_from_cache(file_name)
|
54
|
+
File.new(File.expand_path("../../../cache", __FILE__) + "/" + file_name)
|
55
|
+
end
|
44
56
|
|
57
|
+
def self.results_to_team(results)
|
45
58
|
teams = []
|
46
59
|
results['result'].each do |result|
|
47
60
|
league = result['league']
|
@@ -72,53 +85,8 @@ module MLB
|
|
72
85
|
teams
|
73
86
|
end
|
74
87
|
|
75
|
-
def self.setup_db
|
76
|
-
require 'sqlite3'
|
77
|
-
@db ||= SQLite3::Database.new(File.join(File.dirname(__FILE__), "..", "..", "db", "mlb.sqlite3"), :type_translation => true, :results_as_hash => true)
|
78
|
-
end
|
79
|
-
|
80
|
-
def self.run_team_sql
|
81
|
-
db = setup_db
|
82
|
-
query = team_sql_query
|
83
|
-
results = db.execute(query)
|
84
|
-
|
85
|
-
teams = []
|
86
|
-
results.each do |result|
|
87
|
-
teams << new(
|
88
|
-
:name => result['name'],
|
89
|
-
:league => result['league'],
|
90
|
-
:division => result['division'],
|
91
|
-
:manager => result['manager'],
|
92
|
-
:wins => result['wins'],
|
93
|
-
:losses => result['losses'],
|
94
|
-
:founded => result['founded'],
|
95
|
-
:mascot => result['mascot'],
|
96
|
-
:ballpark => result['ballpark'],
|
97
|
-
:logo_url => result['logo_url'],
|
98
|
-
:players => run_player_sql(result['name'])
|
99
|
-
)
|
100
|
-
end
|
101
|
-
teams
|
102
|
-
end
|
103
|
-
|
104
|
-
def self.run_player_sql(team_name)
|
105
|
-
db = setup_db
|
106
|
-
query = player_sql_query(team_name)
|
107
|
-
results = db.execute(query)
|
108
|
-
|
109
|
-
players = []
|
110
|
-
results.each do |result|
|
111
|
-
players << Player.new(
|
112
|
-
:name => result['name'],
|
113
|
-
:position => result['position'],
|
114
|
-
:number => result['number']
|
115
|
-
)
|
116
|
-
end
|
117
|
-
players
|
118
|
-
end
|
119
|
-
|
120
88
|
# Returns the MQL query for teams, as a Ruby hash
|
121
|
-
def self.
|
89
|
+
def self.mql_query
|
122
90
|
query = <<-eos
|
123
91
|
[{
|
124
92
|
"name": null,
|
@@ -164,39 +132,5 @@ module MLB
|
|
164
132
|
'{"query":' + query.gsub!("\n", '').gsub!(' ', '') + '}'
|
165
133
|
end
|
166
134
|
|
167
|
-
def self.team_sql_query
|
168
|
-
<<-eos
|
169
|
-
SELECT teams.name AS name
|
170
|
-
, leagues.name AS league
|
171
|
-
, divisions.name AS division
|
172
|
-
, teams.manager AS manager
|
173
|
-
, teams.wins AS wins
|
174
|
-
, teams.losses AS losses
|
175
|
-
, teams.founded AS founded
|
176
|
-
, teams.mascot AS mascot
|
177
|
-
, teams.ballpark AS ballpark
|
178
|
-
, teams.logo_url AS logo_url
|
179
|
-
FROM teams
|
180
|
-
, divisions
|
181
|
-
, leagues
|
182
|
-
WHERE teams.division_id = divisions.id
|
183
|
-
AND divisions.league_id = leagues.id
|
184
|
-
ORDER BY teams.name
|
185
|
-
eos
|
186
|
-
end
|
187
|
-
|
188
|
-
def self.player_sql_query(team_name)
|
189
|
-
<<-eos
|
190
|
-
SELECT players.name AS name
|
191
|
-
, players.position AS position
|
192
|
-
, players.number AS number
|
193
|
-
FROM players
|
194
|
-
, teams
|
195
|
-
WHERE players.team_id = teams.id
|
196
|
-
AND teams.name = "#{team_name}"
|
197
|
-
ORDER BY players.name
|
198
|
-
eos
|
199
|
-
end
|
200
|
-
|
201
135
|
end
|
202
136
|
end
|
data/lib/mlb/version.rb
CHANGED
data/mlb.gemspec
CHANGED
@@ -5,13 +5,12 @@ Gem::Specification.new do |s|
|
|
5
5
|
s.add_development_dependency("bundler", "~> 1.0")
|
6
6
|
s.add_development_dependency("rake", "~> 0.8")
|
7
7
|
s.add_development_dependency("rcov", "~> 0.9")
|
8
|
-
s.add_development_dependency("rspec", "~> 2.
|
8
|
+
s.add_development_dependency("rspec", "~> 2.1")
|
9
9
|
s.add_development_dependency("webmock", "~> 1.5")
|
10
10
|
s.add_development_dependency("yard", "~> 0.6")
|
11
11
|
s.add_development_dependency("ZenTest", "~> 4.4")
|
12
12
|
s.add_runtime_dependency("faraday", "~> 0.5.2")
|
13
13
|
s.add_runtime_dependency("yajl-ruby", "~> 0.7.8")
|
14
|
-
s.add_runtime_dependency("sqlite3-ruby", "~> 1.3.2")
|
15
14
|
s.authors = ["Erik Michaels-Ober"]
|
16
15
|
s.description = %q{MLB.rb is a Ruby library for retrieving current Major League Baseball players, managers, teams, divisions, and leagues.}
|
17
16
|
s.email = ["sferik@gmail.com"]
|
data/spec/mlb_spec.rb
CHANGED
@@ -4,14 +4,18 @@ describe MLB::Team, ".all" do
|
|
4
4
|
context "with connection" do
|
5
5
|
before do
|
6
6
|
stub_request(:get, 'http://api.freebase.com/api/service/mqlread').
|
7
|
-
with(:query => {:query => MLB::Team.
|
7
|
+
with(:query => {:query => MLB::Team.mql_query}).
|
8
8
|
to_return(:body => fixture("teams.json"))
|
9
9
|
end
|
10
10
|
|
11
|
+
after do
|
12
|
+
MLB::Team.reset
|
13
|
+
end
|
14
|
+
|
11
15
|
it "should request the correct resource" do
|
12
16
|
MLB::Team.all
|
13
17
|
a_request(:get, 'http://api.freebase.com/api/service/mqlread').
|
14
|
-
with(:query => {:query => MLB::Team.
|
18
|
+
with(:query => {:query => MLB::Team.mql_query}).
|
15
19
|
should have_been_made
|
16
20
|
end
|
17
21
|
|
@@ -24,10 +28,14 @@ describe MLB::Team, ".all" do
|
|
24
28
|
context "with timeout" do
|
25
29
|
before do
|
26
30
|
stub_request(:get, 'http://api.freebase.com/api/service/mqlread').
|
27
|
-
with(:query => {:query => MLB::Team.
|
31
|
+
with(:query => {:query => MLB::Team.mql_query}).
|
28
32
|
to_timeout
|
29
33
|
end
|
30
34
|
|
35
|
+
after do
|
36
|
+
MLB::Team.reset
|
37
|
+
end
|
38
|
+
|
31
39
|
it "should return the correct results" do
|
32
40
|
teams = MLB::Team.all
|
33
41
|
teams.first.name.should == "Arizona Diamondbacks"
|
@@ -37,10 +45,14 @@ describe MLB::Team, ".all" do
|
|
37
45
|
context "without connection" do
|
38
46
|
before do
|
39
47
|
stub_request(:get, 'http://api.freebase.com/api/service/mqlread').
|
40
|
-
with(:query => {:query => MLB::Team.
|
48
|
+
with(:query => {:query => MLB::Team.mql_query}).
|
41
49
|
to_raise(SocketError)
|
42
50
|
end
|
43
51
|
|
52
|
+
after do
|
53
|
+
MLB::Team.reset
|
54
|
+
end
|
55
|
+
|
44
56
|
it "should return the correct results" do
|
45
57
|
teams = MLB::Team.all
|
46
58
|
teams.first.name.should == "Arizona Diamondbacks"
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mlb
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 15
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
-
-
|
8
|
+
- 4
|
9
9
|
- 0
|
10
|
-
version: 0.
|
10
|
+
version: 0.4.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Erik Michaels-Ober
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2010-11-
|
18
|
+
date: 2010-11-07 01:00:00 -07:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
@@ -71,11 +71,11 @@ dependencies:
|
|
71
71
|
requirements:
|
72
72
|
- - ~>
|
73
73
|
- !ruby/object:Gem::Version
|
74
|
-
hash:
|
74
|
+
hash: 1
|
75
75
|
segments:
|
76
76
|
- 2
|
77
|
-
-
|
78
|
-
version: "2.
|
77
|
+
- 1
|
78
|
+
version: "2.1"
|
79
79
|
type: :development
|
80
80
|
version_requirements: *id004
|
81
81
|
- !ruby/object:Gem::Dependency
|
@@ -155,22 +155,6 @@ dependencies:
|
|
155
155
|
version: 0.7.8
|
156
156
|
type: :runtime
|
157
157
|
version_requirements: *id009
|
158
|
-
- !ruby/object:Gem::Dependency
|
159
|
-
name: sqlite3-ruby
|
160
|
-
prerelease: false
|
161
|
-
requirement: &id010 !ruby/object:Gem::Requirement
|
162
|
-
none: false
|
163
|
-
requirements:
|
164
|
-
- - ~>
|
165
|
-
- !ruby/object:Gem::Version
|
166
|
-
hash: 31
|
167
|
-
segments:
|
168
|
-
- 1
|
169
|
-
- 3
|
170
|
-
- 2
|
171
|
-
version: 1.3.2
|
172
|
-
type: :runtime
|
173
|
-
version_requirements: *id010
|
174
158
|
description: MLB.rb is a Ruby library for retrieving current Major League Baseball players, managers, teams, divisions, and leagues.
|
175
159
|
email:
|
176
160
|
- sferik@gmail.com
|
@@ -190,15 +174,13 @@ files:
|
|
190
174
|
- README.mkd
|
191
175
|
- Rakefile
|
192
176
|
- autotest/discover.rb
|
193
|
-
-
|
194
|
-
- db/mlb.sqlite3
|
177
|
+
- cache/teams.json
|
195
178
|
- lib/mlb.rb
|
196
179
|
- lib/mlb/player.rb
|
197
180
|
- lib/mlb/request.rb
|
198
181
|
- lib/mlb/team.rb
|
199
182
|
- lib/mlb/version.rb
|
200
183
|
- mlb.gemspec
|
201
|
-
- spec/fixtures/teams.json
|
202
184
|
- spec/mlb_spec.rb
|
203
185
|
- spec/spec_helper.rb
|
204
186
|
has_rdoc: true
|
@@ -238,6 +220,5 @@ signing_key:
|
|
238
220
|
specification_version: 3
|
239
221
|
summary: MLB.rb is a Ruby library for retrieving current Major League Baseball players, managers, teams, divisions, and leagues.
|
240
222
|
test_files:
|
241
|
-
- spec/fixtures/teams.json
|
242
223
|
- spec/mlb_spec.rb
|
243
224
|
- spec/spec_helper.rb
|
data/db/cleanup.sql
DELETED
@@ -1,36 +0,0 @@
|
|
1
|
-
DROP TABLE "drafts";
|
2
|
-
|
3
|
-
BEGIN TRANSACTION;
|
4
|
-
CREATE TABLE "leagues_new" ("id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, "name" VARCHAR(50) NOT NULL);
|
5
|
-
INSERT INTO "leagues_new" SELECT "id", "name" FROM "leagues";
|
6
|
-
DROP TABLE "leagues";
|
7
|
-
ALTER TABLE "leagues_new" RENAME TO "leagues";
|
8
|
-
COMMIT;
|
9
|
-
|
10
|
-
BEGIN TRANSACTION;
|
11
|
-
CREATE TABLE "divisions_new" ("id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, "league_id" INTEGER NOT NULL, "name" VARCHAR(50) NOT NULL);
|
12
|
-
INSERT INTO "divisions_new" SELECT "id", "league_id", "name" FROM "divisions";
|
13
|
-
DROP TABLE "divisions";
|
14
|
-
ALTER TABLE "divisions_new" RENAME TO "divisions";
|
15
|
-
CREATE INDEX "index_divisions_league_id" ON "divisions" ("league_id");
|
16
|
-
COMMIT;
|
17
|
-
|
18
|
-
BEGIN TRANSACTION;
|
19
|
-
CREATE TABLE "players_new" ("id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, "team_id" INTEGER, "name" VARCHAR(100) NOT NULL, "position" VARCHAR(50), "number" INTEGER NOT NULL);
|
20
|
-
INSERT INTO "players_new" SELECT "id", "team_id", "name", "position", "number" FROM "players";
|
21
|
-
DROP TABLE "players";
|
22
|
-
ALTER TABLE "players_new" RENAME TO "players";
|
23
|
-
CREATE INDEX "index_players_team_id" ON "players" ("team_id");
|
24
|
-
COMMIT;
|
25
|
-
|
26
|
-
BEGIN TRANSACTION;
|
27
|
-
CREATE TABLE "teams_new" ("id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, "league_id" INTEGER NOT NULL, "division_id" INTEGER NOT NULL, "name" VARCHAR(50), "logo_url" VARCHAR(255), "manager" VARCHAR(100) NOT NULL, "ballpark" VARCHAR(100), "mascot" VARCHAR(100), "founded" INTEGER NOT NULL, "wins" INTEGER NOT NULL, "losses" INTEGER NOT NULL);
|
28
|
-
INSERT INTO "teams_new" SELECT "id", "league_id", "division_id", "name", "logo_url", "manager", "ballpark", "mascot", "founded", "wins", "losses" FROM "teams";
|
29
|
-
DROP TABLE "teams";
|
30
|
-
ALTER TABLE "teams_new" RENAME TO "teams";
|
31
|
-
CREATE INDEX "index_teams_division_id" ON "teams" ("division_id");
|
32
|
-
CREATE INDEX "index_teams_league_id" ON "teams" ("league_id");
|
33
|
-
CREATE INDEX "index_teams_name" ON "teams" ("name");
|
34
|
-
COMMIT;
|
35
|
-
|
36
|
-
VACUUM;
|
data/db/mlb.sqlite3
DELETED
Binary file
|