openhab-scripting 4.1.4 → 4.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (81) hide show
  1. checksums.yaml +4 -4
  2. data/lib/openhab/core/entity_lookup.rb +1 -57
  3. data/lib/openhab/dsl/dsl.rb +6 -12
  4. data/lib/openhab/dsl/group.rb +1 -5
  5. data/lib/openhab/dsl/items/comparable_item.rb +49 -0
  6. data/lib/openhab/dsl/items/contact_item.rb +41 -0
  7. data/lib/openhab/dsl/items/date_time_item.rb +64 -0
  8. data/lib/openhab/dsl/items/dimmer_item.rb +59 -0
  9. data/lib/openhab/dsl/items/generic_item.rb +197 -0
  10. data/lib/openhab/dsl/items/group_item.rb +56 -92
  11. data/lib/openhab/dsl/items/image_item.rb +5 -41
  12. data/lib/openhab/dsl/items/item_registry.rb +49 -0
  13. data/lib/openhab/dsl/items/items.rb +71 -35
  14. data/lib/openhab/dsl/items/metadata.rb +325 -0
  15. data/lib/openhab/dsl/items/number_item.rb +6 -312
  16. data/lib/openhab/dsl/items/numeric_item.rb +66 -0
  17. data/lib/openhab/dsl/items/persistence.rb +122 -0
  18. data/lib/openhab/dsl/items/player_item.rb +49 -40
  19. data/lib/openhab/dsl/items/rollershutter_item.rb +25 -77
  20. data/lib/openhab/dsl/items/string_item.rb +16 -58
  21. data/lib/openhab/dsl/items/switch_item.rb +62 -0
  22. data/lib/openhab/dsl/lazy_array.rb +8 -6
  23. data/lib/openhab/dsl/monkey_patch/events/events.rb +2 -2
  24. data/lib/openhab/dsl/monkey_patch/events/item_command.rb +67 -24
  25. data/lib/openhab/dsl/monkey_patch/events/item_event.rb +5 -5
  26. data/lib/openhab/dsl/monkey_patch/events/item_state.rb +10 -11
  27. data/lib/openhab/dsl/monkey_patch/events/item_state_changed.rb +10 -11
  28. data/lib/openhab/dsl/monkey_patch/ruby/number.rb +25 -2
  29. data/lib/openhab/dsl/monkey_patch/ruby/ruby.rb +0 -3
  30. data/lib/openhab/dsl/monkey_patch/ruby/string.rb +24 -24
  31. data/lib/openhab/dsl/states.rb +1 -1
  32. data/lib/openhab/dsl/time_of_day.rb +3 -5
  33. data/lib/openhab/dsl/types/comparable_type.rb +21 -0
  34. data/lib/openhab/dsl/types/date_time_type.rb +334 -0
  35. data/lib/openhab/dsl/types/decimal_type.rb +187 -0
  36. data/lib/openhab/dsl/types/increase_decrease_type.rb +23 -0
  37. data/lib/openhab/dsl/types/next_previous_type.rb +23 -0
  38. data/lib/openhab/dsl/types/numeric_type.rb +39 -0
  39. data/lib/openhab/dsl/types/on_off_type.rb +29 -0
  40. data/lib/openhab/dsl/types/open_closed_type.rb +29 -0
  41. data/lib/openhab/dsl/types/percent_type.rb +68 -0
  42. data/lib/openhab/dsl/types/play_pause_type.rb +27 -0
  43. data/lib/openhab/dsl/types/quantity_type.rb +275 -0
  44. data/lib/openhab/dsl/types/refresh_type.rb +18 -0
  45. data/lib/openhab/dsl/types/rewind_fastforward_type.rb +33 -0
  46. data/lib/openhab/dsl/types/stop_move_type.rb +23 -0
  47. data/lib/openhab/dsl/types/string_type.rb +88 -0
  48. data/lib/openhab/dsl/types/type.rb +72 -0
  49. data/lib/openhab/dsl/types/types.rb +77 -0
  50. data/lib/openhab/dsl/types/un_def_type.rb +22 -0
  51. data/lib/openhab/dsl/types/up_down_type.rb +32 -0
  52. data/lib/openhab/dsl/units.rb +11 -6
  53. data/lib/openhab/version.rb +1 -1
  54. data/lib/openhab.rb +0 -1
  55. metadata +31 -28
  56. data/lib/openhab/dsl/items/datetime_item.rb +0 -75
  57. data/lib/openhab/dsl/items/item_command.rb +0 -90
  58. data/lib/openhab/dsl/items/item_delegate.rb +0 -125
  59. data/lib/openhab/dsl/monkey_patch/items/contact_item.rb +0 -51
  60. data/lib/openhab/dsl/monkey_patch/items/dimmer_item.rb +0 -140
  61. data/lib/openhab/dsl/monkey_patch/items/items.rb +0 -142
  62. data/lib/openhab/dsl/monkey_patch/items/metadata.rb +0 -328
  63. data/lib/openhab/dsl/monkey_patch/items/persistence.rb +0 -123
  64. data/lib/openhab/dsl/monkey_patch/items/switch_item.rb +0 -71
  65. data/lib/openhab/dsl/monkey_patch/ruby/range.rb +0 -47
  66. data/lib/openhab/dsl/monkey_patch/ruby/time.rb +0 -32
  67. data/lib/openhab/dsl/monkey_patch/types/decimal_type.rb +0 -97
  68. data/lib/openhab/dsl/monkey_patch/types/increase_decrease_type.rb +0 -23
  69. data/lib/openhab/dsl/monkey_patch/types/next_previous_type.rb +0 -23
  70. data/lib/openhab/dsl/monkey_patch/types/on_off_type.rb +0 -79
  71. data/lib/openhab/dsl/monkey_patch/types/open_closed_type.rb +0 -71
  72. data/lib/openhab/dsl/monkey_patch/types/percent_type.rb +0 -77
  73. data/lib/openhab/dsl/monkey_patch/types/play_pause_type.rb +0 -23
  74. data/lib/openhab/dsl/monkey_patch/types/quantity_type.rb +0 -69
  75. data/lib/openhab/dsl/monkey_patch/types/refresh_type.rb +0 -23
  76. data/lib/openhab/dsl/monkey_patch/types/rewind_fastforward_type.rb +0 -23
  77. data/lib/openhab/dsl/monkey_patch/types/stop_move_type.rb +0 -23
  78. data/lib/openhab/dsl/monkey_patch/types/types.rb +0 -15
  79. data/lib/openhab/dsl/monkey_patch/types/up_down_type.rb +0 -72
  80. data/lib/openhab/dsl/types/datetime.rb +0 -338
  81. data/lib/openhab/dsl/types/quantity.rb +0 -300
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ module OpenHAB
4
+ module DSL
5
+ module Types
6
+ java_import org.openhab.core.types.UnDefType
7
+
8
+ # Adds methods to core OpenHAB UnDefType to make it more natural in Ruby
9
+ class UnDefType # rubocop:disable Lint/EmptyClass
10
+ # @!parse include Type
11
+
12
+ # @!method null?
13
+ # Check if == +NULL+
14
+ # @return [Boolean]
15
+
16
+ # @!method undef?
17
+ # Check if == +UNDEF+
18
+ # @return [Boolean]
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ module OpenHAB
4
+ module DSL
5
+ module Types
6
+ java_import org.openhab.core.library.types.UpDownType
7
+
8
+ # Adds methods to core OpenHAB UpDownType to make it more natural in Ruby
9
+ class UpDownType
10
+ # @!parse include Type
11
+
12
+ # @!method up?
13
+ # Check if == +UP+
14
+ # @return [Boolean]
15
+
16
+ # @!method down?
17
+ # Check if == +DOWN+
18
+ # @return [Boolean]
19
+
20
+ #
21
+ # Invert the type
22
+ #
23
+ # @return [UpDownType] +UP+ if +DOWN+, +DOWN+ if +UP+
24
+ #
25
+ def !
26
+ return UP if down?
27
+ return DOWN if up?
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -10,7 +10,6 @@ end
10
10
 
