openhab-scripting 5.6.0 → 5.6.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 8c8baeb1d9f83c584fd3affe173ceecd5d00fedb8547701c134cc7f1e7e8b924
4
- data.tar.gz: b202b62cba639b270e60a73c405b6de5ede001a8bd6ee4fa065363156497b396
3
+ metadata.gz: 9d58174285c7861dfffd3bdb108f6d9c01af149a4f53aab9b9dd331be7f0f022
4
+ data.tar.gz: 6bdb6e115927aea3396ca05be97ecb1ee9d8afc9bc493689c32f7fcd19a7e71a
5
5
  SHA512:
6
- metadata.gz: 06a58a345353b826ca398943d50295dd54a137b42d6fb803058507f6df19e673a27cacdfdaf7f7fa445d881468122535178e0a0f4f00eaa831ebe78bb4b060de
7
- data.tar.gz: 5572ccf8e1e094d7b1eec9415e8d39b1f18b468e99d661b25f4064b1fde0d34a89d85163c4ce77b7f97b32f1532249d66cff310377e0850de0a1388f1e7f44a3
6
+ metadata.gz: 454fb750a412b8e153ce7df0320738b1f9729e1313d6d8e9aaaaa7c720c8c0cda7f704a35d78952705e7f21718551daae2c01e0dcf0b7e26c1fbfa2481d5ab6b
7
+ data.tar.gz: 0a1e62ecb2bcce48a207bed5899bd0e7913492836a5c953a4b22756fa149b353ee8db229e3b5b71f48d503db1d7bfaa4f8baa94abe92469047b386ab3d438da6
@@ -23,8 +23,11 @@ module OpenHAB
23
23
  #
24
24
  def play_sound(filename, sink: nil, volume: nil)
25
25
  volume = PercentType.new(volume) unless volume.is_a?(PercentType) || volume.nil?
26
- java_send :playSound, [java.lang.String, java.lang.String, PercentType.java_class],
27
- sink, filename.to_s, volume
26
+ java_send :playSound,
27
+ [java.lang.String, java.lang.String, PercentType.java_class],
28
+ sink,
29
+ filename.to_s,
30
+ volume
28
31
  end
29
32
 
30
33
  #
@@ -308,7 +308,7 @@ module OpenHAB
308
308
  raise ArgumentError, "Additional options can only be specified when creating one tag"
309
309
  end
310
310
 
311
- synonyms = Array.wrap(synonyms).map(&:to_s).map(&:strip)
311
+ synonyms = Array.wrap(synonyms).map { |s| s.to_s.strip }
312
312
 
313
313
  tags.map do |name, parent|
314
314
  # @deprecated OH4.0.0.M4 missing registry
@@ -317,7 +317,9 @@ module OpenHAB
317
317
  next if lookup(name)
318
318
  next unless parent
319
319
 
