mlb 0.0.5 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (6) hide show
  1. data/README.rdoc +14 -14
  2. data/Rakefile +20 -36
  3. data/lib/mlb.rb +3 -122
  4. data/lib/mlb/player.rb +29 -0
  5. data/lib/mlb/team.rb +143 -0
  6. metadata +7 -5
@@ -5,20 +5,20 @@
5
5
  == Usage
6
6
  $ irb
7
7
  >> require 'mlb'
8
- >> MLB.teams.first.name # => "Arizona Diamondbacks"
9
- >> MLB.teams.first.league # => "National League"
10
- >> MLB.teams.first.division # => "National League West"
11
- >> MLB.teams.first.manager # => "Bob Melvin"
12
- >> MLB.teams.first.wins # => 82
13
- >> MLB.teams.first.losses # => 80
14
- >> MLB.teams.first.founded # => 1998
15
- >> MLB.teams.first.mascot # => nil
16
- >> MLB.teams.first.ballpark # => "Chase Field"
17
- >> MLB.teams.first.logo_url # => "http://img.freebase.com/api/trans/image_thumb/wikipedia/images/en_id/13104064"
18
- >> MLB.teams.first.players.first.name # => "Alex Romero"
19
- >> MLB.teams.first.players.first.number # => 28
20
- >> MLB.teams.first.players.first.position # => "Right fielder"
21
- == Acknowledgements
8
+ >> MLB::Team.all.first.name # => "Arizona Diamondbacks"
9
+ >> MLB::Team.all.first.league # => "National League"
10
+ >> MLB::Team.all.first.division # => "National League West"
11
+ >> MLB::Team.all.first.manager # => "Bob Melvin"
12
+ >> MLB::Team.all.first.wins # => 82
13
+ >> MLB::Team.all.first.losses # => 80
14
+ >> MLB::Team.all.first.founded # => 1998
15
+ >> MLB::Team.all.first.mascot # => nil
16
+ >> MLB::Team.all.first.ballpark # => "Chase Field"
17
+ >> MLB::Team.all.first.logo_url # => "http://img.freebase.com/api/trans/image_thumb/wikipedia/images/en_id/13104064"
18
+ >> MLB::Team.all.first.players.first.name # => "Alex Romero"
19
+ >> MLB::Team.all.first.players.first.number # => 28
20
+ >> MLB::Team.all.first.players.first.position # => "Right fielder"
21
+ == Credits
22
22
  Many thanks to:
