the_tv_db 0.0.5 → 0.0.6

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # TheTvDB [![Build Status](https://travis-ci.org/jassa/the_tv_db.png)](https://travis-ci.org/jassa/the_tv_db) [![Dependency Status](https://gemnasium.com/jassa/the_tv_db.png)](https://gemnasium.com/jassa/the_tv_db)
1
+ # TheTvDB [![Build Status](https://travis-ci.org/jassa/the_tv_db.png)](https://travis-ci.org/jassa/the_tv_db) [![Dependency Status](https://gemnasium.com/jassa/the_tv_db.png)](https://gemnasium.com/jassa/the_tv_db) [![Code Climate](https://codeclimate.com/badge.png)](https://codeclimate.com/github/jassa/the_tv_db)
2
2
 
3
3
  Ruby API Client for TheTvDB.com
4
4
 
@@ -13,5 +13,5 @@ module TheTvDB
13
13
  Episode
14
14
  end
15
15
 
16
- end # API
16
+ end # Client
17
17
  end # TheTvDB
@@ -2,6 +2,40 @@ module TheTvDB
2
2
  class Episode < API
3
3
  include Model
4
4
 
5
+ ATTRS_MAP = {
6
+ :id => "id",
7
+ :absolute_number => "absolute_number",
8
+ :airs_after_season => "airsafter_season",
9
+ :airs_before_episode => "airsbefore_episode",
10
+ :airs_before_season => "airsbefore_season",
11
+ :combined_episode_number => "Combined_episodenumber",
12
+ :combined_season => "Combined_season",
13
+ :director => "Director",
14
+ :dvd_chapter => "DVD_chapter",
15
+ :dvd_disc_id => "DVD_discid",
16
+ :dvd_episode_number => "DVD_episodenumber",
17
+ :dvd_season => "DVD_season",
18
+ :ep_img_flag => "EpImgFlag",
19
+ :name => "EpisodeName",
20
+ :number => "EpisodeNumber",
21
+ :filename => "filename",
22
+ :first_aired => "FirstAired",
23
+ :guest_stars => "GuestStars",
24
+ :imdb_id => "IMDB_ID",
25
+ :language => "Language",
26
+ :last_updated => "lastupdated",
27
+ :overview => "Overview",
28
+ :production_code => "ProductionCode",
29
+ :rating => "Rating",
30
+ :rating_count => "RatingCount",
31
+ :season_id => "seasonid",
32
+ :season_number => "SeasonNumber",
33
+ :series_id => "seriesid",
34
+ :writer => "Writer"
35
+ }.freeze
36
+
37
+ attr_accessor *ATTRS_MAP.keys
38
+
5
39
  class << self
6
40
 
7
41
  # Public: Find an episode by air date.
@@ -43,39 +77,5 @@ module TheTvDB
43
77
  alias :get :find
44
78
  end
45
79
 
46
- ATTRS_MAP = {
47
- :id => "id",
48
- :absolute_number => "absolute_number",
49
- :airs_after_season => "airsafter_season",
50
- :airs_before_episode => "airsbefore_episode",
51
- :airs_before_season => "airsbefore_season",
52
- :combined_episode_number => "Combined_episodenumber",
53
- :combined_season => "Combined_season",
54
- :director => "Director",
55
- :dvd_chapter => "DVD_chapter",
56
- :dvd_disc_id => "DVD_discid",
57
- :dvd_episode_number => "DVD_episodenumber",
58
- :dvd_season => "DVD_season",
59
- :ep_img_flag => "EpImgFlag",
60
- :name => "EpisodeName",
61
- :number => "EpisodeNumber",
62
- :filename => "filename",
63
- :first_aired => "FirstAired",
64
- :guest_stars => "GuestStars",
65
- :imdb_id => "IMDB_ID",
66
- :language => "Language",
67
- :last_updated => "lastupdated",
68
- :overview => "Overview",
69
- :production_code => "ProductionCode",
70
- :rating => "Rating",
71
- :rating_count => "RatingCount",
72
- :season_id => "seasonid",
73
- :season_number => "SeasonNumber",
74
- :series_id => "seriesid",
75
- :writer => "Writer"
76
- }.freeze
77
-
78
- attr_accessor *ATTRS_MAP.keys
79
-
80
- end # Series
80
+ end # Episode
81
81
  end # TheTvDB
@@ -3,15 +3,17 @@ module TheTvDB
3
3
 
4
4
  attr_accessor :klass
5
5
 
6
- def initialize(params=nil)
6
+ def initialize(params=nil, &block)
7
7
  @klass = self.class
8
8
  self.attributes = params
