openhab-scripting 2.16.2 → 2.16.3

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.
Files changed (112) hide show
  1. checksums.yaml +4 -4
  2. data/lib/openhab.rb +12 -16
  3. data/lib/openhab/core/entity_lookup.rb +162 -0
  4. data/lib/openhab/core/openhab_setup.rb +31 -0
  5. data/lib/openhab/core/osgi.rb +61 -0
  6. data/lib/openhab/dsl/actions.rb +105 -0
  7. data/lib/openhab/dsl/dsl.rb +47 -0
  8. data/lib/openhab/{core/dsl → dsl}/gems.rb +0 -1
  9. data/lib/openhab/dsl/group.rb +100 -0
  10. data/lib/openhab/dsl/items/items.rb +46 -0
  11. data/lib/openhab/dsl/items/number_item.rb +352 -0
  12. data/lib/openhab/dsl/items/string_item.rb +120 -0
  13. data/lib/openhab/dsl/monkey_patch/actions/actions.rb +4 -0
  14. data/lib/openhab/dsl/monkey_patch/actions/script_thing_actions.rb +32 -0
  15. data/lib/openhab/dsl/monkey_patch/events/events.rb +5 -0
  16. data/lib/openhab/dsl/monkey_patch/events/item_command.rb +23 -0
  17. data/lib/openhab/dsl/monkey_patch/events/item_state_changed.rb +35 -0
  18. data/lib/openhab/dsl/monkey_patch/events/thing_status_info.rb +33 -0
  19. data/lib/openhab/dsl/monkey_patch/items/contact_item.rb +61 -0
  20. data/lib/openhab/dsl/monkey_patch/items/dimmer_item.rb +193 -0
  21. data/lib/openhab/dsl/monkey_patch/items/group_item.rb +37 -0
  22. data/lib/openhab/dsl/monkey_patch/items/items.rb +133 -0
  23. data/lib/openhab/dsl/monkey_patch/items/metadata.rb +281 -0
  24. data/lib/openhab/dsl/monkey_patch/items/persistence.rb +70 -0
  25. data/lib/openhab/dsl/monkey_patch/items/switch_item.rb +95 -0
  26. data/lib/openhab/dsl/monkey_patch/ruby/number.rb +39 -0
  27. data/lib/openhab/dsl/monkey_patch/ruby/range.rb +47 -0
  28. data/lib/openhab/dsl/monkey_patch/ruby/ruby.rb +7 -0
  29. data/lib/openhab/dsl/monkey_patch/ruby/string.rb +41 -0
  30. data/lib/openhab/dsl/monkey_patch/types/decimal_type.rb +70 -0
  31. data/lib/openhab/dsl/monkey_patch/types/on_off_type.rb +51 -0
  32. data/lib/openhab/dsl/monkey_patch/types/open_closed_type.rb +36 -0
  33. data/lib/openhab/dsl/monkey_patch/types/percent_type.rb +32 -0
  34. data/lib/openhab/dsl/monkey_patch/types/quantity_type.rb +69 -0
  35. data/lib/openhab/dsl/monkey_patch/types/types.rb +8 -0
  36. data/lib/openhab/dsl/persistence.rb +25 -0
  37. data/lib/openhab/dsl/rules/automation_rule.rb +342 -0
  38. data/lib/openhab/dsl/rules/guard.rb +134 -0
  39. data/lib/openhab/dsl/rules/property.rb +102 -0
  40. data/lib/openhab/dsl/rules/rule.rb +116 -0
  41. data/lib/openhab/dsl/rules/rule_config.rb +151 -0
  42. data/lib/openhab/dsl/rules/triggers/changed.rb +143 -0
  43. data/lib/openhab/dsl/rules/triggers/channel.rb +53 -0
  44. data/lib/openhab/dsl/rules/triggers/command.rb +104 -0
  45. data/lib/openhab/dsl/rules/triggers/cron.rb +177 -0
  46. data/lib/openhab/dsl/rules/triggers/trigger.rb +124 -0
  47. data/lib/openhab/dsl/rules/triggers/updated.rb +98 -0
  48. data/lib/openhab/dsl/states.rb +61 -0
  49. data/lib/openhab/dsl/things.rb +91 -0
  50. data/lib/openhab/dsl/time_of_day.rb +228 -0
  51. data/lib/openhab/dsl/timers.rb +77 -0
  52. data/lib/openhab/dsl/types/quantity.rb +290 -0
  53. data/lib/openhab/dsl/units.rb +39 -0
  54. data/lib/openhab/log/configuration.rb +21 -0
  55. data/lib/openhab/log/logger.rb +172 -0
  56. data/lib/openhab/version.rb +1 -1
  57. metadata +55 -58
  58. data/lib/openhab/configuration.rb +0 -16
  59. data/lib/openhab/core/cron.rb +0 -27
  60. data/lib/openhab/core/debug.rb +0 -34
  61. data/lib/openhab/core/dsl.rb +0 -51
  62. data/lib/openhab/core/dsl/actions.rb +0 -107
  63. data/lib/openhab/core/dsl/entities.rb +0 -147
  64. data/lib/openhab/core/dsl/group.rb +0 -102
  65. data/lib/openhab/core/dsl/items/items.rb +0 -51
  66. data/lib/openhab/core/dsl/items/number_item.rb +0 -323
  67. data/lib/openhab/core/dsl/items/string_item.rb +0 -122
  68. data/lib/openhab/core/dsl/monkey_patch/actions/actions.rb +0 -4
  69. data/lib/openhab/core/dsl/monkey_patch/actions/script_thing_actions.rb +0 -22
  70. data/lib/openhab/core/dsl/monkey_patch/events.rb +0 -5
  71. data/lib/openhab/core/dsl/monkey_patch/events/item_command.rb +0 -13
  72. data/lib/openhab/core/dsl/monkey_patch/events/item_state_changed.rb +0 -25
  73. data/lib/openhab/core/dsl/monkey_patch/events/thing_status_info.rb +0 -26
  74. data/lib/openhab/core/dsl/monkey_patch/items/contact_item.rb +0 -54
  75. data/lib/openhab/core/dsl/monkey_patch/items/dimmer_item.rb +0 -182
  76. data/lib/openhab/core/dsl/monkey_patch/items/group_item.rb +0 -27
  77. data/lib/openhab/core/dsl/monkey_patch/items/items.rb +0 -132
  78. data/lib/openhab/core/dsl/monkey_patch/items/metadata.rb +0 -283
  79. data/lib/openhab/core/dsl/monkey_patch/items/persistence.rb +0 -72
  80. data/lib/openhab/core/dsl/monkey_patch/items/switch_item.rb +0 -87
  81. data/lib/openhab/core/dsl/monkey_patch/ruby/number.rb +0 -41
  82. data/lib/openhab/core/dsl/monkey_patch/ruby/range.rb +0 -47
  83. data/lib/openhab/core/dsl/monkey_patch/ruby/ruby.rb +0 -7
  84. data/lib/openhab/core/dsl/monkey_patch/ruby/string.rb +0 -43
  85. data/lib/openhab/core/dsl/monkey_patch/types/decimal_type.rb +0 -60
  86. data/lib/openhab/core/dsl/monkey_patch/types/on_off_type.rb +0 -41
  87. data/lib/openhab/core/dsl/monkey_patch/types/open_closed_type.rb +0 -25
  88. data/lib/openhab/core/dsl/monkey_patch/types/percent_type.rb +0 -23
  89. data/lib/openhab/core/dsl/monkey_patch/types/quantity_type.rb +0 -58
  90. data/lib/openhab/core/dsl/monkey_patch/types/types.rb +0 -8
  91. data/lib/openhab/core/dsl/persistence.rb +0 -27
  92. data/lib/openhab/core/dsl/property.rb +0 -96
  93. data/lib/openhab/core/dsl/rule/automation_rule.rb +0 -345
  94. data/lib/openhab/core/dsl/rule/guard.rb +0 -136
  95. data/lib/openhab/core/dsl/rule/rule.rb +0 -117
  96. data/lib/openhab/core/dsl/rule/rule_config.rb +0 -153
  97. data/lib/openhab/core/dsl/rule/triggers/changed.rb +0 -145
  98. data/lib/openhab/core/dsl/rule/triggers/channel.rb +0 -55
  99. data/lib/openhab/core/dsl/rule/triggers/command.rb +0 -106
  100. data/lib/openhab/core/dsl/rule/triggers/cron.rb +0 -160
  101. data/lib/openhab/core/dsl/rule/triggers/trigger.rb +0 -126
  102. data/lib/openhab/core/dsl/rule/triggers/updated.rb +0 -100
  103. data/lib/openhab/core/dsl/states.rb +0 -63
  104. data/lib/openhab/core/dsl/things.rb +0 -93
  105. data/lib/openhab/core/dsl/time_of_day.rb +0 -231
  106. data/lib/openhab/core/dsl/timers.rb +0 -79
  107. data/lib/openhab/core/dsl/types/quantity.rb +0 -292
  108. data/lib/openhab/core/dsl/units.rb +0 -41
  109. data/lib/openhab/core/log.rb +0 -170
  110. data/lib/openhab/core/patch_load_path.rb +0 -7
  111. data/lib/openhab/core/startup_delay.rb +0 -23
  112. data/lib/openhab/osgi.rb +0 -59
