imdb_lists 1.0.4 → 2.0.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,143 @@
1
+ require "spec_helper"
2
+
3
+ describe ImdbLists do
4
+ describe "arguments" do
5
+ it "should raise an error if url is invalid" do
6
+ lambda { ImdbLists.fetch("random") }.should raise_error(ArgumentError, "Invalid url")
7
+ end
8
+
9
+ it "should NOT raise an error if url is valid" do
10
+ lambda { ImdbLists.fetch("http://www.imdb.com/user/ur10777143/ratings") }.should_not raise_error
11
+ end
12
+ end
13
+
14
+ describe "rating list" do
15
+ let(:url) { "http://www.imdb.com/user/ur10777143/ratings" }
16
+
17
+ use_vcr_cassette "ur10777143"
18
+
19
+ before(:each) do
20
+ @list = ImdbLists.fetch(url)
21
+ end
22
+
23
+ it "should have a name" do
24
+ @list.name.should eq("Demon_Hunter777's Ratings")
25
+ end
26
+
27
+ it "should have csv link" do
28
+ @list.csv.should eq("http://www.imdb.com/list/export?list_id=ratings&author_id=ur10777143")
29
+ end
30
+
31
+ it "should have 693 movies" do
32
+ @list.should have(693).movies
33
+ end
34
+
35
+ it "should have a list of movies" do
36
+ @list.movies.each do |movie|
37
+ movie.id.should match(/tt\d{7}/)
38
+ movie.created_at.should be_instance_of(Time)
39
+ movie.title.should_not be_empty
40
+ movie.directors.should be_instance_of(Array)
41
+ movie.you_rated.should be_between(0, 10)
42
+ movie.rating.should be_between(0, 10)
43
+ movie.runtime.should >= 0
44
+ movie.year.should > 1900
45
+ movie.genres.map(&:titleize).should eq(movie.genres)
46
+ movie.votes.should > 1
47
+ movie.released_at.should be_instance_of(Time)
48
+ movie.details.should match(/^((http[s]?|ftp):\/)?\/?([^:\/\s]+)((\/\w+)*\/)([\w\-\.]+[^#?\s]+)(.*)?(#[\w\-]+)?$/)
49
+ end
50
+ end
51
+
52
+ it "should not calculate #movies twice" do
53
+ @list.movies.should eq(@list.movies)
54
+ end
55
+
56
+ it "should be able to cache a request" do
57
+ 2.times { @list.name }
58
+ a_request(:get, url).should have_been_made.once
59
+ end
60
+
61
+ it "should be able to return the given url" do
62
+ @list.url.should eq(url)
63
+ end
64
+ end
65
+
66
+ describe "regular list" do
67
+ let(:url) { "http://www.imdb.com/list/qJi7_i3l25Y/" }
68
+ use_vcr_cassette "qJi7_i3l25Y"
69
+
70
+ before(:each) do
71
+ @list = ImdbLists.fetch(url)
72
+ end
73
+
74
+ it "should have a name" do
75
+ @list.name.should eq("Not so good movies...")
76
+ end
77
+
78
+ it "should have csv link" do
79
+ @list.csv.should eq("http://www.imdb.com/list/export?list_id=qJi7_i3l25Y&author_id=ur28206273")
80
+ end
81
+
82
+ it "should have 17 movies" do
83
+ @list.should have(17).movies
84
+ end
85
+
86
+ it "should have a list of movies" do
87
+ @list.movies.each do |movie|
88
+ movie.id.should match(/tt\d{7}/)
89
+ movie.created_at.should be_instance_of(Time)
90
+ movie.title.should_not be_empty
91
+ movie.directors.should be_instance_of(Array)
92
+ movie.you_rated.should be_nil
93
+ movie.rating.should be_between(0, 10)
94
+ movie.runtime.should >= 0
95
+ movie.year.should > 1900
96
+ movie.genres.map(&:titleize).should eq(movie.genres)
97
+ movie.votes.should > 1
98
+ movie.released_at.should be_instance_of(Time)
99
+ movie.details.should match(/^((http[s]?|ftp):\/)?\/?([^:\/\s]+)((\/\w+)*\/)([\w\-\.]+[^#?\s]+)(.*)?(#[\w\-]+)?$/)
100
+ end
101
+ end
102
+
103
+ it "should be able to cache a request" do
104
+ 2.times { @list.name }
105
+ a_request(:get, url).should have_been_made.once
106
+ end
107
+
108
+ it "should be able to return the given url" do
109
+ @list.url.should eq(url)
110
+ end
111
+ end
112
+
113
+
114
+ describe "invalid url" do
115
+ let(:url) { "http://www.imdb.com/list/random/" }
116
+ use_vcr_cassette "random"
117
+
118
+ before(:each) do
119
+ @list = ImdbLists.fetch(url)
120
+ end
121
+
122
+ it "should not have a name" do
123
+ @list.name.should be_nil
124
+ end
125
+
126
+ it "should not have csv link" do
127
+ @list.csv.should be_nil
128
+ end
129
+
130
+ it "should have 0 movies" do
131
+ @list.should have(0).movies
132
+ end
133
+
134
+ it "should be able to cache a request" do
135
+ 2.times { @list.name }
136
+ a_request(:get, url).should have_been_made.once
137
+ end
138
+
139
+ it "should be able to return the given url" do
140
+ @list.url.should eq(url)
141
+ end
142
+ end
143
+ end
@@ -1,12 +1,20 @@
1
1
  require "rspec"
2
2
  require "webmock/rspec"
3
+ require "vcr"
3
4
  require "imdb_lists"
4
- require "imdb_lists/container"
5
- require "imdb_lists/history"
6
- require "imdb_lists/watchlist"
7
5
 
8
6
  WebMock.disable_net_connect!
9
7
 
10
8
  RSpec.configure do |config|
11
9
  config.mock_with :rspec
10
+ config.extend VCR::RSpec::Macros
11
+ end
12
+
13
+ VCR.config do |c|
14
+ c.cassette_library_dir = "spec/fixtures/vcr_cassettes"
15
+ c.stub_with :webmock
16
+ c.default_cassette_options = {
17
+ record: :new_episodes
18
+ }
19
+ c.allow_http_connections_when_no_cassette = false
12
20
  end
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: imdb_lists
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 1.0.4
5
+ version: 2.0.2
6
6
  platform: ruby
7
7
  authors:
8
8
  - Linus Oleander
@@ -10,8 +10,7 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2011-06-03 00:00:00 +02:00
14
- default_executable:
13
+ date: 2011-09-20 00:00:00 Z
15
14
  dependencies:
16
15
  - !ruby/object:Gem::Dependency
17
16
  name: rest-client
@@ -36,7 +35,7 @@ dependencies:
36
35
  type: :runtime
37
36
  version_requirements: *id002
38
37
  - !ruby/object:Gem::Dependency
39
- name: movie_searcher
38
+ name: titleize
40
39
  prerelease: false
41
40
  requirement: &id003 !ruby/object:Gem::Requirement
42
41
  none: false
@@ -47,7 +46,7 @@ dependencies:
47
46
  type: :runtime
48
47
  version_requirements: *id003
49
48
  - !ruby/object:Gem::Dependency
50
- name: abstract
49
+ name: vcr
51
50
  prerelease: false
52
51
  requirement: &id004 !ruby/object:Gem::Requirement
53
52
  none: false
@@ -55,7 +54,7 @@ dependencies:
55
54
  - - ">="
56
55
  - !ruby/object:Gem::Version
57
56
  version: "0"
58
- type: :runtime
57
+ type: :development
59
58
  version_requirements: *id004
60
59
  - !ruby/object:Gem::Dependency
61
60
  name: rspec
@@ -92,27 +91,16 @@ files:
92
91
  - .gitignore
93
92
  - .rspec
94
93
  - Gemfile
95
- - README.markdown
94
+ - README.md
96
95
  - Rakefile
97
96
  - imdb_lists.gemspec
98
97
  - lib/imdb_lists.rb
99
- - lib/imdb_lists/base.rb
100
- - lib/imdb_lists/container.rb
101
- - lib/imdb_lists/history.rb
102
- - lib/imdb_lists/watchlist.rb
103
- - spec/container_spec.rb
104
- - spec/fixtures/32558051.html
105
- - spec/fixtures/empty_watchlist.html
106
- - spec/fixtures/non_public.html
107
- - spec/fixtures/non_public_watchlist.html
108
- - spec/fixtures/pagination.html
109
- - spec/fixtures/pagination_end.html
110
- - spec/fixtures/redirect_watchlist.html
111
- - spec/fixtures/watchlist.html
112
- - spec/history_spec.rb
98
+ - lib/imdb_lists/object.rb
99
+ - spec/fixtures/vcr_cassettes/qJi7_i3l25Y.yml
100
+ - spec/fixtures/vcr_cassettes/random.yml
101
+ - spec/fixtures/vcr_cassettes/ur10777143.yml
102
+ - spec/imdb_list_spec.rb
113
103
  - spec/spec_helper.rb
114
- - spec/watchlist_spec.rb
115
- has_rdoc: true
116
104
  homepage: https://github.com/oleander/imdb_lists
117
105
  licenses: []
118
106
 
@@ -126,7 +114,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
126
114
  requirements:
127
115
  - - ">="
128
116
  - !ruby/object:Gem::Version
129
- version: "0"
117
+ version: 1.9.2
130
118
  required_rubygems_version: !ruby/object:Gem::Requirement
131
119
  none: false
132
120
  requirements:
@@ -136,20 +124,13 @@ required_rubygems_version: !ruby/object:Gem::Requirement
136
124
  requirements: []
137
125
 
138
126
  rubyforge_project:
139
- rubygems_version: 1.6.2
127
+ rubygems_version: 1.8.8
140
128
  signing_key:
141
129
  specification_version: 3
142
130
  summary: Get easy access to any public IMDb list
143
131
  test_files:
144
- - spec/container_spec.rb
145
- - spec/fixtures/32558051.html
146
- - spec/fixtures/empty_watchlist.html
147
- - spec/fixtures/non_public.html
148
- - spec/fixtures/non_public_watchlist.html
149
- - spec/fixtures/pagination.html
150
- - spec/fixtures/pagination_end.html
151
- - spec/fixtures/redirect_watchlist.html
152
- - spec/fixtures/watchlist.html
153
- - spec/history_spec.rb
132
+ - spec/fixtures/vcr_cassettes/qJi7_i3l25Y.yml
133
+ - spec/fixtures/vcr_cassettes/random.yml
134
+ - spec/fixtures/vcr_cassettes/ur10777143.yml
135
+ - spec/imdb_list_spec.rb
154
136
  - spec/spec_helper.rb
155
- - spec/watchlist_spec.rb
@@ -1,77 +0,0 @@
1
- # IMDb Lists
2
-
3
- Get easy access to any public [IMDb](http://www.imdb.com/) [vote history list](http://www.imdb.com/mymovies/list?l=19736607) and [watchlist](http://www.imdb.com/list/2BZy80bxY2U) using Ruby.
4
-
5
- ## How to use
6
-
7
- ### Find by url
8
-
9
- $ require 'rubygems'
10
- $ require 'imdb_lists'
11
-
12
- $ result = ImdbLists::find_by_url("http://www.imdb.com/mymovies/list?l=32558051")
13
-
14
- $ result.movies.count
15
- >> 937
16
-
17
- $ result.user
18
- >> "eddyproca" # Not me :)
19
-
20
- $ result.movies.last.title
21
- >> "The Last Man on Earth"
22
-
23
- $ result.movies.first.class
24
- >> Container::Movie
25
-
26
- $ result.movies.last.actors.first.name
27
- >> "Vincent Price"
28
-
29
- ### Find by id
30
-
31
- $ result = ImdbLists::find_by_id("32558051")
32
-
33
- $ result.movies.count
34
- >> 937
35
-
36
- ## Data to work with
37
-
38
- ### Accessors
39
-
40
- - **user** (String) Owner of the list.
41
- - **id** (Fixnum or String) A unique id for the list.
42
- - **url** (String) Full URL to the IMDb list itself.
43
- - **movies** (Array[Container::Movie]) A list of movies containing `Container::Movie` instances.
44
- - **title** (String) Title of the watchlist.
45
- - **valid?** (Boolean) Is the data that is being returned valid?
46
-
47
- ### The Container::Movie class
48
-
49
- The `movies` method returns a list of `Container::Movie` objects, each object has two methods that returns information about the movie without doing another request to [IMDb](http://www.imdb.com/).
50
-
51
- If you for example want to get the title of the movie you can apply the accessors that is being described [here](https://github.com/oleander/MovieSearcher).
52
- Scroll down to the `ImdbParty::Movie` part to get information about the available accessors.
53
-
54
- - **imdb_link** (String) The full URL to the IMDb page.
55
- - **imdb_id** (String) The IMDb ID for the movie.
56
-
57
- You can, as said above, use any method that `ImdbParty::Movie` provides directly from the `Container::Movie` object, like *title*, *year* and *actors*.
58
-
59
- ## How do install
60
-
61
- [sudo] gem install imdb_lists
62
-
63
- ## How to use it in a rails 3 project
64
-
65
- Add `gem 'imdb_lists'` to your Gemfile and run `bundle`.
66
-
67
- ## Requirements
68
-
69
- *IMDb Lists* is tested in OS X 10.6.6 using Ruby 1.9.2 and 1.8.7.
70
-
71
- ## Thanks to
72
-
73
- [Chicago_gangster](http://www.imdb.com/user/ur13279695/boards/profile/) for solving the [pagination problem](http://www.imdb.com/board/bd0000041/thread/178983592?d=178983592&p=1#178983592).
74
-
75
- ## License
76
-
77
- *IMDb Lists* is released under the MIT license.
@@ -1,31 +0,0 @@
1
- require "abstract"
2
-
3
- module ImdbLists
4
- class Base
5
- def download
6
- RestClient.get(inner_url, :timeout => 10)
7
- rescue RestClient::Exception => error
8
- @errors == true ? raise(error) : warn("Error: #{error}, Where: #{error.backtrace.first}")
9
- end
10
-
11
- def content
12
- @content ||= Nokogiri::HTML(download)
13
- end
14
-
15
- def movies
16
- prepare! unless @movies.any?; @movies
17
- end
18
-
19
- def errors(boolean)
20
- tap { @errors = boolean }
21
- end
22
-
23
- def prepare!
24
- not_implemented
25
- end
26
-
27
- def inner_url
28
- not_implemented
29
- end
30
- end
31
- end
@@ -1,49 +0,0 @@
1
- require "movie_searcher"
2
-
3
- module Container
4
- class Movie
5
- def initialize(args)
6
- args.keys.each { |name| instance_variable_set "@" + name.to_s, args[name] }
7
- end
8
-
9
- # Returns the imdb id for the movie.
10
- # Example:
11
- # => tt0066026
12
- def imdb_id
13
- imdb_link.match(/(tt\d+)/).to_a[1]
14
- end
15
-
16
- # Returns the full imdb url for the movie.
17
- # Example:
18
- # => www.imdb.com/title/tt0066026/
19
- def imdb_link
20
- "http://www.imdb.com#{@imdb_link}"
21
- end
22
-
23
- # Does the container contains a valid imdb url?
24
- # Return true if the url is valid.
25
- # Example on valid url:
26
- # => www.imdb.com/title/tt0066026/
27
- def valid?
28
- !! imdb_link.match(/http:\/\/www\.imdb\.com\/title\/tt\d{2,}/i)
29
- end
30
-
31
- def method_missing(method, *args)
32
- return movie.send(method, *args) if exists? and movie.methods.include?(prepare(method))
33
- raise exists? ? NoMethodError.new("Undefined method '#{method}' for #{movie.class}") : ArgumentError.new("The imdb #{imdb_id} is invalid")
34
- end
35
-
36
- private
37
- def exists?
38
- ! movie.nil?
39
- end
40
-
41
- def movie
42
- @movie ||= MovieSearcher.find_movie_by_id(imdb_id)
43
- end
44
-
45
- def prepare(method)
46
- RUBY_VERSION.to_s.match(/1\.9/) ? method.to_sym : method.to_s
47
- end
48
- end
49
- end
@@ -1,35 +0,0 @@
1
- require "nokogiri"
2
- require "rest-client"
3
- require "imdb_lists/container"
4
- require "imdb_lists/base"
5
-
6
- module ImdbLists
7
- class History < ImdbLists::Base
8
- attr_reader :url, :id
9
-
10
- # Ingoing argument is the id to fetch movies from.
11
- def initialize(id)
12
- @movies = []
13
- @url = "http://www.imdb.com/mymovies/list?l=#{@id = id.to_i}"
14
- end
15
-
16
- # The owners username, nil if the page doesn't exists.
17
- def user
18
- content.at_css(".blurb a:nth-child(1)").content
19
- rescue NoMethodError
20
- nil # The default value if no user i found
21
- end
22
-
23
- private
24
- def prepare!
25
- movies = []; content.css("td.standard a").each do |movie|
26
- movie = Container::Movie.new(:imdb_link => movie.attr("href"))
27
- @movies << movie if movie.valid?
28
- end
29
- end
30
-
31
- def inner_url
32
- "#{@url}&a=1"
33
- end
34
- end
35
- end