23
23
  * Freebase[http://www.freebase.com]
24
24
  * httparty[http://github.com/jnunemaker/httparty]
data/Rakefile CHANGED
@@ -8,44 +8,28 @@ AUTHOR = "Erik Michaels-Ober"
8
8
  EMAIL = "sferik@gmail.com"
9
9
  HOMEPAGE = "http://github.com/sferik/mlb"
10
10
  SUMMARY = "MLB.rb is a Ruby library for retrieving current Major League Baseball players, managers, teams, divisions, and leagues."
11
- GEM_VERSION = "0.0.5"
11
+ GEM_VERSION = "0.1.1"
12
12
 
13
- spec = Gem::Specification.new do |s|
14
- s.name = GEM_NAME
15
- s.version = GEM_VERSION
16
- s.platform = Gem::Platform::RUBY
17
- s.has_rdoc = true
18
- s.extra_rdoc_files = ["README.rdoc", "LICENSE"]
19
- s.summary = SUMMARY
20
- s.description = s.summary
21
- s.author = AUTHOR
22
- s.email = EMAIL
23
- s.homepage = HOMEPAGE
24
- s.add_dependency("httparty", ">= 0.4.5")
25
- s.add_dependency("json", ">= 1.1.9")
26
- s.require_path = "lib"
27
- s.files = %w(LICENSE README.rdoc Rakefile) + Dir.glob("{doc,lib}/**/*")
28
- end
29
-
30
- Rake::GemPackageTask.new(spec) do |pkg|
31
- pkg.gem_spec = spec
32
- end
33
-
34
- desc "Install the gem"
35
- task :install do
36
- Merb::RakeHelper.install(GEM_NAME, :version => GEM_VERSION)
37
- end
38
-
39
- desc "Uninstall the gem"
40
- task :uninstall do
41
- Merb::RakeHelper.uninstall(GEM_NAME, :version => GEM_VERSION)
42
- end
43
-
44
- desc "Create a gemspec file"
45
- task :gemspec do
46
- File.open("#{GEM_NAME}.gemspec", "w") do |file|
47
- file.puts spec.to_ruby
13
+ begin
14
+ require 'jeweler'
15
+ Jeweler::Tasks.new do |gemspec|
16
+ gemspec.name = GEM_NAME
17
+ gemspec.version = GEM_VERSION
18
+ gemspec.platform = Gem::Platform::RUBY
19
+ gemspec.has_rdoc = true
20
+ gemspec.extra_rdoc_files = ["README.rdoc", "LICENSE"]
21
+ gemspec.summary = SUMMARY
22
+ gemspec.description = gemspec.summary
23
+ gemspec.author = AUTHOR
24
+ gemspec.email = EMAIL
25
+ gemspec.homepage = HOMEPAGE
26
+ gemspec.add_dependency("httparty", ">= 0.4.5")
27
+ gemspec.add_dependency("json", ">= 1.1.9")
28
+ gemspec.require_path = "lib"
29
+ gemspec.files = %w(LICENSE README.rdoc Rakefile) + Dir.glob("{lib}/**/*")
48
30
  end
31
+ rescue LoadError
32
+ puts "Jeweler not available. Install it with: gem install jeweler"
49
33
  end
50
34
 
51
35
  Rake::RDocTask.new do |rd|
data/lib/mlb.rb CHANGED
@@ -1,123 +1,4 @@
1
- require 'httparty'
2
- require 'json'
3
- require 'ostruct'
4
-
5
- class MLB
6
- include HTTParty
7
- base_uri 'http://www.freebase.com/api'
8
-
9
- # Returns an array of objects, one for each Major League Baseball team
10
- #
11
- # MLB.teams.first.name # => "Arizona Diamondbacks"
12
- # MLB.teams.first.league # => "National League"
13
- # MLB.teams.first.division # => "National League West"
14
- # MLB.teams.first.manager # => "Bob Melvin"
15
- # MLB.teams.first.wins # => 82
16
- # MLB.teams.first.losses # => 80
17
- # MLB.teams.first.founded # => 1998
18
- # MLB.teams.first.mascot # => nil
19
- # MLB.teams.first.ballpark # => "Chase Field"
20
- # MLB.teams.first.logo_url # => "http://img.freebase.com/api/trans/image_thumb/wikipedia/images/en_id/13104064"
21
- # MLB.teams.first.players.first.name # => "Alex Romero"
22
- # MLB.teams.first.players.first.number # => 28
23
- # MLB.teams.first.players.first.position # => "Right fielder"
24
- def self.teams
25
- @query ||= team_query
26
- @response ||= exec_query(@query)
27
- @results ||= []
28
- if @response && @results.empty?
29
- @response['result'].each do |result|
30
- @results << OpenStruct.new({
31
- :name => result['name'],
32
- :league => result['league']['name'],
33
- :division => result['division']['name'],
34
- :manager => result['current_manager']['name'],
35
- :wins => result['team_stats'].first['wins'].to_i,
36
- :losses => result['team_stats'].first['losses'].to_i,
37
- :founded => result['/sports/sports_team/founded'].first['value'].to_i,
38
- :mascot => (result['/sports/sports_team/team_mascot'].first ? result['/sports/sports_team/team_mascot'].first['name'] : nil),
39
- :ballpark => result['/sports/sports_team/arena_stadium'].first['name'],
40
- :logo_url => 'http://img.freebase.com/api/trans/image_thumb' + result['/common/topic/image'].first['id'],
41
- :players => result['current_roster'].map {|player|
42
- OpenStruct.new({
43
- :name => player['player'],
44
- :number => player['number'],
45
- :position => player['position'],
46
- })
47
- },
48
- })
49
- end
50
- end
51
- @results
52
- end
53
-
54
- private
55
-
56
- # Converts MQL query to JSON and fetches response from Freebase API
57
- def self.exec_query(query)
58
- format :json
59
- begin
60
- response = get('/service/mqlread?', :query => {:query => query.to_json})
61
- if response['code'] != '/api/status/ok'
62
- error("#{response['status']} (Transaction: #{response['transaction_id']})")
63
- end
64
- rescue SocketError, Errno::ECONNREFUSED => e
65
- error("Could not connect. Unclog tubes and try again.")
66
- end
67
- response
68
- end
69
-
70
- # Returns the MQL query for teams, as a Ruby hash
71
- def self.team_query
72
- {
73
- :query => [
74
- {
75
- 'name' => nil,
76
- 'league' => {
77
- 'name' => nil,
78
- },
79
- 'division' => {
80
- 'name' => nil,
81
- },
82
- 'current_manager' => {
83
- 'name' => nil,
84
- },
85
- 'team_stats' => [{
86
- 'wins' => nil,
87
- 'losses' => nil,
88
- 'season' => nil,
89
- 'limit' => 1,
90
- 'sort' => '-season',
91
- }],
92
- 'current_roster' => [{
93
- 'player' => nil,
94
- 'position' => nil,
95
- 'number' => nil,
96
- 'sort' => 'player',
97
- }],
98
- '/sports/sports_team/founded' => [{
99
- 'value' => nil,
100
- }],
101
- '/sports/sports_team/team_mascot' => [{
102
- }],
103
- '/sports/sports_team/arena_stadium' => [{
104
- 'name' => nil,
105
- }],
106
- '/common/topic/image' => [{
107
- 'id' => nil,
108
- 'timestamp' => nil,
109
- 'sort' => '-timestamp',
110
- 'limit' => 1,
111
- }],
112
- 'sort' => 'name',
113
- 'type' => '/baseball/baseball_team',
114
- }
115
- ]
116
- }
117
- end
118
-
119
- def self.error(*messages)
120
- puts messages.map{|msg| "\033[1;31mError: #{msg}\033[0m"}
121
- end
122
-
1
+ module MLB
2
+ autoload :Team, 'mlb/team'
3
+ autoload :Player, 'mlb/player'
123
4
  end
@@ -0,0 +1,29 @@
1
+ module MLB
2
+ class Player
3
+ attr_reader :name, :number, :position
4
+ private_class_method :new
5
+
6
+ protected
7
+
8
+ # Returns an array of Player objects given a team roster
9
+ def self.all_from_roster(players)
10
+ players.map do |player|
11
+ new(
12
+ :name => player['player'],
13
+ :number => player['number'],
14
+ :position => player['position']
15
+ )
16
+ end
17
+ end
18
+
19
+ private
20
+
21
+ def initialize(attributes={})
22
+ super unless attributes.is_a?(Hash)
23
+ @name = attributes[:name]
24
+ @number = attributes[:number]
25
+ @position = attributes[:position]
26
+ end
27
+
28
+ end
29
+ end
@@ -0,0 +1,143 @@
1
+ require 'httparty'
2
+ require 'json'
3
+
4
+ module MLB
5
+ class Team
6
+ include HTTParty
7
+ format :json
8
+ base_uri 'http://www.freebase.com/api'
9
+ attr_reader :name, :league, :division, :manager, :wins, :losses, :founded, :mascot, :ballpark, :logo_url, :players
10
+ private_class_method :new
11
+
12
+ # Returns an array of Team objects
13
+ #
14
+ # MLB::Team.all.first.name # => "Arizona Diamondbacks"
15
+ # MLB::Team.all.first.league # => "National League"
16
+ # MLB::Team.all.first.division # => "National League West"
17
+ # MLB::Team.all.first.manager # => "Bob Melvin"
18
+ # MLB::Team.all.first.wins # => 82
19
+ # MLB::Team.all.first.losses # => 80
20
+ # MLB::Team.all.first.founded # => 1998
21
+ # MLB::Team.all.first.mascot # => nil
22
+ # MLB::Team.all.first.ballpark # => "Chase Field"
23
+ # MLB::Team.all.first.logo_url # => "http://img.freebase.com/api/trans/image_thumb/wikipedia/images/en_id/13104064"
24
+ # MLB::Team.all.first.players.first.name # => "Alex Romero"
25
+ # MLB::Team.all.first.players.first.number # => 28
26
+ # MLB::Team.all.first.players.first.position # => "Right fielder"
27
+ def self.all
28
+ @query ||= query
29
+ @response ||= execute(@query)
30
+ @results ||= []
31
+ if @response && @results.empty?
32
+ @response['result'].each do |result|
33
+ league = result['league']
34
+ division = result['division']
35
+ manager = result['current_manager']
36
+ stats = result['team_stats'].first
37
+ founded = result['/sports/sports_team/founded'].first
38
+ mascot = result['/sports/sports_team/team_mascot'].first
39
+ ballpark = result['/sports/sports_team/arena_stadium'].first
40
+ logo_prefix = 'http://img.freebase.com/api/trans/image_thumb'
41
+ logo_suffix = result['/common/topic/image'].first
42
+ players = result['current_roster']
43
+
44
+ @results << new(
45
+ :name => result['name'],
46
+ :league => (league ? league['name'] : nil),
47
+ :division => (division ? division['name'] : nil),
48
+ :manager => (manager ? manager['name'] : nil),
49
+ :wins => (stats ? stats['wins'].to_i : nil),
50
+ :losses => (stats ? stats['losses'].to_i : nil),
51
+ :founded => (founded ? founded['value'].to_i : nil),
52
+ :mascot => (mascot ? mascot['name'] : nil),
53
+ :ballpark => (ballpark ? ballpark['name'] : nil),
54
+ :logo_url => (logo_suffix ? logo_prefix + logo_suffix['id'] : nil),
55
+ :players => (players ? Player.all_from_roster(players) : [])
56
+ )
57
+
58
+ end
59
+ end
60
+ @results
61
+ end
62
+
63
+ private
64
+
65
+ def initialize(attributes={})
66
+ super unless attributes.is_a?(Hash)
67
+ @name = attributes[:name]
68
+ @league = attributes[:league]
69
+ @division = attributes[:division]
70
+ @manager = attributes[:manager]
71
+ @wins = attributes[:wins]
72
+ @losses = attributes[:losses]
73
+ @founded = attributes[:founded]
74
+ @mascot = attributes[:mascot]
75
+ @ballpark = attributes[:ballpark]
76
+ @logo_url = attributes[:logo_url]
77
+ @players = attributes[:players]
78
+ end
79
+
80
+ # Converts MQL query to JSON and fetches response from Freebase API
81
+ def self.execute(query)
82
+ begin
83
+ response = get('/service/mqlread?', :query => {:query => query.to_json})
84
+ if response['code'] != '/api/status/ok'
85
+ raise Exception, "#{response['status']} (Transaction: #{response['transaction_id']})"
86
+ end
87
+ rescue SocketError, Errno::ECONNREFUSED
88
+ raise Exception, "Could not connect. Unclog tubes and try again."
89
+ end
90
+ response
91
+ end
92
+
93
+ # Returns the MQL query for teams, as a Ruby hash
94
+ def self.query
95
+ {
96
+ :query => [
97
+ {
98
+ 'name' => nil,
99
+ 'league' => {
100
+ 'name' => nil,
101
+ },
102
+ 'division' => {
103
+ 'name' => nil,
104
+ },
105
+ 'current_manager' => {
106
+ 'name' => nil,
107
+ },
108
+ 'team_stats' => [{
109
+ 'wins' => nil,
110
+ 'losses' => nil,
111
+ 'season' => nil,
112
+ 'limit' => 1,
113
+ 'sort' => '-season',
114
+ }],
115
+ 'current_roster' => [{
116
+ 'player' => nil,
117
+ 'position' => nil,
118
+ 'number' => nil,
119
+ 'sort' => 'player',
120
+ }],
121
+ '/sports/sports_team/founded' => [{
122
+ 'value' => nil,
123
+ }],
124
+ '/sports/sports_team/team_mascot' => [{
125
+ }],
126
+ '/sports/sports_team/arena_stadium' => [{
127
+ 'name' => nil,
128
+ }],
129
+ '/common/topic/image' => [{
130
+ 'id' => nil,
131
+ 'timestamp' => nil,
132
+ 'sort' => '-timestamp',
133
+ 'limit' => 1,
134
+ }],
135
+ 'sort' => 'name',
136
+ 'type' => '/baseball/baseball_team',
137
+ }
138
+ ]
139
+ }
140
+ end
141
+
142
+ end
143
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mlb
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.5
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Erik Michaels-Ober
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-10-16 00:00:00 -07:00
12
+ date: 2009-11-13 00:00:00 -08:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -39,20 +39,22 @@ executables: []
39
39
  extensions: []
40
40
 
41
41
  extra_rdoc_files:
42
- - README.rdoc
43
42
  - LICENSE
43
+ - README.rdoc
44
44
  files:
45
45
  - LICENSE
46
46
  - README.rdoc
47
47
  - Rakefile
48
48
  - lib/mlb.rb
49
+ - lib/mlb/player.rb
50
+ - lib/mlb/team.rb
49
51
  has_rdoc: true
50
52
  homepage: http://github.com/sferik/mlb
51
53
  licenses: []
52
54
 
53
55
  post_install_message:
54
- rdoc_options: []
55
-
56
+ rdoc_options:
57
+ - --charset=UTF-8
56
58
  require_paths:
57
59
  - lib
58
60
  required_ruby_version: !ruby/object:Gem::Requirement