320
- new_tag = org.openhab.core.semantics.SemanticTagImpl.new("#{parent.uid}_#{name}", label, description,
320
+ new_tag = org.openhab.core.semantics.SemanticTagImpl.new("#{parent.uid}_#{name}",
321
+ label,
322
+ description,
321
323
  synonyms)
322
324
  Provider.instance.add(new_tag)
323
325
  lookup(name)
@@ -13,7 +13,8 @@ module OpenHAB
13
13
  def_delegators :__getobj__, :class, :is_a?, :kind_of?
14
14
 
15
15
  # @!visibility private
16
- EVENTS = [Events::ThingAddedEvent::TYPE, Events::ThingUpdatedEvent::TYPE,
16
+ EVENTS = [Events::ThingAddedEvent::TYPE,
17
+ Events::ThingUpdatedEvent::TYPE,
17
18
  Events::ThingRemovedEvent::TYPE].freeze
18
19
  # @!visibility private
19
20
  UID_METHOD = :uid
@@ -144,7 +144,8 @@ module OpenHAB
144
144
  def coerce(other)
145
145
  logger.trace("Coercing #{self} as a request from #{other.class}")
146
146
  return [other, zoned_date_time] if other.respond_to?(:to_zoned_date_time)
147
- return [DateTimeType.new(other), self] if other.respond_to?(:to_time)
147
+
148
+ [DateTimeType.new(other), self] if other.respond_to?(:to_time)
148
149
  end
149
150
 
150
151
  #
@@ -28,7 +28,8 @@ module OpenHAB
28
28
  # @return [OpenClosedType] {OPEN} if {closed?}, {CLOSED} if {open?}
29
29
  def !
30
30
  return CLOSED if open?
31
- return OPEN if closed?
31
+
32
+ OPEN if closed?
32
33
  end
33
34
  end
34
35
  end
@@ -63,7 +63,7 @@ module OpenHAB
63
63
  #
64
64
  def coerce(other)
65
65
  logger.trace("Coercing #{self} as a request from #{other.class}")
66
- return [other.to_str, self] if other.respond_to?(:to_str)
66
+ [other.to_str, self] if other.respond_to?(:to_str)
67
67
  end
68
68
 
69
69
  # any method that exists on String gets forwarded to to_s
@@ -37,7 +37,8 @@ module OpenHAB
37
37
  #
38
38
  def !
39
39
  return UP if down?
40
- return DOWN if up?
40
+
41
+ DOWN if up?
41
42
  end
42
43
  end
43
44
  end
@@ -107,10 +107,11 @@ module OpenHAB
107
107
 
108
108
  # @see https://docs.ruby-lang.org/en/master/Hash.html#method-i-assoc Hash#assoc
109
109
  def assoc(key)
110
- [key, fetch(key) do
111
- # return nil directly, without storing a value to the cache
112
- return nil
113
- end]
110
+ [key,
111
+ fetch(key) do
112
+ # return nil directly, without storing a value to the cache
113
+ return nil
114
+ end]
114
115
  end
115
116
 
116
117
  # @see https://docs.ruby-lang.org/en/master/Hash.html#method-i-dig Hash#dig
@@ -64,7 +64,8 @@ module OpenHAB
64
64
  #
65
65
  def coerce(other)
66
66
  return [other.seconds, self] if other.is_a?(Numeric)
67
- return [other.to_i.seconds, self] if other.is_a?(Period)
67
+
68
+ [other.to_i.seconds, self] if other.is_a?(Period)
68
69
  end
69
70
 
70
71
  {
@@ -56,12 +56,14 @@ module OpenHAB
56
56
  return raw_parse(string, formatter) if formatter
57
57
 
58
58
  format = /(am|pm)$/i.match?(string) ? "h[:mm[:ss][.S]][ ]a" : "H[:mm[:ss][.S]]"
59
- java_send(:parse, [java.lang.CharSequence, java.time.format.DateTimeFormatter],
60
- string, java.time.format.DateTimeFormatterBuilder.new
61
- .parse_case_insensitive
62
- .parse_lenient
63
- .append_pattern(format)
64
- .to_formatter(java.util.Locale::ENGLISH))
59
+ java_send(:parse,
60
+ [java.lang.CharSequence, java.time.format.DateTimeFormatter],
61
+ string,
62
+ java.time.format.DateTimeFormatterBuilder.new
63
+ .parse_case_insensitive
64
+ .parse_lenient
65
+ .append_pattern(format)
66
+ .to_formatter(java.util.Locale::ENGLISH))
65
67
  end
66
68
  end
67
69
 
@@ -21,7 +21,8 @@ module OpenHAB
21
21
  #
22
22
  def parse(string)
23
23
  logger.trace("#{self.class}.parse #{string} (#{string.class})")
24
- java_send(:parse, [java.lang.CharSequence, java.time.format.DateTimeFormatter],
24
+ java_send(:parse,
25
+ [java.lang.CharSequence, java.time.format.DateTimeFormatter],
25
26
  string.to_s,
26
27
  java.time.format.DateTimeFormatter.ofPattern("[--]M-d"))
27
28
  end
@@ -47,7 +47,7 @@ module OpenHAB
47
47
  # @return [Array, nil]
48
48
  #
49
49
  def coerce(other)
50
- return [other.seconds, to_i.seconds] if other.is_a?(Numeric)
50
+ [other.seconds, to_i.seconds] if other.is_a?(Numeric)
51
51
  end
52
52
 
53
53
  {
@@ -190,6 +190,7 @@ module OpenHAB
190
190
  # Integer already has #|, so we have to prepend it here
191
191
  ::Integer.prepend(QuantityTypeConversion)
192
192
  ::Numeric.include(Numeric)
193
+ java.math.BigDecimal.include(QuantityTypeConversion)
193
194
  end
194
195
  end
195
196
  end
@@ -270,7 +270,9 @@ module OpenHAB
270
270
  # Homekit metadata (see {ItemBuilder#homekit})
271
271
  # @param metadata [Hash<String, Hash>] Generic metadata (see {ItemBuilder#metadata})
272
272
  # @param state [State] Initial state
273
- def initialize(type, name = nil, label = nil,
273
+ def initialize(type,
274
+ name = nil,
275
+ label = nil,
274
276
  provider:,
275
277
  dimension: nil,
276
278
  unit: nil,
@@ -70,7 +70,8 @@ module OpenHAB
70
70
  builder = BuilderDSL.new(binding || block.binding)
71
71
  builder.uid(id)
72
72
  builder.instance_exec(builder, &block)
73
- builder.guard = Guard.new(run_context: builder.caller, only_if: builder.only_if,
73
+ builder.guard = Guard.new(run_context: builder.caller,
74
+ only_if: builder.only_if,
74
75
  not_if: builder.not_if)
75
76
 
76
77
  name ||= NameInference.infer_rule_name(builder)
@@ -1075,28 +1076,50 @@ module OpenHAB
1075
1076
  #
1076
1077
  # @overload cron(second: nil, minute: nil, hour: nil, dom: nil, month: nil, dow: nil, year: nil, attach: nil)
1077
1078
  # The trigger can be created by specifying each field as keyword arguments.
1078
- # Omitted fields will default to `*` or `?` as appropriate.
1079
+ #
1080
+ # When certain fields were omitted:
1081
+ # - The more specific fields will default to `0` for `hour`, `minute`, and `second`,
1082
+ # to `MON` for `dow`, and to `1` for `dom` and `month`.
1083
+ # - The less specific fields will default to `*` or `?` as appropriate.
1079
1084
  #
1080
1085
  # Each field is optional, but at least one must be specified.
1081
1086
  #
1082
1087
  # The same rules for the standard
1083
1088
  # [cron expression](https://www.quartz-scheduler.org/documentation/quartz-2.2.2/tutorials/tutorial-lesson-06.html)
1084
1089
  # apply for each field. For example, multiple values can be separated
1085
- # with a comma within a string.
1086
- #
1087
- # @param [Integer, String, nil] second
1088
- # @param [Integer, String, nil] minute
1089
- # @param [Integer, String, nil] hour
1090
- # @param [Integer, String, nil] dom
1091
- # @param [Integer, String, nil] month
1092
- # @param [Integer, String, nil] dow
1093
- # @param [Integer, String, nil] year
1090
+ # with a comma within a string, and ranges can be specified with a dash or with
1091
+ # a Ruby Range.
1092
+ #
1093
+ # @param [Integer, String, Range, nil] second
1094
+ # @param [Integer, String, Range, nil] minute
1095
+ # @param [Integer, String, Range, nil] hour
1096
+ # @param [Integer, String, Symbol, Range, nil] dom
1097
+ # @param [Integer, String, Symbol, Range, nil] month
1098
+ # @param [Integer, String, Symbol, Range, nil] dow
1099
+ # @param [Integer, String, Range, nil] year
1094
1100
  # @param [Object] attach object to be attached to the trigger
1095
- # @example
1101
+ #
1102
+ # @example Using String values
1096
1103
  # # Run every 3 minutes on Monday to Friday
1097
1104
  # # equivalent to the cron expression "0 */3 * ? * MON-FRI *"
1098
1105
  # rule "Using cron fields" do
1099
- # cron second: 0, minute: "*/3", dow: "MON-FRI"
1106
+ # cron minute: "*/3", dow: "MON-FRI"
1107
+ # run { logger.info "Cron rule executed" }
1108
+ # end
1109
+ #
1110
+ # @example Defaults for unspecified fields
1111
+ # # Run at midnight on the first day of January, February, and March
1112
+ # # equivalent to the cron expression "0 0 0 1 JAN-MAR ? *"
1113
+ # rule "Using cron fields" do
1114
+ # cron month: "JAN-MAR"
1115
+ # run { logger.info "Cron rule executed" }
1116
+ # end
1117
+ #
1118
+ # @example Using Ruby Range values
1119
+ # # Run on the hour, every hour between 1pm and 5pm
1120
+ # # equivalent to the cron expression "0 0 13-17 ? * ? *"
1121
+ # rule "Using cron fields" do
1122
+ # cron hour: 13..17
1100
1123
  # run { logger.info "Cron rule executed" }
1101
1124
  # end
1102
1125
  #
@@ -1559,8 +1582,12 @@ module OpenHAB
1559
1582
  # @deprecated OH3.4 - OH3 config uses eventXXX vs OH4 uses `topic`, `source`, and `types`
1560
1583
  # See https://github.com/openhab/openhab-core/pull/3299
1561
1584
  trigger("core.GenericEventTrigger",
1562
- eventTopic: topic, eventSource: source, eventTypes: types, # @deprecated OH3.4
1563
- topic: topic, source: source, types: types,
1585
+ eventTopic: topic,
1586
+ eventSource: source,
1587
+ eventTypes: types, # @deprecated OH3.4
1588
+ topic: topic,
1589
+ source: source,
1590
+ types: types,
1564
1591
  attach: attach)
1565
1592
  end
1566
1593
 
@@ -1831,10 +1858,11 @@ module OpenHAB
1831
1858
  types = [binding.local_variable_get(:for)].flatten
1832
1859
 
1833
1860
  WatchHandler::WatchTriggerHandlerFactory.instance # ensure it's registered
1834
- trigger(WatchHandler::WATCH_TRIGGER_MODULE_ID, path: path.to_s,
1835
- types: types.map(&:to_s),
1836
- glob: glob.to_s,
1837
- attach: attach)
1861
+ trigger(WatchHandler::WATCH_TRIGGER_MODULE_ID,
1862
+ path: path.to_s,
1863
+ types: types.map(&:to_s),
1864
+ glob: glob.to_s,
1865
+ attach: attach)
1838
1866
  end
1839
1867
 
1840
1868
  # @!endgroup
@@ -29,7 +29,7 @@ module OpenHAB
29
29
  # @param [Hash] inputs inputs from trigger
30
30
  # @return [true, false] if the conditions passed (and therefore the block was run)
31
31
  #
32
- def process(mod:, inputs:) # rubocop:disable Lint/UnusedMethodArgument - mod is unused here but required
32
+ def process(mod:, inputs:)
33
33
  logger.trace("Checking #{inputs} against condition trigger #{self}")
34
34
  unless check_value(Conditions.old_state_from(inputs), @from) &&
35
35
  check_value(Conditions.new_state_from(inputs), @to) &&
@@ -26,16 +26,15 @@ module OpenHAB
26
26
  # @return [Hash] Map with symbols for :seconds, :minute, :hour, :dom, :month, :dow
27
27
  # configured to fire every second
28
28
  #
29
- CRON_EXPRESSION_MAP =
30
- {
31
- second: "*",
32
- minute: "*",
33
- hour: "*",
34
- dom: "?",
35
- month: "*",
36
- dow: "?",
37
- year: "*"
38
- }.freeze
29
+ CRON_EXPRESSION_MAP = {
30
+ second: "*",
31
+ minute: "*",
32
+ hour: "*",
33
+ dom: "?",
34
+ month: "*",
35
+ dow: "?",
36
+ year: "*"
37
+ }.freeze
39
38
  private_constant :CRON_EXPRESSION_MAP
40
39
 
41
40
  # @return [Hash] Map of days of the week from symbols to to openHAB cron strings
@@ -52,7 +51,6 @@ module OpenHAB
52
51
 
53
52
  # @return [Hash] Converts the DAY_OF_WEEK_MAP to map used by Cron Expression
54
53
  DAY_OF_WEEK_EXPRESSION_MAP = DAY_OF_WEEK_MAP.transform_values { |v| CRON_EXPRESSION_MAP.merge(dow: v) }
55
-
56
54
  private_constant :DAY_OF_WEEK_EXPRESSION_MAP
57
55
 
58
56
  # @return [Hash] Create a set of cron expressions based on different time intervals
@@ -65,9 +63,12 @@ module OpenHAB
65
63
  month: CRON_EXPRESSION_MAP.merge(second: "0", minute: "0", hour: "0", dom: "1"),
66
64
  year: CRON_EXPRESSION_MAP.merge(second: "0", minute: "0", hour: "0", dom: "1", month: "1")
67
65
  }.merge(DAY_OF_WEEK_EXPRESSION_MAP).freeze
68
-
69
66
  private_constant :EXPRESSION_MAP
70
67
 
68
+ # @return [Hash] Translate cron field names to expression keys
69
+ FIELD_TO_EXPRESSION_KEY = Hash.new { |_, key| key }.merge({ dow: :week, dom: :day })
70
+ private_constant :FIELD_TO_EXPRESSION_KEY
71
+
71
72
  #
72
73
  # Create a cron map from a duration
73
74
  #
@@ -124,10 +125,28 @@ module OpenHAB
124
125
  "unknown keyword#{"s" if extra_fields.size > 1}: #{extra_fields.map(&:inspect).join(", ")}"
125
126
  end
126
127
 
127
- fields = fields.transform_values { |value| value.to_s.delete(" ") }
128
+ fields = fields.to_h do |key, value|
129
+ if value.is_a?(Range)
130
+ if value.exclude_end?
131
+ raise ArgumentError,
132
+ "Range must be inclusive for '#{key}'. Try '#{value.begin}..#{value.end}' instead"
133
+ end
134
+
135
+ unless value.begin && value.end
136
+ raise ArgumentError,
137
+ "Range must have a beginning and ending for '#{key}'"
138
+ end
139
+
140
+ [key, "#{value.begin.to_s.upcase}-#{value.end.to_s.upcase}".delete(" ")]
141
+ else
142
+ [key, value.to_s.delete(" ").upcase]
143
+ end
144
+ end
145
+ # convert fields' key dow->week, dom->day to look into EXPRESSION_MAP
146
+ fields_expression = fields.transform_keys { |key| FIELD_TO_EXPRESSION_KEY[key] }
128
147
  # find the first expression map that has a field from fields.
129
148
  # this ensure more-specific fields get set to 0, not *
130
- base_key = EXPRESSION_MAP.keys.find { |field, _| fields.key?(field) }
149
+ base_key = EXPRESSION_MAP.keys.find { |field, _| fields_expression.key?(field) }
131
150
  base_expression = EXPRESSION_MAP[base_key]
132
151
  expression_map = base_expression.merge(fields)
133
152
 
@@ -187,7 +187,8 @@ module OpenHAB
187
187
  configuration = Core::Configuration.new(config)
188
188
  if thing_type
189
189
  self.class.thing_factory_helper.apply_default_configuration(
190
- configuration, thing_type,
190
+ configuration,
191
+ thing_type,
191
192
  self.class.config_description_registry
192
193
  )
193
194
  end
@@ -200,7 +201,8 @@ module OpenHAB
200
201
 
201
202
  if thing_type
202
203
  # can't use with_channels, or it will wipe out custom channels from above
203
- self.class.thing_factory_helper.create_channels(thing_type, uid,
204
+ self.class.thing_factory_helper.create_channels(thing_type,
205
+ uid,
204
206
  self.class.config_description_registry).each do |channel|
205
207
  builder.with_channel(channel)
206
208
  end
@@ -4,6 +4,6 @@ module OpenHAB
4
4
  module DSL
5
5
  # Version of openHAB helper libraries
6
6
  # @return [String]
7
- VERSION = "5.6.0"
7
+ VERSION = "5.6.1"
8
8
  end
9
9
  end
data/lib/openhab/osgi.rb CHANGED
@@ -46,7 +46,7 @@ module OpenHAB
46
46
 
47
47
  bundle = org.osgi.framework.FrameworkUtil.get_bundle(interfaces.first.java_class)
48
48
  bundle.bundle_context.register_service(
49
- interfaces.map(&:java_class).map(&:name).to_java(java.lang.String),
49
+ interfaces.map { |i| i.java_class.name }.to_java(java.lang.String),
50
50
  instance,
51
51
  java.util.Hashtable.new(properties)
52
52
  )
@@ -154,7 +154,9 @@ module OpenHAB
154
154
  klass.field_accessor :classLoader, :activatorManager
155
155
  klass.field_writer :framework
156
156
  klass.field_reader :LOG
157
- org.apache.karaf.main.ConfigProperties.field_reader :props, :defaultBundleStartlevel, :karafEtc,
157
+ org.apache.karaf.main.ConfigProperties.field_reader :props,
158
+ :defaultBundleStartlevel,
159
+ :karafEtc,
158
160
  :defaultStartLevel
159
161
  klass.class_eval do
160
162
  def send_private(method_name, *args)
@@ -472,7 +474,8 @@ module OpenHAB
472
474
  thf = Mocks::ThingHandlerFactory.instance
473
475
  bundle = org.osgi.framework.FrameworkUtil.get_bundle(org.openhab.core.thing.Thing.java_class)
474
476
  Mocks::BundleResolver.instance.register_class(thf.class, bundle)
475
- bundle.bundle_context.register_service(org.openhab.core.thing.binding.ThingHandlerFactory.java_class, thf,
477
+ bundle.bundle_context.register_service(org.openhab.core.thing.binding.ThingHandlerFactory.java_class,
478
+ thf,
476
479
  nil)
477
480
  end
478
481
  end
@@ -3,7 +3,6 @@
3
3
  module OpenHAB
4
4
  module Core
5
5
  module Actions
6
- # rubocop:disable Lint/UnusedMethodArgument
7
6
  # redefine these to do nothing so that rules won't fail
8
7
 
9
8
  module_function
@@ -31,8 +30,6 @@ module OpenHAB
31
30
  end
32
31
  end
33
32
  end
34
-
35
- # rubocop:enable Lint/UnusedMethodArgument
36
33
  end
37
34
  end
38
35
  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.6.0
4
+ version: 5.6.1
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-09-08 00:00:00.000000000 Z
13
+ date: 2023-09-12 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: bundler
@@ -214,14 +214,14 @@ dependencies:
214
214
  requirements:
215
215
  - - "~>"
216
216
  - !ruby/object:Gem::Version
217
- version: 1.13.9
217
+ version: '1.13'
218
218
  type: :development
219
219
  prerelease: false
220
220
  version_requirements: !ruby/object:Gem::Requirement
221
221
  requirements:
222
222
  - - "~>"
223
223
  - !ruby/object:Gem::Version
224
- version: 1.13.9
224
+ version: '1.13'
225
225
  - !ruby/object:Gem::Dependency
226
226
  name: persistent_httparty
227
227
  requirement: !ruby/object:Gem::Requirement
@@ -279,33 +279,19 @@ dependencies:
279
279
  - !ruby/object:Gem::Version
280
280
  version: '3.11'
281
281
  - !ruby/object:Gem::Dependency
282
- name: rubocop
282
+ name: rubocop-inst
283
283
  requirement: !ruby/object:Gem::Requirement
284
284
  requirements:
285
- - - "~>"
285
+ - - ">="
286
286
  - !ruby/object:Gem::Version
287
- version: '1.8'
287
+ version: '0'
288
288
  type: :development
289
289
  prerelease: false
290
290
  version_requirements: !ruby/object:Gem::Requirement
291
291
  requirements:
292
- - - "~>"
293
- - !ruby/object:Gem::Version
294
- version: '1.8'
295
- - !ruby/object:Gem::Dependency
296
- name: rubocop-performance
297
- requirement: !ruby/object:Gem::Requirement
298
- requirements:
299
- - - "~>"
300
- - !ruby/object:Gem::Version
301
- version: '1.11'
302
- type: :development
303
- prerelease: false
304
- version_requirements: !ruby/object:Gem::Requirement
305
- requirements:
306
- - - "~>"
292
+ - - ">="
307
293
  - !ruby/object:Gem::Version
308
- version: '1.11'
294
+ version: '0'
309
295
  - !ruby/object:Gem::Dependency
310
296
  name: rubocop-rake
311
297
  requirement: !ruby/object:Gem::Requirement