ruby-imdb 0.2.2 → 0.6.0

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/.gitignore CHANGED
@@ -1,3 +1,7 @@
1
1
  .bundle
2
2
  pkg
3
3
  ruby-imdb*.gem
4
+ .idea
5
+ .yardoc
6
+ doc
7
+
data/README CHANGED
@@ -1,9 +1,29 @@
1
- Installation
2
- -------------
3
- [sudo] gem i ruby-imdb
1
+ == Welcome to Ruby IMDB
4
2
 
3
+ ruby-imdb is IMDB parsing library for Ruby.
5
4
 
6
- example:
5
+ == Features
6
+
7
+ * Dynamic Caching with MongoDB backend
8
+ * Object Oriented design
9
+ * Fast access to data
10
+
11
+ == Download
12
+
13
+ * [sudo] gem i ruby-imdb
14
+ * http://github.com/yalcin/ruby-imdb
15
+ * git clone git://github.com/yalcin/ruby-imdb.git
16
+
17
+
18
+ == Enable caching
19
+
20
+ require 'rubygems'
21
+ require 'imdb'
22
+
23
+ IMDB::Configuration.caching = true
24
+ IMDB::Configuration.db(:hostname => "localhost", :database => "imdb")
25
+
26
+ == Usage
7
27
 
8
28
  require 'rubygems'
9
29
  require 'imdb'
@@ -21,3 +41,13 @@ end
21
41
 
22
42
  movie = IMDB::Movie.new('0120669')
23
43
  p movie.poster
44
+
45
+ == Examples
46
+
47
+ Under the features directory
48
+
49
+ == Authors
50
+ * Yalcin ACIKYILDIZ (mailto:yalcin@webliyacelebi.com)
51
+
52
+
53
+ This library is released under the terms of the GNU/GPL.
data/Rakefile CHANGED
@@ -10,8 +10,10 @@ begin
10
10
  s.homepage = "http://github.com/yalcin/ruby-imdb"
11
11
  s.authors = ["Yalcin Acikyildiz"]
12
12
  s.files = FileList["[A-Za-z]*", "{lib,features}/**/*", ".gitignore"]
13
- s.add_dependency "bundler"
14
- s.add_dependency "nokogiri"
13
+ s.add_dependency "nokogiri", ">= 1.4.1"
14
+ s.add_dependency "json", ">= 1.4.3"
15
+ s.add_dependency "mongo", ">= 1.0.1"
16
+ s.add_dependency "mongo_mapper", ">= 0.7.5"
15
17
  end
16
18
  rescue LoadError
17
19
  puts "Jeweler not available. Install it with: gem install jeweler"
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.2.2
1
+ 0.6.0
@@ -0,0 +1,22 @@
1
+ module IMDB
2
+ class Configuration
3
+ class << self
4
+ def caching=(caching)
5
+ @caching = caching
6
+ end
7
+
8
+ def caching
9
+ @caching
10
+ end
11
+
12
+ def db(param={})
13
+ @db_hostname = param[:hostname]
14
+ @db_name = param[:database]
15
+ if @caching
16
+ MongoMapper.connection = Mongo::Connection.new(@db_hostname)
17
+ MongoMapper.database = @db_name
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
data/lib/imdb.rb CHANGED
@@ -2,7 +2,21 @@ require "cgi"
2
2
  require "open-uri"
3
3
 
4
4
  require "nokogiri"
5
+ require "json"
6
+ require "mongo_mapper"
5
7
 
8
+
9
+ class Array
10
+ def to_hash(default=nil)
11
+ Hash[ *inject([]) { |a, value| a.push value, default || yield(value) } ]
12
+ end
13
+ end
14
+
15
+
16
+ require "configuration"
17
+ require "imdb/skeleton"
6
18
  require "imdb/search"
7
19
  require "imdb/movie"
8
20
  require "imdb/person"
21
+
22
+
data/lib/imdb/movie.rb CHANGED
@@ -1,29 +1,50 @@
1
1
  module IMDB
2
- class Movie
3
- attr_accessor :link, :id
2
+ # Get movie information with IMDB movie id.
3
+ # @example Get Yahsi Bati movie title and cast listing [http://www.imdb.com/title/tt1567448/]
4
+ # m = IMDB::Movie.new('1567448')
5
+ # puts m.title
6
+ class Movie < IMDB::Skeleton
7
+ attr_accessor :link, :imdb_id
4
8
 
