lws 6.3.1 → 6.3.2

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
  SHA256:
3
- metadata.gz: 7ef5cd27ac33754477433676be254a830b11ae048deeaddc8c847b19468ffe64
4
- data.tar.gz: 15fa827aed23e1a58d7843783f9f712aaf62e6db743acf43cdf64ac95fc11276
3
+ metadata.gz: 6735eba2229b17c2690bddf74524980752e5deea2e893d65e2789be1138df2a3
4
+ data.tar.gz: b5e0914b8295744c2e5ee2670d44835962faf000ccc307c75b0ff8de6b80e141
5
5
  SHA512:
6
- metadata.gz: e49fae53085988517741dba01bd314152a21230c1338ff023ad0ad844f4c66343ec79adaa1a9703337eca4f8c4bbf76fd0c8152fadf3be5dd0de5cb5e4d70f19
7
- data.tar.gz: a322643e07f01d0c97215d59523991385fe6b166843f10c2d64cc001749718053037bdaaadc1486f0eed8653d9338a4ff178374e9fc5f84c10868f346497a45d
6
+ metadata.gz: b82822f7f43fb6752b3f137fdad30be4e0a0f90e9084c22e5c3db6b6cbad70e49acf15772b2b3ae5f73e16037e134db3afa3bcd13956835089168219f76d4e9f
7
+ data.tar.gz: a3bbf82f1eb2c003bea92750544e4447b76949ca5cdff28730d7502e9826cb4d5cacb52299cbf4c2a88dae336fd48c6ccb769f1524fce7a9217cd8c5116b85df
data/CHANGELOG.md CHANGED
@@ -6,6 +6,14 @@ of LWS in the major/minor part of te version.
6
6
 
7
7
  The changelog follows the [Keep a Changelog] format from version 6.3.0 on.
8
8
 
