lws 7.0.2 → 7.1.3

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: 2baebac6cb99dc5b7106f8cb9eeff4953f623ed1c7a2465ef165e9bf48c0330a
4
- data.tar.gz: 58833b0704e57635dcf70f06391f45276723efadac02ed05106efb23ce82f70d
3
+ metadata.gz: b61e005e4e0e7bf19e2d9299e5444e914c5aac6df6cfd3084cd63ff5fd75bb87
4
+ data.tar.gz: 0fa6b75fa04c5b9823052e79a74283fcb1de031ca3312cd921f942100cb32248
5
5
  SHA512:
6
- metadata.gz: 1430d0b1e0927121be013e60191be69e41b3fcc8a388ac6f707d6c39471fcf540776cf82c674f50104fa200e0c43f28f7c6662b3e1787116205e8b5f04357d51
7
- data.tar.gz: 98e60f674fc4b39ab09805accb562f6080c87573930dff4c660f42b8ef0c806c44460fdc191aa6bad86636374cc7619cedbb84ae90fbfdcab2dfeb50f7d6c832
6
+ metadata.gz: 2619b5d60dc8a3df39b8d739b364832d63025b5eca9024b42619308e753ee51fcbd14dda437a1a1d3269eef2eee3e8acea30841c020b6bfc7da1b9dbd277af94
7
+ data.tar.gz: 97f62b08426cdbbeae331d10254f8b12e58147074cbecee642d1a4cbe179d4ebd1fd70080cda730d003ec10a2799499f626bc97d5ce92f3ab91189adb3d63d00
@@ -87,13 +87,11 @@ begin
87
87
  if @options[:cfg_file]
88
88
  cfg_file = @options[:cfg_file]
89
89
  raise "config file does not exist: #{cfg_file}" unless File.exist? cfg_file
90
- config.load_config_file(cfg_file)
90
+ config.load_config_file(cfg_file, @options[:environment])
91
91
  else
92
- config.load_config_file(GLOBAL_CONFIG_FILE)
93
- config.load_config_file(USER_CONFIG_FILE)
92
+ config.load_config_file(GLOBAL_CONFIG_FILE, @options[:environment])
93
+ config.load_config_file(USER_CONFIG_FILE, @options[:environment])
94
94
  end
95
-
96
- config.environment = @options[:environment] if @options[:environment]
97
95
  end
98
96
  if @options[:app]
99
97
  @app_module = LWS.app_module(@options[:app].downcase)
@@ -134,7 +132,11 @@ end
134
132
 
135
133
  # Set up Pry
136
134
  FileUtils.mkdir_p("#{ENV['HOME']}/.local/share/LeftClick")
137
- Pry.config.history.file = "#{ENV['HOME']}/.local/share/LeftClick/lws_history"
135
+ if Pry.config.history_file
136
+ Pry.config.history_file = "#{ENV['HOME']}/.local/share/LeftClick/lws_history"
137
+ else
138
+ Pry.config.history.file = "#{ENV['HOME']}/.local/share/LeftClick/lws_history"
139
+ end
138
140
  Pry.config.prompt_name = PROG_NAME
139
141
 
140
142
  # Print an LWS setup summary
@@ -154,7 +156,7 @@ if LWS.config.http_debug
154
156
  end
155
157
  end
156
158
  debug_outputs << "JSON" if LWS.config.json_debug
157
- unless debug_outputs.present?
159
+ if debug_outputs.present?
158
160
  puts "- Debug output: #{debug_outputs.join(', ')}"
159
161
  end
160
162
  puts
data/lib/lws.rb CHANGED
@@ -60,7 +60,7 @@ module LWS
60
60
  # config.api_token_middleware = TokenAuthenticator
61
61
  # config.caching_object = MyRedisCache.new
62
62
  # config.environment = :development
63
- # config.endponts = { maps: "https://maps.leftclick.cloud" }
63
+ # config.endpoints = { maps: "https://maps.leftclick.cloud" }
64
64
  # config.http_debug = true
65
65
  # config.json_debug = true
66
66
  # config.logger = Rails.logger
@@ -77,7 +77,11 @@ module LWS
77
77
  # @return [LWS] the module itself
78
78
  def self.setup(&block)
79
79
  @@config = Config.new
80
- yield @@config
80
+
81
+ # Override the environment if needed
82
+ if ENV["LC_LWS_ENV"].present?
83
+ @@config.environment = ENV["LC_LWS_ENV"].to_sym
84
+ end
81
85
 
82
86
  # Override the API token if needed (and no custom API token middleware
83
87
  # is used)
@@ -85,10 +89,7 @@ module LWS
85
89
  @@config.api_token = ENV["LC_LWS_API_TOKEN"]
86
90
  end
87
91
 
88
- # Override the environment if needed
89
- if ENV["LC_LWS_ENV"].present?
90
- @@config.environment = ENV["LC_LWS_ENV"].to_sym
91
- end
92
+ yield @@config
92
93
 
93
94
  if config.api_token.blank? and config.api_token_middleware.blank?
94
95
  raise LWS::Errors::ConfigError,
@@ -107,8 +108,8 @@ module LWS
107
108
  # Sets up the Faraday API object with the current LWS configuration for
108
109
  # the given API URL.
109
110
  #
110
- # @param api_url The endpoint URL of the API
111
- # @return [Faraday] A Faraday connection that makes requests to the API
111
+ # @param api_url [String] The endpoint URL of the API
112
+ # @return [Faraday::Connection] A Faraday connection that makes requests to the API
112
113
  def self.setup_api(api_url)
113
114
  api = Faraday.new(url: api_url) do |c|
114
115
  # Request
@@ -497,6 +497,11 @@ module LWS::DigitalSignage
497
497
  class Layout < LWS::Generic::Model
498
498
  use_api LWS::DigitalSignage.api
499
499
 
500
+ # @!attribute category_ids
501
+ # @return [Array<Integer>] the IDs of the categories assoicated with
502
+ # the layout
503
+ attribute :category_ids
504
+
500
505
  # @!attribute categories
501
506
  # @return [Array<Layout::Category>] the categories associated with
502
507
  # the layout
@@ -504,13 +509,19 @@ module LWS::DigitalSignage
504
509
  has_many :categories, class_name: "LWS::DigitalSignage::Layout::Category",
505
510
  uri: "layout/:layout_id/categories(/:id)"
506
511
 
