worldcup-2014 0.1.0
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.
- checksums.yaml +7 -0
- data/.gitignore +22 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +28 -0
- data/Rakefile +2 -0
- data/bin/worldcup +39 -0
- data/lib/world_cup.rb +2 -0
- data/lib/world_cup/results.rb +110 -0
- data/lib/world_cup/version.rb +3 -0
- data/screenshot.png +0 -0
- data/spec/fixtures/sfg-api-20140618.json +1 -0
- data/spec/spec_helper.rb +6 -0
- data/spec/world_cup/results_spec.rb +80 -0
- data/worldcup-2014.gemspec +26 -0
- metadata +146 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: d2015c530ef79f9778a37e2dfef5e79f8338f098
|
4
|
+
data.tar.gz: 4362355f72ce7e346692c5834d0faf581b6da9ae
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: e684e668ba7ff0099a9b4e3a93860734de3ff3080ce962a04273308129b88f5d3e7351591057ae3cf059056bb4335592c0294df17019ac95a99b7d264ba817f7
|
7
|
+
data.tar.gz: e21e67c23ba7b7aa708bbccbec15748153d0c2c2df59ad4a7c0d3b831410b940f4fb758c364212f7bd007873937280e10d9c499aebb736e4a6e8a5e58eeff90a
|
data/.gitignore
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
*.gem
|
2
|
+
*.rbc
|
3
|
+
.bundle
|
4
|
+
.config
|
5
|
+
.yardoc
|
6
|
+
Gemfile.lock
|
7
|
+
InstalledFiles
|
8
|
+
_yardoc
|
9
|
+
coverage
|
10
|
+
doc/
|
11
|
+
lib/bundler/man
|
12
|
+
pkg
|
13
|
+
rdoc
|
14
|
+
spec/reports
|
15
|
+
test/tmp
|
16
|
+
test/version_tmp
|
17
|
+
tmp
|
18
|
+
*.bundle
|
19
|
+
*.so
|
20
|
+
*.o
|
21
|
+
*.a
|
22
|
+
mkmf.log
|
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2014 Henry Poydar
|
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,28 @@
|
|
1
|
+
# World Cup 2014
|
2
|
+
|
3
|
+
Provides command line access to World Cup 2014 information and results.
|
4
|
+
Uses Soccer for Good API http://worldcup.sfg.io/. Inspired by https://github.com/fatiherikli/worldcup (Python) and John Oliver. Gives you slightly more information than googling "world cup".
|
5
|
+
|
6
|
+
## Installation
|
7
|
+
|
8
|
+
$ gem install worldcup-2014
|
9
|
+
|
10
|
+
## Usage
|
11
|
+
|
12
|
+
$ worldcup [options]
|
13
|
+
-c, --today Display today's matches and current results (default)
|
14
|
+
-y, --yesterday Display yesterday's results
|
15
|
+
-t, --tomorrow Display information for tomorrow's matches
|
16
|
+
-h, --help Display this screen
|
17
|
+
|
18
|
+
## Results
|
19
|
+
|
20
|
+