11
11
  Object.send(:remove_const, :QuantityType)
12
12
  java_import org.openhab.core.library.types.QuantityType
13
- java_import org.openhab.core.types.util.UnitUtils
14
13
 
15
14
  module OpenHAB
16
15
  module DSL
@@ -18,6 +17,13 @@ module OpenHAB
18
17
  # Provides support for interacting with OpenHAB Units of Measurement
19
18
  #
20
19
  module Units
20
+ # @return The default unit for the current thread
21
+ def unit(unit = nil, &block)
22
+ return with_unit(unit, &block) if unit || block # back-compat
23
+
24
+ Thread.current[:unit]
25
+ end
26
+
21
27
  #
22
28
  # Sets a thread local variable to the supplied unit such that classes operating inside the block
23
29
  # can perform automatic conversions to the supplied unit for NumberItems
@@ -25,13 +31,12 @@ module OpenHAB
25
31
  # @param [Object] unit OpenHAB Unit or String representing unit
26
32
  # @yield [] Block executed in context of the supplied unit
27
33
  #
28
- #
29
- def unit(unit)
30
- unit = UnitUtils.parse_unit(unit) if unit.is_a? String
31
- Thread.current.thread_variable_set(:unit, unit)
34
+ def with_unit(unit)
35
+ unit = org.openhab.core.types.util.UnitUtils.parse_unit(unit) if unit.is_a? String
36
+ Thread.current[:unit] = unit
32
37
  yield
