openhab-scripting 5.13.0 → 5.14.0
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/openhab/core/items/item.rb +67 -20
- data/lib/openhab/core/sitemaps/provider.rb +1 -1
- data/lib/openhab/core/things/item_channel_link.rb +7 -0
- data/lib/openhab/dsl/sitemaps/builder.rb +4 -3
- data/lib/openhab/dsl/version.rb +1 -1
- data/lib/openhab/osgi.rb +35 -4
- data/lib/openhab/rspec/helpers.rb +60 -42
- data/lib/openhab/rspec/hooks.rb +4 -4
- data/lib/openhab/rspec/karaf.rb +4 -0
- data/lib/openhab/rspec/mocks/abstract_storage_based_type_provider_wrapped_storage_service.rb +24 -0
- data/lib/openhab/rspec/mocks/thing_handler.rb +7 -1
- data/lib/openhab/rspec/mocks/timer.rb +36 -0
- metadata +4 -3
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA256:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: 29d5852ff9f0b047b5e70f69d8ece471770b59a86f4989a3120a7c6027fec1b9
         | 
| 4 | 
            +
              data.tar.gz: 39c590e109e6c5349fd6b4b5eee9bf2e5a3058f4b8cf875b6b69f02bb89996df
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: 41707220dfe28a3a7395b4d0b7c8538e8150448934d97f63d5b96a533f859f681b47d68bb83688cfa316737b34622f90c7da670915a454427a9c4c705d9cfa9e
         | 
| 7 | 
            +
              data.tar.gz: 9c8ae71904b136e9aa2e11027e0de57101721b7096352994a2d636595f69b32a07e0992bf476a0200e0e6de5330a6a70d6e6f363f2e1f4c687ff1b033f013710
         | 
| @@ -252,10 +252,10 @@ module OpenHAB | |
| 252 252 | 
             
                    end
         | 
| 253 253 |  | 
| 254 254 | 
             
                    # @!attribute thing [r]
         | 
| 255 | 
            -
                    # Return the item's thing if this item is linked with a thing. If an item is linked to more than one  | 
| 255 | 
            +
                    # Return the item's thing if this item is linked with a thing. If an item is linked to more than one channel,
         | 
| 256 256 | 
             
                    # this method only returns the first thing.
         | 
| 257 257 | 
             
                    #
         | 
| 258 | 
            -
                    # @return [Thing | 
| 258 | 
            +
                    # @return [Things::Thing, nil]
         | 
| 259 259 | 
             
                    def thing
         | 
| 260 260 | 
             
                      all_linked_things.first
         | 
| 261 261 | 
             
                    end
         | 
| @@ -264,12 +264,46 @@ module OpenHAB | |
| 264 264 | 
             
                    # @!attribute things [r]
         | 
| 265 265 | 
             
                    # Returns all of the item's linked things.
         | 
| 266 266 | 
             
                    #
         | 
| 267 | 
            -
                    # @return [Array<Thing>] An array of things or an empty array
         | 
| 267 | 
            +
                    # @return [Array<Things::Thing>] An array of things or an empty array
         | 
| 268 268 | 
             
                    def things
         | 
| 269 269 | 
             
                      Things::Links::Provider.registry.get_bound_things(name).map { |thing| Things::Proxy.new(thing) }
         | 
| 270 270 | 
             
                    end
         | 
| 271 271 | 
             
                    alias_method :all_linked_things, :things
         | 
| 272 272 |  | 
| 273 | 
            +
                    # @!attribute channel_uid [r]
         | 
| 274 | 
            +
                    # Return the UID of the channel this item is linked to. If an item is linked to more than one channel,
         | 
| 275 | 
            +
                    # this method only returns the first channel.
         | 
| 276 | 
            +
                    #
         | 
| 277 | 
            +
                    # @return [Things::ChannelUID, nil]
         | 
| 278 | 
            +
                    def channel_uid
         | 
| 279 | 
            +
                      channel_uids.first
         | 
| 280 | 
            +
                    end
         | 
| 281 | 
            +
             | 
| 282 | 
            +
                    # @!attribute channel_uids [r]
         | 
| 283 | 
            +
                    # Return the UIDs of all of the channels this item is linked to.
         | 
| 284 | 
            +
                    #
         | 
| 285 | 
            +
                    # @return [Array<Things::ChannelUID>]
         | 
| 286 | 
            +
                    def channel_uids
         | 
| 287 | 
            +
                      Things::Links::Provider.registry.get_bound_channels(name)
         | 
| 288 | 
            +
                    end
         | 
| 289 | 
            +
             | 
| 290 | 
            +
                    # @!attribute channel [r]
         | 
| 291 | 
            +
                    # Return the the channel this item is linked to. If an item is linked to more than one channel,
         | 