9
+ ## [6.3.2] - 2019-09-26
10
+ ### Added
11
+ * Expanded the models and attributes in the presence app (#12108)
12
+ * Added a `#dig` method for the generic/all models
13
+
14
+ ### Fixed
15
+ * Fixed the reduced/dropped test coverage (#12107)
16
+
9
17
  ## [6.3.1] - 2019-09-05
10
18
  ### Changed
11
19
  * Reworked the JSON parser to handle metadata better
@@ -151,3 +159,4 @@ Initial release
151
159
  [Keep a Changelog]: https://keepachangelog.com/en/1.0.0/
152
160
  [6.3.0]: https://gitlab.leftclick.eu/platform/ruby-lws/compare/v6.2.3...v6.3.0
153
161
  [6.3.1]: https://gitlab.leftclick.eu/platform/ruby-lws/compare/v6.3.0...v6.3.1
162
+ [6.3.1]: https://gitlab.leftclick.eu/platform/ruby-lws/compare/v6.3.1...v6.3.2
@@ -150,6 +150,17 @@ module LWS::Generic
150
150
  result
151
151
  end
152
152
 
153
+ # Extracts a nested attribute vlaue specified by the sequence of attribute names
154
+ # by calling dig at each step, returning +nil+ if any intermediate step is +nil+.
155
+ def dig(*attrs)
156
+ attr = attrs.shift
157
+ value = send(attr)
158
+ return nil if value.nil?
159
+ return value if attrs.empty?
160
+ raise TypeError, "#{value.class} does not have #dig method" unless value.respond_to? :dig
161
+ value.dig(*attrs)
162
+ end
163
+
153
164
  end
154
165
 
155
166
  # = The configuration class
@@ -35,6 +35,59 @@ module LWS::Presence
35
35
 
36
36
  ### App specific classes
37
37
 
38
+ # = The appointment class
39
+ #
40
+ # @note
41
+ # This class is only used within the context of either the {Location} or
42
+ # the {Person} class.
43
+ class Appointment < LWS::Generic::Model
44
+ use_api LWS::Presence.api
45
+
46
+ # @!attribute title
47
+ # @return [String] the title of the appointment
48
+ attribute :title
49
+
50
+ # @!attribute datetime_end
51
+ # @return [String] the timestamp of the end of the appointment
52
+ attribute :datetime_end
53
+
54
+ # @!attribute datetime_start
55
+ # @return [String] the timestamp of the start of the appointment
56
+ attribute :datetime_start
57
+
58
+ # @!attribute description
59
+ # @return [String] the description of the appointment
60
+ attribute :description
61
+
62
+ # @!attribute invite
63
+ # @return [String] the original invite body of the appointment
64
+ attribute :invite
65
+
66
+ # @!attribute location
67
+ # @return [Location] the location of the appointment
68
+ belongs_to :location, uri: "locations/:id"
69
+
70
+ # @!attribute location
71
+ # @return [Integer] the ID of the location of the appointment
72
+ attribute :location_id
73
+
74
+ # @!attribute organiser
75
+ # @return [Person] the origaniser of the appointment
76
+ belongs_to :organiser, class_name: "LWS::Presence::Person"
77
+
78
+ # @!attribute organiser_id
79
+ # @return [Fixnum] the ID of the origaniser of the appointment
80
+ attribute :organiser_id
81
+
82
+ # @!attribute people
83
+ # @return [Array<Person>] the people associated with the appointment
84
+ has_many :people
85
+
86
+ # @!attribute uuid
87
+ # @return [String] the UUID of the location
88
+ attribute :uuid
89
+ end
90
+
38
91
  # = The location class
39
92
  class Location < LWS::Generic::Model
40
93
  use_api LWS::Presence.api
@@ -44,6 +97,10 @@ module LWS::Presence
44
97
  # including the location itself
45
98
  attribute :ancestor_ids
46
99
 
100
+ # @!attribute appointments
101
+ # @return [Array<Appointment>] the appointments taking place at the location
102
+ has_many :appointments
103
+
47
104
  # @!attribute capacity
48
105
  # @return [Integer] the capacity (maximum number of people) of the location
49
106
  attribute :capacity
@@ -121,6 +178,16 @@ module LWS::Presence
121
178
  # @return [String] the name of the location
122
179
  attribute :name
123
180
 
181
+ # @!attribute owner
182
+ # @return [Person, nil] the owner of the location
183
+ belongs_to :owner, class_name: "LWS::Presence::Person",
184
+ foreign_key: "owner_id",
185
+ uri: "people/:id"
186
+
187
+ # @!attribute owner_id
188
+ # @return [Fixnum, nil] the ID of the owner of the location
189
+ attribute :owner_id
190
+
124
191
  # @!attribute parent
125
192
  # @return [Location] the parent of the location
126
193
  belongs_to :parent, class_name: "LWS::Presence::Location",
@@ -147,6 +214,10 @@ module LWS::Presence
147
214
  # @!attribute readers
148
215
  # @return [Array<Reader>] the (RFID/code/ID/...) readers linked to this location
149
216
  has_many :readers
217
+
218
+ # @!attribute uuid
219
+ # @return [String] the UUID of the location
220
+ attribute :uuid
150
221
  end
151
222
 
152
223
  # = The location map class
@@ -239,10 +310,45 @@ module LWS::Presence
239
310
  attribute :y_pos
240
311
  end
241
312
 
313
+ # = The notification class
314
+ #
315
+ # @note This model can only be created via LWS, never retrieved, deleted or updated.
316
+ class Notification < LWS::Generic::Model
317
+ use_api LWS::Presence.api
318
+
319
+ # @attribute location
320
+ # @return [Location] the location the notification is for
321
+ belongs_to :location, uri: "locations/:id"
322
+
323
+ # @attribute location_id
324
+ # @return [Fixnum] the ID of the location the notification is for
325
+ attribute :location_id
326
+
327
+ # @attribute receiver
328
+ # @return [Person] the receiver of the notification
329
+ belongs_to :receiver
330
+
331
+ # @attribute receiver_id
332
+ # @return [Integer] the ID of the receiver of the notification
333
+ belongs_to :receiver_id
334
+
335
+ # @attribute sender
336
+ # @return [Person] the sender of the notification
337
+ belongs_to :sender
338
+
339
+ # @attribute sender_id
340
+ # @return [Integer] the ID of the receiver of the nofication
341
+ belongs_to :sender_id
342
+ end
343
+
242
344
  # = The person class
243
345
  class Person < LWS::Generic::Model
244
346
  use_api LWS::Presence.api
245
347
 
348
+ # @!attribute appointments
349
+ # @return [Array<Appointment>] the appointments involving the person
350
+ has_many :appointments
351
+
246
352
  # @!attribute company
247
353
  # @return [LWS::Auth::Company] the company the person belongs to
248
354
  belongs_to :company, class_name: "LWS::Auth::Company"
@@ -269,9 +375,14 @@ module LWS::Presence
269
375
  attribute :extra_info
270
376
 
271
377
  # @!attribute import_ref
272
- # @return [String, nil] reference for storing the uid of the remote database
378
+ # @return [String, nil] reference for storing the uid of the remote
379
+ # database
273
380
  attribute :import_ref
274
381
 
382
+ # @!attribute kind
383
+ # @return ["employee", "guest"] the person kind
384
+ attribute :kind
385
+
275
386
  # @!attribute last_sync
276
387
  # @return [String, nil] the last date/time the status was updated via a
277
388
  # device or RFID tag
@@ -339,11 +450,13 @@ module LWS::Presence
339
450
  attribute :udid
340
451
 
341
452
  # @!attribute vehicle_registration_plate
342
- # @return [String, nil] The vehicle registration plate of the persons transport
453
+ # @return [String, nil] The vehicle registration plate of the persons
454
+ # transport
343
455
  attribute :vehicle_registration_plate
344
456
 
345
457
  # @!attribute visibility
346
- # @return ["public", "private"] if a person should be protected by not showing critical information
458
+ # @return ["public", "private"] if a person should be protected by not
459
+ # showing critical information
347
460
  attribute :visibility
348
461
  end
349
462
 
data/lib/lws/version.rb CHANGED
@@ -13,6 +13,6 @@ module LWS
13
13
 
14
14
  # The LWS library version.
15
15
  # @note The major and minor version parts match the LWS API version!
16
- VERSION = '6.3.1'.freeze
16
+ VERSION = '6.3.2'.freeze
17
17
 
18
18
  end
data/test/generic_test.rb CHANGED
@@ -25,6 +25,12 @@ class TestGenericModel < MiniTest::Test
25
25
  assert_equal("other_value", @configuration.value)
26
26
  end
27
27
 
28
+ def test_not_found
29
+ assert_raises LWS::Errors::ResourceNotFound do
30
+ Configuration.find("NOTEXIST")
31
+ end
32
+ end
33
+
28
34
  def test_lifecycle
29
35
  # Create
30
36
  new_configuration = Configuration.create(key: "test", value: "some_value")
@@ -88,6 +94,18 @@ class TestGenericModel < MiniTest::Test
88
94
  assert_equal(true, result)
89
95
  end
90
96
 
97
+ def test_dig
98
+ company = LWS::Auth::Company.find(1)
99
+ assert_equal(company.id, company.dig(:id))
100
+
101
+ assert_equal(company.contact_person.name, company.dig(:contact_person, :name))
102
+ assert_nil(company.dig(:parent, :name))
103
+
104
+ assert_raises(TypeError) do
105
+ company.dig(:id, :foo)
106
+ end
107
+ end
108
+
91
109
  end
92
110
 
93
111
  class TestGenericConfiguration < MiniTest::Test
@@ -115,5 +133,10 @@ class TestGenericStorage < MiniTest::Test
115
133
  def test_upload
116
134
  data = StringIO.new("some file contents\n")
117
135
  refute_nil(Storage.create(data, "test.txt", "text/plain"))
136
+
137
+ # Also test using the default HTTP adapter.
138
+ reconfigure(http_persistent: false)
139
+ data = StringIO.new("some more file contents\n")
140
+ refute_nil(Storage.create(data, "test2.txt", "text/plain"))
118
141
  end
119
142
  end
@@ -24,10 +24,16 @@ class TestJSONParser < MiniTest::Test
24
24
  country: "NL",
25
25
  # ...
26
26
  } }