507
- # @!attribute company
508
- # @return [LWS::Auth::Company] the company the layout belongs to
509
- belongs_to :company, class_name: "LWS::Auth::Company"
512
+ # @!attribute company_owner
513
+ # @return [LWS::Auth::Company] the company that owns the layout
514
+ belongs_to :company_owner, class_name: "LWS::Auth::Company",
515
+ foreign_key: :company_owner_id,
516
+ uri: "companies/:id"
510
517
 
511
- # @!attribute company_id
512
- # @return [Integer] the ID of the company the layout belongs to
513
- attribute :company_id
518
+ # @!attribute company_owner_id
519
+ # @return [Integer] the ID of the company that owns the layout
520
+ attribute :company_owner_id
521
+
522
+ # @!attribute company_shared_ids
523
+ # @return [Array<Integer>] the IDs of the company the layout is shared with
524
+ attribute :company_shared_ids
514
525
 
515
526
  # @!attribute default_duration
516
527
  # @return [5..3600] the default duration of a slide created from the layout
@@ -520,6 +531,14 @@ module LWS::DigitalSignage
520
531
  # @return [String, nil] the description of the layout
521
532
  attribute :description
522
533
 
534
+ # @!attribute description_html
535
+ # @return [String, nil] an HTML version of the description of the layout
536
+ attribute :description_html
537
+
538
+ # @!attribute duration_kind
539
+ # @return ["variable", "fixed", "kind"] the duration kind of the layout
540
+ attribute :duration_kind
541
+
523
542
  # @!attribute favorite
524
543
  # @return [Boolean] whether the layout is a favorite for the current account
525
544
  attribute :favorite
@@ -547,11 +566,25 @@ module LWS::DigitalSignage
547
566
  # @return [Boolean] whether the layout has priority over others
548
567
  attribute :priority
549
568
 
569
+ # @!attribute public
570
+ # @return [Boolean] whether the layout is public (i.e. shared with all
571
+ # companies)
572
+ attribute :public
573
+
574
+ # @!attribute rotation
575
+ # @return ["landscape", "portrait"] the rotation (orientation) of the
576
+ # layout
577
+ attribute :rotation
578
+
550
579
  # @!attribute slides
551
580
  # @return [Array<Slide>] the slides using the layout
552
581
  has_many :slides, class_name: "LWS::DigitalSignage::Slide",
553
582
  uri: "layouts/:layout_id/slides(/:id)"
554
583
 
584
+ # @!attribute thumbnail_url
585
+ # @return [String, nil] the URL of the thumbnail of the layout
586
+ attribute :thumbnail_url
587
+
555
588
  # @!attribute trans
556
589
  # @return ["cut", "fadein", "zoomin", "slidein"] the transition of the
557
590
  # entire layout
@@ -801,9 +834,9 @@ module LWS::DigitalSignage
801
834
  # @return [Integer] the ID of the configuration of the player
802
835
  attribute :configuration_id
803
836
 
804
- # @!attribute feedbacks
805
- # @return [Array<Player::Feedback>] the feedbacks for the player
806
- has_many :feedbacks, class_name: "LWS::DigitalSignage::Player::Feedback"
837
+ # @!attribute feedback
838
+ # @return [Hash{String=>String}] a mapping of player feedback key/values
839
+ attribute :feedback
807
840
 
808
841
  # @!attribute [r] health_percentage
809
842
  # @return [Fixnum] the health of the player (percentage)
@@ -834,13 +867,17 @@ module LWS::DigitalSignage
834
867
  # @return [Integer] the ID of the model of the player
835
868
  attribute :model_id
836
869
 
870
+ # @!attribute name
871
+ # @return [String] the name of the player
872
+ attribute :name
873
+
837
874
  # @!attribute notifications
838
875
  # @return [Array<Player::Notification>] the notifications for the player
839
876
  has_many :notifications, class_name: "LWS::DigitalSignage::Player::Notification"
840
877
 
841
- # @!attribute operational_hours [r]
878
+ # @!attribute operation_hours [r]
842
879
  # @return [String, nil] the number of hours the player has been operational
843
- attribute :operational_hours
880
+ attribute :operation_hours
844
881
 
845
882
  # @!attribute operational_since [r]
846
883
  # @return [String, nil] the date/time when the player became operational
@@ -871,7 +908,7 @@ module LWS::DigitalSignage
871
908
  attribute :release_channel_id
872
909
 
873
910
  # @!attribute requests
874
- # @return [Array<Player::Feedback>] the requests for the player
911
+ # @return [Array<Player::Request>] the requests for the player
875
912
  has_many :requests, class_name: "LWS::DigitalSignage::Player::Request"
876
913
 
877
914
  # @!attribute screenshots
@@ -890,6 +927,15 @@ module LWS::DigitalSignage
890
927
  # @return ["unknown", "good", "warning", "bad"] the player status
891
928
  attribute :status
892
929
 
930
+ # @!attribute status_reason [r]
931
+ # @return ["unknown", "hardware_failure", "outdated_os", "good", "connection_inactive_short",
932
+ # "connection_inactive_long"] the reason for the current player status
933
+ attribute :status_reason
934
+
935
+ # @!attribute status_updated_at [r]
936
+ # @return [String] the date/time the status was last updated
937
+ attribute :status_updated_at
938
+
893
939
  # @!attribute tags
894
940
  # @return [Array<Player::Tag>] the tags of the player
895
941
  has_many :tags, class_name: "LWS::DigitalSignage::Player::Tag"
@@ -1040,75 +1086,6 @@ module LWS::DigitalSignage
1040
1086
  attribute :value
1041
1087
  end
1042
1088
 