| 292 | 
            +
                    # this method only returns the first channel.
         | 
| 293 | 
            +
                    #
         | 
| 294 | 
            +
                    # @return [Things::Channel, nil]
         | 
| 295 | 
            +
                    def channel
         | 
| 296 | 
            +
                      channel_uids.first&.channel
         | 
| 297 | 
            +
                    end
         | 
| 298 | 
            +
             | 
| 299 | 
            +
                    # @!attribute channels [r]
         | 
| 300 | 
            +
                    # Return all of the channels this item is linked to.
         | 
| 301 | 
            +
                    #
         | 
| 302 | 
            +
                    # @return [Array<Things::Channel>]
         | 
| 303 | 
            +
                    def channels
         | 
| 304 | 
            +
                      channel_uids.map(&:channel)
         | 
| 305 | 
            +
                    end
         | 
| 306 | 
            +
             | 
| 273 307 | 
             
                    #
         | 
| 274 308 | 
             
                    # @!attribute links [r]
         | 
| 275 309 | 
             
                    # Returns all of the item's links (channels and link configurations).
         | 
| @@ -290,30 +324,43 @@ module OpenHAB | |
| 290 324 | 
             
                    end
         | 
| 291 325 |  | 
| 292 326 | 
             
                    #
         | 
| 293 | 
            -
                    #  | 
| 327 | 
            +
                    # @return [Things::ItemChannelLink, nil]
         | 
| 294 328 | 
             
                    #
         | 
| 295 | 
            -
                    # @ | 
| 296 | 
            -
                    #  | 
| 329 | 
            +
                    # @overload link
         | 
| 330 | 
            +
                    #   Returns the item's link. If an item is linked to more than one channel,
         | 
| 331 | 
            +
                    #   this method only returns the first link.
         | 
| 297 332 | 
             
                    #
         | 
| 298 | 
            -
                    # | 
| 333 | 
            +
                    #   @return [Things::ItemChannelLink, nil]
         | 
| 299 334 | 
             
                    #
         | 
| 300 | 
            -
                    # @ | 
| 301 | 
            -
                    #   LivingRoom_Light_Power.link("mqtt:topic:livingroom-light:power")
         | 
| 335 | 
            +
                    # @overload link(channel, config = {})
         | 
| 302 336 | 
             
                    #
         | 
| 303 | 
            -
                    #  | 
| 304 | 
            -
                    #   LivingRoom_Light_Power.link(things["mqtt:topic:livingroom-light"].channels["power"])
         | 
| 337 | 
            +
                    #   Links the item to a channel.
         | 
| 305 338 | 
             
                    #
         | 
| 306 | 
            -
                    # | 
| 307 | 
            -
                    #    | 
| 308 | 
            -
                    #     "mqtt:topic:outdoor-thermometer:temperature",
         | 
| 309 | 
            -
                    #     profile: "system:hysteresis",
         | 
| 310 | 
            -
                    #     lower: "29 °C",
         | 
| 311 | 
            -
                    #     upper: "30 °C")
         | 
| 339 | 
            +
                    #   @param [String, Things::Channel, Things::ChannelUID] channel The channel to link to.
         | 
| 340 | 
            +
                    #   @param [Hash] config The configuration for the link.
         | 
| 312 341 | 
             
                    #
         | 
| 313 | 
            -
                    # | 
| 314 | 
            -
                    # | 
| 342 | 
            +
                    #   @return [Things::ItemChannelLink] The created link.
         | 
| 343 | 
            +
                    #
         | 
| 344 | 
            +
                    #   @example Link an item to a channel
         | 
| 345 | 
            +
                    #     LivingRoom_Light_Power.link("mqtt:topic:livingroom-light:power")
         | 
| 315 346 | 
             
                    #
         | 
| 316 | 
            -
                     | 
| 347 | 
            +
                    #   @example Link to a Thing's channel
         | 
| 348 | 
            +
                    #     LivingRoom_Light_Power.link(things["mqtt:topic:livingroom-light"].channels["power"])
         | 
| 349 | 
            +
                    #
         | 
| 350 | 
            +
                    #   @example Specify a link configuration
         | 
| 351 | 
            +
                    #     High_Temperature_Alert.link(
         | 
| 352 | 
            +
                    #       "mqtt:topic:outdoor-thermometer:temperature",
         | 
| 353 | 
            +
                    #       profile: "system:hysteresis",
         | 
| 354 | 
            +
                    #       lower: "29 °C",
         | 
| 355 | 
            +
                    #       upper: "30 °C")
         | 
| 356 | 
            +
                    #
         | 
| 357 | 
            +
                    #   @see links
         | 
| 358 | 
            +
                    #   @see unlink
         | 
| 359 | 
            +
                    #
         | 
| 360 | 
            +
                    def link(channel = nil, config = nil)
         | 
