the_tv_db 0.0.5 → 0.0.6

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.
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