5
- def initialize(id)
6
- @id = id
7
- @link = "http://www.imdb.com/title/tt#{id}"
9
+
10
+ def initialize(id_of)
11
+ super("Movie", {:imdb_id => String,
12
+ :poster => String,
13
+ :title => String,
14
+ :cast => Array,
15
+ :photos => Array}, [:imdb_id])
16
+
17
+ @imdb_id = id_of
18
+
19
+ @link = "http://www.imdb.com/title/tt#{@imdb_id}"
8
20
  end
9
-
21
+
22
+ # Get movie poster address
23
+ # @return [String]
10
24
  def poster
11
25
  doc.at("a[@name='poster'] img")['src'][/http:.+/] + '.jpg' rescue nil
12
26
  end
13
-
27
+
28
+ # Get movie title
29
+ # @return [String]
14
30
  def title
15
31
  doc.at("//head/meta[@name='title']")["content"].split(/\(\d+\)/)[0].strip!
16
32
  end
17
33
 
34
+ # Get movie cast listing
35
+ # @return [Array]
18
36
  def cast
19
37
  doc.search("table.cast tr").map do |link|
20
38
  picture = link.children[0].search("img")[0]["src"] rescue nil
21
39
  name = link.children[1].content rescue nil
40
+ profile_id = link.children[1].search('a[@href^="/name/nm"]').first["href"].split("nm")[1].gsub(/\//,'') rescue nil
22
41
  char = link.children[3].content rescue nil
23
- IMDB::Person.new(name, char, picture, picture) if name and char and picture != nil
42
+ IMDB::Person.new(@imdb_id, name, char, profile_id, picture) unless name.nil? and char.nil? and picture.nil? and profile_id.nil?
24
43
  end
25
44
  end
26
-
45
+
46
+ # Get movie photos
47
+ # @return [Array]
27
48
  def photos
28
49
  begin
29
50
  doc.search("img").map do |img|
@@ -31,21 +52,21 @@ module IMDB
31
52
  img["src"]
32
53
  end
33
54
  end
34
- rescue
55
+ rescue
35
56
  nil
36
57
  end
37
58
  end
38
-
59
+
39
60
  private
40
-
61
+
41
62
  def doc
42
63
  if caller[0] =~ /`([^']*)'/ and $1 == "cast"
43
64
  @doc = Nokogiri::HTML(open("#{@link}/fullcredits"))
44
65
  else
45
66
  @doc = Nokogiri::HTML(open("#{@link}"))
46
67
  end
47
-
48
68
  end
69
+
49
70
  end # Movie
50
71
  end # IMDB
51
72
 
data/lib/imdb/person.rb CHANGED
@@ -1,13 +1,45 @@
1
1
  module IMDB
2
- class Person
3
- attr_accessor :name, :char, :profile, :picture
4
-
5
- def initialize(name, char, profile, picture)
6
- @name = name
7
- @char = char
8
- @profile = profile
9
- @picture = picture
10
- end
11
- end # Person
2
+ class Person < IMDB::Skeleton
3
+ def initialize(imdb_id, name, char, profile, picture)
4
+ super("Person",{:imdb_id => String,
5
+ :name => String,
6
+ :char => String,
7
+ :profile => String,
8
+ :picture => String}, [:imdb_id, :profile])
9
+ @imdb_id = imdb_id
10
+ @name = name
11
+ @char = char
12
+ @profile = profile
13
+ @picture = picture
14
+ end
15
+
16
+ def imdb_id
17
+ @imdb_id
18
+ end
19
+
20
+ def name
21
+ @name
22
+ end
23
+
24
+ def char
25
+ @char
26
+ end
27
+
28
+ def profile
29
+ @profile
30
+ end
31
+
32
+ def picture
33
+ @picture
34
+ end
35
+
36
+ def profile
37
+ @profile
38
+ end
39
+
40
+ def to_s
41
+ "Name: #{@name} \n Char: #{@char} \n"
42
+ end
43
+ end # Person
12
44
  end
13
45
 
@@ -0,0 +1,84 @@
1
+ module IMDB
2
+ # Interface of IMDB data classes.
3
+ class Skeleton
4
+ attr_accessor :model, :method_names
5
+
6
+ class << self
7
+
8
+ end
9
+
10
+ def initialize(model_name = "", method_names = {}, keys = [])
11
+ if IMDB::Configuration.caching
12
+ @model = Class.new do
13
+ include MongoMapper::Document
14
+ set_collection_name model_name
15
+ method_names.each { |m, t|
16
+ key m, t
17
+ }
18
+ end
19
+ class_eval do
20
+ method_names.each_key { |meth|
21
+ unless keys.include?(meth)
22
+ old_meth = "old_#{meth}".to_sym
23
+ alias_method old_meth, meth.to_sym
24
+ define_method meth do
25
+ k = keys.to_hash { |k| k; self.send(k) }
26
+ @db_query = self.model.first(k)
27
+
28
+ if @db_query.nil?
29
+ @db_query = self.model.new(keys.to_hash { |k| k; self.send(k)})
30
+ @db_query.save
31
+ end
32
+
33
+ if @db_query[meth].nil? or (@db_query[meth].length.zero? if @db_query[meth].kind_of?(Array))
34
+
35
+ a = send(old_meth)
36
+ if a.kind_of?(Array)
37
+ a.compact!
38
+ a.map! {
39
+ |c|
40
+ c.to_hash
41
+ }
42
+ @db_query[meth] = a
43
+ else
44
+ @db_query[meth] = a
45
+ end
46
+ @db_query.save
47
+ end
48
+ @db_query[meth]
49
+ end
50
+ end
51
+ }
52
+ end
53
+ end
54
+ @method_names = method_names
55
+ end
56
+
57
+ # Serialize method's output to json
58
+ def to_json(*a)
59
+ tmp_hash = to_hash
60
+
61
+ tmp_hash.to_json(*a)
62
+ end
63
+
64
+
65
+ def to_hash(*a)
66
+ tmp_hash = {}
67
+ @method_names.each_key { |x|
68
+ evaled = self.send x
69
+ if evaled.kind_of?(Array)
70
+ tmp_hash[x] = evaled.collect! {|e|
71
+ e
72
+ }
73
+ elsif evaled.kind_of?(String)
74
+ tmp_hash[x] = evaled
75
+ end
76
+ }
77
+ tmp_hash
78
+ end
79
+
80
+ def self.json_create(o)
81
+ new(*o['data'])
82
+ end
83
+ end
84
+ end
data/ruby-imdb.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{ruby-imdb}
8
- s.version = "0.2.2"
8
+ s.version = "0.6.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Yalcin Acikyildiz"]
12
- s.date = %q{2010-05-04}
12
+ s.date = %q{2010-05-21}
13
13
  s.description = %q{Ruby IMDB Parsing Library}
14
14
  s.email = %q{yalcin@webliyacelebi.com}
15
15
  s.extra_rdoc_files = [
@@ -26,10 +26,25 @@ Gem::Specification.new do |s|
26
26
  "features/search.feature",
27
27
  "features/step_definitions/movie_steps.rb",
28
28
  "features/step_definitions/search_steps.rb",
29
+ "lib/configuration.rb",
30
+ "lib/doc/_index.html",
31
+ "lib/doc/class_list.html",
32
+ "lib/doc/css/common.css",
33
+ "lib/doc/css/full_list.css",
34
+ "lib/doc/css/style.css",
35
+ "lib/doc/file_list.html",
36
+ "lib/doc/frames.html",
37
+ "lib/doc/index.html",
38
+ "lib/doc/js/app.js",
39
+ "lib/doc/js/full_list.js",
40
+ "lib/doc/js/jquery.js",
41
+ "lib/doc/method_list.html",
42
+ "lib/doc/top-level-namespace.html",
29
43
  "lib/imdb.rb",
30
44
  "lib/imdb/movie.rb",
31
45
  "lib/imdb/person.rb",
32
46
  "lib/imdb/search.rb",
47
+ "lib/imdb/skeleton.rb",
33
48
  "ruby-imdb.gemspec"
34
49
  ]
35
50
  s.homepage = %q{http://github.com/yalcin/ruby-imdb}
@@ -43,15 +58,21 @@ Gem::Specification.new do |s|
43
58
  s.specification_version = 3
44
59
 
45
60
  if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
46
- s.add_runtime_dependency(%q<bundler>, [">= 0"])
47
- s.add_runtime_dependency(%q<nokogiri>, [">= 0"])
61
+ s.add_runtime_dependency(%q<nokogiri>, [">= 1.4.1"])
62
+ s.add_runtime_dependency(%q<json>, [">= 1.4.3"])
63
+ s.add_runtime_dependency(%q<mongo>, [">= 1.0.1"])
64
+ s.add_runtime_dependency(%q<mongo_mapper>, [">= 0.7.5"])
48
65
  else
49
- s.add_dependency(%q<bundler>, [">= 0"])
50
- s.add_dependency(%q<nokogiri>, [">= 0"])
66
+ s.add_dependency(%q<nokogiri>, [">= 1.4.1"])
67
+ s.add_dependency(%q<json>, [">= 1.4.3"])
68
+ s.add_dependency(%q<mongo>, [">= 1.0.1"])
69
+ s.add_dependency(%q<mongo_mapper>, [">= 0.7.5"])
51
70
  end
52
71
  else
53
- s.add_dependency(%q<bundler>, [">= 0"])
54
- s.add_dependency(%q<nokogiri>, [">= 0"])
72
+ s.add_dependency(%q<nokogiri>, [">= 1.4.1"])
73
+ s.add_dependency(%q<json>, [">= 1.4.3"])
74
+ s.add_dependency(%q<mongo>, [">= 1.0.1"])
75
+ s.add_dependency(%q<mongo_mapper>, [">= 0.7.5"])
55
76
  end
56
77
  end
57
78
 
metadata CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
4
4
  prerelease: false
5
5
  segments:
6
6
  - 0
7
- - 2
8
- - 2
9
- version: 0.2.2
7
+ - 6
8
+ - 0
9
+ version: 0.6.0
10
10
  platform: ruby
11
11
  authors:
12
12
  - Yalcin Acikyildiz
@@ -14,33 +14,65 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2010-05-04 00:00:00 -04:00
17
+ date: 2010-05-21 00:00:00 -04:00
18
18
  default_executable:
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
21
- name: bundler
21
+ name: nokogiri
22
22
  prerelease: false
23
23
  requirement: &id001 !ruby/object:Gem::Requirement
24
24
  requirements:
25
25
  - - ">="
26
26
  - !ruby/object:Gem::Version
27
27
  segments:
28
- - 0
29
- version: "0"
28
+ - 1
29
+ - 4
30
+ - 1
31
+ version: 1.4.1
30
32
  type: :runtime
31
33
  version_requirements: *id001
32
34
  - !ruby/object:Gem::Dependency
33
- name: nokogiri
35
+ name: json
34
36
  prerelease: false
35
37
  requirement: &id002 !ruby/object:Gem::Requirement
36
38
  requirements:
37
39
  - - ">="
38
40
  - !ruby/object:Gem::Version
39
41
  segments:
40
- - 0
41
- version: "0"
42
+ - 1
43
+ - 4
44
+ - 3
45
+ version: 1.4.3
42
46
  type: :runtime
43
47
  version_requirements: *id002
48
+ - !ruby/object:Gem::Dependency
49
+ name: mongo
50
+ prerelease: false
51
+ requirement: &id003 !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - ">="
54
+ - !ruby/object:Gem::Version
55
+ segments:
56
+ - 1
57
+ - 0
58
+ - 1
59
+ version: 1.0.1
60
+ type: :runtime
61
+ version_requirements: *id003
62
+ - !ruby/object:Gem::Dependency
63
+ name: mongo_mapper
64
+ prerelease: false
65
+ requirement: &id004 !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - ">="
68
+ - !ruby/object:Gem::Version
69
+ segments:
70
+ - 0
71
+ - 7
72
+ - 5
73
+ version: 0.7.5
74
+ type: :runtime
75
+ version_requirements: *id004
44
76
  description: Ruby IMDB Parsing Library
45
77
  email: yalcin@webliyacelebi.com
46
78
  executables: []
@@ -60,10 +92,25 @@ files:
60
92
  - features/search.feature
61
93
  - features/step_definitions/movie_steps.rb
62
94
  - features/step_definitions/search_steps.rb
95
+ - lib/configuration.rb
96
+ - lib/doc/_index.html
97
+ - lib/doc/class_list.html
98
+ - lib/doc/css/common.css
99
+ - lib/doc/css/full_list.css
100
+ - lib/doc/css/style.css
101
+ - lib/doc/file_list.html
102
+ - lib/doc/frames.html
103
+ - lib/doc/index.html
104
+ - lib/doc/js/app.js
105
+ - lib/doc/js/full_list.js
106
+ - lib/doc/js/jquery.js
107
+ - lib/doc/method_list.html
108
+ - lib/doc/top-level-namespace.html
63
109
  - lib/imdb.rb
64
110
  - lib/imdb/movie.rb
65
111
  - lib/imdb/person.rb
66
112
  - lib/imdb/search.rb
113
+ - lib/imdb/skeleton.rb
67
114
  - ruby-imdb.gemspec
68
115
  has_rdoc: true
69
116
  homepage: http://github.com/yalcin/ruby-imdb