| 361 | 
            +
                      return Things::Links::Provider.registry.get_links(name).first if channel.nil? && config.nil?
         | 
| 362 | 
            +
             | 
| 363 | 
            +
                      config ||= {}
         | 
| 317 364 | 
             
                      Core::Things::Links::Provider.create_link(self, channel, config).tap do |new_link|
         | 
| 318 365 | 
             
                        provider = Core::Things::Links::Provider.current
         | 
| 319 366 | 
             
                        if !(current_link = provider.get(new_link.uid))
         | 
| @@ -63,7 +63,7 @@ module OpenHAB | |
| 63 63 | 
             
                    #
         | 
| 64 64 | 
             
                    # @example
         | 
| 65 65 | 
             
                    #   sitemaps.build do
         | 
| 66 | 
            -
                    #     sitemap "default", "My Residence" do
         | 
| 66 | 
            +
                    #     sitemap "default", label: "My Residence" do
         | 
| 67 67 | 
             
                    #       frame label: "Control" do
         | 
| 68 68 | 
             
                    #         text label: "Climate", icon: "if:mdi:home-thermometer-outline" do
         | 
| 69 69 | 
             
                    #           frame label: "Main Floor" do
         | 
| @@ -33,6 +33,13 @@ module OpenHAB | |
| 33 33 | 
             
                    end
         | 
| 34 34 |  | 
| 35 35 | 
             
                    alias_method :channel_uid, :linked_uid
         | 
| 36 | 
            +
             | 
| 37 | 
            +
                    # @return [String]
         | 
| 38 | 
            +
                    def inspect
         | 
| 39 | 
            +
                      r = "#<OpenHAB::Core::Things::ItemChannelLink item_name=#{item_name} channel_uid=#{channel_uid}"
         | 
| 40 | 
            +
                      r += " configuration=#{configuration.properties.to_h}" unless configuration.properties.empty?
         | 
| 41 | 
            +
                      "#{r}>"
         | 
| 42 | 
            +
                    end
         | 
| 36 43 | 
             
                  end
         | 
| 37 44 | 
             
                end
         | 
| 38 45 | 
             
              end
         | 
| @@ -18,11 +18,12 @@ module OpenHAB | |
| 18 18 | 
             
                    end
         | 
| 19 19 |  | 
| 20 20 | 
             
                    # (see SitemapBuilder#initialize)
         | 
| 21 | 
            +
                    # @!method sitemap(name, label: nil, icon: nil, &block)
         | 
| 21 22 | 
             
                    # @yield Block executed in the context of a {SitemapBuilder}
         | 
| 22 23 | 
             
                    # @return [SitemapBuilder]
         | 
| 23 24 | 
             
                    # @!visibility public
         | 