9
+
10
+ self.instance_eval(&block) if block_given?
9
11
  end
10
12
 
11
13
  def attributes=(params=nil)
12
14
  params.each do |attr, value|
13
15
  begin
14
- self.public_send("#{klass::ATTRS_MAP.key(attr)}=", value)
16
+ self.public_send("#{attributes_map.key(attr)}=", value)
15
17
  rescue NoMethodError
16
18
  raise UnknownAttributeError, "unknown attribute: #{attr}"
17
19
  end
@@ -20,7 +22,7 @@ module TheTvDB
20
22
 
21
23
  def attributes
22
24
  attrs = {}
23
- klass::ATTRS_MAP.keys.each do |name|
25
+ class_attributes.each do |name|
24
26
  attrs[name] = send(name)
25
27
  end
26
28
  attrs
@@ -28,7 +30,7 @@ module TheTvDB
28
30
 
29
31
  def inspect
30
32
  inspection = unless id.nil?
31
- klass::ATTRS_MAP.keys.collect { |name|
33
+ class_attributes.collect { |name|
32
34
  "#{name}: #{attribute_for_inspect(name)}"
33
35
  }.compact.join(", ")
34
36
  else
@@ -49,5 +51,13 @@ module TheTvDB
49
51
  end
50
52
  end
51
53
 
54
+ def attributes_map
55
+ klass::ATTRS_MAP
56
+ end
57
+
58
+ def class_attributes
59
+ attributes_map.keys
60
+ end
61
+
52
62
  end # Model
53
63
  end # TheTvDB
@@ -1,27 +1,12 @@
1
- require 'zip/zip'
2
-
3
1
  module TheTvDB
4
2
  class Response::Unzip < Faraday::Response::Middleware
5
3
 
6
4
  def on_complete(env)
7
- env[:body] = unzip(env[:body]) if env[:response_headers]["content-type"] == "application/zip"
8
- super
9
- end
10
-
11
- def unzip(body)
12
- zipped = Tempfile.new('thetvdb.com')
13
- begin
14
- zipped.write(body.force_encoding("utf-8"))
15
- unzipped = ::Zip::ZipFile.new(zipped)
16
- files = {}
17
- unzipped.each do |file|
18
- files[file.name] = file.get_input_stream.read
19
- end
20
- files
21
- ensure
22
- zipped.close
23
- zipped.unlink
5
+ if env[:response_headers]["content-type"] == "application/zip"
6
+ env[:body] = TheTvDB::Zip.inflate(env[:body])
24
7
  end
8
+
9
+ super
25
10
  end
26
11
 
27
12
  end # Response::Unzip
@@ -1,42 +1,6 @@
1
1
  module TheTvDB
2
2
  class Series < API
3
3
  include Model
4
-
5
- class << self
6
- def search(name, lang="en")
7
- data = request("GetSeries.php", { seriesname: name, language: lang })["Data"]
8
- return [] if data.nil?
9
-
10
- series = data["Series"]
11
-
12
- case series
13
- when Hash
14
- [ Series::Collection.new(series) ]
15
- when Array
16
- series.collect { |serie| Series::Collection.new(serie) }
17
- else
18
- []
19
- end
20
- end
21
-
22
- def find(id, lang="en")
23
- if TheTvDB.api_key
24
- files = request("#{TheTvDB.api_key}/series/#{id}/all/#{lang}.zip")
25
- data = files["#{lang}.xml"].fetch("Data")
26
- record = new(data["Series"])
27
- record.episodes = data["Episode"]
28
- record.banners = files["banners.xml"]["Banners"]["Banner"]
29
- record.actors = files["actors.xml"]["Actors"]["Actor"]
30
- else
31
- data = request("/data/series/#{id}/all/").fetch("Data")
32
- record = new(data["Series"])
33
- record.episodes = data["Episode"]
34
- end
35
-
36
- return record
37
- end
38
- alias :get :find
39
- end
40
4
 
41
5
  ATTRS_MAP = {
42
6
  :id => "id",
@@ -67,6 +31,51 @@ module TheTvDB
67
31
  }.freeze
68
32
 
69
33
  attr_accessor *ATTRS_MAP.keys, :episodes, :banners, :actors
34
+
35
+ class << self
36
+ def search(name, lang="en")
37
+ data = request("GetSeries.php", { seriesname: name, language: lang })["Data"]
38
+ return [] if data.nil?
39
+
40
+ series = data["Series"]
41
+
42
+ case series
43
+ when Hash
44
+ [ Series::Collection.new(series) ]
45
+ when Array
46
+ series.collect { |serie| Series::Collection.new(serie) }
47
+ else
48
+ []
49
+ end
50
+ end
51
+
52
+ def find(id, lang="en")
53
+ format = TheTvDB.api_key ? :zip : :xml
54
+ send("get_#{format}_by_id", id, lang)
55
+ end
56
+ alias :get :find
57
+
58
+ private
59
+
60
+ def get_xml_by_id(id, lang)
61
+ data = request("/data/series/#{id}/all/").fetch("Data")
62
+ record = new(data["Series"]) do |r|
63
+ r.episodes = data["Episode"]
64
+ end
65
+ end
66
+
67
+ def get_zip_by_id(id, lang)
68
+ files = request("#{TheTvDB.api_key}/series/#{id}/all/#{lang}.zip")
69
+ data = files["#{lang}.xml"].fetch("Data")
70
+ record = new(data["Series"]) do |r|
71
+ r.episodes = data["Episode"]
72
+ r.banners = files["banners.xml"]["Banners"]["Banner"]
73
+ r.actors = files["actors.xml"]["Actors"]["Actor"]
74
+ end
75
+ rescue ::Zip::ZipError
76
+ get_xml_by_id(id, lang)
77
+ end
78
+ end
70
79
 
71
80
  def episodes=(episodes)
72
81
  @episodes = case episodes
@@ -0,0 +1,36 @@
1
+ require 'zip/zip'
2
+
3
+ module TheTvDB
4
+ module Zip
5
+
6
+ class << self
7
+
8
+ # Decompresses string.
9
+ def inflate(string)
10
+ entries = {}
11
+ deflated = deflate(string)
12
+ deflated.each do |entry|
13
+ entries[entry.name] = entry.get_input_stream.read
14
+ end
15
+ entries
16
+ ensure
17
+ tmp.close
18
+ tmp.unlink
19
+ end
20
+
21
+ # Compresses the given string.
22
+ def deflate(string)
23
+ tmp.write(string.force_encoding("utf-8"))
24
+ ::Zip::ZipFile.new(tmp)
25
+ end
26
+
27
+ private
28
+
29
+ def tmp
30
+ @tmp ||= Tempfile.new('thetvdb.com')
31
+ end
32
+
33
+ end
34
+
35
+ end # Zip
36
+ end # TheTvDB
@@ -1,3 +1,3 @@
1
1
  module TheTvDB
2
- VERSION = "0.0.5"
2
+ VERSION = "0.0.6"
3
3
  end
data/lib/the_tv_db.rb CHANGED
@@ -1,6 +1,6 @@
1
- require "the_tv_db/core_ext/string"
2
- require "the_tv_db/version"
1
+ require 'the_tv_db/utils/zip'
3
2
  require "the_tv_db/errors"
3
+ require "the_tv_db/version"
4
4
  require "the_tv_db/api"
5
5
  require "the_tv_db/model"
6
6
  require "the_tv_db/client"
@@ -13,11 +13,11 @@ describe TheTvDB::Episode do
13
13
  let(:episodes) { api.episodes.find("82066", "2012-11-16") }
14
14
 
15
15
  it "returns an array" do
16
- episodes == Array
16
+ episodes.class.should == Array
17
17
  end
18
18
 
19
19
  it "instantiates episode objects" do
20
- episodes.first == TheTvDB::Episode
20
+ episodes.first.class.should == TheTvDB::Episode
21
21
  end
22
22
  end
23
23
 
@@ -4,6 +4,7 @@ describe TheTvDB::Series do
4
4
  let(:api) { TheTvDB.new }
5
5
 
6
6
  context ".search" do
7
+
7
8
  it "returns an empty array when no results" do
8
9
  stub_get("GetSeries.php?language=en&seriesname=asdf").
9
10
  to_return(:status => 200, :body => fixture("series/empty.xml"))
@@ -43,10 +44,12 @@ describe TheTvDB::Series do
43
44
  end
44
45
 
45
46
  context "when api key is provided" do
46
- before(:all) do
47
- body = TheTvDB::Response::Unzip.new.unzip(fixture("series/en.zip"))
47
+ before :all do
48
48
  stub_get("ASDF01234F0AF1368/series/82066/all/en.zip").
49
- to_return(:status => 200, :body => body)
49
+ to_return(:status => 200,
50
+ :body => fixture("series/en.zip"),
51
+ :headers => { "content-type" => "application/zip" })
52
+
50
53
  api = TheTvDB.new(:api_key => "ASDF01234F0AF1368")
51
54
  @series = api.series.find("82066")
52
55
  end
data/the_tv_db.gemspec CHANGED
@@ -18,10 +18,10 @@ Gem::Specification.new do |gem|
18
18
  gem.require_paths = ["lib"]
19
19
 
20
20
  gem.add_dependency "faraday", "~> 0.8.4"
21
- gem.add_dependency "ox", "~> 1.6.6"
21
+ gem.add_dependency "ox", "~> 1.6.8"
22
22
  gem.add_dependency "multi_xml", "~> 0.5.1"
23
23
  gem.add_dependency "rubyzip", "~> 0.9.9"
24
24
 
25
- gem.add_development_dependency "rspec", "~> 2.11.0"
26
- gem.add_development_dependency "webmock", "~> 1.8.11"
25
+ gem.add_development_dependency "rspec", "~> 2.12.0"
26
+ gem.add_development_dependency "webmock", "~> 1.9.0"
27
27
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: the_tv_db
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.5
4
+ version: 0.0.6
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-11-06 00:00:00.000000000 Z
12
+ date: 2012-11-26 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: faraday
16
- requirement: &70129673485720 !ruby/object:Gem::Requirement
16
+ requirement: &70353122973600 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ~>
@@ -21,21 +21,21 @@ dependencies:
21
21
  version: 0.8.4
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *70129673485720
24
+ version_requirements: *70353122973600
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: ox
27
- requirement: &70129673485220 !ruby/object:Gem::Requirement
27
+ requirement: &70353122973100 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ~>
31
31
  - !ruby/object:Gem::Version
32
- version: 1.6.6
32
+ version: 1.6.8
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *70129673485220
35
+ version_requirements: *70353122973100
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: multi_xml
38
- requirement: &70129673484760 !ruby/object:Gem::Requirement
38
+ requirement: &70353122972640 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ~>
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: 0.5.1
44
44
  type: :runtime
45
45
  prerelease: false
46
- version_requirements: *70129673484760
46
+ version_requirements: *70353122972640
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: rubyzip
49
- requirement: &70129673484300 !ruby/object:Gem::Requirement
49
+ requirement: &70353122972180 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ~>
@@ -54,29 +54,29 @@ dependencies:
54
54
  version: 0.9.9
55
55
  type: :runtime
56
56
  prerelease: false
57
- version_requirements: *70129673484300
57
+ version_requirements: *70353122972180
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: rspec
60
- requirement: &70129673483840 !ruby/object:Gem::Requirement
60
+ requirement: &70353122971720 !ruby/object:Gem::Requirement
61
61
  none: false
62
62
  requirements:
63
63
  - - ~>
64
64
  - !ruby/object:Gem::Version
65
- version: 2.11.0
65
+ version: 2.12.0
66
66
  type: :development
67
67
  prerelease: false
68
- version_requirements: *70129673483840
68
+ version_requirements: *70353122971720
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: webmock
71
- requirement: &70129673483380 !ruby/object:Gem::Requirement
71
+ requirement: &70353122971260 !ruby/object:Gem::Requirement
72
72
  none: false
73
73
  requirements:
74
74
  - - ~>
75
75
  - !ruby/object:Gem::Version
76
- version: 1.8.11
76
+ version: 1.9.0
77
77
  type: :development
78
78
  prerelease: false
79
- version_requirements: *70129673483380
79
+ version_requirements: *70353122971260
80
80
  description: Ruby API Client for TheTvDB.com
81
81
  email:
82
82
  - javier@tractical.com
@@ -95,7 +95,6 @@ files:
95
95
  - lib/the_tv_db/api.rb
96
96
  - lib/the_tv_db/client.rb
97
97
  - lib/the_tv_db/connection.rb
98
- - lib/the_tv_db/core_ext/string.rb
99
98
  - lib/the_tv_db/episode.rb
100
99
  - lib/the_tv_db/errors.rb
101
100
  - lib/the_tv_db/model.rb
@@ -105,6 +104,7 @@ files:
105
104
  - lib/the_tv_db/response/xmlize.rb
106
105
  - lib/the_tv_db/series.rb
107
106
  - lib/the_tv_db/series/collection.rb
107
+ - lib/the_tv_db/utils/zip.rb
108
108
  - lib/the_tv_db/version.rb
109
109
  - spec/fixtures/episodes/air_date.xml
110
110
  - spec/fixtures/episodes/api_key.xml
@@ -1,12 +0,0 @@
1
- class String
2
- # Makes an underscored, lowercase form from the expression in the string.
3
- def underscore
4
- word = self.dup
5
- word.gsub!('::', '/')
6
- word.gsub!(/([A-Z\d]+)([A-Z][a-z])/,'\1_\2')
7
- word.gsub!(/([a-z\d])([A-Z])/,'\1_\2')
8
- word.tr!("-", "_")
9
- word.downcase!
10
- word
11
- end
12
- end