football_api 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (48) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +15 -0
  3. data/.rspec +2 -0
  4. data/.ruby-gemset +1 -0
  5. data/.ruby-version +1 -0
  6. data/Gemfile +4 -0
  7. data/LICENSE.txt +22 -0
  8. data/README.md +31 -0
  9. data/Rakefile +2 -0
  10. data/football_api-0.0.1.gem +0 -0
  11. data/football_api-0.0.2.gem +0 -0
  12. data/football_api-0.0.3.gem +0 -0
  13. data/football_api.gemspec +36 -0
  14. data/lib/football_api/base_request.rb +75 -0
  15. data/lib/football_api/card.rb +19 -0
  16. data/lib/football_api/comment.rb +13 -0
  17. data/lib/football_api/commentary.rb +79 -0
  18. data/lib/football_api/competition.rb +54 -0
  19. data/lib/football_api/errors.rb +13 -0
  20. data/lib/football_api/event.rb +19 -0
  21. data/lib/football_api/fixture.rb +44 -0
  22. data/lib/football_api/goal.rb +17 -0
  23. data/lib/football_api/match.rb +59 -0
  24. data/lib/football_api/match_bench.rb +27 -0
  25. data/lib/football_api/match_info.rb +14 -0
  26. data/lib/football_api/match_stats.rb +29 -0
  27. data/lib/football_api/match_substitutions.rb +27 -0
  28. data/lib/football_api/match_summary.rb +39 -0
  29. data/lib/football_api/match_team.rb +22 -0
  30. data/lib/football_api/mixins/requestable.rb +19 -0
  31. data/lib/football_api/mixins/symbolizer.rb +59 -0
  32. data/lib/football_api/player.rb +12 -0
  33. data/lib/football_api/standing.rb +104 -0
  34. data/lib/football_api/version.rb +3 -0
  35. data/lib/football_api.rb +32 -0
  36. data/spec/commentary_spec.rb +112 -0
  37. data/spec/competition_spec.rb +27 -0
  38. data/spec/fixture_spec.rb +90 -0
  39. data/spec/helpers/json_helper.rb +41 -0
  40. data/spec/json/commentaries.json +1967 -0
  41. data/spec/json/competitions.json +23 -0
  42. data/spec/json/fixtures.json +4559 -0
  43. data/spec/json/matches.json +17 -0
  44. data/spec/json/standings.json +719 -0
  45. data/spec/match_spec.rb +25 -0
  46. data/spec/spec_helper.rb +115 -0
  47. data/spec/standing_spec.rb +37 -0
  48. metadata +346 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 3de37e6a41a4af23643c980f5261a4e9d9345ec3
