openhab-scripting 5.6.0 → 5.6.1

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 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