33
38
  ensure
34
- Thread.current.thread_variable_set(:unit, nil)
39
+ Thread.current[:unit] = nil
35
40
  end
36
41
  end
37
42
  end
@@ -5,5 +5,5 @@
5
5
  #
6
6
  module OpenHAB
7
7
  # @return [String] Version of OpenHAB helper libraries
8
- VERSION = '4.1.4'
8
+ VERSION = '4.2.0'
9
9
  end
data/lib/openhab.rb CHANGED
@@ -4,7 +4,6 @@ require 'openhab/core/load_path'
4
4
  require 'openhab/core/openhab_setup'
5
5
  require 'openhab/log/logger'
6
6
  require 'openhab/dsl/dsl'
7
-
8
7
  require 'openhab/version'
9
8
 
10
9
  #
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.1.4
4
+ version: 4.2.0
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: 2021-10-11 00:00:00.000000000 Z
11
+ date: 2021-10-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -54,16 +54,23 @@ files:
54
54
  - lib/openhab/dsl/dsl.rb
55
55
  - lib/openhab/dsl/gems.rb
56
56
  - lib/openhab/dsl/group.rb
57
- - lib/openhab/dsl/items/datetime_item.rb
57
+ - lib/openhab/dsl/items/comparable_item.rb
58
+ - lib/openhab/dsl/items/contact_item.rb
59
+ - lib/openhab/dsl/items/date_time_item.rb
60
+ - lib/openhab/dsl/items/dimmer_item.rb
61
+ - lib/openhab/dsl/items/generic_item.rb
58
62
  - lib/openhab/dsl/items/group_item.rb
59
63
  - lib/openhab/dsl/items/image_item.rb
60
- - lib/openhab/dsl/items/item_command.rb
61
- - lib/openhab/dsl/items/item_delegate.rb
64
+ - lib/openhab/dsl/items/item_registry.rb
62
65
  - lib/openhab/dsl/items/items.rb
66
+ - lib/openhab/dsl/items/metadata.rb
63
67
  - lib/openhab/dsl/items/number_item.rb
68
+ - lib/openhab/dsl/items/numeric_item.rb
69
+ - lib/openhab/dsl/items/persistence.rb
64
70
  - lib/openhab/dsl/items/player_item.rb
65
71
  - lib/openhab/dsl/items/rollershutter_item.rb
66
72
  - lib/openhab/dsl/items/string_item.rb
73
+ - lib/openhab/dsl/items/switch_item.rb
67
74
  - lib/openhab/dsl/lazy_array.rb
68
75
  - lib/openhab/dsl/monkey_patch/actions/actions.rb
69
76
  - lib/openhab/dsl/monkey_patch/actions/script_thing_actions.rb
@@ -73,30 +80,9 @@ files:
73
80
  - lib/openhab/dsl/monkey_patch/events/item_state.rb
