openhab-jrubyscripting 5.0.0.rc1
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 +7 -0
- data/lib/openhab/core/actions.rb +163 -0
- data/lib/openhab/core/entity_lookup.rb +144 -0
- data/lib/openhab/core/events/abstract_event.rb +17 -0
- data/lib/openhab/core/events/item_channel_link.rb +36 -0
- data/lib/openhab/core/events/item_command_event.rb +78 -0
- data/lib/openhab/core/events/item_event.rb +22 -0
- data/lib/openhab/core/events/item_state_changed_event.rb +52 -0
- data/lib/openhab/core/events/item_state_event.rb +51 -0
- data/lib/openhab/core/events/thing.rb +29 -0
- data/lib/openhab/core/events/thing_status_info_event.rb +53 -0
- data/lib/openhab/core/events.rb +10 -0
- data/lib/openhab/core/items/accepted_data_types.rb +29 -0
- data/lib/openhab/core/items/color_item.rb +52 -0
- data/lib/openhab/core/items/contact_item.rb +52 -0
- data/lib/openhab/core/items/date_time_item.rb +58 -0
- data/lib/openhab/core/items/dimmer_item.rb +148 -0
- data/lib/openhab/core/items/generic_item.rb +344 -0
- data/lib/openhab/core/items/group_item.rb +174 -0
- data/lib/openhab/core/items/image_item.rb +109 -0
- data/lib/openhab/core/items/location_item.rb +34 -0
- data/lib/openhab/core/items/metadata/hash.rb +390 -0
- data/lib/openhab/core/items/metadata/namespace_hash.rb +469 -0
- data/lib/openhab/core/items/metadata.rb +11 -0
- data/lib/openhab/core/items/number_item.rb +62 -0
- data/lib/openhab/core/items/numeric_item.rb +22 -0
- data/lib/openhab/core/items/persistence.rb +327 -0
- data/lib/openhab/core/items/player_item.rb +66 -0
- data/lib/openhab/core/items/proxy.rb +59 -0
- data/lib/openhab/core/items/registry.rb +66 -0
- data/lib/openhab/core/items/rollershutter_item.rb +68 -0
- data/lib/openhab/core/items/semantics/enumerable.rb +152 -0
- data/lib/openhab/core/items/semantics.rb +476 -0
- data/lib/openhab/core/items/state_storage.rb +53 -0
- data/lib/openhab/core/items/string_item.rb +28 -0
- data/lib/openhab/core/items/switch_item.rb +78 -0
- data/lib/openhab/core/items.rb +114 -0
- data/lib/openhab/core/lazy_array.rb +52 -0
- data/lib/openhab/core/profile_factory.rb +118 -0
- data/lib/openhab/core/script_handling.rb +55 -0
- data/lib/openhab/core/things/channel.rb +48 -0
- data/lib/openhab/core/things/channel_uid.rb +51 -0
- data/lib/openhab/core/things/item_channel_link.rb +33 -0
- data/lib/openhab/core/things/profile_callback.rb +52 -0
- data/lib/openhab/core/things/proxy.rb +69 -0
- data/lib/openhab/core/things/registry.rb +46 -0
- data/lib/openhab/core/things/thing.rb +194 -0
- data/lib/openhab/core/things.rb +22 -0
- data/lib/openhab/core/timer.rb +128 -0
- data/lib/openhab/core/types/comparable_type.rb +23 -0
- data/lib/openhab/core/types/date_time_type.rb +259 -0
- data/lib/openhab/core/types/decimal_type.rb +192 -0
- data/lib/openhab/core/types/hsb_type.rb +183 -0
- data/lib/openhab/core/types/increase_decrease_type.rb +34 -0
- data/lib/openhab/core/types/next_previous_type.rb +34 -0
- data/lib/openhab/core/types/numeric_type.rb +52 -0
- data/lib/openhab/core/types/on_off_type.rb +46 -0
- data/lib/openhab/core/types/open_closed_type.rb +41 -0
- data/lib/openhab/core/types/percent_type.rb +95 -0
- data/lib/openhab/core/types/play_pause_type.rb +38 -0
- data/lib/openhab/core/types/point_type.rb +117 -0
- data/lib/openhab/core/types/quantity_type.rb +327 -0
- data/lib/openhab/core/types/raw_type.rb +26 -0
- data/lib/openhab/core/types/refresh_type.rb +27 -0
- data/lib/openhab/core/types/rewind_fastforward_type.rb +38 -0
- data/lib/openhab/core/types/stop_move_type.rb +34 -0
- data/lib/openhab/core/types/string_type.rb +76 -0
- data/lib/openhab/core/types/type.rb +117 -0
- data/lib/openhab/core/types/un_def_type.rb +38 -0
- data/lib/openhab/core/types/up_down_type.rb +50 -0
- data/lib/openhab/core/types.rb +69 -0
- data/lib/openhab/core/uid.rb +36 -0
- data/lib/openhab/core.rb +85 -0
- data/lib/openhab/core_ext/java/duration.rb +115 -0
- data/lib/openhab/core_ext/java/local_date.rb +93 -0
- data/lib/openhab/core_ext/java/local_time.rb +106 -0
- data/lib/openhab/core_ext/java/month.rb +59 -0
- data/lib/openhab/core_ext/java/month_day.rb +105 -0
- data/lib/openhab/core_ext/java/period.rb +103 -0
- data/lib/openhab/core_ext/java/temporal_amount.rb +34 -0
- data/lib/openhab/core_ext/java/time.rb +58 -0
- data/lib/openhab/core_ext/java/unit.rb +15 -0
- data/lib/openhab/core_ext/java/zoned_date_time.rb +116 -0
- data/lib/openhab/core_ext/ruby/array.rb +21 -0
- data/lib/openhab/core_ext/ruby/class.rb +15 -0
- data/lib/openhab/core_ext/ruby/date.rb +89 -0
- data/lib/openhab/core_ext/ruby/numeric.rb +190 -0
- data/lib/openhab/core_ext/ruby/range.rb +70 -0
- data/lib/openhab/core_ext/ruby/time.rb +104 -0
- data/lib/openhab/core_ext.rb +18 -0
- data/lib/openhab/dsl/events/watch_event.rb +18 -0
- data/lib/openhab/dsl/events.rb +9 -0
- data/lib/openhab/dsl/gems.rb +3 -0
- data/lib/openhab/dsl/items/builder.rb +618 -0
- data/lib/openhab/dsl/items/ensure.rb +93 -0
- data/lib/openhab/dsl/items/timed_command.rb +236 -0
- data/lib/openhab/dsl/rules/automation_rule.rb +308 -0
- data/lib/openhab/dsl/rules/builder.rb +1373 -0
- data/lib/openhab/dsl/rules/guard.rb +115 -0
- data/lib/openhab/dsl/rules/name_inference.rb +160 -0
- data/lib/openhab/dsl/rules/property.rb +76 -0
- data/lib/openhab/dsl/rules/rule_triggers.rb +96 -0
- data/lib/openhab/dsl/rules/terse.rb +63 -0
- data/lib/openhab/dsl/rules/triggers/changed.rb +169 -0
- data/lib/openhab/dsl/rules/triggers/channel.rb +57 -0
- data/lib/openhab/dsl/rules/triggers/command.rb +107 -0
- data/lib/openhab/dsl/rules/triggers/conditions/duration.rb +161 -0
- data/lib/openhab/dsl/rules/triggers/conditions/proc.rb +164 -0
- data/lib/openhab/dsl/rules/triggers/cron/cron.rb +195 -0
- data/lib/openhab/dsl/rules/triggers/cron/cron_handler.rb +127 -0
- data/lib/openhab/dsl/rules/triggers/trigger.rb +56 -0
- data/lib/openhab/dsl/rules/triggers/updated.rb +130 -0
- data/lib/openhab/dsl/rules/triggers/watch/watch.rb +55 -0
- data/lib/openhab/dsl/rules/triggers/watch/watch_handler.rb +155 -0
- data/lib/openhab/dsl/rules/triggers.rb +12 -0
- data/lib/openhab/dsl/rules.rb +29 -0
- data/lib/openhab/dsl/script_handling.rb +55 -0
- data/lib/openhab/dsl/things/builder.rb +263 -0
- data/lib/openhab/dsl/thread_local.rb +48 -0
- data/lib/openhab/dsl/timer_manager.rb +191 -0
- data/lib/openhab/dsl/version.rb +9 -0
- data/lib/openhab/dsl.rb +686 -0
- data/lib/openhab/log.rb +348 -0
- data/lib/openhab/osgi.rb +70 -0
- data/lib/openhab/rspec/configuration.rb +56 -0
- data/lib/openhab/rspec/example_group.rb +90 -0
- data/lib/openhab/rspec/helpers.rb +439 -0
- data/lib/openhab/rspec/hooks.rb +93 -0
- data/lib/openhab/rspec/jruby.rb +46 -0
- data/lib/openhab/rspec/karaf.rb +811 -0
- data/lib/openhab/rspec/mocks/bundle_install_support.rb +25 -0
- data/lib/openhab/rspec/mocks/bundle_resolver.rb +30 -0
- data/lib/openhab/rspec/mocks/event_admin.rb +146 -0
- data/lib/openhab/rspec/mocks/metadata_provider.rb +75 -0
- data/lib/openhab/rspec/mocks/persistence_service.rb +140 -0
- data/lib/openhab/rspec/mocks/safe_caller.rb +40 -0
- data/lib/openhab/rspec/mocks/synchronous_executor.rb +56 -0
- data/lib/openhab/rspec/mocks/thing_handler.rb +76 -0
- data/lib/openhab/rspec/mocks/timer.rb +95 -0
- data/lib/openhab/rspec/openhab/core/actions.rb +26 -0
- data/lib/openhab/rspec/openhab/core/items/proxy.rb +27 -0
- data/lib/openhab/rspec/openhab/core/things/proxy.rb +27 -0
- data/lib/openhab/rspec/shell.rb +31 -0
- data/lib/openhab/rspec/suspend_rules.rb +60 -0
- data/lib/openhab/rspec.rb +17 -0
- data/lib/openhab/yard/cli/stats.rb +23 -0
- data/lib/openhab/yard/code_objects/group_object.rb +17 -0
- data/lib/openhab/yard/code_objects/java/base.rb +31 -0
- data/lib/openhab/yard/code_objects/java/class_object.rb +11 -0
- data/lib/openhab/yard/code_objects/java/field_object.rb +15 -0
- data/lib/openhab/yard/code_objects/java/interface_object.rb +15 -0
- data/lib/openhab/yard/code_objects/java/package_object.rb +11 -0
- data/lib/openhab/yard/code_objects/java/proxy.rb +23 -0
- data/lib/openhab/yard/handlers/jruby/base.rb +49 -0
- data/lib/openhab/yard/handlers/jruby/class_handler.rb +18 -0
- data/lib/openhab/yard/handlers/jruby/constant_handler.rb +18 -0
- data/lib/openhab/yard/handlers/jruby/java_import_handler.rb +27 -0
- data/lib/openhab/yard/handlers/jruby/mixin_handler.rb +23 -0
- data/lib/openhab/yard/html_helper.rb +44 -0
- data/lib/openhab/yard/tags/constant_directive.rb +20 -0
- data/lib/openhab/yard/tags/group_directive.rb +24 -0
- data/lib/openhab/yard/tags/library.rb +3 -0
- data/lib/openhab/yard.rb +32 -0
- metadata +504 -0
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative "time"
|
|
4
|
+
|
|
5
|
+
module OpenHAB
|
|
6
|
+
module CoreExt
|
|
7
|
+
module Java
|
|
8
|
+
java_import java.time.LocalTime
|
|
9
|
+
|
|
10
|
+
#
|
|
11
|
+
# @example
|
|
12
|
+
# break_time = LocalTime::NOON
|
|
13
|
+
#
|
|
14
|
+
# if LocalTime.now > LocalTime.of(17, 30) # comparing two LocalTime objects
|
|
15
|
+
# # do something
|
|
16
|
+
# elsif LocalTime.now < LocalTime.parse('8:30') # comparison against a string
|
|
17
|
+
# # do something
|
|
18
|
+
# end
|
|
19
|
+
# four_pm = LocalTime.parse('16:00')
|
|
20
|
+
#
|
|
21
|
+
# @example
|
|
22
|
+
# # Trigger security light between sunset and sunrise when motion is detected
|
|
23
|
+
# rule 'Outside Light Motion' do
|
|
24
|
+
# updated Motion_Sensor, to: OPEN
|
|
25
|
+
# run do
|
|
26
|
+
# astro = things['astro:sun:home']
|
|
27
|
+
# sunrise = astro.get_event_time('SUN_RISE', nil, nil).to_local_time
|
|
28
|
+
# sunset = astro.get_event_time('SUN_SET', nil, nil).to_local_time
|
|
29
|
+
# next if (sunrise..sunset).cover?(Time.now)
|
|
30
|
+
#
|
|
31
|
+
# Security_Light.on for: 10.minutes
|
|
32
|
+
# end
|
|
33
|
+
# end
|
|
34
|
+
#
|
|
35
|
+
class LocalTime
|
|
36
|
+
include Time
|
|
37
|
+
|
|
38
|
+
# @!visibility private
|
|
39
|
+
class << self
|
|
40
|
+
#
|
|
41
|
+
# Parses strings in the form "h[:mm[:ss]] [am/pm]"
|
|
42
|
+
#
|
|
43
|
+
# @param [String] string
|
|
44
|
+
# @return [LocalTime]
|
|
45
|
+
#
|
|
46
|
+
def parse(string)
|
|
47
|
+
format = /(am|pm)$/i.match?(string) ? "h[:mm[:ss][.S]][ ]a" : "H[:mm[:ss][.S]]"
|
|
48
|
+
java_send(:parse, [java.lang.CharSequence, java.time.format.DateTimeFormatter],
|
|
49
|
+
string, java.time.format.DateTimeFormatterBuilder.new
|
|
50
|
+
.parse_case_insensitive
|
|
51
|
+
.parse_lenient
|
|
52
|
+
.append_pattern(format)
|
|
53
|
+
.to_formatter(java.util.Locale::ENGLISH))
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
# @param [TemporalAmount, Numeric] other
|
|
58
|
+
# If other is a Numeric, it's interpreted as seconds.
|
|
59
|
+
# @return [LocalTime]
|
|
60
|
+
def -(other)
|
|
61
|
+
return minus(other.seconds) if other.is_a?(Numeric)
|
|
62
|
+
return self if other.is_a?(Period)
|
|
63
|
+
|
|
64
|
+
minus(other)
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
# @param [TemporalAmount, Numeric] other
|
|
68
|
+
# If other is a Numeric, it's interpreted as seconds.
|
|
69
|
+
# @return [LocalTime]
|
|
70
|
+
def +(other)
|
|
71
|
+
return plus(other.seconds) if other.is_a?(Numeric)
|
|
72
|
+
return self if other.is_a?(Period)
|
|
73
|
+
|
|
74
|
+
plus(other)
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
#
|
|
78
|
+
# Returns the next second
|
|
79
|
+
#
|
|
80
|
+
# Will loop back to the beginning of the day if necessary.
|
|
81
|
+
#
|
|
82
|
+
# @return [LocalTime]
|
|
83
|
+
#
|
|
84
|
+
def succ
|
|
85
|
+
plus_seconds(1)
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
# @return [self]
|
|
89
|
+
def to_local_time
|
|
90
|
+
self
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
# @param [ZonedDateTime, nil] context
|
|
94
|
+
# A {ZonedDateTime} used to fill in missing fields
|
|
95
|
+
# during conversion. {ZonedDateTime.now} is assumed if not given.
|
|
96
|
+
# @return [ZonedDateTime]
|
|
97
|
+
def to_zoned_date_time(context = nil)
|
|
98
|
+
context ||= ZonedDateTime.now
|
|
99
|
+
context.with(self)
|
|
100
|
+
end
|
|
101
|
+
end
|
|
102
|
+
end
|
|
103
|
+
end
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
LocalTime = OpenHAB::CoreExt::Java::LocalTime unless Object.const_defined?(:LocalTime)
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative "time"
|
|
4
|
+
|
|
5
|
+
module OpenHAB
|
|
6
|
+
module CoreExt
|
|
7
|
+
module Java
|
|
8
|
+
java_import java.time.Month
|
|
9
|
+
|
|
10
|
+
# Extensions to Month
|
|
11
|
+
class Month
|
|
12
|
+
include Time
|
|
13
|
+
|
|
14
|
+
#
|
|
15
|
+
# Returns the next month
|
|
16
|
+
#
|
|
17
|
+
# Will loop back to January if necessary.
|
|
18
|
+
#
|
|
19
|
+
# @return [Month]
|
|
20
|
+
#
|
|
21
|
+
def succ
|
|
22
|
+
plus(1)
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
# @return [LocalDate]
|
|
26
|
+
def to_local_date(context = nil)
|
|
27
|
+
context ||= java.time.Year.now
|
|
28
|
+
year = java.time.Year.from(context)
|
|
29
|
+
year.at_month_day(to_month_day)
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
# @return [Date]
|
|
33
|
+
def to_date(context = nil)
|
|
34
|
+
to_local_date(context).to_date
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
# @return [self]
|
|
38
|
+
def to_month
|
|
39
|
+
self
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
# @return [MonthDay]
|
|
43
|
+
def to_month_day
|
|
44
|
+
MonthDay.of(self, 1)
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
# @param [ZonedDateTime, nil] context
|
|
48
|
+
# A {ZonedDateTime} used to fill in missing fields
|
|
49
|
+
# during conversion. {ZonedDateTime.now} is assumed if not given.
|
|
50
|
+
# @return [ZonedDateTime]
|
|
51
|
+
def to_zoned_date_time(context = nil)
|
|
52
|
+
to_local_date(context).to_zoned_date_time
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
Month = OpenHAB::CoreExt::Java::Month unless Object.const_defined?(:Month)
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative "time"
|
|
4
|
+
|
|
5
|
+
module OpenHAB
|
|
6
|
+
module CoreExt
|
|
7
|
+
module Java
|
|
8
|
+
java_import java.time.MonthDay
|
|
9
|
+
|
|
10
|
+
# Extensions to MonthDay
|
|
11
|
+
class MonthDay
|
|
12
|
+
class << self
|
|
13
|
+
#
|
|
14
|
+
# Parses strings in the form "M-d"
|
|
15
|
+
#
|
|
16
|
+
# @param [String] string
|
|
17
|
+
# @return [MonthDay]
|
|
18
|
+
#
|
|
19
|
+
def parse(string)
|
|
20
|
+
logger.trace("#{self.class}.parse #{string} (#{string.class})")
|
|
21
|
+
java_send(:parse, [java.lang.CharSequence, java.time.format.DateTimeFormatter],
|
|
22
|
+
string.to_s,
|
|
23
|
+
java.time.format.DateTimeFormatter.ofPattern("[--]M-d"))
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
# @return [String]
|
|
28
|
+
def to_s
|
|
29
|
+
# Remove -- from MonthDay string representation
|
|
30
|
+
to_string.delete_prefix("--")
|
|
31
|
+
end
|
|
32
|
+
alias_method :inspect, :to_s
|
|
33
|
+
|
|
34
|
+
# wait until we redefine #to_s
|
|
35
|
+
include Time
|
|
36
|
+
|
|
37
|
+
# @return [MonthDay]
|
|
38
|
+
def +(other)
|
|
39
|
+
(LocalDate.of(1900, month, day_of_month) + other).to_month_day
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
# @return [MonthDay, Period]
|
|
43
|
+
def -(other)
|
|
44
|
+
d = (LocalDate.of(1900, month, day_of_month) - other)
|
|
45
|
+
return d if d.is_a?(java.time.Period)
|
|
46
|
+
|
|
47
|
+
d.to_month_day
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
#
|
|
51
|
+
# Returns the next day
|
|
52
|
+
#
|
|
53
|
+
# Will go to the next month, or loop back to January if necessary.
|
|
54
|
+
#
|
|
55
|
+
# @return [MonthDay]
|
|
56
|
+
#
|
|
57
|
+
def succ
|
|
58
|
+
if day_of_month == month.max_length
|
|
59
|
+
return MonthDay.of(1, 1) if month_value == 12
|
|
60
|
+
|
|
61
|
+
return MonthDay.of(month_value + 1, 1)
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
MonthDay.of(month_value, day_of_month + 1)
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
# @param [TemporalAmount, nil] context
|
|
68
|
+
# A {TemporalAmount} used to fill in missing
|
|
69
|
+
# fields during conversion. {LocalDate.now} is assumed if not given.
|
|
70
|
+
# @return [LocalDate]
|
|
71
|
+
def to_local_date(context = nil)
|
|
72
|
+
context ||= java.time.Year.now
|
|
73
|
+
year = java.time.Year.from(context)
|
|
74
|
+
year.at_month_day(self)
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
alias_method :to_month, :month
|
|
78
|
+
|
|
79
|
+
# @param [Date, nil] context
|
|
80
|
+
# A {Date} used to fill in missing fields
|
|
81
|
+
# during conversion. `Date.today` is assumed if not given.
|
|
82
|
+
# @return [Date]
|
|
83
|
+
def to_date(context = nil)
|
|
84
|
+
context ||= Date.today
|
|
85
|
+
Date.new(context.year, month_value, day_of_month)
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
# @return [self]
|
|
89
|
+
def to_month_day
|
|
90
|
+
self
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
# @param [ZonedDateTime, nil] context
|
|
94
|
+
# A {ZonedDateTime} used to fill in missing fields
|
|
95
|
+
# during conversion. {ZonedDateTime.now} is assumed if not given.
|
|
96
|
+
# @return [ZonedDateTime]
|
|
97
|
+
def to_zoned_date_time(context = nil)
|
|
98
|
+
to_local_date(context).to_zoned_date_time(context)
|
|
99
|
+
end
|
|
100
|
+
end
|
|
101
|
+
end
|
|
102
|
+
end
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
MonthDay = OpenHAB::CoreExt::Java::MonthDay unless Object.const_defined?(:MonthDay)
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module OpenHAB
|
|
4
|
+
module CoreExt
|
|
5
|
+
module Java
|
|
6
|
+
java_import java.time.Period
|
|
7
|
+
|
|
8
|
+
# Extensions to Period
|
|
9
|
+
class Period
|
|
10
|
+
# @!parse include TemporalAmount
|
|
11
|
+
|
|
12
|
+
#
|
|
13
|
+
# Convert to number of seconds
|
|
14
|
+
#
|
|
15
|
+
# @return [Integer]
|
|
16
|
+
#
|
|
17
|
+
def to_i
|
|
18
|
+
[java.time.temporal.ChronoUnit::YEARS,
|
|
19
|
+
java.time.temporal.ChronoUnit::MONTHS,
|
|
20
|
+
java.time.temporal.ChronoUnit::DAYS].sum do |unit|
|
|
21
|
+
get(unit) * unit.duration.to_i
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
#
|
|
26
|
+
# Convert to number of seconds
|
|
27
|
+
#
|
|
28
|
+
# @return [Float]
|
|
29
|
+
#
|
|
30
|
+
def to_f
|
|
31
|
+
to_i.to_f
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
remove_method :==
|
|
35
|
+
|
|
36
|
+
# @return [Integer, nil]
|
|
37
|
+
def <=>(other)
|
|
38
|
+
return to_i <=> other if other.is_a?(Numeric)
|
|
39
|
+
|
|
40
|
+
super
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
#
|
|
44
|
+
# Convert `self` and `other` to {Duration}, if `other` is a Numeric
|
|
45
|
+
#
|
|
46
|
+
# @param [Numeric] other
|
|
47
|
+
# @return [Array, nil]
|
|
48
|
+
#
|
|
49
|
+
def coerce(other)
|
|
50
|
+
return [other.seconds, to_i.seconds] if other.is_a?(Numeric)
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
{
|
|
54
|
+
plus: :+,
|
|
55
|
+
minus: :-
|
|
56
|
+
}.each do |java_op, ruby_op|
|
|
57
|
+
# def +(other)
|
|
58
|
+
# if other.is_a?(Period)
|
|
59
|
+
# plus(other)
|
|
60
|
+
# elsif other.is_a?(Numeric)
|
|
61
|
+
# self + other.seconds
|
|
62
|
+
# elsif other.respond_to?(:coerce) && (rhs, lhs = other.coerce(self))
|
|
63
|
+
# lhs + rhs
|
|
64
|
+
# else
|
|
65
|
+
# raise TypeError, "#{other.class} can't be coerced into Period"
|
|
66
|
+
# end
|
|
67
|
+
# end
|
|
68
|
+
class_eval <<~RUBY, __FILE__, __LINE__ + 1 # rubocop:disable Style/DocumentDynamicEvalDefinition
|
|
69
|
+
def #{ruby_op}(other)
|
|
70
|
+
if other.is_a?(Period)
|
|
71
|
+
#{java_op}(other)
|
|
72
|
+
elsif other.is_a?(Numeric)
|
|
73
|
+
self #{ruby_op} other.seconds
|
|
74
|
+
elsif other.respond_to?(:coerce) && (rhs, lhs = other.coerce(self))
|
|
75
|
+
lhs #{ruby_op} rhs
|
|
76
|
+
else
|
|
77
|
+
raise TypeError, "\#{other.class} can't be coerced into Period"
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
RUBY
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
# @!visibility private
|
|
84
|
+
def *(other)
|
|
85
|
+
if other.is_a?(Integer)
|
|
86
|
+
multipliedBy(other)
|
|
87
|
+
elsif other.respond_to?(:coerce) && (rhs, lhs = other.coerce(self))
|
|
88
|
+
lhs * rhs
|
|
89
|
+
else
|
|
90
|
+
raise TypeError, "#{other.class} can't be coerced into Period"
|
|
91
|
+
end
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
# @!visibility private
|
|
95
|
+
def /(other)
|
|
96
|
+
to_f.seconds / other
|
|
97
|
+
end
|
|
98
|
+
end
|
|
99
|
+
end
|
|
100
|
+
end
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
Period = OpenHAB::CoreExt::Java::Period unless Object.const_defined?(:Period)
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module OpenHAB
|
|
4
|
+
module CoreExt
|
|
5
|
+
module Java
|
|
6
|
+
java_import java.time.temporal.TemporalAmount
|
|
7
|
+
|
|
8
|
+
# Extensions to TemporalAmount
|
|
9
|
+
module TemporalAmount
|
|
10
|
+
# Subtract `self` to {ZonedDateTime.now}
|
|
11
|
+
# @return [ZonedDateTime]
|
|
12
|
+
def ago
|
|
13
|
+
ZonedDateTime.now - self
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
# Add `self` to {ZonedDateTime.now}
|
|
17
|
+
# @return [ZonedDateTime]
|
|
18
|
+
def from_now
|
|
19
|
+
ZonedDateTime.now + self
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
# @return [TemporalAmount]
|
|
23
|
+
def -@
|
|
24
|
+
negated
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
# @return [String]
|
|
28
|
+
def inspect
|
|
29
|
+
to_s
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module OpenHAB
|
|
4
|
+
module CoreExt
|
|
5
|
+
module Java
|
|
6
|
+
# Common extensions to Java Date/Time classes
|
|
7
|
+
module Time
|
|
8
|
+
# @!parse include Comparable
|
|
9
|
+
|
|
10
|
+
# @!visibility private
|
|
11
|
+
module ClassMethods
|
|
12
|
+
# The method used to convert another object to this class
|
|
13
|
+
def coercion_method
|
|
14
|
+
@coercion_method ||= :"to_#{java_class.simple_name.gsub(/[A-Z]/, "_\\0").downcase[1..]}"
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
# Translate java.time.format.DateTimeParseException to ArgumentError
|
|
18
|
+
def parse(*)
|
|
19
|
+
super
|
|
20
|
+
rescue java.time.format.DateTimeParseException => e
|
|
21
|
+
raise ArgumentError, e.message
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
# @!visibility private
|
|
26
|
+
def self.included(klass)
|
|
27
|
+
klass.singleton_class.prepend(ClassMethods)
|
|
28
|
+
klass.remove_method(:==)
|
|
29
|
+
klass.alias_method(:inspect, :to_s)
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
#
|
|
33
|
+
# Compare against another time object
|
|
34
|
+
#
|
|
35
|
+
# @param [Object] other The other time object to compare against.
|
|
36
|
+
#
|
|
37
|
+
# @return [Integer] -1, 0, +1 depending on whether `other` is
|
|
38
|
+
# less than, equal to, or greater than self
|
|
39
|
+
#
|
|
40
|
+
def <=>(other)
|
|
41
|
+
if other.is_a?(self.class)
|
|
42
|
+
compare_to(other)
|
|
43
|
+
elsif other.respond_to?(:coerce)
|
|
44
|
+
return nil unless (lhs, rhs = other.coerce(self))
|
|
45
|
+
|
|
46
|
+
lhs <=> rhs
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
# Convert `other` to this class, if possible
|
|
51
|
+
# @return [Array, nil]
|
|
52
|
+
def coerce(other)
|
|
53
|
+
[other.send(self.class.coercion_method), self] if other.respond_to?(self.class.coercion_method)
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
end
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# @!visibility private
|
|
4
|
+
module Java::JavaxMeasure::Unit # rubocop:disable Style/ClassAndModuleChildren
|
|
5
|
+
def inspect
|
|
6
|
+
to_s
|
|
7
|
+
end
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
# @!visibility private
|
|
11
|
+
module Java::JavaxMeasure::Dimension # rubocop:disable Style/ClassAndModuleChildren
|
|
12
|
+
def inspect
|
|
13
|
+
to_s
|
|
14
|
+
end
|
|
15
|
+
end
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative "time"
|
|
4
|
+
|
|
5
|
+
module OpenHAB
|
|
6
|
+
module CoreExt
|
|
7
|
+
module Java
|
|
8
|
+
ZonedDateTime = java.time.ZonedDateTime
|
|
9
|
+
|
|
10
|
+
# Extensions to ZonedDateTime
|
|
11
|
+
class ZonedDateTime
|
|
12
|
+
include Time
|
|
13
|
+
|
|
14
|
+
class << self # rubocop:disable Lint/EmptyClass
|
|
15
|
+
# @!attribute [r] now
|
|
16
|
+
# @return [ZonedDateTime]
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
alias_method :to_local_time, :toLocalTime
|
|
20
|
+
alias_method :to_month, :month
|
|
21
|
+
|
|
22
|
+
# @param [TemporalAmount, #to_zoned_date_time, Numeric] other
|
|
23
|
+
# If other is a Numeric, it's interpreted as seconds.
|
|
24
|
+
# @return [Duration] If other responds to #to_zoned_date_time
|
|
25
|
+
# @return [ZonedDateTime] If other is a TemporalAmount
|
|
26
|
+
def -(other)
|
|
27
|
+
if other.respond_to?(:to_zoned_date_time)
|
|
28
|
+
nanos = other.to_zoned_date_time.until(self, java.time.temporal.ChronoUnit::NANOS)
|
|
29
|
+
(nanos.to_f / 1_000_000_000).seconds
|
|
30
|
+
elsif other.is_a?(Numeric)
|
|
31
|
+
minus(other.seconds)
|
|
32
|
+
else
|
|
33
|
+
minus(other)
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
# @param [TemporalAmount, Numeric] other
|
|
38
|
+
# If other is a Numeric, it's interpreted as seconds.
|
|
39
|
+
# @return [ZonedDateTime]
|
|
40
|
+
def +(other)
|
|
41
|
+
return plus(other.seconds) if other.is_a?(Numeric)
|
|
42
|
+
|
|
43
|
+
plus(other)
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
#
|
|
47
|
+
# The number of seconds since the Unix epoch.
|
|
48
|
+
#
|
|
49
|
+
# @return [Integer]
|
|
50
|
+
def to_i
|
|
51
|
+
to_instant.epoch_second
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
#
|
|
55
|
+
# The number of seconds since the Unix epoch.
|
|
56
|
+
#
|
|
57
|
+
# @return [Float]
|
|
58
|
+
def to_f
|
|
59
|
+
to_instant.to_epoch_milli / 1000.0
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
# @return [Date]
|
|
63
|
+
def to_date
|
|
64
|
+
Date.new(year, month_value, day_of_month)
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
# @return [LocalDate]
|
|
68
|
+
def to_local_date(_context = nil)
|
|
69
|
+
toLocalDate
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
# @return [MonthDay]
|
|
73
|
+
def to_month_day
|
|
74
|
+
MonthDay.of(month, day_of_month)
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
# This comes from JRuby
|
|
78
|
+
|
|
79
|
+
# @!method to_time
|
|
80
|
+
# @return [Time]
|
|
81
|
+
|
|
82
|
+
# @param [ZonedDateTime, nil] context
|
|
83
|
+
# A {ZonedDateTime} used to fill in missing fields
|
|
84
|
+
# during conversion. Not used in this class.
|
|
85
|
+
# @return [self]
|
|
86
|
+
def to_zoned_date_time(context = nil) # rubocop:disable Lint/UnusedMethodArgument
|
|
87
|
+
self
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
# @return [Integer, nil]
|
|
91
|
+
def <=>(other)
|
|
92
|
+
# compare instants, otherwise it will differ by timezone, which we don't want
|
|
93
|
+
# (use eql? if you care about that)
|
|
94
|
+
if other.respond_to?(:to_zoned_date_time)
|
|
95
|
+
return to_instant.compare_to(other.to_zoned_date_time(self).to_instant)
|
|
96
|
+
end
|
|
97
|
+
return nil unless (lhs, rhs = other.coerce(self))
|
|
98
|
+
|
|
99
|
+
lhs <=> rhs
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
#
|
|
103
|
+
# Converts `other` to {ZonedDateTime}, if possible
|
|
104
|
+
#
|
|
105
|
+
# @param [#to_zoned_date_time] other
|
|
106
|
+
# @return [Array, nil]
|
|
107
|
+
#
|
|
108
|
+
def coerce(other)
|
|
109
|
+
[other.to_zoned_date_time(self), self] if other.respond_to?(:to_zoned_date_time)
|
|
110
|
+
end
|
|
111
|
+
end
|
|
112
|
+
end
|
|
113
|
+
end
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
# @!parse ZonedDateTime = OpenHAB::CoreExt::Java::ZonedDateTime
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# Extensions to Array
|
|
4
|
+
class Array
|
|
5
|
+
#
|
|
6
|
+
# Ensure an object is an array, by wrapping
|
|
7
|
+
# it in an array if it's not already an array.
|
|
8
|
+
# @return [Array]
|
|
9
|
+
#
|
|
10
|
+
# @see https://github.com/rails/rails/blob/main/activesupport/lib/active_support/core_ext/array/wrap.rb
|
|
11
|
+
#
|
|
12
|
+
def self.wrap(object)
|
|
13
|
+
if object.nil?
|
|
14
|
+
[]
|
|
15
|
+
elsif object.respond_to?(:to_ary)
|
|
16
|
+
object.to_ary
|
|
17
|
+
else
|
|
18
|
+
[object]
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# Extensions to Class
|
|
4
|
+
class Class
|
|
5
|
+
#
|
|
6
|
+
# Returns the name of the class, without any containing module or package.
|
|
7
|
+
#
|
|
8
|
+
# @return [String, nil]
|
|
9
|
+
#
|
|
10
|
+
def simple_name
|
|
11
|
+
return unless name
|
|
12
|
+
|
|
13
|
+
@simple_name ||= java_class&.simple_name || name.split("::").last
|
|
14
|
+
end
|
|
15
|
+
end
|