diandian-oauth 0.0.2 → 0.0.3

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