infomeme_client 0.2.8 → 0.2.10
Sign up to get free protection for your applications and to get access to all the features.
- data/VERSION +1 -1
- data/infomeme_client.gemspec +3 -2
- data/lib/infomeme_client.rb +12 -12
- data/lib/infomeme_client/base.rb +61 -61
- data/lib/infomeme_client/entity_hash.rb +46 -46
- data/lib/infomeme_client/entity_hash/meme.rb +37 -33
- data/lib/infomeme_client/entity_hash/review.rb +2 -0
- data/lib/infomeme_client/functions/meme.rb +16 -16
- data/lib/infomeme_client/functions/user.rb +57 -58
- data/lib/infomeme_client/functions/user_meme.rb +10 -0
- data/lib/infomeme_client/functions/user_order.rb +24 -24
- data/lib/infomeme_client/meme_application.rb +13 -13
- data/lib/infomeme_client/permissions.rb +16 -16
- data/lib/infomeme_client/response.rb +42 -42
- data/test/test_entity_hash.rb +10 -10
- data/test/test_meme_functions.rb +38 -38
- data/test/test_user_functions.rb +11 -11
- data/test/test_user_meme_functions.rb +44 -36
- metadata +11 -10
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.2.
|
1
|
+
0.2.10
|
data/infomeme_client.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{infomeme_client}
|
8
|
-
s.version = "0.2.
|
8
|
+
s.version = "0.2.10"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Infomeme Ltd."]
|
12
|
-
s.date = %q{2011-
|
12
|
+
s.date = %q{2011-06-09}
|
13
13
|
s.description = %q{A RubyGem for implementing both Infomeme client and meme applications.
|
14
14
|
More coming soon...}
|
15
15
|
s.email = %q{infomeme@infomeme.com}
|
@@ -32,6 +32,7 @@ Gem::Specification.new do |s|
|
|
32
32
|
"lib/infomeme_client/entity_hash/invoice.rb",
|
33
33
|
"lib/infomeme_client/entity_hash/meme.rb",
|
34
34
|
"lib/infomeme_client/entity_hash/meme_type.rb",
|
35
|
+
"lib/infomeme_client/entity_hash/review.rb",
|
35
36
|
"lib/infomeme_client/entity_hash/transaction.rb",
|
36
37
|
"lib/infomeme_client/entity_hash/user.rb",
|
37
38
|
"lib/infomeme_client/errors.rb",
|
data/lib/infomeme_client.rb
CHANGED
@@ -4,19 +4,19 @@ require "net/http/post/multipart"
|
|
4
4
|
require "mime/types"
|
5
5
|
|
6
6
|
class InfomemeClient
|
7
|
-
|
7
|
+
require "infomeme_client/errors"
|
8
8
|
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
9
|
+
autoload :EntityHash, "infomeme_client/entity_hash"
|
10
|
+
autoload :Response, "infomeme_client/response"
|
11
|
+
autoload :Base, "infomeme_client/base"
|
12
|
+
autoload :Communication, "infomeme_client/communication"
|
13
|
+
autoload :Permissions, "infomeme_client/permissions"
|
14
|
+
autoload :Functions, "infomeme_client/functions"
|
15
15
|
|
16
|
-
|
16
|
+
autoload :MemeApplication, "infomeme_client/meme_application"
|
17
17
|
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
18
|
+
include Base
|
19
|
+
include Communication
|
20
|
+
include Permissions
|
21
|
+
include Functions
|
22
22
|
end
|
data/lib/infomeme_client/base.rb
CHANGED
@@ -1,77 +1,77 @@
|
|
1
1
|
module InfomemeClient::Base
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
2
|
+
def initialize(options = {})
|
3
|
+
self.consumer = OAuth::Consumer.new(options[:api_key] || ::INFOMEME_API_KEY, options[:api_secret] || ::INFOMEME_API_SECRET, :site => options[:site] || ::INFOMEME_API_SITE)
|
4
|
+
self.default_language = options[:language] || "en"
|
5
|
+
case
|
6
6
|
when options.key?(:token) && options.key?(:secret) then authorize_with_token(options[:token], options[:secret])
|
7
7
|
when options.key?(:login) && options.key?(:password) then authorize_with_credentials(options[:login], options[:password])
|
8
8
|
else deauthorize
|
9
|
-
|
10
|
-
|
9
|
+
end
|
10
|
+
end
|
11
11
|
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
12
|
+
def request_authorization
|
13
|
+
response = handle_response :get, consumer.request_token_url
|
14
|
+
response.request_token
|
15
|
+
end
|
16
16
|
|
17
|
-
|
18
|
-
|
19
|
-
|
17
|
+
def authorize_url(token, permissions = [])
|
18
|
+
"https://infomeme.com/authorize?token=#{token}&permissions=#{permissions.join(',')}"
|
19
|
+
end
|
20
20
|
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
21
|
+
def authorize_with_verifier(token, secret, verifier)
|
22
|
+
req_token = OAuth::RequestToken.new(consumer, token, secret)
|
23
|
+
response = token_request(req_token, :get, finalize_get_url(consumer.access_token_url, {:oauth_verifier => verifier})) #do request with request_token
|
24
|
+
return false if response.error?
|
25
|
+
authorize_with_token(response.access_token.token, response.access_token.secret)
|
26
|
+
end
|
27
27
|
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
28
|
+
def authorize_with_token(token, secret)
|
29
|
+
access_token = OAuth::AccessToken.new(consumer, token, secret)
|
30
|
+
response = token_request(access_token, :get, "/oauth/verify_access")
|
31
|
+
return false if response.error?
|
32
|
+
self.verified_user = response.user_id
|
33
|
+
self.token = access_token
|
34
|
+
refresh_user_data
|
35
|
+
self
|
36
|
+
end
|
37
37
|
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
38
|
+
def authorize_with_credentials(login, password, permissions = nil)
|
39
|
+
req_token = request_authorization
|
40
|
+
response = put(consumer.authorize_url, {:oauth_token => req_token.token, :login => login, :password => password, :permissions => permissions || all_permissions.collect {|perm| perm.id}})
|
41
|
+
return false if response.error?
|
42
|
+
authorize_with_verifier(req_token.token, req_token.secret, response.verifier)
|
43
|
+
end
|
44
44
|
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
45
|
+
def deauthorize
|
46
|
+
self.verified_user = nil
|
47
|
+
self.token = OAuth::AccessToken.new(consumer)
|
48
|
+
refresh_user_data
|
49
|
+
self
|
50
|
+
end
|
51
51
|
|
52
|
-
|
53
|
-
|
54
|
-
|
52
|
+
def authorized?
|
53
|
+
! verified_user.nil?
|
54
|
+
end
|
55
55
|
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
56
|
+
def credentials(just = nil)
|
57
|
+
creds = {
|
58
|
+
:login => verified_user,
|
59
|
+
:token => token.token,
|
60
|
+
:secret => token.secret,
|
61
|
+
}
|
62
|
+
creds.key?(just) ? creds[just] : creds
|
63
|
+
end
|
64
64
|
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
65
|
+
def inspect
|
66
|
+
@all_permissions ||= all_permissions
|
67
|
+
"#<#{self.class.name}: #{authorized? ? credentials.merge({:permissions => (@all_permissions || []).select {|perm| has_permission?(perm.id)}.collect {|perm| perm.name}}).inspect : 'not authorized'}>"
|
68
|
+
end
|
69
69
|
|
70
|
-
|
71
|
-
|
70
|
+
private
|
71
|
+
attr_accessor :consumer, :token, :verified_user
|
72
72
|
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
73
|
+
def refresh_user_data
|
74
|
+
refresh_settings
|
75
|
+
refresh_permissions
|
76
|
+
end
|
77
77
|
end
|
@@ -1,66 +1,66 @@
|
|
1
1
|
class InfomemeClient::EntityHash
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
2
|
+
autoload :Comment, "infomeme_client/entity_hash/comment"
|
3
|
+
autoload :Invoice, "infomeme_client/entity_hash/invoice"
|
4
|
+
autoload :Meme, "infomeme_client/entity_hash/meme"
|
5
|
+
autoload :MemeType, "infomeme_client/entity_hash/meme_type"
|
6
|
+
autoload :Transaction, "infomeme_client/entity_hash/transaction"
|
7
|
+
autoload :User, "infomeme_client/entity_hash/user"
|
8
8
|
|
9
|
-
|
10
|
-
|
9
|
+
def initialize(hsh, no_freeze = false)
|
10
|
+
@hsh = hsh.inject({}) {|memo, keyvalue| #ripped from ActiveSupport, http://api.rubyonrails.org/classes/ActiveSupport/CoreExtensions/Hash/Keys.html#M000904
|
11
11
|
key, value = keyvalue
|
12
12
|
memo[(key.to_sym rescue key) || key] = map_values(value)
|
13
13
|
memo
|
14
|
-
|
15
|
-
|
16
|
-
|
14
|
+
}
|
15
|
+
freeze unless no_freeze
|
16
|
+
end
|
17
17
|
|
18
|
-
|
19
|
-
|
20
|
-
|
18
|
+
def method_missing(sym)
|
19
|
+
@hsh.key?(sym) ? @hsh[sym] : super
|
20
|
+
end
|
21
21
|
|
22
|
-
|
23
|
-
|
24
|
-
|
22
|
+
def respond_to?(sym, include_private = false)
|
23
|
+
@hsh.key?(sym) ? true : super
|
24
|
+
end
|
25
25
|
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
end
|
26
|
+
def to_hash
|
27
|
+
@hsh.inject({}) do |memo, (key, value)|
|
28
|
+
memo[key] = extract_values(value)
|
29
|
+
memo
|
31
30
|
end
|
31
|
+
end
|
32
32
|
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
end
|
37
|
-
@hsh.freeze
|
38
|
-
super
|
33
|
+
def freeze
|
34
|
+
@hsh.each do |key, val|
|
35
|
+
deep_freeze(val)
|
39
36
|
end
|
37
|
+
@hsh.freeze
|
38
|
+
super
|
39
|
+
end
|
40
40
|
|
41
|
-
|
42
|
-
|
43
|
-
|
41
|
+
def id
|
42
|
+
@hsh.key?(:id) ? @hsh[:id] : super
|
43
|
+
end
|
44
44
|
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
45
|
+
private
|
46
|
+
def map_values(val)
|
47
|
+
case
|
48
|
+
when val.is_a?(Hash) then InfomemeClient::EntityHash.new(val)
|
49
|
+
when val.is_a?(Array) then val.collect {|obj| map_values(obj)}
|
50
|
+
else val
|
51
|
+
end
|
52
|
+
end
|
53
53
|
|
54
54
|
def extract_values(val)
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
55
|
+
case
|
56
|
+
when val.is_a?(InfomemeClient::EntityHash) then val.to_hash
|
57
|
+
when val.is_a?(Array) then val.collect {|obj| extract_values(obj)}
|
58
|
+
else val
|
59
|
+
end
|
60
60
|
end
|
61
61
|
|
62
62
|
def deep_freeze(val)
|
63
|
-
|
64
|
-
|
63
|
+
val.each {|obj| deep_freeze(obj)} if val.is_a?(Array)
|
64
|
+
val.freeze
|
65
65
|
end
|
66
66
|
end
|
@@ -1,45 +1,49 @@
|
|
1
1
|
class InfomemeClient::EntityHash::Meme < InfomemeClient::EntityHash
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
2
|
+
def initialize(meme, client)
|
3
|
+
super(meme, true)
|
4
|
+
@client = client
|
5
|
+
freeze
|
6
|
+
end
|
7
7
|
|
8
|
-
|
8
|
+
#todo: have_access?, published_by_me?, confirmed?, inactive?, incomplete?, has_upload?, etc.
|
9
9
|
|
10
|
-
|
11
|
-
|
12
|
-
|
10
|
+
def update(options = {})
|
11
|
+
@client.update_meme(id, options)
|
12
|
+
end
|
13
13
|
|
14
|
-
|
15
|
-
|
16
|
-
|
14
|
+
def delete
|
15
|
+
@client.delete_meme(id)
|
16
|
+
end
|
17
17
|
|
18
|
-
|
19
|
-
|
20
|
-
|
18
|
+
def confirm
|
19
|
+
@client.confirm_meme(id)
|
20
|
+
end
|
21
21
|
|
22
|
-
|
23
|
-
|
24
|
-
|
22
|
+
def activate
|
23
|
+
@client.activate_meme(id)
|
24
|
+
end
|
25
25
|
|
26
|
-
|
27
|
-
|
28
|
-
|
26
|
+
def deactivate
|
27
|
+
@client.deactivate_meme(id)
|
28
|
+
end
|
29
29
|
|
30
|
-
|
31
|
-
|
32
|
-
|
30
|
+
def upload_url(raw = false)
|
31
|
+
@client.upload_for_meme(id, raw)
|
32
|
+
end
|
33
33
|
|
34
|
-
|
35
|
-
|
36
|
-
|
34
|
+
def upload(file)
|
35
|
+
@client.upload(id, file)
|
36
|
+
end
|
37
37
|
|
38
|
-
|
39
|
-
|
40
|
-
|
38
|
+
def review(reveiw)
|
39
|
+
@client.review id, review
|
40
|
+
end
|
41
41
|
|
42
|
-
|
43
|
-
|
44
|
-
|
42
|
+
def rate(rating)
|
43
|
+
@client.rate(id, rating)
|
44
|
+
end
|
45
|
+
|
46
|
+
def comment(comment)
|
47
|
+
@client.comment(id, comment)
|
48
|
+
end
|
45
49
|
end
|
@@ -1,23 +1,23 @@
|
|
1
1
|
module InfomemeClient::Functions::Meme
|
2
|
-
|
3
|
-
|
4
|
-
|
2
|
+
def browse(options = {})
|
3
|
+
get_memes "/memes", options
|
4
|
+
end
|
5
5
|
|
6
|
-
|
7
|
-
|
8
|
-
|
6
|
+
def search(search_token, options = {})
|
7
|
+
get_memes "/memes/search", options.merge({:search_token => search_token})
|
8
|
+
end
|
9
9
|
|
10
|
-
|
11
|
-
|
12
|
-
|
10
|
+
def meme_types
|
11
|
+
extract_from_response :meme_types, :get, "/memes/types"
|
12
|
+
end
|
13
13
|
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
end
|
14
|
+
def meme(meme_id)
|
15
|
+
handle_response :get, "/memes/#{meme_id}" do |resp|
|
16
|
+
resp.extract(:meme, self) unless resp.error?
|
18
17
|
end
|
18
|
+
end
|
19
19
|
|
20
|
-
|
21
|
-
|
22
|
-
|
20
|
+
def meme_comments(meme_id, options = {})
|
21
|
+
extract_or_response :comments, :get, "/memes/#{meme_id}/comments", options
|
22
|
+
end
|
23
23
|
end
|
@@ -1,79 +1,78 @@
|
|
1
1
|
module InfomemeClient::Functions::User
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
authorize_with_credentials username, password and return true
|
8
|
-
end
|
2
|
+
attr_accessor :default_language
|
3
|
+
def register(email, username, password, firstname, lastname, optional_fields = {})
|
4
|
+
optional_fields.store(:language_code, optional_fields.key?(:language) ? optional_fields.delete(:language) : default_language) #language is mandatory
|
5
|
+
handle_response :post, "/users/register", optional_fields.merge({:email => email, :username => username, :password => password, :firstname => firstname, :lastname => lastname}) do
|
6
|
+
authorize_with_credentials username, password and return true
|
9
7
|
end
|
8
|
+
end
|
10
9
|
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
10
|
+
def user(user_id = nil)
|
11
|
+
return false if ! authorized? && user_id.nil?
|
12
|
+
extract_from_response :user, :get, "/users/#{user_id || verified_user}"
|
13
|
+
end
|
15
14
|
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
end
|
15
|
+
def update_settings(attribs = {})
|
16
|
+
return false unless authorized?
|
17
|
+
handle_response :put, "/users/#{verified_user}", attribs do
|
18
|
+
refresh_settings and return true
|
21
19
|
end
|
20
|
+
end
|
22
21
|
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
end
|
22
|
+
def confirm(confirm_code)
|
23
|
+
return false unless authorized?
|
24
|
+
handle_response :put, "/users/#{verified_user}/confirm", {:confirm_code => confirm_code} do
|
25
|
+
refresh_settings and return true
|
28
26
|
end
|
27
|
+
end
|
29
28
|
|
30
|
-
|
31
|
-
|
32
|
-
|
29
|
+
def confirmed?
|
30
|
+
authorized? && settings && settings.confirmed
|
31
|
+
end
|
33
32
|
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
33
|
+
def reset_password(user_id = nil)
|
34
|
+
return false if ! authorized? && user_id.nil?
|
35
|
+
handle_response :get, "/users/#{user_id || verified_user}/reset_password"
|
36
|
+
end
|
38
37
|
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
38
|
+
def new_password(new_password, user_id = nil, confirm_code = "")
|
39
|
+
return false if ! authorized? && user_id.nil?
|
40
|
+
handle_response :put, "/users/#{user_id || verified_user}/new_password", {:new_password => new_password}.merge(user_id.nil? ? {} : {:confirm_code => confirm_code})
|
41
|
+
end
|
43
42
|
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
end
|
43
|
+
def accept_tos
|
44
|
+
return false unless authorized?
|
45
|
+
handle_response :put, "/users/#{verified_user}/accept_tos" do
|
46
|
+
refresh_settings and return true
|
49
47
|
end
|
48
|
+
end
|
50
49
|
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
end
|
50
|
+
def countries
|
51
|
+
handle_response :get, "/users/countries" do |resp|
|
52
|
+
resp.countries unless resp.error?
|
55
53
|
end
|
54
|
+
end
|
56
55
|
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
end
|
56
|
+
def currencies
|
57
|
+
handle_response :get, "/users/currencies" do |resp|
|
58
|
+
resp.currencies unless resp.error?
|
61
59
|
end
|
60
|
+
end
|
62
61
|
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
end
|
62
|
+
def languages
|
63
|
+
handle_response :get, "/users/languages" do |resp|
|
64
|
+
resp.languages unless resp.error?
|
67
65
|
end
|
66
|
+
end
|
68
67
|
|
69
|
-
|
70
|
-
|
68
|
+
private
|
69
|
+
attr_accessor :settings
|
71
70
|
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
71
|
+
def refresh_settings
|
72
|
+
self.settings = nil
|
73
|
+
return false unless authorized?
|
74
|
+
response = get("/users/#{verified_user}")
|
75
|
+
return false if response.error?
|
76
|
+
self.settings = response.user
|
77
|
+
end
|
79
78
|
end
|
@@ -83,6 +83,16 @@ module InfomemeClient::Functions::UserMeme
|
|
83
83
|
File.basename(file.path) if upload_params && http_multipart("https://#{upload_params.bucket}.s3.amazonaws.com/", upload_params.to_hash.reject {|k,v| k == :bucket}.merge(:success_action_status => 200).to_a.push([:file, uploadio(file)])) #ensure file comes last (amazon requires the order)
|
84
84
|
end
|
85
85
|
|
86
|
+
def review(meme_id, review)
|
87
|
+
return false unless authorized?
|
88
|
+
handle_response :post, "/users/#{verified_user}/memes/#{meme_id}/reviews", {:review => review}
|
89
|
+
end
|
90
|
+
|
91
|
+
def review(meme_id, rating, comment)
|
92
|
+
return false unless authorized?
|
93
|
+
handle_response :post, "/users/#{verified_user}/memes/#{meme_id}/reviews", {:rating => rating, :comment => comment}
|
94
|
+
end
|
95
|
+
|
86
96
|
def rate(meme_id, rating)
|
87
97
|
return false unless authorized?
|
88
98
|
handle_response :post, "/users/#{verified_user}/memes/#{meme_id}/rates", {:rating => rating}
|
@@ -1,31 +1,31 @@
|
|
1
1
|
module InfomemeClient::Functions::UserOrder
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
2
|
+
def order(meme_id, source, options = {})
|
3
|
+
return false unless authorized?
|
4
|
+
handle_response :post, "/users/#{verified_user}/memes/#{meme_id}/order", options.merge(:source => source)
|
5
|
+
end
|
6
6
|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
7
|
+
def order_with_balance(meme_id, options = {})
|
8
|
+
order(meme_id, 1, options)
|
9
|
+
refresh_settings
|
10
|
+
true
|
11
|
+
end
|
12
12
|
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
def order_with_paypal(meme_id, options = {})
|
14
|
+
order(meme_id, 3, options).paypal_url
|
15
|
+
end
|
16
16
|
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
17
|
+
def transactions(options = {})
|
18
|
+
return false unless authorized?
|
19
|
+
extract_or_response :transactions, :get, "/users/#{verified_user}/transactions", options
|
20
|
+
end
|
21
21
|
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
22
|
+
def invoices(options = {})
|
23
|
+
return false unless authorized?
|
24
|
+
extract_or_response :invoices, :get, "/users/#{verified_user}/invoices", options
|
25
|
+
end
|
26
26
|
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
27
|
+
def invoice(invoice_id)
|
28
|
+
return false unless authorized?
|
29
|
+
extract_from_response :invoice, :get, "/users/#{verified_user}/invoices/#{invoice_id}"
|
30
|
+
end
|
31
31
|
end
|
@@ -1,18 +1,18 @@
|
|
1
1
|
class InfomemeClient::MemeApplication
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
2
|
+
def initialize(options = {})
|
3
|
+
self.consumer = OAuth::Consumer.new(options[:api_key] || ::INFOMEME_API_KEY, options[:api_secret] || ::INFOMEME_API_SECRET, :site => options[:site] || ::INFOMEME_API_SITE)
|
4
|
+
self.token = OAuth::AccessToken.new(consumer)
|
5
|
+
end
|
6
6
|
|
7
|
-
|
8
|
-
|
9
|
-
|
7
|
+
def verify_access(access_type, meme_id, oauth_token, oauth_nonce, oauth_timestamp, oauth_signature)
|
8
|
+
handle_response :post, "/meme_app/verify_access", {:access_type => access_type, :meme_id => meme_id, :verify_token => oauth_token, :verify_nonce => oauth_nonce, :verify_timestamp => oauth_timestamp, :verify_signature => oauth_signature}
|
9
|
+
end
|
10
10
|
|
11
|
-
|
12
|
-
|
13
|
-
|
11
|
+
def update_meme(meme_id, description, has_upload = true)
|
12
|
+
handle_response :put, "/meme_app/memes/#{meme_id}", {:description => description, :has_upload => has_upload}
|
13
|
+
end
|
14
14
|
|
15
|
-
|
16
|
-
|
17
|
-
|
15
|
+
private
|
16
|
+
attr_accessor :consumer, :token
|
17
|
+
include InfomemeClient::Communication
|
18
18
|
end
|
@@ -1,22 +1,22 @@
|
|
1
1
|
module InfomemeClient::Permissions
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
end
|
2
|
+
def all_permissions
|
3
|
+
handle_response :get, "/oauth/permissions" do |resp|
|
4
|
+
resp.permissions unless resp.error?
|
6
5
|
end
|
6
|
+
end
|
7
7
|
|
8
|
-
|
9
|
-
|
10
|
-
|
8
|
+
def has_permission?(perm)
|
9
|
+
authorized? && permissions && permissions.include?(perm)
|
10
|
+
end
|
11
11
|
|
12
|
-
|
13
|
-
|
12
|
+
private
|
13
|
+
attr_accessor :permissions
|
14
14
|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
15
|
+
def refresh_permissions
|
16
|
+
self.permissions = nil
|
17
|
+
return false unless authorized?
|
18
|
+
response = get "/users/#{verified_user}/permissions"
|
19
|
+
return false if response.error?
|
20
|
+
self.permissions = response.permissions
|
21
|
+
end
|
22
22
|
end
|
@@ -1,52 +1,52 @@
|
|
1
1
|
class InfomemeClient::Response < InfomemeClient::EntityHash
|
2
|
-
|
3
|
-
|
4
|
-
|
2
|
+
STATUS_FAILED = -1
|
3
|
+
STATUS_OK = 0
|
4
|
+
STATUS_ERROR = 1
|
5
5
|
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
6
|
+
ERRORS = {
|
7
|
+
"request_failed" => InfomemeClient::Error::RequestFailed,
|
8
|
+
"error" => InfomemeClient::Error,
|
9
|
+
"internal_error" => InfomemeClient::Error::InternalError,
|
10
|
+
"no_access" => InfomemeClient::Error::NoAccess,
|
11
|
+
"not_found" => InfomemeClient::Error::NotFound,
|
12
|
+
}.freeze
|
13
13
|
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
end
|
19
|
-
freeze
|
14
|
+
def initialize(response)
|
15
|
+
super(response.is_a?(Exception) ? {:status => STATUS_FAILED, :message => "Request failed.", :error_code => "request_failed", :errors => {:base => {response.class.name.to_sym => response.message}}} : response, true)
|
16
|
+
ERRORS.each do |key, val|
|
17
|
+
instance_eval "def #{val.name.split('::').last.sub(/\b\w/) { $&.downcase }}Error?; error_code == #{key}; end"
|
20
18
|
end
|
19
|
+
freeze
|
20
|
+
end
|
21
21
|
|
22
|
-
|
23
|
-
|
24
|
-
|
22
|
+
def failed?
|
23
|
+
status == STATUS_FAILED
|
24
|
+
end
|
25
25
|
|
26
|
-
|
27
|
-
|
28
|
-
|
26
|
+
def error?
|
27
|
+
status != STATUS_OK
|
28
|
+
end
|
29
29
|
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
30
|
+
def raise_error(options = {})
|
31
|
+
return false unless error?
|
32
|
+
return false if options.key?(:only) && ! options[:only].include?(error_code)
|
33
|
+
return false if options.key?(:except) && options[:except].include?(error_code)
|
34
|
+
err = ERRORS.key?(error_code) ? ERRORS[error_code] : InfomemeClient::Error
|
35
|
+
raise err, [(respond_to?(:errors) ? errors.to_hash : nil), message]
|
36
|
+
end
|
37
37
|
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
end
|
49
|
-
stored = to_hash[key]
|
50
|
-
stored.is_a?(Array) ? stored.collect {|val| klass.new *[val, extra_args]} : klass.new(*[stored, extra_args])
|
38
|
+
def extract(key, *extra_args)
|
39
|
+
return nil unless @hsh.key?(key)
|
40
|
+
klass = case key
|
41
|
+
when :comments then InfomemeClient::EntityHash::Comment
|
42
|
+
when :meme, :memes then InfomemeClient::EntityHash::Meme
|
43
|
+
when :meme_types then InfomemeClient::EntityHash::MemeType
|
44
|
+
when :user then InfomemeClient::EntityHash::User
|
45
|
+
when :transactions then InfomemeClient::EntityHash::Transaction
|
46
|
+
when :invoice, :invoices then InfomemeClient::EntityHash::Invoice
|
47
|
+
else InfomemeClient::EntityHash
|
51
48
|
end
|
49
|
+
stored = to_hash[key]
|
50
|
+
stored.is_a?(Array) ? stored.collect {|val| klass.new *[val, extra_args]} : klass.new(*[stored, extra_args])
|
51
|
+
end
|
52
52
|
end
|
data/test/test_entity_hash.rb
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
require "helper"
|
2
2
|
|
3
3
|
class TestEntityHash < Test::Unit::TestCase
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
4
|
+
def test_entity_hash_attributes_available
|
5
|
+
eh = InfomemeClient::EntityHash.new({:foo => "bar"})
|
6
|
+
assert_respond_to eh, :foo
|
7
|
+
assert_equal "bar", eh.foo
|
8
|
+
end
|
9
9
|
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
10
|
+
def test_entity_hash_retrieve_hash
|
11
|
+
hash = {:foo => "bar", :bar => [{:foo => "bar"}]}
|
12
|
+
eh = InfomemeClient::EntityHash.new(hash)
|
13
|
+
assert_equal hash, eh.to_hash
|
14
|
+
end
|
15
15
|
end
|
data/test/test_meme_functions.rb
CHANGED
@@ -1,46 +1,46 @@
|
|
1
1
|
require "helper"
|
2
2
|
|
3
3
|
class TestMemeFunctions < Test::Unit::TestCase
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
4
|
+
def test_browse
|
5
|
+
fake_request(:get, "/memes?page=1&pageSize=25&sort=date-asc", :body => fixture("memes/memes"), :content_type => "application/json")
|
6
|
+
check_paged :memes, @im_client.browse(:page => 1, :pageSize => 25, :sort => "date-asc", :no_extract => true)
|
7
|
+
check_list :memes, @im_client.browse(:page => 1, :pageSize => 25, :sort => "date-asc")
|
8
|
+
end
|
9
9
|
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
10
|
+
def test_search
|
11
|
+
fake_request(:get, "/memes/search?search_token=a&page=1&pageSize=25&sort=date-asc", :body => fixture("memes/memes"), :content_type => "application/json")
|
12
|
+
check_paged :memes, @im_client.search("a", :page => 1, :pageSize => 25, :sort => "date-asc", :no_extract => true)
|
13
|
+
check_list :memes, @im_client.search("a", :page => 1, :pageSize => 25, :sort => "date-asc")
|
14
|
+
end
|
15
15
|
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
16
|
+
def test_meme_types
|
17
|
+
fake_request(:get, "/memes/types", :body => fixture("memes/types"), :content_type => "application/json")
|
18
|
+
types = @im_client.meme_types
|
19
|
+
check_list :meme_types, types
|
20
|
+
assert types.size > 0
|
21
|
+
assert_respond_to types[0], :id
|
22
|
+
assert_respond_to types[0], :name
|
23
|
+
assert_respond_to types[0], :url
|
24
|
+
assert_respond_to types[0], :summary
|
25
|
+
assert_respond_to types[0], :description
|
26
|
+
assert_equal 1, types[0].id
|
27
|
+
assert_equal "TEST", types[0].name
|
28
|
+
assert_equal "http://test.url", types[0].url
|
29
|
+
assert_equal "test summary", types[0].summary
|
30
|
+
assert_equal "test description", types[0].description
|
31
|
+
end
|
32
32
|
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
33
|
+
def test_meme
|
34
|
+
fake_request(:get, "/memes/1", :body => fixture("memes/meme"), :content_type => "application/json")
|
35
|
+
meme = @im_client.meme(1)
|
36
|
+
check_eh :meme, meme
|
37
|
+
assert_respond_to meme, :name
|
38
|
+
assert_equal "test meme 1", meme.name
|
39
|
+
end
|
40
40
|
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
41
|
+
def test_meme_comments
|
42
|
+
fake_request(:get, "/memes/1/comments?page=1&pageSize=25", :body => fixture("memes/comments"), :content_type => "application/json")
|
43
|
+
check_paged :comments, @im_client.meme_comments(1, :page => 1, :pageSize => 25, :no_extract => true)
|
44
|
+
check_list :comments, @im_client.meme_comments(1, :page => 1, :pageSize => 25)
|
45
|
+
end
|
46
46
|
end
|
data/test/test_user_functions.rb
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
require "helper"
|
2
2
|
|
3
3
|
class TestUserFunctions < Test::Unit::TestCase
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
4
|
+
def test_user
|
5
|
+
fake_request(:get, "/users/test_user", :body => fixture("users/user_public"), :content_type => "application/json")
|
6
|
+
user = @im_client.user("test_user")
|
7
|
+
check_eh :user, user
|
8
|
+
assert_respond_to user, :username
|
9
|
+
assert_equal "test_user", user.username
|
10
|
+
assert_respond_to user, :comments
|
11
|
+
assert_equal 3, user.comments
|
12
|
+
assert_respond_to user, :ratings
|
13
|
+
assert_equal 3, user.ratings
|
14
|
+
end
|
15
15
|
end
|
@@ -1,47 +1,55 @@
|
|
1
1
|
require "helper"
|
2
2
|
|
3
3
|
class TestUserMemeFunctions < Test::Unit::TestCase
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
4
|
+
def test_library
|
5
|
+
fake_request(:get, "/users/test_user/memes?page=1&pageSize=25&sort=date-asc", :body => fixture("users/memes"), :content_type => "application/json")
|
6
|
+
authorize
|
7
|
+
check_paged :memes, @im_client.library(:page => 1, :pageSize => 25, :sort => "date-asc", :no_extract => true)
|
8
|
+
check_list :memes, @im_client.library(:page => 1, :pageSize => 25, :sort => "date-asc")
|
9
|
+
end
|
10
10
|
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
11
|
+
def test_published
|
12
|
+
fake_request(:get, "/users/test_user/memes/published?page=1&pageSize=25&sort=date-asc", :body => fixture("users/memes"), :content_type => "application/json")
|
13
|
+
authorize
|
14
|
+
check_paged :memes, @im_client.published(:page => 1, :pageSize => 25, :sort => "date-asc", :no_extract => true)
|
15
|
+
check_list :memes, @im_client.published(:page => 1, :pageSize => 25, :sort => "date-asc")
|
16
|
+
end
|
17
17
|
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
18
|
+
def test_inactive
|
19
|
+
fake_request(:get, "/users/test_user/memes/inactive?page=1&pageSize=25&sort=date-asc", :body => fixture("users/memes"), :content_type => "application/json")
|
20
|
+
authorize
|
21
|
+
check_paged :memes, @im_client.inactive(:page => 1, :pageSize => 25, :sort => "date-asc", :no_extract => true)
|
22
|
+
check_list :memes, @im_client.inactive(:page => 1, :pageSize => 25, :sort => "date-asc")
|
23
|
+
end
|
24
24
|
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
25
|
+
def test_incomplete
|
26
|
+
fake_request(:get, "/users/test_user/memes/incomplete?page=1&pageSize=25&sort=date-asc", :body => fixture("users/memes"), :content_type => "application/json")
|
27
|
+
authorize
|
28
|
+
check_paged :memes, @im_client.incomplete(:page => 1, :pageSize => 25, :sort => "date-asc", :no_extract => true)
|
29
|
+
check_list :memes, @im_client.incomplete(:page => 1, :pageSize => 25, :sort => "date-asc")
|
30
|
+
end
|
31
31
|
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
end
|
32
|
+
def test_comment
|
33
|
+
fake_request(:post, "/users/test_user/memes/1/comments", :body => fixture("response/ok"), :content_type => "application/json")
|
34
|
+
authorize
|
35
|
+
assert_nothing_raised do
|
36
|
+
assert @im_client.comment(1, "test comment")
|
38
37
|
end
|
38
|
+
end
|
39
39
|
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
40
|
+
def test_rate
|
41
|
+
fake_request(:post, "/users/test_user/memes/1/rates", :body => fixture("response/ok"), :content_type => "application/json")
|
42
|
+
authorize
|
43
|
+
assert_nothing_raised do
|
44
|
+
assert @im_client.rate(1, 1)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def test_review
|
49
|
+
fake_request(:post, "/user/test_user/memes/1/reviews", :body => fixture("response/ok"), :content_type => "application/json")
|
50
|
+
authorize
|
51
|
+
assert_nothing_raised do
|
52
|
+
assert @im_client.rate(1, {:rate => 1, :comment => "lajos"})
|
46
53
|
end
|
54
|
+
end
|
47
55
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: infomeme_client
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.10
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,12 +9,12 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2011-
|
12
|
+
date: 2011-06-09 00:00:00.000000000 +02:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: oauth
|
17
|
-
requirement: &
|
17
|
+
requirement: &21418220 !ruby/object:Gem::Requirement
|
18
18
|
none: false
|
19
19
|
requirements:
|
20
20
|
- - ! '>='
|
@@ -22,10 +22,10 @@ dependencies:
|
|
22
22
|
version: '0'
|
23
23
|
type: :runtime
|
24
24
|
prerelease: false
|
25
|
-
version_requirements: *
|
25
|
+
version_requirements: *21418220
|
26
26
|
- !ruby/object:Gem::Dependency
|
27
27
|
name: json
|
28
|
-
requirement: &
|
28
|
+
requirement: &21417700 !ruby/object:Gem::Requirement
|
29
29
|
none: false
|
30
30
|
requirements:
|
31
31
|
- - ! '>='
|
@@ -33,10 +33,10 @@ dependencies:
|
|
33
33
|
version: '0'
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
|
-
version_requirements: *
|
36
|
+
version_requirements: *21417700
|
37
37
|
- !ruby/object:Gem::Dependency
|
38
38
|
name: multipart-post
|
39
|
-
requirement: &
|
39
|
+
requirement: &21417160 !ruby/object:Gem::Requirement
|
40
40
|
none: false
|
41
41
|
requirements:
|
42
42
|
- - ! '>='
|
@@ -44,10 +44,10 @@ dependencies:
|
|
44
44
|
version: '0'
|
45
45
|
type: :runtime
|
46
46
|
prerelease: false
|
47
|
-
version_requirements: *
|
47
|
+
version_requirements: *21417160
|
48
48
|
- !ruby/object:Gem::Dependency
|
49
49
|
name: mime-types
|
50
|
-
requirement: &
|
50
|
+
requirement: &21416660 !ruby/object:Gem::Requirement
|
51
51
|
none: false
|
52
52
|
requirements:
|
53
53
|
- - ! '>='
|
@@ -55,7 +55,7 @@ dependencies:
|
|
55
55
|
version: '0'
|
56
56
|
type: :runtime
|
57
57
|
prerelease: false
|
58
|
-
version_requirements: *
|
58
|
+
version_requirements: *21416660
|
59
59
|
description: ! "A RubyGem for implementing both Infomeme client and meme applications.\n
|
60
60
|
More coming soon..."
|
61
61
|
email: infomeme@infomeme.com
|
@@ -79,6 +79,7 @@ files:
|
|
79
79
|
- lib/infomeme_client/entity_hash/invoice.rb
|
80
80
|
- lib/infomeme_client/entity_hash/meme.rb
|
81
81
|
- lib/infomeme_client/entity_hash/meme_type.rb
|
82
|
+
- lib/infomeme_client/entity_hash/review.rb
|
82
83
|
- lib/infomeme_client/entity_hash/transaction.rb
|
83
84
|
- lib/infomeme_client/entity_hash/user.rb
|
84
85
|
- lib/infomeme_client/errors.rb
|