27
+ companies = [ { id: "correct",
28
+ country: "NL",
29
+ # ...
30
+ } ]
27
31
 
28
32
  full_uri = LWS::Auth.api.url_prefix.dup
29
33
  full_uri.path = "/companies/broken"
30
34
  stub_request(:get, full_uri.to_s).to_return(body: "{}invalid json")
35
+ full_uri.path = "/companies/noobj"
36
+ stub_request(:get, full_uri.to_s).to_return(body: "\"str\"")
31
37
  full_uri.path = "/companies/empty"
32
38
  stub_request(:get, full_uri.to_s).to_return(body: "")
33
39
  full_uri.path = "/companies/correct"
@@ -36,6 +42,8 @@ class TestJSONParser < MiniTest::Test
36
42
  stub_request(:put, full_uri.to_s)
37
43
  .to_return(body: MultiJson.dump(company.merge(errors: { contact_person_id: ["can't be blank"] })))
38
44
  full_uri.path = "/companies"
45
+ stub_request(:get, full_uri.to_s)
46
+ .to_return(body: MultiJson.dump(companies))
39
47
  stub_request(:post, full_uri.to_s)
40
48
  .to_return(body: "", status: 204)
41
49
  end
@@ -49,12 +57,24 @@ class TestJSONParser < MiniTest::Test
49
57
  assert_raises LWS::Errors::InvalidResponse do
