Initial commit
This commit is contained in:
24
.gitignore
vendored
Normal file
24
.gitignore
vendored
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
*.gem
|
||||||
|
*.rbc
|
||||||
|
*.sassc
|
||||||
|
.bundle
|
||||||
|
.config
|
||||||
|
.yardoc
|
||||||
|
.rvmrc
|
||||||
|
.rspec
|
||||||
|
.sass-cache
|
||||||
|
.DS_Store
|
||||||
|
Gemfile.lock
|
||||||
|
InstalledFiles
|
||||||
|
_yardoc
|
||||||
|
doc/
|
||||||
|
coverage
|
||||||
|
lib/bundler/man
|
||||||
|
capybara-*.html
|
||||||
|
pkg
|
||||||
|
rdoc
|
||||||
|
spec/reports
|
||||||
|
spec/tmp
|
||||||
|
test/tmp
|
||||||
|
test/version_tmp
|
||||||
|
tmp
|
21
LICENSE
Normal file
21
LICENSE
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
MIT License
|
||||||
|
|
||||||
|
Copyright (c) 2018
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
45
README.md
Normal file
45
README.md
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
# ShiftStats gem
|
||||||
|
This gem pulls data from Digital Shift sites such as HockeyShift, SoccerShift, LacrosseShift, FootballShift, BasketballShift, and BaseballShift.
|
||||||
|
[](http://badge.fury.io/rb/shift_stats)
|
||||||
|
|
||||||
|
## Features
|
||||||
|
* Get details about any team for any sport
|
||||||
|
* Get a specific team's game schedule
|
||||||
|
* Retrieve the list of players on a specific team
|
||||||
|
* Find all games for a specific division
|
||||||
|
* Find all divisions in a specific season
|
||||||
|
|
||||||
|
## Install
|
||||||
|
You can install shift_stats via rubygems: `gem install shift_stats`
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
```ruby
|
||||||
|
require 'shift_stats'
|
||||||
|
```
|
||||||
|
|
||||||
|
Optionally configure your API key (note: by default uses the same API key as the Android HockeyShift app)
|
||||||
|
|
||||||
|
```ruby
|
||||||
|
ShiftStats.configure do |config|
|
||||||
|
config.api_key 'my_api_key'
|
||||||
|
end
|
||||||
|
```
|
||||||
|
|
||||||
|
Create a new instance of ShiftSats with `s = new ShiftStats`. This connects to the ShiftStats server, logs in, and stores the ticket hash. This ticket is only valid for a limited amount of time.
|
||||||
|
|
||||||
|
Creating an instance of the class can raise an error if there are network issues or the API key is invalid.
|
||||||
|
|
||||||
|
### Available methods
|
||||||
|
|
||||||
|
* `team_search(sport_name, team_name)` - Search for the given team in the given sport for all active seasons.
|
||||||
|
* `team_schedule(team_id)` - Retrieve the game schedule for the supplied team.
|
||||||
|
* `team_players_list(team_id)` - Get the list of players on a specific team.
|
||||||
|
* `division_games_list(division_id)` - Returns all games for a specified division.
|
||||||
|
* `season_divisions_list(season_id)` - Lists all divisions for the specified season.
|
||||||
|
|
||||||
|
## Bug reports, feature requests, contributions
|
||||||
|
|
||||||
|
Please create an issue or pull request on github. Assistance is most welcome.
|
||||||
|
|
||||||
|
There are many more endpoints available on Shift sites, but none are documented. Running a mobile app inside an emulator and watching wireshark, fiddler, etc. is how the current endpoints were discovered.
|
5
Rakefile
Normal file
5
Rakefile
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
require 'rspec/core/rake_task'
|
||||||
|
|
||||||
|
RSpec::Core::RakeTask.new(:spec)
|
||||||
|
|
||||||
|
task default: :spec
|
87
lib/shift_stats.rb
Normal file
87
lib/shift_stats.rb
Normal file
@ -0,0 +1,87 @@
|
|||||||
|
require 'httpclient'
|
||||||
|
require 'json'
|
||||||
|
require 'shift_stats/configuration'
|
||||||
|
|
||||||
|
class ShiftStats
|
||||||
|
class << self
|
||||||
|
attr_accessor :configuration
|
||||||
|
end
|
||||||
|
|
||||||
|
def self.configuration
|
||||||
|
@configuration ||= Configuration.new
|
||||||
|
end
|
||||||
|
|
||||||
|
def self.reset
|
||||||
|
@configuration = Configuration.new
|
||||||
|
end
|
||||||
|
|
||||||
|
def self.configure
|
||||||
|
yield(configuration)
|
||||||
|
end
|
||||||
|
|
||||||
|
def initialize
|
||||||
|
@url_base = 'http://api.shiftstats.com/'
|
||||||
|
@ticket_hash = nil
|
||||||
|
|
||||||
|
@client = HTTPClient.new
|
||||||
|
@client.transparent_gzip_decompression = true
|
||||||
|
|
||||||
|
response = @client.get(url('login'), query: login_query, header: basic_headers)
|
||||||
|
response_json = JSON.parse(response.body) if response
|
||||||
|
if response_json && response_json['ticket'] && response_json['ticket']['hash']
|
||||||
|
@ticket_hash = response_json['ticket']['hash']
|
||||||
|
else
|
||||||
|
if response && response.body
|
||||||
|
raise response.body
|
||||||
|
else
|
||||||
|
raise "Unknown error. Make sure you have an internet connection and your API key is correct."
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def team_search(sport, name)
|
||||||
|
JSON.parse(@client.get(url('teams'), query: {name: name, not_ended: true, sport: sport.downcase}, header: headers).body)
|
||||||
|
end
|
||||||
|
|
||||||
|
def team_schedule(team_id)
|
||||||
|
JSON.parse(@client.get(url("team/#{team_id}/games"), query: {future: true, today: true, past: true}, header: headers).body)
|
||||||
|
end
|
||||||
|
|
||||||
|
def team_players_list(team_id)
|
||||||
|
JSON.parse(@client.get(url("team/#{team_id}/players"), query: {status: 'active'}, header: headers).body)
|
||||||
|
end
|
||||||
|
|
||||||
|
def division_games_list(division_id)
|
||||||
|
JSON.parse(@client.get(url("division/#{division_id}/games"), header: headers).body)
|
||||||
|
end
|
||||||
|
|
||||||
|
def season_divisions_list(season_id)
|
||||||
|
JSON.parse(@client.get(url("season/#{season_id}/divisions"), header: headers).body)
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
def url(sub)
|
||||||
|
return "#{@url_base}#{sub}"
|
||||||
|
end
|
||||||
|
|
||||||
|
def login_query
|
||||||
|
{key: self.class.configuration.api_key}
|
||||||
|
end
|
||||||
|
|
||||||
|
def basic_headers
|
||||||
|
{
|
||||||
|
'Accept' => 'application/json',
|
||||||
|
'Content-Type' => 'application/json',
|
||||||
|
'X-Requested-With' => 'com.digitalshift.hockeyshift',
|
||||||
|
'Accept-Language' => 'en-US',
|
||||||
|
'Accept-Encoding' => 'gzip,deflate',
|
||||||
|
'Connection' => 'keep-alive',
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
def headers
|
||||||
|
basic_headers.merge({
|
||||||
|
'Authorization' => "StatsAuth ticket=\"#{@ticket_hash}\""
|
||||||
|
})
|
||||||
|
end
|
||||||
|
end
|
9
lib/shift_stats/configuration.rb
Normal file
9
lib/shift_stats/configuration.rb
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
class ShiftStats
|
||||||
|
class Configuration
|
||||||
|
attr_accessor :api_key
|
||||||
|
|
||||||
|
def initialize
|
||||||
|
@api_key = 'YXBpLnNoaWZ0c3RhdHMuY29tLDE5YjhhZGIwNDVjZjAxMzJhM2E5N2VmZDQ1YTRj'
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
15
shift_stats.gemspec
Normal file
15
shift_stats.gemspec
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
Gem::Specification.new do |s|
|
||||||
|
s.name = 'shift_stats'
|
||||||
|
s.version = '0.0.1'
|
||||||
|
s.date = '2018-04-05'
|
||||||
|
s.summary = 'Shift stats API'
|
||||||
|
s.description = 'Interfaces with Digital Shift APIs (HockeyShift, BasketballShift, etc.)'
|
||||||
|
s.authors = ['Chris Pickett']
|
||||||
|
s.email = 'chris@parnic.com'
|
||||||
|
s.files = ['lib/shift_stats.rb', 'lib/shift_stats/configuration.rb']
|
||||||
|
s.homepage = 'https://github.com/parnic/shift_stats'
|
||||||
|
s.license = 'MIT'
|
||||||
|
s.add_runtime_dependency 'httpclient', '~> 2'
|
||||||
|
s.add_development_dependency 'rake', '~> 0'
|
||||||
|
s.add_development_dependency 'rspec', '~> 0'
|
||||||
|
end
|
62
spec/shift_stats_spec.rb
Normal file
62
spec/shift_stats_spec.rb
Normal file
@ -0,0 +1,62 @@
|
|||||||
|
require 'spec_helper'
|
||||||
|
|
||||||
|
describe ShiftStats do
|
||||||
|
describe 'bad api key' do
|
||||||
|
it 'throws an error' do
|
||||||
|
ShiftStats.configure {|config| config.api_key = 'a'}
|
||||||
|
expect {ShiftStats.new}.to raise_error RuntimeError
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe 'with valid api key' do
|
||||||
|
s = ShiftStats.new
|
||||||
|
team_search = s.team_search('hockey', 'bears')
|
||||||
|
|
||||||
|
context 'team_search' do
|
||||||
|
it 'returns something' do
|
||||||
|
expect(team_search).to be_truthy
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'returns some teams' do
|
||||||
|
expect(team_search).to include 'teams'
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'finds the right team' do
|
||||||
|
bears = team_search['teams'].select{|team| team['id'] == 18827}.first
|
||||||
|
expect(bears).to be_truthy
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'team_schedule' do
|
||||||
|
team_schedule = s.team_schedule(18827)
|
||||||
|
|
||||||
|
it 'returns something' do
|
||||||
|
expect(team_schedule).to be_truthy
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'team_players_list' do
|
||||||
|
team_players = s.team_players_list(18827)
|
||||||
|
|
||||||
|
it 'returns something' do
|
||||||
|
expect(team_players).to be_truthy
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'division_games_list' do
|
||||||
|
division_games = s.division_games_list(3057)
|
||||||
|
|
||||||
|
it 'returns something' do
|
||||||
|
expect(division_games).to be_truthy
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'season_divisions_list' do
|
||||||
|
season_divisions = s.season_divisions_list(741)
|
||||||
|
|
||||||
|
it 'returns something' do
|
||||||
|
expect(season_divisions).to be_truthy
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
1
spec/spec_helper.rb
Normal file
1
spec/spec_helper.rb
Normal file
@ -0,0 +1 @@
|
|||||||
|
require 'shift_stats'
|
Reference in New Issue
Block a user