openhab-scripting 5.10.0 → 5.11.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/openhab/core/items/dimmer_item.rb +10 -0
- data/lib/openhab/core/items/generic_item.rb +7 -1
- data/lib/openhab/core/items/player_item.rb +26 -0
- data/lib/openhab/core/items/rollershutter_item.rb +16 -0
- data/lib/openhab/core/items/semantics/enumerable.rb +19 -0
- data/lib/openhab/core/items/switch_item.rb +8 -0
- data/lib/openhab/core/items.rb +9 -3
- data/lib/openhab/core/things/profile_callback.rb +4 -3
- data/lib/openhab/dsl/items/ensure.rb +1 -1
- data/lib/openhab/dsl/things/builder.rb +27 -12
- data/lib/openhab/dsl/version.rb +1 -1
- data/lib/openhab/dsl.rb +43 -5
- data/lib/openhab/rspec/shell.rb +27 -17
- 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: 9e7d078cc73659d0f435950d36438b67759b2e3b5c0abf80f258a36101792a0d
|
4
|
+
data.tar.gz: 2a76c20015d6320b64a2a9ea79557c7133b1101a8514fabba9241f91b455615d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: bc54b1fae7be3bee15b1af2c27526cf942a13741404dd1c0e61034b82d2d472703bfb48ef921d25ed608dbe3d9c964abbded85ab1d3adfd855847229c6bf2447
|
7
|
+
data.tar.gz: c454623c911c90be03464391f885b8ccebfd2789b5e9dbbe32a6f8309fdf7e1f948e2c0730373d383bf7892271ab752bf9d8c2197ed541cff7f33a692ea296ec
|
@@ -133,6 +133,16 @@ module OpenHAB
|
|
133
133
|
# Send the {DECREASE} command to the item
|
134
134
|
# @return [DimmerItem] `self`
|
135
135
|
|
136
|
+
# @!method increase!
|
137
|
+
# Send the {INCREASE} command to the item, even when
|
138
|
+
# {OpenHAB::DSL.ensure_states! ensure_states!} is in effect.
|
139
|
+
# @return [DimmerItem] `self`
|
140
|
+
|
141
|
+
# @!method decrease!
|
142
|
+
# Send the {DECREASE} command to the item, even when
|
143
|
+
# {OpenHAB::DSL.ensure_states! ensure_states!} is in effect.
|
144
|
+
# @return [DimmerItem] `self`
|
145
|
+
|
136
146
|
# raw numbers translate directly to PercentType, not a DecimalType
|
137
147
|
# @!visibility private
|
138
148
|
def format_type(command)
|
@@ -128,15 +128,19 @@ module OpenHAB
|
|
128
128
|
# Send a command to this item
|
129
129
|
#
|
130
130
|
# When this method is chained after the {OpenHAB::DSL::Items::Ensure::Ensurable#ensure ensure}
|
131
|
-
# method, or issued inside an {OpenHAB::DSL.ensure_states ensure_states} block,
|
131
|
+
# method, or issued inside an {OpenHAB::DSL.ensure_states ensure_states} block, or after
|
132
|
+
# {OpenHAB::DSL.ensure_states! ensure_states!} have been called,
|
132
133
|
# the command will only be sent if the item is not already in the same state.
|
133
134
|
#
|
135
|
+
# The similar method `command!`, however, will always send the command regardless of the item's state.
|
136
|
+
#
|
134
137
|
# @param [Command] command command to send to the item
|
135
138
|
# @return [self, nil] nil when `ensure` is in effect and the item was already in the same state,
|
136
139
|
# otherwise the item.
|
137
140
|
#
|
138
141
|
# @see DSL::Items::TimedCommand#command Timed Command
|
139
142
|
# @see OpenHAB::DSL.ensure_states ensure_states
|
143
|
+
# @see OpenHAB::DSL.ensure_states! ensure_states!
|
140
144
|
# @see DSL::Items::Ensure::Ensurable#ensure ensure
|
141
145
|
#
|
142
146
|
def command(command)
|
@@ -145,6 +149,7 @@ module OpenHAB
|
|
145
149
|
$events.send_command(self, command)
|
146
150
|
Proxy.new(self)
|
147
151
|
end
|
152
|
+
alias_method :command!, :command
|
148
153
|
|
149
154
|
# not an alias to allow easier stubbing and overriding
|
150
155
|
def <<(command)
|
@@ -170,6 +175,7 @@ module OpenHAB
|
|
170
175
|
$events.post_update(self, state)
|
171
176
|
Proxy.new(self)
|
172
177
|
end
|
178
|
+
alias_method :update!, :update
|
173
179
|
|
174
180
|
# @!visibility private
|
175
181
|
def format_command(command)
|
@@ -39,25 +39,51 @@ module OpenHAB
|
|
39
39
|
# Send the {PLAY} command to the item
|
40
40
|
# @return [PlayerItem] `self`
|
41
41
|
|
42
|
+
# @!method play!
|
43
|
+
# Send the {PLAY} command to the item, even when {OpenHAB::DSL.ensure_states! ensure_states!} is in effect.
|
44
|
+
# @return [PlayerItem] `self`
|
45
|
+
|
42
46
|
# @!method pause
|
43
47
|
# Send the {PAUSE} command to the item
|
44
48
|
# @return [PlayerItem] `self`
|
45
49
|
|
50
|
+
# @!method pause!
|
51
|
+
# Send the {PAUSE} command to the item, even when {OpenHAB::DSL.ensure_states! ensure_states!} is in effect.
|
52
|
+
# @return [PlayerItem] `self`
|
53
|
+
|
46
54
|
# @!method rewind
|
47
55
|
# Send the {REWIND} command to the item
|
48
56
|
# @return [PlayerItem] `self`
|
49
57
|
|
58
|
+
# @!method rewind
|
59
|
+
# Send the {REWIND} command to the item, even when {OpenHAB::DSL.ensure_states! ensure_states!} is in effect.
|
60
|
+
# @return [PlayerItem] `self`
|
61
|
+
|
50
62
|
# @!method fast_forward
|
51
63
|
# Send the {FASTFORWARD} command to the item
|
52
64
|
# @return [PlayerItem] `self`
|
53
65
|
|
66
|
+
# @!method fast_forward!
|
67
|
+
# Send the {FASTFORWARD} command to the item, even when
|
68
|
+
# {OpenHAB::DSL.ensure_states! ensure_states!} is in effect.
|
69
|
+
# @return [PlayerItem] `self`
|
70
|
+
|
54
71
|
# @!method next
|
55
72
|
# Send the {NEXT} command to the item
|
56
73
|
# @return [PlayerItem] `self`
|
57
74
|
|
75
|
+
# @!method next!
|
76
|
+
# Send the {NEXT} command to the item, even when {OpenHAB::DSL.ensure_states! ensure_states!} is in effect.
|
77
|
+
# @return [PlayerItem] `self`
|
78
|
+
|
58
79
|
# @!method previous
|
59
80
|
# Send the {PREVIOUS} command to the item
|
60
81
|
# @return [PlayerItem] `self`
|
82
|
+
|
83
|
+
# @!method previous!
|
84
|
+
# Send the {PREVIOUS} command to the item, even when
|
85
|
+
# {OpenHAB::DSL.ensure_states! ensure_states!} is in effect.
|
86
|
+
# @return [PlayerItem] `self`
|
61
87
|
end
|
62
88
|
end
|
63
89
|
end
|
@@ -41,18 +41,34 @@ module OpenHAB
|
|
41
41
|
# Send the {UP} command to the item
|
42
42
|
# @return [RollershutterItem] `self`
|
43
43
|
|
44
|
+
# @!method up!
|
45
|
+
# Send the {UP} command to the item, even when {OpenHAB::DSL.ensure_states! ensure_states!} is in effect.
|
46
|
+
# @return [RollershutterItem] `self`
|
47
|
+
|
44
48
|
# @!method down
|
45
49
|
# Send the {DOWN} command to the item
|
46
50
|
# @return [RollershutterItem] `self`
|
47
51
|
|
52
|
+
# @!method down!
|
53
|
+
# Send the {DOWN} command to the item, even when {OpenHAB::DSL.ensure_states! ensure_states!} is in effect.
|
54
|
+
# @return [RollershutterItem] `self`
|
55
|
+
|
48
56
|
# @!method stop
|
49
57
|
# Send the {STOP} command to the item
|
50
58
|
# @return [RollershutterItem] `self`
|
51
59
|
|
60
|
+
# @!method stop!
|
61
|
+
# Send the {STOP} command to the item, even when {OpenHAB::DSL.ensure_states! ensure_states!} is in effect.
|
62
|
+
# @return [RollershutterItem] `self`
|
63
|
+
|
52
64
|
# @!method move
|
53
65
|
# Send the {MOVE} command to the item
|
54
66
|
# @return [RollershutterItem] `self`
|
55
67
|
|
68
|
+
# @!method move!
|
69
|
+
# Send the {MOVE} command to the item, even when {OpenHAB::DSL.ensure_states! ensure_states!} is in effect.
|
70
|
+
# @return [RollershutterItem] `self`
|
71
|
+
|
56
72
|
# raw numbers translate directly to PercentType, not a DecimalType
|
57
73
|
# @!visibility private
|
58
74
|
def format_type(command)
|
@@ -101,6 +101,15 @@ module Enumerable
|
|
101
101
|
self if count { |i| i.command(command) }.positive?
|
102
102
|
end
|
103
103
|
|
104
|
+
# Send a command to every item in the collection, even when {OpenHAB::DSL.ensure_states! ensure_states!} is in effect.
|
105
|
+
# @return [self]
|
106
|
+
def command!(command)
|
107
|
+
# We cannot alias this to #command above, otherwise it will call
|
108
|
+
# DSL::Items::Ensure::Item#command which checks for ensure_states
|
109
|
+
each { |i| i.command!(command) }
|
110
|
+
self
|
111
|
+
end
|
112
|
+
|
104
113
|
# Update the state of every item in the collection
|
105
114
|
# @return [self, nil] nil when `ensure` is in effect and all the items were already in the same state,
|
106
115
|
# otherwise self
|
@@ -108,6 +117,16 @@ module Enumerable
|
|
108
117
|
self if count { |i| i.update(state) }.positive?
|
109
118
|
end
|
110
119
|
|
120
|
+
# Update the state of every item in the collection, even when
|
121
|
+
# {OpenHAB::DSL.ensure_states! ensure_states!} is in effect.
|
122
|
+
# @return [self]
|
123
|
+
def update!(state)
|
124
|
+
# We cannot alias this to #update above, otherwise it will call
|
125
|
+
# DSL::Items::Ensure::Item#update which checks for ensure_states
|
126
|
+
each { |i| i.update!(state) }
|
127
|
+
self
|
128
|
+
end
|
129
|
+
|
111
130
|
# @!method refresh
|
112
131
|
# Send the {REFRESH} command to every item in the collection
|
113
132
|
# @return [self]
|
@@ -67,9 +67,17 @@ module OpenHAB
|
|
67
67
|
# Send the {ON} command to the item
|
68
68
|
# @return [SwitchItem] `self`
|
69
69
|
|
70
|
+
# @!method on!
|
71
|
+
# Send the {ON} command to the item, even when {OpenHAB::DSL.ensure_states! ensure_states!} is in effect.
|
72
|
+
# @return [SwitchItem] `self`
|
73
|
+
|
70
74
|
# @!method off
|
71
75
|
# Send the {OFF} command to the item
|
72
76
|
# @return [SwitchItem] `self`
|
77
|
+
|
78
|
+
# @!method off!
|
79
|
+
# Send the {OFF} command to the item, even when {OpenHAB::DSL.ensure_states! ensure_states!} is in effect.
|
80
|
+
# @return [SwitchItem] `self`
|
73
81
|
end
|
74
82
|
end
|
75
83
|
end
|
data/lib/openhab/core/items.rb
CHANGED
@@ -65,13 +65,19 @@ module OpenHAB
|
|
65
65
|
ruby2_keywords def #{command}(*args, &block) # ruby2_keywords def on(*args, &block)
|
66
66
|
command(#{value}, *args, &block) # command(ON, *args, &block)
|
67
67
|
end # end
|
68
|
+
ruby2_keywords def #{command}!(*args, &block) # ruby2_keywords def on!(*args, &block)
|
69
|
+
command!(#{value}, *args, &block) # command!(ON, *args, &block)
|
70
|
+
end # end
|
68
71
|
RUBY
|
69
72
|
|
70
73
|
logger.trace("Defining Enumerable##{command} for #{value}")
|
71
74
|
Enumerable.class_eval <<~RUBY, __FILE__, __LINE__ + 1
|
72
|
-
def #{command}
|
73
|
-
each(&:#{command})
|
74
|
-
end
|
75
|
+
def #{command} # def on
|
76
|
+
each(&:#{command}) # each(&:on)
|
77
|
+
end # end
|
78
|
+
def #{command}! # def on!
|
79
|
+
each(&:#{command}!) # each(&:on!)
|
80
|
+
end # end
|
75
81
|
RUBY
|
76
82
|
|
77
83
|
logger.trace("Defining ItemCommandEvent##{command}? for #{value}")
|
@@ -14,9 +14,10 @@ module OpenHAB
|
|
14
14
|
# @param [Command] command
|
15
15
|
#
|
16
16
|
def handle_command(command)
|
17
|
-
|
18
|
-
|
19
|
-
|
17
|
+
unless instance_variable_defined?(:@dummy_channel_item)
|
18
|
+
@dummy_channel_item = DSL::Items::ItemBuilder.item_factory.create_item(link.channel.accepted_item_type, "")
|
19
|
+
end
|
20
|
+
command = @dummy_channel_item.format_command(command) if @dummy_channel_item
|
20
21
|
super(command)
|
21
22
|
end
|
22
23
|
|
@@ -24,7 +24,7 @@ module OpenHAB
|
|
24
24
|
|
25
25
|
# Extensions for {::Item} to implement {Ensure}'s functionality
|
26
26
|
#
|
27
|
-
# @see OpenHAB::DSL
|
27
|
+
# @see OpenHAB::DSL::Items::Ensure::Ensurable#ensure ensure
|
28
28
|
# @see OpenHAB::DSL.ensure_states ensure_states
|
29
29
|
module Item
|
30
30
|
include Ensurable
|
@@ -210,7 +210,18 @@ module OpenHAB
|
|
210
210
|
thing_type,
|
211
211
|
self.class.config_description_registry
|
212
212
|
)
|
213
|
+
|
214
|
+
predefined_channels = self.class.thing_factory_helper
|
215
|
+
.create_channels(thing_type, uid, self.class.config_description_registry)
|
216
|
+
.to_h { |channel| [channel.uid, channel] }
|
217
|
+
new_channels = channels.to_h { |channel| [channel.uid, channel] }
|
218
|
+
merged_channels = predefined_channels.merge(new_channels) do |_key, predefined_channel, new_channel|
|
219
|
+
predefined_channel.configuration.merge!(new_channel.configuration)
|
220
|
+
predefined_channel
|
221
|
+
end
|
222
|
+
@channels = merged_channels.values
|
213
223
|
end
|
224
|
+
|
214
225
|
builder = org.openhab.core.thing.binding.builder.ThingBuilder
|
215
226
|
.create(thing_type_uid, uid)
|
216
227
|
.with_label(label)
|
@@ -219,15 +230,7 @@ module OpenHAB
|
|
219
230
|
.with_bridge(bridge_uid)
|
220
231
|
.with_channels(channels)
|
221
232
|
|
222
|
-
if thing_type
|
223
|
-
# can't use with_channels, or it will wipe out custom channels from above
|
224
|
-
self.class.thing_factory_helper.create_channels(thing_type,
|
225
|
-
uid,
|
226
|
-
self.class.config_description_registry).each do |channel|
|
227
|
-
builder.with_channel(channel)
|
228
|
-
end
|
229
|
-
builder.with_properties(thing_type.properties)
|
230
|
-
end
|
233
|
+
builder.with_properties(thing_type.properties) if thing_type
|
231
234
|
|
232
235
|
builder.build
|
233
236
|
end
|
@@ -263,8 +266,14 @@ module OpenHAB
|
|
263
266
|
:default_tags,
|
264
267
|
:properties,
|
265
268
|
:description,
|
266
|
-
:auto_update_policy
|
267
|
-
|
269
|
+
:auto_update_policy
|
270
|
+
|
271
|
+
class << self
|
272
|
+
# @!visibility private
|
273
|
+
def channel_type_registry
|
274
|
+
@channel_type_registry ||= OSGi.service("org.openhab.core.thing.type.ChannelTypeRegistry")
|
275
|
+
end
|
276
|
+
end
|
268
277
|
|
269
278
|
#
|
270
279
|
# Constructor for ChannelBuilder
|
@@ -284,7 +293,7 @@ module OpenHAB
|
|
284
293
|
# The default tags for this channel.
|
285
294
|
# @param [:default, :recommend, :veto, org.openhab.core.thing.type.AutoUpdatePolicy] auto_update_policy
|
286
295
|
# The channel's auto update policy.
|
287
|
-
# @param [String] accepted_item_type The accepted item type.
|
296
|
+
# @param [String] accepted_item_type The accepted item type. If nil, infer the item type from the channel type.
|
288
297
|
#
|
289
298
|
def initialize(uid,
|
290
299
|
type,
|
@@ -343,6 +352,12 @@ module OpenHAB
|
|
343
352
|
.build
|
344
353
|
end
|
345
354
|
|
355
|
+
# @!attribute [r] accepted_item_type
|
356
|
+
# @return [String] The accepted item type.
|
357
|
+
def accepted_item_type
|
358
|
+
@accepted_item_type ||= self.class.channel_type_registry.get_channel_type(type)&.item_type
|
359
|
+
end
|
360
|
+
|
346
361
|
private
|
347
362
|
|
348
363
|
def kind
|
data/lib/openhab/dsl/version.rb
CHANGED
data/lib/openhab/dsl.rb
CHANGED
@@ -557,10 +557,49 @@ module OpenHAB
|
|
557
557
|
# to reduce repetitions
|
558
558
|
#
|
559
559
|
|
560
|
+
#
|
561
|
+
# Permanently enable conditional execution of commands and updates for the current thread.
|
562
|
+
#
|
563
|
+
# When conditional executions are enabled, commands and updates will only be sent if the
|
564
|
+
# item's current state is not the same as the command or updated state.
|
565
|
+
# This eliminates the need to chain the command and update calls through
|
566
|
+
# {DSL::Items::Ensure::Ensurable#ensure ensure}.
|
567
|
+
#
|
568
|
+
# When conditional executions are enabled either by this method or within a block of {ensure_states},
|
569
|
+
# commands and updates can still be forcefully executed using the corresponding bang methods, e.g.
|
570
|
+
# `Item1.on!`, `Item1.command!(50)`, or `Item1.update!(ON)`.
|
571
|
+
#
|
572
|
+
# @note This method is only intended for use at the top level of rule
|
573
|
+
# scripts. If it's used within library methods, or hap-hazardly within
|
574
|
+
# rules, things can get very confusing because the prior state won't be
|
575
|
+
# properly restored.
|
576
|
+
#
|
577
|
+
# @param [Boolean] active Whether to enable or disable conditional executions.
|
578
|
+
# @return [Boolean] The previous ensure_states setting.
|
579
|
+
#
|
580
|
+
# @example Make ensure_states the default for the rest of the script
|
581
|
+
# ensure_states!
|
582
|
+
#
|
583
|
+
# # From now, all commands are "ensured", i.e. only sent when the current state is different
|
584
|
+
# Item1.on
|
585
|
+
# Item2.command(ON)
|
586
|
+
#
|
587
|
+
# # While ensure_states! is active, we can still forcibly send a command
|
588
|
+
# # regardless of the item's current state
|
589
|
+
# Item2.on!
|
590
|
+
#
|
591
|
+
# @see ensure_states
|
592
|
+
#
|
593
|
+
def ensure_states!(active: true)
|
594
|
+
old = Thread.current[:openhab_ensure_states]
|
595
|
+
Thread.current[:openhab_ensure_states] = active
|
596
|
+
old
|
597
|
+
end
|
598
|
+
|
560
599
|
#
|
561
600
|
# Global method that takes a block and for the duration of the block
|
562
601
|
# all commands sent will check if the item is in the command's state
|
563
|
-
# before sending the command.
|
602
|
+
# before sending the command. This also applies to updates.
|
564
603
|
#
|
565
604
|
# @yield
|
566
605
|
# @return [Object] The result of the block.
|
@@ -603,11 +642,10 @@ module OpenHAB
|
|
603
642
|
# end
|
604
643
|
#
|
605
644
|
def ensure_states
|
606
|
-
old =
|
607
|
-
Thread.current[:openhab_ensure_states] = true
|
645
|
+
old = ensure_states!
|
608
646
|
yield
|
609
647
|
ensure
|
610
|
-
|
648
|
+
ensure_states!(active: old)
|
611
649
|
end
|
612
650
|
|
613
651
|
#
|
@@ -841,7 +879,7 @@ module OpenHAB
|
|
841
879
|
# elements, the {Core::Items::Metadata::Hash} will be passed as an argument. Therefore it's
|
842
880
|
# recommended that you use a Proc, not a Lambda, for permissive argument matching.
|
843
881
|
#
|
844
|
-
# @return [
|
882
|
+
# @return [Hash] the prior provider configuration.
|
845
883
|
#
|
846
884
|
# @see provider
|
847
885
|
# @see OpenHAB::Core::Provider.current Provider.current for how the current provider is calculated
|
data/lib/openhab/rspec/shell.rb
CHANGED
@@ -5,26 +5,36 @@ module OpenHAB
|
|
5
5
|
# based on https://stackoverflow.com/questions/1197224/source-shell-script-into-environment-within-a-ruby-script#19826329
|
6
6
|
# @!visibility private
|
7
7
|
module Shell
|
8
|
-
|
8
|
+
# @!visibility private
|
9
|
+
DEFAULT_PRINTENV_COMMAND = "printenv -0"
|
10
|
+
@printenv_command = DEFAULT_PRINTENV_COMMAND
|
11
|
+
@printenv_separator = "\0"
|
9
12
|
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
cmd =
|
14
|
-
|
15
|
-
|
16
|
-
|
13
|
+
class << self
|
14
|
+
# Read in the bash environment, after an optional command.
|
15
|
+
# Returns Array of key/value pairs.
|
16
|
+
def shell_env(cmd = nil)
|
17
|
+
cmd = "#{cmd} > #{IO::NULL}; " if cmd
|
18
|
+
env = `#{cmd}#{@printenv_command} 2> #{IO::NULL}`
|
19
|
+
if !$?.success? && @printenv_command.equal?(DEFAULT_PRINTENV_COMMAND)
|
20
|
+
@printenv_command = "printenv"
|
21
|
+
@printenv_separator = "\n"
|
22
|
+
env = `#{cmd}#{@printenv_command}`
|
23
|
+
end
|
24
|
+
env.split(@printenv_separator).map { |l| l.split("=", 2) }
|
25
|
+
end
|
17
26
|
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
27
|
+
# Source a given file, and compare environment before and after.
|
28
|
+
# Returns Hash of any keys that have changed.
|
29
|
+
def shell_source(file)
|
30
|
+
(shell_env(". #{File.realpath(file)}") - shell_env).to_h
|
31
|
+
end
|
23
32
|
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
33
|
+
# Find variables changed as a result of sourcing the given file,
|
34
|
+
# and update in ENV.
|
35
|
+
def source_env_from(file)
|
36
|
+
shell_source(file).each { |k, v| ENV[k] = v }
|
37
|
+
end
|
28
38
|
end
|
29
39
|
end
|
30
40
|
end
|
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.11.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: 2023-10-
|
13
|
+
date: 2023-10-29 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: bundler
|