tvdb_client 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 +23 -0
- data/.rspec +2 -0
- data/.rubyversion +1 -0
- data/CHANGELOG.md +4 -0
- data/Gemfile +2 -0
- data/Guardfile +20 -0
- data/README.md +43 -0
- data/Rakefile +9 -0
- data/conf/settings.example.yml +7 -0
- data/lib/tvdb_client.rb +13 -0
- data/lib/tvdb_client/authorization.rb +46 -0
- data/lib/tvdb_client/client.rb +30 -0
- data/lib/tvdb_client/connection.rb +98 -0
- data/lib/tvdb_client/series.rb +54 -0
- data/lib/tvdb_client/series/base.rb +32 -0
- data/lib/tvdb_client/series/series_episodes.rb +18 -0
- data/lib/tvdb_client/series/series_filter.rb +21 -0
- data/lib/tvdb_client/series/series_images.rb +14 -0
- data/lib/tvdb_client/service/threading.rb +8 -0
- data/lib/tvdb_client/service/threading/threaded_request.rb +51 -0
- data/lib/tvdb_client/settings.rb +10 -0
- data/lib/tvdb_client/version.rb +3 -0
- data/spec/spec_helper.rb +53 -0
- data/spec/support/fake_TVDB.rb +118 -0
- data/spec/support/fixtures/responses/login.json +3 -0
- data/spec/support/fixtures/responses/refresh_token.json +3 -0
- data/spec/support/fixtures/responses/series.json +33 -0
- data/spec/support/fixtures/responses/series_episodes_page_1.json +56 -0
- data/spec/support/fixtures/responses/series_episodes_page_2.json +56 -0
- data/spec/support/fixtures/responses/series_episodes_page_n.json +41 -0
- data/spec/support/fixtures/responses/series_episodes_query_airedSeason.json +41 -0
- data/spec/support/fixtures/responses/series_episodes_query_params.json +12 -0
- data/spec/support/fixtures/responses/series_episodes_summary.json +26 -0
- data/spec/support/fixtures/responses/series_filter.json +5 -0
- data/spec/support/fixtures/responses/series_filter_params.json +27 -0
- data/spec/support/fixtures/responses/series_images.json +9 -0
- data/spec/support/fixtures/responses/series_images_query.json +35 -0
- data/spec/support/fixtures/responses/series_images_query_params.json +60 -0
- data/spec/support/fixtures/settings.example.yml +6 -0
- data/spec/support/shared_contexts/authentication.rb +13 -0
- data/spec/support/shared_contexts/connection.rb +20 -0
- data/spec/support/shared_contexts/credentials.rb +20 -0
- data/spec/support/shared_contexts/series_subclass.rb +19 -0
- data/spec/tvdb_client/authorization_spec.rb +69 -0
- data/spec/tvdb_client/client_spec.rb +45 -0
- data/spec/tvdb_client/connection_spec.rb +159 -0
- data/spec/tvdb_client/series/base_spec.rb +13 -0
- data/spec/tvdb_client/series/series_episodes_spec.rb +55 -0
- data/spec/tvdb_client/series/series_filter_spec.rb +45 -0
- data/spec/tvdb_client/series/series_images_spec.rb +43 -0
- data/spec/tvdb_client/series_spec.rb +69 -0
- data/spec/tvdb_client/service/threading/threaded_request_spec.rb +54 -0
- data/spec/tvdb_client/version_spec.rb +12 -0
- data/tasks/version_bump.rake +102 -0
- data/templates/changelog_entry_template.md.erb +3 -0
- data/templates/version.rb.erb +3 -0
- data/tvdb_client.gemspec +41 -0
- metadata +412 -0
@@ -0,0 +1,13 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'json'
|
3
|
+
|
4
|
+
describe "TVDB::Series" do
|
5
|
+
include_context "Series Subclass"
|
6
|
+
|
7
|
+
describe "Initialization" do
|
8
|
+
it "should throw an error when trying to instantiate TVDB::Series::Base directly" do
|
9
|
+
expect { TVDB::Series::Base.new }.to raise_error( Exception )
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'json'
|
3
|
+
|
4
|
+
describe "TVDB::Series" do
|
5
|
+
include_context "Series Subclass"
|
6
|
+
|
7
|
+
subject { TVDB::Series::Episodes.new( series_opts ) }
|
8
|
+
|
9
|
+
describe "Initialization" do
|
10
|
+
it "should create an instance of TVDB::Series" do
|
11
|
+
expect( subject ).to be_a_kind_of( TVDB::Series::Episodes )
|
12
|
+
end
|
13
|
+
|
14
|
+
it "should set a connection and a series ID" do
|
15
|
+
expect( subject.connection ).to be_a_kind_of( TVDB::Connection )
|
16
|
+
expect( subject.series_id ).to eq( '76703' )
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
describe "Episodes for a Series" do
|
21
|
+
context 'Listing episodes' do
|
22
|
+
it "should list the episodes for a series" do
|
23
|
+
episodes = subject.list
|
24
|
+
expect( episodes ).to be_a_kind_of( Hash )
|
25
|
+
expect( episodes["data"] ).to be_a_kind_of( Array )
|
26
|
+
expect( episodes["data"].length > 1 ).to be( true )
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
context 'Querying' do
|
31
|
+
it "should be able to query episodes for a series" do
|
32
|
+
expect( subject ).to respond_to( :query )
|
33
|
+
end
|
34
|
+
|
35
|
+
it "should return results that match the query" do
|
36
|
+
expect{ subject.query( params: { airedSeason: 15 } ) }.not_to raise_error
|
37
|
+
query = subject.query( params: { airedSeason: 15 } )
|
38
|
+
|
39
|
+
expect( query["data"][-1]["airedSeason"] ).to eq( "15" )
|
40
|
+
end
|
41
|
+
|
42
|
+
it "should return parameters to query by" do
|
43
|
+
expect( subject.query_params["data"] ).to be_a_kind_of( Array )
|
44
|
+
expect( subject.query_params["data"][0] ).to eq( "airedSeason" )
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
context 'Summary' do
|
49
|
+
it "should return a summary of episodes for the series" do
|
50
|
+
expect( subject.summary["data"]["airedSeasons"].length ).to eq( 17 )
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'json'
|
3
|
+
|
4
|
+
describe "TVDB::Series" do
|
5
|
+
include_context "Series Subclass"
|
6
|
+
|
7
|
+
let( :init_opts ) {
|
8
|
+
series_opts[:params] = { :keys => "seriesName" }
|
9
|
+
|
10
|
+
series_opts
|
11
|
+
}
|
12
|
+
|
13
|
+
subject { TVDB::Series::Filter.new( init_opts ) }
|
14
|
+
|
15
|
+
describe "Initialization" do
|
16
|
+
it "should create an instance of TVDB::Series" do
|
17
|
+
expect( subject ).to be_a_kind_of( TVDB::Series::Filter )
|
18
|
+
end
|
19
|
+
|
20
|
+
it "should set a connection and a series ID" do
|
21
|
+
expect( subject.connection ).to be_a_kind_of( TVDB::Connection )
|
22
|
+
expect( subject.series_id ).to eq( '76703' )
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
describe "Filter for a Series" do
|
27
|
+
it "should filter the keys returned from a /series GET" do
|
28
|
+
expect( subject.list ).to be_a_kind_of( Hash )
|
29
|
+
expect( subject.list["data"] ).to have_key( "seriesName" )
|
30
|
+
expect( subject.list["data"].length ).to eq( 1 )
|
31
|
+
end
|
32
|
+
|
33
|
+
it "should return a list of keys to filter by" do
|
34
|
+
response = subject.params["data"]["params"]
|
35
|
+
|
36
|
+
expect( response ).to be_a_kind_of( Array )
|
37
|
+
expect( response.length > 1 ).to be( true )
|
38
|
+
end
|
39
|
+
|
40
|
+
it "should not respond to query_params" do
|
41
|
+
expect { subject.query_params }.to raise_error( NotImplementedError )
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'json'
|
3
|
+
|
4
|
+
describe "TVDB::Series" do
|
5
|
+
include_context "Series Subclass"
|
6
|
+
|
7
|
+
subject { TVDB::Series::Images.new( series_opts ) }
|
8
|
+
|
9
|
+
describe "Initialization" do
|
10
|
+
it "should create an instance of TVDB::Series" do
|
11
|
+
expect( subject ).to be_a_kind_of( TVDB::Series::Images )
|
12
|
+
end
|
13
|
+
|
14
|
+
it "should set a connection and a series ID" do
|
15
|
+
expect( subject.connection ).to be_a_kind_of( TVDB::Connection )
|
16
|
+
expect( subject.series_id ).to eq( '76703' )
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
describe "Images for a Series" do
|
21
|
+
it "should return a summary of images for the given series" do
|
22
|
+
images = subject.list
|
23
|
+
|
24
|
+
expect( images ).to be_a_kind_of( Hash )
|
25
|
+
["fanart", "poster", "season", "seasonwide", "series"].each do |type|
|
26
|
+
expect( images["data"] ).to have_key( type )
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
it "should return a user query" do
|
31
|
+
results = subject.query( :keyType => "fanart" )
|
32
|
+
|
33
|
+
expect( results["data"][0]["keyType"] ).to eq( "fanart" )
|
34
|
+
end
|
35
|
+
|
36
|
+
it "should list the parameters available to query by" do
|
37
|
+
results = subject.query_params
|
38
|
+
|
39
|
+
expect( results["data"].length > 1 ).to be( true )
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
@@ -0,0 +1,69 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'json'
|
3
|
+
|
4
|
+
describe "TVDB::Series" do
|
5
|
+
include_context "Authentication"
|
6
|
+
|
7
|
+
before( :each ) do
|
8
|
+
authenticate_connection
|
9
|
+
end
|
10
|
+
|
11
|
+
let( :series_id ) { '76703' }
|
12
|
+
|
13
|
+
subject { TVDB::Series.new( connection, series_id ) }
|
14
|
+
|
15
|
+
describe "Initialization" do
|
16
|
+
it "should create an instance of TVDB::Series" do
|
17
|
+
expect( subject ).to be_a_kind_of( TVDB::Series )
|
18
|
+
end
|
19
|
+
|
20
|
+
it "should set a connection accessor" do
|
21
|
+
expect( subject.connection ).to be_a_kind_of( TVDB::Connection )
|
22
|
+
end
|
23
|
+
|
24
|
+
it "should return series data" do
|
25
|
+
expect( subject.data ).to be_a_kind_of( Hash )
|
26
|
+
expect( subject.data["data"]["id"] ).to eq( 76703 )
|
27
|
+
end
|
28
|
+
|
29
|
+
it "should handle series that do not exist" do
|
30
|
+
bad_series = TVDB::Series.new( connection, '773747' )
|
31
|
+
expect( bad_series.data["Error"] ).to eq( "ID: 773747 not found" )
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
describe "Series Episodes" do
|
36
|
+
it "should return episodes in a series" do
|
37
|
+
expect( subject.episodes.list["data"] ).to be_a_kind_of( Array )
|
38
|
+
expect( subject.episodes.list["links"]["next"] ).to eq( 2 )
|
39
|
+
end
|
40
|
+
|
41
|
+
it "should return the 2nd page of results" do
|
42
|
+
result = subject.episodes( page: 2 ).list
|
43
|
+
expect( result["links"]["next"] ).to eq( nil )
|
44
|
+
end
|
45
|
+
|
46
|
+
it "should be able to return all episodes for a series" do
|
47
|
+
page1 = subject.episodes( page: 1 ).list["data"]
|
48
|
+
page2 = subject.episodes( page: 2 ).list["data"]
|
49
|
+
|
50
|
+
combined_pages = [page1, page2].flatten
|
51
|
+
|
52
|
+
expect( subject.all_episodes.length ).to eq( combined_pages.length )
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
describe "Series Images" do
|
57
|
+
it "should return images for a series" do
|
58
|
+
expect( subject.images ).to be_a_kind_of( TVDB::Series::Images )
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
describe "Series Filter" do
|
63
|
+
it "should return filtered results for a series" do
|
64
|
+
expect( subject.filter( :keys => "seriesName" ) ).to be_a_kind_of( TVDB::Series::Filter )
|
65
|
+
expect( subject.filter( :keys => "seriesName" ).list.length ).to eq( 1 )
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'json'
|
3
|
+
|
4
|
+
describe "TVDB::Service::Threading" do
|
5
|
+
include_context "Authentication"
|
6
|
+
|
7
|
+
let(:init_options) {
|
8
|
+
{
|
9
|
+
connection: connection,
|
10
|
+
pool_size: 10
|
11
|
+
}
|
12
|
+
}
|
13
|
+
|
14
|
+
subject { TVDB::Service::Threading::ThreadedRequest.new( init_options ) }
|
15
|
+
|
16
|
+
describe "Initialization" do
|
17
|
+
it "should take arguments and set attrs" do
|
18
|
+
expect( subject.connection ).to be_a_kind_of( TVDB::Connection )
|
19
|
+
expect( subject.pool_size ).to be_a_kind_of( Integer )
|
20
|
+
end
|
21
|
+
|
22
|
+
it "should default to a pool size of 10" do
|
23
|
+
opts = { connection: connection }
|
24
|
+
|
25
|
+
tr = TVDB::Service::Threading::ThreadedRequest.new( opts )
|
26
|
+
expect( tr.pool_size ).to eq( 10 )
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
describe "Requests" do
|
31
|
+
before( :each ) do
|
32
|
+
authenticate_connection
|
33
|
+
end
|
34
|
+
|
35
|
+
it "should be able to make a request" do
|
36
|
+
expect( subject ).to respond_to( :make_request )
|
37
|
+
end
|
38
|
+
|
39
|
+
it "should return an array of results" do
|
40
|
+
response = subject.make_request( "/series/99999/episodes" )
|
41
|
+
|
42
|
+
expect( response ).to be_a_kind_of( Array )
|
43
|
+
expect( response.length > 0 ).to be( true )
|
44
|
+
end
|
45
|
+
|
46
|
+
it "should bail if the route doesn't return a 200 response" do
|
47
|
+
expect( subject.make_request( "/series/12345/episodes" ).code ).to eq( 404 )
|
48
|
+
end
|
49
|
+
|
50
|
+
it "should limit connections to the pool size" do
|
51
|
+
skip "Not sure how to test this one yet"
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
@@ -0,0 +1,102 @@
|
|
1
|
+
namespace :version do
|
2
|
+
|
3
|
+
desc "Bumps up the version number by the patch level"
|
4
|
+
task :patch do
|
5
|
+
bump_version( "patch" )
|
6
|
+
end
|
7
|
+
|
8
|
+
desc "Bumps up the version number by a minor release level"
|
9
|
+
task :minor do
|
10
|
+
bump_version( "minor" )
|
11
|
+
end
|
12
|
+
|
13
|
+
desc "Bumps up the version number by a major release level"
|
14
|
+
task :major do
|
15
|
+
bump_version( "major" )
|
16
|
+
end
|
17
|
+
|
18
|
+
desc "TVDB's current version"
|
19
|
+
task :current do
|
20
|
+
puts TVDB::VERSION
|
21
|
+
end
|
22
|
+
|
23
|
+
desc "Bypass incremental bumping and set the version to whatever you specify in the format: #.#.#"
|
24
|
+
task :set, [:version] do |t, args|
|
25
|
+
raise "Version must match the following format: #.#.#" unless args[:version].match( /^[0-9].[0-9].[0-9]$/ )
|
26
|
+
write_version_file( args[:version] )
|
27
|
+
end
|
28
|
+
|
29
|
+
def bump_version( version_level )
|
30
|
+
current_version = Semantic::Version.new( TVDB::VERSION )
|
31
|
+
|
32
|
+
case version_level
|
33
|
+
when "patch"
|
34
|
+
current_version.patch += 1
|
35
|
+
when "minor"
|
36
|
+
current_version.minor += 1
|
37
|
+
current_version.patch = 0
|
38
|
+
when "major"
|
39
|
+
current_version.major += 1
|
40
|
+
current_version.minor = 0
|
41
|
+
current_version.patch = 0
|
42
|
+
|
43
|
+
end
|
44
|
+
|
45
|
+
write_version_file( current_version )
|
46
|
+
end
|
47
|
+
|
48
|
+
def write_version_file( version )
|
49
|
+
yes_or_no = ask( "You are about to change tvdb_client to version: #{version}. Continue? [y/n]" )
|
50
|
+
|
51
|
+
continue?( yes_or_no )
|
52
|
+
create_new_version_file( version )
|
53
|
+
add_entry_to_changelog( version )
|
54
|
+
end
|
55
|
+
|
56
|
+
def continue?( yes_or_no )
|
57
|
+
case yes_or_no
|
58
|
+
when "y"
|
59
|
+
puts 'Continuing...'
|
60
|
+
when "n"
|
61
|
+
abort( 'Looks like you changed your mind. Exiting!' )
|
62
|
+
else
|
63
|
+
puts "Please respond with either 'y' or 'n'."
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
def create_new_version_file( version )
|
68
|
+
@new_version = version
|
69
|
+
template = File.expand_path( "../../templates/version.rb.erb", __FILE__ )
|
70
|
+
|
71
|
+
erb = ERB.new( File.read( template ) )
|
72
|
+
file_output = erb.result(binding)
|
73
|
+
file_output_path = File.expand_path( '../../lib/tvdb_client/version.rb', __FILE__ )
|
74
|
+
|
75
|
+
File.open( file_output_path, 'w' ) { |f| f.write( file_output ) }
|
76
|
+
|
77
|
+
message = [
|
78
|
+
"\nTVDB has been updated to version: #{version}!",
|
79
|
+
"A new entry has appeared in the CHANGELOG!",
|
80
|
+
" ",
|
81
|
+
"Please edit the new CHANGELOG entry and add it along with version.rb to the repo."
|
82
|
+
].join( "\n" )
|
83
|
+
|
84
|
+
puts message
|
85
|
+
end
|
86
|
+
|
87
|
+
def add_entry_to_changelog( version )
|
88
|
+
@new_version = version
|
89
|
+
chlg_temp = "../../templates/changelog_entry_template.md.erb"
|
90
|
+
template = File.expand_path( chlg_temp, __FILE__ )
|
91
|
+
|
92
|
+
erb = ERB.new( File.read( template ) )
|
93
|
+
file_output = erb.result(binding)
|
94
|
+
changelog = File.expand_path( '../../CHANGELOG.md', __FILE__ )
|
95
|
+
|
96
|
+
new_changelog = File.read( changelog ).lines.insert(2, file_output)
|
97
|
+
|
98
|
+
File.open( changelog, 'w' ) { |f| f.write( new_changelog.join('') ) }
|
99
|
+
end
|
100
|
+
|
101
|
+
|
102
|
+
end
|
data/tvdb_client.gemspec
ADDED
@@ -0,0 +1,41 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'tvdb_client/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "tvdb_client"
|
8
|
+
spec.version = TVDB::VERSION
|
9
|
+
spec.authors = ["Aaron Lunsford"]
|
10
|
+
spec.email = ["awlunsfo@gmail.com"]
|
11
|
+
spec.summary = %q{Ruby client for the TVDB API}
|
12
|
+
spec.description = %q{Ruby library for interacting with the TVDB's REST API}
|
13
|
+
spec.homepage = "https://github.com/awlunsfo/tvdb_client.git"
|
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
|
+
spec.add_dependency 'siliconsalad-settingslogic', '~> 2.0'
|
21
|
+
spec.add_dependency 'multi_json', '~> 1.10'
|
22
|
+
spec.add_dependency 'faraday', '~> 0.9'
|
23
|
+
spec.add_dependency 'rake', '~> 10.1'
|
24
|
+
spec.add_dependency 'semantic', '~> 1.3'
|
25
|
+
spec.add_dependency 'highline', '~> 1.7'
|
26
|
+
|
27
|
+
spec.add_development_dependency "bundler", "~> 1.7"
|
28
|
+
spec.add_development_dependency 'guard', '~> 2.6'
|
29
|
+
spec.add_development_dependency 'guard-rspec', '~> 4.3'
|
30
|
+
spec.add_development_dependency 'terminal-notifier', '~> 1.6'
|
31
|
+
spec.add_development_dependency 'terminal-notifier-guard', '~> 1.6'
|
32
|
+
spec.add_development_dependency 'rb-readline', '~> 0.5'
|
33
|
+
spec.add_development_dependency 'pry-byebug', '~> 3.2'
|
34
|
+
spec.add_development_dependency 'guard-spork', '~> 2.1'
|
35
|
+
spec.add_development_dependency 'spork', '~> 0.9'
|
36
|
+
spec.add_development_dependency 'yard', '~> 0.8'
|
37
|
+
spec.add_development_dependency 'rspec', '~> 3.1'
|
38
|
+
spec.add_development_dependency 'simplecov', '~> 0.9'
|
39
|
+
spec.add_development_dependency 'webmock', '~> 1.18'
|
40
|
+
spec.add_development_dependency 'sinatra', '~> 1.4'
|
41
|
+
end
|