diandian-oauth 0.0.2 → 0.0.3

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 ADDED
@@ -0,0 +1,21 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ coverage
6
+ InstalledFiles
7
+ lib/bundler/man
8
+ pkg
9
+ rdoc
10
+ spec/reports
11
+ test/tmp
12
+ test/version_tmp
13
+ tmp
14
+
15
+ # YARD artifacts
16
+ .yardoc
17
+ _yardoc
18
+ doc/
19
+
20
+ #RubyMine stuffs
21
+ .idea
data/Gemfile ADDED
@@ -0,0 +1,5 @@
1
+ source 'http://rubygems.org'
2
+
3
+ gem 'oauth2', '~> 0.8.0'
4
+ gem 'activemodel', '~> 3.2.6'
5
+ gem 'activesupport', ' ~> 3.2.1'
data/Gemfile.lock ADDED
@@ -0,0 +1,33 @@
1
+ GEM
2
+ remote: http://rubygems.org/
3
+ specs:
4
+ activemodel (3.2.7)
5
+ activesupport (= 3.2.7)
6
+ builder (~> 3.0.0)
7
+ activesupport (3.2.7)
8
+ i18n (~> 0.6)
9
+ multi_json (~> 1.0)
10
+ builder (3.0.0)
11
+ faraday (0.8.1)
12
+ multipart-post (~> 1.1)
13
+ httpauth (0.1)
14
+ i18n (0.6.0)
15
+ jwt (0.1.5)
16
+ multi_json (>= 1.0)
17
+ multi_json (1.3.6)
18
+ multipart-post (1.1.5)
19
+ oauth2 (0.8.0)
20
+ faraday (~> 0.8)
21
+ httpauth (~> 0.1)
22
+ jwt (~> 0.1.4)
23
+ multi_json (~> 1.0)
24
+ rack (~> 1.2)
25
+ rack (1.4.1)
26
+
27
+ PLATFORMS
28
+ ruby
29
+
30
+ DEPENDENCIES
31
+ activemodel (~> 3.2.6)
32
+ activesupport (~> 3.2.1)
33
+ oauth2 (~> 0.8.0)
data/README.md ADDED
@@ -0,0 +1,4 @@
1
+ diandian-oauth
2
+ ==============
3
+
4
+ diandian-oauth is a Ruby client for diandian API
@@ -0,0 +1,19 @@
1
+ Gem::Specification.new do |s|
2
+ s.name = 'diandian-oauth'
3
+ s.version = '0.0.3'
4
+ s.date = '2012-07-24'
5
+ s.summary = "Client for diandian API"
6
+ s.description = "A Ruby Client for diandian API"
7
+ s.authors = ["Rainer Du"]
8
+ s.email = 'dusiyu@diandian.com'
9
+ s.files = ["lib/diandian_oauth.rb"]
10
+ s.homepage = 'https://github.com/secretworry/diandian-oauth'
11
+
12
+ s.files = `git ls-files`.split("\n")
13
+ s.test_files = `git ls-files -- test/*`.split("\n")
14
+ s.require_paths = ["lib"]
15
+
16
+ s.add_dependency("oauth2", '~> 0.8.0')
17
+ s.add_dependency("activemodel", '~> 3.2.6')
18
+ s.add_dependency("activesupport", '~> 3.2.1')
19
+ end
@@ -0,0 +1,28 @@
1
+ module Diandian
2
+ module Model
3
+ class Base
4
+ include ActiveModel::AttributeMethods
5
+ include ActiveModel::Serializers::JSON
6
+ include ActiveModel::Validations
7
+
8
+ def initialize( attributes = {})
9
+ @attributes = attributes
10
+ end
11
+
12
+ class << self
13
+ def model_name model_name = nil
14
+ @model_name = model_name if model_name
15
+ @model_name ||= self.name.downcase
16
+ end
17
+ end
18
+
19
+ def model_name
20
+ self.class.model_name
21
+ end
22
+
23
+ def id
24
+ nil
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,11 @@
1
+ module Diandian
2
+ module Model
3
+ class Blog < Diandian::Model::Base
4
+ define_attribute_methods [:title, :posts, :name, :updated, :description, :likes, :blogCName]
5
+
6
+ def id
7
+ self.blogCName
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,20 @@
1
+ module Diandain
2
+ module Model
3
+ class Post < Diandian::Model::Base
4
+ # define common attributes
5
+ define_attribute_methods [:format, :blogName, :blogCName, :postId, :postUrl, :type, :createTime, :tag, :commentCount, :reblogCount, :likeCount]
6
+ # define reblogInfo related attribute
7
+ define_attribute_methods [:reblogedFromUrl, :reblogedFromName, :reblogedFromTitle, :reblogedRootUrl, :reblogedRootName, :reblogedRootTitle]
8
+ # define text specified attributes
9
+ define_attribute_methods [:title, :body]
10
+ # define photo specified attributes
11
+ define_attribute_methods [:caption, :photos]
12
+ # define audio specified attributes
13
+ define_attribute_methods [:musicId, :audioType, :cover, :caption, :musicName, :playerUrl, :musicSinger, :coverNormal, :coverLarge, :coverSmall, :albumName, :musicName, :albumId, :artistId]
14
+ # define video specified attributes
15
+ define_attribute_methods [:caption, :sourceUrl, :sourceTitle, :videoType, :videoId, :playerUrl, :videoImageUrl]
16
+ # define link specified attributes
17
+ define_attribute_methods [:title, :url, :description]
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,7 @@
1
+ module Diandian
2
+ module Model
3
+ class User < Diandian::Model::Base
4
+ define_attribute_methods [:following, :likes, :blogs]
5
+ end
6
+ end
7
+ end
File without changes
data/lib/diandian.rb ADDED
@@ -0,0 +1,9 @@
1
+ module Diandian
2
+ autoload :Model, 'diandian/model'
3
+ module Model
4
+ autoload :Base, 'diandian/model/base'
5
+ autoload :Blog, 'diandian/model/blog'
6
+ autoload :Post, 'diandian/model/post'
7
+ autoload :User, 'diandian/model/user'
8
+ end
9
+ end
@@ -0,0 +1,251 @@
1
+
2
+ module DiandianOAuth
3
+ class API
4
+ module Interface
5
+ def self.included base
6
+ base.send :include, InstanceMethods
7
+ base.extend ClassMethods
8
+ end
9
+ module ClassMethods
10
+ def url_for path, options = {}
11
+ protocol = options[:protocol] || "https"
12
+ version = options[:version] || API::VERSION
13
+ host = options[:host] || API::HOST
14
+ path = if options[:no_version] then path else "/#{version}#{path}" end
15
+ "#{protocol}://#{host}#{path}"
16
+ end
17
+
18
+ def interface name, interface_class
19
+ self.interfaces[name.to_sym] = interface_class.new
20
+ end
21
+
22
+ def interfaces
23
+ @interfaces ||= {}
24
+ end
25
+ end
26
+
27
+ module InstanceMethods
28
+ def interface interface_name
29
+ self.class.interfaces[interface_name]
30
+ end
31
+ end
32
+ class Param
33
+ attr_accessor :name, :required
34
+
35
+ DEFAULT_OPTIONS = { required: true }
36
+ def initialize name, options = {}
37
+ options = DEFAULT_OPTIONS.merge( options)
38
+ @name = name
39
+ @required = options[:required]
40
+ end
41
+ end #Param
42
+
43
+ class Base
44
+ def request_url params = {}
45
+ raise 'subclasses must implement this method'
46
+ end
47
+
48
+ # when the access_token is out-of-date, refresh it automatically
49
+ def apply! access_token, params, &block
50
+ access_token.refresh! if access_token.expired?
51
+ self.apply access_token, params, &block
52
+ end
53
+
54
+ def apply access_token, params, &block
55
+ raise TokenExpiredException if access_token.expired?
56
+ params ||= {}
57
+ action = case request_verb
58
+ when /get/ then :get
59
+ when /post/ then :post
60
+ when /put/ then :put
61
+ when /delete/ then :delete
62
+ else raise "unrecognized verb '#{request_verb}'"
63
+ end # case
64
+ options = {
65
+ :params => extract_params(params),
66
+ :raise_errors => false,
67
+ :parse => :json
68
+ }
69
+ request_url = self.request_url(params)
70
+ if DiandianOAuth.logger.debug?
71
+ DiandianOAuth.logger.debug("request with action:'#{action}', request_url:'#{request_url}'")
72
+ end
73
+ access_token.request( action, request_url, options, &block)
74
+ end
75
+ protected
76
+ def request_verb
77
+ self.class.verb
78
+ end
79
+ def extract_params params
80
+ params.symbolize_keys!
81
+ self.class.params.each_pair.reduce({}) do |result, ele|
82
+ key = ele[0]
83
+ param = ele[1]
84
+ param_value = params[key]
85
+ if param_value && param.required
86
+ result[key] = param_value
87
+ elsif param.required
88
+ raise ParamIsRequiredException.new( "'#{key}' is required")
89
+ end
90
+ result
91
+ end
92
+ end
93
+
94
+ class << self
95
+ def param name, options = {}
96
+ params[name.to_sym] = Param.new( name.to_s, options)
97
+ end
98
+ def verb verb=nil
99
+ @verb = verb if verb
100
+ @verb ||= 'get'
101
+ end
102
+ def params
103
+ @params ||= {}
104
+ end
105
+ end # class
106
+ end # Base
107
+
108
+ class UserInfo < Base
109
+ def request_url params={}
110
+ API.url_for '/user/info'
111
+ end
112
+ end #UserInfo
113
+
114
+ class UserLikes < Base
115
+ param :limit, :required => false
116
+ param :offset, :required => false
117
+ def request_url params={}
118
+ API.url_for '/user/likes'
119
+ end
120
+ end #UserLikes
121
+
122
+ class UserFollowings < Base
123
+ param :limit, :required => false
124
+ param :offset, :required => false
125
+ def request_url params={}
126
+ API.url_for '/user/following'
127
+ end
128
+ end #UserFollowing
129
+
130
+ class MyTags < Base
131
+ def request_url params={}
132
+ API.url_for '/tag/mytags'
133
+ end
134
+ end #TagMyTags
135
+
136
+ class Blog < Base
137
+ protected
138
+ def blog_request_url params
139
+ blog_cname = params[:blogCName]
140
+ raise ParamIsRequiredException.new("blogCName is required for interface #{self.class.name}") unless blog_cname
141
+ API.url_for "/blog/#{blog_cname}"
142
+ end
143
+ end #BlogInterface
144
+
145
+ class BlogInfo < Base
146
+ def request_url params={}
147
+ "#{blog_request_url}/info"
148
+ end
149
+ end #BlogInfo
150
+
151
+ class BlogAvatar < Base
152
+ VALID_SIZES = %w{57 72 114 144}
153
+ def request_url params={}
154
+ path = [self.blog_request_url(params), 'avatar'].join('/')
155
+ size = params[:size]
156
+ if size
157
+ unless BlogAvatar.is_valid_size size
158
+ raise IllegalParamException.new("'#{size}' is illegal")
159
+ end
160
+ end # if
161
+ end
162
+
163
+ def self.is_valid_size size
164
+ VALID_SIZES.include? size.to_s
165
+ end
166
+
167
+ end #BlogAvatar
168
+
169
+ class BlogFollowers < Base
170
+ param :limit, :required => false
171
+ param :offset, :required => false
172
+ def request_url params={}
173
+ blog_cname = params[:blogCName]
174
+ raise ParamIsRequiredException.new("blogCName is required for interface #{self.class.name}") unless blog_cname
175
+ API.url_for "/blog/#{blog_cname}/info"
176
+ end
177
+ end #BlogFollowers
178
+
179
+ class Posts < Base
180
+ param :tag, :required => false
181
+ param :limit, :required => false
182
+ param :offset, :required => false
183
+ param :id, :required => false
184
+ param :reblogInfo, :required => false
185
+ param :notesInfo, :required => false
186
+ param :filter, :required => false
187
+ def request_url params={}
188
+ blog_cname = params[:blogCName]
189
+ raise ParamIsRequiredException.new("blogCName is required for interface #{self.class.name}") unless blog_cname
190
+ path = "/blog/#{blog_cname}/posts"
191
+ if params[:type]
192
+ path = path + "/#{type}"
193
+ end
194
+ API.url_for path
195
+ end
196
+ end # Posts
197
+
198
+ class HomeFeeds < Base
199
+ param :limit, :required => false
200
+ param :offset, :required => false
201
+ param :type, :required => false
202
+ param :sinceId, :required => false
203
+ param :reblogInfo, :required => false
204
+ param :notesInfo, :required => false
205
+ param :filter, :required => false
206
+ def request_url params={}
207
+ API.url_fo "/user/home"
208
+ end
209
+ end # Home
210
+
211
+ class TagFeeds < Base
212
+ param :limit, :required => false
213
+ param :tag, :required => false
214
+ param :sinceId, :required => false
215
+ param :reblogInfo, :required => false
216
+ param :notesInfo, :required => false
217
+ param :filter, :required => false
218
+
219
+ def request_url params={}
220
+ tag = params[:tag]
221
+ raise ParamIsRequiredException("tag is required for interface #{self.class.name}") unless tag
222
+ API.url_for "/tag/posts/#{tag}"
223
+ end
224
+ end #TagFeeds
225
+
226
+ class Follow < Base
227
+ verb :post
228
+ param :blogCName, :required => true
229
+ def request_url params={}
230
+ API.url_for "/user/follow"
231
+ end
232
+ end # Follow
233
+
234
+ class Unfollow < Base
235
+ verb :post
236
+ param :blogCName, :required => true
237
+ def request_url params={}
238
+ API.url_for '/user/unfollow'
239
+ end
240
+ end # Unfollow
241
+
242
+ class Submissions < Base
243
+ def request_url params={}
244
+ blog_cname = params[:blogCName]
245
+ raise ParamIsRequiredException("blogCName is required for interface #{self.class.name}") unless blog_cname
246
+ API.url_for "/blog/#{blog_cname}/submission"
247
+ end
248
+ end
249
+ end # Interface
250
+ end
251
+ end
@@ -0,0 +1,32 @@
1
+ require 'diandian_oauth/api/interface'
2
+ module DiandianOAuth
3
+ class API
4
+ HOST='api.diandian.com'
5
+ VERSION='v1'
6
+
7
+
8
+ def authorize_url
9
+ 'https://api.diandian.com/oauth/authorize'
10
+ end
11
+
12
+ def token_url
13
+ 'https://api.diandian.com/oauth/token'
14
+ end
15
+
16
+ include Interface
17
+ interface :user_info, Interface::UserInfo
18
+ interface :user_likes, Interface::UserLikes
19
+ interface :user_followings, Interface::UserFollowings
20
+ interface :my_tags, Interface::MyTags
21
+ interface :blog, Interface::Blog
22
+ interface :blog_info, Interface::BlogInfo
23
+ interface :blog_avatar, Interface::BlogAvatar
24
+ interface :blog_followers, Interface::BlogFollowers
25
+ interface :posts, Interface::Posts
26
+ interface :home_feeds, Interface::HomeFeeds
27
+ interface :tag_feeds, Interface::TagFeeds
28
+ interface :follow, Interface::Follow
29
+ interface :unfollow, Interface::Unfollow
30
+ interface :submissions, Interface::Submissions
31
+ end
32
+ end
@@ -0,0 +1,73 @@
1
+ require 'oauth2'
2
+ module DiandianOAuth
3
+ class Client
4
+ attr_accessor :api
5
+ def initialize client_id, client_secret, options={}
6
+ @api = options[:api] || DiandianOAuth::API.new
7
+ @redirect_uri = options[:redirect_uri]
8
+ @client = OAuth2::Client.new client_id, client_secret, {
9
+ :authorize_url => @api.authorize_url,
10
+ :token_url => @api.token_url
11
+ }
12
+ end
13
+
14
+ def authorize_url response_type='code', scope=[]
15
+ if response_type.is_a? Array
16
+ scope = response_type
17
+ response_type = 'code'
18
+ end
19
+ @client.authorize_url(
20
+ :client_id => @client.id,
21
+ :response_type => response_type,
22
+ :scope => scope.join(',')
23
+ )
24
+ end
25
+ def access_token= hash
26
+ @access_token = case hash
27
+ when Hash then OAuth2::AccessToken.from_hash(@client, hash)
28
+ when OAuth2::AccessToken then hash
29
+ else
30
+ raise 'illegal argument hash'
31
+ end
32
+ end
33
+ def access_token code_or_hash=nil
34
+ return @access_token if @access_token
35
+ return nil unless code_or_hash
36
+ if code_or_hash.is_a? Hash
37
+ @access_token = OAuth2::AccessToken.from_hash(@client, code_or_hash)
38
+ else
39
+ begin
40
+ DiandianOAuth.logger.warn('redirect_url is required for authorization_code grant type') unless @redirect_uri
41
+ @access_token = @client.get_token(
42
+ :client_id => @client.id,
43
+ :client_secret => @client.secret,
44
+ :grant_type => 'authorization_code',
45
+ :code => code_or_hash,
46
+ :redirect_uri => @redirect_uri
47
+ )
48
+ rescue OAuth2::Error => e
49
+ DiandianOAuth.logger.error e.to_s
50
+ raise e
51
+ end
52
+ end
53
+ @access_token
54
+ end
55
+
56
+ def method_missing(meth, *args, &block)
57
+ force = meth.to_s =~ /!$/
58
+ meth = $` if force
59
+ interface = @api.interface meth.to_sym
60
+ if interface
61
+ access_token = self.access_token
62
+ raise 'access_token is required' unless access_token
63
+ if force
64
+ interface.apply! access_token, args[0], &block
65
+ else
66
+ interface.apply access_token, args[0], &block
67
+ end # force
68
+ else
69
+ super
70
+ end
71
+ end
72
+ end
73
+ end
@@ -0,0 +1,19 @@
1
+ module DiandianOAuth
2
+
3
+ class OAuthException < ::Exception
4
+ end
5
+
6
+ class TokenExpiredException < OAuthException
7
+ end
8
+
9
+ class RefreshTokenExpireException < OAuthException
10
+ end
11
+ # APIException
12
+ class APIException < OAuthException
13
+ end
14
+ class ParamIsRequiredException < APIException
15
+ end
16
+ class IllegalParamException < APIException
17
+ end
18
+ # End APIException
19
+ end
@@ -4,7 +4,7 @@ require 'diandian_oauth/exceptions'
4
4
  require 'active_support/core_ext'
5
5
  require 'logger'
6
6
  module DiandianOAuth
7
- VERSION = '0.0.2'
7
+ VERSION = '0.0.3'
8
8
  module Logger
9
9
  def logger *args
10
10
  if args.empty?
@@ -0,0 +1,21 @@
1
+ require File.join( File.dirname(__FILE__), 'test_helper')
2
+
3
+ class APITest < ActiveSupport::TestCase
4
+
5
+ test 'authorize_url' do
6
+ api = DiandianOAuth::API.new
7
+ puts api.authorize_url
8
+ end
9
+
10
+ test 'token_url' do
11
+ api = DiandianOAuth::API.new
12
+ puts api.token_url
13
+ end
14
+
15
+ test 'user_info' do
16
+ api = DiandianOAuth::API.new
17
+ user_info_interface = api.interface :user_info
18
+ assert_instance_of(DiandianOAuth::API::Interface::UserInfo, user_info_interface)
19
+ puts user_info_interface.request_url
20
+ end
21
+ end
@@ -0,0 +1,24 @@
1
+ require File.join( File.dirname(__FILE__), 'test_helper')
2
+
3
+ class AuthorizeTest < ActiveSupport::TestCase
4
+ CLIENT_ID="3zgJwues92"
5
+ CLIENT_SECRET="1rxLZr5R4sweGUATGig25VBc1ka1xDEpkIqJ"
6
+
7
+ test 'authorize_url' do
8
+ assert_nothing_raised do
9
+ client = DiandianOAuth::Client.new CLIENT_ID, CLIENT_SECRET
10
+ puts client.authorize_url %w{read write}
11
+ end
12
+ end
13
+
14
+ test 'access_token' do
15
+ code = '7KhUBh'
16
+ unless code.empty?
17
+ assert_nothing_raised do
18
+ client = DiandianOAuth::Client.new CLIENT_ID, CLIENT_SECRET, :redirect_uri => 'http://example.com/callback'
19
+ access_token = client.access_token code
20
+ end
21
+ end
22
+ end
23
+
24
+ end
@@ -0,0 +1,40 @@
1
+ require File.join( File.dirname(__FILE__), 'test_helper')
2
+
3
+ class InterfaceTest < ActiveSupport::TestCase
4
+ CLIENT_ID="3zgJwues92"
5
+ CLIENT_SECRET="1rxLZr5R4sweGUATGig25VBc1ka1xDEpkIqJ"
6
+ ACCESS_TOKEN = {
7
+ :access_token => 'adbab585-ea39-47e0-87ce-da7700fd3d9b',
8
+ :refresh_token => "79852349-5f2e-4e3b-93b8-845e239e61ff",
9
+ :token_type => "bearer",
10
+ :expires_in => 604799,
11
+ :expires_at => 1344317317,
12
+ :scope => "write read",
13
+ :uid => "11449"
14
+ }
15
+
16
+ test 'refresh_token' do
17
+ client = self.client
18
+ client.access_token= ACCESS_TOKEN
19
+ p client.access_token.refresh!
20
+ end
21
+
22
+ test 'user_info' do
23
+ client = self.client
24
+ client.access_token= ACCESS_TOKEN
25
+ begin
26
+ p client.user_info
27
+ rescue DiandianOAuth::API::TokenExpiredException => e
28
+ end
29
+ end
30
+
31
+ test 'posts' do
32
+ client = self.client
33
+ client.access_token= ACCESS_TOKEN
34
+ p client.posts :blogCName => 'secretworry'
35
+ end
36
+
37
+ def client
38
+ @client ||= DiandianOAuth::Client.new CLIENT_ID, CLIENT_SECRET, :redirect_uri => 'http://example.com/callback'
39
+ end
40
+ end
@@ -0,0 +1,16 @@
1
+ require File.join( File.dirname(__FILE__), 'test_helper')
2
+
3
+ class LoggerTest < ActiveSupport::TestCase
4
+ test 'default logger' do
5
+ assert_nothing_raised do
6
+ DiandianOAuth.logger.info("test")
7
+ end
8
+ end
9
+
10
+ test 'change logger' do
11
+ assert_nothing_raised do
12
+ DiandianOAuth.logger(STDERR)
13
+ DiandianOAuth.logger.info("test")
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,4 @@
1
+ require 'test/unit'
2
+ require 'active_support/test_case'
3
+ $:.unshift( File.join(File.dirname(__FILE__), "..", "..", "lib"))
4
+ require 'diandian_oauth'
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: diandian-oauth
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 0.0.2
5
+ version: 0.0.3
6
6
  platform: ruby
7
7
  authors:
8
8
  - Rainer Du
@@ -11,8 +11,40 @@ bindir: bin
11
11
  cert_chain: []
12
12
 
13
13
  date: 2012-07-24 00:00:00 Z
14
- dependencies: []
15
-
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: oauth2
17
+ prerelease: false
18
+ requirement: &id001 !ruby/object:Gem::Requirement
19
+ none: false
20
+ requirements:
21
+ - - ~>
22
+ - !ruby/object:Gem::Version
23
+ version: 0.8.0
24
+ type: :runtime
25
+ version_requirements: *id001
26
+ - !ruby/object:Gem::Dependency
27
+ name: activemodel
28
+ prerelease: false
29
+ requirement: &id002 !ruby/object:Gem::Requirement
30
+ none: false
31
+ requirements:
32
+ - - ~>
33
+ - !ruby/object:Gem::Version
34
+ version: 3.2.6
35
+ type: :runtime
36
+ version_requirements: *id002
37
+ - !ruby/object:Gem::Dependency
38
+ name: activesupport
39
+ prerelease: false
40
+ requirement: &id003 !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ~>
44
+ - !ruby/object:Gem::Version
45
+ version: 3.2.1
46
+ type: :runtime
47
+ version_requirements: *id003
16
48
  description: A Ruby Client for diandian API
17
49
  email: dusiyu@diandian.com
18
50
  executables: []
@@ -22,7 +54,27 @@ extensions: []
22
54
  extra_rdoc_files: []
23
55
 
24
56
  files:
57
+ - .gitignore
58
+ - Gemfile
59
+ - Gemfile.lock
60
+ - README.md
61
+ - diandian-oauth.gemspec
62
+ - lib/diandian.rb
63
+ - lib/diandian/model.rb
64
+ - lib/diandian/model/base.rb
65
+ - lib/diandian/model/blog.rb
66
+ - lib/diandian/model/post.rb
67
+ - lib/diandian/model/user.rb
25
68
  - lib/diandian_oauth.rb
69
+ - lib/diandian_oauth/api.rb
70
+ - lib/diandian_oauth/api/interface.rb
71
+ - lib/diandian_oauth/client.rb
72
+ - lib/diandian_oauth/exceptions.rb
73
+ - test/diandian_oauth/api_test.rb
74
+ - test/diandian_oauth/authorize_test.rb
75
+ - test/diandian_oauth/interface_test.rb
76
+ - test/diandian_oauth/logger_test.rb
77
+ - test/diandian_oauth/test_helper.rb
26
78
  homepage: https://github.com/secretworry/diandian-oauth
27
79
  licenses: []
28
80
 
@@ -50,5 +102,9 @@ rubygems_version: 1.8.15
50
102
  signing_key:
51
103
  specification_version: 3
52
104
  summary: Client for diandian API
53
- test_files: []
54
-
105
+ test_files:
106
+ - test/diandian_oauth/api_test.rb
107
+ - test/diandian_oauth/authorize_test.rb
108
+ - test/diandian_oauth/interface_test.rb
109
+ - test/diandian_oauth/logger_test.rb
110
+ - test/diandian_oauth/test_helper.rb