douban-rails2.3 0.6.4 → 0.6.5

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/VERSION CHANGED
@@ -1 +1 @@
1
- 0.6.4
1
+ 0.6.6
Binary file
@@ -5,7 +5,7 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{douban-rails2.3}
8
- s.version = "0.6.4"
8
+ s.version = "0.6.5"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Yuanyi Zhang chengdh"]
@@ -25,13 +25,15 @@ Gem::Specification.new do |s|
25
25
  "douban-rails2.3-0.6.1.gem",
26
26
  "douban-rails2.3-0.6.2.gem",
27
27
  "douban-rails2.3-0.6.3.gem",
28
+ "douban-rails2.3-0.6.4.gem",
28
29
  "douban-rails2.3.gemspec",
29
30
  "generators/douban/douban_generator.rb",
30
31
  "generators/douban/templates/douban.yml",
31
32
  "generators/douban/templates/douban_controller.rb",
32
33
  "generators/douban/templates/douban_helper.rb",
33
- "generators/douban/templates/douban_init.rb",
34
- "lib/douban.rb"
34
+ "lib/douban.rb",
35
+ "lib/models/book.rb",
36
+ "lib/parser.rb"
35
37
  ]
36
38
  s.homepage = %q{http://github.com/yzhang/douban}
37
39
  s.rdoc_options = ["--charset=UTF-8"]
@@ -4,7 +4,6 @@ class DoubanGenerator < Rails::Generator::Base
4
4
  m.file 'douban_controller.rb', 'app/controllers/douban_controller.rb'
5
5
  m.file "douban_helper.rb", 'app/helpers/douban_helper.rb'
6
6
  m.file "douban.yml", 'config/douban.yml'
7
- m.file "douban_init.rb", 'config/initializers/douban_init.rb'
8
7
  m.route :name => :douban_login,:controller => :douban,:action => :new
9
8
  m.route :name => :douban_callback,:controller => :douban,:action => :callback
10
9
  m.route :name => :douban_logout,:controller => :douban,:action => :destroy
@@ -1,6 +1,6 @@
1
1
  class DoubanController < ApplicationController
2
2
  def new
3
- douban = Douban.new
3
+ douban = Douban::Douban.new
4
4
  douban.callback = douban_callback_url
5
5
  authorize_url = douban.authorize_url
6
6
 
@@ -13,7 +13,7 @@ class DoubanController < ApplicationController
13
13
 
14
14
  def callback
15
15
  if session[:douban]
16
- douban = Douban.load(session[:douban])
16
+ douban = Douban::Douban.load(session[:douban])
17
17
  douban.authorize
18
18
  session[:douban] = douban.dump
19
19
  end
@@ -28,4 +28,4 @@ class DoubanController < ApplicationController
28
28
  douban.destroy
29
29
  redirect_to '/'
30
30
  end
31
- end
31
+ end
data/lib/douban.rb CHANGED
@@ -1,20 +1,22 @@
1
1
  require 'oauth'
2
+ require 'parser'
3
+ require 'models/book'
4
+ module Douban
5
+ class Douban
6
+ attr_accessor :callback, :request_token, :access_token
2
7
 
3
- class Douban
4
- attr_accessor :callback, :request_token, :access_token
5
-
6
- class << self
7
- def load(data)
8
- access_token = data[:access_token]
9
- access_token_secret = data[:access_token_secret]
10
-
11
- douban = Douban.new(data[:request_token], data[:request_token_secret])
12
- douban.access_token = OAuth::AccessToken.new(api_consumer, access_token, access_token_secret) if access_token
13
- douban
14
- end
8
+ class << self
9
+ def load(data)
10
+ access_token = data[:access_token]
11
+ access_token_secret = data[:access_token_secret]
12
+
13
+ douban = Douban.new(data[:request_token], data[:request_token_secret])
14
+ douban.access_token = OAuth::AccessToken.new(api_consumer, access_token, access_token_secret) if access_token
15
+ douban
16
+ end
15
17
 
16
- def auth_consumer
17
- @@auth_consumer ||= OAuth::Consumer.new(key, secret, {
18
+ def auth_consumer
19
+ @@auth_consumer ||= OAuth::Consumer.new(key, secret, {
18
20
  :signature_method => "HMAC-SHA1",
19
21
  :site => "http://www.douban.com",
20
22
  :scheme => :header,
@@ -22,109 +24,110 @@ class Douban
22
24
  :access_token_path => '/service/auth/access_token',
23
25
  :authorize_path => '/service/auth/authorize',
24
26
  :realm => url
25
- })
26
- end
27
-
28
- def api_consumer
29
- @@api_consumer ||= OAuth::Consumer.new(key, secret,
30
- {
27
+ })
28
+ end
29
+
30
+ def api_consumer
31
+ @@api_consumer ||= OAuth::Consumer.new(key, secret,
32
+ {
31
33
  :site => "http://api.douban.com",
32
34
  :scheme => :header,
33
35
  :signature_method => "HMAC-SHA1",
34
36
  :realm => url
35
37
  })
38
+ end
39
+
40
+ def key; config['key']; end
41
+ def secret; config['secret']; end
42
+ def url; config['url']; end
43
+
44
+ def config
45
+ @@config ||= lambda do
46
+ require 'yaml'
47
+ filename = "#{Rails.root}/config/douban.yml"
48
+ file = File.open(filename)
49
+ yaml = YAML.load(file)
50
+ return yaml[Rails.env]
51
+ end.call
52
+ end
36
53
  end
37
-
38
- def key; config['key']; end
39
- def secret; config['secret']; end
40
- def url; config['url']; end
41
-
42
- def config
43
- @@config ||= lambda do
44
- require 'yaml'
45
- filename = "#{Rails.root}/config/douban.yml"
46
- file = File.open(filename)
47
- yaml = YAML.load(file)
48
- return yaml[Rails.env]
49
- end.call
54
+
55
+ def initialize(request_token = nil, request_token_secret = nil)
56
+ if request_token && request_token_secret
57
+ self.request_token = OAuth::RequestToken.new(self.class.auth_consumer, request_token, request_token_secret)
58
+ else
59
+ self.request_token = self.class.auth_consumer.get_request_token()
60
+ end
50
61
  end
51
- end
52
-
53
- def initialize(request_token = nil, request_token_secret = nil)
54
- if request_token && request_token_secret
55
- self.request_token = OAuth::RequestToken.new(self.class.auth_consumer, request_token, request_token_secret)
56
- else
57
- self.request_token = self.class.auth_consumer.get_request_token()
62
+
63
+ def authorize_url
64
+ @authorize_url ||= request_token.authorize_url(:oauth_callback => self.callback)
58
65
  end
59
- end
60
-
61
- def authorize_url
62
- @authorize_url ||= request_token.authorize_url(:oauth_callback => self.callback)
63
- end
64
-
65
- def authorize
66
- return unless self.access_token.nil?
67
-
68
- access_token = self.request_token.get_access_token
69
- self.access_token ||= OAuth::AccessToken.new(self.class.api_consumer, access_token.token, access_token.secret)
70
- end
71
-
72
- def authorized?
73
- return false if access_token.nil?
74
- response = self.get("/access_token/#{access_token.token}")
75
- response.code == '200'
76
- end
77
-
78
- def destroy
79
- destroy_access_key if !access_token.nil?
80
- request_token = access_token = nil
81
- end
82
66
 
83
- def dump
84
- {
85
- :request_token => request_token.token,
86
- :request_token_secret => request_token.secret,
87
- :access_token => access_token.nil? ? nil : access_token.token,
88
- :access_token_secret => access_token.nil? ? nil : access_token.secret
89
- }
90
- end
91
-
92
- def request(http_method, path, headers = {})
93
- access_token.request(http_method, path, headers)
94
- end
95
-
96
- def get(path, headers = {})
97
- request(:get, path, headers)
98
- end
99
-
100
- def post(path, headers = {})
101
- request(:post, path, headers)
102
- end
103
-
104
- def delete(path, headers = {})
105
- request(:delete, path, headers)
106
- end
107
-
108
- def put(path, headers = {})
109
- request(:put, path, headers)
110
- end
111
- #使用isbn获取单本书籍信息
112
- def get_book(isbn)
113
- url = ENV['DOUBAN_BOOK_URL'] + isbn
114
- rsp = Net::HTTP.get_response(URI.parse(url))
115
- rsp.body
116
- end
117
- #使用模糊查询获取多本书籍
118
- def get_books(params = {})
119
- q_str = params.to_query
120
- url = ENV['DOUBAN_BOOKS_URL'] + q_str
121
- rsp = Net::HTTP.get_response(URI.parse(url))
122
- rsp.body
123
- end
124
-
125
- protected
126
- def destroy_access_key
127
- response = delete("/access_token/#{access_token.token}")
128
- response.code == '200'
67
+ def authorize
68
+ return unless self.access_token.nil?
69
+
70
+ access_token = self.request_token.get_access_token
71
+ self.access_token ||= OAuth::AccessToken.new(self.class.api_consumer, access_token.token, access_token.secret)
72
+ end
73
+
74
+ def authorized?
75
+ return false if access_token.nil?
76
+ response = self.get("/access_token/#{access_token.token}")
77
+ response.code == '200'
78
+ end
79
+
80
+ def destroy
81
+ destroy_access_key if !access_token.nil?
82
+ request_token = access_token = nil
83
+ end
84
+
85
+ def dump
86
+ {
87
+ :request_token => request_token.token,
88
+ :request_token_secret => request_token.secret,
89
+ :access_token => access_token.nil? ? nil : access_token.token,
90
+ :access_token_secret => access_token.nil? ? nil : access_token.secret
91
+ }
92
+ end
93
+
94
+ def request(http_method, path, headers = {})
95
+ access_token.request(http_method, path, headers)
96
+ end
97
+
98
+ def get(path, headers = {})
99
+ request(:get, path, headers)
100
+ end
101
+
102
+ def post(path, headers = {})
103
+ request(:post, path, headers)
104
+ end
105
+
106
+ def delete(path, headers = {})
107
+ request(:delete, path, headers)
108
+ end
109
+
110
+ def put(path, headers = {})
111
+ request(:put, path, headers)
112
+ end
113
+ #使用isbn获取单本书籍信息
114
+ def get_book(isbn)
115
+ url = ENV['DOUBAN_BOOK_URL'] + isbn + "?apikey=#{ENV['DOUBAN_APP_KEY']}"
116
+ rsp = Net::HTTP.get_response(URI.parse(url))
117
+ Parser.parse_book(rsp.body)
118
+ end
119
+ #使用模糊查询获取单本书籍
120
+ def get_books(params = {})
121
+ params['apikey'] = ENV['DOUBAN_APP_KEY']
122
+ q_str = params.to_query
123
+ url = ENV['DOUBAN_BOOKS_URL'] + q_str
124
+ rsp = Net::HTTP.get_response(URI.parse(url))
125
+ Parser.parse_books(rsp.body)
126
+ end
127
+ protected
128
+ def destroy_access_key
129
+ response = delete("/access_token/#{access_token.token}")
130
+ response.code == '200'
131
+ end
129
132
  end
130
133
  end
@@ -0,0 +1,13 @@
1
+ module Douban
2
+ class Book
3
+ def self.attr_names
4
+ [
5
+ :title,:image,:author,:isbn10,:isbn13,:pubdate,
6
+ :pages,:translator,:price,:publisher,:binding,:author_intro,:content
7
+ ]
8
+ end
9
+ for a in attr_names
10
+ attr_accessor a
11
+ end
12
+ end
13
+ end
data/lib/parser.rb ADDED
@@ -0,0 +1,44 @@
1
+ require 'nokogiri'
2
+ module Douban
3
+ class Parser
4
+ #解析单本书籍信息
5
+ def self.parse_book(book_xml)
6
+ xml_doc = Nokogiri::XML(book_xml)
7
+ book_node = xml_doc.css('entry').first
8
+ parse_single_book(book_node)
9
+ end
10
+ #解析多本书籍信息
11
+ def self.parse_books(book_xml)
12
+ xml_doc = Nokogiri::XML(book_xml)
13
+ books = Array.new
14
+ books_node = xml_doc.css('entry')
15
+ books_node.each do |book_node|
16
+ books.push parse_single_book(book_node)
17
+ end
18
+ books
19
+ end
20
+
21
+ private
22
+ def self.parse_single_book(book_node)
23
+ book = Book.new
24
+ els = book_node.css("db|attribute")
25
+ #给book赋值
26
+ els.each do |el|
27
+ if el['name'] == 'author-intro'
28
+ book.author_intro = el.content
29
+ else
30
+ book.send("#{el['name']}=",el.content)
31
+ end
32
+ end
33
+ title = book_node.css('title').first.content
34
+ content_nodes = book_node.css('content')
35
+ content = content_nodes.first.content if !content_nodes.blank?
36
+ imgs = book_node.css('link[rel=image]')
37
+ img = imgs.first['href'] if !imgs.blank?
38
+ book.title = title
39
+ book.content = content
40
+ book.image = img
41
+ book
42
+ end
43
+ end
44
+ end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: douban-rails2.3
3
3
  version: !ruby/object:Gem::Version
4
- hash: 15
4
+ hash: 13
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
8
  - 6
9
- - 4
10
- version: 0.6.4
9
+ - 5
10
+ version: 0.6.5
11
11
  platform: ruby
12
12
  authors:
13
13
  - Yuanyi Zhang chengdh
@@ -50,13 +50,15 @@ files:
50
50
  - douban-rails2.3-0.6.1.gem
51
51
  - douban-rails2.3-0.6.2.gem
52
52
  - douban-rails2.3-0.6.3.gem
53
+ - douban-rails2.3-0.6.4.gem
53
54
  - douban-rails2.3.gemspec
54
55
  - generators/douban/douban_generator.rb
55
56
  - generators/douban/templates/douban.yml
56
57
  - generators/douban/templates/douban_controller.rb
57
58
  - generators/douban/templates/douban_helper.rb
58
- - generators/douban/templates/douban_init.rb
59
59
  - lib/douban.rb
60
+ - lib/models/book.rb
61
+ - lib/parser.rb
60
62
  has_rdoc: true
61
63
  homepage: http://github.com/yzhang/douban
62
64
  licenses: []
@@ -1,7 +0,0 @@
1
- # Include hook code here
2
- douban_configs = YAML.load_file(File.join(RAILS_ROOT, 'config/douban.yml'))
3
-
4
- ENV['DOUBAN_APP_KEY'] = douban_configs[RAILS_ENV]['key'].to_s
5
- ENV['DOUBAN_APP_SECRET'] = douban_configs[RAILS_ENV]['secret']
6
- ENV['DOUBAN_BOOK_URL'] = douban_configs[RAILS_ENV]['book_url']
7
- ENV['DOUBAN_BOOKS_URL'] = douban_configs[RAILS_ENV]['books_url']