74
81
  - lib/openhab/dsl/monkey_patch/events/item_state_changed.rb
75
82
  - lib/openhab/dsl/monkey_patch/events/thing_status_info.rb
76
- - lib/openhab/dsl/monkey_patch/items/contact_item.rb
77
- - lib/openhab/dsl/monkey_patch/items/dimmer_item.rb
78
- - lib/openhab/dsl/monkey_patch/items/items.rb
79
- - lib/openhab/dsl/monkey_patch/items/metadata.rb
80
- - lib/openhab/dsl/monkey_patch/items/persistence.rb
81
- - lib/openhab/dsl/monkey_patch/items/switch_item.rb
82
83
  - lib/openhab/dsl/monkey_patch/ruby/number.rb
83
- - lib/openhab/dsl/monkey_patch/ruby/range.rb
84
84
  - lib/openhab/dsl/monkey_patch/ruby/ruby.rb
85
85
  - lib/openhab/dsl/monkey_patch/ruby/string.rb
86
- - lib/openhab/dsl/monkey_patch/ruby/time.rb
87
- - lib/openhab/dsl/monkey_patch/types/decimal_type.rb
88
- - lib/openhab/dsl/monkey_patch/types/increase_decrease_type.rb
89
- - lib/openhab/dsl/monkey_patch/types/next_previous_type.rb
90
- - lib/openhab/dsl/monkey_patch/types/on_off_type.rb
91
- - lib/openhab/dsl/monkey_patch/types/open_closed_type.rb
92
- - lib/openhab/dsl/monkey_patch/types/percent_type.rb
93
- - lib/openhab/dsl/monkey_patch/types/play_pause_type.rb
94
- - lib/openhab/dsl/monkey_patch/types/quantity_type.rb
95
- - lib/openhab/dsl/monkey_patch/types/refresh_type.rb
96
- - lib/openhab/dsl/monkey_patch/types/rewind_fastforward_type.rb
97
- - lib/openhab/dsl/monkey_patch/types/stop_move_type.rb
98
- - lib/openhab/dsl/monkey_patch/types/types.rb
99
- - lib/openhab/dsl/monkey_patch/types/up_down_type.rb
100
86
  - lib/openhab/dsl/persistence.rb
101
87
  - lib/openhab/dsl/rules/automation_rule.rb
102
88
  - lib/openhab/dsl/rules/guard.rb
@@ -113,8 +99,25 @@ files:
113
99
  - lib/openhab/dsl/things.rb
114
100
  - lib/openhab/dsl/time_of_day.rb
115
101
  - lib/openhab/dsl/timers.rb
116
- - lib/openhab/dsl/types/datetime.rb
117
- - lib/openhab/dsl/types/quantity.rb
102
+ - lib/openhab/dsl/types/comparable_type.rb
103
+ - lib/openhab/dsl/types/date_time_type.rb
104
+ - lib/openhab/dsl/types/decimal_type.rb
105
+ - lib/openhab/dsl/types/increase_decrease_type.rb
106
+ - lib/openhab/dsl/types/next_previous_type.rb
107
+ - lib/openhab/dsl/types/numeric_type.rb
108
+ - lib/openhab/dsl/types/on_off_type.rb
109
+ - lib/openhab/dsl/types/open_closed_type.rb
110
+ - lib/openhab/dsl/types/percent_type.rb
111
+ - lib/openhab/dsl/types/play_pause_type.rb
112
+ - lib/openhab/dsl/types/quantity_type.rb
113
+ - lib/openhab/dsl/types/refresh_type.rb
114
+ - lib/openhab/dsl/types/rewind_fastforward_type.rb
115
+ - lib/openhab/dsl/types/stop_move_type.rb
116
+ - lib/openhab/dsl/types/string_type.rb
117
+ - lib/openhab/dsl/types/type.rb
118
+ - lib/openhab/dsl/types/types.rb
119
+ - lib/openhab/dsl/types/un_def_type.rb
120
+ - lib/openhab/dsl/types/up_down_type.rb
118
121
  - lib/openhab/dsl/units.rb
