ts_json_api 0.0.1 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +57 -1
- data/lib/generators/ts_json_api/install/install_generator.rb +17 -0
- data/lib/ts_json_api/configure.rb +46 -0
- data/lib/ts_json_api/requestor/drivers.rb +23 -0
- data/lib/ts_json_api/requestor/live_feed.rb +24 -0
- data/lib/ts_json_api/requestor/logging.rb +25 -0
- data/lib/ts_json_api/requestor/points.rb +26 -0
- data/lib/ts_json_api/requestor/private_methods.rb +54 -0
- data/lib/ts_json_api/requestor/races.rb +23 -0
- data/lib/ts_json_api/requestor/schedule.rb +20 -0
- data/lib/ts_json_api/requestor/series.rb +14 -0
- data/lib/ts_json_api/requestor/tracks.rb +25 -0
- data/lib/ts_json_api/requestor/utility_methods.rb +17 -0
- data/lib/ts_json_api/requestor/weekend.rb +16 -0
- data/lib/ts_json_api/requestor.rb +30 -0
- data/lib/ts_json_api/version.rb +1 -1
- data/lib/ts_json_api.rb +30 -1
- metadata +33 -3
data/README.md
CHANGED
@@ -1,3 +1,59 @@
|
|
1
1
|
# Timing and Scoring JSON API
|
2
2
|
|
3
|
-
Use this gem to consume the T&S JSON API provided for live & summary race data.
|
3
|
+
Use this gem to consume the T&S JSON API provided for live & summary race data.
|
4
|
+
|
5
|
+
## Installation
|
6
|
+
|
7
|
+
Run the following rails generator to setup the gem
|
8
|
+
|
9
|
+
> rails g ts_json_api:install
|
10
|
+
|
11
|
+
This generator creates an initializer that you will need to configure for your access token to use the API.
|
12
|
+
|
13
|
+
## Usage
|
14
|
+
|
15
|
+
This gem exposes several methods that map directly to API calls from the T&S team.
|
16
|
+
|
17
|
+
### Syntax
|
18
|
+
|
19
|
+
You are offered two ways to initiate calls. The first is shorthand for the second.
|
20
|
+
|
21
|
+
```ruby
|
22
|
+
TsJsonApi.weekend 4080
|
23
|
+
TsJsonApi::Requestor.weekend 4080
|
24
|
+
```
|
25
|
+
|
26
|
+
### Examples
|
27
|
+
Example calls follow:
|
28
|
+
|
29
|
+
```ruby
|
30
|
+
|
31
|
+
# Drivers
|
32
|
+
TsJsonApi.get_drivers(year, series_id)
|
33
|
+
TsJsonApi.driver_summary(race_season, series_id, driver_id=nil)
|
34
|
+
|
35
|
+
# Live Feed
|
36
|
+
TsJsonApi.live_feed
|
37
|
+
TsJsonApi.live_flag
|
38
|
+
TsJsonApi.live_points
|
39
|
+
|
40
|
+
# Points
|
41
|
+
TsJsonApi.driver_points(race_season, series_id, race_id=nil)
|
42
|
+
|
43
|
+
# Races
|
44
|
+
TsJsonApi.get_race(race_id)
|
45
|
+
TsJsonApi.races_in_season(race_season, series_id, driver_id=nil)
|
46
|
+
|
47
|
+
# Schedule
|
48
|
+
TsJsonApi.schedule_for_race(race_id)
|
49
|
+
TsJsonApi.schedule_for_season(race_season, series_id)
|
50
|
+
|
51
|
+
# Series
|
52
|
+
TsJsonApi.series
|
53
|
+
|
54
|
+
# Tracks
|
55
|
+
TsJsonApi.get_track(track_id, series_id=nil)
|
56
|
+
|
57
|
+
# Weekend
|
58
|
+
TsJsonApi.weekend(race_id)
|
59
|
+
```
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module TsJsonApi
|
2
|
+
class InstallGenerator < Rails::Generators::Base
|
3
|
+
source_root File.expand_path("../templates", __FILE__)
|
4
|
+
|
5
|
+
def create_initializer
|
6
|
+
initializer "ts_json_api.rb", <<-CONFIG
|
7
|
+
TsJsonApi::Configure.setup do |config|
|
8
|
+
config.username = ""
|
9
|
+
config.password = ""
|
10
|
+
config.logging_enabled = true
|
11
|
+
config.server_url = ""
|
12
|
+
end
|
13
|
+
CONFIG
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
module TsJsonApi
|
2
|
+
class Configure
|
3
|
+
class << self
|
4
|
+
|
5
|
+
def username=(u)
|
6
|
+
@@username = u
|
7
|
+
end
|
8
|
+
|
9
|
+
def username
|
10
|
+
raise "Must provide an username" if @@username.blank?
|
11
|
+
@@username
|
12
|
+
end
|
13
|
+
|
14
|
+
def password=(p)
|
15
|
+
@@password = p
|
16
|
+
end
|
17
|
+
|
18
|
+
def password
|
19
|
+
raise "Must provide a password" if @@password.blank?
|
20
|
+
@@password
|
21
|
+
end
|
22
|
+
|
23
|
+
def server_url=(s)
|
24
|
+
@@server_url = s
|
25
|
+
end
|
26
|
+
|
27
|
+
def server_url
|
28
|
+
raise "Must provide a server URL for the API" if @@server_url.blank?
|
29
|
+
@@server_url
|
30
|
+
end
|
31
|
+
|
32
|
+
def logging_enabled=(b)
|
33
|
+
@@logging_enabled = b
|
34
|
+
end
|
35
|
+
|
36
|
+
def logging_enabled?
|
37
|
+
@@logging_enabled ||= true
|
38
|
+
end
|
39
|
+
|
40
|
+
def setup(&block)
|
41
|
+
block.call(self)
|
42
|
+
end
|
43
|
+
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module TsJsonApi
|
2
|
+
class Requestor
|
3
|
+
module Drivers
|
4
|
+
|
5
|
+
extend ActiveSupport::Concern
|
6
|
+
|
7
|
+
module ClassMethods
|
8
|
+
|
9
|
+
def get_drivers(race_season, series_id)
|
10
|
+
send_json_request_and_deliver_response "drivers_#{race_season}_series_#{series_id}", "driver?race_season=#{race_season}&series_id=#{series_id}"
|
11
|
+
end
|
12
|
+
|
13
|
+
def driver_summary(race_season, series_id, driver_id=nil)
|
14
|
+
url = "driversummary?race_season=#{race_season}&series_id=#{series_id}"
|
15
|
+
url << "&driver_id=#{driver_id}" unless driver_id.blank?
|
16
|
+
send_json_request_and_deliver_response "driver_summary_#{race_season}_#{series_id}_#{driver_id}", url
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module TsJsonApi
|
2
|
+
class Requestor
|
3
|
+
module LiveFeed
|
4
|
+
|
5
|
+
extend ActiveSupport::Concern
|
6
|
+
module ClassMethods
|
7
|
+
|
8
|
+
def live_feed
|
9
|
+
send_json_request_and_deliver_response :live_feed, "livefeed"
|
10
|
+
end
|
11
|
+
|
12
|
+
def live_flag
|
13
|
+
send_json_request_and_deliver_response :live_flag, "liveflag"
|
14
|
+
end
|
15
|
+
|
16
|
+
def live_points
|
17
|
+
send_json_request_and_deliver_response :live_points, "livepoints"
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module TsJsonApi
|
2
|
+
class Requestor
|
3
|
+
module Logging
|
4
|
+
|
5
|
+
extend ActiveSupport::Concern
|
6
|
+
|
7
|
+
module ClassMethods
|
8
|
+
|
9
|
+
def log(type, url, str)
|
10
|
+
return unless Configure.logging_enabled?
|
11
|
+
create_dir_if_not_exists
|
12
|
+
File.open("#{Rails.root}/log/ts_json_api/#{type}.log", 'w') { |f| f.write "[TIME]: #{Time.now}\n[URL]: #{url}\n\n#{str}"}
|
13
|
+
end
|
14
|
+
|
15
|
+
private
|
16
|
+
def create_dir_if_not_exists
|
17
|
+
dir = "#{Rails.root}/log/ts_json_api"
|
18
|
+
Dir.mkdir dir unless Dir.exists?(dir)
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module TsJsonApi
|
2
|
+
class Requestor
|
3
|
+
module Points
|
4
|
+
|
5
|
+
extend ActiveSupport::Concern
|
6
|
+
module ClassMethods
|
7
|
+
|
8
|
+
def driver_points(race_season, series_id, race_id=nil)
|
9
|
+
|
10
|
+
url = "driverpoints?race_season=#{race_season}&series_id=#{series_id}"
|
11
|
+
file_type = "driver_points_#{race_season}_series_#{series_id}"
|
12
|
+
|
13
|
+
unless race_id.blank?
|
14
|
+
url << "&race_id=#{race_id}"
|
15
|
+
file_type << "_race_#{race_id}"
|
16
|
+
end
|
17
|
+
|
18
|
+
send_json_request_and_deliver_response file_type, url
|
19
|
+
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
module TsJsonApi
|
2
|
+
class Requestor
|
3
|
+
module PrivateMethods
|
4
|
+
|
5
|
+
extend ActiveSupport::Concern
|
6
|
+
|
7
|
+
module ClassMethods
|
8
|
+
|
9
|
+
def send_json_request_and_deliver_response(file_type, partial_url, &block)
|
10
|
+
failure = false
|
11
|
+
reason = nil
|
12
|
+
begin
|
13
|
+
|
14
|
+
url = "#{Configure.server_url}#{partial_url}"
|
15
|
+
|
16
|
+
response = api[partial_url].get accept: :json
|
17
|
+
json = response.to_str
|
18
|
+
json.gsub!(/[^\x20-\x7e]/,'')
|
19
|
+
|
20
|
+
self.log file_type, url, json
|
21
|
+
|
22
|
+
json = JSON.parse(json)
|
23
|
+
|
24
|
+
if json.is_a?(Hash) && json.keys.include?('ResponseCode') && json['ResponseCode'].to_i != 200
|
25
|
+
failure = true
|
26
|
+
reason = "JSON feed failure with a response code: #{json['ResponseCode']}"
|
27
|
+
end
|
28
|
+
rescue RestClient::ResourceNotFound => e
|
29
|
+
failure = true
|
30
|
+
reason = "NASCAR JSON Unavailable"
|
31
|
+
rescue ActiveRecord::RecordInvalid => e
|
32
|
+
failure = true
|
33
|
+
reason = "NASCAR JSON Data prevented a database save as it did not meet validation requirements"
|
34
|
+
end
|
35
|
+
return block.call(failure, json, reason) if block_given?
|
36
|
+
json
|
37
|
+
end
|
38
|
+
|
39
|
+
def default_processor_block
|
40
|
+
@block ||= lambda do |failure, json, reason|
|
41
|
+
Rails.logger.error "block status: #{failure} -- reason: '#{reason}'"
|
42
|
+
failure ? nil : json
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def api
|
47
|
+
@@api ||= RestClient::Resource.new(Configure.server_url, user: Configure.username, password: Configure.password, timeout: 20)
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module TsJsonApi
|
2
|
+
class Requestor
|
3
|
+
module Races
|
4
|
+
|
5
|
+
extend ActiveSupport::Concern
|
6
|
+
|
7
|
+
module ClassMethods
|
8
|
+
|
9
|
+
def get_race(race_id)
|
10
|
+
send_json_request_and_deliver_response "race_info_#{race_id}", "races/#{race_id}"
|
11
|
+
end
|
12
|
+
|
13
|
+
def races_in_season(race_season, series_id, driver_id=nil)
|
14
|
+
url = "races?race_season=#{race_season}&series_id=#{series_id}"
|
15
|
+
url << "&driver_id=#{driver_id}" unless driver_id.blank?
|
16
|
+
send_json_request_and_deliver_response "races_#{race_season}_#{series_id}_#{driver_id}", url
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module TsJsonApi
|
2
|
+
class Requestor
|
3
|
+
module Schedule
|
4
|
+
|
5
|
+
extend ActiveSupport::Concern
|
6
|
+
module ClassMethods
|
7
|
+
|
8
|
+
def schedule_for_race(race_id)
|
9
|
+
send_json_request_and_deliver_response "schedule_for_race_#{race_id}", "weekendschedule/#{race_id}"
|
10
|
+
end
|
11
|
+
|
12
|
+
def schedule_for_season(race_season, series_id)
|
13
|
+
send_json_request_and_deliver_response "schedule_for_season_#{race_season}_series_#{series_id}", "weekendschedule/?race_season=#{race_season}&series_id=#{series_id}"
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module TsJsonApi
|
2
|
+
class Requestor
|
3
|
+
module Tracks
|
4
|
+
|
5
|
+
extend ActiveSupport::Concern
|
6
|
+
module ClassMethods
|
7
|
+
|
8
|
+
def get_track(track_id, series_id=nil)
|
9
|
+
|
10
|
+
if series_id.blank?
|
11
|
+
url = "track/#{track_id}"
|
12
|
+
file_type = "track_info_#{track_id}"
|
13
|
+
else
|
14
|
+
url = "track/?track_id=#{track_id}&series_id=#{series_id}"
|
15
|
+
file_type = "track_info_#{track_id}_series_#{series_id}"
|
16
|
+
end
|
17
|
+
|
18
|
+
send_json_request_and_deliver_response file_type, url
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module TsJsonApi
|
2
|
+
class Requestor
|
3
|
+
module Weekend
|
4
|
+
|
5
|
+
extend ActiveSupport::Concern
|
6
|
+
module ClassMethods
|
7
|
+
|
8
|
+
def weekend(race_id)
|
9
|
+
send_json_request_and_deliver_response "weekend_#{race_id}", "weekend/#{race_id}"
|
10
|
+
end
|
11
|
+
|
12
|
+
end
|
13
|
+
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require 'ts_json_api/requestor/private_methods'
|
2
|
+
require 'ts_json_api/requestor/drivers'
|
3
|
+
require 'ts_json_api/requestor/live_feed'
|
4
|
+
require 'ts_json_api/requestor/logging'
|
5
|
+
require 'ts_json_api/requestor/points'
|
6
|
+
require 'ts_json_api/requestor/races'
|
7
|
+
require 'ts_json_api/requestor/schedule'
|
8
|
+
require 'ts_json_api/requestor/series'
|
9
|
+
require 'ts_json_api/requestor/tracks'
|
10
|
+
require 'ts_json_api/requestor/utility_methods'
|
11
|
+
require 'ts_json_api/requestor/weekend'
|
12
|
+
|
13
|
+
module TsJsonApi
|
14
|
+
class Requestor
|
15
|
+
|
16
|
+
include PrivateMethods
|
17
|
+
include Logging
|
18
|
+
include UtilityMethods
|
19
|
+
|
20
|
+
include Drivers
|
21
|
+
include LiveFeed
|
22
|
+
include Points
|
23
|
+
include Races
|
24
|
+
include Schedule
|
25
|
+
include Series
|
26
|
+
include Tracks
|
27
|
+
include Weekend
|
28
|
+
|
29
|
+
end
|
30
|
+
end
|
data/lib/ts_json_api/version.rb
CHANGED
data/lib/ts_json_api.rb
CHANGED
@@ -1,2 +1,31 @@
|
|
1
|
+
require 'rest-client'
|
2
|
+
|
1
3
|
module TsJsonApi
|
2
|
-
|
4
|
+
|
5
|
+
autoload :Configure, 'ts_json_api/configure'
|
6
|
+
autoload :Requestor, 'ts_json_api/requestor'
|
7
|
+
|
8
|
+
# Expose all the methods of the Requestor class directly on the module itself
|
9
|
+
#
|
10
|
+
# Example call:
|
11
|
+
# TsJsonApi.weekend
|
12
|
+
# is same as
|
13
|
+
# TsJsonApi::Requestor.weekend
|
14
|
+
#
|
15
|
+
class << self
|
16
|
+
|
17
|
+
def method_missing(method, *args, &block)
|
18
|
+
if Requestor.respond_to?(method)
|
19
|
+
Requestor.send method, *args
|
20
|
+
else
|
21
|
+
super
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def respond_to?(method)
|
26
|
+
Requestor.respond_to? method
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ts_json_api
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -27,6 +27,22 @@ dependencies:
|
|
27
27
|
- - ~>
|
28
28
|
- !ruby/object:Gem::Version
|
29
29
|
version: 3.2.8
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: rest-client
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ! '>='
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '0'
|
38
|
+
type: :runtime
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '0'
|
30
46
|
- !ruby/object:Gem::Dependency
|
31
47
|
name: sqlite3
|
32
48
|
requirement: !ruby/object:Gem::Requirement
|
@@ -50,7 +66,21 @@ executables: []
|
|
50
66
|
extensions: []
|
51
67
|
extra_rdoc_files: []
|
52
68
|
files:
|
69
|
+
- lib/generators/ts_json_api/install/install_generator.rb
|
53
70
|
- lib/tasks/ts_json_api_tasks.rake
|
71
|
+
- lib/ts_json_api/configure.rb
|
72
|
+
- lib/ts_json_api/requestor/drivers.rb
|
73
|
+
- lib/ts_json_api/requestor/live_feed.rb
|
74
|
+
- lib/ts_json_api/requestor/logging.rb
|
75
|
+
- lib/ts_json_api/requestor/points.rb
|
76
|
+
- lib/ts_json_api/requestor/private_methods.rb
|
77
|
+
- lib/ts_json_api/requestor/races.rb
|
78
|
+
- lib/ts_json_api/requestor/schedule.rb
|
79
|
+
- lib/ts_json_api/requestor/series.rb
|
80
|
+
- lib/ts_json_api/requestor/tracks.rb
|
81
|
+
- lib/ts_json_api/requestor/utility_methods.rb
|
82
|
+
- lib/ts_json_api/requestor/weekend.rb
|
83
|
+
- lib/ts_json_api/requestor.rb
|
54
84
|
- lib/ts_json_api/version.rb
|
55
85
|
- lib/ts_json_api.rb
|
56
86
|
- MIT-LICENSE
|
@@ -100,7 +130,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
100
130
|
version: '0'
|
101
131
|
segments:
|
102
132
|
- 0
|
103
|
-
hash:
|
133
|
+
hash: 4083627172601262233
|
104
134
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
105
135
|
none: false
|
106
136
|
requirements:
|
@@ -109,7 +139,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
109
139
|
version: '0'
|
110
140
|
segments:
|
111
141
|
- 0
|
112
|
-
hash:
|
142
|
+
hash: 4083627172601262233
|
113
143
|
requirements: []
|
114
144
|
rubyforge_project:
|
115
145
|
rubygems_version: 1.8.24
|