|
21
|
+
|
22
|
+
## Contributing
|
23
|
+
|
24
|
+
1. Fork it ( https://github.com/hpoydar/worldcup/fork )
|
25
|
+
2. Create your feature branch with a spec (`git checkout -b my-new-feature`)
|
26
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
27
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
28
|
+
5. Create a new Pull Request
|
data/Rakefile
ADDED
data/bin/worldcup
ADDED
@@ -0,0 +1,39 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
lib = File.expand_path(File.dirname(__FILE__) + '/../lib')
|
4
|
+
$LOAD_PATH.unshift(lib) if File.directory?(lib) && !$LOAD_PATH.include?(lib)
|
5
|
+
|
6
|
+
require 'optparse'
|
7
|
+
require 'world_cup'
|
8
|
+
|
9
|
+
options = {}
|
10
|
+
OptionParser.new do |opts|
|
11
|
+
opts.banner = "Usage: worldcup [options]"
|
12
|
+
|
13
|
+
options[:day_delta] = 0
|
14
|
+
|
15
|
+
opts.on( '-c', '--today', "Display today's matches and current results (default)" ) do
|
16
|
+
options[:day_delta] = 0
|
17
|
+
end
|
18
|
+
|
19
|
+
opts.on( '-y', '--yesterday', "Display yesterday's results" ) do
|
20
|
+
options[:day_delta] = -1
|
21
|
+
end
|
22
|
+
|
23
|
+
opts.on( '-t', '--tomorrow', "Display information for tomorrow's matches" ) do
|
24
|
+
options[:day_delta] = 1
|
25
|
+
end
|
26
|
+
|
27
|
+
opts.on( '-a', '--all', "Display information for all matches" ) do
|
28
|
+
options[:day_delta] = nil
|
29
|
+
end
|
30
|
+
|
31
|
+
opts.on( '-h', '--help', 'Display this screen' ) do
|
32
|
+
puts opts
|
33
|
+
exit
|
34
|
+
end
|
35
|
+
|
36
|
+
end.parse!
|
37
|
+
|
38
|
+
world_cup_results = WorldCup::Results.new(options)
|
39
|
+
world_cup_results.render
|
data/lib/world_cup.rb
ADDED
@@ -0,0 +1,110 @@
|
|
1
|
+
require 'open-uri'
|
2
|
+
require 'json'
|
3
|
+
require 'terminal-table'
|
4
|
+
require 'colorize'
|
5
|
+
|
6
|
+
module WorldCup
|
7
|
+
|
8
|
+
class Results
|
9
|
+
|
10
|
+
SFG_ENDPOINT = 'http://worldcup.sfg.io/matches'
|
11
|
+
|
12
|
+
attr_reader :raw_response, :response, :table
|
13
|
+
|
14
|
+
def initialize(opts={})
|
15
|
+
@opts = opts
|
16
|
+
@raw_response = nil
|
17
|
+
@response = nil
|
18
|
+
@rows = nil
|
19
|
+
@table = nil
|
20
|
+
end
|
21
|
+
|
22
|
+
def render
|
23
|
+
unless retrieve
|
24
|
+
puts "Sorry, #{SFG_ENDPOINT} could not be reached. Please check your internet connection and try again."
|
25
|
+
return
|
26
|
+
end
|
27
|
+
unless convert
|
28
|
+
puts "Sorry, the response at #{SFG_ENDPOINT} could not be interpreted. Please try again."
|
29
|
+
return
|
30
|
+
end
|
31
|
+
select_matches
|
32
|
+
compose_table
|
33
|
+
puts @table
|
34
|
+
end
|
35
|
+
|
36
|
+
protected
|
37
|
+
|
38
|
+
def retrieve
|
39
|
+
@raw_response = open(SFG_ENDPOINT).read
|
40
|
+
true
|
41
|
+
rescue StandardError
|
42
|
+
false
|
43
|
+
end
|
44
|
+
|
45
|
+
def convert
|
46
|
+
@response = JSON.parse(@raw_response)
|
47
|
+
@rows = @response
|
48
|
+
true
|
49
|
+
rescue JSON::JSONError
|
50
|
+
false
|
51
|
+
end
|
52
|
+
|
53
|
+
def parse_match_status(status)
|
54
|
+
case status
|
55
|
+
when 'future'; 'Upcoming'
|
56
|
+
when 'completed'; 'Final'
|
57
|
+
when 'in progress'; 'Live'
|
58
|
+
else; status
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
def format_row(row)
|
63
|
+
case row[6].downcase
|
64
|
+
when 'live'
|
65
|
+
row.map { |rr| rr.to_s.colorize(:white).bold }
|
66
|
+
when 'final'
|
67
|
+
if row[3] > row[4]
|
68
|
+
row.map.with_index { |rr, i|
|
69
|
+
i == 2 || i == 3 ? rr.to_s.colorize(:green) : rr }
|
70
|
+
elsif row[4] > row[3]
|
71
|
+
row.map.with_index { |rr, i|
|
72
|
+
i == 4 || i == 5 ? rr.to_s.colorize(:green) : rr }
|
73
|
+
else
|
74
|
+
row
|
75
|
+
end
|
76
|
+
else
|
77
|
+
row.map { |rr| rr.to_s }
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
def select_matches
|
82
|
+
|
83
|
+
return if @opts[:day_delta].nil?
|
84
|
+
@rows.keep_if { |r| Date.parse(r['datetime']) == Date.today + @opts[:day_delta].to_i }
|
85
|
+
end
|
86
|
+
|
87
|
+
def compose_table
|
88
|
+
rows = @rows.sort_by {|r| r['datetime'].to_s }.map do |r|
|
89
|
+
[
|
90
|
+
r['match_number'],
|
91
|
+
DateTime.parse(r['datetime']).strftime('%a %b %-d %H:%M'),
|
92
|
+
(r['away_team'].is_a?(Array) ? 'TBD' : r['away_team']['country']),
|
93
|
+
(r['away_team'].is_a?(Array) ? '' : r['away_team']['goals']),
|
94
|
+
(r['home_team'].is_a?(Array) ? '' : r['home_team']['goals']),
|
95
|
+
(r['home_team'].is_a?(Array) ? 'TBD' : r['home_team']['country']),
|
96
|
+
parse_match_status(r['status']),
|
97
|
+
r['location']
|
98
|
+
]
|
99
|
+
end
|
100
|
+
rows = rows.map { |r| format_row(r) }
|
101
|
+
@table = Terminal::Table.new(
|
102
|
+
headings: ['Match', 'Date', 'Away', '', '', 'Home', 'Status', 'Location'],
|
103
|
+
rows: rows)
|
104
|
+
@table.align_column(2, :right)
|
105
|
+
end
|
106
|
+
|
107
|
+
end
|
108
|
+
|
109
|
+
|
110
|
+
end
|
data/screenshot.png
ADDED
Binary file
|
@@ -0,0 +1 @@
|
|
1
|
+
[{"match_number":1,"location":"Arena Corinthians","datetime":"2014-06-12T16:00:00.000-05:00","status":"completed","home_team":{"country":"Brazil","code":"BRA","goals":3},"away_team":{"country":"Croatia","code":"CRO","goals":1},"winner":"Brazil"},{"match_number":2,"location":"Estadio das Dunas","datetime":"2014-06-13T12:00:00.000-05:00","status":"completed","home_team":{"country":"Mexico","code":"MEX","goals":1},"away_team":{"country":"Cameroon","code":"CMR","goals":0},"winner":"Mexico"},{"match_number":3,"location":"Arena Fonte Nova","datetime":"2014-06-13T15:00:00.000-05:00","status":"completed","home_team":{"country":"Spain","code":"ESP","goals":1},"away_team":{"country":"Netherlands","code":"NED","goals":5},"winner":"Netherlands"},{"match_number":4,"location":"Arena Pantanal","datetime":"2014-06-13T17:00:00.000-05:00","status":"completed","home_team":{"country":"Chile","code":"CHI","goals":3},"away_team":{"country":"Australia","code":"AUS","goals":1},"winner":"Chile"},{"match_number":5,"location":"Estadio Mineirao","datetime":"2014-06-14T12:00:00.000-05:00","status":"completed","home_team":{"country":"Colombia","code":"COL","goals":3},"away_team":{"country":"Greece","code":"GRE","goals":0},"winner":"Colombia"},{"match_number":6,"location":"Arena Pernambuco","datetime":"2014-06-14T21:00:00.000-05:00","status":"completed","home_team":{"country":"Ivory Coast","code":"CIV","goals":2},"away_team":{"country":"Japan","code":"JPN","goals":1},"winner":"Ivory Coast"},{"match_number":7,"location":"Estadio Castelao","datetime":"2014-06-14T15:00:00.000-05:00","status":"completed","home_team":{"country":"Uruguay","code":"URU","goals":1},"away_team":{"country":"Costa Rica","code":"CRC","goals":3},"winner":"Costa Rica"},{"match_number":8,"location":"Arena Amazonia","datetime":"2014-06-14T17:00:00.000-05:00","status":"completed","home_team":{"country":"England","code":"ENG","goals":1},"away_team":{"country":"Italy","code":"ITA","goals":2},"winner":"Italy"},{"match_number":9,"location":"Estadio Nacional","datetime":"2014-06-15T12:00:00.000-05:00","status":"completed","home_team":{"country":"Switzerland","code":"SUI","goals":2},"away_team":{"country":"Ecuador","code":"ECU","goals":1},"winner":"Switzerland"},{"match_number":10,"location":"Estadio Beira-Rio","datetime":"2014-06-15T15:00:00.000-05:00","status":"completed","home_team":{"country":"France","code":"FRA","goals":3},"away_team":{"country":"Honduras","code":"HON","goals":0},"winner":"France"},{"match_number":11,"location":"Maracanã - Estádio Jornalista Mário Filho","datetime":"2014-06-15T18:00:00.000-05:00","status":"completed","home_team":{"country":"Argentina","code":"ARG","goals":2},"away_team":{"country":"Bosnia and Herzegovina","code":"BIH","goals":1},"winner":"Argentina"},{"match_number":12,"location":"Arena da Baixada","datetime":"2014-06-16T15:00:00.000-05:00","status":"completed","home_team":{"country":"Iran","code":"IRN","goals":0},"away_team":{"country":"Nigeria","code":"NGA","goals":0},"winner":"Draw"},{"match_number":13,"location":"Arena Fonte Nova","datetime":"2014-06-16T12:00:00.000-05:00","status":"completed","home_team":{"country":"Germany","code":"GER","goals":4},"away_team":{"country":"Portugal","code":"POR","goals":0},"winner":"Germany"},{"match_number":14,"location":"Estadio das Dunas","datetime":"2014-06-16T18:00:00.000-05:00","status":"completed","home_team":{"country":"Ghana","code":"GHA","goals":1},"away_team":{"country":"USA","code":"USA","goals":2},"winner":"USA"},{"match_number":15,"location":"Estadio Mineirao","datetime":"2014-06-17T12:00:00.000-05:00","status":"completed","home_team":{"country":"Belgium","code":"BEL","goals":2},"away_team":{"country":"Algeria","code":"ALG","goals":1},"winner":"Belgium"},{"match_number":16,"location":"Arena Pantanal","datetime":"2014-06-17T17:00:00.000-05:00","status":"completed","home_team":{"country":"Russia","code":"RUS","goals":1},"away_team":{"country":"Korea Republic","code":"KOR","goals":1},"winner":"Draw"},{"match_number":17,"location":"Estadio Castelao","datetime":"2014-06-17T15:00:00.000-05:00","status":"completed","home_team":{"country":"Brazil","code":"BRA","goals":0},"away_team":{"country":"Mexico","code":"MEX","goals":0},"winner":"Draw"},{"match_number":18,"location":"Arena Amazonia","datetime":"2014-06-18T17:00:00.000-05:00","status":"future","home_team":{"country":"Cameroon","code":"CMR","goals":0},"away_team":{"country":"Croatia","code":"CRO","goals":0},"winner":null},{"match_number":19,"location":"Maracanã - Estádio Jornalista Mário Filho","datetime":"2014-06-18T15:00:00.000-05:00","status":"future","home_team":{"country":"Spain","code":"ESP","goals":0},"away_team":{"country":"Chile","code":"CHI","goals":0},"winner":null},{"match_number":20,"location":"Estadio Beira-Rio","datetime":"2014-06-18T12:00:00.000-05:00","status":"in progress","home_team":{"country":"Australia","code":"AUS","goals":1},"away_team":{"country":"Netherlands","code":"NED","goals":1},"winner":null},{"match_number":21,"location":"Estadio Nacional","datetime":"2014-06-19T12:00:00.000-05:00","status":"future","home_team":{"country":"Colombia","code":"COL","goals":0},"away_team":{"country":"Ivory Coast","code":"CIV","goals":0},"winner":null},{"match_number":22,"location":"Estadio das Dunas","datetime":"2014-06-19T18:00:00.000-05:00","status":"future","home_team":{"country":"Japan","code":"JPN","goals":0},"away_team":{"country":"Greece","code":"GRE","goals":0},"winner":null},{"match_number":23,"location":"Arena Corinthians","datetime":"2014-06-19T15:00:00.000-05:00","status":"future","home_team":{"country":"Uruguay","code":"URU","goals":0},"away_team":{"country":"England","code":"ENG","goals":0},"winner":null},{"match_number":24,"location":"Arena Pernambuco","datetime":"2014-06-20T12:00:00.000-05:00","status":"future","home_team":{"country":"Italy","code":"ITA","goals":0},"away_team":{"country":"Costa Rica","code":"CRC","goals":0},"winner":null},{"match_number":25,"location":"Arena Fonte Nova","datetime":"2014-06-20T15:00:00.000-05:00","status":"future","home_team":{"country":"Switzerland","code":"SUI","goals":0},"away_team":{"country":"France","code":"FRA","goals":0},"winner":null},{"match_number":26,"location":"Arena da Baixada","datetime":"2014-06-20T18:00:00.000-05:00","status":"future","home_team":{"country":"Honduras","code":"HON","goals":0},"away_team":{"country":"Ecuador","code":"ECU","goals":0},"winner":null},{"match_number":27,"location":"Estadio Mineirao","datetime":"2014-06-21T12:00:00.000-05:00","status":"future","home_team":{"country":"Argentina","code":"ARG","goals":0},"away_team":{"country":"Iran","code":"IRN","goals":0},"winner":null},{"match_number":28,"location":"Arena Pantanal","datetime":"2014-06-21T17:00:00.000-05:00","status":"future","home_team":{"country":"Nigeria","code":"NGA","goals":0},"away_team":{"country":"Bosnia and Herzegovina","code":"BIH","goals":0},"winner":null},{"match_number":29,"location":"Estadio Castelao","datetime":"2014-06-21T15:00:00.000-05:00","status":"future","home_team":{"country":"Germany","code":"GER","goals":0},"away_team":{"country":"Ghana","code":"GHA","goals":0},"winner":null},{"match_number":30,"location":"Arena Amazonia","datetime":"2014-06-22T17:00:00.000-05:00","status":"future","home_team":{"country":"USA","code":"USA","goals":0},"away_team":{"country":"Portugal","code":"POR","goals":0},"winner":null},{"match_number":31,"location":"Maracanã - Estádio Jornalista Mário Filho","datetime":"2014-06-22T12:00:00.000-05:00","status":"future","home_team":{"country":"Belgium","code":"BEL","goals":0},"away_team":{"country":"Russia","code":"RUS","goals":0},"winner":null},{"match_number":32,"location":"Estadio Beira-Rio","datetime":"2014-06-22T15:00:00.000-05:00","status":"future","home_team":{"country":"Korea Republic","code":"KOR","goals":0},"away_team":{"country":"Algeria","code":"ALG","goals":0},"winner":null},{"match_number":33,"location":"Estadio Nacional","datetime":"2014-06-23T16:00:00.000-05:00","status":"future","home_team":{"country":"Cameroon","code":"CMR","goals":0},"away_team":{"country":"Brazil","code":"BRA","goals":0},"winner":null},{"match_number":34,"location":"Arena Pernambuco","datetime":"2014-06-23T16:00:00.000-05:00","status":"future","home_team":{"country":"Croatia","code":"CRO","goals":0},"away_team":{"country":"Mexico","code":"MEX","goals":0},"winner":null},{"match_number":35,"location":"Arena da Baixada","datetime":"2014-06-23T12:00:00.000-05:00","status":"future","home_team":{"country":"Australia","code":"AUS","goals":0},"away_team":{"country":"Spain","code":"ESP","goals":0},"winner":null},{"match_number":36,"location":"Arena Corinthians","datetime":"2014-06-23T12:00:00.000-05:00","status":"future","home_team":{"country":"Netherlands","code":"NED","goals":0},"away_team":{"country":"Chile","code":"CHI","goals":0},"winner":null},{"match_number":37,"location":"Arena Pantanal","datetime":"2014-06-24T15:00:00.000-05:00","status":"future","home_team":{"country":"Japan","code":"JPN","goals":0},"away_team":{"country":"Colombia","code":"COL","goals":0},"winner":null},{"match_number":38,"location":"Estadio Castelao","datetime":"2014-06-24T16:00:00.000-05:00","status":"future","home_team":{"country":"Greece","code":"GRE","goals":0},"away_team":{"country":"Ivory Coast","code":"CIV","goals":0},"winner":null},{"match_number":39,"location":"Estadio das Dunas","datetime":"2014-06-24T12:00:00.000-05:00","status":"future","home_team":{"country":"Italy","code":"ITA","goals":0},"away_team":{"country":"Uruguay","code":"URU","goals":0},"winner":null},{"match_number":40,"location":"Estadio Mineirao","datetime":"2014-06-24T12:00:00.000-05:00","status":"future","home_team":{"country":"Costa Rica","code":"CRC","goals":0},"away_team":{"country":"England","code":"ENG","goals":0},"winner":null},{"match_number":41,"location":"Arena Amazonia","datetime":"2014-06-25T15:00:00.000-05:00","status":"future","home_team":{"country":"Honduras","code":"HON","goals":0},"away_team":{"country":"Switzerland","code":"SUI","goals":0},"winner":null},{"match_number":42,"location":"Maracanã - Estádio Jornalista Mário Filho","datetime":"2014-06-25T16:00:00.000-05:00","status":"future","home_team":{"country":"Ecuador","code":"ECU","goals":0},"away_team":{"country":"France","code":"FRA","goals":0},"winner":null},{"match_number":43,"location":"Estadio Beira-Rio","datetime":"2014-06-25T12:00:00.000-05:00","status":"future","home_team":{"country":"Nigeria","code":"NGA","goals":0},"away_team":{"country":"Argentina","code":"ARG","goals":0},"winner":null},{"match_number":44,"location":"Arena Fonte Nova","datetime":"2014-06-25T12:00:00.000-05:00","status":"future","home_team":{"country":"Bosnia and Herzegovina","code":"BIH","goals":0},"away_team":{"country":"Iran","code":"IRN","goals":0},"winner":null},{"match_number":45,"location":"Arena Pernambuco","datetime":"2014-06-26T12:00:00.000-05:00","status":"future","home_team":{"country":"USA","code":"USA","goals":0},"away_team":{"country":"Germany","code":"GER","goals":0},"winner":null},{"match_number":46,"location":"Estadio Nacional","datetime":"2014-06-26T12:00:00.000-05:00","status":"future","home_team":{"country":"Portugal","code":"POR","goals":0},"away_team":{"country":"Ghana","code":"GHA","goals":0},"winner":null},{"match_number":47,"location":"Arena Corinthians","datetime":"2014-06-26T16:00:00.000-05:00","status":"future","home_team":{"country":"Korea Republic","code":"KOR","goals":0},"away_team":{"country":"Belgium","code":"BEL","goals":0},"winner":null},{"match_number":48,"location":"Arena da Baixada","datetime":"2014-06-26T16:00:00.000-05:00","status":"future","home_team":{"country":"Algeria","code":"ALG","goals":0},"away_team":{"country":"Russia","code":"RUS","goals":0},"winner":null},{"match_number":49,"location":"Estadio Mineirao","datetime":"2014-06-28T12:00:00.000-05:00","status":"future","home_team":["home_team_tbd"],"away_team":["away_team_tbd"],"winner":null},{"match_number":50,"location":"Maracanã - Estádio Jornalista Mário Filho","datetime":"2014-06-28T16:00:00.000-05:00","status":"future","home_team_tbd":"[1C]","away_team_tbd":"[2D]","home_team":["home_team_tbd"],"away_team":["away_team_tbd"],"winner":null},{"match_number":51,"location":"Estadio Castelao","datetime":"2014-06-29T12:00:00.000-05:00","status":"future","home_team_tbd":"[1B]","away_team_tbd":"[2A]","home_team":["home_team_tbd"],"away_team":["away_team_tbd"],"winner":null},{"match_number":52,"location":"Arena Pernambuco","datetime":"2014-06-29T16:00:00.000-05:00","status":"future","home_team_tbd":"[1D]","away_team_tbd":"[2C]","home_team":["home_team_tbd"],"away_team":["away_team_tbd"],"winner":null},{"match_number":53,"location":"Estadio Nacional","datetime":"2014-06-30T12:00:00.000-05:00","status":"future","home_team_tbd":"[1E]","away_team_tbd":"[2F]","home_team":["home_team_tbd"],"away_team":["away_team_tbd"],"winner":null},{"match_number":54,"location":"Estadio Beira-Rio","datetime":"2014-06-30T16:00:00.000-05:00","status":"future","home_team_tbd":"[1G]","away_team_tbd":"[2H]","home_team":["home_team_tbd"],"away_team":["away_team_tbd"],"winner":null},{"match_number":55,"location":"Arena Corinthians","datetime":"2014-07-01T12:00:00.000-05:00","status":"future","home_team_tbd":"[1F]","away_team_tbd":"[2E]","home_team":["home_team_tbd"],"away_team":["away_team_tbd"],"winner":null},{"match_number":56,"location":"Arena Fonte Nova","datetime":"2014-07-01T16:00:00.000-05:00","status":"future","home_team_tbd":"[1H]","away_team_tbd":"[2G]","home_team":["home_team_tbd"],"away_team":["away_team_tbd"],"winner":null},{"match_number":57,"location":"Estadio Castelao","datetime":"2014-07-04T16:00:00.000-05:00","status":"future","home_team_tbd":"[W49]","away_team_tbd":"[W50]","home_team":["home_team_tbd"],"away_team":["away_team_tbd"],"winner":null},{"match_number":58,"location":"Maracanã - Estádio Jornalista Mário Filho","datetime":"2014-07-04T12:00:00.000-05:00","status":"future","home_team_tbd":"[W53]","away_team_tbd":"[W54]","home_team":["home_team_tbd"],"away_team":["away_team_tbd"],"winner":null},{"match_number":59,"location":"Arena Fonte Nova","datetime":"2014-07-05T16:00:00.000-05:00","status":"future","home_team_tbd":"[W51]","away_team_tbd":"[W52]","home_team":["home_team_tbd"],"away_team":["away_team_tbd"],"winner":null},{"match_number":60,"location":"Estadio Nacional","datetime":"2014-07-05T12:00:00.000-05:00","status":"future","home_team_tbd":"[W55]","away_team_tbd":"[W56]","home_team":["home_team_tbd"],"away_team":["away_team_tbd"],"winner":null},{"match_number":61,"location":"Estadio Mineirao","datetime":"2014-07-08T16:00:00.000-05:00","status":"future","home_team_tbd":"[W57]","away_team_tbd":"[W58]","home_team":["home_team_tbd"],"away_team":["away_team_tbd"],"winner":null},{"match_number":62,"location":"Arena Corinthians","datetime":"2014-07-09T16:00:00.000-05:00","status":"future","home_team_tbd":"[W59]","away_team_tbd":"[W60]","home_team":["home_team_tbd"],"away_team":["away_team_tbd"],"winner":null},{"match_number":63,"location":"Estadio Nacional","datetime":"2014-07-12T16:00:00.000-05:00","status":"future","home_team_tbd":"[L61]","away_team_tbd":"[L62]","home_team":["home_team_tbd"],"away_team":["away_team_tbd"],"winner":null},{"match_number":64,"location":"Maracanã - Estádio Jornalista Mário Filho","datetime":"2014-07-13T15:00:00.000-05:00","status":"future","home_team_tbd":"[W61]","away_team_tbd":"[W62]","home_team":["home_team_tbd"],"away_team":["away_team_tbd"],"winner":null}]
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,80 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe WorldCup::Results do
|
4
|
+
|
5
|
+
let(:wcr) { WorldCup::Results.new({}) }
|
6
|
+
let(:api_response) {
|
7
|
+
File.open(File.expand_path(File.dirname(__FILE__)) + '/../fixtures/sfg-api-20140618.json', "rb").read }
|
8
|
+
|
9
|
+
describe "#render" do
|
10
|
+
|
11
|
+
context "today's matches in progress (default)" do
|
12
|
+
it "shows only today's matches"
|
13
|
+
end
|
14
|
+
|
15
|
+
context "yesterday's results selected" do
|
16
|
+
it "shows only yesterday's results"
|
17
|
+
end
|
18
|
+
|
19
|
+
context "tomorrow's matches selected" do
|
20
|
+
it "shows only tomorrow's results"
|
21
|
+
end
|
22
|
+
|
23
|
+
context "all matches selected" do
|
24
|
+
it "shows all matches with results for the ones played"
|
25
|
+
end
|
26
|
+
|
27
|
+
context "problems" do
|
28
|
+
|
29
|
+
it "displays an error message if the API can't be reached" do
|
30
|
+
wcr.should_receive(:puts).with(/^Sorry/)
|
31
|
+
wcr.should_receive(:open).and_raise(StandardError)
|
32
|
+
wcr.render
|
33
|
+
end
|
34
|
+
|
35
|
+
it "displays an error message if the API can't be reached" do
|
36
|
+
wcr.should_receive(:puts).with(/^Sorry/)
|
37
|
+
JSON.should_receive(:parse).and_raise(JSON::JSONError)
|
38
|
+
wcr.stub_chain(:open, :read) { api_response }
|
39
|
+
wcr.render
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
43
|
+
|
44
|
+
end
|
45
|
+
|
46
|
+
describe "#convert" do
|
47
|
+
|
48
|
+
it "converts the raw JSON response to an array of hashes" do
|
49
|
+
wcr.stub_chain(:open, :read) { api_response }
|
50
|
+
wcr.send(:retrieve)
|
51
|
+
wcr.send(:convert)
|
52
|
+
wcr.response.is_a?(Array).should eq true
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
describe "#retrieve" do
|
57
|
+
|
58
|
+
it "retrieves a JSON response from the SFG API" do
|
59
|
+
wcr.stub_chain(:open, :read) { api_response }
|
60
|
+
wcr.send(:retrieve)
|
61
|
+
wcr.raw_response.should =~ /^\[\{\"match_number\":1,\"location\":\"Arena Corinthians\"/
|
62
|
+
end
|
63
|
+
|
64
|
+
it "returns true" do
|
65
|
+
wcr.stub_chain(:open, :read) { api_response }
|
66
|
+
wcr.send(:retrieve).should eq true
|
67
|
+
end
|
68
|
+
|
69
|
+
context "with connectivity problems" do
|
70
|
+
|
71
|
+
it "returns false" do
|
72
|
+
wcr.should_receive(:open).and_raise(StandardError)
|
73
|
+
wcr.stub(:puts)
|
74
|
+
wcr.send(:retrieve).should eq false
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
end
|
79
|
+
|
80
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'world_cup/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "worldcup-2014"
|
8
|
+
spec.version = WorldCup::VERSION
|
9
|
+
spec.authors = ["Henry Poydar"]
|
10
|
+
spec.email = ["hpoydar@gmail.com"]
|
11
|
+
spec.summary = %q{Provides command line access to World Cup 2014 information and results.}
|
12
|
+
spec.homepage = "https://github.com/hpoydar/worldcup-2014"
|
13
|
+
spec.license = "MIT"
|
14
|
+
|
15
|
+
spec.files = `git ls-files -z`.split("\x0")
|
16
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
17
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
18
|
+
spec.require_paths = ["lib"]
|
19
|
+
|
20
|
+
spec.add_runtime_dependency "terminal-table", "~> 1.4.5"
|
21
|
+
spec.add_runtime_dependency 'colorize', '~> 0.7.3'
|
22
|
+
spec.add_development_dependency "rspec", "~> 2.14.1"
|
23
|
+
spec.add_development_dependency 'timecop', '~> 0.7.1'
|
24
|
+
spec.add_development_dependency "bundler", "~> 1.6"
|
25
|
+
spec.add_development_dependency "rake"
|
26
|
+
end
|
metadata
ADDED
@@ -0,0 +1,146 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: worldcup-2014
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Henry Poydar
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2014-06-18 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: terminal-table
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 1.4.5
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 1.4.5
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: colorize
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 0.7.3
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: 0.7.3
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rspec
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: 2.14.1
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 2.14.1
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: timecop
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 0.7.1
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: 0.7.1
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: bundler
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '1.6'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '1.6'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: rake
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ">="
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
97
|
+
description:
|
98
|
+
email:
|
99
|
+
- hpoydar@gmail.com
|
100
|
+
executables:
|
101
|
+
- worldcup
|
102
|
+
extensions: []
|
103
|
+
extra_rdoc_files: []
|
104
|
+
files:
|
105
|
+
- ".gitignore"
|
106
|
+
- Gemfile
|
107
|
+
- LICENSE.txt
|
108
|
+
- README.md
|
109
|
+
- Rakefile
|
110
|
+
- bin/worldcup
|
111
|
+
- lib/world_cup.rb
|
112
|
+
- lib/world_cup/results.rb
|
113
|
+
- lib/world_cup/version.rb
|
114
|
+
- screenshot.png
|
115
|
+
- spec/fixtures/sfg-api-20140618.json
|
116
|
+
- spec/spec_helper.rb
|
117
|
+
- spec/world_cup/results_spec.rb
|
118
|
+
- worldcup-2014.gemspec
|
119
|
+
homepage: https://github.com/hpoydar/worldcup-2014
|
120
|
+
licenses:
|
121
|
+
- MIT
|
122
|
+
metadata: {}
|
123
|
+
post_install_message:
|
124
|
+
rdoc_options: []
|
125
|
+
require_paths:
|
126
|
+
- lib
|
127
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - ">="
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: '0'
|
132
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
133
|
+
requirements:
|
134
|
+
- - ">="
|
135
|
+
- !ruby/object:Gem::Version
|
136
|
+
version: '0'
|
137
|
+
requirements: []
|
138
|
+
rubyforge_project:
|
139
|
+
rubygems_version: 2.2.0
|
140
|
+
signing_key:
|
141
|
+
specification_version: 4
|
142
|
+
summary: Provides command line access to World Cup 2014 information and results.
|
143
|
+
test_files:
|
144
|
+
- spec/fixtures/sfg-api-20140618.json
|
145
|
+
- spec/spec_helper.rb
|
146
|
+
- spec/world_cup/results_spec.rb
|