me2api-ruby 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore ADDED
@@ -0,0 +1,18 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .DS_Store
6
+ coverage
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/
data/Gemfile ADDED
@@ -0,0 +1,8 @@
1
+ source "http://rubygems.org"
2
+
3
+ gemspec
4
+
5
+ gem "rake", "~> 0.8.3"
6
+ gem "tzinfo", "~> 0.3.33"
7
+ gem "json", "~> 1.7.3"
8
+ gem "curb", "~> 0.8.0"
data/Gemfile.lock ADDED
@@ -0,0 +1,22 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ me2api-ruby (0.1.0)
5
+
6
+ GEM
7
+ remote: http://rubygems.org/
8
+ specs:
9
+ curb (0.8.0)
10
+ json (1.7.3)
11
+ rake (0.8.7)
12
+ tzinfo (0.3.33)
13
+
14
+ PLATFORMS
15
+ ruby
16
+
17
+ DEPENDENCIES
18
+ curb (~> 0.8.0)
19
+ json (~> 1.7.3)
20
+ me2api-ruby!
21
+ rake (~> 0.8.3)
22
+ tzinfo (~> 0.3.33)
data/README.md ADDED
@@ -0,0 +1,74 @@
1
+ me2api-ruby
2
+ -----------
3
+
4
+ A Ruby wrapper for the Me2day API.
5
+
6
+ 설치
7
+ ====
8
+
9
+ gem install me2day-ruby
10
+
11
+ 사용례
12
+ =====
13
+
14
+ api = Me2API::API.new(
15
+ :appkey => APPKEY,
16
+ :user_id => USER_ID,
17
+ :apikey => APIKEY
18
+ )
19
+
20
+ post = api.create_post(USER_ID, 'hello world')
21
+
22
+ 참고자료
23
+ =======
24
+
25
+ * Naver 개발자 센터 - 미투데이 API(http://dev.naver.com/openapi/apis/me2day/me2api_intro)
26
+
27
+ TODO
28
+ ====
29
+
30
+ * 쉬운인증 지원
31
+
32
+ Contributors
33
+ ============
34
+
35
+ Authors ordered by first contribution.
36
+
37
+ * Heungseok Do <codian@gmail.com>
38
+
39
+ License
40
+ =======
41
+
42
+ This is free and unencumbered software released into the public domain.
43
+ For more information, see http://unlicense.org/ or the accompanying UNLICENSE file.
44
+
45
+ ChangeLog
46
+ =========
47
+
48
+ ## 0.1(2012-06-27)
49
+
50
+ First release.
51
+
52
+ Features:
53
+
54
+ - apikey 인증 지원
55
+ - 지원 메소드
56
+ * `get_person`
57
+ * `get_posts`
58
+ * `create_post`
59
+ * `delete_post`
60
+ * `get_comments`
61
+ * `create_comment`
62
+ * `delete_comment`
63
+ * `get_metoos`
64
+ * `metoo`
65
+ * `get_friends`
66
+ * `get_friendship_requests`
67
+ * `accept_friendship_request`
68
+ * `get_settings`
69
+ * `get_bands`
70
+ * `noop`
71
+
72
+ Bugfixes:
73
+
74
+ - 없음
data/Rakefile ADDED
@@ -0,0 +1,29 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require "bundler/gem_tasks"
4
+ require 'rake/testtask'
5
+ begin
6
+ require 'rdoc/task'
7
+ rescue LoadError
8
+ require 'rake/rdoctask'
9
+ end
10
+ desc "Run unit tests"
11
+ Rake::TestTask.new("test_units") do |t|
12
+ t.pattern = 'test/*_test.rb'
13
+ t.verbose = true
14
+ t.warning = true
15
+ end
16
+
17
+ desc "generate API documentation to doc/"
18
+ Rake::RDocTask.new do |rd|
19
+ rd.rdoc_dir = 'doc/'
20
+ rd.main = 'README.rdoc'
21
+ rd.rdoc_files.include 'README.md', 'UNLICENSE.md', 'lib/me2api/api.rb'
22
+
23
+ rd.options << '-c utf-8'
24
+ rd.options << '--line-numbers'
25
+ rd.options << '--all'
26
+ end
27
+
28
+ desc 'Default: run the tests'
29
+ task :default => :test_units
data/UNLICENSE.md ADDED
@@ -0,0 +1,24 @@
1
+ This is free and unencumbered software released into the public domain.
2
+
3
+ Anyone is free to copy, modify, publish, use, compile, sell, or
4
+ distribute this software, either in source code form or as a compiled
5
+ binary, for any purpose, commercial or non-commercial, and by any
6
+ means.
7
+
8
+ In jurisdictions that recognize copyright laws, the author or authors
9
+ of this software dedicate any and all copyright interest in the
10
+ software to the public domain. We make this dedication for the benefit
11
+ of the public at large and to the detriment of our heirs and
12
+ successors. We intend this dedication to be an overt act of
13
+ relinquishment in perpetuity of all present and future rights to this
14
+ software under copyright law.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
19
+ IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
20
+ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
21
+ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
22
+ OTHER DEALINGS IN THE SOFTWARE.
23
+
24
+ For more information, please refer to <http://unlicense.org/>
@@ -0,0 +1,139 @@
1
+ require 'cgi'
2
+ require 'curb'
3
+ require 'digest/md5'
4
+ require 'json'
5
+
6
+ module Me2API
7
+ class Me2dayAPIError < StandardError; end
8
+ class FetchError < Me2dayAPIError; end
9
+ class NotImplementedError < Me2dayAPIError; end
10
+ class ServerError < Me2dayAPIError
11
+ attr_reader :reason
12
+
13
+ def initialize(reason)
14
+ @reason = reason
15
+ end
16
+
17
+ def to_s
18
+ "code: #{reason.code}, message: #{reason.message}, desc: #{reason.description}"
19
+ end
20
+ end
21
+
22
+ class Agent
23
+ attr_accessor :host, :protocol, :appkey, :user_id, :apikey,
24
+ :open_timeout, :read_timeout, :logger
25
+
26
+ # options
27
+ # :protocol - 'http' or 'https'. API 요청을 위한 프로토콜. 디폴트는 'http'
28
+ # :host - me2API 서버의 호스트명(도메인명) 디폴트는 'me2day.net'
29
+ # :appkey - me2API appkey. 발급은 http://me2day.net/me2/app/get_appkey
30
+ # :user_id - 현재 이용자의 미투데이 아이디
31
+ # :apikey - 사용자 인증키. 인증키를 이용한 인증방식인 경우 사용됨.
32
+ # :open_timeout - 커넥션 타임아웃. 초단위로 지정함. 지정하지 않는 경우 5초
33
+ # :read_timeout - 읽기 타임아웃. 초단위로 지정함. 지정하지 않은 경우 5초
34
+ # :logger - 로그 파일 경로 또는 Logger 객체 지정 지정하지 않는 경우 콘솔
35
+ def initialize(options = {})
36
+ options = {
37
+ :protocol => 'http',
38
+ :host => 'me2day.net',
39
+ :appkey => nil,
40
+ :user_id => nil,
41
+ :apikey => nil,
42
+ :open_timeout => 5,
43
+ :read_timeout => 5,
44
+ :logger => Logger.new(STDOUT)
45
+ }.merge(options)
46
+
47
+ @host = options[:host]
48
+ @protocol = options[:protocol]
49
+ @appkey = options[:appkey]
50
+ @user_id = options[:user_id]
51
+ @apikey = options[:apikey]
52
+ @open_timeout = options[:open_timeout]
53
+ @read_timeout = options[:read_timeout]
54
+ @logger = options[:logger]
55
+ end
56
+
57
+ def api_url(name, params = {})
58
+ case name
59
+ when 'get_person', 'get_posts', 'create_post', 'get_friends',
60
+ 'get_friendship_requests'
61
+ return "#{@protocol}://#{@host}/api/#{name}/#{params[:user_id]}.json"
62
+ else
63
+ return "#{@protocol}://#{@host}/api/#{name}.json"
64
+ end
65
+ end
66
+
67
+ def call(method_name, params = {})
68
+ url = api_url(method_name, params)
69
+
70
+ http = Curl::Easy.new(url)
71
+ http.max_redirects = 2
72
+ http.connect_timeout = @open_timeout
73
+ http.timeout = @read_timeout
74
+
75
+ http.headers["me2_application_key"] = @appkey
76
+ http.headers["User-Agent"] = "ME2API for ruby " + VERSION
77
+
78
+ if @user_id && @apikey
79
+ nonce = generate_nonce
80
+ cred = nonce + Digest::MD5.hexdigest(nonce + @apikey)
81
+
82
+ http.http_auth_types = :basic
83
+ http.username = @user_id
84
+ http.password = cred
85
+ end
86
+
87
+ data = []
88
+ params.each do |k, v|
89
+ if k == :files
90
+ http.multipart_form_post = true
91
+ v.each do |fk, fv|
92
+ data << Curl::PostField.file(fk, fv.to_s)
93
+ end
94
+ else
95
+ data << Curl::PostField.content(k, v.to_s)
96
+ end
97
+ end
98
+
99
+ http.http_post(data)
100
+
101
+ case http.response_code
102
+ when 200
103
+ return JSON.parse(http.body_str)
104
+ else
105
+ reason = JSON.parse(http.body_str) rescue nil
106
+ if reason
107
+ r = Result.new(reason)
108
+ error(r.code)
109
+ error(r.message)
110
+ error(r.description)
111
+ raise ServerError.new(r)
112
+ else
113
+ error(http.body_str)
114
+ raise FetchError.new("HTTP status code: #{http.response_code}")
115
+ end
116
+ end
117
+ end
118
+
119
+ # 16진수 8자리 문자열 생성
120
+ def generate_nonce
121
+ rand(4_294_967_296).to_s(16).downcase.rjust(8, '0')
122
+ end
123
+
124
+ def debug(msg)
125
+ return unless @logger
126
+ @logger.debug(msg)
127
+ end
128
+
129
+ def info(msg)
130
+ return unless @logger
131
+ @logger.info(msg)
132
+ end
133
+
134
+ def error(msg)
135
+ return unless @logger
136
+ @logger.error(msg)
137
+ end
138
+ end
139
+ end
data/lib/me2api/api.rb ADDED
@@ -0,0 +1,129 @@
1
+ require 'logger'
2
+
3
+ module Me2API
4
+ class API
5
+ attr_reader :agent
6
+
7
+ def initialize(options = {})
8
+ options = {
9
+ :appkey => nil,
10
+ :user_id => nil,
11
+ :apikey => nil,
12
+ :logger => Logger.new(STDOUT)
13
+ }.merge(options)
14
+
15
+ @logger = options[:logger]
16
+ @agent = Agent.new(
17
+ :appkey => options[:appkey],
18
+ :user_id => options[:user_id],
19
+ :apikey => options[:apikey],
20
+ :logger => @logger
21
+ )
22
+ end
23
+
24
+ def get_person(user_id)
25
+ resp = agent.call('get_person', :user_id => user_id)
26
+ Person.new(resp)
27
+ end
28
+
29
+ def get_posts(user_id, options = {})
30
+ options = {
31
+ :user_id => user_id
32
+ }.merge(options)
33
+ resp = agent.call('get_posts', options)
34
+ resp.map { |p| Post.new(p) }
35
+ end
36
+
37
+ # options
38
+ # :tag - 태그
39
+ # :attachments - 첨부 파일
40
+ def create_post(user_id, body, options = {})
41
+ params = {}
42
+ params['post[body]'] = body
43
+ params['post[tag]'] = options[:tag] if options[:tag]
44
+ if options[:attachment]
45
+ params[:files] = { 'attachment' => options[:attachment] }
46
+ end
47
+ resp = agent.call('create_post', params)
48
+ Post.new(resp)
49
+ end
50
+
51
+ def delete_post(post_id)
52
+ resp = agent.call('delete_post', :post_id => post_id)
53
+ Result.new(resp)
54
+ end
55
+
56
+ def get_comments(post_id)
57
+ resp = agent.call('get_comments', :post_id => post_id)
58
+ resp['comments'].map do |c|
59
+ Comment.new(post_id, c, :post_permalink => resp['post_permalink'])
60
+ end
61
+ end
62
+
63
+ def create_comment(post_id, body)
64
+ resp = agent.call('create_comment', :post_id => post_id, :body => body)
65
+ Comment.new(post_id, resp)
66
+ end
67
+
68
+ def delete_comment(comment_id)
69
+ resp = agent.call('delete_comment', :comment_id => comment_id)
70
+ Result.new(resp)
71
+ end
72
+
73
+ def track_comments(options = {})
74
+ raise NotImplementedError.new("track_comments unsupported method")
75
+ end
76
+
77
+ def get_metoos(post_id)
78
+ resp = agent.call('get_metoos', :post_id => post_id)
79
+ resp['metoos'].map { |m| Metoo.new(post_id, m) }
80
+ end
81
+
82
+ def metoo(post_id)
83
+ resp = agent.call('metoo', :post_id => post_id)
84
+ Result.new(resp)
85
+ end
86
+
87
+ def get_friends(user_id, options = {})
88
+ resp = agent.call('get_friends', :user_id => user_id)
89
+ resp['friends'].map { |f| Person.new(f) }
90
+ end
91
+
92
+ def friendship
93
+ raise NotImplementedError.new("friendship unsupported method")
94
+ end
95
+
96
+ def get_friendship_requests(user_id)
97
+ resp = agent.call('get_friendship_requests', :user_id => user_id)
98
+ resp['friendship_requests'].map { |r| FriendshipRequest.new(r) }
99
+ end
100
+
101
+ def accept_friendship_request(friendship_request_id, message)
102
+ agent.call(
103
+ 'accept_friendship_requests',
104
+ :friendship_request_id => friendship_request_id,
105
+ :message => message
106
+ )
107
+ end
108
+
109
+ def get_settings
110
+ resp = agent.call('get_settings')
111
+ Setting.new(resp)
112
+ end
113
+
114
+ def get_bands(options = {})
115
+ resp = agent.call('get_bands')
116
+ resp.map { |b| Band.new(b) }
117
+ end
118
+
119
+ def noop
120
+ resp = agent.call('noop')
121
+ Result.new(resp)
122
+ end
123
+
124
+ private
125
+ def wrap_array(array)
126
+ array.map { |val| wrap(val) }
127
+ end
128
+ end
129
+ end
@@ -0,0 +1,4 @@
1
+ module Me2API
2
+ class Band < Model
3
+ end
4
+ end
@@ -0,0 +1,19 @@
1
+ require 'time'
2
+
3
+ module Me2API
4
+ class Comment < Model
5
+ def initialize(post_id, hash, options = {})
6
+ super(hash)
7
+
8
+ self[:post_id] = post_id
9
+ self[:post_permalink] = options[:post_permalink]
10
+ end
11
+
12
+ def pub_date
13
+ unless self[:pub_date].is_a?(Time)
14
+ self[:pub_date] = Time.parse(self[:pub_date])
15
+ end
16
+ self[:pub_date]
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,10 @@
1
+ module Me2API
2
+ class FriendshipRequest < Model
3
+ def initialize(hash)
4
+ super(hash)
5
+
6
+ self[:from] = Person.new(self.from)
7
+ self[:to] = Person.new(self.to)
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,18 @@
1
+ require 'time'
2
+
3
+ module Me2API
4
+ class Metoo < Model
5
+ def initialize(post_id, hash)
6
+ super(hash)
7
+
8
+ self[:post_id] = post_id
9
+ end
10
+
11
+ def pub_date
12
+ unless self[:pub_date].is_a?(Time)
13
+ self[:pub_date] = Time.parse(self[:pub_date])
14
+ end
15
+ self[:pub_date]
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,19 @@
1
+ require 'time'
2
+
3
+ module Me2API
4
+ class Person < Model
5
+ def registered
6
+ unless self[:registered].is_a?(Time)
7
+ self[:registered] = Time.parse(self[:registered])
8
+ end
9
+ self[:registered]
10
+ end
11
+
12
+ def updated
13
+ unless self[:updated].is_a?(Time)
14
+ self[:updated] = iso8601_time(self[:updated])
15
+ end
16
+ self[:updated]
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,12 @@
1
+ require 'time'
2
+
3
+ module Me2API
4
+ class Post < Model
5
+ def pub_date
6
+ unless self[:pub_date].is_a?(Time)
7
+ self[:pub_date] = Time.parse(self[:pub_date])
8
+ end
9
+ self[:pub_date]
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,7 @@
1
+ module Me2API
2
+ class Result < Model
3
+ def to_s
4
+ "code: #{code}, message: #{message}, desc: #{description}"
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,6 @@
1
+ require 'time'
2
+
3
+ module Me2API
4
+ class Setting < Model
5
+ end
6
+ end
@@ -0,0 +1,60 @@
1
+ module Me2API
2
+ class Model < Hash
3
+ def initialize(hash)
4
+ super
5
+ hash.keys.each { |key| self[key] = hash[key] }
6
+ end
7
+
8
+ def wrap(value)
9
+ if value.is_a?(Hash) && !value.is_a?(Me2API::Model)
10
+ Model.new(value)
11
+ else
12
+ value
13
+ end
14
+ end
15
+
16
+ def [](key)
17
+ key = underscore(key.to_s)
18
+ if has_key?(key)
19
+ super(key)
20
+ else
21
+ super(key.to_sym)
22
+ end
23
+ end
24
+
25
+ def []=(key, value)
26
+ key = underscore(key.to_s).to_sym
27
+ super(key, wrap(value))
28
+ end
29
+
30
+ def id
31
+ method_missing(:id)
32
+ end
33
+
34
+ def method_missing(name, *args, &block)
35
+ self[name]
36
+ end
37
+
38
+ FROM_OR_TO_REGEX = /(\d{4}\-\d{1,2}-\d{1,2}[T|\s]\d{1,2}\:\d{1,2}\:\d{1,2})([\+|\s])(\d{2}\:{0,}\d{2})/
39
+ def iso8601_time(tstr)
40
+ if tstr =~ FROM_OR_TO_REGEX && tstr !~ /\+/
41
+ tstr = tstr.gsub(FROM_OR_TO_REGEX) do |match|
42
+ if $2 == " "
43
+ match = $1 + "+" + $3
44
+ end
45
+ match
46
+ end
47
+ end
48
+
49
+ Time.parse(tstr).utc
50
+ end
51
+
52
+ def underscore(str)
53
+ str.gsub(/::/, '/').
54
+ gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
55
+ gsub(/([a-z\d])([A-Z])/,'\1_\2').
56
+ tr("-", "_").
57
+ downcase
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,3 @@
1
+ module Me2API
2
+ VERSION = "0.1.0"
3
+ end
data/lib/me2api.rb ADDED
@@ -0,0 +1,17 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ module Me2API
4
+ end
5
+
6
+ require "me2api/agent"
7
+ require "me2api/api"
8
+
9
+ require "me2api/model"
10
+ require "me2api/model/result"
11
+ require "me2api/model/person"
12
+ require "me2api/model/post"
13
+ require "me2api/model/comment"
14
+ require "me2api/model/metoo"
15
+ require "me2api/model/setting"
16
+ require "me2api/model/band"
17
+ require "me2api/model/friendship_request"
@@ -0,0 +1,22 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ $LOAD_PATH << File.expand_path("../lib", __FILE__)
4
+ require "me2api/version"
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = "me2api-ruby"
8
+ s.version = Me2API::VERSION
9
+ s.summary = %q{A Ruby wrapper for the Me2day API}
10
+ s.description = %q{me2API is OpenAPI of me2day.
11
+ me2api-ruby is a ruby library for the me2API}
12
+
13
+ s.files = `git ls-files`.split("\n")
14
+ s.test_files = Dir['test/**/*_test.rb']
15
+
16
+ s.require_paths = ["lib"]
17
+
18
+ s.authors = ["Heungseok Do"]
19
+ s.email = ["codian@gmail.com"]
20
+
21
+ s.homepage = "https://github.com/me2day/me2api-ruby"
22
+ end
@@ -0,0 +1,21 @@
1
+ require File.expand_path('../test_helper', __FILE__)
2
+
3
+ class AgentTest < Test::Unit::TestCase
4
+ include Me2APICommon
5
+
6
+ def setup
7
+ @agent = Me2API::Agent.new(
8
+ :appkey => APPKEY,
9
+ :user_id => USER_ID,
10
+ :apikey => APIKEY
11
+ )
12
+ end
13
+
14
+ def test_call
15
+ resp = nil
16
+ assert_nothing_raised do
17
+ resp = @agent.call('get_person', :user_id => 'me2help')
18
+ end
19
+ assert_equal('me2help', resp['id'])
20
+ end
21
+ end
data/test/api_test.rb ADDED
@@ -0,0 +1,223 @@
1
+ require File.expand_path('test_helper', File.dirname(__FILE__))
2
+
3
+ class APITest < Test::Unit::TestCase
4
+ include Me2APICommon
5
+
6
+ def test_get_person
7
+ person = @api.get_person('sumanpark')
8
+ assert_equal('sumanpark', person.id)
9
+
10
+ assert_kind_of(Time, person.registered)
11
+ assert_kind_of(Time, person.updated)
12
+ end
13
+
14
+ def test_get_posts
15
+ posts = @api.get_posts('sumanpark')
16
+
17
+ assert_kind_of(Array, posts)
18
+ assert(posts.length > 0)
19
+ assert_block do
20
+ res = true
21
+ posts.each do |post|
22
+ if !post.is_a?(Me2API::Post) || post.post_id.nil?
23
+ res = false
24
+ break
25
+ end
26
+ end
27
+ res
28
+ end
29
+ post = posts.first
30
+ assert_kind_of(Time, post.pub_date)
31
+ end
32
+
33
+ def test_create_and_delete_post
34
+ post = nil
35
+ assert_nothing_raised do
36
+ post = @api.create_post(USER_ID, 'hello world.' + Time.now.to_i.to_s)
37
+ end
38
+ assert_kind_of(Me2API::Post, post)
39
+ assert_not_nil(post.post_id)
40
+
41
+ resp = nil
42
+ assert_nothing_raised { resp = @api.delete_post(post.post_id) }
43
+ assert_equal(0, resp.code)
44
+ end
45
+
46
+ def test_get_comments
47
+ comments = @api.get_comments('pylz3nh-yr5s')
48
+
49
+ assert_kind_of(Array, comments)
50
+ assert(comments.length > 0)
51
+ assert_block do
52
+ res = true
53
+ comments.each do |comment|
54
+ if !comment.is_a?(Me2API::Comment) || comment.comment_id.nil?
55
+ res = false
56
+ break
57
+ end
58
+ end
59
+ res
60
+ end
61
+ comment = comments.first
62
+ assert_kind_of(Time, comment.pub_date)
63
+ end
64
+
65
+ def test_create_and_delete_comment
66
+ comment = nil
67
+ assert_nothing_raised do
68
+ comment = @api.create_comment('pqgf_-mff', 'hello world.' + Time.now.to_i.to_s)
69
+ end
70
+ assert_kind_of(Me2API::Comment, comment)
71
+ assert_not_nil(comment.comment_id)
72
+ assert_nothing_raised do
73
+ post = @api.delete_comment(comment.comment_id)
74
+ end
75
+ end
76
+
77
+ def test_get_metoo
78
+ metoos = @api.get_metoos('pylz3nh-yr5s')
79
+
80
+ assert_kind_of(Array, metoos)
81
+ assert(metoos.length > 0)
82
+ assert_block do
83
+ res = true
84
+ metoos.each do |metoo|
85
+ if !metoo.is_a?(Me2API::Metoo)
86
+ res = false
87
+ break
88
+ end
89
+ end
90
+ res
91
+ end
92
+ metoo = metoos.first
93
+ assert_kind_of(Time, metoo.pub_date)
94
+ end
95
+
96
+ def test_metoo
97
+ e = assert_raise(Me2API::ServerError) do
98
+ resp = @api.metoo('pylz3nh-yr5s')
99
+ end
100
+ # 1004, 파라미터가 올바르지 않습니다, 이미 미투했습니다.
101
+ assert_equal 1004, e.reason.code
102
+ end
103
+
104
+ def test_get_friends
105
+ friends = @api.get_friends('sumanpark')
106
+
107
+ assert_kind_of(Array, friends)
108
+ assert(friends.length > 0)
109
+ assert_block do
110
+ res = true
111
+ friends.each do |friend|
112
+ if !friend.is_a?(Me2API::Person)
113
+ res = false
114
+ break
115
+ end
116
+ end
117
+ res
118
+ end
119
+ end
120
+
121
+ def test_get_settings
122
+ setting = @api.get_settings
123
+ assert_equal(USER_ID, setting.settings_of)
124
+ end
125
+
126
+ def test_get_bands
127
+ bands = @api.get_bands
128
+ assert_kind_of(Array, bands)
129
+ assert(bands.length > 0)
130
+ assert_block do
131
+ res = true
132
+ bands.each do |band|
133
+ if !band.is_a?(Me2API::Band)
134
+ res = false
135
+ break
136
+ end
137
+ end
138
+ res
139
+ end
140
+ end
141
+
142
+ def test_noop
143
+ resp = nil
144
+ assert_nothing_raised { resp = @api.noop }
145
+ assert_equal(0, resp.code)
146
+ end
147
+
148
+ def test_noop_fail
149
+ e = assert_raise(Me2API::ServerError) do
150
+ @api.agent.user_id = 'unknown'
151
+ @api.noop
152
+ end
153
+
154
+ assert_equal(1007, e.reason.code)
155
+ end
156
+
157
+ def test_get_friendship_requests
158
+ resp = @api.get_friendship_requests(USER_ID)
159
+ assert_block("return objects is not FriendshipRequest") do
160
+ res = true
161
+ resp.each do |fr|
162
+ if !fr.is_a?(Me2API::FriendshipRequest)
163
+ res = false
164
+ break
165
+ end
166
+ end
167
+ res
168
+ end
169
+
170
+ assert_block("FriendshipRequest object's `id' is not set") do
171
+ res = true
172
+ resp.each do |fr|
173
+ if fr.id.empty?
174
+ res = false
175
+ break
176
+ end
177
+ end
178
+ res
179
+ end
180
+
181
+ assert_block("FriendshipRequest object's `from' is not Person") do
182
+ res = true
183
+ resp.each do |fr|
184
+ if !fr.from.is_a?(Me2API::Person)
185
+ res = false
186
+ break
187
+ end
188
+ end
189
+ res
190
+ end
191
+
192
+ assert_block("FriendshipRequest object's `to' is not Person") do
193
+ res = true
194
+ resp.each do |fr|
195
+ if !fr.to.is_a?(Me2API::Person)
196
+ res = false
197
+ break
198
+ end
199
+ end
200
+ res
201
+ end
202
+ end
203
+
204
+ def test_create_post_with_tag_and_photo
205
+ post = nil
206
+ assert_nothing_raised do
207
+ post = @api.create_post(
208
+ USER_ID,
209
+ 'hello world.' + Time.now.to_i.to_s,
210
+ :tag => '이것은 태그',
211
+ :attachment => File.expand_path('test.png', File.dirname(__FILE__))
212
+ )
213
+ end
214
+ assert_kind_of(Me2API::Post, post)
215
+ assert_not_nil(post.post_id)
216
+ assert_not_nil(post.media)
217
+ assert_equal('nphoto_inf', post.media.provider)
218
+
219
+ resp = nil
220
+ assert_nothing_raised { resp = @api.delete_post(post.post_id) }
221
+ assert_equal(0, resp.code)
222
+ end
223
+ end
data/test/test.png ADDED
Binary file
@@ -0,0 +1,19 @@
1
+ $LOAD_PATH << File.expand_path("../lib/me2api", File.dirname(__FILE__))
2
+
3
+ require 'test/unit'
4
+ require 'me2api'
5
+
6
+ module Me2APICommon
7
+ APPKEY = '40e05bcc74bb61fcfa30ed8ef9ae6107'
8
+ USER_ID = 'm2test100'
9
+ APIKEY = '34372730'
10
+
11
+ def setup
12
+ @api = Me2API::API.new(
13
+ :appkey => APPKEY,
14
+ :user_id => USER_ID,
15
+ :apikey => APIKEY,
16
+ :logger => nil
17
+ )
18
+ end
19
+ end
metadata ADDED
@@ -0,0 +1,93 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: me2api-ruby
3
+ version: !ruby/object:Gem::Version
4
+ hash: 27
5
+ prerelease:
6
+ segments:
7
+ - 0
8
+ - 1
9
+ - 0
10
+ version: 0.1.0
11
+ platform: ruby
12
+ authors:
13
+ - Heungseok Do
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2012-06-27 00:00:00 Z
19
+ dependencies: []
20
+
21
+ description: |-
22
+ me2API is OpenAPI of me2day.
23
+ me2api-ruby is a ruby library for the me2API
24
+ email:
25
+ - codian@gmail.com
26
+ executables: []
27
+
28
+ extensions: []
29
+
30
+ extra_rdoc_files: []
31
+
32
+ files:
33
+ - .gitignore
34
+ - Gemfile
35
+ - Gemfile.lock
36
+ - README.md
37
+ - Rakefile
38
+ - UNLICENSE.md
39
+ - lib/me2api.rb
40
+ - lib/me2api/agent.rb
41
+ - lib/me2api/api.rb
42
+ - lib/me2api/model.rb
43
+ - lib/me2api/model/band.rb
44
+ - lib/me2api/model/comment.rb
45
+ - lib/me2api/model/friendship_request.rb
46
+ - lib/me2api/model/metoo.rb
47
+ - lib/me2api/model/person.rb
48
+ - lib/me2api/model/post.rb
49
+ - lib/me2api/model/result.rb
50
+ - lib/me2api/model/setting.rb
51
+ - lib/me2api/version.rb
52
+ - me2api-ruby.gemspec
53
+ - test/agent_test.rb
54
+ - test/api_test.rb
55
+ - test/test.png
56
+ - test/test_helper.rb
57
+ homepage: https://github.com/me2day/me2api-ruby
58
+ licenses: []
59
+
60
+ post_install_message:
61
+ rdoc_options: []
62
+
63
+ require_paths:
64
+ - lib
65
+ required_ruby_version: !ruby/object:Gem::Requirement
66
+ none: false
67
+ requirements:
68
+ - - ">="
69
+ - !ruby/object:Gem::Version
70
+ hash: 3
71
+ segments:
72
+ - 0
73
+ version: "0"
74
+ required_rubygems_version: !ruby/object:Gem::Requirement
75
+ none: false
76
+ requirements:
77
+ - - ">="
78
+ - !ruby/object:Gem::Version
79
+ hash: 3
80
+ segments:
81
+ - 0
82
+ version: "0"
83
+ requirements: []
84
+
85
+ rubyforge_project:
86
+ rubygems_version: 1.8.23
87
+ signing_key:
88
+ specification_version: 3
89
+ summary: A Ruby wrapper for the Me2day API
90
+ test_files:
91
+ - test/agent_test.rb
92
+ - test/api_test.rb
93
+ has_rdoc: