ruby-tmdb3 0.3.0 → 0.3.1

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.rdoc CHANGED
@@ -98,8 +98,9 @@ To find out more about the information each object offers on retrieved items hav
98
98
 
99
99
  === Author & Credits
100
100
 
101
- Author:: {Irio Irineu Musskopf Junior}[mailto:iirineu@gmail.com], {Aaron Gough}[mailto:aaron@aarongough.com]
102
- Contributors:: {Alex Hayes}[https://github.com/alexhayes], {Alvaro Pereyra Rabanal}[https://github.com/xenda], {Linus Oleander}[https://github.com/oleander], {aristides}[https://github.com/aristides], {Robin Boutros}[https://github.com/niuage]
101
+ Authors:: {Irio Irineu Musskopf Junior}[mailto:iirineu@gmail.com], {Aaron Gough}[mailto:aaron@aarongough.com]
102
+ Contributors:: {Alex Hayes}[https://github.com/alexhayes], {Alvaro Pereyra Rabanal}[https://github.com/xenda], {Linus Oleander}[https://github.com/oleander], {aristides}[https://github.com/aristides], {Robin Boutros}[https://github.com/niuage], {Loïc Guitaut}[https://github.com/Flink]
103
103
 
104
104
  Copyright (c) 2012 {Irio Irineu Musskopf Junior}[http://irio.posterous.com/] ({irio.posterous.com}[http://irio.posterous.com/])
105
+
105
106
  Copyright (c) 2010 {Aaron Gough}[http://thingsaaronmade.com/] ({thingsaaronmade.com}[http://thingsaaronmade.com/]), released under the MIT license
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.3.0
1
+ 0.3.1
@@ -10,6 +10,17 @@ class Tmdb
10
10
  @@api_key = ""
11
11
  @@default_language = "en"
12
12
  @@api_response = {}
13
+
14
+ # TODO: Should be refreshed and cached from API
15
+ CONFIGURATION = DeepOpenStruct.load({ "images" =>
16
+ {
17
+ "base_url" => "http://cf2.imgobject.com/t/p/",
18
+ "posters_sizes" => ["w92", "w154", "w185", "w342", "w500", "original"],
19
+ "backdrops_sizes" => ["w300", "w780", "w1280", "original"],
20
+ "profiles_sizes" => ["w45", "w185", "h632", "original"],
21
+ "logos_sizes" => ["w45", "w92", "w154", "w185", "w300", "w500", "original"]
22
+ }
23
+ })
13
24
 
14
25
  def self.api_key
15
26
  @@api_key
@@ -28,13 +39,15 @@ class Tmdb
28
39
  end
29
40
 
30
41
  def self.base_api_url
31
- "http://api.themoviedb.org/3/"
42
+ "http://api.themoviedb.org/3"
32
43
  end
33
44
 
34
45
  def self.api_call(method, data, language = @@default_language)
35
46
  raise ArgumentError, "Tmdb.api_key must be set before using the API" if(Tmdb.api_key.nil? || Tmdb.api_key.empty?)
36
47
  raise ArgumentError, "Invalid data." if(data.nil? || (data.class != Hash))
37
48
 
49
+ method, action = method.split '/'
50
+
38
51
  data = {
39
52
  api_key: Tmdb.api_key,
40
53
  language: language
@@ -55,21 +68,17 @@ class Tmdb
55
68
  # Construct URL for queries with id
56
69
  if data.has_key?(:id)
57
70
  uri.query_values = query_values
58
-
59
- url = Tmdb.base_api_url + method + "/" + data[:id].to_s + "?" + uri.query
60
-
61
71
  # Construct URL other queries
62
72
  else
63
73
  query_values = {
64
74
  query: CGI::escape(data[:query])
65
75
  }.merge(query_values)
66
-
67
76
  uri.query_values = query_values
68
-
69
- url = Tmdb.base_api_url + method + "?" + uri.query
70
77
  end
78
+ url = [Tmdb.base_api_url, method, data[:id], action].compact.join '/'
79
+ url_with_query = [url, uri.query].compact.join '?'
71
80
 
72
- response = Tmdb.get_url(url)
81
+ response = Tmdb.get_url(url_with_query)
73
82
  if(response.code.to_i != 200)
74
83
  raise RuntimeError, "Tmdb API returned status code '#{response.code}' for URL: '#{url}'"
75
84
  end
@@ -100,22 +109,20 @@ class Tmdb
100
109
  end
101
110
 
102
111
  def self.data_to_object(data)
103
- object = DeepOpenStruct.load(data)
112
+ object = DeepOpenStruct.load(data)
104
113
  object.raw_data = data
105
- ["posters", "backdrops", "profile"].each do |image_array_name|
106
- if(object.respond_to?(image_array_name))
107
- image_array = object.send(image_array_name)
108
- image_array.each_index do |x|
109
- image_array[x] = image_array[x].image
110
- image_array[x].instance_eval <<-EOD
111
- def self.data
112
- return Tmdb.get_url(self.url).body
113
- end
114
- EOD
114
+ ["posters", "backdrops"].each do |image_array_name|
115
+ image_array = Array object.send(image_array_name)
116
+ single_name = image_array_name.slice 0..-2 # singularize name
117
+ single_path = object.send "#{single_name}_path" # default poster/backdrop image
118
+ image_array << object.send("#{image_array_name.slice 0..-2}=", DeepOpenStruct.load({file_path: single_path}))
119
+ # build a struct containing availables sizes with their urls
120
+ image_array.each do |image|
121
+ urls = CONFIGURATION.images.send("#{image_array_name}_sizes").inject({}) do |hash, size|
122
+ hash[size] = {'url' => [CONFIGURATION.images.base_url, size, image.file_path].join}
123
+ hash
115
124
  end
116
- end
117
- if(object.profile)
118
- object.profiles = object.profile
125
+ image.sizes = DeepOpenStruct.load urls
119
126
  end
120
127
  end
121
128
  unless(object.cast.nil?)
@@ -130,4 +137,4 @@ class Tmdb
130
137
  return object
131
138
  end
132
139
 
133
- end
140
+ end
@@ -40,14 +40,22 @@ class TmdbMovie
40
40
 
41
41
  def self.new(raw_data, expand_results = false, language = nil)
42
42
  # expand the result by calling movie unless :expand_results is false or the data is already complete
43
- # (as determined by checking for the runtime property in the raw data)
44
- if(expand_results && !raw_data.has_key?("runtime"))
43
+ # (as determined by checking for the posters property in the raw data)
44
+ if(expand_results && (!raw_data.has_key?("posters") || !raw_data['releases'] || !raw_data['cast']))
45
45
  begin
46
- expanded_data = Tmdb.api_call("movie", {id: raw_data["id"].to_s}, language)
47
- rescue RuntimeError => e
48
- raise ArgumentError, "Unable to fetch expanded info for Movie ID: '#{raw_data["id"]}'" if expanded_data.nil?
46
+ movie_id = raw_data['id']
47
+ raw_data = Tmdb.api_call 'movie', { id: movie_id }, language
48
+ @images_data = Tmdb.api_call("movie/images", {id: movie_id}, language)
49
+ @releases_data = Tmdb.api_call('movie/releases', {id: movie_id}, language)
50
+ @cast_data = Tmdb.api_call('movie/casts', {id: movie_id}, language)
51
+ raw_data['posters'] = @images_data['posters']
52
+ raw_data['backdrops'] = @images_data['backdrops']
53
+ raw_data['releases'] = @releases_data['countries']
54
+ raw_data['cast'] = @cast_data['cast']
55
+ raw_data['crew'] = @cast_data['crew']
56
+ rescue => e
57
+ raise ArgumentError, "Unable to fetch expanded infos for Movie ID: '#{movie_id}'" if @images_data.nil? || @releases_data.nil? || @cast_data.nil?
49
58
  end
50
- raw_data = expanded_data
51
59
  end
52
60
  return Tmdb.data_to_object(raw_data)
53
61
  end
@@ -57,4 +65,4 @@ class TmdbMovie
57
65
  return @raw_data == other.raw_data
58
66
  end
59
67
 
60
- end
68
+ end
data/ruby-tmdb3.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = "ruby-tmdb3"
8
- s.version = "0.3.0"
8
+ s.version = "0.3.1"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Irio Irineu Musskopf Junior", "Aaron Gough"]
12
- s.date = "2012-06-19"
12
+ s.date = "2012-07-11"
13
13
  s.description = "An ActiveRecord-style API wrapper for TheMovieDB.org"
14
14
  s.email = "iirineu@gmail.com"
15
15
  s.extra_rdoc_files = [
@@ -30,8 +30,11 @@ Gem::Specification.new do |s|
30
30
  "test/fixtures/example_com.txt",
31
31
  "test/fixtures/image.jpg",
32
32
  "test/fixtures/incorrect_api_url.txt",
33
+ "test/fixtures/movie_casts.txt",
33
34
  "test/fixtures/movie_get_info.txt",
34
35
  "test/fixtures/movie_imdb_lookup.txt",
36
+ "test/fixtures/movie_posters.txt",
37
+ "test/fixtures/movie_releases.txt",
35
38
  "test/fixtures/movie_search.txt",
36
39
  "test/fixtures/person_get_info.txt",
37
40
  "test/fixtures/person_search.txt",
@@ -47,7 +50,7 @@ Gem::Specification.new do |s|
47
50
  s.homepage = "https://github.com/Irio/ruby-tmdb"
48
51
  s.rdoc_options = ["--line-numbers", "--inline-source"]
49
52
  s.require_paths = ["lib"]
50
- s.rubygems_version = "1.8.19"
53
+ s.rubygems_version = "1.8.24"
51
54
  s.summary = "An ActiveRecord-style API wrapper for TheMovieDB.org"
52
55
 
53
56
  if s.respond_to? :specification_version then
@@ -0,0 +1,15 @@
1
+ HTTP/1.1 200 OK
2
+ Server: nginx
3
+ Date: Mon, 23 Aug 2010 16:45:21 GMT
4
+ Content-Type: text/json; charset=utf-8
5
+ Transfer-Encoding: chunked
6
+ Connection: keep-alive
7
+ Keep-Alive: timeout=20
8
+ Status: 200 OK
9
+ Cache-Control: public, max-age=21600
10
+ X-Varnish: 2542127928 2542059531
11
+ Age: 1000
12
+ Via: 1.1 varnish
13
+ X-Cache: HIT
14
+
15
+ {"id":49517,"cast":[{"id":5472,"name":"Colin Firth","character":"Bill Haydon","order":0,"profile_path":"/gqcM1rKobitst1mZ999fRmXPjru.jpg"},{"id":2983,"name":"Mark Strong","character":"Jim Prideaux","order":1,"profile_path":"/vC1a35KBxx8f2rkMKyaik7bTOud.jpg"},{"id":2524,"name":"Tom Hardy","character":"Ricki Tarr","order":2,"profile_path":"/aYWIZ7ywOFzyK7B1HHCQj2nq8s4.jpg"},{"id":64,"name":"Gary Oldman","character":"George Smiley","order":3,"profile_path":"/kCWUeBkZ2sf8LObSpUFgRngawQb.jpg"},{"id":71580,"name":"Benedict Cumberbatch","character":"Peter Guillam","order":4,"profile_path":"/pFNkVEjlgls3e9r4PwKuN0VBLQN.jpg"},{"id":13014,"name":"Toby Jones","character":"Percy Alleline","order":5,"profile_path":"/8HDeyCbDzjeylqfDIIs8Bmv40vX.jpg"},{"id":93236,"name":"David Dencik","character":"Toby Esterhase","order":6,"profile_path":null},{"id":8785,"name":"Ciarán Hinds","character":"Roy Bland","order":7,"profile_path":"/8kOafsmtTjY5IxdDUAhFrHKALK5.jpg"},{"id":5049,"name":"John Hurt","character":"Control","order":8,"profile_path":"/zUQ7WL3xg9C532Aa8hftcJUnk9j.jpg"},{"id":42069,"name":"Zoltán Mucsi","character":"Magyar","order":9,"profile_path":"/z4S9Bg4f8gDvBtduEV3vdieHQey.jpg"},{"id":89645,"name":"Péter Kálloy Molnár","character":"Hungarian Waiter","order":10,"profile_path":null},{"id":933031,"name":"Ilona Kassai","character":"Woman in Window","order":11,"profile_path":null},{"id":82364,"name":"Imre Csuja","character":"KGB Agent","order":12,"profile_path":null},{"id":37759,"name":"Kathy Burke","character":"Connie Sachs","order":13,"profile_path":"/vqCHCywlp7HfoKBW6ZzCuQmnJx9.jpg"},{"id":1115,"name":"Stephen Graham","character":"Jerry Westerby","order":14,"profile_path":"/81VZiCA6w8nXG0UjqXCgSJare5N.jpg"},{"id":186275,"name":"Arthur Nightingale","character":"Bryant","order":15,"profile_path":null},{"id":16358,"name":"Simon McBurney","character":"Oliver Lacon","order":16,"profile_path":"/3SMFfBtmoDQncXBtICD61plB04W.jpg"},{"id":235837,"name":"Amanda Fairbank-Hynes","character":"Belinda","order":17,"profile_path":"/127xlkSaLK92NaYdStJQxWkqR1I.jpg"}],"crew":[{"id":74396,"name":"Tomas Alfredson","department":"Directing","job":"Director","profile_path":"/sRl6QzCtO7SlLspfFSvnv8u7ITi.jpg"},{"id":20422,"name":"John le Carré","department":"Writing","job":"Novel","profile_path":null},{"id":64814,"name":"Peter Straughan","department":"Writing","job":"Screenplay","profile_path":null},{"id":227094,"name":"Bridget O'Connor","department":"Writing","job":"Screenplay","profile_path":null}]}
@@ -12,4 +12,4 @@ Age: 1000
12
12
  Via: 1.1 varnish
13
13
  X-Cache: HIT
14
14
 
15
- {"adult":false,"backdrop_path":"/kftq445wZNaKEqJ9gXwYOIfI2p1.jpg","belongs_to_collection":{"id":188,"name":"Sin City","poster_path":"/mYxbfd8pZz9YTtEFRaOcQboOvMk.jpg","backdrop_path":"/wyey4NS4Z1z7293R8FFBETL6DSr.jpg"},"budget":40000000,"genres":[{"id":28,"name":"Action"},{"id":80,"name":"Crime"},{"id":18,"name":"Drama"},{"id":53,"name":"Thriller"}],"homepage":"http://www.sincitythemovie.com/","id":187,"imdb_id":"tt0401792","original_title":"Sin City","overview":"Sin City is a neo-noir crime thriller based on Frank Miller's graphic novel series of the same name.The film is primarily based on three of Miller's works: The Hard Goodbye, about a man who embarks on a brutal rampage in search of his one-time sweetheart's killer; The Big Fat Kill, which focuses on a street war between a group of prostitutes and a group of mercenaries; and That Yellow Bastard, which follows an aging police officer who protects a young woman from a grotesquely disfigured serial killer.","popularity":1993.887,"poster_path":"/eCJkepVJslq1nEtqURLaC1zLPAL.jpg","production_companies":[{"name":"Miramax Films","id":14}],"production_countries":[{"iso_3166_1":"US","name":"United States of America"}],"release_date":"2005-04-01","revenue":158733820,"runtime":124,"spoken_languages":[{"iso_639_1":"en","name":"English"}],"tagline":"There is no justice without sin.","title":"Sin City","vote_average":8.4,"vote_count":59}
15
+ {"adult":false,"backdrop_path":"/hqLNDL7ugQzAbK79uvzjIkmfDN2.jpg","belongs_to_collection":{"id":86311,"name":"The Avengers Theatrical Movie Collection","poster_path":"/hiLkVTP34V24JtzOQ22r7Uu8eMc.jpg","backdrop_path":"/xCbb3hIID1AnEOBxPzsnBXG3n2h.jpg"},"budget":140000000,"genres":[{"id":28,"name":"Action"},{"id":12,"name":"Adventure"},{"id":878,"name":"Science Fiction"},{"id":53,"name":"Thriller"}],"homepage":"http://www.ironmanmovie.com/","id":1726,"imdb_id":"tt0371746","original_title":"Iron Man","overview":"After escaping from kidnappers using makeshift power armor, an ultrarich inventor and weapons maker turns his creation into a force for good by using it to fight crime. But his skills are stretched to the limit when he must face the evil Iron Monger.","popularity":68803.606,"poster_path":"/s2IG9qXfhJYxIttKyroYFBsHwzQ.jpg","production_companies":[{"name":"Marvel Studios","id":420}],"production_countries":[{"iso_3166_1":"US","name":"United States of America"}],"release_date":"2008-05-02","revenue":585174222,"runtime":126,"spoken_languages":[{"iso_639_1":"en","name":"English"}],"tagline":"Heroes aren't born. They're built.","title":"Iron Man","vote_average":8.4,"vote_count":103}
@@ -12,4 +12,4 @@ Age: 0
12
12
  Via: 1.1 varnish
13
13
  X-Cache: MISS
14
14
 
15
- {"adult":false,"backdrop_path":"/kftq445wZNaKEqJ9gXwYOIfI2p1.jpg","belongs_to_collection":{"id":188,"name":"Sin City","poster_path":"/mYxbfd8pZz9YTtEFRaOcQboOvMk.jpg","backdrop_path":"/wyey4NS4Z1z7293R8FFBETL6DSr.jpg"},"budget":40000000,"genres":[{"id":28,"name":"Action"},{"id":80,"name":"Crime"},{"id":18,"name":"Drama"},{"id":53,"name":"Thriller"}],"homepage":"http://www.sincitythemovie.com/","id":187,"imdb_id":"tt0401792","original_title":"Sin City","overview":"Sin City is a neo-noir crime thriller based on Frank Miller's graphic novel series of the same name.The film is primarily based on three of Miller's works: The Hard Goodbye, about a man who embarks on a brutal rampage in search of his one-time sweetheart's killer; The Big Fat Kill, which focuses on a street war between a group of prostitutes and a group of mercenaries; and That Yellow Bastard, which follows an aging police officer who protects a young woman from a grotesquely disfigured serial killer.","popularity":1993.887,"poster_path":"/eCJkepVJslq1nEtqURLaC1zLPAL.jpg","production_companies":[{"name":"Miramax Films","id":14}],"production_countries":[{"iso_3166_1":"US","name":"United States of America"}],"release_date":"2005-04-01","revenue":158733820,"runtime":124,"spoken_languages":[{"iso_639_1":"en","name":"English"}],"tagline":"There is no justice without sin.","title":"Sin City","vote_average":8.4,"vote_count":59}
15
+ {"adult":false,"backdrop_path":"/hqLNDL7ugQzAbK79uvzjIkmfDN2.jpg","belongs_to_collection":{"id":86311,"name":"The Avengers Theatrical Movie Collection","poster_path":"/hiLkVTP34V24JtzOQ22r7Uu8eMc.jpg","backdrop_path":"/xCbb3hIID1AnEOBxPzsnBXG3n2h.jpg"},"budget":140000000,"genres":[{"id":28,"name":"Action"},{"id":12,"name":"Adventure"},{"id":878,"name":"Science Fiction"},{"id":53,"name":"Thriller"}],"homepage":"http://www.ironmanmovie.com/","id":1726,"imdb_id":"tt0371746","original_title":"Iron Man","overview":"After escaping from kidnappers using makeshift power armor, an ultrarich inventor and weapons maker turns his creation into a force for good by using it to fight crime. But his skills are stretched to the limit when he must face the evil Iron Monger.","popularity":68803.606,"poster_path":"/s2IG9qXfhJYxIttKyroYFBsHwzQ.jpg","production_companies":[{"name":"Marvel Studios","id":420}],"production_countries":[{"iso_3166_1":"US","name":"United States of America"}],"release_date":"2008-05-02","revenue":585174222,"runtime":126,"spoken_languages":[{"iso_639_1":"en","name":"English"}],"tagline":"Heroes aren't born. They're built.","title":"Iron Man","vote_average":8.4,"vote_count":103}
@@ -0,0 +1,15 @@
1
+ HTTP/1.1 200 OK
2
+ Server: nginx
3
+ Date: Mon, 23 Aug 2010 16:45:21 GMT
4
+ Content-Type: text/json; charset=utf-8
5
+ Transfer-Encoding: chunked
6
+ Connection: keep-alive
7
+ Keep-Alive: timeout=20
8
+ Status: 200 OK
9
+ Cache-Control: public, max-age=21600
10
+ X-Varnish: 2542127928 2542059531
11
+ Age: 1000
12
+ Via: 1.1 varnish
13
+ X-Cache: HIT
14
+
15
+ {"id":49517,"backdrops":[{"file_path":"/4rYvCgyPx8eOEMLSaeuDOPdyQvB.jpg","width":1280,"height":720,"iso_639_1":null,"aspect_ratio":1.78,"vote_average":8.0,"vote_count":3},{"file_path":"/jFhMjUmxSEh9vKMgHiViEqQCmiM.jpg","width":1280,"height":720,"iso_639_1":null,"aspect_ratio":1.78,"vote_average":7.5,"vote_count":1},{"file_path":"/lRrYvUwR2vwxR6Fs8PKWIOSVLkp.jpg","width":1920,"height":1080,"iso_639_1":null,"aspect_ratio":1.78,"vote_average":6.75,"vote_count":2},{"file_path":"/97ib91kLwDlyB31pbqPtVYLzr2N.jpg","width":1600,"height":900,"iso_639_1":null,"aspect_ratio":1.78,"vote_average":6.625,"vote_count":4},{"file_path":"/5oS5Qx6yAkdQCzLMXl5BQSCFhBI.jpg","width":1920,"height":1080,"iso_639_1":null,"aspect_ratio":1.78,"vote_average":6.5,"vote_count":5},{"file_path":"/dk6vIA6sWY11YHqIZWVlnp3CUhK.jpg","width":1920,"height":1080,"iso_639_1":null,"aspect_ratio":1.78,"vote_average":6.1,"vote_count":5},{"file_path":"/9M7aadoZIM1Atz3tToDjxJ6EJGa.jpg","width":1280,"height":720,"iso_639_1":null,"aspect_ratio":1.78,"vote_average":5.833333333333333,"vote_count":6},{"file_path":"/kP09gF5nPu3OTIrhrl2x0w2LUD8.jpg","width":1280,"height":720,"iso_639_1":null,"aspect_ratio":1.78,"vote_average":5.5,"vote_count":1},{"file_path":"/eDidONF03foKowW6MxJz7LTrLd1.jpg","width":1280,"height":720,"iso_639_1":null,"aspect_ratio":1.78,"vote_average":5.166666666666667,"vote_count":3},{"file_path":"/68Hkre0dyPaz1FYEHvYWV3HoVM1.jpg","width":1920,"height":1080,"iso_639_1":null,"aspect_ratio":1.78,"vote_average":4.5,"vote_count":2},{"file_path":"/cXrJJLDQLKS5wsMjG4wS00tJ3Dn.jpg","width":1280,"height":720,"iso_639_1":null,"aspect_ratio":1.78,"vote_average":4.0,"vote_count":1},{"file_path":"/cbcOWRsiMcAXGMxOu6klv4B20mp.jpg","width":1920,"height":1080,"iso_639_1":null,"aspect_ratio":1.78,"vote_average":3.0,"vote_count":1},{"file_path":"/8enB6zxS4ZoOoQ52TveIgJNEnAa.jpg","width":1280,"height":720,"iso_639_1":null,"aspect_ratio":1.78,"vote_average":2.5,"vote_count":1},{"file_path":"/i1Kl77Z2Gio4ZEVZOMLjxWhBHtI.jpg","width":1920,"height":1080,"iso_639_1":null,"aspect_ratio":1.78,"vote_average":2.0,"vote_count":1},{"file_path":"/me1lCjal7vHNN5J0OefN5wmaNpp.jpg","width":1920,"height":1080,"iso_639_1":null,"aspect_ratio":1.78,"vote_average":2.0,"vote_count":1},{"file_path":"/wCcvWWzFUSQw1dUshp53wd71eKk.jpg","width":1920,"height":1080,"iso_639_1":null,"aspect_ratio":1.78,"vote_average":2.0,"vote_count":1},{"file_path":"/7mrdovWse6N66LC1XqlvkLsE2sP.jpg","width":1920,"height":1080,"iso_639_1":null,"aspect_ratio":1.78,"vote_average":2.0,"vote_count":1},{"file_path":"/l7N9SraMyj7MtGacoGnuR0bTJNG.jpg","width":1920,"height":1080,"iso_639_1":null,"aspect_ratio":1.78,"vote_average":2.0,"vote_count":1},{"file_path":"/eEKCDuZAsnugIBsksNTsPjnvI4x.jpg","width":1280,"height":720,"iso_639_1":null,"aspect_ratio":1.78,"vote_average":2.0,"vote_count":1},{"file_path":"/4smv3B2gorWogu5ahMJTAjG7QG1.jpg","width":1280,"height":720,"iso_639_1":null,"aspect_ratio":1.78,"vote_average":1.0,"vote_count":1},{"file_path":"/okvKba6NLBW78K5UT0qtL0wwy4K.jpg","width":1280,"height":720,"iso_639_1":null,"aspect_ratio":1.78,"vote_average":0.0,"vote_count":0},{"file_path":"/ugaaNPbKF2sQAqzIOhlnSpkNpRx.jpg","width":1280,"height":720,"iso_639_1":null,"aspect_ratio":1.78,"vote_average":0.0,"vote_count":0},{"file_path":"/6y5YQMb38aTNdAi6Li9SWtXm2IG.jpg","width":1920,"height":1080,"iso_639_1":null,"aspect_ratio":1.78,"vote_average":0.0,"vote_count":0}],"posters":[{"file_path":"/2N3P730TYXEcNL0BO8WBuMc6yJz.jpg","width":1000,"height":1500,"iso_639_1":"en","aspect_ratio":0.67,"vote_average":7.5,"vote_count":8},{"file_path":"/xXkkNXJRGEHD0QjPjHgaTtuhbZV.jpg","width":4051,"height":6001,"iso_639_1":"en","aspect_ratio":0.68,"vote_average":7.35,"vote_count":20},{"file_path":"/ggu2lYqxSAObuK82wk1TmEyyWGr.jpg","width":1000,"height":1500,"iso_639_1":"en","aspect_ratio":0.67,"vote_average":6.809523809523809,"vote_count":21},{"file_path":"/u2HlQA0VFeeNBfHesLSPoWZodwe.jpg","width":1131,"height":1600,"iso_639_1":"en","aspect_ratio":0.71,"vote_average":6.690476190476191,"vote_count":21},{"file_path":"/imDQdA47IfWOL13BiRLyDu6Q2b1.jpg","width":800,"height":1200,"iso_639_1":"ru","aspect_ratio":0.67,"vote_average":5.25,"vote_count":4},{"file_path":"/3sjSl5uaNLeIa7fySK5Cz1fF5Fz.jpg","width":1400,"height":2240,"iso_639_1":"en","aspect_ratio":0.63,"vote_average":5.125,"vote_count":8},{"file_path":"/ypCnGGSgIS93aLx0GcL8DPUbTZX.jpg","width":740,"height":1046,"iso_639_1":"de","aspect_ratio":0.71,"vote_average":4.5,"vote_count":3},{"file_path":"/49ohCbedmB4S1IgpN09Fv08B5Bf.jpg","width":420,"height":600,"iso_639_1":"it","aspect_ratio":0.7,"vote_average":4.125,"vote_count":4},{"file_path":"/aADb4oVjxeTujuisL7S25Ge4J0z.jpg","width":1181,"height":1757,"iso_639_1":"pt","aspect_ratio":0.67,"vote_average":3.75,"vote_count":2},{"file_path":"/xSFqKRbhXWMOsbDMqljwntJekue.jpg","width":1012,"height":1500,"iso_639_1":"en","aspect_ratio":0.67,"vote_average":2.4,"vote_count":5},{"file_path":"/t2gAZJuTZGTbMP4ymXyVFVmhh7R.jpg","width":1012,"height":1500,"iso_639_1":"en","aspect_ratio":0.67,"vote_average":2.0,"vote_count":4},{"file_path":"/dVaaL1NwEgKXcmlMxIOab49iuya.jpg","width":1455,"height":2081,"iso_639_1":"hu","aspect_ratio":0.7,"vote_average":1.0,"vote_count":1},{"file_path":"/5rONpcG54LqtDFcLrRrfbeUilto.jpg","width":1013,"height":1500,"iso_639_1":"en","aspect_ratio":0.68,"vote_average":0.5,"vote_count":2},{"file_path":"/1fudfIPnLOFl7jJFsRYbOPisoV6.jpg","width":1500,"height":2000,"iso_639_1":"fr","aspect_ratio":0.75,"vote_average":0.0,"vote_count":0},{"file_path":"/ozKFQ9uCyxqGxeYfJfrwkPq93r9.jpg","width":800,"height":1200,"iso_639_1":"en","aspect_ratio":0.67,"vote_average":0.0,"vote_count":0},{"file_path":"/5msUg8U2S64eFBhaVfziLpnlc2i.jpg","width":423,"height":630,"iso_639_1":"da","aspect_ratio":0.67,"vote_average":0.0,"vote_count":0},{"file_path":"/tHvYtrRU9iORz96GYlxqk98FTSN.jpg","width":458,"height":660,"iso_639_1":"es","aspect_ratio":0.69,"vote_average":0.0,"vote_count":0},{"file_path":"/qwzs6DKqb00aD7GkNbyCEQQ1CES.jpg","width":600,"height":800,"iso_639_1":"fr","aspect_ratio":0.75,"vote_average":0.0,"vote_count":0}]}
@@ -0,0 +1,15 @@
1
+ HTTP/1.1 200 OK
2
+ Server: nginx
3
+ Date: Mon, 23 Aug 2010 16:45:21 GMT
4
+ Content-Type: text/json; charset=utf-8
5
+ Transfer-Encoding: chunked
6
+ Connection: keep-alive
7
+ Keep-Alive: timeout=20
8
+ Status: 200 OK
9
+ Cache-Control: public, max-age=21600
10
+ X-Varnish: 2542127928 2542059531
11
+ Age: 1000
12
+ Via: 1.1 varnish
13
+ X-Cache: HIT
14
+
15
+ {"id":49517,"countries":[{"iso_3166_1":"GB","certification":"15","release_date":"2011-09-16"},{"iso_3166_1":"US","certification":"R","release_date":"2011-12-09"},{"iso_3166_1":"IE","certification":"","release_date":"2011-09-16"},{"iso_3166_1":"AU","certification":"","release_date":"2011-10-27"},{"iso_3166_1":"DE","certification":"12","release_date":"2011-11-10"},{"iso_3166_1":"SE","certification":"","release_date":"2011-12-25"},{"iso_3166_1":"FR","certification":"","release_date":"2012-02-08"},{"iso_3166_1":"HU","certification":"16 éven aluliak számára nem ajánlott","release_date":"2012-01-26"},{"iso_3166_1":"CZ","certification":"","release_date":"2012-02-02"},{"iso_3166_1":"PT","certification":"M12","release_date":"2011-12-22"},{"iso_3166_1":"IT","certification":"","release_date":"2011-09-05"},{"iso_3166_1":"AT","certification":"","release_date":"2012-02-02"}]}
@@ -2,9 +2,9 @@ begin
2
2
  file_path = File.absolute_path('tmdb_api_key.txt', File.dirname(__FILE__))
3
3
 
4
4
  File.open(file_path) do |file|
5
- Tmdb.api_key = file.read
5
+ Tmdb.api_key = file.read.chomp
6
6
  end
7
7
  rescue Errno::ENOENT => e
8
8
  $stderr.puts "You need place your api key in #{file_path}"
9
9
  exit
10
- end
10
+ end
@@ -2,27 +2,39 @@ def register_api_url_stubs
2
2
  unless(TEST_LIVE_API)
3
3
 
4
4
  File.open(File.join(File.dirname(__FILE__), "..", "fixtures", "movie_search.txt")) do |file|
5
- stub_request(:get, Regexp.new(Tmdb.base_api_url + "search/movie" + ".*")).to_return(file)
5
+ stub_request(:get, Regexp.new(Tmdb.base_api_url + "/search/movie" + ".*")).to_return(file)
6
6
  end
7
7
 
8
8
  File.open(File.join(File.dirname(__FILE__), "..", "fixtures", "movie_get_info.txt")) do |file|
9
- stub_request(:get, Regexp.new(Tmdb.base_api_url + "movie/" + ".*")).to_return(file)
9
+ stub_request(:get, Regexp.new(Tmdb.base_api_url + "/movie/" + ".*")).to_return(file)
10
+ end
11
+
12
+ File.open(File.join(File.dirname(__FILE__), "..", "fixtures", "movie_posters.txt")) do |file|
13
+ stub_request(:get, Regexp.new(Tmdb.base_api_url + '/movie/\d+/images')).to_return(file)
14
+ end
15
+
16
+ File.open(File.join(File.dirname(__FILE__), "..", "fixtures", "movie_releases.txt")) do |file|
17
+ stub_request(:get, Regexp.new(Tmdb.base_api_url + '/movie/\d+/releases')).to_return(file)
18
+ end
19
+
20
+ File.open(File.join(File.dirname(__FILE__), "..", "fixtures", "movie_casts.txt")) do |file|
21
+ stub_request(:get, Regexp.new(Tmdb.base_api_url + '/movie/\d+/casts')).to_return(file)
10
22
  end
11
23
 
12
24
  File.open(File.join(File.dirname(__FILE__), "..", "fixtures", "movie_imdb_lookup.txt")) do |file|
13
- stub_request(:get, Regexp.new(Tmdb.base_api_url + "movie/tt" + ".*")).to_return(file)
25
+ stub_request(:get, Regexp.new(Tmdb.base_api_url + "/movie/tt" + ".*")).to_return(file)
14
26
  end
15
27
 
16
28
  File.open(File.join(File.dirname(__FILE__), "..", "fixtures", "person_get_info.txt")) do |file|
17
- stub_request(:get, Regexp.new(Tmdb.base_api_url + "person/" + ".*")).to_return(file)
29
+ stub_request(:get, Regexp.new(Tmdb.base_api_url + "/person/" + ".*")).to_return(file)
18
30
  end
19
31
 
20
32
  File.open(File.join(File.dirname(__FILE__), "..", "fixtures", "person_search.txt")) do |file|
21
- stub_request(:get, Regexp.new(Tmdb.base_api_url + "search/person" + ".*")).to_return(file)
33
+ stub_request(:get, Regexp.new(Tmdb.base_api_url + "/search/person" + ".*")).to_return(file)
22
34
  end
23
35
 
24
36
  File.open(File.join(File.dirname(__FILE__), "..", "fixtures", "incorrect_api_url.txt")) do |file|
25
- stub_request(:get, Regexp.new(Tmdb.base_api_url + "Movie.blarg/" + ".*")).to_return(file)
37
+ stub_request(:get, Regexp.new(Tmdb.base_api_url + "/Movie.blarg/" + ".*")).to_return(file)
26
38
  end
27
39
 
28
40
  File.open(File.join(File.dirname(__FILE__), "..", "fixtures", "example_com.txt")) do |file|
@@ -43,4 +55,4 @@ def register_api_url_stubs
43
55
 
44
56
  stub_request(:get, 'http://thisisaurlthatdoesntexist.co.nz').to_return(:body => "", :status => 404, :headers => {'content-length' => 0})
45
57
  end
46
- end
58
+ end
@@ -35,8 +35,8 @@ class TmdbMovieTest < Test::Unit::TestCase
35
35
  end
36
36
 
37
37
  test "find by title should return the full movie data when expand_results set to true" do
38
- movie = TmdbMovie.find(:title => "Sin City", :limit => 1, :expand_results => true)
39
- assert_movie_methodized(movie, 187)
38
+ movie = TmdbMovie.find(:title => "Iron Man", :limit => 1, :expand_results => true)
39
+ assert_movie_methodized(movie, 1726)
40
40
  end
41
41
 
42
42
  test "should raise exception if no arguments supplied to find" do
@@ -105,7 +105,10 @@ class TmdbMovieTest < Test::Unit::TestCase
105
105
  end
106
106
 
107
107
  test "TmdbMovie.new should raise error if supplied with raw data for movie that doesn't exist" do
108
- Tmdb.expects(:api_call).with("movie", {id: "999999999999"}, nil).returns(nil)
108
+ Tmdb.expects(:api_call).with("movie", {id: 999999999999}, nil).returns(nil)
109
+ Tmdb.expects(:api_call).with("movie/images", {id: 999999999999}, nil).returns(nil)
110
+ Tmdb.expects(:api_call).with("movie/releases", {id: 999999999999}, nil).returns(nil)
111
+ Tmdb.expects(:api_call).with("movie/casts", {id: 999999999999}, nil).returns(nil)
109
112
  assert_raise ArgumentError do
110
113
  TmdbMovie.new({"id" => 999999999999}, true)
111
114
  end
@@ -155,4 +158,4 @@ class TmdbMovieTest < Test::Unit::TestCase
155
158
  end
156
159
  end
157
160
 
158
- end
161
+ end
@@ -31,7 +31,7 @@ class TmdbTest < Test::Unit::TestCase
31
31
  end
32
32
 
33
33
  test "should return base API url" do
34
- assert_equal "http://api.themoviedb.org/3/", Tmdb.base_api_url
34
+ assert_equal "http://api.themoviedb.org/3", Tmdb.base_api_url
35
35
  end
36
36
 
37
37
  test "get url returns a response object" do
@@ -48,7 +48,7 @@ class TmdbTest < Test::Unit::TestCase
48
48
  method = "search/movie"
49
49
  data = "hello"
50
50
  Tmdb.default_language = "es"
51
- url = Tmdb.base_api_url + method + '?api_key=' + Tmdb.api_key + '&language=' + Tmdb.default_language + '&query=' + CGI::escape(data.to_s)
51
+ url = Tmdb.base_api_url + '/' + method + '?api_key=' + Tmdb.api_key + '&language=' + Tmdb.default_language + '&query=' + CGI::escape(data.to_s)
52
52
  mock_response = stub(:code => "200", :body => '{"page":1,"results":[],"total_pages":0,"total_results":0}')
53
53
  Tmdb.expects(:get_url).with(url).returns(mock_response)
54
54
  Tmdb.api_call(method, {query: data})
@@ -58,7 +58,7 @@ class TmdbTest < Test::Unit::TestCase
58
58
  method = "movie"
59
59
  data = "hello"
60
60
  language = "blah"
61
- url = Tmdb.base_api_url + method + "?api_key=" + Tmdb.api_key + "&language=" + language + '&query=' + CGI::escape(data.to_s)
61
+ url = Tmdb.base_api_url + '/' + method + "?api_key=" + Tmdb.api_key + "&language=" + language + '&query=' + CGI::escape(data.to_s)
62
62
  mock_response = stub(:code => "200", :body => '{"page":1,"results":[],"total_pages":0,"total_results":0}')
63
63
  Tmdb.expects(:get_url).with(url).returns(mock_response)
64
64
  Tmdb.api_call(method, {query: data}, language)
@@ -92,6 +92,14 @@ class TmdbTest < Test::Unit::TestCase
92
92
  assert_not_nil result[item]
93
93
  end
94
94
  end
95
+
96
+ test "should perform movie API call with an action and return a single result" do
97
+ result = Tmdb.api_call("movie/images", {id: "187"})
98
+ assert_kind_of Hash, result
99
+ %w(posters id).each do |item|
100
+ assert_not_nil result[item]
101
+ end
102
+ end
95
103
 
96
104
  test "should perform Movie.imdbLookup API call and return a single result" do
97
105
  result = Tmdb.api_call("movie", {id: "tt0401792"})
@@ -165,9 +173,7 @@ class TmdbTest < Test::Unit::TestCase
165
173
  test_data = {
166
174
  "backdrops" => [
167
175
  {
168
- "image" => {
169
- :test => 1
170
- }
176
+ :test => 1
171
177
  }
172
178
  ]
173
179
  }
@@ -177,4 +183,4 @@ class TmdbTest < Test::Unit::TestCase
177
183
  end
178
184
  end
179
185
 
180
- end
186
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ruby-tmdb3
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.3.1
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2012-06-19 00:00:00.000000000 Z
13
+ date: 2012-07-11 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: deepopenstruct
@@ -97,8 +97,11 @@ files:
97
97
  - test/fixtures/example_com.txt
98
98
  - test/fixtures/image.jpg
99
99
  - test/fixtures/incorrect_api_url.txt
100
+ - test/fixtures/movie_casts.txt
100
101
  - test/fixtures/movie_get_info.txt
101
102
  - test/fixtures/movie_imdb_lookup.txt
103
+ - test/fixtures/movie_posters.txt
104
+ - test/fixtures/movie_releases.txt
102
105
  - test/fixtures/movie_search.txt
103
106
  - test/fixtures/person_get_info.txt
104
107
  - test/fixtures/person_search.txt