1043
- # = The player feedback class
1044
- #
1045
- # @note
1046
- # This class is only used within the context of the {Player} class.
1047
- class Player::Feedback < LWS::Generic::Model
1048
- use_api LWS::DigitalSignage.api
1049
- uri "players/:player_id/feedbacks(/:id)"
1050
-
1051
- # @!attribute player
1052
- # @return [Player] the player the feedback is originating from
1053
- belongs_to :player, class_name: "LWS::DigitalSignage::Player"
1054
-
1055
- # @!attribute player_id
1056
- # @return [Integer] the ID of the player the feedback is originating from
1057
- attribute :player_id
1058
-
1059
- # @!attribute release
1060
- # @return [Player::Os::Branch::Release] the player OS branch release the
1061
- # feedback is related to
1062
- # FIXME: Missing branch_id field in LWS
1063
- belongs_to :release, class_name: "LWS::DigitalSignage::Player::Os::Branch::Release",
1064
- uri: "player/os/branches/:branch_id/releases/:id"
1065
-
1066
- # @!attribute release_id
1067
- # @return [Integer] the ID of the player OS branch release the feedback
1068
- # is related to
1069
-
1070
- # @!attribute results
1071
- # @return [Array<Player::Feedback::Result>] the results of the player feedback
1072
- # FIXME: Chained associations don't work yet in Spyke (#89)
1073
- has_many :results, class_name: "LWS::DigitalSignage::Player::Feedback::Result",
1074
- uri: "players/:player_id/feedbacks/:feedback_id/results(/:id)"
1075
- end
1076
-
1077
- # = The player feedback result class
1078
- #
1079
- # @note
1080
- # This class is only used within the context of the {Player::Feedback}
1081
- # class.
1082
- class Player::Feedback::Result < LWS::Generic::Model
1083
- use_api LWS::DigitalSignage.api
1084
- uri "players/:player_id/feedbacks/:feedback_id/results(/:id)"
1085
-
1086
- # @!attribute feedback
1087
- # @return [Player::Feedback] the player feedback the result is a part of
1088
- belongs_to :feedback, class_name: "LWS::DigitalSignage::Player::Feedback",
1089
- uri: "players/:player_id/feedbacks/:id"
1090
-
1091
- # @!attribute feedback_id
1092
- # @return [Player::Feedback] the ID of the player feedback the result is a part of
1093
- attribute :feedback_id
1094
-
1095
- # @!attribute key
1096
- # @return [String] the key of the player feedback result
1097
- attribute :key
1098
-
1099
- # @!attribute player
1100
- # @return [Player] the player the feedback result is for
1101
- belongs_to :player, class_name: "LWS::DigitalSignage::Player"
1102
-
1103
- # @!attribute player_id
1104
- # @return [Integer] the ID of the player the feedback result is for
1105
- attribute :player_id
1106
-
1107
- # @!attribute value
1108
- # @return [String] the value of the player feedback result
1109
- attribute :value
1110
- end
1111
-
1112
1089
  # = The player log class
1113
1090
  #
1114
1091
  # @note
@@ -1632,20 +1609,6 @@ module LWS::DigitalSignage
1632
1609
  # @return [String, nil] the optional argument for the player request
1633
1610
  attribute :argument
1634
1611
 
1635
- # @!attribute feedback
1636
- # This field should be set once the action has been processed (see
1637
- # {#processed}) and the action is +"send_feedback"+.
1638
- #
1639
- # @return [Player::Feedback, nil] the player feedback as a response to the
1640
- # action request +"send_status"+
1641
- belongs_to :feedback, class_name: "LWS::DigitalSignage::Player::Feedback",
1642
- uri: "players/:player_id/feedbacks/:id"
1643
-
1644
- # @!attribute feedback_id
1645
- # @return [Integer, nil] the ID of the player feedback as a response to the
1646
- # action request +"send_status"+
1647
- attribute :feedback_id
1648
-
1649
1612
  # @!attribute log
1650
1613
  # This field should be set once the action has been processed (see
1651
1614
  # {#processed}) and the action is +"send_logs"+.
@@ -1764,6 +1727,10 @@ module LWS::DigitalSignage
1764
1727
  # scheduled on
1765
1728
  has_many :channel_groups, class_name: "LWS::DigitalSignage::Channel::Group"
1766
1729
 
1730
+ # @!attribute comments
1731
+ # @return [String, nil] the comments/remarks for the slide
1732
+ attribute :comments
1733
+
1767
1734
  # @!attribute company
1768
1735
  # @return [LWS::Auth::Company] the company the slide belongs to
1769
1736
  belongs_to :company, class_name: "LWS::Auth::Company"
@@ -1772,6 +1739,19 @@ module LWS::DigitalSignage
1772
1739
  # @return [Integer] the ID of the company the slide belongs to
1773
1740
  attribute :company_id
1774
1741
 
1742
+ # @!attribute duration
1743
+ # @return [Integer, nil] the duration of the slide (for fixed or content-bound durations
1744
+ # in the layout)
1745
+ attribute :duration
1746
+
1747
+ # @!attribute edit_account_ids
1748
+ # @return [Array<Integer>] the IDs of the accounts that can edit the slide
1749
+ attribute :edit_account_ids
1750
+
1751
+ # @!attribute editable_by_me
1752
+ # @return [Boolean] whether the authenticated user can edit the slide
1753
+ attribute :editable_by_me
1754
+
1775
1755
  # @!attribute layout
1776
1756
  # @return [LWS::Layout] the layout the slide uses
1777
1757
  belongs_to :layout
@@ -1790,13 +1770,16 @@ module LWS::DigitalSignage
1790
1770
 
1791
1771
  # @!attribute schedules
1792
1772
  # @return [Array<Schedule>] the slide schedules that apply for the slide
1793
- # FIXME: Missing endpoint in LWS
1794
1773
  has_many :schedules, class_name: "LWS::DigitalSignage::Slide::Schedule"
1795
1774
 
1796
1775
  # @!attribute status [r]
1797
1776
  # @return ["initializing", "waiting_content", "available", "error"]
1798
1777
  # the status of the slide
1799
1778
  attribute :status
1779
+
1780
+ # @!attribute thumbnail_url
1781
+ # @return [String, nil] the URL of the thumbnail of the slide
1782
+ attribute :thumbnail_url
1800
1783
  end
1801
1784
 
1802
1785
  # = The slide schedule class
@@ -79,8 +79,10 @@ module LWS::Generic
79
79
  # Sets the Faraday API object used for this class. This will used by
80
80
  # Spyke.
81
81
  #
82
- # @param api The Faraday connection that makes requests to the API
83
- # @return [Faraday] A Faraday connection that makes requests to the API
82
+ # @param [Faraday::Connection] api A Faraday connection that makes
83
+ # requests to the API
84
+ # @return [Faraday::Connection] The Faraday connection that makes requests
85
+ # to the API
84
86
  def self.use_api(api)
85
87
  self.connection = api
86
88
  self.include_root_in_json self.name.split("::").last.underscore.to_sym
@@ -150,8 +152,9 @@ module LWS::Generic
150
152
  result
151
153
  end
152
154
 