4
+ data.tar.gz: d2eb25bd2a80f95ef6c3e8a75649a854cfdd9560
5
+ SHA512:
6
+ metadata.gz: 9f542c19784774e209a90c898ecf5ea44e95de8eb989df5d972e7ab71530554941eb5f90bd4143ee6c068d66dc68aa63c56a1e843ae4227776b89e40d0ba6a3e
7
+ data.tar.gz: 1e55fd1031075c1e7b4555576fc2d9c64bd24f1309101777237cd19a0676caa2c2cbbb361553c745abd451f599f5a9cd8127c52e4174ee2dff7eea585e46e9c8
data/.gitignore ADDED
@@ -0,0 +1,15 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
10
+ *.bundle
11
+ *.so
12
+ *.o
13
+ *.a
14
+ mkmf.log
15
+ .env
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --format documentation
data/.ruby-gemset ADDED
@@ -0,0 +1 @@
1
+ football_api
data/.ruby-version ADDED
@@ -0,0 +1 @@
1
+ 2.2.0
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in football_api.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2015 Afonso Tsukamoto
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,31 @@
1
+ # FootballApi
2
+
3
+ TODO: Write a gem description
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ ```ruby
10
+ gem 'football_api'
11
+ ```
12
+
13
+ And then execute:
14
+
15
+ $ bundle
16
+
17
+ Or install it yourself as:
18
+
19
+ $ gem install football_api
20
+
21
+ ## Usage
22
+
23
+ TODO: Write usage instructions here
24
+
25
+ ## Contributing
26
+
27
+ 1. Fork it ( https://github.com/[my-github-username]/football_api/fork )
28
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
29
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
30
+ 4. Push to the branch (`git push origin my-new-feature`)
31
+ 5. Create a new Pull Request
data/Rakefile ADDED
@@ -0,0 +1,2 @@
1
+ require "bundler/gem_tasks"
2
+
Binary file
Binary file
Binary file
@@ -0,0 +1,36 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'football_api/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "football_api"
8
+ spec.version = FootballApi::VERSION
9
+ spec.authors = ["Afonso Tsukamoto"]
10
+ spec.email = ["atsukamoto@faber-ventures.com"]
11
+ spec.summary = %q{ Interface with football-api }
12
+ spec.description = %q{ Interface with football-api }
13
+ spec.homepage = ""
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files -z`.split("\x0")
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_development_dependency "bundler", "~> 1.7"
22
+ spec.add_development_dependency "rake", "~> 10.0"
23
+ spec.add_development_dependency 'reek', '~> 1.3', '>= 1.3.7'
24
+ spec.add_development_dependency 'rubocop', '~> 0.20', '>= 0.20.1'
25
+ spec.add_development_dependency 'pry', '~> 0.9', '>= 0.9.12'
26
+ spec.add_development_dependency 'pry-byebug', '~> 2.0.0'
27
+ spec.add_development_dependency 'rspec', '~> 3.2', '>= 3.2.0'
28
+ spec.add_development_dependency 'webmock', '~> 1.21', '>= 1.21.0'
29
+
30
+ spec.add_dependency 'dotenv', '~> 2.0.2'
31
+ spec.add_dependency 'activesupport', '~> 4.1'
32
+ spec.add_dependency 'httparty', '~> 0.13', '>= 0.13.0'
33
+ spec.add_dependency 'colored', '~> 1.2'
34
+ spec.add_dependency 'tzinfo', '~> 1.1', '>= 1.1.0'
35
+ spec.add_dependency 'eventmachine', '~> 1.0', '>= 1.0.3'
36
+ end
@@ -0,0 +1,75 @@
1
+ module FootballApi
2
+ class BaseRequest
3
+ include HTTParty
4
+ include FootballApi::Symbolizer
5
+
6
+ debug_output $stdout
7
+ # Disable the use of rails query string format.
8
+ #
9
+ # With rails query string format enabled:
10
+ # => get '/', :query => { selected_ids: [1,2,3] }
11
+ #
12
+ # Would translate to this:
13
+ # => /?selected_ids[]=1&selected_ids[]=2&selected_ids[]=3
14
+ #
15
+ disable_rails_query_string_format
16
+
17
+ # How many times should we retry the request if Timeout::Error is raised?
18
+ RETRIES = 3
19
+
20
+ # The API Base URI
21
+ base_uri 'http://football-api.com/'
22
+
23
+ # The default format of the requests. Used on HTTP header 'Content-Type'.
24
+ format :json
25
+
26
+ # The default params for every request
27
+ # TODO : Pass key in config
28
+ default_params 'APIKey' => '69216017-4bb7-96db-0deeadb1b645'
29
+
30
+ # Default request timeout in seconds. This can be overriden by module configuration.
31
+ default_timeout 15
32
+
33
+ class << self
34
+
35
+ # The generic get method for all requests.
36
+ # Uses httparty get and makes no assumptions about the response,
37
+ # simply returns it
38
+ def get!(options = {}, &block)
39
+ attempts ||= RETRIES
40
+ query = action_query(options)
41
+ get("/api/", query, &block)
42
+
43
+ rescue Timeout::Error => e
44
+ puts "Timeout! Retrying... (#{RETRIES - attempts})"
45
+
46
+ retry if (attempts -= 1) > 0
47
+
48
+ raise FootballApi::RequestError.new('Request timeout')
49
+ end
50
+
51
+ alias_method :request!, :get!
52
+
53
+ # This is an handy method for response parsing.
54
+ # Subclasses that include Requestable can simply use the json_key option
55
+ # and response will only contain that field.
56
+ # It also deep symbolizes the response keys
57
+ def response(options = {})
58
+ data = get!(options) || Hash.new
59
+
60
+ data = custom_deep_symbolic_hash(data)
61
+ data.present? ? data[json_id] : data
62
+ end
63
+
64
+ def action_query(options = {})
65
+ { query: { "Action" => action }.merge(options) }.tap do |hs|
66
+ hs[:query].merge!(get_parameters) if params_method
67
+ end
68
+ end
69
+
70
+ def get_parameters
71
+ send(params_method)
72
+ end
73
+ end
74
+ end
75
+ end
@@ -0,0 +1,19 @@
1
+ module FootballApi
2
+ class Card
3
+ TYPE = [ :yellow, :red ]
4
+
5
+ attr_accessor :type, :minute, :player
6
+
7
+ def initialize(hash = {})
8
+ return {} unless TYPE.include?(hash[:type])
9
+
10
+ @type = hash[:type]
11
+ @minute = hash[:minute]
12
+ @player = parse_player(hash)
13
+ end
14
+
15
+ def parse_player(hash = {})
16
+ FootballApi::Player.new(hash)
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,13 @@
1
+ module FootballApi
2
+ class Comment < FootballApi::BaseRequest
3
+ attr_accessor :id, :important, :is_goal, :minute, :comment
4
+
5
+ def initialize(hash = {})
6
+ @id = hash[:id]
7
+ @important = hash[:important]
8
+ @is_goal = hash[:isgoal]
9
+ @minute = hash[:minute]
10
+ @comment = hash[:comment]
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,79 @@
1
+ module FootballApi
2
+ class Commentary < FootballApi::BaseRequest
3
+ include FootballApi::Requestable
4
+
5
+ api_options action: :commentaries, action_params: :commentary_params, json_key: :commentaries
6
+
7
+ class << self
8
+ attr_accessor :match_id
9
+
10
+ def all_from_match(match)
11
+ @match_id = match.is_a?(Match) ? match.id : match
12
+
13
+ res = response
14
+ res.map { |commentary| new(commentary) }.first
15
+ end
16
+
17
+ def commentary_params
18
+ { match_id: self.match_id }
19
+ end
20
+ end
21
+
22
+ attr_accessor :match_id, :static_id, :match_info, :match_summary,
23
+ :match_stats, :local_match_team, :visitor_match_team,
24
+ :commentaries, :match_bench, :match_substitutions
25
+
26
+ def initialize(hash = {})
27
+ @match_id = hash[:comm_match_id]
28
+ @static_id = hash[:comm_static_id]
29
+ @match_info = parse_match_info(hash)
30
+ @match_summary = parse_match_summary(hash)
31
+ @match_stats = parse_match_stats(hash)
32
+ @local_match_team = parse_match_teams(hash, :localteam)
33
+ @visitor_match_team = parse_match_teams(hash, :visitorteam)
34
+ @match_bench = parse_match_bench(hash)
35
+ @match_substitutions = parse_match_substitutions(hash)
36
+ @commentaries = parse_comments(hash[:comm_commentaries])
37
+ end
38
+
39
+ def parse_match_info(hash = {})
40
+ hash = hash[:comm_match_info].merge(id: hash[:comm_match_id])
41
+ FootballApi::MatchInfo.new(hash)
42
+ end
43
+
44
+ def parse_match_summary(hash = {})
45
+ hash = hash[:comm_match_summary].merge(id: hash[:comm_match_id])
46
+ FootballApi::MatchSummary.new(hash)
47
+ end
48
+
49
+ def parse_match_stats(hash = {})
50
+ return unless hash[:comm_match_stats].is_a?(Hash)
51
+ hash = hash[:comm_match_stats].merge(id: hash[:comm_match_id])
52
+ FootballApi::MatchStats.new(hash)
53
+ end
54
+
55
+ def parse_match_teams(hash = {}, key)
56
+ FootballApi::MatchTeam.new(hash, key)
57
+ end
58
+
59
+ def parse_comments(hash = {})
60
+ return unless hash[:comment]
61
+
62
+ Array(hash[:comment]).map{ |comment| FootballApi::Comment.new(comment) }
63
+ end
64
+
65
+ def parse_match_bench(hash = {})
66
+ return unless hash[:comm_match_subs]
67
+
68
+ FootballApi::MatchBench.new(hash[:comm_match_subs]
69
+ .merge(match_id: hash[:comm_match_id]))
70
+ end
71
+
72
+ def parse_match_substitutions(hash)
73
+ return unless hash[:comm_match_substitutions]
74
+
75
+ FootballApi::MatchSubstitutions.new(hash[:comm_match_substitutions]
76
+ .merge(match_id: hash[:comm_match_id]))
77
+ end
78
+ end
79
+ end
@@ -0,0 +1,54 @@
1
+ module FootballApi
2
+ class Competition < FootballApi::BaseRequest
3
+ include FootballApi::Requestable
4
+
5
+ api_options action: :competitions, json_key: :Competition
6
+
7
+ # Response sample :
8
+ # [
9
+ # {
10
+ # "id":"1064",
11
+ # "name":"Superliga",
12
+ # "region":"Albania"
13
+ # } ...
14
+ # ]
15
+ attr_accessor :id, :name, :region
16
+
17
+ def self.all
18
+ response && response.map do |comp|
19
+ new(comp)
20
+ end
21
+ end
22
+
23
+ def self.where(options = {})
24
+ response.select{ |c| matches_options(c, options) }.map{ |hsh| new(hsh) }
25
+ end
26
+
27
+ def initialize(hash = {})
28
+ @id = hash[:id]
29
+ @name = hash[:name]
30
+ @region = hash[:region]
31
+ end
32
+
33
+ private
34
+
35
+ # Matches the two given hashes.
36
+ # For example, if an options hash has:
37
+ # => {id:1, name: 'ze'}
38
+ #
39
+ # And the object has:
40
+ # => {id:1, name: 'ze', region: 'beira'}
41
+ #
42
+ # This function returns the reduce(:&) from the array:
43
+ # [true, true, true] -> true
44
+ #
45
+ # Where the two first trues are from *id == id* and *name == name*
46
+ # and since the options hash has no key :region,
47
+ # it returns *true* since that's a non searched option
48
+ def matches_options(object, options)
49
+ options.keys.map{ |key|
50
+ object.has_key?(key) ? options[key] == object[key] : true
51
+ }.reduce(:&)
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,13 @@
1
+ module FootballApi
2
+ class BaseError < StandardError
3
+ end
4
+
5
+ class InvalidParameter < BaseError
6
+ end
7
+
8
+ class RequestError < BaseError
9
+ end
10
+
11
+ class InfostradaError < BaseError
12
+ end
13
+ end
@@ -0,0 +1,19 @@
1
+ module FootballApi
2
+ class Event
3
+ TYPES = %w(yellowcard goal redcard yellowred)
4
+
5
+ attr_accessor :event_id, :event_match_id, :event_type, :event_minute, :event_team,
6
+ :event_player, :event_player_id, :event_result
7
+
8
+ def initialize(hash = {})
9
+ @event_id = hash[:event_id]
10
+ @event_match_id = hash[:event_match_id]
11
+ @event_type = hash[:event_type]
12
+ @event_minute = hash[:event_minute]
13
+ @event_team = hash[:event_team]
14
+ @event_player = hash[:event_player]
15
+ @event_player_id = hash[:event_player_id]
16
+ @event_result = hash[:event_result]
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,44 @@
1
+ module FootballApi
2
+ class Fixture < FootballApi::BaseRequest
3
+ include FootballApi::Requestable
4
+
5
+ api_options action: :fixtures, action_params: :fixture_params, json_key: :matches
6
+
7
+ class << self
8
+ attr_accessor :match_date, :from_date, :to_date, :comp_id
9
+
10
+ def where(options = {})
11
+ @comp_id = options.delete(:comp_id)
12
+ @match_date = options.delete(:match_date)
13
+ @from_date = options.delete(:from_date)
14
+ @to_date = options.delete(:to_date)
15
+
16
+ response.map{ |fixture|
17
+ new (fixture)
18
+ }
19
+ end
20
+
21
+ def fixture_params
22
+ [:comp_id, :match_date, :from_date, :to_date].each_with_object({}) do |symb, opts|
23
+ opts.merge!(symb => send(symb) ) if send(symb)
24
+ end
25
+ end
26
+ end
27
+
28
+ attr_accessor :match, :match_timer, :match_events
29
+
30
+ def initialize(hash = {})
31
+ @match = parse_match(hash)
32
+ @match_timer = hash[:match_timer]
33
+ @match_events = parse_match_events(hash[:match_events])
34
+ end
35
+
36
+ def parse_match(hash = {})
37
+ FootballApi::Match.new(hash)
38
+ end
39
+
40
+ def parse_match_events(arr = [])
41
+ Array(arr).map { |e| FootballApi::Event.new(e) }
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,17 @@
1
+ module FootballApi
2
+ class Goal
3
+ attr_accessor :score, :minute, :player, :owngoal, :penalty
4
+
5
+ def initialize(hash = {})
6
+ @score = hash[:score]
7
+ @minute = hash[:minute]
8
+ @owngoal = hash[:owngoal]
9
+ @penalty = hash[:penalty]
10
+ @player = parse_player(hash)
11
+ end
12
+
13
+ def parse_player(hash = {})
14
+ FootballApi::Player.new(hash)
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,59 @@
1
+ module FootballApi
2
+ class Match < FootballApi::BaseRequest
3
+ include FootballApi::Requestable
4
+
5
+ api_options action: :today,
6
+ action_params: :match_params,
7
+ json_key: :matches
8
+
9
+ class << self
10
+ attr_accessor :competition_id
11
+
12
+ def all_from_competition(competition)
13
+ @competition_id = competition.is_a?(Competition) ? competition.id : competition
14
+
15
+ Array(response).map { |match| new(match) }
16
+ end
17
+
18
+ def match_params
19
+ { comp_id: self.competition_id}
20
+ end
21
+ end
22
+
23
+ attr_accessor :match_id, :static_id, :match_comp_id, :match_date,
24
+ :match_formatted_date, :match_status, :match_time,
25
+ :match_commentary_available, :match_ht_score,
26
+ :match_localteam_id, :match_localteam_name,
27
+ :match_localteam_score, :match_visitorteam_id,
28
+ :match_visitorteam_name, :match_visitorteam_score,
29
+ :match_venue_city_beta, :match_venue_id_beta,
30
+ :match_venue_beta, :match_week_beta, :match_season_beta,
31
+ :match_et_score, :match_ft_score
32
+
33
+
34
+ def initialize(hash = {})
35
+ @match_id = hash[:match_id]
36
+ @static_id = hash[:match_static_id]
37
+ @match_comp_id = hash[:match_comp_id]
38
+ @match_date = hash[:match_date]
39
+ @match_formatted_date = hash[:match_formatted_date]
40
+ @match_status = hash[:match_status]
41
+ @match_time = hash[:match_time]
42
+ @match_commentary_available = hash[:match_commentary_available]
43
+ @match_localteam_id = hash[:match_localteam_id]
44
+ @match_localteam_name = hash[:match_localteam_name]
45
+ @match_localteam_score = hash[:match_localteam_score]
46
+ @match_visitorteam_id = hash[:match_visitorteam_id]
47
+ @match_visitorteam_name = hash[:match_visitorteam_name]
48
+ @match_visitorteam_score = hash[:match_visitorteam_score]
49
+ @match_ht_score = hash[:match_ht_score]
50
+ @match_ft_score = hash[:match_ft_score]
51
+ @match_et_score = hash[:match_et_score]
52
+ @match_season_beta = hash[:match_season_beta]
53
+ @match_week_beta = hash[:match_week_beta]
54
+ @match_venue_beta = hash[:match_venue_beta]
55
+ @match_venue_id_beta = hash[:match_venue_id_beta]
56
+ @match_venue_city_beta = hash[:match_venue_city_beta]
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,27 @@
1
+ module FootballApi
2
+ class MatchBench
3
+
4
+ attr_accessor :match_id, :local_team, :visitor_team
5
+
6
+ def initialize(hash = {})
7
+ @match_id = hash[:match_id]
8
+ @local_team = Bench.new(hash, :localteam)
9
+ @visitor_team = Bench.new(hash, :visitorteam)
10
+ end
11
+ end
12
+
13
+ class Bench
14
+
15
+ attr_accessor :team, :players
16
+
17
+ def initialize(opts = {}, key)
18
+ # XXX - Use case for more than one player, might be different
19
+ # Api returns single object without number index on single occurrence.
20
+ opts = opts[key]
21
+ return unless opts.present?
22
+
23
+ @team = key
24
+ @players = Array(opts[:player]).map { |v| Player.new(v) }
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,14 @@
1
+ module FootballApi
2
+ class MatchInfo
3
+
4
+ attr_accessor :stadium_name, :attendance, :time, :referee, :id
5
+
6
+ def initialize(hash = {})
7
+ @id = hash[:id]
8
+ @stadium_name = hash[:stadium][:name] if hash[:stadium]
9
+ @attendance = hash[:attendance][:name] if hash[:attendance]
10
+ @time = hash[:time][:name] if hash[:time]
11
+ @referee = hash[:referee][:name] if hash[:referee]
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,29 @@
1
+ module FootballApi
2
+ class MatchStats
3
+ attr_accessor :id, :local_team_stats, :visitor_team_stats
4
+
5
+ def initialize(hash = {})
6
+ @id = hash[:id]
7
+ @local_team_stats = Stats.new(hash[:localteam])
8
+ @visitor_team_stats = Stats.new(hash[:visitorteam])
9
+ end
10
+ end
11
+
12
+
13
+ class Stats
14
+ attr_accessor :total_shots, :ongoal_shots, :fouls, :corners, :offsides, :possestiontime,
15
+ :yellowcards, :redcards, :saves
16
+
17
+ def initialize(hash = {})
18
+ @total_shots = hash[:shots][:total] if hash[:shots]
19
+ @ongoal_shots = hash[:shots][:ongoal] if hash[:shots]
20
+ @fouls = hash[:fouls][:total] if hash[:fouls]
21
+ @corners = hash[:corners][:total] if hash[:corners]
22
+ @offsides = hash[:offsides][:total] if hash[:offsides]
23
+ @possestiontime = hash[:possestiontime][:total] if hash[:possestiontime]
24
+ @yellowcards = hash[:yellowcards][:total] if hash[:yellowcards]
25
+ @redcards = hash[:redcards][:total] if hash[:redcards]
26
+ @saves = hash[:saves][:total] if hash[:saves]
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,27 @@
1
+ module FootballApi
2
+ class MatchSubstitutions
3
+
4
+ attr_accessor :match_id, :local_team, :visitor_team
5
+
6
+ def initialize(hash = {})
7
+ @match_id = hash[:match_id]
8
+ @local_team = subs(hash, :localteam)
9
+ @visitor_team = subs(hash, :visitorteam)
10
+ end
11
+
12
+ def subs(hash, key)
13
+ return [] unless hash[key]
14
+ Array(hash[key][:substitution]).map { |s| Substitution.new(s) }
15
+ end
16
+ end
17
+
18
+ class Substitution
19
+ def initialize(opts = {})
20
+ @off = opts[:off]
21
+ @on = opts[:on]
22
+ @minute = opts[:minute]
23
+ @on_id = opts[:on_id]
24
+ @off_id = opts[:off_id]
25
+ end
26
+ end
27
+ end