rspec-openhab-scripting 0.0.5-java → 0.0.8-java
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/rspec/openhab/actions.rb +20 -0
- data/lib/rspec/openhab/dsl/imports.rb +3 -2
- data/lib/rspec/openhab/items.rb +0 -2
- data/lib/rspec/openhab/state.rb +1 -5
- data/lib/rspec/openhab/timer.rb +12 -0
- data/lib/rspec/openhab/version.rb +1 -1
- data/lib/rspec/openhab/wait.rb +66 -5
- data/lib/rspec-openhab-scripting.rb +13 -8
- metadata +4 -4
- data/lib/rspec/bundler/inline.rb +0 -12
- data/lib/rspec/openhab/dsl/timers/timer.rb +0 -87
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5b4f4a385d3672410faee3ca6a90eb931f4499060de30d5dfc11869c73b78db7
|
4
|
+
data.tar.gz: 2d6c73ceabd6796134434250824ee255f80cc74b98b16f4172ac76d6be350c5b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e9153da220c8491f9a8f79bed277646df27b95ed4c17fb0181dcfd8519df0d9443c989ace2f2fe8da3fb39c14e177d7147e7148cffd5a47baa6a121a821ce883
|
7
|
+
data.tar.gz: 70b3fefd8b2df95db3fc553fcb785c48c8e63d3671c0922328bd0937819e7f3b3cc164edb58e3d4fc04da20101297c65868696ebf624b664892b16c86bed22cd
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module OpenHAB
|
4
|
+
module DSL
|
5
|
+
module Actions
|
6
|
+
# redefine these to do nothing so that rules won't fail
|
7
|
+
def notify(msg, email: nil) # rubocop:disable Lint/UnusedMethodArgument:
|
8
|
+
logger.debug("notify: #{msg}")
|
9
|
+
end
|
10
|
+
|
11
|
+
def say(text, voice: nil, sink: nil, volume: nil) # rubocop:disable Lint/UnusedMethodArgument:
|
12
|
+
logger.debug("say: #{text}")
|
13
|
+
end
|
14
|
+
|
15
|
+
def play_sound(filename, sink: nil, volume: nil) # rubocop:disable Lint/UnusedMethodArgument:
|
16
|
+
logger.debug("play_sound: #{filename}")
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -213,10 +213,11 @@ module OpenHAB
|
|
213
213
|
se = org.openhab.core.automation.module.script.rulesupport.internal
|
214
214
|
.RuleSupportScriptExtension.new(rr, srp, scmhf, scmtp, spmhf)
|
215
215
|
sew = ScriptExtensionManagerWrapper.new(se)
|
216
|
-
$se = $scriptExtension = sew
|
216
|
+
$se = $scriptExtension = sew
|
217
217
|
|
218
218
|
# need to create some singletons referencing registries
|
219
|
-
org.openhab.core.
|
219
|
+
scheduler = org.openhab.core.internal.scheduler.SchedulerImpl.new
|
220
|
+
org.openhab.core.model.script.ScriptServiceUtil.new(ir, tr, ep, nil, scheduler)
|
220
221
|
org.openhab.core.model.script.internal.engine.action.SemanticsActionService.new(ir)
|
221
222
|
|
222
223
|
# link up event bus infrastructure
|
data/lib/rspec/openhab/items.rb
CHANGED
data/lib/rspec/openhab/state.rb
CHANGED
@@ -1,11 +1,8 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
RSpec.configure do |config|
|
4
|
-
org.openhab.core.items.GenericItem.field_reader :eventPublisher
|
5
|
-
|
6
|
-
# rubocop:disable Style/GlobalVars
|
7
4
|
config.before(:each) do
|
8
|
-
ep = $ir.
|
5
|
+
ep = $ir.event_publisher
|
9
6
|
|
10
7
|
# stash event publishers to avoid triggering any rules
|
11
8
|
$ir.for_each do |_provider, item|
|
@@ -20,5 +17,4 @@ RSpec.configure do |config|
|
|
20
17
|
item.event_publisher = ep
|
21
18
|
end
|
22
19
|
end
|
23
|
-
# rubocop:enable Style/GlobalVars
|
24
20
|
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
RSpec.configure do |config|
|
4
|
+
config.before(:each) do
|
5
|
+
OpenHAB::DSL::Timers.timer_manager.cancel_all
|
6
|
+
wait_for_background_tasks
|
7
|
+
end
|
8
|
+
config.after(:each) do
|
9
|
+
OpenHAB::DSL::Timers.timer_manager.cancel_all
|
10
|
+
wait_for_background_tasks
|
11
|
+
end
|
12
|
+
end
|
data/lib/rspec/openhab/wait.rb
CHANGED
@@ -4,14 +4,75 @@ module RSpec
|
|
4
4
|
module OpenHAB
|
5
5
|
module Wait
|
6
6
|
def wait_for_rules
|
7
|
+
wait_for_background_tasks(timers: false)
|
8
|
+
end
|
9
|
+
|
10
|
+
def wait_for_timers
|
11
|
+
wait_for_background_tasks(rules: false)
|
12
|
+
end
|
13
|
+
|
14
|
+
def wait_for_background_tasks(rules: true, timers: true)
|
7
15
|
loop do
|
8
|
-
sleep
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
16
|
+
sleep 0.1
|
17
|
+
next if java.lang.Thread.all_stack_traces.any? do |(t, stack)|
|
18
|
+
# this is just an estimate. I see 9 when it's parked waiting
|
19
|
+
# for an event, but once it hits ruby it gets real big real quick
|
20
|
+
min_frames = 15
|
21
|
+
|
22
|
+
case t.name
|
23
|
+
when /^OH-scheduler-/
|
24
|
+
# timer thread; born and die for each timer
|
25
|
+
if thread_running?(t) || stack.length > min_frames
|
26
|
+
logger.debug "thread #{t.name} is running (#{stack.length})"
|
27
|
+
stack.each do |frame|
|
28
|
+
logger.trace " #{frame}"
|
29
|
+
end
|
30
|
+
next timers
|
31
|
+
end
|
32
|
+
when /^OH-rule-/
|
33
|
+
|
34
|
+
if thread_running?(t) || stack.length > min_frames
|
35
|
+
logger.debug "thread #{t.name} is running (#{stack.length})"
|
36
|
+
stack.each do |frame|
|
37
|
+
logger.trace " #{frame}"
|
38
|
+
end
|
39
|
+
|
40
|
+
next rules
|
41
|
+
end
|
42
|
+
when /^OH-(?:eventwatcher|eventexecutor)-/
|
43
|
+
# an event is making its way through the system
|
44
|
+
if thread_running?(t)
|
45
|
+
logger.debug "thread #{t.name} is running"
|
46
|
+
next rules
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
# no need to retry if there were no timers
|
52
|
+
break unless timers && wait_for_next_timer
|
13
53
|
end
|
14
54
|
end
|
55
|
+
|
56
|
+
private
|
57
|
+
|
58
|
+
def thread_running?(thread)
|
59
|
+
![java.lang.Thread::State::WAITING,
|
60
|
+
java.lang.Thread::State::TIMED_WAITING].include?(thread.state)
|
61
|
+
end
|
62
|
+
|
63
|
+
def wait_for_next_timer
|
64
|
+
latest = ::OpenHAB::DSL::Timers.timer_manager.instance_variable_get(:@timers).min_by(&:execution_time)
|
65
|
+
return false unless latest
|
66
|
+
|
67
|
+
delta = (latest.execution_time.to_instant.to_epoch_milli - java.time.Instant.now.to_epoch_milli) / 1000.0
|
68
|
+
# in the past? it's probably executing
|
69
|
+
return true if delta.negative?
|
70
|
+
|
71
|
+
logger.info("Waiting #{delta}s for next timer") if delta > 5
|
72
|
+
|
73
|
+
sleep(delta)
|
74
|
+
true
|
75
|
+
end
|
15
76
|
end
|
16
77
|
end
|
17
78
|
end
|
@@ -34,10 +34,10 @@ maven_require do
|
|
34
34
|
require "jar tech.units, indriya, 2.1.3"
|
35
35
|
|
36
36
|
require "jar org.openhab.core.bundles, org.openhab.core, #{openhab_version}"
|
37
|
-
require "jar org.openhab.core.bundles, org.openhab.core.config.core, #{openhab_version}"
|
38
37
|
require "jar org.openhab.core.bundles, org.openhab.core.automation, #{openhab_version}"
|
39
38
|
require "jar org.openhab.core.bundles, org.openhab.core.automation.module.script, #{openhab_version}"
|
40
39
|
require "jar org.openhab.core.bundles, org.openhab.core.automation.module.script.rulesupport, #{openhab_version}"
|
40
|
+
require "jar org.openhab.core.bundles, org.openhab.core.config.core, #{openhab_version}"
|
41
41
|
require "jar org.openhab.core.bundles, org.openhab.core.io.monitor, #{openhab_version}"
|
42
42
|
require "jar org.openhab.core.bundles, org.openhab.core.model.core, #{openhab_version}"
|
43
43
|
require "jar org.openhab.core.bundles, org.openhab.core.model.script, #{openhab_version}"
|
@@ -64,28 +64,33 @@ OpenHAB::DSL::Imports.import_presets
|
|
64
64
|
|
65
65
|
require "openhab"
|
66
66
|
|
67
|
+
require "rspec/openhab/actions"
|
67
68
|
require "rspec/openhab/core/cron_scheduler"
|
68
69
|
|
69
|
-
# openhab-scripting uses a require_relative, so our override doesn't get used
|
70
|
-
OpenHAB::DSL.send(:remove_const, :Timer)
|
71
|
-
require_relative "rspec/openhab/dsl/timers/timer"
|
72
|
-
|
73
70
|
# RSpec additions
|
71
|
+
require "rspec/core"
|
74
72
|
require "rspec/openhab/dsl/rules/rspec"
|
73
|
+
require "rspec/openhab/items"
|
75
74
|
require "rspec/openhab/state"
|
75
|
+
require "rspec/openhab/timer"
|
76
76
|
require "rspec/openhab/trigger"
|
77
77
|
require "rspec/openhab/wait"
|
78
|
-
require "rspec/openhab/items"
|
79
78
|
|
80
79
|
RSpec::OpenHAB::Items.populate_items_from_api(api)
|
81
80
|
|
81
|
+
# make bundler/inline _not_ destroy the already existing load path
|
82
|
+
module Bundler
|
83
|
+
module SharedHelpers
|
84
|
+
def clean_load_path; end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
82
88
|
# load rules files
|
83
89
|
OPENHAB_AUTOMATION_PATH = "#{org.openhab.core.OpenHAB.config_folder}/automation/jsr223/ruby/personal"
|
84
90
|
|
85
|
-
# set up some environment the rules files expect
|
86
91
|
Dir["#{OPENHAB_AUTOMATION_PATH}/*.rb"].each do |f|
|
87
92
|
load f
|
88
93
|
rescue Exception => e # rubocop:disable Lint/RescueException
|
89
|
-
warn "Failed loading #{f}: #{e}"
|
94
|
+
warn "Failed loading #{f}: #{e.inspect}"
|
90
95
|
warn e.backtrace
|
91
96
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rspec-openhab-scripting
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.8
|
5
5
|
platform: java
|
6
6
|
authors:
|
7
7
|
- Cody Cutrer
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-07-
|
11
|
+
date: 2022-07-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
requirement: !ruby/object:Gem::Requirement
|
@@ -172,7 +172,7 @@ extra_rdoc_files: []
|
|
172
172
|
files:
|
173
173
|
- lib/rspec-openhab-scripting.rb
|
174
174
|
- lib/rspec-openhab-scripting_jars.rb
|
175
|
-
- lib/rspec/
|
175
|
+
- lib/rspec/openhab/actions.rb
|
176
176
|
- lib/rspec/openhab/api.rb
|
177
177
|
- lib/rspec/openhab/core/cron_scheduler.rb
|
178
178
|
- lib/rspec/openhab/core/load_path.rb
|
@@ -182,9 +182,9 @@ files:
|
|
182
182
|
- lib/rspec/openhab/core/script_handling.rb
|
183
183
|
- lib/rspec/openhab/dsl/imports.rb
|
184
184
|
- lib/rspec/openhab/dsl/rules/rspec.rb
|
185
|
-
- lib/rspec/openhab/dsl/timers/timer.rb
|
186
185
|
- lib/rspec/openhab/items.rb
|
187
186
|
- lib/rspec/openhab/state.rb
|
187
|
+
- lib/rspec/openhab/timer.rb
|
188
188
|
- lib/rspec/openhab/trigger.rb
|
189
189
|
- lib/rspec/openhab/version.rb
|
190
190
|
- lib/rspec/openhab/wait.rb
|
data/lib/rspec/bundler/inline.rb
DELETED
@@ -1,12 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Bundler
|
4
|
-
class DummyDsl
|
5
|
-
def source(*); end
|
6
|
-
end
|
7
|
-
end
|
8
|
-
|
9
|
-
def gemfile(*, &block)
|
10
|
-
# needs to be a no-op, since we're already running in the context of bundler
|
11
|
-
Bundler::DummyDsl.new.instance_eval(&block)
|
12
|
-
end
|
@@ -1,87 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module OpenHAB
|
4
|
-
module DSL
|
5
|
-
class Timer
|
6
|
-
#
|
7
|
-
# Create a new Timer Object
|
8
|
-
#
|
9
|
-
# @param [Duration] duration Duration until timer should fire
|
10
|
-
# @param [Block] block Block to execute when timer fires
|
11
|
-
#
|
12
|
-
def initialize(duration:, thread_locals: {}, &block) # rubocop:disable Lint/UnusedMethodArgument
|
13
|
-
@duration = duration
|
14
|
-
|
15
|
-
Timers.timer_manager.add(self)
|
16
|
-
end
|
17
|
-
|
18
|
-
def reschedule(_duration = nil)
|
19
|
-
Timers.timer_manager.add(self)
|
20
|
-
end
|
21
|
-
|
22
|
-
#
|
23
|
-
# Cancel timer
|
24
|
-
#
|
25
|
-
# @return [Boolean] True if cancel was successful, false otherwise
|
26
|
-
#
|
27
|
-
def cancel
|
28
|
-
Timers.timer_manager.delete(self)
|
29
|
-
end
|
30
|
-
|
31
|
-
def terminated?; end
|
32
|
-
alias_method :has_terminated, :terminated?
|
33
|
-
|
34
|
-
def is_active # rubocop:disable Naming/PredicateName
|
35
|
-
false
|
36
|
-
end
|
37
|
-
|
38
|
-
private
|
39
|
-
|
40
|
-
def timer_block
|
41
|
-
proc do
|
42
|
-
Timers.timer_manager.delete(self)
|
43
|
-
yield(self)
|
44
|
-
end
|
45
|
-
end
|
46
|
-
end
|
47
|
-
|
48
|
-
#
|
49
|
-
# Convert TemporalAmount (Duration), seconds (float, integer), and Ruby Time to ZonedDateTime
|
50
|
-
# Note: TemporalAmount is added to now
|
51
|
-
#
|
52
|
-
# @param [Object] timestamp to convert
|
53
|
-
#
|
54
|
-
# @return [ZonedDateTime]
|
55
|
-
#
|
56
|
-
def self.to_zdt(timestamp)
|
57
|
-
logger.trace("Converting #{timestamp} (#{timestamp.class}) to ZonedDateTime")
|
58
|
-
return unless timestamp
|
59
|
-
|
60
|
-
case timestamp
|
61
|
-
when Java::JavaTimeTemporal::TemporalAmount then ZonedDateTime.now.plus(timestamp)
|
62
|
-
when ZonedDateTime then timestamp
|
63
|
-
when Time then timestamp.to_java(ZonedDateTime)
|
64
|
-
else
|
65
|
-
to_zdt(seconds_to_duration(timestamp)) ||
|
66
|
-
raise(ArgumentError, "Timestamp must be a ZonedDateTime, a Duration, a Numeric, or a Time object")
|
67
|
-
end
|
68
|
-
end
|
69
|
-
|
70
|
-
#
|
71
|
-
# Convert numeric seconds to a Duration object
|
72
|
-
#
|
73
|
-
# @param [Float, Integer] secs The number of seconds in integer or float
|
74
|
-
#
|
75
|
-
# @return [Duration]
|
76
|
-
#
|
77
|
-
def self.seconds_to_duration(secs)
|
78
|
-
return unless secs
|
79
|
-
|
80
|
-
if secs.respond_to?(:to_f)
|
81
|
-
secs.to_f.seconds
|
82
|
-
elsif secs.respond_to?(:to_i)
|
83
|
-
secs.to_i.seconds
|
84
|
-
end
|
85
|
-
end
|
86
|
-
end
|
87
|
-
end
|