153
- # Extracts a nested attribute vlaue specified by the sequence of attribute names
155
+ # Extracts a nested attribute value specified by the sequence of attribute names
154
156
  # by calling dig at each step, returning +nil+ if any intermediate step is +nil+.
157
+ # @return [Object, nil] the digged up value or +nil+
155
158
  def dig(*attrs)
156
159
  attr = attrs.shift
157
160
  value = send(attr)
@@ -161,6 +164,20 @@ module LWS::Generic
161
164
  value.dig(*attrs)
162
165
  end
163
166
 
167
+ # Returns a deep copy of the model.
168
+ # @return [Model] a deep copy of the model
169
+ def deep_dup
170
+ dup_obj = super
171
+ dup_obj.instance_eval do
172
+ @changed_attributes = @changed_attributes.deep_dup
173
+ @previously_changed = @previously_changed.deep_dup
174
+ @scope = @scope.deep_dup
175
+ @spyke_attributes = @spyke_attributes.deep_dup
176
+ @uri_template = @uri_template.deep_dup
177
+ end
178
+ dup_obj
179
+ end
180
+
164
181
  end
165
182
 
166
183
  # = The configuration class
@@ -180,9 +197,11 @@ module LWS::Generic
180
197
  class Storage
181
198
  # @!visibility private
182
199
  def self.use_api(api)
183
- @connection = Faraday.new(url: api.url_prefix) do |c|
184
- config = LWS.config
200
+ config = LWS.config
185
201
 
202
+ # A connection to Active Storage (with JSON request/response, but without
203
+ # token authentication and caching).
204
+ @as_connection = Faraday.new(url: api.url_prefix) do |c|
186
205
  # Request
187
206
  c.request :json
188
207
 
@@ -197,6 +216,36 @@ module LWS::Generic
197
216
  c.adapter Faraday.default_adapter
198
217
  end
199
218
  end
219
+
220
+ # A plain file connection to LWS (with token autnentication and caching but without
221
+ # JSON request/response).
222
+ @lws_connection = Faraday.new(url: api.url_prefix) do |c|
223
+ # Request
224
+ if config.caching_object
225
+ c.use FaradayMiddleware::Caching, config.caching_object
226
+ end
227
+ c.use LWS::Middleware::RequestHeaders, config.api_token
228
+ c.use config.api_token_middleware if config.api_token_middleware.present?
229
+
230
+ # Response
231
+ c.use FaradayMiddleware::FollowRedirects, limit: 3
232
+ c.use LWS::HTTPLogger, config.logger, config.http_debug_headers if config.http_debug
233
+
234
+ # Adapter
235
+ if config.http_persistent
236
+ c.adapter :net_http_persistent
237
+ else
238
+ c.adapter Faraday.default_adapter
239
+ end
240
+ end
241
+ end
242
+
243
+ # (see .upload)
244
+ # @deprecated
245
+ # To have a consistent upload/download naming counterpart, this
246
+ # method has been deprecated. Use {.upload} instead.
247
+ def self.create(file_or_io, filename, content_type = "application/octet-stream")
248
+ upload(file_or_io, filename, content_type)
200
249
  end
201
250
 
202
251
  # Uploads a file (or IO object) to the storage of the app module.
@@ -208,7 +257,7 @@ module LWS::Generic
208
257
  # @param filename [String] the filename to use for the uploaded file/IO object
209
258
  # @param content_type [String] the content type of the uploaded file/IO object
210
259
  # @return [String, nil] the storage ID (if successful)
211
- def self.create(file_or_io, filename, content_type = "application/octet-stream")
260
+ def self.upload(file_or_io, filename, content_type = "application/octet-stream")
212
261
  return nil if file_or_io.closed?
213
262
 
214
263
  data = file_or_io.read
@@ -217,7 +266,7 @@ module LWS::Generic
217
266
  content_type: content_type,
218
267
  byte_size: data.length,
219
268
  checksum: checksum } }
220
- res = @connection.post do |req|
269
+ res = @as_connection.post do |req|
221
270
  req.url "rails/active_storage/direct_uploads"
222
271
  req.headers["Accept"] = "application/json"
223
272
  req.headers["Content-Type"] = "application/json"
@@ -226,7 +275,7 @@ module LWS::Generic
226
275
 
227
276
  if res.success?
228
277
  result = JSON.parse(res.body)
229
- res = @connection.put do |req|
278
+ res = @as_connection.put do |req|
230
279
  req.url result.dig("direct_upload", "url")
231
280
  result.dig("direct_upload", "headers").each do |hdr, val|
232
281
  req.headers[hdr] = val
@@ -240,6 +289,24 @@ module LWS::Generic
240
289
  nil
241
290
  end
242
291
  end
243
- end
244
292
 
293
+ # Downloads a file at the provided URL from the storage using the
294
+ # appropriate API tokens.
295
+ #
296
+ # This method can be used to download images/assets/etc. from LWS using
297
+ # URLs provided by attributes that end with +_url+.
298
+ # @param url [String] the URL to download the file from
299
+ # @return [String] the contents of the file
300
+ def self.download(url)
301
+ return nil if url.nil?
302
+
303
+ unless url.start_with? @lws_connection.url_prefix.to_s
304
+ raise ArgumentError,
305
+ "URL does not belong to this LWS app (endpoint: #{@lws_connection.url_prefix})"
306
+ end
307
+
308
+ res = @lws_connection.get(url)
309
+ res.body
310
+ end
311
+ end
245
312
  end
@@ -88,6 +88,46 @@ module LWS::Presence
88
88
  attribute :uuid
89
89
  end
90
90
 
91
+ # = The journal (entry) class
92
+ #
93
+ # @note
94
+ # This class is only used within the context of the {Location} class.
95
+ class Journal < LWS::Generic::Model
96
+ use_api LWS::Presence.api
97
+
98
+ # @!attribute check_in
99
+ # @return [String] the timestamp of the check-in of this journal (entry)
100
+ attribute :check_in
101
+
102
+ # @!attribute check_out
103
+ # @return [String, nil] the timestamp of the check out of this journal (entry)
104
+ attribute :check_out
105
+
106
+ # @!attribute company
107
+ # @return [LWS::Auth::Company] the company the journal (entry) belongs to
108
+ belongs_to :company, class_name: "LWS::Auth::Company"
109
+
110
+ # @!attribute company_id
111
+ # @return [Integer] the ID of the company the journal (entry) belongs to
112
+ attribute :company_id
113
+
114
+ # @!attribute location
115
+ # @return [Location] the location the journal (entry) belongs to
116
+ belongs_to :location
117
+
118
+ # @!attribute location_id
119
+ # @return [Integer] the ID of the location the journal (entry) belongs to
120
+ attribute :location_id
121
+
122
+ # @!attribute person
123
+ # @return [Person] the person the journal (entry) belongs to
124
+ belongs_to :person
125
+
126
+ # @!attribute person_id
127
+ # @return [Integer] the ID of the person the journal (entry) belongs to
128
+ attribute :person_id
129
+ end
130
+
91
131
  # = The location class