| 24 | 
            -
                    def sitemap(name, label  | 
| 25 | 
            -
                      sitemap = SitemapBuilder.new(name, label, icon: icon)
         | 
| 25 | 
            +
                    def sitemap(name, label: nil, icon: nil, &block)
         | 
| 26 | 
            +
                      sitemap = SitemapBuilder.new(name, label: label, icon: icon)
         | 
| 26 27 | 
             
                      sitemap.instance_eval_with_dummy_items(&block) if block
         | 
| 27 28 | 
             
                      sitemap = sitemap.build
         | 
| 28 29 | 
             
                      if @update && @provider.get(sitemap.uid)
         | 
| @@ -1110,7 +1111,7 @@ module OpenHAB | |
| 1110 1111 | 
             
                    # @param label [String, nil]
         | 
| 1111 1112 | 
             
                    # @param icon [String, nil]
         | 
| 1112 1113 | 
             
                    # @!visibility private
         | 
| 1113 | 
            -
                    def initialize(name, label  | 
| 1114 | 
            +
                    def initialize(name, label: nil, icon: nil)
         | 
| 1114 1115 | 
             
                      super(:sitemap, label: label, icon: icon)
         | 
| 1115 1116 |  | 
| 1116 1117 | 
             
                      @name = name
         | 
    
        data/lib/openhab/dsl/version.rb
    CHANGED
    
    
    
        data/lib/openhab/osgi.rb
    CHANGED
    
    | @@ -33,20 +33,25 @@ module OpenHAB | |
| 33 33 | 
             
                  # Register a new service instance with OSGi
         | 
| 34 34 | 
             
                  #
         | 
| 35 35 | 
             
                  # @param [Object] instance The service instance
         | 
| 36 | 
            -
                  # @param [Module] interfaces The interfaces to register this service for.
         | 
| 36 | 
            +
                  # @param [Module, String] interfaces The interfaces to register this service for.
         | 
| 37 37 | 
             
                  #   If not provided, it will default to all Java interfaces the instance
         | 
| 38 38 | 
             
                  #   implements.
         | 
| 39 | 
            +
                  # @param [org.osgi.framework.Bundle, nil] bundle The bundle to register
         | 
| 40 | 
            +
                  #   the service from. If not provided, it will default to the bundle of the first
         | 
| 41 | 
            +
                  #   interface.
         | 
| 39 42 | 
             
                  # @param [Hash] properties The service registration properties.
         | 
| 40 43 | 
             
                  # @return [org.osgi.framework.ServiceRegistration]
         | 
| 41 44 | 
             
                  #
         | 
| 42 | 
            -
                  def register_service(instance, *interfaces, **properties)
         | 
| 45 | 
            +
                  def register_service(instance, *interfaces, bundle: nil, **properties)
         | 
| 43 46 | 
             
                    if interfaces.empty?
         | 
| 44 47 | 
             
                      interfaces = instance.class.ancestors.select { |k| k.respond_to?(:java_class) && k.java_class&.interface? }
         | 
| 45 48 | 
             
                    end
         | 
| 46 49 |  | 
| 47 | 
            -
                     | 
| 50 | 
            +
                    bundle_class = interfaces.first.is_a?(Module) ? interfaces.first : instance
         | 
| 51 | 
            +
                    bundle ||= org.osgi.framework.FrameworkUtil.get_bundle(bundle_class.java_class)
         | 
| 52 | 
            +
                    interfaces.map! { |i| i.is_a?(String) ? i : i.java_class.name }
         | 
| 48 53 | 
             
                    bundle.bundle_context.register_service(
         | 
| 49 | 
            -
                      interfaces. | 
| 54 | 
            +
                      interfaces.to_java(java.lang.String),
         | 
| 50 55 | 
             
                      instance,
         | 
| 51 56 | 
             
                      java.util.Hashtable.new(properties)
         | 
| 52 57 | 
             
                    )
         | 
| @@ -63,6 +68,32 @@ module OpenHAB | |
| 63 68 | 
             
                  def bundle
         | 
| 64 69 | 
             
                    @bundle ||= org.osgi.framework.FrameworkUtil.getBundle($scriptExtension.java_class)
         | 
| 65 70 | 
             
                  end
         | 
| 71 | 
            +
             | 
| 72 | 
            +
                  # @!visibility private
         | 
| 73 | 
            +
                  SCR_NAMESPACE = "http://www.osgi.org/xmlns/scr/v1.4.0"
         | 
| 74 | 
            +
                  private_constant :SCR_NAMESPACE
         | 
| 75 | 
            +
             | 
| 76 | 
            +
                  # @!visibility private
         | 
| 77 | 
            +
                  def service_component_classes(bundle)
         | 
| 78 | 
            +
                    require "nokogiri"
         | 
| 79 | 
            +
             | 
| 80 | 
            +
                    component_paths = bundle.headers.get(
         | 
| 81 | 
            +
                      org.osgi.service.component.ComponentConstants::SERVICE_COMPONENT
         | 
| 82 | 
            +
                    )&.split(",") || []
         | 
| 83 | 
            +
                    component_paths.filter_map do |path|
         | 
| 84 | 
            +
                      stream = bundle.get_entry(path).open_stream
         | 
| 85 | 
            +
                      xml = Nokogiri::XML(String.from_java_bytes(stream.read_all_bytes))
         | 
| 86 | 
            +
             | 
| 87 | 
            +
                      class_name = xml.at_xpath("scr:component/implementation", scr: SCR_NAMESPACE)&.[]("class")
         | 
| 88 | 
            +
                      next unless class_name
         | 
| 89 | 
            +
             | 
| 90 | 
            +
                      services = xml.xpath("scr:component/service/provide", scr: SCR_NAMESPACE).map { |p| p["interface"] }
         | 
| 91 | 
            +
             | 
| 92 | 
            +
                      [bundle.load_class(class_name), services]
         | 
| 93 | 
            +
                    ensure
         | 
| 94 | 
            +
                      stream&.close
         | 
| 95 | 
            +
                    end.to_h
         | 
| 96 | 
            +
                  end
         | 
| 66 97 | 
             
                end
         | 
| 67 98 | 
             
              end
         | 
| 68 99 | 
             
            end
         | 
| @@ -77,23 +77,37 @@ module OpenHAB | |
| 77 77 | 
             
                  #
         | 
| 78 78 | 
             
                  # @return [void]
         | 
| 79 79 | 
             
                  #
         | 
| 80 | 
            +
                  # @deprecated
         | 
| 80 81 | 
             
                  def autoupdate_all_items
         | 
| 81 | 
            -
                     | 
| 82 | 
            -
             | 
| 83 | 
            -
                    end
         | 
| 84 | 
            -
             | 
| 85 | 
            -
                    @autoupdated_items = []
         | 
| 86 | 
            -
                    @spec_metadata_provider = Core::Items::Metadata::Provider.current
         | 
| 82 | 
            +
                    # no-op
         | 
| 83 | 
            +
                  end
         | 
| 87 84 |  | 
| 88 | 
            -
             | 
| 89 | 
            -
             | 
| 90 | 
            -
             | 
| 91 | 
            -
             | 
| 92 | 
            -
             | 
| 93 | 
            -
             | 
| 94 | 
            -
             | 
| 95 | 
            -
             | 
| 85 | 
            +
                  #
         | 
| 86 | 
            +
                  # Force things to come online that are missing their thing type
         | 
| 87 | 
            +
                  #
         | 
| 88 | 
            +
                  # As of openHAB 4.0, things that are missing their thing type will not
         | 
| 89 | 
            +
                  # come online immediately. This especially impacts bindings that
         | 
| 90 | 
            +
                  # dynamically generate their thing types, but don't persist those
         | 
| 91 | 
            +
                  # thing types. You can use this method to force them to come online
         | 
| 92 | 
            +
                  # immediately.
         | 
| 93 | 
            +
                  #
         | 
| 94 | 
            +
                  # @return [void]
         | 
| 95 | 
            +
                  #
         | 
| 96 | 
            +
                  def initialize_missing_thing_types
         | 
| 97 | 
            +
                    thing_manager = OpenHAB::OSGi.service("org.openhab.core.thing.ThingManager")
         | 
| 98 | 
            +
                    thing_manager.class.field_reader :missingPrerequisites
         | 
| 99 | 
            +
                    first = true
         | 
| 100 | 
            +
                    thing_manager.missingPrerequisites.each_value do |prereq|
         | 
| 101 | 
            +
                      if first
         | 
| 102 | 
            +
                        prereq.class.field_accessor :timesChecked
         | 
| 103 | 
            +
                        first = false
         | 
| 96 104 | 
             
                      end
         | 
| 105 | 
            +
                      prereq.timesChecked = 60
         | 
| 106 | 
            +
                    end
         | 
| 107 | 
            +
                    m = thing_manager.class.java_class.get_declared_method(:checkMissingPrerequisites)
         | 
| 108 | 
            +
                    m.accessible = true
         | 
| 109 | 
            +
                    suspend_rules do
         | 
| 110 | 
            +
                      m.invoke(thing_manager)
         | 
| 97 111 | 
             
                    end
         | 
| 98 112 | 
             
                  end
         | 
| 99 113 |  | 
| @@ -226,8 +240,11 @@ module OpenHAB | |
| 226 240 | 
             
                    require_relative "openhab/core/actions"
         | 
| 227 241 |  | 
| 228 242 | 
             
                    ps = Mocks::PersistenceService.instance
         | 
| 229 | 
            -
                     | 
| 230 | 
            -
             | 
| 243 | 
            +
                    persistence_bundle = org.osgi.framework.FrameworkUtil
         | 
| 244 | 
            +
                                            .get_bundle(org.openhab.core.persistence.PersistenceService.java_class)
         | 
| 245 | 
            +
                    persistence_bundle.bundle_context.register_service(org.openhab.core.persistence.PersistenceService.java_class,
         | 
| 246 | 
            +
                                                                       ps,
         | 
| 247 | 
            +
                                                                       nil)
         | 
| 231 248 |  | 
| 232 249 | 
             
                    rs = OSGi.service("org.openhab.core.service.ReadyService")
         | 
| 233 250 |  | 
| @@ -240,6 +257,33 @@ module OpenHAB | |
| 240 257 | 
             
                      rs.register_tracker(org.openhab.core.service.ReadyService::ReadyTracker.impl { continue.call }, filter)
         | 
| 241 258 | 
             
                    end
         | 
| 242 259 |  | 
| 260 | 
            +
                    begin
         | 
| 261 | 
            +
                      # load storage based type providers
         | 
| 262 | 
            +
                      ast = org.openhab.core.thing.binding.AbstractStorageBasedTypeProvider
         | 
| 263 | 
            +
                      ast_bundle = org.osgi.framework.FrameworkUtil.get_bundle(ast.java_class)
         | 
| 264 | 
            +
                      storage_service = OSGi.service("org.openhab.core.storage.StorageService")
         | 
| 265 | 
            +
                      require_relative "mocks/abstract_storage_based_type_provider_wrapped_storage_service"
         | 
| 266 | 
            +
             | 
| 267 | 
            +
                      OSGi.bundle_context.bundles.each do |bundle|
         | 
| 268 | 
            +
                        OSGi.service_component_classes(bundle)
         | 
| 269 | 
            +
                            .select { |klass, _services| klass.ancestors.include?(ast.java_class) }
         | 
| 270 | 
            +
                            .each do |klass, services|
         | 
| 271 | 
            +
                          new_ast_klass = Class.new(ast)
         | 
| 272 | 
            +
                          new_ast_klass.become_java!
         | 
| 273 | 
            +
                          wrapped_storage_service = Mocks::AbstractStorageBasedTypeProviderWrappedStorageService
         | 
| 274 | 
            +
                                                    .new(storage_service,
         | 
| 275 | 
            +
                                                         new_ast_klass.java_class,
         | 
| 276 | 
            +
                                                         klass)
         | 
| 277 | 
            +
                          new_ast = new_ast_klass.new(wrapped_storage_service)
         | 
| 278 | 
            +
             | 
| 279 | 
            +
                          services -= [klass.name]
         | 
| 280 | 
            +
                          OSGi.register_service(new_ast, *services, bundle: ast_bundle)
         | 
| 281 | 
            +
                        end
         | 
| 282 | 
            +
                      end
         | 
| 283 | 
            +
                    rescue NameError
         | 
| 284 | 
            +
                      # @deprecated OH 4.0
         | 
| 285 | 
            +
                    end
         | 
| 286 | 
            +
             | 
| 243 287 | 
             
                    # RSpec additions
         | 
| 244 288 | 
             
                    require_relative "suspend_rules"
         | 
| 245 289 |  | 
| @@ -422,32 +466,6 @@ module OpenHAB | |
| 422 466 | 
             
                      .gsub(%r{(?:_|(/))([a-z\d]*)}) { "#{$1}#{$2.capitalize}" }
         | 
| 423 467 | 
             
                      .split("/")
         | 
| 424 468 | 
             
                  end
         | 
| 425 | 
            -
             | 
| 426 | 
            -
                  # need to transfer autoupdate metadata from GenericMetadataProvider to ManagedMetadataProvider
         | 
| 427 | 
            -
                  # so that we can mutate it in the future
         | 
| 428 | 
            -
                  def set_up_autoupdates
         | 
| 429 | 
            -
                    registry = Core::Items::Metadata::Provider.registry
         | 
| 430 | 
            -
                    registry.class.field_reader :identifierToElement
         | 
| 431 | 
            -
             | 
| 432 | 
            -
                    autoupdate_provider = Core::Items::Metadata::Provider.send(:new)
         | 
| 433 | 
            -
                    registry.all.each do |metadata|
         | 
| 434 | 
            -
                      next unless metadata.uid.namespace == "autoupdate"
         | 
| 435 | 
            -
             | 
| 436 | 
            -
                      # tweak the registry to allow us to overwrite this element
         | 
| 437 | 
            -
                      registry.identifierToElement.delete(metadata.uid)
         | 
| 438 | 
            -
                      autoupdate_provider.add(metadata)
         | 
| 439 | 
            -
                    end
         | 
| 440 | 
            -
                  end
         | 
| 441 | 
            -
             | 
| 442 | 
            -
                  def restore_autoupdate_items
         | 
| 443 | 
            -
                    return unless instance_variable_defined?(:@autoupdated_items)
         | 
| 444 | 
            -
             | 
| 445 | 
            -
                    @autoupdated_items.each do |(provider, hash)|
         | 
| 446 | 
            -
                      @spec_metadata_provider.remove(hash.uid)
         | 
| 447 | 
            -
                      provider.add(hash.instance_variable_get(:@metadata))
         | 
| 448 | 
            -
                    end
         | 
| 449 | 
            -
                    @autoupdated_items = nil
         | 
| 450 | 
            -
                  end
         | 
| 451 469 | 
             
                end
         | 
| 452 470 |  | 
| 453 471 | 
             
                if defined?(::RSpec)
         | 
    
        data/lib/openhab/rspec/hooks.rb
    CHANGED
    
    | @@ -38,7 +38,6 @@ module OpenHAB | |
| 38 38 | 
             
                      end
         | 
| 39 39 |  | 
| 40 40 | 
             
                      Helpers.autorequires unless Configuration.private_confdir
         | 
| 41 | 
            -
                      Helpers.send(:set_up_autoupdates)
         | 
| 42 41 | 
             
                      Helpers.load_transforms
         | 
| 43 42 | 
             
                      Helpers.load_rules
         | 
| 44 43 |  | 
| @@ -52,6 +51,10 @@ module OpenHAB | |
| 52 51 | 
             
                      end
         | 
| 53 52 | 
             
                    end
         | 
| 54 53 |  | 
| 54 | 
            +
                    config.around do |example|
         | 
| 55 | 
            +
                      Mocks::Timer.mock_timers(self.class.mock_timers?, &example)
         | 
| 56 | 
            +
                    end
         | 
| 57 | 
            +
             | 
| 55 58 | 
             
                    config.before do
         | 
| 56 59 | 
             
                      suspend_rules do
         | 
| 57 60 | 
             
                        $ir.for_each do |_provider, item|
         | 
| @@ -88,8 +91,6 @@ module OpenHAB | |
| 88 91 | 
             
                      @profile_factory = Core::ProfileFactory.send(:new)
         | 
| 89 92 | 
             
                      allow(Core::ProfileFactory).to receive(:instance).and_return(@profile_factory)
         | 
| 90 93 |  | 
| 91 | 
            -
                      stub_const("OpenHAB::Core::Timer", Mocks::Timer) if self.class.mock_timers?
         | 
| 92 | 
            -
             | 
| 93 94 | 
             
                      log_line = "rspec #{example.location} # #{example.full_description}"
         | 
| 94 95 | 
             
                      logger.info(log_line)
         | 
| 95 96 | 
             
                      Logger.events.info(log_line)
         | 
| @@ -103,7 +104,6 @@ module OpenHAB | |
| 103 104 | 
             
                      # wipe this
         | 
| 104 105 | 
             
                      DSL::Items::TimedCommand.timed_commands.clear
         | 
| 105 106 | 
             
                      Timecop.return
         | 
| 106 | 
            -
                      restore_autoupdate_items
         | 
| 107 107 | 
             
                      Mocks::PersistenceService.instance.reset
         | 
| 108 108 | 
             
                      Hooks.cache_script_extension.sharedCache.clear if DSL.shared_cache
         | 
| 109 109 | 
             
                      DSL.persistence!(nil)
         | 
    
        data/lib/openhab/rspec/karaf.rb
    CHANGED
    
    | @@ -537,6 +537,10 @@ module OpenHAB | |
| 537 537 |  | 
| 538 538 | 
             
                  def add_class_loader(bundle)
         | 
| 539 539 | 
             
                    return if @class_loaders.include?(bundle.symbolic_name)
         | 
| 540 | 
            +
                    # this bundle sometimes has an invalid internal jar (geronimo-osgi-locator.jar) which will
         | 
| 541 | 
            +
                    # spam the logs with useless errors. it's doubtful we'll need to access a class from this
         | 
| 542 | 
            +
                    # bundle directly
         | 
| 543 | 
            +
                    return if bundle.symbolic_name == "org.apache.aries.javax.jax.rs-api"
         | 
| 540 544 |  | 
| 541 545 | 
             
                    @class_loaders << bundle.symbolic_name
         | 
| 542 546 | 
             
                    ::JRuby.runtime.instance_config.add_loader(JRuby::OSGiBundleClassLoader.new(bundle))
         | 
| @@ -0,0 +1,24 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            require "delegate"
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            module OpenHAB
         | 
| 6 | 
            +
              module RSpec
         | 
| 7 | 
            +
                # @!visibility private
         | 
| 8 | 
            +
                module Mocks
         | 
| 9 | 
            +
                  class AbstractStorageBasedTypeProviderWrappedStorageService < SimpleDelegator
         | 
| 10 | 
            +
                    include org.openhab.core.storage.StorageService
         | 
| 11 | 
            +
             | 
| 12 | 
            +
                    def initialize(parent, ruby_klass, java_klass)
         | 
| 13 | 
            +
                      super(parent)
         | 
| 14 | 
            +
                      @ruby_klass = ruby_klass
         | 
| 15 | 
            +
                      @java_klass = java_klass
         | 
| 16 | 
            +
                    end
         | 
| 17 | 
            +
             | 
| 18 | 
            +
                    def getStorage(name, _class_loader) # rubocop:disable Naming/MethodName
         | 
| 19 | 
            +
                      super(name.sub(@ruby_klass.name, @java_klass.name), @java_klass.class_loader)
         | 
| 20 | 
            +
                    end
         | 
| 21 | 
            +
                  end
         | 
| 22 | 
            +
                end
         | 
| 23 | 
            +
              end
         | 
| 24 | 
            +
            end
         | 
| @@ -29,7 +29,13 @@ module OpenHAB | |
| 29 29 | 
             
                      @thing = thing
         | 
| 30 30 | 
             
                    end
         | 
| 31 31 |  | 
| 32 | 
            -
                    def handle_command( | 
| 32 | 
            +
                    def handle_command(channel_uid, command)
         | 
| 33 | 
            +
                      channel = thing.get_channel(channel_uid)
         | 
| 34 | 
            +
                      return unless channel
         | 
| 35 | 
            +
                      return if channel.auto_update_policy == org.openhab.core.thing.type.AutoUpdatePolicy::VETO
         | 
| 36 | 
            +
             | 
| 37 | 
            +
                      callback&.state_updated(channel_uid, command) if command.is_a?(Core::Types::State)
         | 
| 38 | 
            +
                    end
         | 
| 33 39 |  | 
| 34 40 | 
             
                    def set_callback(callback)
         | 
| 35 41 | 
             
                      @callback = callback
         | 
| @@ -72,6 +72,42 @@ module OpenHAB | |
| 72 72 | 
             
                    end
         | 
| 73 73 | 
             
                    Timecop::TimeStackItem.prepend(TimeCopStackItem)
         | 
| 74 74 |  | 
| 75 | 
            +
                    class << self
         | 
| 76 | 
            +
                      # If timers are currently mocked
         | 
| 77 | 
            +
                      # @return [true, false]
         | 
| 78 | 
            +
                      def mock_timers?
         | 
| 79 | 
            +
                        @mock_timers
         | 
| 80 | 
            +
                      end
         | 
| 81 | 
            +
             | 
| 82 | 
            +
                      #
         | 
| 83 | 
            +
                      # Temporarily mock or unmock timers
         | 
| 84 | 
            +
                      #
         | 
| 85 | 
            +
                      # @param [true, false] mock_timers if timers should be mocked
         | 
| 86 | 
            +
                      # @yield
         | 
| 87 | 
            +
                      # @return [Object] the block's return value
         | 
| 88 | 
            +
                      def mock_timers(mock_timers)
         | 
| 89 | 
            +
                        old_mock_timers = @mock_timers
         | 
| 90 | 
            +
                        @mock_timers = mock_timers
         | 
| 91 | 
            +
                        yield
         | 
| 92 | 
            +
                      ensure
         | 
| 93 | 
            +
                        @mock_timers = old_mock_timers
         | 
| 94 | 
            +
                      end
         | 
| 95 | 
            +
                    end
         | 
| 96 | 
            +
             | 
| 97 | 
            +
                    @mock_timers = true
         | 
| 98 | 
            +
             | 
| 99 | 
            +
                    # @!visibility private
         | 
| 100 | 
            +
                    module ClassMethods
         | 
| 101 | 
            +
                      # @!visibility private
         | 
| 102 | 
            +
                      def new(*args, **kwargs)
         | 
| 103 | 
            +
                        return super if self == Timer
         | 
| 104 | 
            +
                        return Timer.new(*args, **kwargs) if Timer.mock_timers?
         | 
| 105 | 
            +
             | 
| 106 | 
            +
                        super
         | 
| 107 | 
            +
                      end
         | 
| 108 | 
            +
                    end
         | 
| 109 | 
            +
                    Core::Timer.singleton_class.prepend(ClassMethods)
         | 
| 110 | 
            +
             | 
| 75 111 | 
             
                    attr_reader :execution_time, :id, :block
         | 
| 76 112 |  | 
| 77 113 | 
             
                    def initialize(time, id:, thread_locals:, block:) # rubocop:disable Lint/MissingSuper
         | 
    
        metadata
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: openhab-scripting
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 5. | 
| 4 | 
            +
              version: 5.14.0
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Brian O'Connell
         | 
| @@ -10,7 +10,7 @@ authors: | |
| 10 10 | 
             
            autorequire: 
         | 
| 11 11 | 
             
            bindir: bin
         | 
| 12 12 | 
             
            cert_chain: []
         | 
| 13 | 
            -
            date: 2024-01- | 
| 13 | 
            +
            date: 2024-01-05 00:00:00.000000000 Z
         | 
| 14 14 | 
             
            dependencies:
         | 
| 15 15 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 16 16 | 
             
              name: bundler
         | 
| @@ -546,6 +546,7 @@ files: | |
| 546 546 | 
             
            - lib/openhab/rspec/hooks.rb
         | 
| 547 547 | 
             
            - lib/openhab/rspec/jruby.rb
         | 
| 548 548 | 
             
            - lib/openhab/rspec/karaf.rb
         | 
| 549 | 
            +
            - lib/openhab/rspec/mocks/abstract_storage_based_type_provider_wrapped_storage_service.rb
         | 
| 549 550 | 
             
            - lib/openhab/rspec/mocks/bundle_install_support.rb
         | 
| 550 551 | 
             
            - lib/openhab/rspec/mocks/bundle_resolver.rb
         | 
| 551 552 | 
             
            - lib/openhab/rspec/mocks/event_admin.rb
         | 
| @@ -607,7 +608,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement | |
| 607 608 | 
             
                - !ruby/object:Gem::Version
         | 
| 608 609 | 
             
                  version: '0'
         | 
| 609 610 | 
             
            requirements: []
         | 
| 610 | 
            -
            rubygems_version: 3. | 
| 611 | 
            +
            rubygems_version: 3.5.4
         | 
| 611 612 | 
             
            signing_key: 
         | 
| 612 613 | 
             
            specification_version: 4
         | 
| 613 614 | 
             
            summary: JRuby Helper Libraries for openHAB Scripting
         |