slice-ruby 0.0.2
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.
- checksums.yaml +7 -0
- data/.gitignore +14 -0
- data/.travis.yml +3 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/Makefile +18 -0
- data/README.md +102 -0
- data/Rakefile +5 -0
- data/bin/slice +7 -0
- data/images/cli.png +0 -0
- data/lib/slice.rb +22 -0
- data/lib/slice/arguments.rb +133 -0
- data/lib/slice/client.rb +153 -0
- data/lib/slice/command_builder.rb +35 -0
- data/lib/slice/commands/base.rb +13 -0
- data/lib/slice/commands/error.rb +9 -0
- data/lib/slice/commands/request.rb +29 -0
- data/lib/slice/oauth.rb +21 -0
- data/lib/slice/resource_based_methods.rb +229 -0
- data/lib/slice/response.rb +92 -0
- data/lib/slice/response_renderer.rb +79 -0
- data/lib/slice/version.rb +3 -0
- data/slice-ruby.gemspec +32 -0
- data/spec/slice/client_spec.rb +349 -0
- data/spec/spec_helper.rb +8 -0
- metadata +266 -0
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# ## Slice::CommandBuilder
|
|
2
|
+
# Creates a new command object from the given ARGV.
|
|
3
|
+
#
|
|
4
|
+
# ```ruby
|
|
5
|
+
# builder = Slice::CommandBuilder.new(ARGV)
|
|
6
|
+
# builder.call
|
|
7
|
+
# ```
|
|
8
|
+
#
|
|
9
|
+
module Slice
|
|
10
|
+
class CommandBuilder
|
|
11
|
+
### Slice::CommandBuilder.new(argv)
|
|
12
|
+
# Creates a new instance of Slice::CommandBuilder from the given command line arguments.
|
|
13
|
+
#
|
|
14
|
+
def initialize(argv)
|
|
15
|
+
@argv = argv
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
### Slice::CommandBuilder#call
|
|
19
|
+
# Returns a new instance of command class that inherits from Slice::Commands::Base.
|
|
20
|
+
#
|
|
21
|
+
def call
|
|
22
|
+
if arguments.valid?
|
|
23
|
+
Slice::Commands::Request.new(arguments)
|
|
24
|
+
else
|
|
25
|
+
Slice::Commands::Error.new(arguments)
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
private
|
|
30
|
+
|
|
31
|
+
def arguments
|
|
32
|
+
@arguments ||= Arguments.new(@argv)
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
module Slice
|
|
2
|
+
module Commands
|
|
3
|
+
class Request < Base
|
|
4
|
+
def call
|
|
5
|
+
response = client.send(
|
|
6
|
+
@arguments.method_name,
|
|
7
|
+
*@arguments.arguments,
|
|
8
|
+
@arguments.params,
|
|
9
|
+
@arguments.headers,
|
|
10
|
+
)
|
|
11
|
+
print ResponseRenderer.new(
|
|
12
|
+
response,
|
|
13
|
+
color: @arguments.color,
|
|
14
|
+
show_body: @arguments.show_body,
|
|
15
|
+
show_header: @arguments.show_header,
|
|
16
|
+
)
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
private
|
|
20
|
+
|
|
21
|
+
def client
|
|
22
|
+
Client.new(
|
|
23
|
+
access_token: @arguments.access_token,
|
|
24
|
+
host: @arguments.host,
|
|
25
|
+
)
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
data/lib/slice/oauth.rb
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
require "oauth2"
|
|
2
|
+
|
|
3
|
+
module Slice
|
|
4
|
+
class OAuth
|
|
5
|
+
def initialize(client_id, client_secret, redirect_url)
|
|
6
|
+
@client_id = client_id
|
|
7
|
+
@client_secret = client_secret
|
|
8
|
+
@redirect_url = redirect_url
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def generate_auth_url
|
|
12
|
+
@client = OAuth2::Client.new(@client_id, @client_secret,
|
|
13
|
+
:site => "https://#{Slice::Client::DEFAULT_HOST}")
|
|
14
|
+
@client.auth_code.authorize_url(:redirect_uri => @redirect_url)
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def authenticate! auth_code
|
|
18
|
+
@client.auth_code.get_token(auth_code, :redirect_uri => @redirect_url)
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
module Slice
|
|
2
|
+
module ResourceBasedMethods
|
|
3
|
+
|
|
4
|
+
# ## 'Users' Resources
|
|
5
|
+
|
|
6
|
+
# ### Slice::Client#whoami(params = nil, headers = nil)
|
|
7
|
+
# Get the user object corresponding to the OAuth token
|
|
8
|
+
#
|
|
9
|
+
def whoami(params = nil, headers = nil)
|
|
10
|
+
get("/api/v1/users/self", params, headers)
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
# ## 'Mailboxes' Resources
|
|
15
|
+
|
|
16
|
+
# ### Slice::Client#list_mailboxes(params = nil, headers = nil)
|
|
17
|
+
# List mailboxes
|
|
18
|
+
#
|
|
19
|
+
def list_mailboxes(params = nil, headers = nil)
|
|
20
|
+
get("/api/v1/mailboxes", params, headers)
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
# ### Slice::Client#get_mailbox(params = nil, headers = nil)
|
|
24
|
+
# Get a particular mailbox
|
|
25
|
+
#
|
|
26
|
+
def get_mailbox(id, params = nil, headers = nil)
|
|
27
|
+
get("/api/v1/mailboxes/#{id}", params, headers)
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
# ## 'Orders' Resources
|
|
32
|
+
|
|
33
|
+
# ### Slice::Client#list_orders(params = nil, headers = nil)
|
|
34
|
+
# List orders
|
|
35
|
+
#
|
|
36
|
+
def list_orders(params = nil, headers = nil)
|
|
37
|
+
get("/api/v1/orders", params, headers)
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
# ### Slice::Client#create_order(params = nil, headers = nil)
|
|
41
|
+
# Create a new order
|
|
42
|
+
#
|
|
43
|
+
def create_order(params = nil, headers = nil)
|
|
44
|
+
post("/api/v1/orders", params, headers)
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
# ### Slice::Client#get_order(params = nil, headers = nil)
|
|
48
|
+
# Get a particular order
|
|
49
|
+
#
|
|
50
|
+
def get_order(id, params = nil, headers = nil)
|
|
51
|
+
get("/api/v1/orders/#{id}", params, headers)
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
# ### Slice::Client#update_order(params = nil, headers = nil)
|
|
55
|
+
# Update a particular order
|
|
56
|
+
#
|
|
57
|
+
def update_order(id, params = nil, headers = nil)
|
|
58
|
+
put("/api/v1/orders/#{id}", params, headers)
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
# ### Slice::Client#delete_order(params = nil, headers = nil)
|
|
62
|
+
# Delete a particular order
|
|
63
|
+
#
|
|
64
|
+
def delete_order(id, params = nil, headers = nil)
|
|
65
|
+
delete("/api/v1/orders/#{id}", params, headers)
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
# ## 'Items' Resources
|
|
69
|
+
|
|
70
|
+
# ### Slice::Client#list_items(params = nil, headers = nil)
|
|
71
|
+
# List items
|
|
72
|
+
#
|
|
73
|
+
def list_items(params = nil, headers = nil)
|
|
74
|
+
get("/api/v1/items", params, headers)
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
# ### Slice::Client#create_item(params = nil, headers = nil)
|
|
78
|
+
# Create a new item
|
|
79
|
+
#
|
|
80
|
+
def create_item(params = nil, headers = nil)
|
|
81
|
+
post("/api/v1/items", params, headers)
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
# ### Slice::Client#get_item(params = nil, headers = nil)
|
|
85
|
+
# Get a particular item
|
|
86
|
+
#
|
|
87
|
+
def get_item(id, params = nil, headers = nil)
|
|
88
|
+
get("/api/v1/items/#{id}", params, headers)
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
# ### Slice::Client#update_item(params = nil, headers = nil)
|
|
92
|
+
# Update a particular item
|
|
93
|
+
#
|
|
94
|
+
def update_item(id, params = nil, headers = nil)
|
|
95
|
+
put("/api/v1/items/#{id}", params, headers)
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
# ### Slice::Client#delete_item(params = nil, headers = nil)
|
|
99
|
+
# Delete a particular item
|
|
100
|
+
#
|
|
101
|
+
def delete_item(id, params = nil, headers = nil)
|
|
102
|
+
delete("/api/v1/items/#{id}", params, headers)
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
# ## 'Shipments' Resources
|
|
107
|
+
|
|
108
|
+
# ### Slice::Client#list_shipments(params = nil, headers = nil)
|
|
109
|
+
# List shipments
|
|
110
|
+
#
|
|
111
|
+
def list_shipments(params = nil, headers = nil)
|
|
112
|
+
get("/api/v1/shipments", params, headers)
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
# ### Slice::Client#create_shipment(params = nil, headers = nil)
|
|
116
|
+
# Create a new shipment
|
|
117
|
+
#
|
|
118
|
+
def create_shipment(params = nil, headers = nil)
|
|
119
|
+
post("/api/v1/shipments", params, headers)
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
# ### Slice::Client#get_shipment(params = nil, headers = nil)
|
|
123
|
+
# Get a particular shipment
|
|
124
|
+
#
|
|
125
|
+
def get_shipment(id, params = nil, headers = nil)
|
|
126
|
+
get("/api/v1/shipments/#{id}", params, headers)
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
# ### Slice::Client#update_shipment(params = nil, headers = nil)
|
|
130
|
+
# Update a particular shipment
|
|
131
|
+
#
|
|
132
|
+
def update_shipment(id, params = nil, headers = nil)
|
|
133
|
+
put("/api/v1/shipments/#{id}", params, headers)
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
# ### Slice::Client#delete_shipment(params = nil, headers = nil)
|
|
137
|
+
# Delete a particular shipment
|
|
138
|
+
#
|
|
139
|
+
def delete_shipment(id, params = nil, headers = nil)
|
|
140
|
+
delete("/api/v1/shipments/#{id}", params, headers)
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
|
|
144
|
+
# ## 'Merchants' Resources
|
|
145
|
+
|
|
146
|
+
# ### Slice::Client#get_merchant(params = nil, headers = nil)
|
|
147
|
+
# Get a particular merchant
|
|
148
|
+
#
|
|
149
|
+
def get_merchant(id, params = nil, headers = nil)
|
|
150
|
+
get("/api/v1/merchants/#{id}", params, headers)
|
|
151
|
+
end
|
|
152
|
+
|
|
153
|
+
|
|
154
|
+
# ## 'Recalls' Resources
|
|
155
|
+
|
|
156
|
+
# ### Slice::Client#list_recalls(params = nil, headers = nil)
|
|
157
|
+
# List recalls for the user
|
|
158
|
+
#
|
|
159
|
+
def list_recalls(params = nil, headers = nil)
|
|
160
|
+
get("/api/v1/recalls", params, headers)
|
|
161
|
+
end
|
|
162
|
+
|
|
163
|
+
# ### Slice::Client#get_recall(params = nil, headers = nil)
|
|
164
|
+
# Get a particular recall for the user
|
|
165
|
+
#
|
|
166
|
+
def get_recall(id, params = nil, headers = nil)
|
|
167
|
+
get("/api/v1/recalls/#{id}", params, headers)
|
|
168
|
+
end
|
|
169
|
+
|
|
170
|
+
|
|
171
|
+
# ## 'Email' Resources
|
|
172
|
+
|
|
173
|
+
# ### Slice::Client#get_email(params = nil, headers = nil)
|
|
174
|
+
# Get a particular email
|
|
175
|
+
#
|
|
176
|
+
def get_email(id, params = nil, headers = nil)
|
|
177
|
+
get("/api/v1/emails/#{id}", params, headers)
|
|
178
|
+
end
|
|
179
|
+
|
|
180
|
+
# ### Slice::Client#get_email(params = nil, headers = nil)
|
|
181
|
+
# Get a particular email
|
|
182
|
+
#
|
|
183
|
+
def get_email_content(id, params = nil, headers = nil)
|
|
184
|
+
get("/api/v1/emails/#{id}/content", params, headers)
|
|
185
|
+
end
|
|
186
|
+
|
|
187
|
+
|
|
188
|
+
# ## Dictionary (static) Resources
|
|
189
|
+
|
|
190
|
+
# ### Slice::Client#list_categories(params = nil, headers = nil)
|
|
191
|
+
# List categories of items that a user may have purchased
|
|
192
|
+
#
|
|
193
|
+
def list_categories(params = nil, headers = nil)
|
|
194
|
+
get("/api/v1/categories", params, headers)
|
|
195
|
+
end
|
|
196
|
+
|
|
197
|
+
# ### Slice::Client#list_providers(params = nil, headers = nil)
|
|
198
|
+
# List providers of items that a user may have purchased
|
|
199
|
+
#
|
|
200
|
+
def list_providers(params = nil, headers = nil)
|
|
201
|
+
get("/api/v1/providers", params, headers)
|
|
202
|
+
end
|
|
203
|
+
|
|
204
|
+
# ### Slice::Client#list_purchasetypes(params = nil, headers = nil)
|
|
205
|
+
# List different types of purchases
|
|
206
|
+
#
|
|
207
|
+
def list_purchasetypes(params = nil, headers = nil)
|
|
208
|
+
get("/api/v1/purchasetypes", params, headers)
|
|
209
|
+
end
|
|
210
|
+
|
|
211
|
+
# ### Slice::Client#list_shippers(params = nil, headers = nil)
|
|
212
|
+
# List shippers that may be used to deliver packages
|
|
213
|
+
#
|
|
214
|
+
def list_shippers(params = nil, headers = nil)
|
|
215
|
+
get("/api/v1/shippers", params, headers)
|
|
216
|
+
end
|
|
217
|
+
|
|
218
|
+
|
|
219
|
+
# ## 'Action' Resources
|
|
220
|
+
|
|
221
|
+
# ### Slice::Client#update(params = nil, headers = nil)
|
|
222
|
+
# Tell Slice to recrawl the mailboxes of the user
|
|
223
|
+
#
|
|
224
|
+
def update(params = nil, headers = nil)
|
|
225
|
+
post("/api/v1/actions/update", params, headers)
|
|
226
|
+
end
|
|
227
|
+
|
|
228
|
+
end
|
|
229
|
+
end
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
# ## Slice::Response
|
|
2
|
+
# A class for response data returned from API.
|
|
3
|
+
#
|
|
4
|
+
module Slice
|
|
5
|
+
class Response
|
|
6
|
+
def initialize(faraday_response)
|
|
7
|
+
@raw_body = faraday_response.body
|
|
8
|
+
@raw_headers = faraday_response.headers
|
|
9
|
+
@raw_status = faraday_response.status
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
# ### Slice::Response#body
|
|
13
|
+
# Returns response body returned from API as a `Hash` or an `Array` of `Hash`.
|
|
14
|
+
#
|
|
15
|
+
# ```rb
|
|
16
|
+
# response.body #=> { ... }
|
|
17
|
+
# ```
|
|
18
|
+
#
|
|
19
|
+
def body
|
|
20
|
+
@raw_body
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
# ### Slice::Response#first_page_url
|
|
24
|
+
# Returns first page URL or nil.
|
|
25
|
+
#
|
|
26
|
+
def first_page_url
|
|
27
|
+
links_table["first"]
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
# ### Slice::Response#last_page_url
|
|
31
|
+
# Returns last page URL or nil.
|
|
32
|
+
#
|
|
33
|
+
def last_page_url
|
|
34
|
+
links_table["last"]
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
# ### Slice::Response#next_page_url
|
|
38
|
+
# Returns next page URL or nil.
|
|
39
|
+
#
|
|
40
|
+
def next_page_url
|
|
41
|
+
links_table["next"]
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
# ### Slice::Response#previous_page_url
|
|
45
|
+
# Returns previous page URL or nil.
|
|
46
|
+
#
|
|
47
|
+
def previous_page_url
|
|
48
|
+
links_table["prev"]
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
# ### Slice::Response#headers
|
|
52
|
+
# Returns response headers returned from API as a `Hash`.
|
|
53
|
+
#
|
|
54
|
+
# ```rb
|
|
55
|
+
# response.headers #=> { "Content-Type" => "application/json" }
|
|
56
|
+
# ```
|
|
57
|
+
#
|
|
58
|
+
def headers
|
|
59
|
+
@headers ||= @raw_headers.inject({}) do |result, (key, value)|
|
|
60
|
+
result.merge(key.split("-").map(&:capitalize).join("-") => value)
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
# ### Slice::Response#status
|
|
65
|
+
# Returns response status code returned from API as a `Fixnum`.
|
|
66
|
+
#
|
|
67
|
+
# ```rb
|
|
68
|
+
# response.status #=> 200
|
|
69
|
+
# ```
|
|
70
|
+
#
|
|
71
|
+
def status
|
|
72
|
+
@raw_status
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
def to_s
|
|
76
|
+
@to_s ||= ResponseRenderer.new(self, show_body: true, show_header: true).to_s
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
def status_message
|
|
80
|
+
Rack::Utils::HTTP_STATUS_CODES[status]
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
private
|
|
84
|
+
|
|
85
|
+
def links_table
|
|
86
|
+
@links_table ||= (headers["Link"] || "").split(", ").inject({}) do |table, section|
|
|
87
|
+
url, rel = section.match(/\A<(.+)>; rel="(.+)"\z/)[1..2]
|
|
88
|
+
table.merge(rel => url)
|
|
89
|
+
end
|
|
90
|
+
end
|
|
91
|
+
end
|
|
92
|
+
end
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
module Slice
|
|
2
|
+
class ResponseRenderer
|
|
3
|
+
def initialize(response, color: nil, show_header: nil, show_body: nil)
|
|
4
|
+
@response = response
|
|
5
|
+
@color = color
|
|
6
|
+
@show_body = show_body
|
|
7
|
+
@show_header = show_header
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def to_s
|
|
11
|
+
template % {
|
|
12
|
+
status: status,
|
|
13
|
+
headers: headers,
|
|
14
|
+
body: body,
|
|
15
|
+
}
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
private
|
|
19
|
+
|
|
20
|
+
def template
|
|
21
|
+
str = ""
|
|
22
|
+
str << <<-EOS.strip_heredoc if @show_header
|
|
23
|
+
HTTP/1.1 %{status}
|
|
24
|
+
%{headers}
|
|
25
|
+
EOS
|
|
26
|
+
if has_body? && @show_body
|
|
27
|
+
str << "\n" if @show_header
|
|
28
|
+
str << "%{body}"
|
|
29
|
+
end
|
|
30
|
+
str
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def headers
|
|
34
|
+
@response.headers.sort_by do |key, value|
|
|
35
|
+
key
|
|
36
|
+
end.map do |key, value|
|
|
37
|
+
"%{key}: %{value}" % {
|
|
38
|
+
key: Rainbow(key.split("-").map(&:camelize).join("-")).underline,
|
|
39
|
+
value: Rainbow(value).green,
|
|
40
|
+
}
|
|
41
|
+
end.join("\n")
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def status
|
|
45
|
+
Rainbow("#{@response.status} #{@response.status_message}").bright
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def body
|
|
49
|
+
if @color
|
|
50
|
+
Rouge::Formatters::Terminal256.format(
|
|
51
|
+
Rouge::Lexers::Ruby.new.lex(plain_body),
|
|
52
|
+
theme: "github"
|
|
53
|
+
)
|
|
54
|
+
else
|
|
55
|
+
plain_body
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
def plain_body
|
|
60
|
+
if has_body?
|
|
61
|
+
JSON.pretty_generate(@response.body) + "\n"
|
|
62
|
+
else
|
|
63
|
+
""
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
def Rainbow(str)
|
|
68
|
+
if @color
|
|
69
|
+
super
|
|
70
|
+
else
|
|
71
|
+
Rainbow::NullPresenter.new(str.to_s)
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
def has_body?
|
|
76
|
+
@response.status != 204
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
end
|