infomeme_client 0.1.4 → 0.2.1
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.
- metadata +26 -165
- data/.document +0 -5
- data/.gitignore +0 -21
- data/LICENSE +0 -20
- data/README.rdoc +0 -8
- data/Rakefile +0 -55
- data/VERSION +0 -1
- data/lib/infomeme_client.rb +0 -22
- data/lib/infomeme_client/base.rb +0 -77
- data/lib/infomeme_client/communication.rb +0 -75
- data/lib/infomeme_client/entity_hash.rb +0 -66
- data/lib/infomeme_client/entity_hash/comment.rb +0 -2
- data/lib/infomeme_client/entity_hash/invoice.rb +0 -2
- data/lib/infomeme_client/entity_hash/meme.rb +0 -45
- data/lib/infomeme_client/entity_hash/meme_type.rb +0 -2
- data/lib/infomeme_client/entity_hash/transaction.rb +0 -2
- data/lib/infomeme_client/entity_hash/user.rb +0 -2
- data/lib/infomeme_client/errors.rb +0 -22
- data/lib/infomeme_client/functions.rb +0 -16
- data/lib/infomeme_client/functions/meme.rb +0 -23
- data/lib/infomeme_client/functions/user.rb +0 -79
- data/lib/infomeme_client/functions/user_meme.rb +0 -127
- data/lib/infomeme_client/functions/user_order.rb +0 -31
- data/lib/infomeme_client/meme_application.rb +0 -18
- data/lib/infomeme_client/permissions.rb +0 -22
- data/lib/infomeme_client/response.rb +0 -52
- data/test/fixtures/memes/comments.json +0 -1
- data/test/fixtures/memes/meme.json +0 -1
- data/test/fixtures/memes/memes.json +0 -1
- data/test/fixtures/memes/types.json +0 -1
- data/test/fixtures/oauth/access_token.json +0 -1
- data/test/fixtures/oauth/authorize.json +0 -1
- data/test/fixtures/oauth/permissions.json +0 -1
- data/test/fixtures/oauth/request_token.json +0 -1
- data/test/fixtures/oauth/verify_access.json +0 -1
- data/test/fixtures/response/error.json +0 -1
- data/test/fixtures/response/ok.json +0 -1
- data/test/fixtures/response/test.json +0 -1
- data/test/fixtures/response/test_extract.json +0 -1
- data/test/fixtures/users/invoice.json +0 -1
- data/test/fixtures/users/invoices.json +0 -1
- data/test/fixtures/users/memes.json +0 -1
- data/test/fixtures/users/order_paypal.json +0 -1
- data/test/fixtures/users/permissions.json +0 -1
- data/test/fixtures/users/transactions.json +0 -1
- data/test/fixtures/users/user.json +0 -1
- data/test/fixtures/users/user_public.json +0 -1
- data/test/helper.rb +0 -69
- data/test/test_authorization.rb +0 -56
- data/test/test_communication.rb +0 -46
- data/test/test_entity_hash.rb +0 -15
- data/test/test_meme_functions.rb +0 -46
- data/test/test_permissions.rb +0 -25
- data/test/test_user_functions.rb +0 -15
- data/test/test_user_meme_functions.rb +0 -47
- data/test/test_user_order_functions.rb +0 -45
@@ -1,66 +0,0 @@
|
|
1
|
-
class InfomemeClient::EntityHash
|
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
|
-
|
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
|
-
key, value = keyvalue
|
12
|
-
memo[(key.to_sym rescue key) || key] = map_values(value)
|
13
|
-
memo
|
14
|
-
}
|
15
|
-
freeze unless no_freeze
|
16
|
-
end
|
17
|
-
|
18
|
-
def method_missing(sym)
|
19
|
-
@hsh.key?(sym) ? @hsh[sym] : super
|
20
|
-
end
|
21
|
-
|
22
|
-
def respond_to?(sym, include_private = false)
|
23
|
-
@hsh.key?(sym) ? true : super
|
24
|
-
end
|
25
|
-
|
26
|
-
def to_hash
|
27
|
-
@hsh.inject({}) do |memo, (key, value)|
|
28
|
-
memo[key] = extract_values(value)
|
29
|
-
memo
|
30
|
-
end
|
31
|
-
end
|
32
|
-
|
33
|
-
def freeze
|
34
|
-
@hsh.each do |key, val|
|
35
|
-
deep_freeze(val)
|
36
|
-
end
|
37
|
-
@hsh.freeze
|
38
|
-
super
|
39
|
-
end
|
40
|
-
|
41
|
-
def id
|
42
|
-
@hsh.key?(:id) ? @hsh[:id] : super
|
43
|
-
end
|
44
|
-
|
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
|
-
|
54
|
-
def extract_values(val)
|
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
|
-
end
|
61
|
-
|
62
|
-
def deep_freeze(val)
|
63
|
-
val.each {|obj| deep_freeze(obj)} if val.is_a?(Array)
|
64
|
-
val.freeze
|
65
|
-
end
|
66
|
-
end
|
@@ -1,45 +0,0 @@
|
|
1
|
-
class InfomemeClient::EntityHash::Meme < InfomemeClient::EntityHash
|
2
|
-
def initialize(meme, client)
|
3
|
-
super(meme, true)
|
4
|
-
@client = client
|
5
|
-
freeze
|
6
|
-
end
|
7
|
-
|
8
|
-
#todo: have_access?, published_by_me?, confirmed?, inactive?, incomplete?, has_upload?, etc.
|
9
|
-
|
10
|
-
def update(options = {})
|
11
|
-
@client.update_meme(id, options)
|
12
|
-
end
|
13
|
-
|
14
|
-
def delete
|
15
|
-
@client.delete_meme(id)
|
16
|
-
end
|
17
|
-
|
18
|
-
def confirm
|
19
|
-
@client.confirm_meme(id)
|
20
|
-
end
|
21
|
-
|
22
|
-
def activate
|
23
|
-
@client.activate_meme(id)
|
24
|
-
end
|
25
|
-
|
26
|
-
def deactivate
|
27
|
-
@client.deactivate_meme(id)
|
28
|
-
end
|
29
|
-
|
30
|
-
def upload_url(raw = false)
|
31
|
-
@client.upload_for_meme(id, raw)
|
32
|
-
end
|
33
|
-
|
34
|
-
def upload(file)
|
35
|
-
@client.upload(id, file)
|
36
|
-
end
|
37
|
-
|
38
|
-
def rate(rating)
|
39
|
-
@client.rate(id, rating)
|
40
|
-
end
|
41
|
-
|
42
|
-
def comment(comment)
|
43
|
-
@client.comment(id, comment)
|
44
|
-
end
|
45
|
-
end
|
@@ -1,22 +0,0 @@
|
|
1
|
-
class InfomemeClient::Error < StandardError
|
2
|
-
class RequestFailed < self ; end
|
3
|
-
class InternalError < self ; end
|
4
|
-
class NoAccess < self ; end
|
5
|
-
class NotFound < self ; end
|
6
|
-
|
7
|
-
attr_reader :errors
|
8
|
-
|
9
|
-
def initialize(args)
|
10
|
-
@errors = args.shift
|
11
|
-
msg = args.shift
|
12
|
-
super(msg)
|
13
|
-
end
|
14
|
-
|
15
|
-
def message
|
16
|
-
"#{super} Errors: #{errors.inspect}"
|
17
|
-
end
|
18
|
-
|
19
|
-
def inspect
|
20
|
-
"<#{self.class.inspect} #{self.message}>"
|
21
|
-
end
|
22
|
-
end
|
@@ -1,16 +0,0 @@
|
|
1
|
-
module InfomemeClient::Functions
|
2
|
-
autoload :Meme, "infomeme_client/functions/meme"
|
3
|
-
autoload :User, "infomeme_client/functions/user"
|
4
|
-
autoload :UserMeme, "infomeme_client/functions/user_meme"
|
5
|
-
autoload :UserOrder, "infomeme_client/functions/user_order"
|
6
|
-
|
7
|
-
include Meme
|
8
|
-
include User
|
9
|
-
include UserMeme
|
10
|
-
include UserOrder
|
11
|
-
|
12
|
-
private
|
13
|
-
def get_memes(path, options = {}, headers = {})
|
14
|
-
extract_or_response :memes, :get, path, options, headers
|
15
|
-
end
|
16
|
-
end
|
@@ -1,23 +0,0 @@
|
|
1
|
-
module InfomemeClient::Functions::Meme
|
2
|
-
def browse(options = {})
|
3
|
-
get_memes "/memes", options
|
4
|
-
end
|
5
|
-
|
6
|
-
def search(search_token, options = {})
|
7
|
-
get_memes "/memes/search", options.merge({:search_token => search_token})
|
8
|
-
end
|
9
|
-
|
10
|
-
def meme_types
|
11
|
-
extract_from_response :meme_types, :get, "/memes/types"
|
12
|
-
end
|
13
|
-
|
14
|
-
def meme(meme_id)
|
15
|
-
handle_response :get, "/memes/#{meme_id}" do |resp|
|
16
|
-
resp.extract(:meme, self) unless resp.error?
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
|
-
def meme_comments(meme_id, options = {})
|
21
|
-
extract_or_response :comments, :get, "/memes/#{meme_id}/comments", options
|
22
|
-
end
|
23
|
-
end
|
@@ -1,79 +0,0 @@
|
|
1
|
-
module InfomemeClient::Functions::User
|
2
|
-
attr_accessor :default_language
|
3
|
-
|
4
|
-
def register(email, username, password, firstname, lastname, optional_fields = {})
|
5
|
-
optional_fields.store(:language_code, optional_fields.key?(:language) ? optional_fields.delete(:language) : default_language) #language is mandatory
|
6
|
-
handle_response :post, "/users/register", optional_fields.merge({:email => email, :username => username, :password => password, :firstname => firstname, :lastname => lastname}) do
|
7
|
-
authorize_with_credentials username, password and return true
|
8
|
-
end
|
9
|
-
end
|
10
|
-
|
11
|
-
def user(user_id = nil)
|
12
|
-
return false if ! authorized? && user_id.nil?
|
13
|
-
extract_from_response :user, :get, "/users/#{user_id || verified_user}"
|
14
|
-
end
|
15
|
-
|
16
|
-
def update_settings(attribs = {})
|
17
|
-
return false unless authorized?
|
18
|
-
handle_response :put, "/users/#{verified_user}", attribs do
|
19
|
-
refresh_settings and return true
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
23
|
-
def confirm(confirm_code)
|
24
|
-
return false unless authorized?
|
25
|
-
handle_response :put, "/users/#{verified_user}/confirm", {:confirm_code => confirm_code} do
|
26
|
-
refresh_settings and return true
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
def confirmed?
|
31
|
-
authorized? && settings && settings.confirmed
|
32
|
-
end
|
33
|
-
|
34
|
-
def reset_password(user_id = nil)
|
35
|
-
return false if ! authorized? && user_id.nil?
|
36
|
-
handle_response :get, "/users/#{user_id || verified_user}/reset_password"
|
37
|
-
end
|
38
|
-
|
39
|
-
def new_password(new_password, user_id = nil, confirm_code = "")
|
40
|
-
return false if ! authorized? && user_id.nil?
|
41
|
-
handle_response :put, "/users/#{user_id || verified_user}/new_password", {:new_password => new_password}.merge(user_id.nil? ? {} : {:confirm_code => confirm_code})
|
42
|
-
end
|
43
|
-
|
44
|
-
def accept_tos
|
45
|
-
return false unless authorized?
|
46
|
-
handle_response :put, "/users/#{verified_user}/accept_tos" do
|
47
|
-
refresh_settings and return true
|
48
|
-
end
|
49
|
-
end
|
50
|
-
|
51
|
-
def countries
|
52
|
-
handle_response :get, "/users/countries" do |resp|
|
53
|
-
resp.countries unless resp.error?
|
54
|
-
end
|
55
|
-
end
|
56
|
-
|
57
|
-
def currencies
|
58
|
-
handle_response :get, "/users/currencies" do |resp|
|
59
|
-
resp.currencies unless resp.error?
|
60
|
-
end
|
61
|
-
end
|
62
|
-
|
63
|
-
def languages
|
64
|
-
handle_response :get, "/users/languages" do |resp|
|
65
|
-
resp.languages unless resp.error?
|
66
|
-
end
|
67
|
-
end
|
68
|
-
|
69
|
-
private
|
70
|
-
attr_accessor :settings
|
71
|
-
|
72
|
-
def refresh_settings
|
73
|
-
self.settings = nil
|
74
|
-
return false unless authorized?
|
75
|
-
response = get("/users/#{verified_user}")
|
76
|
-
return false if response.error?
|
77
|
-
self.settings = response.user
|
78
|
-
end
|
79
|
-
end
|
@@ -1,127 +0,0 @@
|
|
1
|
-
module InfomemeClient::Functions::UserMeme
|
2
|
-
def library(options = {})
|
3
|
-
get_own_memes options
|
4
|
-
end
|
5
|
-
|
6
|
-
def published(options = {})
|
7
|
-
get_own_memes options, "published"
|
8
|
-
end
|
9
|
-
|
10
|
-
def inactive(options = {})
|
11
|
-
get_own_memes options, "inactive"
|
12
|
-
end
|
13
|
-
|
14
|
-
def incomplete(options = {})
|
15
|
-
get_own_memes options, "incomplete"
|
16
|
-
end
|
17
|
-
|
18
|
-
def can_publish?
|
19
|
-
authorized? && settings && settings.can_publish
|
20
|
-
end
|
21
|
-
|
22
|
-
def publish(meme_type, options = {})
|
23
|
-
return false unless can_publish?
|
24
|
-
skip_upload = options.key?(:skip_upload) && options[:skip_upload]
|
25
|
-
options[:image] = upload_image(options[:image]) if ! skip_upload && options.key?(:image) && ! options[:image].nil? && options[:image] != ""
|
26
|
-
meme_type = meme_type.id if meme_type.is_a?(InfomemeClient::EntityHash::MemeType)
|
27
|
-
meme_id = handle_response :post, "/users/#{verified_user}/memes", options.reject {|k,v| k == :file}.merge({:type => meme_type}) do |resp|
|
28
|
-
resp.meme_id unless resp.error?
|
29
|
-
end
|
30
|
-
upload(meme_id, options[:file]) if options.key?(:file)
|
31
|
-
meme_id
|
32
|
-
end
|
33
|
-
|
34
|
-
def published_meme(meme_id)
|
35
|
-
return false unless authorized?
|
36
|
-
extract_from_response :meme, :get, "/users/#{verified_user}/memes/#{meme_id}"
|
37
|
-
end
|
38
|
-
|
39
|
-
def update_meme(meme_id, options = {})
|
40
|
-
options[:image] = upload_image(options[:image]) if options.key?(:image)
|
41
|
-
meme_function meme_id, :put, nil, options
|
42
|
-
end
|
43
|
-
|
44
|
-
def delete_meme(meme_id)
|
45
|
-
meme_function meme_id, :delete
|
46
|
-
end
|
47
|
-
|
48
|
-
def confirm_meme(meme_id)
|
49
|
-
meme_function meme_id, :put, "confirm"
|
50
|
-
end
|
51
|
-
|
52
|
-
def activate_meme(meme_id)
|
53
|
-
meme_function meme_id, :put, "activate"
|
54
|
-
end
|
55
|
-
|
56
|
-
def deactivate_meme(meme_id)
|
57
|
-
meme_function meme_id, :put, "deactivate"
|
58
|
-
end
|
59
|
-
|
60
|
-
def upload_for_meme(meme_id, raw = false)
|
61
|
-
return false unless authorized?
|
62
|
-
handle_response :get, "/users/#{verified_user}/memes/#{meme_id}/upload_url" do |resp|
|
63
|
-
(raw ? resp.upload_url : finalize_get_url(resp.upload_url, generate_signature.merge(:meme_id => meme_id))) unless resp.error?
|
64
|
-
end
|
65
|
-
end
|
66
|
-
|
67
|
-
def image_upload_for_memes
|
68
|
-
return false unless authorized?
|
69
|
-
handle_response :get, "/users/#{verified_user}/memes/image_upload_parameters" do |resp|
|
70
|
-
resp.image_upload_parameters unless resp.error?
|
71
|
-
end
|
72
|
-
end
|
73
|
-
|
74
|
-
def upload(meme_id, file)
|
75
|
-
file = File.new(file) if file.is_a?(String)
|
76
|
-
upload_url = upload_for_meme(meme_id, true)
|
77
|
-
http_multipart(upload_url, generate_signature.merge({:meme_id => meme_id, :file => uploadio(file)})) if upload_url
|
78
|
-
end
|
79
|
-
|
80
|
-
def upload_image(file)
|
81
|
-
file = File.new(file) if file.is_a?(String)
|
82
|
-
upload_params = image_upload_for_memes
|
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
|
-
end
|
85
|
-
|
86
|
-
def rate(meme_id, rating)
|
87
|
-
return false unless authorized?
|
88
|
-
handle_response :post, "/users/#{verified_user}/memes/#{meme_id}/rates", {:rating => rating}
|
89
|
-
end
|
90
|
-
|
91
|
-
def comment(meme_id, comment)
|
92
|
-
return false unless authorized?
|
93
|
-
handle_response :post, "/users/#{verified_user}/memes/#{meme_id}/comments", {:comment => comment}
|
94
|
-
end
|
95
|
-
|
96
|
-
private
|
97
|
-
def generate_signature
|
98
|
-
nonce = OAuth::Helper.generate_nonce
|
99
|
-
timestamp = Time.now.to_i
|
100
|
-
req_proxy = OAuth::RequestProxy.proxy("method" => "GET", "uri" => "https://api.infomeme.com", "parameters" => {"oauth_consumer_key" => consumer.key, "oauth_token" => token.token, "oauth_nonce" => nonce, "oauth_timestamp" => timestamp, "oauth_signature_method" => "HMAC-SHA1"})
|
101
|
-
signature = req_proxy.sign({:consumer_secret => consumer.secret, :token_secret => token.secret})
|
102
|
-
{:oauth_token => token.token, :oauth_nonce => nonce, :oauth_timestamp => timestamp, :oauth_signature => signature}
|
103
|
-
end
|
104
|
-
|
105
|
-
def get_own_memes(options = {}, cmd = nil, headers = {})
|
106
|
-
return false unless authorized?
|
107
|
-
get_memes("/users/#{verified_user}/memes" + (cmd.nil? ? "" : "/#{cmd}"), options, headers)
|
108
|
-
end
|
109
|
-
|
110
|
-
def meme_function(meme_id, method, cmd = nil, params = {}, headers = {})
|
111
|
-
return false unless authorized?
|
112
|
-
handle_response method, "/users/#{verified_user}/memes/#{meme_id}" + (cmd.nil? ? "" : "/#{cmd}"), params, headers
|
113
|
-
end
|
114
|
-
|
115
|
-
def http_multipart(url, params)
|
116
|
-
url = URI.parse(url)
|
117
|
-
req = Net::HTTP::Post::Multipart.new url.path, params
|
118
|
-
http = Net::HTTP.new(url.host, url.port)
|
119
|
-
http.use_ssl = url.scheme == "https"
|
120
|
-
resp = http.start {|http| http.request(req)}
|
121
|
-
resp.is_a?(Net::HTTPSuccess)
|
122
|
-
end
|
123
|
-
|
124
|
-
def uploadio(file)
|
125
|
-
UploadIO.new(file, MIME::Types.type_for(file.path), file.path)
|
126
|
-
end
|
127
|
-
end
|
@@ -1,31 +0,0 @@
|
|
1
|
-
module InfomemeClient::Functions::UserOrder
|
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
|
-
|
7
|
-
def order_with_balance(meme_id, options = {})
|
8
|
-
order(meme_id, 1, options)
|
9
|
-
refresh_settings
|
10
|
-
true
|
11
|
-
end
|
12
|
-
|
13
|
-
def order_with_paypal(meme_id, options = {})
|
14
|
-
order(meme_id, 3, options).paypal_url
|
15
|
-
end
|
16
|
-
|
17
|
-
def transactions(options = {})
|
18
|
-
return false unless authorized?
|
19
|
-
extract_or_response :transactions, :get, "/users/#{verified_user}/transactions", options
|
20
|
-
end
|
21
|
-
|
22
|
-
def invoices(options = {})
|
23
|
-
return false unless authorized?
|
24
|
-
extract_or_response :invoices, :get, "/users/#{verified_user}/invoices", options
|
25
|
-
end
|
26
|
-
|
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
|
-
end
|
@@ -1,18 +0,0 @@
|
|
1
|
-
class InfomemeClient::MemeApplication
|
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
|
-
|
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
|
-
|
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
|
-
|
15
|
-
private
|
16
|
-
attr_accessor :consumer, :token
|
17
|
-
include InfomemeClient::Communication
|
18
|
-
end
|