ink_file_picker 0.0.3 → 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b7a681af38820d24f5944958571caa2ec6e9a2a2
4
- data.tar.gz: c689b7e0f95090e1563c3aa10de8bcd85e3e240b
3
+ metadata.gz: 4719c0f6e4a7133f778fbe0a526bfb789a4c1cde
4
+ data.tar.gz: b52840576ea9e984cc36b991e1cc91821d05765a
5
5
  SHA512:
6
- metadata.gz: 006cda13b071eaf270d6c99dde3423e21cc3506f297cdbbc44f66dfdd1478664633f10e6a634b6e15aeee76abea4571cc117bd9365d994864307c6e9ac581a84
7
- data.tar.gz: ac22138a939849a2521d635178fdeeeef8b462290db9427bb039bcb1d63ddf8928875b05b9df1b88c96c4bef520b081e3858055a99013434a12fe71dfdf2519f
6
+ metadata.gz: f586ec60871af2f0d1911680ac2f9435665a46c764dc9dedb36883bdd6d32fbcab8b74c9207a082cd3ef6d513d6963c0e0ad1680173dca16240bb3b769923bd7
7
+ data.tar.gz: c2341290c994729ceb7f26c9773b3fb88bdaf19b8e8fe3b63499ab8d042f88b186c8b63dfa642869a8e27ba5aaa4a2273707fb6e76a520bca4bd8c52cdeee95e
@@ -0,0 +1 @@
1
+ 2.1.2
@@ -1,8 +1,12 @@
1
+ before_install:
2
+ - gem install bundler
3
+ - gem update bundler
1
4
  rvm:
2
- - 1.9.3
3
- - 2.0.0
4
- - 2.1.0
5
- - 2.1.2
5
+ - 1.9
6
+ - 2.0
7
+ - 2.1
8
+ - 2.2
9
+ - 2.3.1
6
10
  - ruby-head
7
11
  - jruby-19mode
8
12
  - jruby
@@ -1,3 +1,8 @@
1
+ ## 0.0.4
2
+ * Dropped ActiveSupport as a dependency. Should make life easier for everyone.
3
+ * Expiry on the policy can be given as an object acting as Time, as long as #to_i
4
+ returns Epoch time.
5
+
1
6
  ## 0.0.3
2
7
  * Raise UnexpectedResponseError if we receive a 200 OK, but response body is neither "success", nor valid JSON.
3
8
  This may happen if you ask File Picker to download a URL, but the server for the given URL fails to respond
@@ -5,7 +10,6 @@
5
10
  the UnexpectedResponseError is raised. Other download errors may also be in the response, for instance
6
11
  "Invalid response when trying to read from `http://some.url.com/here.jpg`.
7
12
 
8
-
9
13
  ## 0.0.2
10
14
  * You can call to_hash on response objects.
11
15
 
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # InkFilePicker
2
2
 
3
- Ruby API client for Ink File Picker (known as filepicker.io).
3
+ Ruby API client for filestack.com. Previously known as Ink File Picker and filepicker.io.
4
4
 