92
132
  class Location < LWS::Generic::Model
93
133
  use_api LWS::Presence.api
@@ -133,6 +173,14 @@ module LWS::Presence
133
173
  # the presence status to set people to when checking in
134
174
  attribute :checkin_status
135
175
 
176
+ # @!attribute checkout_alter_status
177
+ # @return ["available", "unavailable", "maintenance_cleaning",
178
+ # "maintenance_technical", "permanent_available",
179
+ # "permanent_unavailable", "permanent_maintenance_cleaning",
180
+ # "permanent_maintenance_technical", nil] the status to set the
181
+ # location to when someone checks out
182
+ attribute :checkout_alter_status
183
+
136
184
  # @!attribute checkout_location
137
185
  # @return [Location, nil] the location to move people to when they
138
186
  # are checked out
@@ -157,13 +205,28 @@ module LWS::Presence
157
205
  # @return [Array<Integer>] the IDs of the underlying locations of the location
158
206
  attribute :descendant_ids
159
207
 
208
+ # @!attribute image_storage_id
209
+ # @return [String, nil] the storage ID of the image of the location
210
+ attribute :image_storage_id
211
+
212
+ # @!attribute image_url
213
+ # @note
214
+ # To be able retrieve this, the token needs to be passed via +X-Token+
215
+ # in the HTTP request headers!
216
+ # @return [String, nil] the URL of the image of the location
217
+ attribute :image_url
218
+
219
+ # @!attribute journals
220
+ # @return [Array<Journal>] the journal (entries) associated with the location
221
+ has_many :journals, class: "LWS::Presence::Journal"
222
+
160
223
  # @!attribute lat
161
224
  # @return [Float] the latitude of the location
162
225
  attribute :lat
163
226
 
164
227
  # @!attribute logoff_time
165
- # The format of the time is +HH:MM+ and should be interpreted in the time zone
166
- # of the location (see also {#time_zone}).
228
+ # The format of the time is +HH:MM+ and should be interpreted in the time zone
229
+ # of the location (see also {#time_zone}).
167
230
  # @return [String] the time everybody is automatically logged off
168
231
  attribute :logoff_time
169
232
 
@@ -221,6 +284,13 @@ module LWS::Presence
221
284
  # @return [Array<Reader>] the (RFID/code/ID/...) readers linked to this location
222
285
  has_many :readers
223
286
 
287
+ # @!attribute status
288
+ # @return ["available", "unavailable", "maintenance_cleaning",
289
+ # "maintenance_technical", "permanent_available",
290
+ # "permanent_unavailable", "permanent_maintenance_cleaning",
291
+ # "permanent_maintenance_technical"] the status of the location
292
+ attribute :status
293
+
224
294
  # @!attribute time_zone
225
295
  # @return [String] the time zone of the location
226
296
  attribute :time_zone
@@ -238,6 +308,17 @@ module LWS::Presence
238
308
  use_api LWS::Presence.api
239
309
  uri "locations/:location_id/maps(/:id)"
240
310
 
311
+ # @!attribute image_storage_id
312
+ # @return [String, nil] the storage ID of the image of the map
313
+ attribute :image_storage_id
314
+
315
+ # @!attribute image_url
316
+ # @note
317
+ # To be able retrieve this, the token needs to be passed via +X-Token+
318
+ # in the HTTP request headers!
319
+ # @return [String, nil] the URL of the image of the map
320
+ attribute :image_url
321
+
241
322
  # @!attribute location
242
323
  # @return [Location] the location the map belongs to
243
324
  belongs_to :location
@@ -251,6 +332,9 @@ module LWS::Presence
251
332
  attribute :name
252
333
 
253
334
  # @!attribute picture_url
335
+ # @deprecated
336
+ # Unauthenticated retrieval of the picture will not longer be supported
337
+ # in upcoming releases of LWS. Use {#image_url} instead!
254
338
  # @return [String, nil] the URL of the picture of the map
255
339
  attribute :picture_url
256
340
 
@@ -359,6 +443,17 @@ module LWS::Presence
359
443
  # @return [Array<Appointment>] the appointments involving the person
360
444
  has_many :appointments
361
445
 
446
+ # @!attribute avatar_storage_id
447
+ # @return [String, nil] the storage ID of the avatar of the person
448
+ attribute :avatar_storage_id
449
+
450
+ # @!attribute avatar_url
451
+ # @note
452
+ # To be able retrieve this, the token needs to be passed via +X-Token+
453
+ # in the HTTP request headers!
454
+ # @return [String, nil] the URL of the avatar of the person
455
+ attribute :avatar_url
456
+
362
457
  # @!attribute company
363
458
  # @return [LWS::Auth::Company] the company the person belongs to
364
459
  belongs_to :company, class_name: "LWS::Auth::Company"
@@ -422,6 +517,14 @@ module LWS::Presence
422
517
  # @return [Integer] the ID of the location the person is located at
423
518
  attribute :location_id
424
519
 
520
+ # @!attribute location_status_change_permissions
521
+ # @return [Array<"available", "unavailable", "maintenance_cleaning",
522
+ # "maintenance_technical", "permanent_available",
523
+ # "permanent_unavailable", "permanent_maintenance_cleaning",
524
+ # "permanent_maintenance_technical">] the location statuses the person
525
+ # will clear to available on check-in
526
+ attribute :location_status_change_permissions
527
+
425
528
  # @!attribute long
426
529
  # @return [Float, nil] the exact longitude of the person's location
427
530
  attribute :long
@@ -457,6 +560,9 @@ module LWS::Presence
457
560
  attribute :phone_mobile
458
561
 
459
562
  # @!attribute picture_url
563
+ # @deprecated
564
+ # Unauthenticated retrieval of the picture will not longer be supported
565
+ # in upcoming releases of LWS. Use {#avatar_url} instead!
460
566
  # @return [String, nil] the URL of the picture of the person
