enceladus 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (53) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +23 -0
  3. data/.rspec +1 -0
  4. data/.ruby-gemset +1 -0
  5. data/.ruby-version +1 -0
  6. data/.travis.yml +4 -0
  7. data/Gemfile +4 -0
  8. data/LICENSE.txt +22 -0
  9. data/README.md +36 -0
  10. data/Rakefile +2 -0
  11. data/enceladus.gemspec +29 -0
  12. data/lib/enceladus/configuration/api.rb +60 -0
  13. data/lib/enceladus/configuration/image.rb +83 -0
  14. data/lib/enceladus/exceptions.rb +5 -0
  15. data/lib/enceladus/models/account.rb +143 -0
  16. data/lib/enceladus/models/api_paginated_collection.rb +76 -0
  17. data/lib/enceladus/models/api_resource.rb +25 -0
  18. data/lib/enceladus/models/cast.rb +9 -0
  19. data/lib/enceladus/models/genre.rb +4 -0
  20. data/lib/enceladus/models/guest_account.rb +15 -0
  21. data/lib/enceladus/models/movie.rb +162 -0
  22. data/lib/enceladus/models/movie_collection.rb +3 -0
  23. data/lib/enceladus/models/production_company.rb +4 -0
  24. data/lib/enceladus/models/production_country.rb +4 -0
  25. data/lib/enceladus/models/release.rb +4 -0
  26. data/lib/enceladus/models/spoken_language.rb +4 -0
  27. data/lib/enceladus/models/you_tube_trailer.rb +9 -0
  28. data/lib/enceladus/requester.rb +68 -0
  29. data/lib/enceladus/version.rb +3 -0
  30. data/lib/enceladus.rb +43 -0
  31. data/spec/enceladus/configuration/api_spec.rb +59 -0
  32. data/spec/enceladus/configuration/image_spec.rb +200 -0
  33. data/spec/enceladus/enceladus_spec.rb +53 -0
  34. data/spec/enceladus/models/account_spec.rb +176 -0
  35. data/spec/enceladus/models/cast_spec.rb +18 -0
  36. data/spec/enceladus/models/guest_account_spec.rb +19 -0
  37. data/spec/enceladus/models/movie_collection_spec.rb +217 -0
  38. data/spec/enceladus/models/movie_spec.rb +469 -0
  39. data/spec/enceladus/models/you_tube_trailer_spec.rb +16 -0
  40. data/spec/spec_helper.rb +20 -0
  41. data/spec/support/responses/account_response.rb +27 -0
  42. data/spec/support/responses/authentication_response.rb +19 -0
  43. data/spec/support/responses/configuration_response.rb +32 -0
  44. data/spec/support/responses/credits_collection_response.rb +19 -0
  45. data/spec/support/responses/credits_response.rb +29 -0
  46. data/spec/support/responses/error_response.rb +12 -0
  47. data/spec/support/responses/guest_account_response.rb +21 -0
  48. data/spec/support/responses/movie_collection_resource_response.rb +36 -0
  49. data/spec/support/responses/movie_collection_response.rb +20 -0
  50. data/spec/support/responses/movie_response.rb +67 -0
  51. data/spec/support/responses/request_token_response.rb +21 -0
  52. data/spec/support/responses/session_response.rb +19 -0
  53. metadata +239 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 5b09cdfa657d7ec3ce55c576659efe6f9333a840