5
5
  [![Build Status](https://travis-ci.org/Skalar/ink_file_picker.svg?branch=master)](https://travis-ci.org/Skalar/ink_file_picker)
6
6
 
@@ -49,12 +49,12 @@ response = client.remove url_or_handle_name
49
49
  ### Read operations
50
50
  ```ruby
51
51
  url = client.convert_url url_or_handle_name, w: 100, h: 100
52
- url = client.convert_url url_or_handle_name, {w: 100, h: 100}, expiry: 10.minutes.from_now.to_i
52
+ url = client.convert_url url_or_handle_name, {w: 100, h: 100}, expiry: (Time.now + 60 * 10).to_i
53
53
 
54
54
  # Adds policy and signature, if secret given when client was created.
55
55
  get_params = {} # Get params we'll be adding to the request.
56
56
  url = client.retrieve_url url_or_handle_name
57
- url = client.retrieve_url url_or_handle_name, get_params, expiry: 10.minutes.from_now.to_i
57
+ url = client.retrieve_url url_or_handle_name, get_params, expiry: (Time.now + 60 * 10).to_i
58
58
 
59
59
 
60
60
  # Get simple stat on a file, like the Javascript client
@@ -18,10 +18,9 @@ Gem::Specification.new do |spec|
18
18
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
19
  spec.require_paths = ["lib"]
20
20
 
21
- spec.add_dependency "activesupport", ">= 3.2.14", "< 5"
22
21
  spec.add_dependency "faraday", "~> 0.9.0"
23
22
 
24
- spec.add_development_dependency "bundler", "~> 1.5"
25
23
  spec.add_development_dependency "rake"
26
- spec.add_development_dependency "rspec", "~> 2.14.1"
24
+ spec.add_development_dependency "bundler", "~> 1.12.5"
25
+ spec.add_development_dependency "rspec", "~> 3.5.0"
27
26
  end
@@ -1,19 +1,16 @@
1
1
  require "ink_file_picker/version"
2
2
 
3
- require "active_support/all"
4
3
  require "ink_file_picker/errors"
4
+ require "ink_file_picker/assignable"
5
+ require "ink_file_picker/configuration"
6
+ require "ink_file_picker/file_handle"
7
+ require "ink_file_picker/url_builder"
8
+ require "ink_file_picker/response"
9
+ require "ink_file_picker/client"
10
+ require "ink_file_picker/policy"
11
+ require "ink_file_picker/utils"
5
12
 
6
13
  module InkFilePicker
7
- extend ActiveSupport::Autoload
8
-
9
- autoload :Assignable
10
- autoload :Configuration
11
- autoload :FileHandle
12
- autoload :UrlBuilder
13
- autoload :Response
14
- autoload :Client
15
- autoload :Policy
16
-
17
14
  # Public: Creates a new Ink File Picker Client.
18
15
  #
19
16
  # configuration - configuration for the client with an API key
@@ -12,7 +12,7 @@ module InkFilePicker
12
12
  # Public: Store a file from given URL.
13
13
  #
14
14
  # url - URL to resource
15
- # policy_attributes - If you use security policies you may send in for instance {expire: 10.minutes.from_now} here
15
+ # policy_attributes - If you use security policies you may send in for instance {e: (Time.now + 60 * 10)} here
16
16
  #
17
17
  # Returns a hash representing the response where you can read for instance 'url'
18
18
  def store_url(url, policy_attributes = {})
@@ -33,7 +33,7 @@ module InkFilePicker
33
33
  # file_or_path - File or path to file
34
34
  # content_type - The file's content type
35
35
  # filename - The file's name, optional
36
- # policy_attributes - If you use security policies you may send in for instance {expire: 10.minutes.from_now} here
36
+ # policy_attributes - If you use security policies you may send in for instance {expire: (Time.now + 60 * 10)} here
37
37
  #
38
38
  # Returns a hash representing the response where you can read for instance 'url'
39
39
  def store_file(file_or_path, content_type, filename = nil, policy_attributes = {})
@@ -53,7 +53,7 @@ module InkFilePicker
53
53
  # Public: Removes a file from file picker.
54
54
  #
55
55
  # handle_or_url - The handle or URL to the file
56
- # policy_attributes - If you use security policies you may send in for instance {expire: 10.minutes.from_now} here
56
+ # policy_attributes - If you use security policies you may send in for instance {expire: (Time.now + 60 * 10)} here
57
57
  #
58
58
  # Returns boolean value
59
59
  def remove(handle_or_url, policy_attributes = {})
@@ -67,7 +67,7 @@ module InkFilePicker
67
67
  #
68
68
  # handle_or_url - The handle or URL to the file
69
69
  # params - Request params, like {width: true, height: true} to get width and height info. May be empty for default response
70
- # policy_attributes - If you use security policies you may send in for instance {expire: 10.minutes.from_now} here
70
+ # policy_attributes - If you use security policies you may send in for instance {expire: (Time.now + 60 * 10)} here
71
71
  #
72
72
  # Returns hash of headers returned from file picker or false if request was unsuccessful
73
73
  def stat(handle_or_url, params = {}, policy_attributes = {})
@@ -79,7 +79,7 @@ module InkFilePicker
79
79
  # Public: Generates a you can use for removing an asset on file picker.
80
80
  #
81
81
  # handle_or_url - The handle or URL to the file
82
- # policy_attributes - If you use security policies you may send in for instance {expire: 10.minutes.from_now} here
82
+ # policy_attributes - If you use security policies you may send in for instance {expire: (Time.now + 60 * 10)} here
83
83
  #
84
84
  # Returns a URL to the converted image
85
85
  def remove_url(handle_or_url, policy_attributes = {})
@@ -90,7 +90,7 @@ module InkFilePicker
90
90
  #
91
91
  # handle_or_url - The handle or URL to the file
92
92
  # params - Convert params, like {w: 100, h:100}
93
- # policy_attributes - If you use security policies you may send in for instance {expire: 10.minutes.from_now} here
93
+ # policy_attributes - If you use security policies you may send in for instance {expire: (Time.now + 60 * 10)} here
94
94
  #
95
95
  # Returns a URL to the converted image
96
96
  def convert_url(handle_or_url, params = {}, policy_attributes = {})
@@ -102,7 +102,7 @@ module InkFilePicker
102
102
  #
103
103
  # handle_or_url - The handle or URL to the file
104
104
  # params - Params to be added as get params, like {cache: true}
105
- # policy_attributes - If you use security policies you may send in for instance {expire: 10.minutes.from_now} here
105
+ # policy_attributes - If you use security policies you may send in for instance {expire: (Time.now + 60 * 10)} here
106
106
  #
107
107
  # This method is not that usefull unless you have enabled security policy
108
108
  #
@@ -115,7 +115,7 @@ module InkFilePicker
115
115
  # Public: Generates a stat URL for a given file
116
116
  #
117
117
  # handle_or_url - The handle or URL to the file
118
- # policy_attributes - If you use security policies you may send in for instance {expire: 10.minutes.from_now} here
118
+ # policy_attributes - If you use security policies you may send in for instance {expire: (Time.now + 60 * 10)} here
119
119
  #
120
120
  # Returns a URL to the image you can do a HEAD request to in order to get stats
121
121
  def stat_url(handle_or_url, params, policy_attributes = {})
@@ -130,10 +130,12 @@ module InkFilePicker
130
130
  #
131
131
  # Returns Policy object
132
132
  def policy(attributes)
133
- attributes.reverse_merge!(
133
+ defaults = {
134
134
  secret: configuration.secret,
135
135
  expiry: Time.now.to_i + configuration.default_expiry
136
- )
136
+ }.freeze
137
+
138
+ attributes = defaults.merge attributes
137
139
 
138
140
  Policy.new attributes
139
141
  end
@@ -24,7 +24,7 @@ module InkFilePicker
24
24
  private
25
25
 
26
26
  def verify!
27
- if key.blank?
27
+ if Utils::Blank.blank? key
28
28
  fail ArgumentError, "An API key must be provided"
29
29
  end
30
30
  end
@@ -18,7 +18,7 @@ module InkFilePicker
18
18
  private
19
19
 
20
20
  def build_url_from_handle
21
- joins_with = cdn_url.ends_with?('/') ? '' : '/'
21
+ joins_with = cdn_url.end_with?('/') ? '' : '/'
22
22
  [cdn_url, handle].join joins_with
23
23
  end
24
24
 
@@ -13,7 +13,9 @@ module InkFilePicker
13
13
  assign attributes
14
14
  end
15
15
 
16
-
16
+ def expiry=(epoch_or_time_object)
17
+ @expiry = epoch_or_time_object.to_i
18
+ end
17
19
 
18
20
  def policy
19
21
  Base64.urlsafe_encode64 policy_json
@@ -25,7 +27,7 @@ module InkFilePicker
25
27
 
26
28
 
27
29
  def to_hash
28
- return {} if secret.blank?
30
+ return {} if Utils::Blank.blank? secret
29
31
 
30
32
  {
31
33
  policy: policy,
@@ -39,7 +41,7 @@ module InkFilePicker
39
41
  out = {}
40
42
 
41
43
  POLICY_ATTRIBUTES.each do |attr_name|
42
- if value = self[attr_name] and value.present?
44
+ if value = self[attr_name] and !Utils::Blank.blank?(value)
43
45
  out[attr_name] = value
44
46
  end
45
47
  end
@@ -1,9 +1,14 @@
1
+ require 'forwardable'
2
+ require 'json'
3
+
1
4
  module InkFilePicker
2
5
  # Public: Simple decorator class for response.
3
6
  #
4
7
  # Decorates the response with hash like access to the
5
8
  # parsed body, which is expected to be JSON.
6
9
  class Response
10
+ extend Forwardable
11
+
7
12
  DELEGATE_TO_RESPONSE = %w[
8
13
  success? status headers body finished?
9
14
  ]
@@ -14,8 +19,8 @@ module InkFilePicker
14
19
 
15
20
  attr_reader :http_response
16
21
 
17
- delegate *DELEGATE_TO_RESPONSE, to: :http_response
18
- delegate *DELEGATE_TO_PARSED_BODY, to: :parsed_body
22
+ def_delegators :http_response, *DELEGATE_TO_RESPONSE
23
+ def_delegators :parsed_body, *DELEGATE_TO_PARSED_BODY
19
24
 
20
25
 
21
26
  def initialize(http_response)
@@ -1,3 +1,5 @@
1
+ require 'uri'
2
+
1
3
  module InkFilePicker
2
4
  # Public: Takes a file url, adds action to the path (if any), and includes params.
3
5
  class UrlBuilder
@@ -11,7 +13,7 @@ module InkFilePicker
11
13
 
12
14
  def url
13
15
  url = [file_url, action].compact.join '/'
14
- url = [url, params.to_param].join '?' if params.any?
16
+ url = [url, URI.encode_www_form(params)].join '?' if params.any?
15
17
 
16
18
  url
17
19
  end
@@ -0,0 +1,22 @@
1
+ module InkFilePicker
2
+ module Utils
3
+ module Blank
4
+ STRING_MATCHER = /\A[[:space:]]*\z/
5
+
6
+ def self.blank?(object)
7
+ case object
8
+ when String
9
+ STRING_MATCHER === object
10
+ when Hash, Array
11
+ object.empty?
12
+ when TrueClass, Numeric
13
+ false
14
+ when FalseClass, NilClass
15
+ true
16
+ else
17
+ object.respond_to?(:empty?) ? !!object.empty? : !self
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -1,3 +1,3 @@
1
1
  module InkFilePicker
2
- VERSION = "0.0.3"
2
+ VERSION = "0.0.4"
3
3
  end
@@ -1,6 +1,13 @@
1
1
  require 'spec_helper'
2
+ require 'uri'
2
3
 
3
4
  describe InkFilePicker::Client do
5
+ # Helper method, returns a hash represneting get query param
6
+ def query_to_hash(uri)
7
+ uri = URI.parse uri
8
+ Hash[uri.query.split('&').map { |name_value| name_value.split('=') }]
9
+ end
10
+
4
11
  let(:attributes) do
5
12
  {
6
13
  key: 'key',
@@ -27,7 +34,7 @@ describe InkFilePicker::Client do
27
34
  builder.adapter :test, stubs
28
35
  end
29
36
 
30
- subject.stub(:http_connection).and_return stubbed_connection
37
+ allow(subject).to receive(:http_connection).and_return stubbed_connection
31
38
 
32
39
  response = subject.store_url url
33
40
 
@@ -49,7 +56,7 @@ describe InkFilePicker::Client do
49
56
  builder.adapter :test, stubs
50
57
  end
51
58
 
52
- subject.stub(:http_connection).and_return stubbed_connection
59
+ allow(subject).to receive(:http_connection).and_return stubbed_connection
53
60
 
54
61
  response = subject.store_url url, expiry: 1394363896
55
62
 
@@ -67,7 +74,7 @@ describe InkFilePicker::Client do
67
74
  builder.adapter :test, stubs
68
75
  end
69
76
 
70
- subject.stub(:http_connection).and_return stubbed_connection
77
+ allow(subject).to receive(:http_connection).and_return stubbed_connection
71
78
 
72
79
  expect { subject.store_url url, expiry: 1394363896 }.to raise_error InkFilePicker::ClientError
73
80
  end
@@ -84,7 +91,7 @@ describe InkFilePicker::Client do
84
91
  builder.adapter :test, stubs
85
92
  end
86
93
 
87
- subject.stub(:http_connection).and_return stubbed_connection
94
+ allow(subject).to receive(:http_connection).and_return stubbed_connection
88
95
 
89
96
  expect { subject.store_url url, expiry: 1394363896 }.to raise_error InkFilePicker::UnexpectedResponseError
90
97
  end
@@ -99,7 +106,7 @@ describe InkFilePicker::Client do
99
106
  builder.adapter :test, stubs
100
107
  end
101
108
 
102
- subject.stub(:http_connection).and_return stubbed_connection
109
+ allow(subject).to receive(:http_connection).and_return stubbed_connection
103
110
 
104
111
  expect { subject.store_url url, expiry: 1394363896 }.to raise_error InkFilePicker::ServerError
105
112
  end
@@ -124,8 +131,8 @@ describe InkFilePicker::Client do
124
131
  builder.adapter :test, stubs
125
132
  end
126
133
 
127
- subject.stub(:http_connection).and_return stubbed_connection
128
- Faraday::UploadIO.stub(:new).and_return file_upload # Need same object, so request equals the stub
134
+ allow(subject).to receive(:http_connection).and_return stubbed_connection
135
+ allow(Faraday::UploadIO).to receive(:new).and_return file_upload # Need same object, so request equals the stub
129
136
 
130
137
  response = subject.store_file file, 'image/png'
131
138
 
@@ -142,8 +149,8 @@ describe InkFilePicker::Client do
142
149
  builder.adapter :test, stubs
143
150
  end
144
151
 
145
- subject.stub(:http_connection).and_return stubbed_connection
146
- Faraday::UploadIO.stub(:new).and_return file_upload # Need same object, so request equals the stub
152
+ allow(subject).to receive(:http_connection).and_return stubbed_connection
153
+ allow(Faraday::UploadIO).to receive(:new).and_return file_upload # Need same object, so request equals the stub
147
154
 
148
155
  response = subject.store_file path, 'image/png'
149
156
 
@@ -162,8 +169,8 @@ describe InkFilePicker::Client do
162
169
  builder.adapter :test, stubs
163
170
  end
164
171
 
165
- subject.stub(:http_connection).and_return stubbed_connection
166
- Faraday::UploadIO.stub(:new).and_return file_upload # Need same object, so request equals the stub
172
+ allow(subject).to receive(:http_connection).and_return stubbed_connection
173
+ allow(Faraday::UploadIO).to receive(:new).and_return file_upload # Need same object, so request equals the stub
167
174
 
168
175
  response = subject.store_file file, 'image/png', nil, expiry: 1394363896
169
176
 
@@ -181,7 +188,7 @@ describe InkFilePicker::Client do
181
188
  builder.adapter :test, stubs
182
189
  end
183
190
 
184
- subject.stub(:http_connection).and_return stubbed_connection
191
+ allow(subject).to receive(:http_connection).and_return stubbed_connection
185
192
 
186
193
  expect { subject.store_file file, 'image/png', nil, expiry: 1394363896 }.to raise_error InkFilePicker::ClientError
187
194
  end
@@ -196,7 +203,7 @@ describe InkFilePicker::Client do
196
203
  builder.adapter :test, stubs
197
204
  end
198
205
 
199
- subject.stub(:http_connection).and_return stubbed_connection
206
+ allow(subject).to receive(:http_connection).and_return stubbed_connection
200
207
 
201
208
  expect { subject.store_file file, 'image/png', nil, expiry: 1394363896 }.to raise_error InkFilePicker::ServerError
202
209
  end
@@ -218,12 +225,12 @@ describe InkFilePicker::Client do
218
225
  builder.adapter :test, stubs
219
226
  end
220
227
 
221
- subject.stub(:http_connection).and_return stubbed_connection
228
+ allow(subject).to receive(:http_connection).and_return stubbed_connection
222
229
 
223
230
  response = subject.remove file_url
224
231
 
225
232
  stubs.verify_stubbed_calls
226
- expect(response).to be_true
233
+ expect(response).to be_truthy
227
234
  end
228
235
 
229
236
  it "makes delete request with file handle name" do
@@ -235,12 +242,12 @@ describe InkFilePicker::Client do
235
242
  builder.adapter :test, stubs
236
243
  end
237
244
 
238
- subject.stub(:http_connection).and_return stubbed_connection
245
+ allow(subject).to receive(:http_connection).and_return stubbed_connection
239
246
 
240
247
  response = subject.remove 'WmFxB2aSe20SGT2kzSsr'
241
248
 
242
249
  stubs.verify_stubbed_calls
243
- expect(response).to be_true
250
+ expect(response).to be_truthy
244
251
  end
245
252
 
246
253
  it "handles server errors correctly" do
@@ -252,7 +259,7 @@ describe InkFilePicker::Client do
252
259
  builder.adapter :test, stubs
253
260
  end
254
261
 
255
- subject.stub(:http_connection).and_return stubbed_connection
262
+ allow(subject).to receive(:http_connection).and_return stubbed_connection
256
263
 
257
264
  expect { subject.remove 'WmFxB2aSe20SGT2kzSsr' }.to raise_error InkFilePicker::ServerError
258
265
  end
@@ -268,12 +275,12 @@ describe InkFilePicker::Client do
268
275
  builder.adapter :test, stubs
269
276
  end
270
277
 
271
- subject.stub(:http_connection).and_return stubbed_connection
278
+ allow(subject).to receive(:http_connection).and_return stubbed_connection
272
279
 
273
280
  response = subject.remove file_url, expiry: 1394363896
274
281
 
275
282
  stubs.verify_stubbed_calls
276
- expect(response).to be_true
283
+ expect(response).to be_truthy
277
284
  end
278
285
  end
279
286
  end
@@ -282,15 +289,15 @@ describe InkFilePicker::Client do
282
289
  let(:file_url) { 'https://www.filepicker.io/api/file/WmFxB2aSe20SGT2kzSsr' }
283
290
 
284
291
  it "handles server errors correctly" do
285
- stubs = Faraday::Adapter::Test::Stubs.new do |stub|
286
- stub.get(file_url + '/metadata') { [502, {}, 'Bad Gateway'] }
292
+ stubs = Faraday::Adapter::Test::Stubs.new do |receive|
293
+ receive.get(file_url + '/metadata') { [502, {}, 'Bad Gateway'] }
287
294
  end
288
295
 
289
296
  stubbed_connection = Faraday.new do |builder|
290
297
  builder.adapter :test, stubs
291
298
  end
292
299
 
293
- subject.stub(:http_connection).and_return stubbed_connection
300
+ allow(subject).to receive(:http_connection).and_return stubbed_connection
294
301
 
295
302
  expect { subject.stat 'WmFxB2aSe20SGT2kzSsr' }.to raise_error InkFilePicker::ServerError
296
303
  end
@@ -307,7 +314,7 @@ describe InkFilePicker::Client do
307
314
  builder.adapter :test, stubs
308
315
  end
309
316
 
310
- subject.stub(:http_connection).and_return stubbed_connection
317
+ allow(subject).to receive(:http_connection).and_return stubbed_connection
311
318
 
312
319
  response = subject.stat file_url, {}, expiry: 1394363896
313
320
 
@@ -326,7 +333,7 @@ describe InkFilePicker::Client do
326
333
  builder.adapter :test, stubs
327
334
  end
328
335
 
329
- subject.stub(:http_connection).and_return stubbed_connection
336
+ allow(subject).to receive(:http_connection).and_return stubbed_connection
330
337
 
331
338
  response = subject.stat file_url, {width: true, heigth: true}, expiry: 1394363896
332
339
 
@@ -344,17 +351,37 @@ describe InkFilePicker::Client do
344
351
  before { subject.configuration.secret = nil }
345
352
 
346
353
  it "builds expected convert URL when given a URL" do
347
- expect(subject.convert_url url, w: 300, h: 200).to eq 'https://www.filepicker.io/api/file/PHqJHHWpRAGUsIfyx0og/convert?h=200&w=300'
354
+ converted_url = subject.convert_url url, w: 300, h: 200
355
+
356
+ expect(converted_url).to start_with 'https://www.filepicker.io/api/file/PHqJHHWpRAGUsIfyx0og/convert?'
357
+ expect(query_to_hash converted_url).to include({
358
+ "h" => "200",
359
+ "w" => "300"
360
+ })
348
361
  end
349
362
 
350
363
  it "builds expected convert URL when given a handle" do
351
- expect(subject.convert_url handle, w: 300, h: 200).to eq 'https://www.filepicker.io/api/file/PHqJHHWpRAGUsIfyx0og/convert?h=200&w=300'
364
+ converted_url = subject.convert_url handle, w: 300, h: 200
365
+
366
+ expect(converted_url).to start_with 'https://www.filepicker.io/api/file/PHqJHHWpRAGUsIfyx0og/convert?'
367
+ expect(query_to_hash converted_url).to include({
368
+ "h" => "200",
369
+ "w" => "300"
370
+ })
352
371
  end
353
372
  end
354
373
 
355
374
  context "with secret" do
356
375
  it "builds expected convert URL when given a URL" do
357
- expect(subject.convert_url url, {w: 300, h: 200}, expiry: 1394363896).to eq 'https://www.filepicker.io/api/file/PHqJHHWpRAGUsIfyx0og/convert?h=200&policy=eyJleHBpcnkiOjEzOTQzNjM4OTYsImNhbGwiOiJjb252ZXJ0IiwiaGFuZGxlIjoiUEhxSkhIV3BSQUdVc0lmeXgwb2cifQ%3D%3D&signature=b370d4ae604c7917c169fe5b10a6274683bb82056c7b80993a7601d486b89d22&w=300'
376
+ converted_url = subject.convert_url url, {w: 300, h: 200}, expiry: 1394363896
377
+
378
+ expect(converted_url).to start_with 'https://www.filepicker.io/api/file/PHqJHHWpRAGUsIfyx0og/convert?'
379
+ expect(query_to_hash converted_url).to include({
380
+ "h" => "200",
381
+ "w" => "300",
382
+ "policy" => "eyJleHBpcnkiOjEzOTQzNjM4OTYsImNhbGwiOiJjb252ZXJ0IiwiaGFuZGxlIjoiUEhxSkhIV3BSQUdVc0lmeXgwb2cifQ%3D%3D",
383
+ "signature" => "b370d4ae604c7917c169fe5b10a6274683bb82056c7b80993a7601d486b89d22"
384
+ })
358
385
  end
359
386
  end
360
387
  end
@@ -405,19 +432,20 @@ describe InkFilePicker::Client do
405
432
  describe "expiry" do
406
433
  context "is given" do
407
434
  it "uses given value" do
408
- InkFilePicker::Policy.should_receive(:new).with(hash_including(call: 'read', expiry: 60)).and_return policy
435
+ expect(InkFilePicker::Policy).to receive(:new).with(hash_including(call: 'read', expiry: 60)).and_return policy
409
436
 
410
437
  expect(subject.policy policy_attributes.merge(expiry: 60)).to eq policy
411
438
  end
412
439
  end
413
440
 
414
441
  context "not given" do
415
- before { Time.stub_chain(:now, :to_i).and_return 1 }
442
+ let(:the_time) { double :time, to_i: 1 }
443
+ before { allow(Time).to receive(:now).and_return the_time }
416
444
 
417
445
  it "uses default_expiry from config" do
418
- subject.configuration.stub(:default_expiry).and_return 600
446
+ allow(subject.configuration).to receive(:default_expiry).and_return 600
419
447
 
420
- InkFilePicker::Policy.should_receive(:new).with(hash_including(call: 'read', expiry: 601)).and_return policy
448
+ expect(InkFilePicker::Policy).to receive(:new).with(hash_including(call: 'read', expiry: 601)).and_return policy
421
449
 
422
450
  expect(subject.policy policy_attributes).to eq policy
423
451
  end
@@ -10,10 +10,10 @@ describe InkFilePicker::Configuration do
10
10
 
11
11
  subject { described_class.new attributes }
12
12
 
13
- its(:key) { should eq 'key' }
14
- its(:secret) { should eq 'secret' }
15
- its(:default_expiry) { should eq 600 }
16
- its(:cdn_url) { should eq 'https://www.filepicker.io/api/file/' }
13
+ it { expect(subject.key).to eq 'key' }
14
+ it { expect(subject.secret).to eq 'secret' }
15
+ it { expect(subject.default_expiry).to eq 600 }
16
+ it { expect(subject.cdn_url).to eq 'https://www.filepicker.io/api/file/' }
17
17
 
18
18
  describe "#initialize" do
19
19
  it "fails when no key is given" do
@@ -11,8 +11,25 @@ describe InkFilePicker::Policy do
11
11
  )
12
12
  end
13
13
 
14
- its(:policy) { should eq 'eyJleHBpcnkiOjEzOTQzNjM4OTYsImNhbGwiOiJyZWFkIn0=' }
15
- its(:signature) { should eq '4c50ca71d9e123274a01eb00a7facd52069e07c2e9312517f55bf1b94447792e' }
14
+ it { expect(subject.policy).to eq 'eyJleHBpcnkiOjEzOTQzNjM4OTYsImNhbGwiOiJyZWFkIn0=' }
15
+ it { expect(subject.signature).to eq '4c50ca71d9e123274a01eb00a7facd52069e07c2e9312517f55bf1b94447792e' }
16
+
17
+ describe "the policy" do
18
+ let(:decoded) do
19
+ JSON.parse Base64.urlsafe_decode64 subject.policy
20
+ end
21
+
22
+ it { expect(decoded['call']).to eq 'read' }
23
+ it { expect(decoded['expiry']).to eq 1394363896 }
24
+
25
+ it "ensures expiry is a number" do
26
+ time = Time.parse('2016-01-01 00:00:00 +0100')
27
+ subject.expiry = time
28
+
29
+ decoded = JSON.parse Base64.urlsafe_decode64 subject.policy
30
+ expect(decoded['expiry']).to eq 1451602800
31
+ end
32
+ end
16
33
 
17
34
  describe "#to_hash" do
18
35
  it "contains policy and signature when secret is given" do
@@ -6,7 +6,7 @@ describe InkFilePicker do
6
6
  client = double
7
7
  attributes = {some: 'attributes'}
8
8
 
9
- InkFilePicker::Client.should_receive(:new).with(attributes).and_return client
9
+ expect(InkFilePicker::Client).to receive(:new).with(attributes).and_return client
10
10
 
11
11
  expect(described_class.client(attributes)).to eq client
12
12
  end
@@ -2,5 +2,4 @@ require 'bundler/setup'
2
2
  require 'ink_file_picker'
3
3
 
4
4
  RSpec.configure do |c|
5
- c.treat_symbols_as_metadata_keys_with_true_values = true
6
5
  end
metadata CHANGED
@@ -1,35 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ink_file_picker
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Thorbjørn Hermansen
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-03-03 00:00:00.000000000 Z
11
+ date: 2016-08-03 00:00:00.000000000 Z
12
12
  dependencies:
13
- - !ruby/object:Gem::Dependency
14
- name: activesupport
15
- requirement: !ruby/object:Gem::Requirement
16
- requirements:
17
- - - ">="
18
- - !ruby/object:Gem::Version
19
- version: 3.2.14
20
- - - "<"
21
- - !ruby/object:Gem::Version
22
- version: '5'
23
- type: :runtime
24
- prerelease: false
25
- version_requirements: !ruby/object:Gem::Requirement
26
- requirements:
27
- - - ">="
28
- - !ruby/object:Gem::Version
29
- version: 3.2.14
30
- - - "<"
31
- - !ruby/object:Gem::Version
32
- version: '5'
33
13
  - !ruby/object:Gem::Dependency
34
14
  name: faraday
35
15
  requirement: !ruby/object:Gem::Requirement
@@ -45,47 +25,47 @@ dependencies:
45
25
  - !ruby/object:Gem::Version
46
26
  version: 0.9.0
47
27
  - !ruby/object:Gem::Dependency
48
- name: bundler
28
+ name: rake
49
29
  requirement: !ruby/object:Gem::Requirement
50
30
  requirements:
51
- - - "~>"
31
+ - - ">="
52
32
  - !ruby/object:Gem::Version
53
- version: '1.5'
33
+ version: '0'
54
34
  type: :development
55
35
  prerelease: false
56
36
  version_requirements: !ruby/object:Gem::Requirement
57
37
  requirements:
58
- - - "~>"
38
+ - - ">="
59
39
  - !ruby/object:Gem::Version
60
- version: '1.5'
40
+ version: '0'
61
41
  - !ruby/object:Gem::Dependency
62
- name: rake
42
+ name: bundler
63
43
  requirement: !ruby/object:Gem::Requirement
64
44
  requirements:
65
- - - ">="
45
+ - - "~>"
66
46
  - !ruby/object:Gem::Version
67
- version: '0'
47
+ version: 1.12.5
68
48
  type: :development
69
49
  prerelease: false
70
50
  version_requirements: !ruby/object:Gem::Requirement
71
51
  requirements:
72
- - - ">="
52
+ - - "~>"
73
53
  - !ruby/object:Gem::Version
74
- version: '0'
54
+ version: 1.12.5
75
55
  - !ruby/object:Gem::Dependency
76
56
  name: rspec
77
57
  requirement: !ruby/object:Gem::Requirement
78
58
  requirements:
79
59
  - - "~>"
80
60
  - !ruby/object:Gem::Version
81
- version: 2.14.1
61
+ version: 3.5.0
82
62
  type: :development
83
63
  prerelease: false
84
64
  version_requirements: !ruby/object:Gem::Requirement
85
65
  requirements:
86
66
  - - "~>"
87
67
  - !ruby/object:Gem::Version
88
- version: 2.14.1
68
+ version: 3.5.0
89
69
  description:
90
70
  email:
91
71
  - thhermansen@gmail.com
@@ -94,6 +74,7 @@ extensions: []
94
74
  extra_rdoc_files: []
95
75
  files:
96
76
  - ".gitignore"
77
+ - ".ruby-version"
97
78
  - ".travis.yml"
98
79
  - CHANGELOG.md
99
80
  - Gemfile
@@ -110,6 +91,7 @@ files:
110
91
  - lib/ink_file_picker/policy.rb
111
92
  - lib/ink_file_picker/response.rb
112
93
  - lib/ink_file_picker/url_builder.rb
94
+ - lib/ink_file_picker/utils.rb
113
95
  - lib/ink_file_picker/version.rb
114
96
  - spec/fixtures/skalar.png
115
97
  - spec/ink_file_picker/client_spec.rb