461
567
  attribute :picture_url
462
568
 
@@ -512,4 +618,9 @@ module LWS::Presence
512
618
  attribute :node
513
619
  end
514
620
 
621
+ # (see Generic::Storage)
622
+ class Storage < LWS::Generic::Storage
623
+ use_api LWS::Presence.api
624
+ end
625
+
515
626
  end
@@ -107,11 +107,15 @@ module LWS
107
107
  # http_debug: true
108
108
  # json_debug: true
109
109
  #
110
+ # @param config_file [String] the path to the config file to load
111
+ # @param force_environment [Symbol, nil] the environment to enforce (if
112
+ # any)
110
113
  # @return [Boolean] whether the config file was used
111
- def load_config_file(config_file)
114
+ def load_config_file(config_file, force_environment = nil)
112
115
  return false unless File.exist? config_file
113
116
  config_data = YAML.load_file(config_file)
114
- environment = ENV["LC_LWS_ENV"] ||
117
+ environment = force_environment ||
118
+ ENV["LC_LWS_ENV"] ||
115
119
  config_data.dig("default", "environment") ||
116
120
  self.environment
117
121
  self.environment = environment.to_sym
@@ -122,20 +126,26 @@ module LWS
122
126
  raise "encountered an invalid config property \"#{key}\" " +
123
127
  "in config file #{config_file}!"
124
128
  end
129
+ configure(key, value)
130
+ end
131
+ true
132
+ end
133
+
134
+ private
125
135
 
126
- case key
127
- when "endpoints"
128
- if self.endpoints.empty?
129
- self.endpoints = value.inject({}) do |h, (k, v)|
130
- h[k.to_sym] = v
131
- h
132
- end
133
- end
134
- else
135
- self[key.to_sym] = value unless self[key.to_sym]
136
+ def configure(key, value)
137
+ case key
138
+ when "endpoints"
139
+ if self.endpoints.empty?
140
+ configure_endpoints(value)
136
141
  end
142
+ else
143
+ self[key.to_sym] ||= value
137
144
  end
138
- true
145
+ end
146
+
147
+ def configure_endpoints(endpoints)
148
+ self.endpoints = endpoints.transform_keys(&:to_sym)
139
149
  end
140
150
 
141
151
  end
@@ -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 = "7.0.2".freeze
16
+ VERSION = "7.1.3".freeze
17
17
 
18
18
  end
@@ -16,7 +16,7 @@ class TestCorporateWebsiteArticle < MiniTest::Test
16
16
  include LWS::CorporateWebsite
17
17
 
18
18
  def setup
19
- @page = Page.all.first
19
+ @page = Page.find(1)
20
20
  @article = @page.articles.first
21
21
  end
22
22
 
@@ -38,7 +38,7 @@ class TestCorporateWebsiteOfficeTime < MiniTest::Test
38
38
  include LWS::CorporateWebsite
39
39
 
40
40
  def setup
41
- @office_time = OfficeTime.all.first
41
+ @office_time = OfficeTime.find(1)
42
42
  end
43
43
 
44
44
  def test_valid
@@ -54,7 +54,7 @@ class TestCorporateWebsitePage < MiniTest::Test
54
54
  include LWS::CorporateWebsite
55
55
 
56
56
  def setup
57
- @page = Page.all.first
57
+ @page = Page.find(1)
58
58
  end
59
59
 
60
60
  def test_valid
@@ -75,7 +75,7 @@ end
75
75
  # include LWS::CorporateWebsite
76
76
  #
77
77
  # def setup
78
- # @social_page = SocialPage.all.first
78
+ # @social_page = SocialPage.find(1)
79
79
  # end
80
80
  #
81
81
  # def test_valid
@@ -96,7 +96,7 @@ class TestCorporateWebsiteSocialPost < MiniTest::Test
96
96
  include LWS::CorporateWebsite
97
97
 
98
98
  def setup
99
- @social_post = SocialPost.all.first
99
+ @social_post = SocialPost.find(1)
100
100
  end
101
101
 
102
102
  def test_valid
@@ -261,6 +261,7 @@ class TestDigitalSignageLayout < MiniTest::Test
261
261
  def test_valid_associations
262
262
  # FIXME: Missing endpoint in LWS
263
263
  #assert_instance_of(Layout::Category, @layout.categories.first)
264
+ assert_instance_of(LWS::Auth::Company, @layout.company_owner)
264
265
  # FIXME: Missing parent_id field in LWS
265
266
  #assert_instance_of(Layout, @layout.parent)
266
267
  # FIXME: Missing endpoint in LWS
@@ -530,64 +531,6 @@ class TestDigitalSignagePlayerConfigurationSetting < MiniTest::Test
530
531
 
531
532
  end
532
533
 
533
- class TestDigitalSignagePlayerFeedback < MiniTest::Test
534
-
535
- include LWS::DigitalSignage
536
-
537
- def setup
538
- @player = Player.find(1)
539
- # Player feedbacks only exist as child objects of players
540
- @player_feedback = @player.feedbacks.first
541
- end
542
-
543
- def test_valid
544
- refute_nil(@player_feedback)
545
- assert_instance_of(Player::Feedback, @player_feedback)
546
- refute_nil(@player_feedback.id)
547
- end
548
-
549
- def test_valid_associations
550
- assert_instance_of(Player, @player_feedback.player)
551
- assert_equal(@player, @player_feedback.player)
552
- # FIXME: Missing branch_id field in LWS
553
- #assert_instance_of(Player::Os::Branch::Release, @player_feedback.release)
554
- # FIXME: Chained associations don't work yet in Spyke (#89)
555
- #assert_instance_of(Player::Feedback::Result, @player_feedback.results.first)
556
- end
557
-
558
- end
559
-
560
- class TestDigitalSignagePlayerFeedbackResult < MiniTest::Test
561
-
562
- include LWS::DigitalSignage
563
-
564
- def setup
565
- @player = Player.find(1)
566
- # Player feedbacks only exist as decendant objects of players
567
- @player_feedback = @player.feedbacks.all.first
568
- # Player feedback results only exist as decendant objects of player
569
- # feedbacks
570
- # FIXME: Chained associations don't work yet in Spyke (#89)
571
- #@player_feedback_result = @player_feedback.results.first
572
- end
573
-
574
- # FIXME: Chained associations don't work yet in Spyke (#89)
575
- #def test_valid
576
- # refute_nil(@player_feedback_result)
577
- # assert_instance_of(Player::Feedback::Result, @player_feedback_result)
578
- # refute_nil(@player_feedback_result.id)
579
- #end
580
-
581
- # FIXME: Chained associations don't work yet in Spyke (#89)
582
- #def test_valid_associations
583
- # assert_instance_of(Player, @player_feedback_result.player)
584
- # assert_equal(@player, @player_feedback_result.player)
585
- # assert_instance_of(Player::Feedback, @player_feedback_result.feedback)
586
- # assert_equal(@player_feedback, @player_feedback_result.feedback)
587
- #end
588
-
589
- end
590
-
591
534
  class TestDigitalSignagePlayerLog < MiniTest::Test
