instamojo-ruby 1.1.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.document +5 -0
- data/.rspec +1 -0
- data/Gemfile +15 -0
- data/Gemfile.lock +83 -0
- data/LICENSE.txt +20 -0
- data/README.md +287 -0
- data/README.rdoc +89 -0
- data/Rakefile +44 -0
- data/VERSION +1 -0
- data/instamojo-ruby.gemspec +79 -0
- data/lib/API/api.rb +47 -0
- data/lib/Instamojo-rb.rb +15 -0
- data/lib/base.rb +8 -0
- data/lib/client/client.rb +227 -0
- data/lib/client/link.rb +60 -0
- data/lib/client/payment.rb +60 -0
- data/lib/client/payment_request.rb +44 -0
- data/lib/client/refund.rb +35 -0
- data/lib/common_object.rb +54 -0
- data/lib/response.rb +26 -0
- data/lib/utility.rb +15 -0
- data/spec/Instamojo-rb_spec.rb +7 -0
- data/spec/spec_helper.rb +12 -0
- metadata +155 -0
data/Rakefile
ADDED
@@ -0,0 +1,44 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'rubygems'
|
4
|
+
require 'bundler'
|
5
|
+
begin
|
6
|
+
Bundler.setup(:default, :development)
|
7
|
+
rescue Bundler::BundlerError => e
|
8
|
+
$stderr.puts e.message
|
9
|
+
$stderr.puts "Run `bundle install` to install missing gems"
|
10
|
+
exit e.status_code
|
11
|
+
end
|
12
|
+
require 'rake'
|
13
|
+
|
14
|
+
require 'jeweler'
|
15
|
+
Jeweler::Tasks.new do |gem|
|
16
|
+
# gem is a Gem::Specification... see http://docs.rubygems.org/read/chapter/20 for more options
|
17
|
+
gem.name = "instamojo-ruby"
|
18
|
+
gem.homepage = "http://github.com/Instamojo/Instamojo-rb"
|
19
|
+
gem.license = "MIT"
|
20
|
+
gem.summary = %Q{Instamojo Ruby library - Assists you to programmatically create, edit and delete offers on Instamojo}
|
21
|
+
gem.description = %Q{Instamojo Ruby library - Assists you to programmatically create, edit and delete offers on Instamojo. Also supports listing, updation and details of Payments, Payments Requests and Refunds.}
|
22
|
+
gem.email = "dev-accounts@instamojo.com"
|
23
|
+
gem.authors = ["Instamojo Technologies"]
|
24
|
+
# dependencies defined in Gemfile
|
25
|
+
end
|
26
|
+
Jeweler::RubygemsDotOrgTasks.new
|
27
|
+
|
28
|
+
require 'rspec/core'
|
29
|
+
require 'rspec/core/rake_task'
|
30
|
+
RSpec::Core::RakeTask.new(:spec) do |spec|
|
31
|
+
spec.pattern = FileList['spec/**/*_spec.rb']
|
32
|
+
end
|
33
|
+
|
34
|
+
task :default => :spec
|
35
|
+
|
36
|
+
require 'rdoc/task'
|
37
|
+
Rake::RDocTask.new do |rdoc|
|
38
|
+
version = File.exist?('VERSION') ? File.read('VERSION') : ""
|
39
|
+
|
40
|
+
rdoc.rdoc_dir = 'rdoc'
|
41
|
+
rdoc.title = "instamojo-ruby #{version}"
|
42
|
+
rdoc.rdoc_files.include('README*')
|
43
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
44
|
+
end
|
data/VERSION
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
1.1.2
|
@@ -0,0 +1,79 @@
|
|
1
|
+
# Generated by jeweler
|
2
|
+
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
|
4
|
+
# -*- encoding: utf-8 -*-
|
5
|
+
# stub: Instamojo-rb 1.1.0 ruby lib
|
6
|
+
|
7
|
+
Gem::Specification.new do |s|
|
8
|
+
s.name = "instamojo-ruby"
|
9
|
+
s.version = "1.1.2"
|
10
|
+
|
11
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
12
|
+
s.require_paths = ["lib"]
|
13
|
+
s.authors = ["Instamojo Technologies"]
|
14
|
+
s.date = "2015-12-18"
|
15
|
+
s.description = "Instamojo Ruby library - Assists you to programmatically create, edit and delete offers on Instamojo. Also supports listing, updation and details of Payments, Payments Requests and Refunds."
|
16
|
+
s.email = "dev-accounts@instamojo.com"
|
17
|
+
s.extra_rdoc_files = [
|
18
|
+
"LICENSE.txt",
|
19
|
+
"README.md",
|
20
|
+
"README.rdoc"
|
21
|
+
]
|
22
|
+
s.files = [
|
23
|
+
".document",
|
24
|
+
".rspec",
|
25
|
+
"Gemfile",
|
26
|
+
"Gemfile.lock",
|
27
|
+
"instamojo-ruby.gemspec",
|
28
|
+
"LICENSE.txt",
|
29
|
+
"README.md",
|
30
|
+
"README.rdoc",
|
31
|
+
"Rakefile",
|
32
|
+
"VERSION",
|
33
|
+
"lib/API/api.rb",
|
34
|
+
"lib/Instamojo-rb.rb",
|
35
|
+
"lib/base.rb",
|
36
|
+
"lib/client/client.rb",
|
37
|
+
"lib/client/link.rb",
|
38
|
+
"lib/client/payment.rb",
|
39
|
+
"lib/client/payment_request.rb",
|
40
|
+
"lib/client/refund.rb",
|
41
|
+
"lib/common_object.rb",
|
42
|
+
"lib/response.rb",
|
43
|
+
"lib/utility.rb",
|
44
|
+
"spec/Instamojo-rb_spec.rb",
|
45
|
+
"spec/spec_helper.rb"
|
46
|
+
]
|
47
|
+
s.homepage = "http://github.com/Instamojo/Instamojo-rb"
|
48
|
+
s.licenses = ["MIT"]
|
49
|
+
s.rubygems_version = "2.2.2"
|
50
|
+
s.summary = "Instamojo Ruby library - Assists you to programmatically create, edit and delete offers on Instamojo"
|
51
|
+
|
52
|
+
if s.respond_to? :specification_version then
|
53
|
+
s.specification_version = 4
|
54
|
+
|
55
|
+
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
56
|
+
s.add_runtime_dependency(%q<faraday>, ["= 0.8.8"])
|
57
|
+
s.add_runtime_dependency(%q<rest-client>, ["~> 1.8"])
|
58
|
+
s.add_development_dependency(%q<rspec>, ["~> 2.8"])
|
59
|
+
s.add_development_dependency(%q<bundler>, ["~> 1.0"])
|
60
|
+
s.add_development_dependency(%q<jeweler>, ["~> 1.8"])
|
61
|
+
s.add_development_dependency(%q<debugger>, ["~> 1.6"])
|
62
|
+
else
|
63
|
+
s.add_dependency(%q<faraday>, ["= 0.8.8"])
|
64
|
+
s.add_dependency(%q<rest-client>, ["~> 1.8"])
|
65
|
+
s.add_dependency(%q<rspec>, ["~> 2.8"])
|
66
|
+
s.add_dependency(%q<bundler>, ["~> 1.0"])
|
67
|
+
s.add_dependency(%q<jeweler>, ["~> 1.8"])
|
68
|
+
s.add_dependency(%q<debugger>, ["~> 1.6"])
|
69
|
+
end
|
70
|
+
else
|
71
|
+
s.add_dependency(%q<faraday>, ["= 0.8.8"])
|
72
|
+
s.add_dependency(%q<rest-client>, ["~> 1.8"])
|
73
|
+
s.add_dependency(%q<rspec>, ["~> 2.8"])
|
74
|
+
s.add_dependency(%q<bundler>, ["~> 1.0"])
|
75
|
+
s.add_dependency(%q<jeweler>, ["~> 1.8"])
|
76
|
+
s.add_dependency(%q<debugger>, ["~> 1.6"])
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
data/lib/API/api.rb
ADDED
@@ -0,0 +1,47 @@
|
|
1
|
+
module Instamojo
|
2
|
+
|
3
|
+
class << API
|
4
|
+
private
|
5
|
+
def whitelist_parameters
|
6
|
+
API::WHITELISTED_API_PARAMS.each { |x| attr_reader x }
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
class API
|
11
|
+
WHITELISTED_API_PARAMS = [:api_key, :auth_token, :endpoint]
|
12
|
+
whitelist_parameters
|
13
|
+
attr_reader :client
|
14
|
+
|
15
|
+
def initialize(api_key = nil, auth_token = nil, endpoint = nil, options = {}, &block)
|
16
|
+
options = find_params(api_key, auth_token, endpoint, options, block)
|
17
|
+
|
18
|
+
options.select { |k, _| WHITELISTED_API_PARAMS.include? k.to_sym }.each do |key, value|
|
19
|
+
instance_variable_set("@#{key}", value)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def client
|
24
|
+
@client ||= Instamojo::Client.new(self, @endpoint)
|
25
|
+
end
|
26
|
+
|
27
|
+
def to_s
|
28
|
+
@endpoint ? sprintf("Instamojo API(key: %s, endpoint: %s)", @api_key, @endpoint): sprintf("Instamojo API(key: %s)", @api_key)
|
29
|
+
end
|
30
|
+
|
31
|
+
private
|
32
|
+
|
33
|
+
def find_params(api_key, auth_token, endpoint, options, block)
|
34
|
+
params = if api_key.is_a? Hash
|
35
|
+
api_key
|
36
|
+
elsif api_key
|
37
|
+
{ api_key: api_key, auth_token: auth_token }
|
38
|
+
elsif block
|
39
|
+
struct = OpenStruct.new
|
40
|
+
block.call(struct) && struct.marshal_dump
|
41
|
+
else options
|
42
|
+
end
|
43
|
+
params.merge!(endpoint: endpoint) if endpoint
|
44
|
+
params
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
data/lib/Instamojo-rb.rb
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'faraday'
|
2
|
+
require 'json'
|
3
|
+
require 'uri'
|
4
|
+
require 'ostruct'
|
5
|
+
require 'rest_client'
|
6
|
+
require_relative 'utility'
|
7
|
+
require_relative 'common_object'
|
8
|
+
require_relative 'response'
|
9
|
+
require_relative 'base'
|
10
|
+
require_relative 'API/api'
|
11
|
+
require_relative 'client/link'
|
12
|
+
require_relative 'client/payment'
|
13
|
+
require_relative 'client/refund'
|
14
|
+
require_relative 'client/client'
|
15
|
+
require_relative 'client/payment_request'
|
data/lib/base.rb
ADDED
@@ -0,0 +1,227 @@
|
|
1
|
+
module Instamojo
|
2
|
+
class Client
|
3
|
+
attr_reader :connection_options, :app_id
|
4
|
+
attr_reader :request, :response
|
5
|
+
attr_reader :authorized
|
6
|
+
|
7
|
+
URL = Instamojo::HOST + "/api/" + Instamojo::API_VERSION
|
8
|
+
|
9
|
+
def connection_options
|
10
|
+
@connection_options = lambda do |connection|
|
11
|
+
connection.request :url_encoded
|
12
|
+
connection.response :logger if Instamojo::DEBUG # TODO: set DEBUG flag for this
|
13
|
+
connection.adapter Faraday.default_adapter
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def initialize(api, endpoint)
|
18
|
+
@endpoint = endpoint || URL
|
19
|
+
@conn = Faraday.new(@endpoint, &connection_options)
|
20
|
+
|
21
|
+
#TODO: To abstract in /errors.rb
|
22
|
+
raise "Supply API with api_key before generating client" unless api.api_key
|
23
|
+
|
24
|
+
@api_key = api.api_key
|
25
|
+
@auth_token = api.auth_token
|
26
|
+
add_header "X-Api-Key", @api_key
|
27
|
+
if @auth_token
|
28
|
+
add_header "X-Auth-Token", @auth_token
|
29
|
+
get 'debug' # dummy request to verify supplied auth_token
|
30
|
+
else
|
31
|
+
@authorized = "Not authorized"
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def get_connection_object
|
36
|
+
@conn
|
37
|
+
end
|
38
|
+
|
39
|
+
def self.define_http_verb(http_verb)
|
40
|
+
define_method http_verb do |*args|
|
41
|
+
request = args[0] || "/"
|
42
|
+
params = args[1] || {}
|
43
|
+
|
44
|
+
@request = request
|
45
|
+
sanitize_request
|
46
|
+
method = @conn.method(http_verb)
|
47
|
+
@response = method.call(@request, params)
|
48
|
+
sanitize_response
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
define_http_verb :get
|
53
|
+
define_http_verb :post
|
54
|
+
define_http_verb :patch
|
55
|
+
define_http_verb :delete
|
56
|
+
|
57
|
+
|
58
|
+
# POST /auth/
|
59
|
+
# Authenticate, generate token and add header
|
60
|
+
def authenticate(username = nil, password = nil, options = {}, &block)
|
61
|
+
if username.is_a?(Hash) or password.is_a?(Hash)
|
62
|
+
options = username.is_a?(Hash) ? username : password
|
63
|
+
end
|
64
|
+
options["username"] = username if username and !username.is_a?Hash
|
65
|
+
options["password"] = password if password and !password.is_a?Hash
|
66
|
+
|
67
|
+
options = set_options(options, &block)
|
68
|
+
|
69
|
+
#TODO: Raise error if doesn't find username and password key in options
|
70
|
+
@response = post('auth', options)
|
71
|
+
if @response.has_key?("success") and @response['success']
|
72
|
+
add_header("X-Auth-Token", @response['token'])
|
73
|
+
end
|
74
|
+
@response
|
75
|
+
end
|
76
|
+
|
77
|
+
# GET /links
|
78
|
+
def links_list(opts = {})
|
79
|
+
get('links', opts)
|
80
|
+
@response.success? ? @response.body[:links].map { |link| Instamojo::Link.new link, self } : @response
|
81
|
+
end
|
82
|
+
|
83
|
+
|
84
|
+
# GET /links/:slug
|
85
|
+
def link_detail(slug)
|
86
|
+
slug = slug.slug if slug.instance_of? Instamojo::Link
|
87
|
+
get("links/#{slug}")
|
88
|
+
@response.success? ? Instamojo::Link.new(@response.body[:link], self) : @response
|
89
|
+
end
|
90
|
+
|
91
|
+
# POST /links
|
92
|
+
def create_link(options = {}, &block)
|
93
|
+
options = set_options(options, &block)
|
94
|
+
options[:file_upload_json] = options[:file_upload] && upload_file(options.delete(:file_upload))
|
95
|
+
options[:cover_image_json] = options[:cover_image] && upload_file(options.delete(:cover_image))
|
96
|
+
post('links', options)
|
97
|
+
@response.success? ? Instamojo::Link.new(@response.body[:link], self) : @response
|
98
|
+
end
|
99
|
+
|
100
|
+
# PATCH /links/:slug
|
101
|
+
def edit_link(link = nil, options = {}, &block)
|
102
|
+
if link && link.is_a?(Instamojo::Link)
|
103
|
+
yield(link) if block_given?
|
104
|
+
else
|
105
|
+
options = set_options(options, &block)
|
106
|
+
link = Instamojo::Link.new(options, self)
|
107
|
+
end
|
108
|
+
patch("links/#{link.slug}", link.to_h)
|
109
|
+
@response.success? ? Instamojo::Link.new(@response.body[:link], self) : @response
|
110
|
+
end
|
111
|
+
|
112
|
+
# DELETE /links/:slug
|
113
|
+
def archive_link(slug)
|
114
|
+
delete("links/#{slug}")
|
115
|
+
end
|
116
|
+
|
117
|
+
# POST 'https://filepicker.io/api/store/S3'
|
118
|
+
def upload_file(filepath)
|
119
|
+
if filepath && (file=File.open(File.expand_path(filepath), 'rb'))
|
120
|
+
if (url=get_file_upload_url).is_a? String
|
121
|
+
resource = RestClient::Resource.new(url)
|
122
|
+
resource.post fileUpload: file
|
123
|
+
end
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
|
128
|
+
# GET /payments
|
129
|
+
def payments_list(opts = {})
|
130
|
+
get('payments', opts)
|
131
|
+
@response.success? ? @response.body[:payments].map { |payment| Instamojo::Payment.new payment, self } : @response
|
132
|
+
end
|
133
|
+
|
134
|
+
# GET /payments/:payment_id
|
135
|
+
def payment_detail(payment_id)
|
136
|
+
payment_id = payment_id.payment_id if payment_id.instance_of? Instamojo::Payment
|
137
|
+
get("payments/#{payment_id}")
|
138
|
+
@response.success? ? Instamojo::Payment.new(@response.body[:payment], self) : @response
|
139
|
+
end
|
140
|
+
|
141
|
+
# POST /payment-requests
|
142
|
+
def payment_request(options, &block)
|
143
|
+
set_options(options, &block)
|
144
|
+
post('payment-requests', options)
|
145
|
+
@response.success? ? Instamojo::PaymentRequest.new(@response.body[:payment_request], self) : @response
|
146
|
+
end
|
147
|
+
|
148
|
+
# GET /payment-requests
|
149
|
+
def payment_requests_list(opts = {})
|
150
|
+
get('payment-requests', opts)
|
151
|
+
@response.success? ? @response.body[:payment_requests].map { |payment_request| Instamojo::PaymentRequest.new payment_request, self } : @response
|
152
|
+
end
|
153
|
+
|
154
|
+
def payment_request_status(payment_request_id)
|
155
|
+
payment_request_id = payment_request_id.id if payment_request_id.instance_of? Instamojo::PaymentRequest
|
156
|
+
get("payment-requests/#{payment_request_id}") if payment_request_id
|
157
|
+
@response.success? ? Instamojo::PaymentRequest.new(@response.body[:payment_request], self) : @response
|
158
|
+
end
|
159
|
+
|
160
|
+
# GET /refunds
|
161
|
+
def refunds_list(opts = {})
|
162
|
+
get('refunds', opts)
|
163
|
+
@response.success? ? @response.body[:refunds].map { |refund| Instamojo::Refund.new refund, self } : @response
|
164
|
+
end
|
165
|
+
|
166
|
+
# GET /refunds/:refund_id
|
167
|
+
def refund_detail(refund_id)
|
168
|
+
get("refunds/#{refund_id}")
|
169
|
+
@response.success? ? Instamojo::Refund.new(@response.body[:refund], self) : @response
|
170
|
+
end
|
171
|
+
|
172
|
+
# POST /refunds
|
173
|
+
def create_refund(options = {}, &block)
|
174
|
+
options = set_options(options, &block)
|
175
|
+
post('refunds', options)
|
176
|
+
@response.success? ? Instamojo::Refund.new(@response.body[:refund], self) : @response
|
177
|
+
end
|
178
|
+
|
179
|
+
# DELETE /auth/:token - Delete auth token
|
180
|
+
def logout
|
181
|
+
auth_token = get_connection_object.headers['X-Auth-Token']
|
182
|
+
raise "Can't find any authorization token to logout." unless auth_token
|
183
|
+
@response = delete("/auth/#{auth_token}")
|
184
|
+
if @response.has_key?("success") and @response['success']
|
185
|
+
get_connection_object.headers.delete("X-Auth-Token")
|
186
|
+
end
|
187
|
+
@response
|
188
|
+
end
|
189
|
+
|
190
|
+
def to_s
|
191
|
+
sprintf("Instamojo Client(URL: %s, Authorized: %s)", @endpoint, @authorized)
|
192
|
+
end
|
193
|
+
|
194
|
+
private
|
195
|
+
def sanitize_request
|
196
|
+
@request.concat('/') unless request.end_with? "/"
|
197
|
+
@request[0] = '' if request.start_with? "/"
|
198
|
+
end
|
199
|
+
|
200
|
+
def sanitize_response
|
201
|
+
@response = Instamojo::Response.new(@response)
|
202
|
+
@authorized = @response.success?
|
203
|
+
@response
|
204
|
+
end
|
205
|
+
|
206
|
+
def set_options(options, &block)
|
207
|
+
if block_given?
|
208
|
+
block_params = OpenStruct.new
|
209
|
+
block.call(block_params)
|
210
|
+
options = options.merge(block_params.marshal_dump)
|
211
|
+
end
|
212
|
+
|
213
|
+
options.symbolize_keys!
|
214
|
+
end
|
215
|
+
|
216
|
+
def add_header(key, value)
|
217
|
+
previous_headers = get_connection_object.headers
|
218
|
+
get_connection_object.headers = previous_headers.merge({key => value})
|
219
|
+
end
|
220
|
+
|
221
|
+
# GET /links/get_file_upload_url
|
222
|
+
def get_file_upload_url
|
223
|
+
get('links/get_file_upload_url')
|
224
|
+
@response.success? ? @response.body[:upload_url] : @response
|
225
|
+
end
|
226
|
+
end
|
227
|
+
end
|
data/lib/client/link.rb
ADDED
@@ -0,0 +1,60 @@
|
|
1
|
+
module Instamojo
|
2
|
+
|
3
|
+
=begin Example
|
4
|
+
{
|
5
|
+
"title" => "Foo product",
|
6
|
+
"description" => "",
|
7
|
+
"slug" => "foo-product",
|
8
|
+
"shorturl" => "http://imojo.in/ankurfoobar",
|
9
|
+
"url" => "https://www.instamojo.com/ankurgel/foo-product/",
|
10
|
+
"cover_image" => "https://www.filepicker.io/api/file/BHeefKAARCKGC5l1J29e/convert?w=500&h=500&fit=clip&quality=70",
|
11
|
+
"currency" => "INR",
|
12
|
+
"base_price" => "0.00",
|
13
|
+
"quantity" => nil,
|
14
|
+
"quantity_sold" => 2,
|
15
|
+
"requires_shipping" => false,
|
16
|
+
"ships_within_days" => nil,
|
17
|
+
"start_date" => nil,
|
18
|
+
"end_date" => nil,
|
19
|
+
"venue" => nil,
|
20
|
+
"timezone" => nil,
|
21
|
+
"note" => nil,
|
22
|
+
"redirect_url" => nil,
|
23
|
+
"webhook_url" => nil,
|
24
|
+
"status" => "Live",
|
25
|
+
"enable_pwyw" => false,
|
26
|
+
"enable_sign" => false,
|
27
|
+
"socialpay_platforms" => ""
|
28
|
+
}
|
29
|
+
=end
|
30
|
+
|
31
|
+
class Link
|
32
|
+
attr_accessor :title, :description, :slug, :shorturl, :url, :cover_image, :currency, :base_price, :quantity
|
33
|
+
attr_accessor :quantity_sold, :requires_shipping, :ships_within_days, :start_date, :end_date, :venue, :timezone
|
34
|
+
attr_accessor :note, :redirect_url, :webhook_url, :status, :enable_pwyw, :enable_sign, :socialpay_platforms
|
35
|
+
|
36
|
+
attr_reader :original
|
37
|
+
|
38
|
+
include CommonObject
|
39
|
+
detail_method :link_detail, :slug
|
40
|
+
|
41
|
+
def initialize(link, client)
|
42
|
+
assign_values(link)
|
43
|
+
@client = client # Reference to client
|
44
|
+
end
|
45
|
+
|
46
|
+
# Carry out update request on a Link
|
47
|
+
def save(&block)
|
48
|
+
@client.edit_link(self, {}, &block)
|
49
|
+
end
|
50
|
+
|
51
|
+
# Carry out DELETE request on a link
|
52
|
+
def archive
|
53
|
+
@client.archive_link(self.slug)
|
54
|
+
end
|
55
|
+
|
56
|
+
def to_s
|
57
|
+
sprintf("Instamojo Link(slug: %s, title: %s, shorturl: %s, status: %s)", slug, title, shorturl, status)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|