openhab-jrubyscripting 5.0.0.rc11 → 5.0.0.rc12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/openhab/core/actions/exec.rb +41 -41
- data/lib/openhab/core/items/date_time_item.rb +3 -2
- data/lib/openhab/core/items/generic_item.rb +90 -0
- data/lib/openhab/core/items/item.rb +9 -8
- data/lib/openhab/core/items/metadata/hash.rb +1 -1
- data/lib/openhab/core/items/metadata/namespace_hash.rb +10 -2
- data/lib/openhab/core/items/metadata/provider.rb +2 -2
- data/lib/openhab/core/items/persistence.rb +48 -4
- data/lib/openhab/core/items/registry.rb +10 -1
- data/lib/openhab/core/items/state_storage.rb +2 -2
- data/lib/openhab/core/proxy.rb +5 -0
- data/lib/openhab/core/registry.rb +12 -2
- data/lib/openhab/core/rules.rb +1 -1
- data/lib/openhab/core/things/links/provider.rb +38 -0
- data/lib/openhab/core/things/registry.rb +4 -0
- data/lib/openhab/core/timer.rb +3 -19
- data/lib/openhab/core/types/date_time_type.rb +1 -1
- data/lib/openhab/core.rb +3 -3
- data/lib/openhab/core_ext/java/duration.rb +2 -0
- data/lib/openhab/core_ext/java/local_date.rb +15 -7
- data/lib/openhab/core_ext/java/local_time.rb +13 -3
- data/lib/openhab/core_ext/java/month.rb +1 -1
- data/lib/openhab/core_ext/java/month_day.rb +13 -3
- data/lib/openhab/core_ext/java/period.rb +1 -1
- data/lib/openhab/core_ext/java/temporal_amount.rb +1 -1
- data/lib/openhab/core_ext/java/time.rb +5 -1
- data/lib/openhab/core_ext/java/zoned_date_time.rb +15 -2
- data/lib/openhab/core_ext/ruby/date.rb +2 -2
- data/lib/openhab/core_ext/ruby/numeric.rb +6 -1
- data/lib/openhab/dsl/items/builder.rb +25 -12
- data/lib/openhab/dsl/rules/automation_rule.rb +2 -23
- data/lib/openhab/dsl/rules/builder.rb +47 -2
- data/lib/openhab/dsl/version.rb +1 -1
- data/lib/openhab/dsl.rb +27 -11
- data/lib/openhab/rspec/helpers.rb +3 -2
- data/lib/openhab/rspec/hooks.rb +1 -0
- data/lib/openhab/rspec/mocks/timer.rb +33 -0
- data/lib/openhab/rspec.rb +9 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 38b109c413cbb8b06c2c43e57ad12e6278139b1cf56d887289ada297c8991272
|
4
|
+
data.tar.gz: 24e6235ce553d4e2ec9447c94407054b9c1c075c6a190a3ce5ed5ebb2421753c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a3e0f9f2f58d906ff72f5923817a2b5651a96f4710bbd29ad6ecffc3991722db5f8b1702de90e05ef1854ffe49c3d4214a699f271aaf0ac26a2dd03ad20c71f5
|
7
|
+
data.tar.gz: a51e80b23b82e7c38db1ac8d263b0a2776a70ad7fe9f401b1ae035f26a06d3660534e4c64c4d1c88a06fb9ee47ef64422b02bdfd26446e8edb148461c1403eca
|
@@ -4,47 +4,47 @@ module OpenHAB
|
|
4
4
|
module Core
|
5
5
|
module Actions
|
6
6
|
# @see https://www.openhab.org/docs/configuration/actions.html#exec-actions Exec Actions
|
7
|
-
class Exec
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
7
|
+
class Exec # rubocop:disable Lint/EmptyClass
|
8
|
+
# @!scope class
|
9
|
+
|
10
|
+
# @!method execute_command_line
|
11
|
+
#
|
12
|
+
# @return [void]
|
13
|
+
#
|
14
|
+
# @overload execute_command_line(command_line)
|
15
|
+
#
|
16
|
+
# Executes a command on the command line without waiting for the
|
17
|
+
# command to complete.
|
18
|
+
#
|
19
|
+
# @param [String] command_line
|
20
|
+
# @return [void]
|
21
|
+
#
|
22
|
+
# @example Execute an external command
|
23
|
+
# rule 'Run a command' do
|
24
|
+
# every :day
|
25
|
+
# run do
|
26
|
+
# Exec.execute_command_line('/bin/true')
|
27
|
+
# end
|
28
|
+
# end
|
29
|
+
#
|
30
|
+
# @overload execute_command_line(timeout, command_line)
|
31
|
+
#
|
32
|
+
# Executes a command on the command and waits timeout seconds for
|
33
|
+
# the command to complete, returning the output from the command
|
34
|
+
# as a String.
|
35
|
+
#
|
36
|
+
# @param [Duration] timeout
|
37
|
+
# @param [String] command_line
|
38
|
+
# @return [String]
|
39
|
+
#
|
40
|
+
# @example Execute an external command and process its results
|
41
|
+
# rule 'Run a command' do
|
42
|
+
# every :day
|
43
|
+
# run do
|
44
|
+
# TodaysHoliday_String.update(Exec.execute_command_line(5.seconds, '/home/cody/determine_holiday.rb')
|
45
|
+
# end
|
46
|
+
# end
|
47
|
+
#
|
48
48
|
end
|
49
49
|
end
|
50
50
|
end
|
@@ -45,9 +45,10 @@ module OpenHAB
|
|
45
45
|
# Time types need formatted as ISO8601
|
46
46
|
# @!visibility private
|
47
47
|
def format_type(command)
|
48
|
-
return
|
48
|
+
return command if command.is_a?(Types::DateTimeType)
|
49
|
+
return Types::DateTimeType.new(command.to_zoned_date_time) if command.respond_to?(:to_zoned_date_time)
|
50
|
+
return Types::DateTimeType.new(DSL.try_parse_time_like(command.to_str)) if command.respond_to?(:to_str)
|
49
51
|
|
50
|
-
command = command.iso8601 if command.respond_to?(:iso8601)
|
51
52
|
super
|
52
53
|
end
|
53
54
|
end
|
@@ -163,9 +163,99 @@ module OpenHAB
|
|
163
163
|
# make sure to use Type, because this method is used for both
|
164
164
|
# #update and #command
|
165
165
|
return type if type.is_a?(Types::Type)
|
166
|
+
return NULL if type.nil?
|
166
167
|
|
167
168
|
type.to_s
|
168
169
|
end
|
170
|
+
|
171
|
+
#
|
172
|
+
# Defers notifying openHAB of modifications to multiple attributes until the block is complete.
|
173
|
+
#
|
174
|
+
# @param [true, false] force When true, allow modifications to file-based items.
|
175
|
+
# Normally a FrozenError is raised when attempting to modify file-based items, since
|
176
|
+
# they will then be out-of-sync with the definition on disk. Advanced users may do this
|
177
|
+
# knowingly and intentionally though, so an escape hatch is provided to allow runtime
|
178
|
+
# modifications.
|
179
|
+
# @yield
|
180
|
+
# @return [Object] the block's return value
|
181
|
+
#
|
182
|
+
# @example Modify label and tags for an item
|
183
|
+
# MySwitch.modify do
|
184
|
+
# MySwitch.label = "New Label"
|
185
|
+
# MySwitch.tags = :labeled
|
186
|
+
# end
|
187
|
+
#
|
188
|
+
def modify(force: false)
|
189
|
+
raise ArgumentError, "you must pass a block to modify" unless block_given?
|
190
|
+
return yield if instance_variable_defined?(:@modifying) && @modifying
|
191
|
+
|
192
|
+
begin
|
193
|
+
provider = self.provider
|
194
|
+
if provider && !provider.is_a?(org.openhab.core.common.registry.ManagedProvider)
|
195
|
+
raise FrozenError, "Cannot modify item #{name} from provider #{provider.inspect}." unless force
|
196
|
+
|
197
|
+
provider = nil
|
198
|
+
logger.debug("Forcing modifications to non-managed item #{name}")
|
199
|
+
end
|
200
|
+
@modified = false
|
201
|
+
@modifying = true
|
202
|
+
|
203
|
+
r = yield
|
204
|
+
|
205
|
+
provider&.update(self) if @modified
|
206
|
+
r
|
207
|
+
ensure
|
208
|
+
@modifying = false
|
209
|
+
end
|
210
|
+
end
|
211
|
+
|
212
|
+
# @!attribute [rw] label
|
213
|
+
# The item's descriptive label.
|
214
|
+
# @return [String]
|
215
|
+
def label=(value)
|
216
|
+
modify do
|
217
|
+
next if label == value
|
218
|
+
|
219
|
+
@modified = true
|
220
|
+
set_label(value)
|
221
|
+
end
|
222
|
+
end
|
223
|
+
|
224
|
+
# @!attribute [rw] category
|
225
|
+
# The item's category.
|
226
|
+
# @return [String]
|
227
|
+
def category=(value)
|
228
|
+
modify do
|
229
|
+
value = value&.to_s
|
230
|
+
next if category == value
|
231
|
+
|
232
|
+
@modified = true
|
233
|
+
set_category(value)
|
234
|
+
end
|
235
|
+
end
|
236
|
+
|
237
|
+
# @!attribute [rw] tags
|
238
|
+
# The item's tags
|
239
|
+
# @return [Array<String>]
|
240
|
+
# @overload tags
|
241
|
+
# Returns the item's tags.
|
242
|
+
# @return [Array<String>]
|
243
|
+
# @overload tags=(values)
|
244
|
+
# Sets the item's tags.
|
245
|
+
#
|
246
|
+
# To remove all tags, assign an empty array or nil.
|
247
|
+
# @param [Array<String,Symbol,Semantics::Tag>] values Tags to set.
|
248
|
+
# @return [void]
|
249
|
+
def tags=(values)
|
250
|
+
modify do
|
251
|
+
values = DSL::Items::ItemBuilder.normalize_tags(*values)
|
252
|
+
next if values.to_set == tags.to_set
|
253
|
+
|
254
|
+
@modified = true
|
255
|
+
remove_all_tags
|
256
|
+
add_tags(values)
|
257
|
+
end
|
258
|
+
end
|
169
259
|
end
|
170
260
|
end
|
171
261
|
end
|
@@ -24,10 +24,6 @@ module OpenHAB
|
|
24
24
|
# The item's name.
|
25
25
|
# @return [String]
|
26
26
|
|
27
|
-
# @!attribute [r] label
|
28
|
-
# The item's descriptive label.
|
29
|
-
# @return [String, nil]
|
30
|
-
|
31
27
|
# @!attribute [r] accepted_command_types
|
32
28
|
# @return [Array<Class>] An array of {Command}s that can be sent as commands to this item
|
33
29
|
|
@@ -35,7 +31,7 @@ module OpenHAB
|
|
35
31
|
# @return [Array<Class>] An array of {State}s that can be sent as commands to this item
|
36
32
|
|
37
33
|
#
|
38
|
-
# The item's {#label} if one is defined, otherwise
|
34
|
+
# The item's {GenericItem#label label} if one is defined, otherwise its {#name}.
|
39
35
|
#
|
40
36
|
# @return [String]
|
41
37
|
#
|
@@ -46,7 +42,7 @@ module OpenHAB
|
|
46
42
|
#
|
47
43
|
# @!attribute [r] groups
|
48
44
|
#
|
49
|
-
#
|
45
|
+
# Returns all groups that this item is part of
|
50
46
|
#
|
51
47
|
# @return [Array<Group>] All groups that this item is part of
|
52
48
|
#
|
@@ -81,7 +77,7 @@ module OpenHAB
|
|
81
77
|
# @example Access namespace1's configuration
|
82
78
|
# Item1.metadata["namespace1"]["config1"]
|
83
79
|
#
|
84
|
-
# @example Safely search for the specified value - no errors are raised, only nil returned if a key in the chain doesn
|
80
|
+
# @example Safely search for the specified value - no errors are raised, only nil returned if a key in the chain doesn't exist
|
85
81
|
# Item1.metadata.dig("namespace1", "config1") # => "foo"
|
86
82
|
# Item1.metadata.dig("namespace2", "config1") # => nil
|
87
83
|
#
|
@@ -189,7 +185,7 @@ module OpenHAB
|
|
189
185
|
#
|
190
186
|
# @return [Array<Thing>] An array of things or an empty array
|
191
187
|
def things
|
192
|
-
registry =
|
188
|
+
registry = Things::Links::Provider.registry
|
193
189
|
channels = registry.get_bound_channels(name).to_a
|
194
190
|
channels.map(&:thing_uid).uniq.map { |tuid| EntityLookup.lookup_thing(tuid) }.compact
|
195
191
|
end
|
@@ -206,6 +202,11 @@ module OpenHAB
|
|
206
202
|
"#{s}>"
|
207
203
|
end
|
208
204
|
|
205
|
+
# @return [org.openhab.core.common.registry.Provider]
|
206
|
+
def provider
|
207
|
+
Provider.registry.provider_for(self)
|
208
|
+
end
|
209
|
+
|
209
210
|
private
|
210
211
|
|
211
212
|
# Allows sub-classes to append additional details to the type in an inspect string
|
@@ -384,7 +384,7 @@ module OpenHAB
|
|
384
384
|
alias_method :to_s, :inspect
|
385
385
|
|
386
386
|
#
|
387
|
-
# @raise [
|
387
|
+
# @raise [FrozenError] if the provider is not a
|
388
388
|
# {org.openhab.core.common.registry.ManagedProvider ManagedProvider} that can be updated.
|
389
389
|
# @return [org.openhab.core.common.registry.ManagedProvider]
|
390
390
|
#
|
@@ -218,8 +218,12 @@ module OpenHAB
|
|
218
218
|
return @hash.each_key(&block) unless attached?
|
219
219
|
return to_enum(:each_key) unless block
|
220
220
|
|
221
|
-
Provider.registry.
|
222
|
-
|
221
|
+
if Provider.registry.respond_to?(:get_all_namespaces)
|
222
|
+
keys.each(&block)
|
223
|
+
else
|
224
|
+
Provider.registry.all.each do |meta|
|
225
|
+
yield meta.uid.namespace if meta.uid.item_name == @item_name
|
226
|
+
end
|
223
227
|
end
|
224
228
|
self
|
225
229
|
end
|
@@ -313,6 +317,10 @@ module OpenHAB
|
|
313
317
|
|
314
318
|
# @!visibility private
|
315
319
|
def keys
|
320
|
+
if Provider.registry.respond_to?(:get_all_namespaces)
|
321
|
+
return Provider.registry.get_all_namespaces(@item_name).to_a
|
322
|
+
end
|
323
|
+
|
316
324
|
each_key.to_a
|
317
325
|
end
|
318
326
|
|
@@ -32,8 +32,8 @@ module OpenHAB
|
|
32
32
|
# @return [void]
|
33
33
|
#
|
34
34
|
def remove_item_metadata(item_name)
|
35
|
-
@elements.delete_if do |
|
36
|
-
next unless
|
35
|
+
@elements.delete_if do |_k, v|
|
36
|
+
next unless v.uid.item_name == item_name
|
37
37
|
|
38
38
|
notify_listeners_about_removed_element(v)
|
39
39
|
true
|
@@ -77,7 +77,6 @@ module OpenHAB
|
|
77
77
|
%i[changed_since?
|
78
78
|
count_since
|
79
79
|
count_state_changes_since
|
80
|
-
evolution_rate
|
81
80
|
historic_state
|
82
81
|
maximum_since
|
83
82
|
minimum_since
|
@@ -183,11 +182,22 @@ module OpenHAB
|
|
183
182
|
# @return [true,false] True if the item's state changed between `start` and `finish`, False otherwise.
|
184
183
|
|
185
184
|
# @!method evolution_rate(timestamp, service = nil)
|
186
|
-
# Returns the evolution rate of the item's state
|
187
|
-
# @param [#to_zoned_date_time] timestamp The point in time from which to search
|
188
|
-
# @param [Symbol, String] service An optional persistence id instead of the default persistence service.
|
185
|
+
# Returns the evolution rate of the item's state
|
189
186
|
# @return [DecimalType, QuantityType, nil] The evolution rate since `timestamp`,
|
190
187
|
# or nil if no previous state could be found.
|
188
|
+
# @overload evolution_rate(timestamp, service = nil)
|
189
|
+
# Returns the evolution rate of the item's state since the given time
|
190
|
+
# @param [#to_zoned_date_time] timestamp The point in time from which to search
|
191
|
+
# @param [Symbol, String] service An optional persistence id instead of the default persistence service.
|
192
|
+
# @return [DecimalType, QuantityType, nil] The evolution rate since `timestamp`,
|
193
|
+
# or nil if no previous state could be found.
|
194
|
+
# @overload evolution_rate(start, finish, service = nil)
|
195
|
+
# Returns the evolution rate of the item's state between two points in time
|
196
|
+
# @param [#to_zoned_date_time] start The point in time from which to search
|
197
|
+
# @param [#to_zoned_date_time] finish The point in time to which to search
|
198
|
+
# @param [Symbol, String] service An optional persistence id instead of the default persistence service.
|
199
|
+
# @return [DecimalType, QuantityType, nil] The evolution rate between `start` and `finish`,
|
200
|
+
# or nil if no previous state could be found.
|
191
201
|
|
192
202
|
# @!method historic_state(timestamp, service = nil)
|
193
203
|
# Returns the the item's state at the given time
|
@@ -317,6 +327,40 @@ module OpenHAB
|
|
317
327
|
end
|
318
328
|
end
|
319
329
|
|
330
|
+
# evolution_rate's "between" method is overloaded with the same name
|
331
|
+
method = :evolution_rate
|
332
|
+
define_method(method) do |start, finish_or_service = nil, service = nil|
|
333
|
+
if service.nil?
|
334
|
+
if finish_or_service.respond_to?(:to_zoned_date_time)
|
335
|
+
service = persistence_service
|
336
|
+
finish = finish_or_service
|
337
|
+
else
|
338
|
+
service = finish_or_service || persistence_service
|
339
|
+
finish = nil
|
340
|
+
end
|
341
|
+
else
|
342
|
+
finish = finish_or_service
|
343
|
+
end
|
344
|
+
|
345
|
+
result = if finish
|
346
|
+
Actions::PersistenceExtensions.public_send(
|
347
|
+
method,
|
348
|
+
self,
|
349
|
+
start.to_zoned_date_time,
|
350
|
+
finish.to_zoned_date_time,
|
351
|
+
service&.to_s
|
352
|
+
)
|
353
|
+
else
|
354
|
+
Actions::PersistenceExtensions.public_send(
|
355
|
+
method,
|
356
|
+
self,
|
357
|
+
start.to_zoned_date_time,
|
358
|
+
service&.to_s
|
359
|
+
)
|
360
|
+
end
|
361
|
+
wrap_result(result, method)
|
362
|
+
end
|
363
|
+
|
320
364
|
alias_method :state_changes_since, :count_state_changes_since
|
321
365
|
alias_method :state_changes_between, :count_state_changes_between
|
322
366
|
|
@@ -59,16 +59,25 @@ module OpenHAB
|
|
59
59
|
#
|
60
60
|
# The item must be a managed item (typically created by Ruby or in the UI).
|
61
61
|
#
|
62
|
+
# Any associated metadata or channel links are also removed.
|
63
|
+
#
|
62
64
|
# @param [String, Item] item_name
|
63
65
|
# @param recursive [true, false] Remove the item's members if it's a group
|
64
66
|
# @return [Item, nil] The removed item, if found.
|
65
67
|
def remove(item_name, recursive: false)
|
66
68
|
item_name = item_name.name if item_name.is_a?(Item)
|
67
69
|
provider = Provider.registry.provider_for(item_name)
|
68
|
-
unless provider.is_a?(
|
70
|
+
unless provider.is_a?(ManagedProvider)
|
69
71
|
raise "Cannot remove item #{item_name} from non-managed provider #{provider.inspect}"
|
70
72
|
end
|
71
73
|
|
74
|
+
Metadata::Provider.registry.providers.grep(ManagedProvider).each do |managed_provider|
|
75
|
+
managed_provider.remove_item_metadata(item_name)
|
76
|
+
end
|
77
|
+
|
78
|
+
Things::Links::Provider.registry.providers.grep(ManagedProvider).each do |managed_provider|
|
79
|
+
managed_provider.remove_links_for_item(item_name)
|
80
|
+
end
|
72
81
|
provider.remove(item_name, recursive)
|
73
82
|
end
|
74
83
|
end
|
@@ -12,13 +12,13 @@ module OpenHAB
|
|
12
12
|
#
|
13
13
|
# Create a StateStorage object that stores the states of the given items
|
14
14
|
#
|
15
|
-
# @param [
|
15
|
+
# @param [Item] items A list of items
|
16
16
|
#
|
17
17
|
# @return [StateStorage] A state storage object
|
18
18
|
#
|
19
19
|
# @!visibility private
|
20
20
|
def self.from_items(*items)
|
21
|
-
StateStorage.new($events.store_states(*items).to_h)
|
21
|
+
StateStorage.new($events.store_states(*items.map(&:to_java)).to_h)
|
22
22
|
end
|
23
23
|
|
24
24
|
#
|
data/lib/openhab/core/proxy.rb
CHANGED
@@ -120,6 +120,11 @@ module OpenHAB
|
|
120
120
|
# define a sub-class of EventSubscriber as a child class of the including class
|
121
121
|
klass.const_set(:EventSubscriber, Class.new(EventSubscriber))
|
122
122
|
end
|
123
|
+
|
124
|
+
# @!visibility private
|
125
|
+
def to_java
|
126
|
+
__getobj__
|
127
|
+
end
|
123
128
|
end
|
124
129
|
end
|
125
130
|
end
|
@@ -4,7 +4,7 @@ module OpenHAB
|
|
4
4
|
module Core
|
5
5
|
Registry = org.openhab.core.common.registry.AbstractRegistry
|
6
6
|
|
7
|
-
Registry.field_reader :elementToProvider, :elementReadLock, :identifierToElement
|
7
|
+
Registry.field_reader :elementToProvider, :elementReadLock, :identifierToElement, :providerToElements
|
8
8
|
|
9
9
|
# @abstract
|
10
10
|
#
|
@@ -19,12 +19,22 @@ module OpenHAB
|
|
19
19
|
#
|
20
20
|
def provider_for(key)
|
21
21
|
elementReadLock.lock
|
22
|
-
|
22
|
+
if key.is_a?(org.openhab.core.common.registry.Identifiable)
|
23
|
+
element = key
|
24
|
+
else
|
25
|
+
return nil unless (element = identifierToElement[key])
|
26
|
+
end
|
23
27
|
|
24
28
|
elementToProvider[element]
|
25
29
|
ensure
|
26
30
|
elementReadLock.unlock
|
27
31
|
end
|
32
|
+
|
33
|
+
# @!attribute [r] providers
|
34
|
+
# @return [Enumerable<org.openhab.core.common.registry.Provider>]
|
35
|
+
def providers
|
36
|
+
providerToElements.keys
|
37
|
+
end
|
28
38
|
end
|
29
39
|
end
|
30
40
|
end
|
data/lib/openhab/core/rules.rb
CHANGED
@@ -33,6 +33,44 @@ module OpenHAB
|
|
33
33
|
current.add(link)
|
34
34
|
end
|
35
35
|
end
|
36
|
+
|
37
|
+
#
|
38
|
+
# Removes all links to a given item.
|
39
|
+
#
|
40
|
+
# @param [String] item_name
|
41
|
+
# @return [Integer] how many links were removed
|
42
|
+
#
|
43
|
+
def remove_links_for_item(item_name)
|
44
|
+
count = 0
|
45
|
+
@elements.delete_if do |_k, v|
|
46
|
+
next unless v.item_name == item_name
|
47
|
+
|
48
|
+
count += 1
|
49
|
+
notify_listeners_about_removed_element(v)
|
50
|
+
true
|
51
|
+
end
|
52
|
+
count
|
53
|
+
end
|
54
|
+
alias_method :removeLinksForItem, :remove_links_for_item
|
55
|
+
|
56
|
+
#
|
57
|
+
# Removes all links to a given thing.
|
58
|
+
#
|
59
|
+
# @param [ThingUID] thing_uid
|
60
|
+
# @return [Integer] how many links were removed
|
61
|
+
#
|
62
|
+
def remove_links_for_thing(thing_uid)
|
63
|
+
count = 0
|
64
|
+
@elements.delete_if do |_k, v|
|
65
|
+
next unless v.linked_uid.thing_uid == thing_uid
|
66
|
+
|
67
|
+
count += 1
|
68
|
+
notify_listeners_about_removed_element(v)
|
69
|
+
true
|
70
|
+
end
|
71
|
+
count
|
72
|
+
end
|
73
|
+
alias_method :removeLinksForThing, :remove_links_for_thing
|
36
74
|
end
|
37
75
|
end
|
38
76
|
end
|
@@ -61,6 +61,10 @@ module OpenHAB
|
|
61
61
|
raise "Cannot remove thing #{thing_uid} from non-managed provider #{provider.inspect}"
|
62
62
|
end
|
63
63
|
|
64
|
+
Links::Provider.registry.providers.grep(ManagedProvider).each do |managed_provider|
|
65
|
+
managed_provider.remove_links_for_thing(thing_uid)
|
66
|
+
end
|
67
|
+
|
64
68
|
provider.remove(thing_uid)
|
65
69
|
end
|
66
70
|
end
|
data/lib/openhab/core/timer.rb
CHANGED
@@ -28,7 +28,7 @@ module OpenHAB
|
|
28
28
|
# @return [true,false]
|
29
29
|
|
30
30
|
def_delegator :@timer, :has_terminated, :terminated?
|
31
|
-
def_delegators :@timer, :active?, :cancelled?, :running
|
31
|
+
def_delegators :@timer, :active?, :cancelled?, :running?, :execution_time
|
32
32
|
|
33
33
|
# @return [Object, nil]
|
34
34
|
attr_accessor :id
|
@@ -49,19 +49,7 @@ module OpenHAB
|
|
49
49
|
@id = id
|
50
50
|
@thread_locals = thread_locals
|
51
51
|
@block = block
|
52
|
-
@timer =
|
53
|
-
ScriptExecution.create_timer(1.minute.from_now) { execute }
|
54
|
-
else # DEPRECATED: openHAB 3.4.0
|
55
|
-
org.openhab.core.model.script.actions.ScriptExecution.create_timer(
|
56
|
-
# create it far enough in the future so it won't execute until we finish setting it up
|
57
|
-
1.minute.from_now,
|
58
|
-
# when running in rspec, it may have troubles finding this class
|
59
|
-
# for auto-conversion of block to interface, so use .impl
|
60
|
-
org.eclipse.xtext.xbase.lib.Procedures::Procedure0.impl { execute }
|
61
|
-
)
|
62
|
-
end
|
63
|
-
# DEPRECATED: openHAB 3.4.0.M6
|
64
|
-
@timer.class.field_reader :future unless @timer.respond_to?(:future)
|
52
|
+
@timer = ScriptExecution.create_timer(1.minute.from_now) { execute }
|
65
53
|
reschedule(@time)
|
66
54
|
end
|
67
55
|
|
@@ -79,11 +67,7 @@ module OpenHAB
|
|
79
67
|
alias_method :to_s, :inspect
|
80
68
|
|
81
69
|
# @!attribute [r] execution_time
|
82
|
-
#
|
83
|
-
def execution_time
|
84
|
-
# DEPRECATED: openHAB 3.4.0.M6 (just remove the entire method)
|
85
|
-
@timer.future.scheduled_time
|
86
|
-
end
|
70
|
+
# @return [ZonedDateTime, nil] the scheduled execution time, or `nil` if the timer was cancelled
|
87
71
|
|
88
72
|
#
|
89
73
|
# Reschedule timer
|
@@ -46,7 +46,7 @@ module OpenHAB
|
|
46
46
|
rescue java.lang.StringIndexOutOfBoundsException, java.lang.IllegalArgumentException => e
|
47
47
|
# Try Ruby's Time.parse if DateTimeType parser fails
|
48
48
|
begin
|
49
|
-
::Time.parse(time_string).to_zoned_date_time
|
49
|
+
DateTimeType.new(::Time.parse(time_string).to_zoned_date_time)
|
50
50
|
rescue ArgumentError
|
51
51
|
raise ArgumentError, e.message
|
52
52
|
end
|
data/lib/openhab/core.rb
CHANGED
@@ -3,12 +3,12 @@
|
|
3
3
|
module OpenHAB
|
4
4
|
# Contains classes and modules that wrap actual openHAB objects
|
5
5
|
module Core
|
6
|
-
# The openHAB Version. >= 3.
|
6
|
+
# The openHAB Version. >= 3.4.0 is required.
|
7
7
|
# @return [String]
|
8
8
|
VERSION = org.openhab.core.OpenHAB.version.freeze
|
9
9
|
|
10
|
-
unless Gem::Version.new(VERSION) >= Gem::Version.new("3.
|
11
|
-
raise "`openhab-jrubyscripting` requires openHAB >= 3.
|
10
|
+
unless Gem::Version.new(VERSION) >= Gem::Version.new("3.4.0")
|
11
|
+
raise "`openhab-jrubyscripting` requires openHAB >= 3.4.0"
|
12
12
|
end
|
13
13
|
|
14
14
|
# @return [Integer] Number of seconds to wait between checks for automation manager
|
@@ -7,16 +7,24 @@ module OpenHAB
|
|
7
7
|
module Java
|
8
8
|
java_import java.time.LocalDate
|
9
9
|
|
10
|
-
# Extensions to LocalDate
|
10
|
+
# Extensions to {java.time.LocalDate}
|
11
11
|
class LocalDate
|
12
12
|
include Time
|
13
13
|
include Between
|
14
14
|
include Ephemeris
|
15
15
|
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
16
|
+
# @!scope class
|
17
|
+
|
18
|
+
# @!attribute [r] now
|
19
|
+
# @return [LocalDate]
|
20
|
+
|
21
|
+
# @!method parse(text, formatter=nil)
|
22
|
+
# Converts the given text into a LocalDate.
|
23
|
+
# @param [String] text The text to parse
|
24
|
+
# @param [java.time.format.DateTimeFormatter] formatter The formatter to use
|
25
|
+
# @return [LocalDate]
|
26
|
+
|
27
|
+
# @!scope instance
|
20
28
|
|
21
29
|
# @param [TemporalAmount, LocalDate, Numeric] other
|
22
30
|
# If other is a Numeric, it's interpreted as days.
|
@@ -25,11 +33,11 @@ module OpenHAB
|
|
25
33
|
def -(other)
|
26
34
|
case other
|
27
35
|
when Date
|
28
|
-
|
36
|
+
self - other.to_local_date
|
29
37
|
when MonthDay
|
30
38
|
self - other.at_year(year)
|
31
39
|
when LocalDate
|
32
|
-
Period.
|
40
|
+
Period.between(other, self)
|
33
41
|
when Duration
|
34
42
|
minus_days(other.to_days)
|
35
43
|
when Numeric
|
@@ -7,6 +7,8 @@ module OpenHAB
|
|
7
7
|
module Java
|
8
8
|
java_import java.time.LocalTime
|
9
9
|
|
10
|
+
#
|
11
|
+
# Extensions to {java.time.LocalTime}
|
10
12
|
#
|
11
13
|
# @example
|
12
14
|
# break_time = LocalTime::NOON
|
@@ -36,15 +38,23 @@ module OpenHAB
|
|
36
38
|
include Between
|
37
39
|
# @!parse include Time
|
38
40
|
|
39
|
-
# @!visibility private
|
40
41
|
class << self
|
42
|
+
# @!attribute [r] now
|
43
|
+
# @return [LocalTime]
|
44
|
+
|
45
|
+
# @!visibility private
|
46
|
+
alias_method :raw_parse, :parse
|
47
|
+
|
41
48
|
#
|
42
|
-
# Parses strings in the form "h[:mm[:ss]] [am/pm]"
|
49
|
+
# Parses strings in the form "h[:mm[:ss]] [am/pm]" when no formatter is given.
|
43
50
|
#
|
44
51
|
# @param [String] string
|
52
|
+
# @param [java.time.format.DateTimeFormatter] formatter The formatter to use
|
45
53
|
# @return [LocalTime]
|
46
54
|
#
|
47
|
-
def parse(string)
|
55
|
+
def parse(string, formatter = nil)
|
56
|
+
return raw_parse(string, formatter) if formatter
|
57
|
+
|
48
58
|
format = /(am|pm)$/i.match?(string) ? "h[:mm[:ss][.S]][ ]a" : "H[:mm[:ss][.S]]"
|
49
59
|
java_send(:parse, [java.lang.CharSequence, java.time.format.DateTimeFormatter],
|
50
60
|
string, java.time.format.DateTimeFormatterBuilder.new
|
@@ -7,7 +7,7 @@ module OpenHAB
|
|
7
7
|
module Java
|
8
8
|
java_import java.time.MonthDay
|
9
9
|
|
10
|
-
# Extensions to MonthDay
|
10
|
+
# Extensions to {java.time.MonthDay}
|
11
11
|
class MonthDay
|
12
12
|
include Between
|
13
13
|
include Ephemeris
|
@@ -39,12 +39,22 @@ module OpenHAB
|
|
39
39
|
|
40
40
|
# @return [MonthDay]
|
41
41
|
def +(other)
|
42
|
-
|
42
|
+
case other
|
43
|
+
when java.time.temporal.TemporalAmount, Numeric
|
44
|
+
(LocalDate.of(1900, month, day_of_month) + other).to_month_day
|
45
|
+
else
|
46
|
+
(to_local_date(other.to_local_date) + other).to_month_day
|
47
|
+
end
|
43
48
|
end
|
44
49
|
|
45
50
|
# @return [MonthDay, Period]
|
46
51
|
def -(other)
|
47
|
-
d =
|
52
|
+
d = case other
|
53
|
+
when java.time.temporal.TemporalAmount, Numeric
|
54
|
+
LocalDate.of(1900, month, day_of_month) - other
|
55
|
+
else
|
56
|
+
to_local_date(other.to_local_date) - other
|
57
|
+
end
|
48
58
|
return d if d.is_a?(java.time.Period)
|
49
59
|
|
50
60
|
d.to_month_day
|
@@ -50,7 +50,11 @@ module OpenHAB
|
|
50
50
|
# Convert `other` to this class, if possible
|
51
51
|
# @return [Array, nil]
|
52
52
|
def coerce(other)
|
53
|
-
|
53
|
+
coercion_method = self.class.coercion_method
|
54
|
+
return unless other.respond_to?(coercion_method)
|
55
|
+
return [other.send(coercion_method), self] if other.method(coercion_method).arity.zero?
|
56
|
+
|
57
|
+
[other.send(coercion_method, self), self]
|
54
58
|
end
|
55
59
|
end
|
56
60
|
end
|
@@ -7,18 +7,31 @@ module OpenHAB
|
|
7
7
|
module Java
|
8
8
|
ZonedDateTime = java.time.ZonedDateTime
|
9
9
|
|
10
|
-
# Extensions to ZonedDateTime
|
10
|
+
# Extensions to {java.time.ZonedDateTime}
|
11
11
|
class ZonedDateTime
|
12
12
|
include Time
|
13
13
|
include Between
|
14
14
|
|
15
15
|
class << self # rubocop:disable Lint/EmptyClass
|
16
|
+
# @!scope class
|
17
|
+
|
16
18
|
# @!attribute [r] now
|
17
19
|
# @return [ZonedDateTime]
|
20
|
+
|
21
|
+
# @!method parse(text, formatter = nil)
|
22
|
+
# Parses a string into a ZonedDateTime object.
|
23
|
+
#
|
24
|
+
# @param [String] text The text to parse.
|
25
|
+
# @param [java.time.format.DateTimeFormatter] formatter The formatter to use.
|
26
|
+
# @return [ZonedDateTime]
|
18
27
|
end
|
19
28
|
|
29
|
+
# @!scope instance
|
30
|
+
|
20
31
|
# @return [LocalTime]
|
21
|
-
|
32
|
+
def to_local_time(_context = nil)
|
33
|
+
toLocalTime
|
34
|
+
end
|
22
35
|
|
23
36
|
# @return [Month]
|
24
37
|
alias_method :to_month, :month
|
@@ -85,9 +85,9 @@ class Date
|
|
85
85
|
#
|
86
86
|
def coerce(other)
|
87
87
|
return nil unless other.respond_to?(:to_date)
|
88
|
-
return [other.to_date
|
88
|
+
return [other.to_date, self] if other.method(:to_date).arity.zero?
|
89
89
|
|
90
|
-
[other.to_date, self]
|
90
|
+
[other.to_date(self), self]
|
91
91
|
end
|
92
92
|
|
93
93
|
remove_method :inspect
|
@@ -151,7 +151,12 @@ module OpenHAB
|
|
151
151
|
# @return [QuantityType] `self` as a {QuantityType} of the supplied Unit
|
152
152
|
#
|
153
153
|
def |(unit) # rubocop:disable Naming/BinaryOperatorParameterName
|
154
|
-
|
154
|
+
if unit.respond_to?(:to_str)
|
155
|
+
parsed_unit = org.openhab.core.types.util.UnitUtils.parse_unit(unit.to_str)
|
156
|
+
raise ArgumentError, "Unknown unit #{unit}" unless parsed_unit
|
157
|
+
|
158
|
+
unit = parsed_unit
|
159
|
+
end
|
155
160
|
|
156
161
|
return super unless unit.is_a?(javax.measure.Unit)
|
157
162
|
|
@@ -187,6 +187,30 @@ module OpenHAB
|
|
187
187
|
def item_factory
|
188
188
|
@item_factory ||= org.openhab.core.library.CoreItemFactory.new
|
189
189
|
end
|
190
|
+
|
191
|
+
#
|
192
|
+
# Convert the given array to an array of strings.
|
193
|
+
# Convert Semantics classes to their simple name.
|
194
|
+
#
|
195
|
+
# @param [String,Symbol,Semantics::Tag] tags A list of strings, symbols, or Semantics classes
|
196
|
+
# @return [Array] An array of strings
|
197
|
+
#
|
198
|
+
# @example
|
199
|
+
# tags = normalize_tags("tag1", Semantics::LivingRoom)
|
200
|
+
#
|
201
|
+
# @!visibility private
|
202
|
+
def normalize_tags(*tags)
|
203
|
+
semantics = proc { |tag| tag.respond_to?(:java_class) && tag < Semantics::Tag }
|
204
|
+
|
205
|
+
tags.compact.map do |tag|
|
206
|
+
case tag
|
207
|
+
when String then tag
|
208
|
+
when Symbol then tag.to_s
|
209
|
+
when semantics then tag.java_class.simple_name
|
210
|
+
else raise ArgumentError, "`#{tag}` must be a subclass of Semantics::Tag, a `Symbol`, or a `String`."
|
211
|
+
end
|
212
|
+
end
|
213
|
+
end
|
190
214
|
end
|
191
215
|
|
192
216
|
# @param dimension [Symbol, nil] The unit dimension for a {NumberItem} (see {ItemBuilder#dimension})
|
@@ -294,18 +318,7 @@ module OpenHAB
|
|
294
318
|
# @return [void]
|
295
319
|
#
|
296
320
|
def tag(*tags)
|
297
|
-
|
298
|
-
tag.is_a?(String) ||
|
299
|
-
tag.is_a?(Symbol) ||
|
300
|
-
(tag.is_a?(Module) && tag < Semantics::Tag)
|
301
|
-
end
|
302
|
-
raise ArgumentError, "`tag` must be a subclass of Semantics::Tag, or a `String``."
|
303
|
-
end
|
304
|
-
|
305
|
-
tags.each do |tag|
|
306
|
-
tag = tag.name.split("::").last if tag.is_a?(Module) && tag < Semantics::Tag
|
307
|
-
@tags << tag.to_s
|
308
|
-
end
|
321
|
+
@tags += self.class.normalize_tags(*tags)
|
309
322
|
end
|
310
323
|
|
311
324
|
#
|
@@ -35,7 +35,8 @@ module OpenHAB
|
|
35
35
|
super()
|
36
36
|
set_name(config.name)
|
37
37
|
set_description(config.description)
|
38
|
-
|
38
|
+
tags = DSL::Items::ItemBuilder.normalize_tags(*config.tags)
|
39
|
+
set_tags(tags.to_set)
|
39
40
|
set_triggers(config.triggers)
|
40
41
|
self.uid = config.uid
|
41
42
|
@run_context = config.caller
|
@@ -297,28 +298,6 @@ module OpenHAB
|
|
297
298
|
@run_context.instance_exec(&task.block)
|
298
299
|
end
|
299
300
|
|
300
|
-
#
|
301
|
-
# Convert the given array to a set of strings.
|
302
|
-
# Convert Semantics classes to their simple name
|
303
|
-
#
|
304
|
-
# @example
|
305
|
-
# to_string_set("tag1", Semantics::LivingRoom)
|
306
|
-
#
|
307
|
-
# @param tags [Array] An array of strings or Semantics classes
|
308
|
-
#
|
309
|
-
# @return [Set] A set of strings
|
310
|
-
#
|
311
|
-
def to_string_set(*tags)
|
312
|
-
tags = tags.flatten.map do |tag|
|
313
|
-
if tag.respond_to?(:java_class) && tag < org.openhab.core.semantics.Tag
|
314
|
-
tag.java_class.simple_name
|
315
|
-
else
|
316
|
-
tag.to_s
|
317
|
-
end
|
318
|
-
end
|
319
|
-
Set.new(tags)
|
320
|
-
end
|
321
|
-
|
322
301
|
#
|
323
302
|
# Create a new hash in which all elements are converted to strings
|
324
303
|
#
|
@@ -358,7 +358,7 @@ module OpenHAB
|
|
358
358
|
#
|
359
359
|
# Set the rule's tags.
|
360
360
|
#
|
361
|
-
# @param [String,
|
361
|
+
# @param [String, Symbol, Semantics::Tag] tags A list of tags to assign to the rule.
|
362
362
|
# @return [void]
|
363
363
|
#
|
364
364
|
# @example
|
@@ -1101,7 +1101,10 @@ module OpenHAB
|
|
1101
1101
|
# :saturday,
|
1102
1102
|
# :sunday] value
|
1103
1103
|
# When to execute rule.
|
1104
|
-
# @param [LocalTime, String, nil] at What time of day to execute rule
|
1104
|
+
# @param [LocalTime, String, Core::Items::DateTimeItem, nil] at What time of day to execute rule
|
1105
|
+
# If `value` is `:day`, `at` can be a {Core::Items::DateTimeItem DateTimeItem}, and
|
1106
|
+
# the trigger will run every day at the (time only portion of) current state of the
|
1107
|
+
# item. If the item is {NULL} or {UNDEF}, the trigger will not run.
|
1105
1108
|
# @param [Object] attach Object to be attached to the trigger
|
1106
1109
|
# @return [void]
|
1107
1110
|
#
|
@@ -1157,11 +1160,23 @@ module OpenHAB
|
|
1157
1160
|
# run { logger.info "Happy Valentine's Day!" }
|
1158
1161
|
# end
|
1159
1162
|
#
|
1163
|
+
# @example
|
1164
|
+
# rule "Every day at sunset" do
|
1165
|
+
# every :day, at: Sunset_Time
|
1166
|
+
# run { logger.info "It's getting dark" }
|
1167
|
+
# end
|
1168
|
+
#
|
1160
1169
|
def every(value, at: nil, attach: nil)
|
1161
1170
|
return every(java.time.MonthDay.parse(value), at: at, attach: attach) if value.is_a?(String)
|
1162
1171
|
|
1163
1172
|
@ruby_triggers << [:every, value, { at: at }]
|
1164
1173
|
|
1174
|
+
if value == :day && at.is_a?(Item)
|
1175
|
+
raise ArgumentError, "Attachments are not supported with dynamic datetime triggers" unless attach.nil?
|
1176
|
+
|
1177
|
+
return trigger("timer.DateTimeTrigger", itemName: at.name, timeOnly: true)
|
1178
|
+
end
|
1179
|
+
|
1165
1180
|
cron_expression = case value
|
1166
1181
|
when Symbol then Cron.from_symbol(value, at)
|
1167
1182
|
when Duration then Cron.from_duration(value, at)
|
@@ -1502,6 +1517,36 @@ module OpenHAB
|
|
1502
1517
|
trigger("core.GenericEventTrigger", eventTopic: topic, eventSource: source, eventTypes: types, attach: attach)
|
1503
1518
|
end
|
1504
1519
|
|
1520
|
+
#
|
1521
|
+
# Creates a trigger based on the time stored in a {DateTimeItem}
|
1522
|
+
#
|
1523
|
+
# The trigger will dynamically update any time the state of the item
|
1524
|
+
# changes. If the item is {NULL} or {UNDEF}, the trigger will not run.
|
1525
|
+
#
|
1526
|
+
# @param [Item, String, Symbol] item The item (or it's name)
|
1527
|
+
# @return [void]
|
1528
|
+
#
|
1529
|
+
# @example
|
1530
|
+
# rule "say hello when the kids get home from school" do
|
1531
|
+
# at HomeFromSchool_Time
|
1532
|
+
# run do
|
1533
|
+
# KitchenEcho_TTS << "hi kids! how was school?"
|
1534
|
+
# end
|
1535
|
+
# end
|
1536
|
+
#
|
1537
|
+
# rule "set home from school time" do
|
1538
|
+
# on_load
|
1539
|
+
# every :day, at: "5:00am" do
|
1540
|
+
# run do
|
1541
|
+
# HomeFromSchool_Time.ensure.update(school_day? ? LocalTime.parse("3:30pm") : NULL)
|
1542
|
+
# end
|
1543
|
+
# end
|
1544
|
+
#
|
1545
|
+
def at(item)
|
1546
|
+
item = item.name if item.is_a?(Item)
|
1547
|
+
trigger("timer.DateTimeTrigger", itemName: item.to_s)
|
1548
|
+
end
|
1549
|
+
|
1505
1550
|
#
|
1506
1551
|
# Create a generic trigger given the trigger type uid and a configuration hash
|
1507
1552
|
#
|
data/lib/openhab/dsl/version.rb
CHANGED
data/lib/openhab/dsl.rb
CHANGED
@@ -152,8 +152,6 @@ module OpenHAB
|
|
152
152
|
#
|
153
153
|
# @see Core::ValueCache ValueCache
|
154
154
|
#
|
155
|
-
# @since openHAB 3.4.0
|
156
|
-
#
|
157
155
|
def shared_cache
|
158
156
|
$sharedCache
|
159
157
|
end
|
@@ -523,9 +521,6 @@ module OpenHAB
|
|
523
521
|
# end # the states will be restored here
|
524
522
|
#
|
525
523
|
def store_states(*items)
|
526
|
-
items = items.flatten.map do |item|
|
527
|
-
item.respond_to?(:__getobj__) ? item.__getobj__ : item
|
528
|
-
end
|
529
524
|
states = Core::Items::StateStorage.from_items(*items)
|
530
525
|
if block_given?
|
531
526
|
yield
|
@@ -604,18 +599,39 @@ module OpenHAB
|
|
604
599
|
# Item1.average_since(12.hours)
|
605
600
|
# end
|
606
601
|
#
|
607
|
-
# @
|
608
|
-
#
|
609
|
-
# @param [Object] service service either as a String or a Symbol
|
602
|
+
# @param [Object] service Persistence service either as a String or a Symbol
|
610
603
|
# @yield [] Block executed in context of the supplied persistence service
|
611
604
|
# @return [Object] The return value from the block.
|
612
605
|
#
|
606
|
+
# @see persistence!
|
607
|
+
# @see OpenHAB::Core::Items::Persistence
|
608
|
+
#
|
613
609
|
def persistence(service)
|
614
|
-
old =
|
615
|
-
Thread.current[:openhab_persistence_service] = service
|
610
|
+
old = persistence!(service)
|
616
611
|
yield
|
617
612
|
ensure
|
618
|
-
|
613
|
+
persistence!(old)
|
614
|
+
end
|
615
|
+
|
616
|
+
#
|
617
|
+
# Permanently sets the default persistence service for the current thread
|
618
|
+
#
|
619
|
+
# @note This method is only intended for use at the top level of rule
|
620
|
+
# scripts. If it's used within library methods, or hap-hazardly within
|
621
|
+
# rules, things can get very confusing because the prior state won't be
|
622
|
+
# properly restored.
|
623
|
+
#
|
624
|
+
# @param [Object] service Persistence service either as a String or a Symbol. When nil, use
|
625
|
+
# the system's default persistence service.
|
626
|
+
# @return [Object,nil] The previous persistence service settings, or nil when using the system's default.
|
627
|
+
#
|
628
|
+
# @see persistence
|
629
|
+
# @see OpenHAB::Core::Items::Persistence
|
630
|
+
#
|
631
|
+
def persistence!(service = nil)
|
632
|
+
old = Thread.current[:openhab_persistence_service]
|
633
|
+
Thread.current[:openhab_persistence_service] = service
|
634
|
+
old
|
619
635
|
end
|
620
636
|
|
621
637
|
#
|
@@ -265,12 +265,13 @@ module OpenHAB
|
|
265
265
|
# @return [void]
|
266
266
|
#
|
267
267
|
def load_rules
|
268
|
-
|
268
|
+
automation_paths = Array(::RSpec.configuration.openhab_automation_search_paths)
|
269
|
+
|
269
270
|
lib_dirs = rubylib_dirs.map { |d| File.join(d, "") }
|
270
271
|
lib_dirs << File.join(gem_home, "")
|
271
272
|
|
272
273
|
SuspendRules.suspend_rules do
|
273
|
-
files = Dir["#{
|
274
|
+
files = automation_paths.map { |p| Dir["#{p}/**/*.rb"] }.flatten
|
274
275
|
files.reject! do |f|
|
275
276
|
lib_dirs.any? { |l| f.start_with?(l) }
|
276
277
|
end
|
data/lib/openhab/rspec/hooks.rb
CHANGED
@@ -17,6 +17,39 @@ module OpenHAB
|
|
17
17
|
end
|
18
18
|
ZonedDateTime.singleton_class.prepend(MockedZonedDateTime)
|
19
19
|
|
20
|
+
# @!visibility private
|
21
|
+
module MockedLocalDate
|
22
|
+
def now
|
23
|
+
mocked_time_stack_item = Timecop.top_stack_item
|
24
|
+
return super unless mocked_time_stack_item
|
25
|
+
|
26
|
+
mocked_time_stack_item.time.to_zoned_date_time.to_local_date
|
27
|
+
end
|
28
|
+
end
|
29
|
+
LocalDate.singleton_class.prepend(MockedLocalDate)
|
30
|
+
|
31
|
+
# @!visibility private
|
32
|
+
module MockedLocalTime
|
33
|
+
def now
|
34
|
+
mocked_time_stack_item = Timecop.top_stack_item
|
35
|
+
return super unless mocked_time_stack_item
|
36
|
+
|
37
|
+
mocked_time_stack_item.time.to_zoned_date_time.to_local_time
|
38
|
+
end
|
39
|
+
end
|
40
|
+
LocalTime.singleton_class.prepend(MockedLocalTime)
|
41
|
+
|
42
|
+
# @!visibility private
|
43
|
+
module MockedMonthDay
|
44
|
+
def now
|
45
|
+
mocked_time_stack_item = Timecop.top_stack_item
|
46
|
+
return super unless mocked_time_stack_item
|
47
|
+
|
48
|
+
mocked_time_stack_item.time.to_zoned_date_time.to_month_day
|
49
|
+
end
|
50
|
+
end
|
51
|
+
MonthDay.singleton_class.prepend(MockedMonthDay)
|
52
|
+
|
20
53
|
# extend Timecop to support Java time classes
|
21
54
|
# @!visibility private
|
22
55
|
module TimeCopStackItem
|
data/lib/openhab/rspec.rb
CHANGED
@@ -15,3 +15,12 @@ require_relative "rspec/configuration"
|
|
15
15
|
require_relative "rspec/helpers"
|
16
16
|
require_relative "rspec/karaf"
|
17
17
|
require_relative "rspec/hooks"
|
18
|
+
|
19
|
+
return unless defined?(RSpec)
|
20
|
+
|
21
|
+
RSpec.configure do |c|
|
22
|
+
c.add_setting :openhab_automation_search_paths, default: [
|
23
|
+
"#{org.openhab.core.OpenHAB.config_folder}/automation/ruby",
|
24
|
+
"#{org.openhab.core.OpenHAB.config_folder}/automation/jsr223"
|
25
|
+
]
|
26
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: openhab-jrubyscripting
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 5.0.0.
|
4
|
+
version: 5.0.0.rc12
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Cody Cutrer
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2023-01-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|