592
535
 
593
536
  include LWS::DigitalSignage
@@ -930,9 +873,7 @@ class TestDigitalSignagePlayerRequest < MiniTest::Test
930
873
  assert_equal(@player, @player_request.player)
931
874
  # FIXME: Chained associations don't work yet in Spyke (#89)
932
875
  #if @player_request.processed
933
- # if @player_request.feedback.present?
934
- # assert_instance_of(Player::Feedback, @player_request.feedback)
935
- # elsif @player_request.log.present?
876
+ # if @player_request.log.present?
936
877
  # assert_instance_of(Player::Log, @player_request.log)
937
878
  # elsif @player_request.screenshot.present?
938
879
  # assert_instance_of(Player::Screenshot, @player_request.screenshot)
@@ -1010,6 +951,7 @@ class TestDigitalSignageSlide < MiniTest::Test
1010
951
  assert_instance_of(Channel::Group, @slide.channel_groups.first)
1011
952
  assert_instance_of(LWS::Auth::Company, @slide.company)
1012
953
  assert_instance_of(Layout, @slide.layout)
954
+ assert_instance_of(Slide::Schedule, @slide.schedules.first)
1013
955
  end
1014
956
 
1015
957
  end
@@ -1021,20 +963,17 @@ class TestDigitalSignageSlideSchedule < MiniTest::Test
1021
963
  def setup
1022
964
  @slide = Slide.find(1)
1023
965
  # Slide schedules only exist as decendant objects of players
1024
- # FIXME: Endpoint is missing in LWS
1025
966
  @slide_schedule = @slide.schedules.first
1026
967
  end
1027
968
 
1028
- # FIXME: Endpoint is missing in LWS
1029
- #def test_valid
1030
- # refute_nil(@slide_schedule)
1031
- # assert_instance_of(Slide::Schedule, @slide_schedule)
1032
- # refute_nil(@slide_schedule.id)
1033
- #end
969
+ def test_valid
970
+ refute_nil(@slide_schedule)
971
+ assert_instance_of(Slide::Schedule, @slide_schedule)
972
+ refute_nil(@slide_schedule.id)
973
+ end
1034
974
 
1035
- # FIXME: Endpoint is missing in LWS
1036
975
  #def test_valid_associations
1037
- # assert_instance_of(Slide, @slide_schedules.slides.first)
976
+ # assert_instance_of(Slide, @slide_schedule.slides.first)
1038
977
  #end
1039
978
 
1040
979
  end
@@ -17,7 +17,7 @@ class TestGenericModel < MiniTest::Test
17
17
  include LWS::Auth
18
18
 
19
19
  def setup
20
- @configuration = Configuration.all.first
20
+ @configuration = Configuration.find(1)
21
21
  end
22
22
 
23
23
  def test_her_compatibility
@@ -106,6 +106,20 @@ class TestGenericModel < MiniTest::Test
106
106
  end
107
107
  end
108
108
 
109
+ def test_deep_dup
110
+ company = LWS::Auth::Company.find(1)
111
+ company_dup = company.deep_dup
112
+
113
+ # The object itself
114
+ refute_equal(company.object_id, company_dup.object_id)
115
+ # An object as attribute value
116
+ refute_equal(company.address.object_id, company_dup.address.object_id)
117
+ # A related object
118
+ refute_equal(company.contact_person.object_id, company_dup.contact_person.object_id)
119
+ # An item in array of related objects
120
+ refute_equal(company.accounts.first.object_id, company_dup.accounts.first.object_id)
121
+ end
122
+
109
123
  end
110
124
 
111
125
  class TestGenericConfiguration < MiniTest::Test
@@ -114,7 +128,7 @@ class TestGenericConfiguration < MiniTest::Test
114
128
  include LWS::Auth
115
129
 
116
130
  def setup
117
- @configuration = Configuration.all.first
131
+ @configuration = Configuration.find(1)
118
132
  end
119
133
 
120
134
  def test_valid
@@ -128,15 +142,37 @@ end
128
142
  class TestGenericStorage < MiniTest::Test
129
143
 
130
144
  # Generic class needs to be accessed under some kind of app
131
- include LWS::Resource
145
+ include LWS::Presence
132
146
 
133
147
  def test_upload
134
148
  data = StringIO.new("some file contents\n")
149
+ refute_nil(Storage.upload(data, "test.txt", "text/plain"))
150
+
151
+ # Test the deprecated method (for now)
135
152
  refute_nil(Storage.create(data, "test.txt", "text/plain"))
136
153
 
137
154
  # Also test using the default HTTP adapter.
138
155
  reconfigure(http_persistent: false)
139
156
  data = StringIO.new("some more file contents\n")
140
- refute_nil(Storage.create(data, "test2.txt", "text/plain"))
157
+ refute_nil(Storage.upload(data, "test2.txt", "text/plain"))
158
+ end
159
+
160
+ def test_download
161
+ location = Location.find(1)
162
+ refute_nil(location.image_url)
163
+
164
+ data = Storage.download(location.image_url)
165
+ assert(data.size > 0)
166
+
167
+ assert_nil(Storage.download(nil))
168
+
169
+ assert_raises(ArgumentError) do
170
+ Storage.download("https://doesnot.exist.tld/some/file")
171
+ end
172
+
173
+ # Also test using the default HTTP adapter.
174
+ reconfigure(http_persistent: false)
175
+ data = Storage.download(location.image_url)
176
+ assert(data.size > 0)
141
177
  end
142
178
  end
@@ -16,7 +16,7 @@ class TestMapsMap < MiniTest::Test
16
16
  include LWS::Maps
17
17
 
18
18
  def setup
19
- @map = Map.all.first
19
+ @map = Map.find(1)
20
20
  end
