openhab-scripting 4.26.0 → 4.26.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/openhab/dsl/time/month_day.rb +74 -51
- data/lib/openhab/dsl/types/open_closed_type.rb +2 -2
- data/lib/openhab/version.rb +1 -1
- 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: cd63a855a2b36bd98bbec644125c3d3969b5de15c34a6a068c1569be78af7df7
|
4
|
+
data.tar.gz: 742a8bc187187d0b3efec387286781464567bb87e77723b7c46a97fa5f5b3f82
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7b70022cd9e0fdcc545611ca0a36b5a6122884b8cccfa1f1992cbec7b1d19b24cb86fa55e127b258500c318090dbf0bb9009d3916d32d61c0c2ca3f2e0edb290
|
7
|
+
data.tar.gz: cd6bcd955c3c853bc6e52cdd999e096ca5ecc78bbd61f1db4ff9426395220fe9156a8f458deee0637f85e1c6dc27f2e7b74c8835c2c984d84f2baa92c4a9eb65
|
@@ -1,5 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require 'java'
|
4
|
+
|
3
5
|
module OpenHAB
|
4
6
|
module DSL
|
5
7
|
# Support for time related functions
|
@@ -8,40 +10,21 @@ module OpenHAB
|
|
8
10
|
module MonthDayRange
|
9
11
|
include OpenHAB::Log
|
10
12
|
|
11
|
-
java_import java.time.Year
|
12
|
-
|
13
|
-
# Lambdas are used to calculate the year for the month day
|
14
|
-
# which must happen during evaluation time to support that rules
|
15
|
-
# creation and evaluation for execution are done in distinct phases
|
16
|
-
@current_year = -> { return Year.now }
|
17
|
-
@next_year = -> { return Year.now.plus_years(1) }
|
18
|
-
|
19
|
-
class << self
|
20
|
-
attr_reader :current_year, :next_year
|
21
|
-
end
|
22
|
-
|
23
13
|
# Creates a range that can be compared against MonthDay objects, strings
|
24
14
|
# or anything responding to 'to_date' to see if they are within the range
|
25
15
|
# @return Range object representing a MonthDay Range
|
26
|
-
# rubocop:disable Metrics/AbcSize
|
27
|
-
# Range method cannot be broken up cleaner
|
28
16
|
def self.range(range)
|
29
|
-
logger.trace "Creating MonthDay range from #{range}"
|
30
17
|
raise ArgumentError, 'Supplied object must be a range' unless range.is_a? Range
|
31
18
|
|
32
19
|
start = MonthDay.parse(range.begin)
|
33
20
|
ending = MonthDay.parse(range.end)
|
34
21
|
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
ending_year = ending < start ? next_year : current_year
|
22
|
+
start_range = DayOfYear.new(month_day: start, range: start..ending)
|
23
|
+
ending_range = DayOfYear.new(month_day: ending, range: start..ending)
|
24
|
+
logger.trace "Month Day Range Start(#{start}) - End (#{ending}) - Created from (#{range})"
|
39
25
|
|
40
|
-
start_range = MonthDayRangeElement.new(month_day: start, year: current_year)
|
41
|
-
ending_range = MonthDayRangeElement.new(month_day: ending, year: ending_year)
|
42
26
|
range.exclude_end? ? (start_range...ending_range) : (start_range..ending_range)
|
43
27
|
end
|
44
|
-
# rubocop:enable Metrics/AbcSize
|
45
28
|
|
46
29
|
# Checks if supplied range can be converted to a month day range
|
47
30
|
# @param [Range] range to check begin and end values of
|
@@ -52,54 +35,80 @@ module OpenHAB
|
|
52
35
|
MonthDay.day_of_month?(range.begin) && MonthDay.day_of_month?(range.end)
|
53
36
|
end
|
54
37
|
|
55
|
-
#
|
56
|
-
#
|
57
|
-
|
58
|
-
class MonthDayRangeElement
|
38
|
+
# Converts a MonthDay to a day of year
|
39
|
+
# which is represented as a number from 1 to 732 to support comparisions when the range overlaps a year boundary
|
40
|
+
class DayOfYear
|
59
41
|
include Comparable
|
60
42
|
include OpenHAB::Log
|
61
43
|
java_import java.time.LocalDate
|
62
|
-
|
44
|
+
|
45
|
+
attr_accessor :month_day
|
46
|
+
|
47
|
+
# Number of days in a leap year
|
48
|
+
DAYS_IN_YEAR = 366
|
63
49
|
|
64
50
|
# Create a new MonthDayRange element
|
65
51
|
# @param [MonthDay] MonthDay element
|
66
|
-
# @param [
|
52
|
+
# @param [Range] Underlying MonthDay range
|
67
53
|
#
|
68
|
-
def initialize(month_day:,
|
54
|
+
def initialize(month_day:, range:)
|
69
55
|
@month_day = month_day
|
70
|
-
@
|
71
|
-
end
|
72
|
-
|
73
|
-
# Convert into a LocalDate using year lambda supplied in initializer
|
74
|
-
def to_local_date
|
75
|
-
@year.call.at_month_day(@month_day)
|
56
|
+
@range = range
|
76
57
|
end
|
77
58
|
|
78
59
|
# Returns the MonthDay advanced by 1 day
|
79
60
|
# Required by Range class
|
80
61
|
def succ
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
62
|
+
next_day_of_month = @month_day.day_of_month + 1
|
63
|
+
next_month = @month_day.month_value
|
64
|
+
|
65
|
+
if next_day_of_month > @month_day.month.max_length
|
66
|
+
next_day_of_month = 1
|
67
|
+
next_month = @month_day.month.plus(1).value
|
68
|
+
end
|
69
|
+
|
70
|
+
DayOfYear.new(month_day: MonthDay.of(next_month, next_day_of_month), range: @range)
|
71
|
+
end
|
72
|
+
|
73
|
+
#
|
74
|
+
# Offset by 1 year if the range begin is greater than the range end
|
75
|
+
# and if the month day is less than the begining of the range
|
76
|
+
# @return [Number] 366 if the month_day should be offset by a year
|
77
|
+
def offset
|
78
|
+
@range.begin > @range.end && month_day < @range.begin ? DAYS_IN_YEAR : 0
|
79
|
+
end
|
80
|
+
|
81
|
+
#
|
82
|
+
# Calculate the day within the range for the underlying month day
|
83
|
+
# @return [Number] Representation of the MonthDay as a number from 1 to 732
|
84
|
+
def day_in_range
|
85
|
+
@day_in_range ||= month_day.max_day_of_year + offset
|
85
86
|
end
|
86
87
|
|
87
88
|
# Compare MonthDayRangeElement to other objects as required by Range class
|
88
|
-
# rubocop:disable Metrics/AbcSize
|
89
|
-
# Case statement needs to work against multiple types
|
90
|
-
def <=>(other)
|
89
|
+
def <=>(other) # rubocop:disable Metrics/AbcSize
|
91
90
|
case other
|
92
|
-
when
|
93
|
-
when
|
94
|
-
when
|
91
|
+
when DayOfYear then day_in_range.<=>(other.day_in_range)
|
92
|
+
when MonthDay then self.<=>(DayOfYear.new(month_day: other, range: @range))
|
93
|
+
when LocalDate then self.<=>(MonthDay.of(other.month_value, other.day_of_month))
|
94
|
+
when Date then self.<=>(MonthDay.of(other.month, other.day))
|
95
95
|
else
|
96
|
-
return self.<=>(other.to_local_date) if other.respond_to?
|
97
|
-
return self.<=>(other.to_date) if other.respond_to?
|
96
|
+
return self.<=>(other.to_local_date) if other.respond_to?(:to_local_date)
|
97
|
+
return self.<=>(other.to_date) if other.respond_to?(:to_date)
|
98
98
|
|
99
99
|
raise "Unable to convert #{other.class} to compare to MonthDay"
|
100
100
|
end
|
101
101
|
end
|
102
|
-
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
java_import java.time.Month
|
106
|
+
# Extend Month with helper method
|
107
|
+
class Month
|
108
|
+
# Calcalute and memoize the maximum number of days in a year before this month
|
109
|
+
# @return [Number] maximum nummber of days in a year before this month
|
110
|
+
def max_days_before
|
111
|
+
@max_days_before ||= Month.values.select { |month| month < self }.sum(&:max_length)
|
103
112
|
end
|
104
113
|
end
|
105
114
|
|
@@ -108,6 +117,7 @@ module OpenHAB
|
|
108
117
|
class MonthDay
|
109
118
|
include OpenHAB::Log
|
110
119
|
java_import java.time.format.DateTimeFormatter
|
120
|
+
java_import java.time.Month
|
111
121
|
|
112
122
|
#
|
113
123
|
# Constructor
|
@@ -117,11 +127,9 @@ module OpenHAB
|
|
117
127
|
#
|
118
128
|
# @return [Object] MonthDay object
|
119
129
|
#
|
120
|
-
# rubocop:
|
121
|
-
def self.new(m:, d:)
|
130
|
+
def self.new(m:, d:) # rubocop:disable Naming/MethodParameterName
|
122
131
|
MonthDay.of(m, d)
|
123
132
|
end
|
124
|
-
# rubocop: enable Naming/MethodParameterName
|
125
133
|
|
126
134
|
# Parse MonthDay string as defined with by Monthday class without leading double dash "--"
|
127
135
|
def self.parse(string)
|
@@ -136,11 +144,23 @@ module OpenHAB
|
|
136
144
|
/^-*[01][0-9]-[0-3]\d$/.match? obj.to_s
|
137
145
|
end
|
138
146
|
|
147
|
+
# Get the maximum (supports leap years) day of the year this month day could be
|
148
|
+
def max_day_of_year
|
149
|
+
day_of_month + month.max_days_before
|
150
|
+
end
|
151
|
+
|
139
152
|
# Remove -- from MonthDay string representation
|
140
153
|
def to_s
|
141
154
|
to_string.delete_prefix('--')
|
142
155
|
end
|
143
156
|
|
157
|
+
# Checks if MonthDay is between the dates of the supplied range
|
158
|
+
# @param [Range] range to check against MonthDay
|
159
|
+
# @return [true,false] true if the MonthDay falls within supplied range, false otherwise
|
160
|
+
def between?(range)
|
161
|
+
MonthDayRange.range(range).cover? self
|
162
|
+
end
|
163
|
+
|
144
164
|
# remove the inherited #== method to use our <=> below
|
145
165
|
remove_method :==
|
146
166
|
|
@@ -151,6 +171,9 @@ module OpenHAB
|
|
151
171
|
case other
|
152
172
|
when String
|
153
173
|
self.<=>(MonthDay.parse(other))
|
174
|
+
when OpenHAB::DSL::Between::MonthDayRange::DayOfYear
|
175
|
+
# Compare with DayOfYear and invert result
|
176
|
+
-other.<=>(self)
|
154
177
|
else
|
155
178
|
super
|
156
179
|
end
|
data/lib/openhab/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: openhab-scripting
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 4.26.
|
4
|
+
version: 4.26.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Brian O'Connell
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2022-01-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|