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.
@@ -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,13 @@
1
+ module Slice
2
+ module Commands
3
+ class Base
4
+ def initialize(arguments)
5
+ @arguments = arguments
6
+ end
7
+
8
+ def call
9
+ raise NotImplementedError
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,9 @@
1
+ module Slice
2
+ module Commands
3
+ class Error < Base
4
+ def call
5
+ abort(@arguments.error_message)
6
+ end
7
+ end
8
+ end
9
+ 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
@@ -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