douban-rails2.3 0.6.4 → 0.6.5

Sign up to get free protection for your applications and to get access to all the features.
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']