@@ -1,79 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'java'
4
- require 'delegate'
5
- require 'forwardable'
6
-
7
- module OpenHAB
8
- module Core
9
- module DSL
10
- #
11
- # Provides access to and ruby wrappers around OpenHAB timers
12
- #
13
- module Timers
14
- java_import org.openhab.core.model.script.actions.ScriptExecution
15
- java_import java.time.ZonedDateTime
16
-
17
- # Ruby wrapper for OpenHAB Timer
18
- # This class implements delegator to delegate methods to the OpenHAB timer
19
- #
20
- # @author Brian O'Connell
21
- # @since 2.0.0
22
- class Timer < SimpleDelegator
23
- extend Forwardable
24
-
25
- def_delegator :@timer, :is_active, :active?
26
- def_delegator :@timer, :is_running, :running?
27
- def_delegator :@timer, :has_terminated, :terminated?
28
-
29
- #
30
- # Create a new Timer Object
31
- #
32
- # @param [Duration] duration Duration until timer should fire
33
- # @param [Block] block Block to execute when timer fires
34
- #
35
- def initialize(duration:, &block)
36
- @duration = duration
37
-
38
- # A semaphore is used to prevent a race condition in which calling the block from the timer thread
39
- # occurs before the @timer variable can be set resulting in @timer being nil
40
- semaphore = Mutex.new
41
-
42
- timer_block = proc { semaphore.synchronize { block.call(self) } }
43
-
44
- semaphore.synchronize do
45
- @timer = ScriptExecution.createTimer(
46
- ZonedDateTime.now.plus(@duration), timer_block
47
- )
48
- super(@timer)
49
- end
50
- end
51
-
52
- #
53
- # Reschedule timer
54
- #
55
- # @param [Duration] duration
56
- #
57
- # @return [<Type>] <description>
58
- #
59
- def reschedule(duration = nil)
60
- duration ||= @duration
61
- @timer.reschedule(ZonedDateTime.now.plus(duration))
62
- end
63
- end
64
-
65
- #
66
- # Execute the supplied block after the specified duration
67
- #
68
- # @param [Duration] duration after which to execute the block
69
- # @param [Block] block to execute, block is passed a Timer object
70
- #
71
- # @return [Timer] Timer object
72
- #
73
- def after(duration, &block)
74
- Timer.new(duration: duration, &block)
75
- end
76
- end
77
- end
78
- end
79
- end
@@ -1,292 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'java'
4
- require 'forwardable'
5
-
6
- module OpenHAB
7
- module Core
8
- module DSL
9
- #
10
- # Ruby implementation of OpenHAB Types
11
- #
12
- module Types
13
- #
14
- # Ruby implementation for OpenHAB quantities
15
- #
16
- # rubocop: disable Metrics/ClassLength
17
- # Disabled because this class has a single responsibility, there does not appear a logical
18
- # way of breaking it up into multiple classes
19
- class Quantity < Numeric
20
- extend Forwardable
21
- include Logging
22
-
23
- def_delegator :@quantity, :to_s
24
-
25
- java_import org.openhab.core.library.types.QuantityType
26
- java_import 'tec.uom.se.format.SimpleUnitFormat'
27
- java_import 'tec.uom.se.AbstractUnit'
28
-
29
- # @return [Hash] Mapping of operation symbols to BigDecimal methods
30
- OPERATIONS = {
31
- '+' => 'add',
32
- '-' => 'subtract',
33
- '*' => 'multiply',
34
- '/' => 'divide'
35
- }.freeze
36
-
37
- private_constant :OPERATIONS
38
-
39
- attr_reader :quantity
40
-
41
- #
42
- # Create a new Quantity
43
- #
44
- # @param [object] quantity String,QuantityType or Numeric to be this quantity
45
- #
46
- # Cop disabled, case statement is compact and idiomatic
47
- def initialize(quantity)
48
- @quantity = case quantity
49
- when String then QuantityType.new(quantity)
50
- when QuantityType then quantity
51
- when NumberItem, Numeric then QuantityType.new(quantity.to_d.to_java, AbstractUnit::ONE)
52
- else raise ArgumentError, "Unexpected type #{quantity.class} provided to Quantity initializer"
53
- end
54
- super()
55
- end
56
-
57
- #
58
- # Convert this quantity into a another unit
59
- #
60
- # @param [Object] other String or Unit to convert to
61
- #
62
- # @return [Quantity] This quantity converted to another unit
63
- #
64
- def |(other)
65
- other = SimpleUnitFormat.instance.unitFor(other) if other.is_a? String
66
-
67
- Quantity.new(quantity.to_unit(other))
68
- end
69
-
70
- #
71
- # Compare this quantity
72
- #
73
- # @param [Object] other object to compare to
74
- #
75
- # @return [Integer] -1,0,1 if this object is less than, equal to, or greater than the supplied object,
76
- # nil if it cannot be compared
77
- #
78
- def <=>(other)
79
- logger.trace("Comparing #{self} to #{other}")
80
- my_qt, other_qt = unitize(*to_qt(coerce(other).reverse))
81
- my_qt.compare_to(other_qt)
82
- end
83
-
84
- #
85
- # Coerce other object into a Quantity
86
- #
87
- # @param [Object] other object to convert to Quantity
88
- #
89
- # @return [Array] of self and other object as Quantity types, nil if object cannot be coerced
90
- #
91
- def coerce(other)
92
- logger.trace("Coercing #{self} as a request from #{other.class}")
93
- case other
94
- when Quantity then [other.quantity, quantity]
95
- when QuantityType then [other, quantity]
96
- when NumberItem then [other.to_qt.quantity, quantity]
97
- when Numeric, String then [Quantity.new(other), self]
98
- end
99
- end
100
-
101
- #
102
- # Forward missing methods to Openhab Quantity Item if they are defined
103
- #
104
- # @param [String] meth name of method invoked
105
- # @param [Array] args arguments to invoked method
106
- # @param [Proc] block block passed ot method
107
- #
108
- # @return [Object] result of delegation
109
- #
110
- def method_missing(meth, *args, &block)
111
- logger.trace("Method missing, performing dynamic lookup for: #{meth}")
112
- if quantity.respond_to?(meth)
113
- quantity.__send__(meth, *args, &block)
114
- elsif ::Kernel.method_defined?(meth) || ::Kernel.private_method_defined?(meth)
115
- ::Kernel.instance_method(meth).bind_call(self, *args, &block)
116
- else
117
- super(meth, *args, &block)
118
- end
119
- end
120
-
121
- #
122
- # Checks if this method responds to the missing method
123
- #
124
- # @param [String] method_name Name of the method to check
125
- # @param [Boolean] _include_private boolean if private methods should be checked
126
- #
127
- # @return [Boolean] true if this object will respond to the supplied method, false otherwise
128
- #
129
- def respond_to_missing?(method_name, _include_private = false)
130
- quantity.respond_to?(method_name) ||
131
- ::Kernel.method_defined?(method_name) ||
132
- ::Kernel.private_method_defined?(method_name)
133
- end
134
-
135
- #
136
- # Negate the quantity
137
- #
138
- # @return [Quantity] This quantity negated
139
- #
140
- def -@
141
- Quantity.new(quantity.negate)
142
- end
143
-
144
- OPERATIONS.each do |operation, method|
145
- define_method(operation) do |other|
146
- logger.trace("Executing math operation '#{operation}' on quantity #{inspect} "\
147
- "with other type #{other.class} and value #{other.inspect}")
148
-
149
- a, b = to_qt(coerce(other).reverse)
150
- logger.trace("Coerced a='#{a}' with b='#{b}'")
151
- a, b = unitize(a, b, operation)
152
- logger.trace("Unitized a='#{a}' b='#{b}'")
153
- logger.trace("Performing operation '#{operation}' with method '#{method}' on a='#{a}' with b='#{b}'")
154
- Quantity.new(a.public_send(method, b))
155
- end
156
- end
157
-
158
- #
159
- # Provide details about quantity object
160
- #
161
- # @return [String] Representing details about the quantity object
162
- #
163
- def inspect
164
- if @quantity.unit == AbstractUnit::ONE
165
- "unit=#{@quantity.unit}, value=#{@quantity.to_string}"
166
- else
167
- @quantity.to_string
168
- end
169
- end
170
-
171
- private
172
-
173
- # @return [Array] Array of strings for operations for which the operands will not be unitized
174
- DIMENSIONLESS_NON_UNITIZED_OPERATIONS = %w[* /].freeze
175
-
176
- # Dimensionless numbers should only be unitzed for addition and subtraction
177
-
178
- #
179
- # Convert one or more Quantity obects to the underlying quantitytypes
180
- #
181
- # @param [Array] quanities Array of either Quantity or QuantityType objects
182
- #
183
- # @return [Array] Array of QuantityType objects
184
- #
185
- def to_qt(*quanities)
186
- [quanities].flatten.compact.map { |item| item.is_a?(Quantity) ? item.quantity : item }
187
- end
188
-
189
- #
190
- # Checks if an item should be unitized
191
- #
192
- # @param [Quantity] quantity to check
193
- # @param [String] operation quantity is being used with
194
- #
195
- # @return [Boolean] True if the quantity should be unitzed based on the unit and operation, false otherwise
196
- #
197
- def unitize?(quantity, operation)
198
- !(quantity.unit == AbstractUnit::ONE && DIMENSIONLESS_NON_UNITIZED_OPERATIONS.include?(operation))
199
- end
200
-
201
- #
202
- # Convert the unit for the quantity
203
- #
204
- # @param [Quantity] quantity being converted
205
- #
206
- # @return [Quantity] Quantity coverted to unit set by unit block
207
- #
208
- def convert_unit(quantity)
209
- return quantity unless unit?
210
-
211
- case quantity.unit
212
- when unit
213
- quantity
214
- when AbstractUnit::ONE
215
- convert_unit_from_dimensionless(quantity, unit)
216
- else
217
- convert_unit_from_dimensioned(quantity, unit)
218
- end
219
- end
220
-
221
- #
222
- # Converts a dimensioned quantity to a specific unit
223
- #
224
- # @param [Quantity] quantity to convert
225
- # @param [Unit] unit to convert to
226
- #
227
- # @return [Java::org::openhab::core::library::types::QuantityType] converted quantity
228
- #
229
- def convert_unit_from_dimensioned(quantity, unit)
230
- logger.trace("Converting dimensioned item #{inspect} to #{unit}")
231
- quantity.to_unit(unit).tap do |converted|
232
- raise "Conversion from #{quantity.unit} to #{unit} failed" unless converted
233
- end
234
- end
235
-
236
- #
237
- # Converts a dimensionless quantity to a unit
238
- #
239
- # @param [Quantity] quantity to convert
240
- # @param [Unit] unit to convert to
241
- #
242
- # @return [Java::org::openhab::core::library::types::QuantityType] converted quantity
243
- #
244
- def convert_unit_from_dimensionless(quantity, unit)
245
- logger.trace("Converting dimensionless #{quantity} to #{unit}")
246
- QuantityType.new(quantity.to_big_decimal, unit)
247
- end
248
-
249
- #
250
- # Convert quantities to appropriate units
251
- #
252
- # @param [Quantity] quantity_a Quantity on left side of operation
253
- # @param [Quantity] quantity_b Quantity on right side of operation
254
- # @param [String] operation Math operation
255
- # @yield [quantity_a, quantity_b] yields unitized versions of supplied quantities
256
- #
257
- # @return [Array, Object] of quantites in correct units for the supplied operation and the unit
258
- # or the result of the block if a block is given
259
- #
260
- def unitize(quantity_a, quantity_b, operation = nil)
261
- logger.trace("Unitizing (#{quantity_a}) and (#{quantity_b})")
262
- quantity_a, quantity_b = [quantity_a, quantity_b].map do |qt|
263
- unitize?(qt, operation) ? convert_unit(qt) : qt
264
- end
265
- return yield quantity_a, quantity_b if block_given?
266
-
267
- [quantity_a, quantity_b]
268
- end
269
-
270
- #
271
- # Get the unit from the current thread local variable
272
- #
273
- # @return [Object] Unit or string representation of Unit, or nil if not set
274
- #
275
- def unit
276
- Thread.current.thread_variable_get(:unit)
277
- end
278
-
279
- #
280
- # Is a unit set for this thread
281
- #
282
- # @return [boolean] true if a unit is set by this thread, false otherwise
283
- #
284
- def unit?
285
- unit != nil
286
- end
287
- end
288
- end
289
- end
290
- end
291
- end
292
- # rubocop: enable Metrics/ClassLength
@@ -1,41 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'java'
4
-
5
- # Import Imperial and SI Units overriding provided values
6
- %i[ImperialUnits SIUnits].each do |type|
7
- Object.send(:remove_const, type)
8
- java_import "org.openhab.core.library.unit.#{type}"
9
- end
10
-
11
- Object.send(:remove_const, :QuantityType)
12
- java_import org.openhab.core.library.types.QuantityType
13
-
14
- module OpenHAB
15
- module Core
16
- module DSL
17
- #
18
- # Provides support for interacting with OpenHAB Units of Measurement
19
- #
20
- module Units
21
- java_import 'tec.uom.se.format.SimpleUnitFormat'
22
-
23
- #
24
- # Sets a thread local variable to the supplied unit such that classes operating inside the block
25
- # can perform automatic conversions to the supplied unit for NumberItems
26
- #
27
- # @param [Object] unit OpenHAB Unit or String representing unit
28
- # @yield [] Block executed in context of the supplied unit
29
- #
30
- #
31
- def unit(unit)
32
- unit = SimpleUnitFormat.instance.unitFor(unit) if unit.is_a? String
33
- Thread.current.thread_variable_set(:unit, unit)
34
- yield
35
- ensure
36
- Thread.current.thread_variable_set(:unit, nil)
37
- end
38
- end
39
- end
40
- end
41
- end
@@ -1,170 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'openhab/configuration'
4
- require 'java'
5
- require 'pp'
6
-
7
- #
8
- # Provides access to the OpenHAB logging using a Ruby logging methods
9
- #
10
- module Logging
11
- #
12
- # Ruby Logger that forwards messages at appropriate levels to OpenHAB Logger
13
- #
14
- class Logger
15
- java_import org.slf4j.LoggerFactory
16
-
17
- # @return [Array] Supported logging levels
18
- LEVELS = %i[TRACE DEBUG WARN INFO ERROR].freeze
19
-
20
- #
21
- # Create a new logger
22
- #
23
- # @param [String] name of the logger
24
- #
25
- def initialize(name)
26
- @sl4fj_logger = LoggerFactory.getLogger(name)
27
- end
28
-
29
- # Dynamically define the methods for each level as identified by the levels constant
30
- # This creates a method for each level that looks like this
31
- # def <level>(msg=nil, &block)
32
- # log(severity: <level>, msg: msg, &block)
33
- # end
34
- LEVELS.each do |level|
35
- method = level.to_s.downcase
36
- define_method(method.to_s) do |msg = nil, &block|
37
- log(severity: level, msg: msg, &block)
38
- end
39
- end
40
-
41
- private
42
-
43
- #
44
- # Log a message to the OpenHAB Logger
45
- #
46
- # @param [Symbol] severity Severity to log message at
47
- # @param [Object] msg to log, if no msg supplied and a block is provided,
48
- # the msg is taken from the result of the block
49
- #
50
- def log(severity:, msg: nil)
51
- severity = severity.to_sym
52
-
53
- raise ArgumentError, "Unknown Severity #{severity}" unless LEVELS.include? severity
54
-
55
- # Dynamically check enablement of underlying logger, this expands to "is_<level>_enabled"
56
- return unless @sl4fj_logger.send("is_#{severity.to_s.downcase}_enabled")
57
-
58
- # Process block if no message provided
59
- msg = yield if msg.nil? && block_given?
60
-
61
- msg = message_to_string(msg: msg)
62
-
63
- # Dynamically invoke underlying logger, this expands to "<level>(message)"
64
- @sl4fj_logger.send(severity.to_s.downcase, msg)
65
- end
66
-
67
- #
68
- # Conver the supplied message object to a String
69
- #
70
- # @param [object] msg object to convert
71
- #
72
- # @return [String] Msg object as a string
73
- #
74
- def message_to_string(msg:)
75
- case msg
76
- when ::String
77
- msg
78
- when ::Exception
79
- "#{msg.message} (#{msg.class})\n#{msg.backtrace&.join("\n")}"
80
- else
81
- msg.inspect
82
- end
83
- end
84
- end
85
-
86
- @loggers = {}
87
-
88
- # Return a logger with the configured log prefix plus the calling scripts name
89
-
90
- #
91
- # Create a logger for the current class
92
- #
93
- # @return [Logger] for the current class
94
- #
95
- def logger
96
- Logging.logger(self.class.name)
97
- end
98
-
99
- class << self
100
- #
101
- # Injects a logger into the base class
102
- #
103
- # @param [String] name of the logger
104
- #
105
- # @return [Logger] for the supplied name
106
- #
107
- def logger(name)
108
- name ||= self.class.name
109
- @loggers[name] ||= Logging.logger_for(name)
110
- end
111
-
112
- #
113
- # Configure a logger for the supplied class name
114
- #
115
- # @param [String] classname to configure logger for
116
- #
117
- # @return [Logger] for the supplied classname
118
- #
119
- def logger_for(classname)
120
- configure_logger_for(classname)
121
- end
122
-
123
- private
124
-
125
- #
126
- # Configure a logger for the supplied classname
127
- #
128
- # @param [String] classname to create logger for
129
- #
130
- # @return [Logger] Logger for the supplied classname
131
- #
132
- def configure_logger_for(classname)
133
- log_prefix = Configuration.log_prefix
134
- log_prefix += if classname
135
- ".#{classname}"
136
- else
137
- ".#{log_caller}"
138
- end
139
- Logger.new(log_prefix)
140
- end
141
-
142
- #
143
- # Figure out the log prefix
144
- #
145
- # @return [String] Prefix for log messages
146
- #
147
- def log_caller
148
- caller_locations.map(&:path)
149
- .grep_v(%r{openhab/core/})
150
- .grep_v(/rubygems/)
151
- .grep_v(%r{lib/ruby})
152
- .first
153
- .yield_self { |caller| File.basename(caller, '.*') }
154
- end
155
- end
156
-
157
- #
158
- # Add logger method to the object that includes this module
159
- #
160
- # @param [Object] base Object to add method to
161
- #
162
- #
163
- def self.included(base)
164
- class << base
165
- def logger
166
- Logging.logger(self.class.name)
167
- end
168
- end
169
- end
170
- end