119
122
  - lib/openhab/log/configuration.rb
120
123
  - lib/openhab/log/logger.rb
@@ -1,75 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'forwardable'
4
- require 'java'
5
- require 'time'
6
- require 'openhab/dsl/types/datetime'
7
- require 'openhab/dsl/items/item_delegate'
8
- require 'openhab/dsl/items/item_command'
9
-
10
- module OpenHAB
11
- module DSL
12
- module Items
13
- #
14
- # Delegation to OpenHAB DateTime Item
15
- #
16
- # @author Anders Alfredsson
17
- #
18
- class DateTimeItem
19
- extend Forwardable
20
- extend OpenHAB::DSL::Items::ItemDelegate
21
- extend OpenHAB::DSL::Items::ItemCommand
22
- include Comparable
23
-
24
- def_item_delegator :@datetime_item
25
-
26
- item_type Java::OrgOpenhabCoreLibraryItems::DateTimeItem
27
-
28
- #
29
- # Create a new DateTimeItem
30
- #
31
- # @param [Java::org::openhab::core::libarary::items::DateTimeItem] datetime_item Openhab DateTimeItem to
32
- # delegate to
33
- #
34
- def initialize(datetime_item)
35
- @datetime_item = datetime_item
36
- item_missing_delegate { @datetime_item }
37
- item_missing_delegate { to_dt }
38
- end
39
-
40
- #
41
- # Return an instance of DateTime that wraps the DateTimeItem's state
42
- #
43
- # @return [OpenHAB::DSL::Types::DateTime] Wrapper for the Item's state, or nil if it has no state
44
- #
45
- def to_dt
46
- OpenHAB::DSL::Types::DateTime.new(@datetime_item.state) if state?
47
- end
48
-
49
- #
50
- # Compare the Item's state to another Item or object that can be compared
51
- #
52
- # @param [Object] other Other objet to compare against
53
- #
54
- # @return [Integer] -1, 0 or 1 depending on the result of the comparison
55
- #
56
- def <=>(other)
57
- return unless state?
58
-
59
- logger.trace("Comparing self (#{self.class}) to #{other} (#{other.class})")
60
- other = other.to_dt if other.is_a? DateTimeItem
61
- to_dt <=> other
62
- end
63
-
64
- #
65
- # Get the time zone of the Item
66
- #
67
- # @return [String] The timezone in `[+-]hh:mm(:ss)` format or nil if the Item has no state
68
- #
69
- def zone
70
- to_dt.zone if state?
71
- end
72
- end
73
- end
74
- end
75
- end
@@ -1,90 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'java'
4
- require 'openhab/log/logger'
5
- require 'openhab/dsl/monkey_patch/events/item_command'
6
-
7
- module OpenHAB
8
- module DSL
9
- module Items
10
- #
11
- # Holds methods to automatically generate commands and
12
- # accessors for items
13
- module ItemCommand
14
- include OpenHAB::Log
15
-
16
- #
17
- # For every value in the supplied enumeration create a corresponding method mapped to the lowercase
18
- # string representation of the enum value For example, an enum with values of STOP and START
19
- # would create methods stop() and start() that send the corresponding STOP and START commands to the item
20
- #
21
- # @param [Java::JavaLang::Enum] command_enum Enumeration to create commands for
22
- # @param [Hash] optional hash in which if a generated method name mactches a key, the value of that key
23
- # will be used as the method name instead, for example `:play? => :playing?`
24
- #
25
- #
26
- def item_command(command_enum, methods = {})
27
- # rubocop:disable Style/HashEachMethods
28
- # Disable rule because Java enum does not support each_value
29
- command_enum.values.each do |command|
30
- command_method = command.to_s.downcase
31
- command_method = methods.transform_keys(&:to_sym).fetch(command_method.to_sym, command_method)
32
- logger.trace("Creating command method (#{command_method}) for #{self}")
33
- define_method(command_method) do
34
- self.command(command)
35
- end
36
- end
37
- # rubocop:enable Style/HashEachMethods
38
- end
39
-
40
- #
41
- # For every value in the supplied enumeration create a corresponding method mapped to the lowercase
42
- # string representation appended with a question mark '?' of the enum value For example,
43
- # an enum with values of UP and DOWN would create methods up? and down? that check
44
- # if the current state matches the value of the enum
45
- #
46
- # @param [Java::JavaLang::Enum] command_enum Enumeration to create methods for each value
47
- # to check if current state matches that enum
48
- # @param [Hash] optional hash in which if a generated method name mactches a key, the value of that key
49
- # will be used as the method name instead, for example `:play? => :playing?`
50
- #
51
- #
52
- def item_state(command_enum, methods = {})
53
- # rubocop:disable Style/HashEachMethods
54
- # Disable rule because Java enum does not support each_value
55
- command_enum.values.each do |command|
56
- status_method = "#{command.to_s.downcase}?"
57
- status_method = methods.transform_keys(&:to_sym).fetch(status_method.to_sym, status_method)
58
- logger.trace("Creating status method (#{status_method}) for #{self}")
59
- define_method(status_method) do
60
- state? && state.as(command_enum) == command
61
- end
62
- end
63
- # rubocop:enable Style/HashEachMethods
64
- end
65
-
66
- #
67
- # Extract the accepted state and command types from the specified OpenHAB
68
- # Item class and pass them to item_state/item_command
69
- #
70
- # @param [Java::JavaLang::Class] item_class a Class that implements Java::OrgOpenhabCoreItems::Item
71
- # @param [Hash] optional hash in which if a generated method name mactches a key, the value of that key
72
- # will be used as the method name instead, for example `:play? => :playing?`
73
- #
74
- def item_type(item_class, methods = {}) # rubocop:disable Metrics/MethodLength
75
- item_class.field_reader(:ACCEPTED_DATA_TYPES)
76
- item_class.field_reader(:ACCEPTED_COMMAND_TYPES)
77
- item_class.ACCEPTED_DATA_TYPES.select(&:is_enum)
78
- .grep_v(UnDefType)
79
- .each { |type| item_state(type.ruby_class, methods) }
80
- item_class.ACCEPTED_COMMAND_TYPES.select(&:is_enum)
81
- .grep_v(UnDefType)
82
- .each do |type|
83
- item_command(type.ruby_class, methods)
84
- MonkeyPatch::Events::ItemCommandEvent.def_enum_predicates(type.ruby_class)
85
- end
86
- end
87
- end
88
- end
89
- end
90
- end
@@ -1,125 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'java'
4
- require 'openhab/log/logger'
5
- require 'forwardable'
6
-
7
- module OpenHAB
8
- module DSL
9
- module Items
10
- #
11
- # Holds methods to delegate to items
12
- #
13
- module ItemDelegate
14
- include OpenHAB::Log
15
-
16
- # @return [Array<Symbol>] Array of methods that by default will be forwarded to an OpenHAB Item.
17
- DEFAULT_DELEGATION_METHODS = %i[to_s groups].freeze
18
- private_constant :DEFAULT_DELEGATION_METHODS
19
-
20
- #
21
- # Extends calling object with DSL and helper methods
22
- #
23
- # @param [Object] base Object to decorate with DSL and helper methods
24
- #
25
- #
26
- def self.extended(base)
27
- base.extend Forwardable
28
- base.include OpenHAB::DSL::Items::ItemDelegate
29
- end
30
-
31
- #
32
- # Delegate a set of methods to the supplied delegator
33
- #
34
- # @param [Java::OrgOpenhabCoreItems::GenericItem] item to delegate methods to
35
- # @param [Symbol] methods to delegate, if not supplied default methods are used
36
- #
37
- #
38
- def def_item_delegator(item, *methods)
39
- methods = DEFAULT_DELEGATION_METHODS if methods.size.zero?
40
- methods.each do |method|
41
- logger.trace("Creating delegate for (#{method}) to #{item}) for #{self.class}")
42
- def_delegator item, method
43
- end
44
- define_method(:oh_item) { instance_variable_get(item) }
45
- define_method(:hash) { oh_item.hash_code }
46
- define_method(:eql?) { |other| hash == other.hash }
47
- end
48
-
49
- #
50
- # Delegates methods to the object returned from the supplied block if
51
- # they don't exist in the object this is included in. If the supplied block returns nil, no delegation occurs
52
- # If this item is called more than once delegation occurs in the order of invocation, i.e. the object returned
53
- # by the first block is delegated to if it responds to the missing method,
54
- # then the second block is processed, etc.
55
- #
56
- # @param [Proc] &delegate delgegate block
57
- #
58
- #
59
- def item_missing_delegate(&delegate)
60
- @delegates ||= []
61
- @delegates << delegate
62
- end
63
-
64
- #
65
- # Delegate missing method calls to delegates supplied to item_delgate method
66
- # if no delegates exist or respond to missing method, super is invoked which will
67
- # throw the appropriate method missing error
68
- #
69
- # @param [String] meth misisng method
70
- # @param [Array] *args Arguments to the missing method
71
- # @param [Proc] &block supplied to the missing method
72
- #
73
- # @return [Object] Result of missing method invocation
74
- #
75
- def method_missing(meth, *args, &block)
76
- logger.trace("Method (#{meth}) missing for item #{self.class}")
77
- delegate = delegate_for(meth)
78
- if delegate
79
- logger.trace("Delegating #{meth} to #{delegate.class}")
80
- delegate.__send__(meth, *args, &block)
81
- else
82
- super
83
- end
84
- end
85
-
86
- #
87
- # Checks if any of the supplied delgates respond to a specific method
88
- #
89
- # @param [String] meth method to check for
90
- # @param [Boolean] _include_private if private methods should be checked
91
- #
92
- # @return [Boolean] True if any delegates respond to method, false otherwise
93
- #
94
- def respond_to_missing?(meth, _include_private = false)
95
- logger.trace("Checking if (#{self.class}) responds to (#{meth})")
96
- responds = !delegate_for(meth).nil?
97
- logger.trace("(#{self.class}) responds to (#{meth}) (#{responds})")
98
- responds
99
- end
100
-
101
- private
102
-
103
- #
104
- # Find a delegate for the supplied method
105
- #
106
- # @param [String] meth method to find delegate for
107
- #
108
- # @return [Boolean] True if any method responds to the supplied delegate, false otherwise
109
- #
110
- def delegate_for(meth)
111
- (@delegates || []).each do |delegate_block|
112
- delegate = delegate_block.call(meth)
113
- logger.trace("Checking if delegate (#{delegate.class}) responds to (#{meth})")
114
- if delegate.respond_to? meth
115
- logger.trace("Delegate (#{delegate.class}) found for method (#{meth})")
116
- return delegate
117
- end
118
- end
119
- logger.trace("No delegate found for method (#{meth})")
120
- nil
121
- end
122
- end
123
- end
124
- end
125
- end
@@ -1,51 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'java'
4
- require 'openhab/dsl/items/item_command'
5
-
6
- module OpenHAB
7
- module DSL
8
- module MonkeyPatch
9
- #
10
- # Patches OpenHAB items
11
- #
12
- module Items
13
- java_import Java::OrgOpenhabCoreLibraryItems::ContactItem
14
-
15
- #
16
- # Alias class for ContactItem
17
- #
18
- ::Contact = ContactItem
19
-
20
- #
21
- # Monkey patch Contact Item with Ruby methods
22
- #
23
- class ContactItem
24
- extend OpenHAB::DSL::Items::ItemCommand
25
-
26
- java_import Java::OrgOpenhabCoreLibraryTypes::OpenClosedType
27
-
28
- item_type Java::OrgOpenhabCoreLibraryItems::ContactItem
29
-
30
- #
31
- # Compares contacts to OpenClosedTypes
32
- #
33
- # @param [Object] other object to compare to
34
- #
35
- # @return [Boolean] True if contact has a state and state equals other, nil if no state,
36
- # result from super if not supplied an OpenClosedType
37
- #
38
- def ==(other)
39
- other = other.get_state_as(OpenClosedType) if other.respond_to?(:get_state_as)
40
-
41
- if other.is_a? OpenClosedType
42
- state? && state == other
43
- else
44
- super
45
- end
46
- end
47
- end
48
- end
49
- end
50
- end
51
- end