50
58
  company = LWS::Auth::Company.find("broken")
51
59
  end
60
+
61
+ assert_raises LWS::Errors::InvalidResponse do
62
+ company = LWS::Auth::Company.find("noobj")
63
+ end
64
+
65
+ assert_raises LWS::Errors::InvalidResponse do
66
+ company = LWS::Auth::Company.find("empty")
67
+ end
52
68
  end
53
69
 
54
70
  def test_correct_json
55
71
  company = LWS::Auth::Company.find("correct")
56
72
  assert_equal "correct", company.id
57
73
  end
74
+ def test_correct_json_ary
75
+ companies = LWS::Auth::Company.all.to_a
76
+ assert_equal "correct", companies.first.id
77
+ end
58
78
 
59
79
  def test_no_content_json
60
80
  company = LWS::Auth::Company.create
@@ -11,12 +11,36 @@
11
11
 
12
12
  require "test_helper"
13
13
 
14
+ class TestPresenceAppointment < MiniTest::Test
15
+
16
+ include LWS::Presence
17
+
18
+ def setup
19
+ @location = Location.where(includes: "appointments.*").find(1)
20
+ @appointment = @location.appointments.first
21
+ end
22
+
23
+ def test_valid
24
+ refute_nil(@appointment)
25
+ assert_instance_of(Appointment, @appointment)
26
+ refute_nil(@appointment.id)
27
+ end
28
+
29
+ def test_valid_associations
30
+ assert_instance_of(Location, @appointment.location)
31
+ assert_equal(@location, @appointment.location)
32
+ assert_instance_of(Person, @appointment.organiser)
33
+ assert_instance_of(Person, @appointment.people.first)
34
+ end
35
+
36
+ end
37
+
14
38
  class TestPresenceLocation < MiniTest::Test
15
39
 
16
40
  include LWS::Presence
17
41
 
18
42
  def setup
19
- @location = Location.find(1)
43
+ @location = Location.where(includes: "appointments.*").find(1)
20
44
  end
21
45
 
22
46
  def test_valid
@@ -26,9 +50,11 @@ class TestPresenceLocation < MiniTest::Test
26
50
  end
27
51
 
28
52
  def test_valid_associations
53
+ assert_instance_of(Appointment, @location.appointments.first)
29
54
  assert_instance_of(LWS::Auth::Company, @location.company)
30
55
  assert_instance_of(Location::Map::Position, @location.map_positions.first)
31
56
  assert_instance_of(Location::Map, @location.maps.first)
57
+ assert_instance_of(Person, @location.owner)
32
58
  assert_instance_of(Person, @location.people.first)
33
59
  assert_instance_of(Reader, @location.readers.first)
34
60
  loc = Location.where(includes: "people_tree").find(1)
@@ -92,12 +118,29 @@ class TestPresenceLocationMapPosition < MiniTest::Test
92
118
  end
93
119
 
94
120
  end
121
+
122
+ class TestPresenceNotification < MiniTest::Test
123
+
124
+ include LWS::Presence
125
+
126
+ def setup
127
+ @notification = Notification.create(location_id: 1,
128
+ receiver_id: 1,
129
+ sender_id: 1)
130
+ end
131
+
132
+ def test_valid
133
+ refute_nil(@notification)
134
+ end
135
+
136
+ end
137
+
95
138
  class TestPresencePerson < MiniTest::Test
96
139
 
97
140
  include LWS::Presence
98
141
 
99
142
  def setup
100
- @person = Person.find(1)
143
+ @person = Person.where(includes: "appointments.*").find(1)
101
144
  end
102
145
 
103
146
  def test_valid
@@ -107,6 +150,7 @@ class TestPresencePerson < MiniTest::Test
107
150
  end
108
151
 
109
152
  def test_valid_associations
153
+ assert_instance_of(Appointment, @person.appointments.first)
110
154
  assert_instance_of(LWS::Auth::Company, @person.company)
111
155
  assert_instance_of(Location, @person.location)
112
156
  end
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: 6.3.1
4
+ version: 6.3.2
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: 2019-09-05 00:00:00.000000000 Z
11
+ date: 2019-09-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: faraday_middleware