4
+ data.tar.gz: ae3a1efb9ca54af43cacc201f5f5c5a0b65131ca
5
+ SHA512:
6
+ metadata.gz: 590d5b2c90c8d7d3461b8c1cf676497fc3e83d9fc102bbfe8624085522ad17739cd306ac6d327c58e0dc165f76375a3531bc8710723141509252dba32c5fd70f
7
+ data.tar.gz: c28b5c3bf39217ec32f3dd2dbf0d2f6884a3ce837890f2dcb025150b0355744f0a0973540a36f047cb76577a7b0227a7f0a8be3b1ec7742bc76e1567eaf48da4
data/.gitignore ADDED
@@ -0,0 +1,23 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
18
+ *.bundle
19
+ *.so
20
+ *.o
21
+ *.a
22
+ mkmf.log
23
+ run.rb
data/.rspec ADDED
@@ -0,0 +1 @@
1
+ --colour --format doc --order random
data/.ruby-gemset ADDED
@@ -0,0 +1 @@
1
+ enceladus
data/.ruby-version ADDED
@@ -0,0 +1 @@
1
+ ruby 2.1.2
data/.travis.yml ADDED
@@ -0,0 +1,4 @@
1
+ language: ruby
2
+ script: "bundle exec rspec"
3
+ rvm:
4
+ - 2.1.1
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in enceladus.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2014 Vinicius Osiro
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,36 @@
1
+ # Enceladus
2
+
3
+ [![Code Climate](https://codeclimate.com/github/osiro/enceladus/badges/gpa.svg)](https://codeclimate.com/github/osiro/enceladus)
4
+ [![Build Status](https://travis-ci.org/osiro/enceladus.svg?branch=master)](https://travis-ci.org/osiro/enceladus)
5
+ [![Coverage Status](https://coveralls.io/repos/osiro/enceladus/badge.png?branch=master)](https://coveralls.io/r/osiro/enceladus?branch=master)
6
+ [![Dependency Status](https://gemnasium.com/osiro/enceladus.svg)](https://gemnasium.com/osiro/enceladus)
7
+
8
+ A ruby wrapper for [TMDb](www.themoviedb.org).
9
+
10
+ | [Wiki](https://github.com/osiro/enceladus/wiki) | [Documentation](http://www.rubydoc.info/github/osiro/enceladus/master/frames) |
11
+
12
+ ## Installation
13
+
14
+ Add this line to your application's Gemfile:
15
+
16
+ gem 'enceladus'
17
+
18
+ And then execute:
19
+
20
+ $ bundle
21
+
22
+ Or install it yourself as:
23
+
24
+ $ gem install enceladus
25
+
26
+ ## Usage
27
+
28
+ Have a look at some [usage examples](https://github.com/osiro/enceladus/wiki/Usage) and check out the [docs](http://www.rubydoc.info/github/osiro/enceladus/master/frames) too.
29
+
30
+ ## Contributing
31
+
32
+ 1. Fork it ( https://github.com/osiro/enceladus/fork )
33
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
34
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
35
+ 4. Push to the branch (`git push origin my-new-feature`)
36
+ 5. Create a new Pull Request
data/Rakefile ADDED
@@ -0,0 +1,2 @@
1
+ require "bundler/gem_tasks"
2
+
data/enceladus.gemspec ADDED
@@ -0,0 +1,29 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'enceladus/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "enceladus"
8
+ spec.version = Enceladus::VERSION
9
+ spec.authors = ["Vinicius Osiro"]
10
+ spec.email = ["vinicius.osiro@gmail.com"]
11
+ spec.summary = "Ruby wrapper for the The Movie Database API v3"
12
+ spec.description = "Ruby wrapper for the The Movie Database API for all endpoints of v3"
13
+ spec.homepage = "https://github.com/osiro/enceladus"
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
+
21
+
22
+ spec.add_dependency "rest-client", "~> 1.7.2", '>= 1.7.2'
23
+ spec.add_development_dependency "bundler", "~> 1.6"
24
+ spec.add_development_dependency "rake", "~> 10.1 "
25
+ spec.add_development_dependency "byebug", "~> 3.0"
26
+ spec.add_development_dependency 'rspec', '~> 3.0', '>= 3.0.0'
27
+ spec.add_development_dependency 'webmock', '~> 1.18', '>= 1.18.0'
28
+ spec.add_development_dependency 'coveralls', '~> 0.7.1', '>= 0.7.0'
29
+ end
@@ -0,0 +1,60 @@
1
+ require 'singleton'
2
+ require 'uri'
3
+
4
+ module Enceladus::Configuration
5
+ class Api
6
+ include Singleton
7
+
8
+ attr_reader :base_url, :version, :api_key
9
+ attr_accessor :include_adult
10
+
11
+ def initialize #:nodoc:#
12
+ self.base_url = "https://api.themoviedb.org".freeze
13
+ self.version = "3".freeze
14
+ self.include_adult = false
15
+ end
16
+
17
+ # Fetches the TMDb account configuration.
18
+ # This method hits the following TMDb endpoints:
19
+ # - https://api.themoviedb.org/3/configuration
20
+ #
21
+ # Once the request has succeeded, Enceladus will populate the following Enceladus::Configuration::Image attributes:
22
+ # base_url, secure_base_url, backdrop_sizes, logo_sizes, poster_sizes, profile_sizes and still_sizes.
23
+ #
24
+ # A failing request will reset/nullify all those mentioned attributes.
25
+ #
26
+ # Return a boolean indicating whether the request has succeeded or not.
27
+ #
28
+ # Examples:
29
+ #
30
+ # Enceladus::Configuration::Api.instance.connect("cceebf51cb1f8d707d10a132d9544b76")
31
+ #
32
+ def connect(api_key)
33
+ begin
34
+ self.api_key = api_key
35
+ Enceladus::Configuration::Image.instance.setup!
36
+ true
37
+ rescue Enceladus::Exception::Api
38
+ self.api_key = nil
39
+ Enceladus::Configuration::Image.instance.reset!
40
+ false
41
+ end
42
+ end
43
+
44
+ # Returns a string with a URL for one of TMDb API endpoints.
45
+ # Examples:
46
+ #
47
+ # Enceladus::Configuration::Api.instance.url_for("movies", { term: "Lola Benvenutti" })
48
+ # => https://api.themoviedb.org/3/movies?term=Lola+Benvenutti&api_key=token
49
+ #
50
+ def url_for(action, params={})
51
+ params[:api_key] = api_key
52
+ url = URI.join(base_url, "/#{version}/", action)
53
+ url.query = URI.encode_www_form(params)
54
+ url.to_s
55
+ end
56
+
57
+ private
58
+ attr_writer :base_url, :version, :api_key
59
+ end
60
+ end
@@ -0,0 +1,83 @@
1
+ require 'singleton'
2
+
3
+ module Enceladus::Configuration
4
+ class Image
5
+ include Singleton
6
+
7
+ attr_reader :base_url, :secure_base_url, :backdrop_sizes, :logo_sizes, :poster_sizes, :profile_sizes, :still_sizes
8
+ attr_accessor :include_image_language
9
+
10
+ def initialize #:nodoc:#
11
+ reset!
12
+ end
13
+
14
+ # Fetches the TMDb account's configuration data.
15
+ # This method hits the following TMDb endpoints:
16
+ # - https://api.themoviedb.org/3/configuration
17
+ #
18
+ def setup!
19
+ configuration = Enceladus::Requester.get("configuration").images
20
+ self.base_url = configuration.base_url.freeze
21
+ self.secure_base_url = configuration.secure_base_url.freeze
22
+ self.backdrop_sizes = configuration.backdrop_sizes.map(&:freeze).freeze
23
+ self.logo_sizes = configuration.logo_sizes.map(&:freeze).freeze
24
+ self.poster_sizes = configuration.poster_sizes.map(&:freeze).freeze
25
+ self.profile_sizes = configuration.profile_sizes.map(&:freeze).freeze
26
+ self.still_sizes = configuration.still_sizes.map(&:freeze).freeze
27
+ self
28
+ end
29
+
30
+ # Reset or nullify all image configurations.
31
+ #
32
+ def reset!
33
+ self.base_url = nil
34
+ self.secure_base_url = nil
35
+ self.backdrop_sizes = []
36
+ self.logo_sizes = []
37
+ self.logo_sizes = []
38
+ self.poster_sizes = []
39
+ self.profile_sizes = []
40
+ self.still_sizes = []
41
+ self
42
+ end
43
+
44
+ # Returns an array of strings containing URL's for movie/person/tv assets.
45
+ # Be aware to setup the configuration beforehand, by running:
46
+ #
47
+ # Enceladus::Configuration::Image.instance.setup!
48
+ #
49
+ # The following arguments are necessary:
50
+ # - type: the type of asset you're providing, must be one of "backdrop", "logo", "poster" or "profile".
51
+ # - image_path: /gWyevEz9NT5tON6kdhxsmfvdJ40.jpg
52
+ #
53
+ # Examples:
54
+ #
55
+ # Enceladus::Configuration::Image.instance.url_for("backdrop", )
56
+ # => ["http://image.tmdb.org/t/p/w300/gWyevEz9NT5tON6kdhxsmfvdJ40.jpg", "http://image.tmdb.org/t/p/w780/gWyevEz9NT5tON6kdhxsmfvdJ40.jpg", "http://image.tmdb.org/t/p/w1280/gWyevEz9NT5tON6kdhxsmfvdJ40.jpg", "http://image.tmdb.org/t/p/original/gWyevEz9NT5tON6kdhxsmfvdJ40.jpg"]
57
+ #
58
+ def url_for(type, image_path)
59
+ types = ["backdrop", "logo", "poster", "profile"]
60
+ raise ArgumentError.new("type must be one of #{types}") unless types.include?(type)
61
+ return [] if image_path.nil? || image_path.empty? && valid?
62
+
63
+ send("#{type}_sizes").map do |size|
64
+ "#{base_url}#{size}#{image_path}"
65
+ end
66
+ end
67
+
68
+ # Returns a boolean indicating whether the Image configurations are valid or not.
69
+ #
70
+ def valid?
71
+ !base_url.nil? &&
72
+ !secure_base_url.nil? &&
73
+ backdrop_sizes.any? &&
74
+ logo_sizes.any? &&
75
+ poster_sizes.any? &&
76
+ profile_sizes.any? &&
77
+ still_sizes.any?
78
+ end
79
+
80
+ private
81
+ attr_writer :base_url, :secure_base_url, :backdrop_sizes, :logo_sizes, :poster_sizes, :profile_sizes, :still_sizes
82
+ end
83
+ end
@@ -0,0 +1,5 @@
1
+ module Enceladus::Exception
2
+ class Base < ::Exception; end
3
+ class Api < Base; end
4
+ class ArgumentError < Base; end
5
+ end
@@ -0,0 +1,143 @@
1
+ class Enceladus::Account < Enceladus::ApiResource
2
+
3
+ RESOURCE_ATTRIBUTES = [:id, :include_adult, :iso_3166_1, :iso_639_1, :name, :username, :session_id].map(&:freeze).freeze
4
+ attr_accessor *RESOURCE_ATTRIBUTES
5
+
6
+ # Responsible for authenticating TMDb users.
7
+ # Authentication of users follows the workflow: https://www.themoviedb.org/documentation/api/sessions
8
+ # This method hits the following api endpoints:
9
+ #
10
+ # - http://api.themoviedb.org/3/authentication/token/new
11
+ # - http://api.themoviedb.org/3/authentication/token/validate_with_login
12
+ # - http://api.themoviedb.org/3/authentication/session/new
13
+ # - http://api.themoviedb.org/3/account
14
+ #
15
+ # Example:
16
+ #
17
+ # Enceladus::Account.new("bruna_ferraz", "dajhhd")
18
+ #
19
+ def initialize(username, password)
20
+ self.username = username
21
+ self.password = password
22
+ start_authentication_workflow
23
+ end
24
+
25
+ # Adds movie to accounts favorite list.
26
+ # Example:
27
+ #
28
+ # account = Enceladus::Account.new("bruna_ferraz", "dajhhd")
29
+ # account.favorite_movie!(23444)
30
+ #
31
+ def favorite_movie!(movie_id)
32
+ toggle_favorite_movie(movie_id, true)
33
+ end
34
+
35
+ # Removes movie to accounts favorite list.
36
+ # Example:
37
+ #
38
+ # account = Enceladus::Account.new("bruna_ferraz", "dajhhd")
39
+ # account.unfavorite_movie!(23444)
40
+ #
41
+ def unfavorite_movie!(movie_id)
42
+ toggle_favorite_movie(movie_id, false)
43
+ end
44
+
45
+ # Adds movie to accounts watchlist.
46
+ # Example:
47
+ #
48
+ # account = Enceladus::Account.new("bruna_ferraz", "dajhhd")
49
+ # account.add_to_watchlist!(23444)
50
+ #
51
+ def add_to_watchlist!(movie_id)
52
+ toggle_movie_watchlist(movie_id, true)
53
+ end
54
+
55
+ # Removes movie to accounts watchlist.
56
+ # Example:
57
+ #
58
+ # account = Enceladus::Account.new("bruna_ferraz", "dajhhd")
59
+ # account.remove_from_watchlist!(23444)
60
+ #
61
+ def remove_from_watchlist!(movie_id)
62
+ toggle_movie_watchlist(movie_id, false)
63
+ end
64
+
65
+ # Return a list of account's favorite movies.
66
+ # The returned movies are wrapped into a Enceladus::MovieCollection.
67
+ # Example:
68
+ #
69
+ # account = Enceladus::Account.new("belinha", "dajhhd")
70
+ # account.favorite_movies
71
+ #
72
+ def favorite_movies
73
+ Enceladus::MovieCollection.new("account/#{id}/favorite/movies", { session_id: session_id }) if authenticated?
74
+ end
75
+
76
+ # Return a list of account's rated movies.
77
+ # The returned movies are wrapped into a Enceladus::MovieCollection.
78
+ # Example:
79
+ #
80
+ # account = Enceladus::Account.new("belinha", "dajhhd")
81
+ # account.rated_movies
82
+ #
83
+ def rated_movies
84
+ Enceladus::MovieCollection.new("account/#{id}/rated/movies", { session_id: session_id }) if authenticated?
85
+ end
86
+
87
+ # Return the account's watchlist
88
+ # The returned movies are wrapped into a Enceladus::MovieCollection.
89
+ # Example:
90
+ #
91
+ # account = Enceladus::Account.new("belinha", "hjgsss")
92
+ # account.watchlist
93
+ #
94
+ def watchlist
95
+ Enceladus::MovieCollection.new("account/#{id}/watchlist/movies", { session_id: session_id }) if authenticated?
96
+ end
97
+
98
+ private
99
+ attr_accessor :request_token, :password
100
+
101
+ def toggle_favorite_movie(movie_id, favorite)
102
+ if authenticated?
103
+ params = { session_id: session_id }
104
+ form_data = { media_type: "movie", media_id: movie_id, favorite: favorite }
105
+ Enceladus::Requester.post("account/#{id}/favorite", params, form_data)
106
+ end
107
+ end
108
+
109
+ def toggle_movie_watchlist(movie_id, watchlist)
110
+ if authenticated?
111
+ params = { session_id: session_id }
112
+ form_data = { media_type: "movie", media_id: movie_id, watchlist: watchlist }
113
+ Enceladus::Requester.post("account/#{id}/watchlist", params, form_data)
114
+ end
115
+ end
116
+
117
+ def authenticated?
118
+ id && session_id
119
+ end
120
+
121
+ def start_authentication_workflow
122
+ request_authentication_token
123
+ authenticate
124
+ open_session
125
+ rebuild_single_resource(Enceladus::Requester.get("account", { session_id: session_id }))
126
+ self.password = self.request_token = nil
127
+ end
128
+
129
+ def request_authentication_token
130
+ token_info = Enceladus::Requester.get("authentication/token/new")
131
+ self.request_token = token_info.request_token
132
+ end
133
+
134
+ def authenticate
135
+ params = { request_token: request_token, username: username, password: password }
136
+ Enceladus::Requester.get("authentication/token/validate_with_login", params).success
137
+ end
138
+
139
+ def open_session
140
+ params = { request_token: request_token }
141
+ self.session_id = Enceladus::Requester.get("authentication/session/new", params).session_id
142
+ end
143
+ end
@@ -0,0 +1,76 @@
1
+ class Enceladus::ApiPaginatedCollection
2
+ # Provides the implementation to handle collection of paginated resources.
3
+ # The collection of resources are cached locally, after going to next pages the previous pages do not make
4
+ # any request to obtain the resources again.
5
+
6
+ RESOURCE_CLASS = nil
7
+
8
+ attr_reader :total_pages, :total_results, :path, :params, :results_per_page
9
+
10
+ # The argument path refers to the TMDb api path that provides paginated resources.
11
+ # the argument params can be used when you need to send arguments to requests when fetching new pages.
12
+ # Example:
13
+ # Enceladus::MovieCollection.new("movie/upcoming", { blah: true })
14
+ def initialize(path, params={})
15
+ self.path = path
16
+ self.params = params
17
+ self.params[:page] = 1
18
+ self.results_per_page = []
19
+ get_results_per_page
20
+ end
21
+
22
+ # Returns a collection of resources for the current page
23
+ def all
24
+ get_results_per_page
25
+ end
26
+
27
+ # Request, fetch, cache and return the collection of resources for the next page.
28
+ def next_page
29
+ self.params[:page] += 1
30
+ get_results_per_page
31
+ end
32
+
33
+ # Request, fetch, cache and return the collection of resources for the previous page.
34
+ def previous_page
35
+ raise ArgumentError.new("current_page must be greater than 0") if self.params[:page] == 1
36
+ self.params[:page] -= 1
37
+ get_results_per_page
38
+ end
39
+
40
+ # Returns current page number.
41
+ def current_page
42
+ self.params[:page]
43
+ end
44
+
45
+ # Request, fetch, cache and return the collection of resources for a given page number.
46
+ def current_page=(page)
47
+ self.params[:page] = page
48
+ get_results_per_page
49
+ end
50
+
51
+ # Returns the first resource for of the current page.
52
+ def first
53
+ get_results_per_page.first
54
+ end
55
+
56
+ # Returns the last resource for of the current page.
57
+ def last
58
+ get_results_per_page.last
59
+ end
60
+
61
+ private
62
+ attr_writer :total_pages, :total_results, :path, :params, :results_per_page
63
+
64
+ def fetch_colletion
65
+ raise NotImplementedError.new("RESOURCE_CLASS must be defined") if self.class::RESOURCE_CLASS.nil?
66
+
67
+ response = Enceladus::Requester.get(path, params)
68
+ self.total_pages = response.total_pages
69
+ self.total_results = response.total_results
70
+ self.class::RESOURCE_CLASS.build_collection(response.results)
71
+ end
72
+
73
+ def get_results_per_page
74
+ self.results_per_page[current_page - 1] ||= fetch_colletion
75
+ end
76
+ end
@@ -0,0 +1,25 @@
1
+ class Enceladus::ApiResource
2
+ private
3
+ def rebuild_single_resource(resource_from_response)
4
+ self.class::RESOURCE_ATTRIBUTES.each do |resource_attr|
5
+ self.public_send("#{resource_attr}=", resource_from_response.public_send(resource_attr)) if resource_from_response.respond_to?(resource_attr)
6
+ end
7
+ self
8
+ end
9
+
10
+ def self.build_single_resource(resource_from_response)
11
+ resource = self.new
12
+ self::RESOURCE_ATTRIBUTES.each do |resource_attr|
13
+ resource.public_send("#{resource_attr}=", resource_from_response.public_send(resource_attr)) if resource_from_response.respond_to?(resource_attr)
14
+ end
15
+ resource
16
+ end
17
+
18
+ def self.build_collection(resources_from_response)
19
+ resources = []
20
+ resources_from_response.each do |resource_from_response|
21
+ resources << self.build_single_resource(resource_from_response)
22
+ end
23
+ resources
24
+ end
25
+ end
@@ -0,0 +1,9 @@
1
+ class Enceladus::Cast < Enceladus::ApiResource
2
+ RESOURCE_ATTRIBUTES = [:cast_id, :character, :credit_id, :id, :name, :order, :profile_path].map(&:freeze).freeze
3
+ attr_accessor *RESOURCE_ATTRIBUTES
4
+
5
+ # Returns an array containing URL's (as strings) for cast images.
6
+ def profile_urls
7
+ Enceladus::Configuration::Image.instance.url_for("profile", profile_path)
8
+ end
9
+ end
@@ -0,0 +1,4 @@
1
+ class Enceladus::Genre < Enceladus::ApiResource
2
+ RESOURCE_ATTRIBUTES = [:id, :name].map(&:freeze).freeze
3
+ attr_accessor *RESOURCE_ATTRIBUTES
4
+ end
@@ -0,0 +1,15 @@
1
+ class Enceladus::GuestAccount
2
+ attr_reader :session_id
3
+
4
+ # Initiaises a guest account.
5
+ # This method hits the following api endpoint:
6
+ # - https://api.themoviedb.org/3/authentication/guest_session/new
7
+ #
8
+ # For more information about guest accounts, check out http://docs.themoviedb.apiary.io/ SECTION: Authentication
9
+ def initialize
10
+ self.session_id = Enceladus::Requester.get("authentication/guest_session/new").guest_session_id
11
+ end
12
+
13
+ private
14
+ attr_writer :session_id
15
+ end