21
21
 
22
22
  def test_valid_map
@@ -37,7 +37,7 @@ class TestMapsMarker < MiniTest::Test
37
37
  include LWS::Maps
38
38
 
39
39
  def setup
40
- @map = Map.all.first
40
+ @map = Map.find(1)
41
41
  # Markers only exist as child objects of maps
42
42
  @marker = @map.markers.first
43
43
  end
@@ -60,7 +60,7 @@ class TestMapsSource < MiniTest::Test
60
60
  include LWS::Maps
61
61
 
62
62
  def setup
63
- @source = Source.all.first
63
+ @source = Source.find(1)
64
64
  end
65
65
 
66
66
  def test_valid_source
@@ -35,6 +35,29 @@ class TestPresenceAppointment < MiniTest::Test
35
35
 
36
36
  end
37
37
 
38
+ class TestPresenceJournal < MiniTest::Test
39
+ include LWS::Presence
40
+
41
+ def setup
42
+ @location = Location.find(1)
43
+ # Journals only exist as child objects of a location
44
+ @journal = @location.journals.first
45
+ end
46
+
47
+ def test_valid
48
+ refute_nil(@journal)
49
+ assert_instance_of(Journal, @journal)
50
+ refute_nil(@journal.id)
51
+ end
52
+
53
+ def test_valid_associations
54
+ assert_instance_of(LWS::Auth::Company, @journal.company)
55
+ assert_instance_of(Location, @journal.location)
56
+ assert_equal(@location, @journal.location)
57
+ assert_instance_of(Person, @journal.person)
58
+ end
59
+ end
60
+
38
61
  class TestPresenceLocation < MiniTest::Test
39
62
 
40
63
  include LWS::Presence
@@ -165,7 +188,7 @@ class TestPresenceReader < MiniTest::Test
165
188
  include LWS::Presence
166
189
 
167
190
  def setup
168
- @reader = Reader.all.first
191
+ @reader = Reader.find(1)
169
192
  end
170
193
 
171
194
  def test_valid
@@ -25,7 +25,7 @@ class TestResourceCollection < MiniTest::Test
25
25
  include LWS::Resource
26
26
 
27
27
  def setup
28
- @collection = Collection.all.first # FIXME
28
+ @collection = Collection.find(1)
29
29
  end
30
30
 
31
31
  def test_valid
@@ -48,7 +48,7 @@ class TestResourceCollectionItem < MiniTest::Test
48
48
  include LWS::Resource
49
49
 
50
50
  def setup
51
- @collection = Collection.where(includes: "items").first # FIXME
51
+ @collection = Collection.where(includes: "items").find(1)
52
52
  @collection_item = @collection.items.first
53
53
  end
54
54
 
@@ -70,7 +70,7 @@ class TestResourceFolder < MiniTest::Test
70
70
  include LWS::Resource
71
71
 
72
72
  def setup
73
- @folder = Folder.all.first
73
+ @folder = Folder.find(1)
74
74
  end
75
75
 
76
76
  def test_valid
@@ -71,7 +71,6 @@ class TestSetup < MiniTest::Test
71
71
 
72
72
  def test_load_config_files
73
73
  orig_config = LWS.config.dup
74
-
75
74
  reconfigure do |config|
76
75
  assert config.load_config_file(File.join(@test_config_dir, "empty.yml"))
77
76
  end
@@ -113,6 +112,20 @@ class TestSetup < MiniTest::Test
113
112
  assert_equal(true, LWS.config.http_debug)
114
113
  assert_equal(true, LWS.config.http_debug_headers)
115
114
  assert_equal(true, LWS.config.json_debug)
115
+
116
+ with_env("LC_LWS_ENV" => "production") do
117
+ reconfigure do |config|
118
+ assert config.load_config_file(File.join(@test_config_dir, "empty.yml"),
119
+ :development)
120
+ end
121
+ assert_equal(:development, LWS.config.environment)
122
+ end
123
+
124
+ reconfigure do |config|
125
+ assert config.load_config_file(File.join(@test_config_dir, "switch_env.yml"),
126
+ :development)
127
+ end
128
+ assert_equal(:development, LWS.config.environment)
116
129
  end
117
130
 
118
131
  end
@@ -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 = 97
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
@@ -49,14 +49,18 @@ raise "Test token not set" if ENV["LC_LWS_TEST_TOKEN"].blank?
49
49
 
50
50
  def reconfigure(options = {}, &block)
51
51
  LWS.setup do |config|
52
- config.api_token = ENV["LC_LWS_TEST_TOKEN"]
52
+ if ENV["LC_LWS_API_TOKEN"].blank?
53
+ config.api_token = ENV["LC_LWS_TEST_TOKEN"]
54
+ end
53
55
  if ENV["LC_LWS_TEST_DEBUG"].present?
54
56
  config.logger = Logger.new($stdout)
55
57
  config.http_debug = true
56
58
  config.http_debug_headers = false
57
59
  config.json_debug = true
58
60
  end
59
- config.environment = :development
61
+ if ENV["LC_LWS_ENV"].blank?
62
+ config.environment = :development
63
+ end
60
64
 
61
65
  # Override the config with the given options.
62
66
  options.each do |key, value|
@@ -40,7 +40,7 @@ class TestTicketGroup < MiniTest::Test
40
40
  include LWS::Ticket
41
41
 
42
42
  def setup
43
- @group = Group.all.first
43
+ @group = Group.find(1)
44
44
  end
45
45
 
46
46
  def test_valid
@@ -88,7 +88,7 @@ class TestTicketTag < MiniTest::Test
88
88
  include LWS::Ticket
89
89
 
90
90
  def setup
91
- @tag = Tag.all.first
91
+ @tag = Tag.find(1)
92
92
  end
93
93
 
94
94
  def test_valid_tag
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.2
4
+ version: 7.1.3
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-19 00:00:00.000000000 Z
11
+ date: 2020-09-03 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/fixtures/auth.yml
299
+ - test/presence_test.rb
300
300
  - test/fixtures/permissions.yml
301
- - test/json_parser_test.rb
302
- - test/test_helper.rb
303
- - test/setup_test.rb
304
- - test/auth_test.rb
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/api_token_middleware_test.rb
308
- - test/config/full.yml
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/endpoints.yml
314
- - test/maps_test.rb
315
- - test/logger_test.rb
316
- - test/ticket_test.rb
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