lws 7.0.2 → 7.0.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/lws/apps/generic.rb +56 -6
- data/lib/lws/apps/presence.rb +46 -2
- data/lib/lws/version.rb +1 -1
- data/test/generic_test.rb +24 -2
- data/test/test_helper.rb +1 -1
- metadata +19 -19
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: cd64c620eb066a25ef746caf1dbd624ce627cf476b90d531b910cf5dda7c804f
|
4
|
+
data.tar.gz: 934a7a8a804eb74a7ed954b1db917531cab5dfc03cd5c2daa98846ca7c0aa4f3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 56945d4070e3f193ed6245371cb054a0f2526e25254d66c27c295f1bb466952fbd1d3d8424257f25d9d463458a4636343bbb972b18c1ac7a95e000b984dc7c9b
|
7
|
+
data.tar.gz: 2a6f40cd0b12ff0ce11f6009e38e162e16deafcf5b8db086e5b1632234ee087225f8d6f6d7c660c1e063e1d605242e404185bc2c538eab59f85d6a2295719bad
|
data/lib/lws/apps/generic.rb
CHANGED
@@ -180,9 +180,11 @@ module LWS::Generic
|
|
180
180
|
class Storage
|
181
181
|
# @!visibility private
|
182
182
|
def self.use_api(api)
|
183
|
-
|
184
|
-
config = LWS.config
|
183
|
+
config = LWS.config
|
185
184
|
|
185
|
+
# A connection to Active Storage (with JSON request/response, but without
|
186
|
+
# token authentication and caching).
|
187
|
+
@as_connection = Faraday.new(url: api.url_prefix) do |c|
|
186
188
|
# Request
|
187
189
|
c.request :json
|
188
190
|
|
@@ -197,6 +199,36 @@ module LWS::Generic
|
|
197
199
|
c.adapter Faraday.default_adapter
|
198
200
|
end
|
199
201
|
end
|
202
|
+
|
203
|
+
# A plain file connection to LWS (with token autnentication and caching but without
|
204
|
+
# JSON request/response).
|
205
|
+
@lws_connection = Faraday.new(url: api.url_prefix) do |c|
|
206
|
+
# Request
|
207
|
+
if config.caching_object
|
208
|
+
c.use FaradayMiddleware::Caching, config.caching_object
|
209
|
+
end
|
210
|
+
c.use LWS::Middleware::RequestHeaders, config.api_token
|
211
|
+
c.use config.api_token_middleware if config.api_token_middleware.present?
|
212
|
+
|
213
|
+
# Response
|
214
|
+
c.use FaradayMiddleware::FollowRedirects, limit: 3
|
215
|
+
c.use LWS::HTTPLogger, config.logger, config.http_debug_headers if config.http_debug
|
216
|
+
|
217
|
+
# Adapter
|
218
|
+
if config.http_persistent
|
219
|
+
c.adapter :net_http_persistent
|
220
|
+
else
|
221
|
+
c.adapter Faraday.default_adapter
|
222
|
+
end
|
223
|
+
end
|
224
|
+
end
|
225
|
+
|
226
|
+
# (see .upload)
|
227
|
+
# @deprecated
|
228
|
+
# To have a consistent upload/download naming counterpart, this
|
229
|
+
# method has been deprecated. Use {.upload} instead.
|
230
|
+
def self.create(file_or_io, filename, content_type = "application/octet-stream")
|
231
|
+
upload(file_or_io, filename, content_type)
|
200
232
|
end
|
201
233
|
|
202
234
|
# Uploads a file (or IO object) to the storage of the app module.
|
@@ -208,7 +240,7 @@ module LWS::Generic
|
|
208
240
|
# @param filename [String] the filename to use for the uploaded file/IO object
|
209
241
|
# @param content_type [String] the content type of the uploaded file/IO object
|
210
242
|
# @return [String, nil] the storage ID (if successful)
|
211
|
-
def self.
|
243
|
+
def self.upload(file_or_io, filename, content_type = "application/octet-stream")
|
212
244
|
return nil if file_or_io.closed?
|
213
245
|
|
214
246
|
data = file_or_io.read
|
@@ -217,7 +249,7 @@ module LWS::Generic
|
|
217
249
|
content_type: content_type,
|
218
250
|
byte_size: data.length,
|
219
251
|
checksum: checksum } }
|
220
|
-
res = @
|
252
|
+
res = @as_connection.post do |req|
|
221
253
|
req.url "rails/active_storage/direct_uploads"
|
222
254
|
req.headers["Accept"] = "application/json"
|
223
255
|
req.headers["Content-Type"] = "application/json"
|
@@ -226,7 +258,7 @@ module LWS::Generic
|
|
226
258
|
|
227
259
|
if res.success?
|
228
260
|
result = JSON.parse(res.body)
|
229
|
-
res = @
|
261
|
+
res = @as_connection.put do |req|
|
230
262
|
req.url result.dig("direct_upload", "url")
|
231
263
|
result.dig("direct_upload", "headers").each do |hdr, val|
|
232
264
|
req.headers[hdr] = val
|
@@ -240,6 +272,24 @@ module LWS::Generic
|
|
240
272
|
nil
|
241
273
|
end
|
242
274
|
end
|
243
|
-
end
|
244
275
|
|
276
|
+
# Downloads a file at the provided URL from the storage using the
|
277
|
+
# appropriate API tokens.
|
278
|
+
#
|
279
|
+
# This method can be used to download images/assets/etc. from LWS using
|
280
|
+
# URLs provided by attributes that end with +_url+.
|
281
|
+
# @param url [String] the URL to download the file from
|
282
|
+
# @return [String] the contents of the file
|
283
|
+
def self.download(url)
|
284
|
+
return nil if url.nil?
|
285
|
+
|
286
|
+
unless url.start_with? @lws_connection.url_prefix.to_s
|
287
|
+
raise ArgumentError,
|
288
|
+
"URL does not belong to this LWS app (endpoint: #{@lws_connection.url_prefix})"
|
289
|
+
end
|
290
|
+
|
291
|
+
res = @lws_connection.get(url)
|
292
|
+
res.body
|
293
|
+
end
|
294
|
+
end
|
245
295
|
end
|
data/lib/lws/apps/presence.rb
CHANGED
@@ -157,13 +157,24 @@ module LWS::Presence
|
|
157
157
|
# @return [Array<Integer>] the IDs of the underlying locations of the location
|
158
158
|
attribute :descendant_ids
|
159
159
|
|
160
|
+
# @!attribute image_storage_id
|
161
|
+
# @return [String, nil] the storage ID of the image of the location
|
162
|
+
attribute :image_storage_id
|
163
|
+
|
164
|
+
# @!attribute image_url
|
165
|
+
# @note
|
166
|
+
# To be able retrieve this, the token needs to be passed via +X-Token+
|
167
|
+
# in the HTTP request headers!
|
168
|
+
# @return [String, nil] the URL of the image of the location
|
169
|
+
attribute :image_url
|
170
|
+
|
160
171
|
# @!attribute lat
|
161
172
|
# @return [Float] the latitude of the location
|
162
173
|
attribute :lat
|
163
174
|
|
164
175
|
# @!attribute logoff_time
|
165
|
-
#
|
166
|
-
#
|
176
|
+
# The format of the time is +HH:MM+ and should be interpreted in the time zone
|
177
|
+
# of the location (see also {#time_zone}).
|
167
178
|
# @return [String] the time everybody is automatically logged off
|
168
179
|
attribute :logoff_time
|
169
180
|
|
@@ -238,6 +249,17 @@ module LWS::Presence
|
|
238
249
|
use_api LWS::Presence.api
|
239
250
|
uri "locations/:location_id/maps(/:id)"
|
240
251
|
|
252
|
+
# @!attribute image_storage_id
|
253
|
+
# @return [String, nil] the storage ID of the image of the map
|
254
|
+
attribute :image_storage_id
|
255
|
+
|
256
|
+
# @!attribute image_url
|
257
|
+
# @note
|
258
|
+
# To be able retrieve this, the token needs to be passed via +X-Token+
|
259
|
+
# in the HTTP request headers!
|
260
|
+
# @return [String, nil] the URL of the image of the map
|
261
|
+
attribute :image_url
|
262
|
+
|
241
263
|
# @!attribute location
|
242
264
|
# @return [Location] the location the map belongs to
|
243
265
|
belongs_to :location
|
@@ -251,6 +273,9 @@ module LWS::Presence
|
|
251
273
|
attribute :name
|
252
274
|
|
253
275
|
# @!attribute picture_url
|
276
|
+
# @deprecated
|
277
|
+
# Unauthenticated retrieval of the picture will not longer be supported
|
278
|
+
# in upcoming releases of LWS. Use {#image_url} instead!
|
254
279
|
# @return [String, nil] the URL of the picture of the map
|
255
280
|
attribute :picture_url
|
256
281
|
|
@@ -359,6 +384,17 @@ module LWS::Presence
|
|
359
384
|
# @return [Array<Appointment>] the appointments involving the person
|
360
385
|
has_many :appointments
|
361
386
|
|
387
|
+
# @!attribute avatar_storage_id
|
388
|
+
# @return [String, nil] the storage ID of the avatar of the person
|
389
|
+
attribute :avatar_storage_id
|
390
|
+
|
391
|
+
# @!attribute avatar_url
|
392
|
+
# @note
|
393
|
+
# To be able retrieve this, the token needs to be passed via +X-Token+
|
394
|
+
# in the HTTP request headers!
|
395
|
+
# @return [String, nil] the URL of the avatar of the person
|
396
|
+
attribute :avatar_url
|
397
|
+
|
362
398
|
# @!attribute company
|
363
399
|
# @return [LWS::Auth::Company] the company the person belongs to
|
364
400
|
belongs_to :company, class_name: "LWS::Auth::Company"
|
@@ -457,6 +493,9 @@ module LWS::Presence
|
|
457
493
|
attribute :phone_mobile
|
458
494
|
|
459
495
|
# @!attribute picture_url
|
496
|
+
# @deprecated
|
497
|
+
# Unauthenticated retrieval of the picture will not longer be supported
|
498
|
+
# in upcoming releases of LWS. Use {#avatar_url} instead!
|
460
499
|
# @return [String, nil] the URL of the picture of the person
|
461
500
|
attribute :picture_url
|
462
501
|
|
@@ -512,4 +551,9 @@ module LWS::Presence
|
|
512
551
|
attribute :node
|
513
552
|
end
|
514
553
|
|
554
|
+
# (see Generic::Storage)
|
555
|
+
class Storage < LWS::Generic::Storage
|
556
|
+
use_api LWS::Presence.api
|
557
|
+
end
|
558
|
+
|
515
559
|
end
|
data/lib/lws/version.rb
CHANGED
data/test/generic_test.rb
CHANGED
@@ -128,15 +128,37 @@ end
|
|
128
128
|
class TestGenericStorage < MiniTest::Test
|
129
129
|
|
130
130
|
# Generic class needs to be accessed under some kind of app
|
131
|
-
include LWS::
|
131
|
+
include LWS::Presence
|
132
132
|
|
133
133
|
def test_upload
|
134
134
|
data = StringIO.new("some file contents\n")
|
135
|
+
refute_nil(Storage.upload(data, "test.txt", "text/plain"))
|
136
|
+
|
137
|
+
# Test the deprecated method (for now)
|
135
138
|
refute_nil(Storage.create(data, "test.txt", "text/plain"))
|
136
139
|
|
137
140
|
# Also test using the default HTTP adapter.
|
138
141
|
reconfigure(http_persistent: false)
|
139
142
|
data = StringIO.new("some more file contents\n")
|
140
|
-
refute_nil(Storage.
|
143
|
+
refute_nil(Storage.upload(data, "test2.txt", "text/plain"))
|
144
|
+
end
|
145
|
+
|
146
|
+
def test_download
|
147
|
+
location = Location.find(1)
|
148
|
+
refute_nil(location.image_url)
|
149
|
+
|
150
|
+
data = Storage.download(location.image_url)
|
151
|
+
assert(data.size > 0)
|
152
|
+
|
153
|
+
assert_nil(Storage.download(nil))
|
154
|
+
|
155
|
+
assert_raises(ArgumentError) do
|
156
|
+
Storage.download("https://doesnot.exist.tld/some/file")
|
157
|
+
end
|
158
|
+
|
159
|
+
# Also test using the default HTTP adapter.
|
160
|
+
reconfigure(http_persistent: false)
|
161
|
+
data = Storage.download(location.image_url)
|
162
|
+
assert(data.size > 0)
|
141
163
|
end
|
142
164
|
end
|
data/test/test_helper.rb
CHANGED
@@ -23,7 +23,7 @@ SimpleCov.at_exit do
|
|
23
23
|
result.format!
|
24
24
|
simplecov_test_suites = ['minitest']
|
25
25
|
parallel_offset = ENV['PARALLEL_TEST_GROUPS'] ? ENV['PARALLEL_TEST_GROUPS'].to_i - 1 : 0
|
26
|
-
minimum_coverage =
|
26
|
+
minimum_coverage = 95
|
27
27
|
# Count the number of commas in the command name to figure out how many result groups were combined into this result
|
28
28
|
if result.command_name.scan(/,/).size + 1 >= simplecov_test_suites.size + (parallel_offset * 2) # two parallel suites
|
29
29
|
# We only want to enforce minimum coverage after all test suites finish
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: lws
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 7.0.
|
4
|
+
version: 7.0.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- LeftClick B.V.
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-03-
|
11
|
+
date: 2020-03-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: faraday_middleware
|
@@ -296,27 +296,27 @@ signing_key:
|
|
296
296
|
specification_version: 4
|
297
297
|
summary: LeftClick web services library for Ruby
|
298
298
|
test_files:
|
299
|
-
- test/
|
299
|
+
- test/presence_test.rb
|
300
300
|
- test/fixtures/permissions.yml
|
301
|
-
- test/
|
302
|
-
- test/
|
303
|
-
- test/
|
304
|
-
- test/
|
301
|
+
- test/fixtures/auth.yml
|
302
|
+
- test/corporate_website_test.rb
|
303
|
+
- test/logger_test.rb
|
304
|
+
- test/support/with_env.rb
|
305
305
|
- test/stubbing_test.rb
|
306
|
+
- test/ticket_test.rb
|
306
307
|
- test/digital_signage_test.rb
|
307
|
-
- test/
|
308
|
-
- test/
|
308
|
+
- test/caching_test.rb
|
309
|
+
- test/auth_test.rb
|
310
|
+
- test/maps_test.rb
|
311
|
+
- test/json_parser_test.rb
|
312
|
+
- test/resource_test.rb
|
313
|
+
- test/config/endpoints.yml
|
309
314
|
- test/config/switch_env.yml
|
310
315
|
- test/config/invalid.yml
|
311
|
-
- test/config/tokens.yml
|
312
316
|
- test/config/empty.yml
|
313
|
-
- test/config/
|
314
|
-
- test/
|
315
|
-
- test/
|
316
|
-
- test/
|
317
|
-
- test/support/with_env.rb
|
318
|
-
- test/caching_test.rb
|
319
|
-
- test/presence_test.rb
|
320
|
-
- test/corporate_website_test.rb
|
321
|
-
- test/resource_test.rb
|
317
|
+
- test/config/tokens.yml
|
318
|
+
- test/config/full.yml
|
319
|
+
- test/setup_test.rb
|
320
|
+
- test/api_token_middleware_test.rb
|
322
321
|
- test/generic_test.rb
|
322
|
+
- test/test_helper.rb
|