dldinternet-mixlib-thor 0.7.0 → 0.9.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
  SHA1:
3
- metadata.gz: 92e001459d25a189e5430f6794b22de3a9729853
4
- data.tar.gz: c3f18989af8e2419050f606b07ba417a7589f0b5
3
+ metadata.gz: e304facbf9df8b0d9f56707bb2fff2c05e7eeb33
4
+ data.tar.gz: acf675f70dfd8c77efb5f58ceaee071802094762
5
5
  SHA512:
6
- metadata.gz: 5a80c92d83ba89917814d6c7581895bc1ff568e562ffee76b60f81f84821ef84a8ce6f31cab26f865ce18adfd52eca8c53b92b3a554ffbb95595b6a54079a859
7
- data.tar.gz: c3e32340ceeae019939d0853366c89e1b226ac24d61c693b0610a11af676c6a41e37a96569960def018a6753e165b7395f9f92c0e93bc688b7b455f5f4cca2c7
6
+ metadata.gz: 9981d254c00a9be82d1db0936dcd7222ad2dff0212ab1d01ed00486b71ab8d204a7d4ee893156dbaf6c7d01bc92c14ea9723c82531c3cd8797d020c7dc00ba56
7
+ data.tar.gz: e65fada56e6859ec0b78f1a1e30b9e4e2864d9ba45a267d0159c6b053a5f070cb69d4a5959768f9155082d1686aba5f573720707662b5c67d6813aa4b35ae362
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- dldinternet-mixlib-thor (0.7.0)
4
+ dldinternet-mixlib-thor (0.9.1)
5
5
  activesupport (~> 5.1, >= 5.1.4)
6
6
  awesome_print
7
7
  command_line_reporter (~> 3.3, >= 3.3.6)
@@ -9,6 +9,7 @@ PATH
9
9
  dldinternet-mixlib-logging (>= 0.7.0)
10
10
  hashie
11
11
  inifile
12
+ json-pointer (~> 0.0, < 0.1)
12
13
  paint-shortcuts
13
14
  thor (~> 0.19, >= 0.19.4)
14
15
  vcr (~> 3.0, >= 3.0.3)
@@ -43,6 +44,7 @@ GEM
43
44
  i18n (0.8.6)
44
45
  inifile (3.0.0)
45
46
  json (2.0.3)
47
+ json-pointer (0.0.1)
46
48
  little-plugger (1.1.4)
47
49
  logging (2.2.2)
48
50
  little-plugger (~> 1.1)
@@ -27,6 +27,7 @@ Gem::Specification.new do |gem|
27
27
  gem.add_dependency 'config-factory' #, '~> '
28
28
  gem.add_dependency 'vcr', '~> 3.0', '>= 3.0.3'
29
29
  gem.add_dependency 'activesupport', '~> 5.1', '>= 5.1.4'
30
+ gem.add_dependency 'json-pointer', '~> 0.0', '< 0.1'
30
31
 
31
32
  gem.add_development_dependency 'bundler', '~> 1.0'
32
33
  gem.add_development_dependency 'rake', '~> 10'
@@ -7,16 +7,14 @@ module DLDInternet
7
7
  module Formatters
8
8
  # Awesome formatter
9
9
  class Awesome < DLDInternet::Formatters::Basic
10
- attr_reader :format
11
- attr_reader :object
12
- attr_reader :title
13
10
 
14
11
  def initialize(obj, format, options)
15
12
  super
16
13
  end
17
14
 
18
- def format_it
19
- object.ai
15
+ def format_it(item=nil)
16
+ item ||= object
17
+ item.ai
20
18
  end
21
19
  end
22
20
  end
@@ -2,6 +2,7 @@
2
2
 
3
3
  require 'json'
4
4
  require 'yaml'
5
+ require 'csv'
5
6
  require 'awesome_print'
6
7
  require 'hashie/mash'
7
8
 
@@ -72,8 +73,10 @@ module DLDInternet
72
73
  @widths = Hashie::Mash.new
73
74
  if @is_a_hash
74
75
  widths_hash
75
- else
76
+ elsif @object.is_a?(Array)
76
77
  widths_array
78
+ else
79
+ widths_object
77
80
  end
78
81
  end
79
82
  @widths
@@ -106,11 +109,75 @@ module DLDInternet
106
109
  private
107
110
 
108
111
  def format_item(item, header=false)
109
- case format.to_s.downcase
112
+ fmt = format.to_s.downcase
113
+ if /json|yaml|csv/.match?(fmt)
114
+ item = if @columns.nil?
115
+ item
116
+ else
117
+ item = item.dup
118
+ if item.is_a?(Array)
119
+ nitm = item.map do |itm|
120
+ hitm = Hash[itm.map do |key, val|
121
+ if @columns.keys.include?(key) && @columns[key].nil?
122
+ [key,val]
123
+ end
124
+ end.select{ |e| !e.nil? }]
125
+ end
126
+ nitm
127
+ elsif item.is_a?(Hash)
128
+ else
129
+ item
130
+ end
131
+ end
132
+ end
133
+ case fmt
110
134
  when 'json'
111
135
  JSON.pretty_generate(item)
112
136
  when 'yaml'
113
137
  item.to_yaml
138
+ when 'csv'
139
+ columns = if @columns.nil?
140
+ if item.is_a?(Array)
141
+ if item[0].is_a?(Array)
142
+ # [2017-10-06 Christo] Assume first row is headings?
143
+ item[0] # raise StandardError, "Cannot find column headings"
144
+ elsif item[0].is_a?(Hash)
145
+ item[0].keys
146
+ else
147
+ # [2017-10-06 Christo] Assume first row is headings?
148
+ item
149
+ end
150
+ elsif item.is_a?(Hash)
151
+ item.keys
152
+ else
153
+ item
154
+ end
155
+ else
156
+ @columns.keys
157
+ end
158
+ nitm = if item.is_a?(Array)
159
+ item.map { |itm|
160
+ if itm.is_a?(Array)
161
+ itm
162
+ elsif itm.is_a?(Hash)
163
+ itm.values.map{|v| v.nil? ? '' : v}
164
+ else
165
+ [itm]
166
+ end
167
+ }
168
+ elsif item.is_a?(Hash)
169
+ itm.values.map{|v| v.nil? ? '' : v}
170
+ else
171
+ [itm]
172
+ end
173
+ nitm.unshift(columns)
174
+ header_row = true
175
+ nitm.map! { |row|
176
+ o = CSV::Row.new(columns,row,header_row)
177
+ header_row = false
178
+ o
179
+ }
180
+ csv = CSV::Table.new(nitm).to_csv
114
181
  when 'none'
115
182
  item
116
183
  else
@@ -130,13 +197,14 @@ module DLDInternet
130
197
  }
131
198
  nitm.join(" ")
132
199
  elsif item.is_a?(Hash)
133
- item.map do |key, val|
200
+ nitm = item.map do |key, val|
134
201
  if @columns.nil? || (@columns.keys.include?(key) && @columns[key].nil?)
135
202
  sprintf("%-#{widths[key]}s", val.to_s)
136
- else
203
+ elsif !key.index('.').nil?
137
204
  sprintf("%-#{widths[key]}s", subcolumn(key, val))
138
205
  end
139
206
  end
207
+ nitm.select{|s| !s.nil?}.join(" ")
140
208
  else
141
209
  item.to_s
142
210
  end
@@ -161,21 +229,24 @@ module DLDInternet
161
229
  end
162
230
  end
163
231
 
232
+ def widths_object
233
+ set_width(0, @object)
234
+ end
235
+
164
236
  def widths_array
165
- idx = 0
166
237
  @object.each do |val|
167
- set_width(idx, val)
168
- idx += 1
238
+ widths_hash(val)
169
239
  end
170
240
  end
171
241
 
172
- def widths_hash
173
- @object.each do |key, _|
242
+ def widths_hash(item=nil)
243
+ item ||= @object
244
+ item.each do |key, _|
174
245
  klen = key.to_s.length
175
246
  wid = @widths[key]
176
247
  @widths[key] = klen if !wid || wid < klen
177
248
  end
178
- obj_width(@object)
249
+ obj_width(item)
179
250
  end
180
251
 
181
252
  def set_width(idx, val)
@@ -17,39 +17,64 @@ module DLDInternet
17
17
  @values = Hashie::Mash.new
18
18
  end
19
19
 
20
- def run
21
- suppress_output
20
+ def capture_output
21
+ @previous_stdout, $stdout = $stdout, StringIO.new
22
+ begin
23
+ yield
24
+ rescue Exception => e
25
+ previous_stdout.write $stdout.string
26
+ raise e
27
+ end
28
+
29
+ $stdout.string
30
+ ensure
31
+ # Restore the previous value of stdout (typically equal to stdout).
32
+ $stdout = @previous_stdout
33
+ end
34
+
35
+ def suppress_output
36
+ @previous_stdout, $stdout = $stdout, StringIO.new
37
+ end
22
38
 
23
- header(title: @title, align: 'center') if @title #&& !@title.empty?
39
+ def restore_output
40
+ string = $stdout.string
41
+ $stdout = @previous_stdout
42
+ string
43
+ end
44
+
45
+ def run
46
+ # suppress_output
47
+ capture_output do
48
+ header(title: @title, align: 'center') if @title #&& !@title.empty?
24
49
 
25
- table border: true, encoding: :ascii do
26
- header_row
27
- idx = 0
28
- list = @object.is_a?(Array) ? @object : [@object]
29
- list.each do |obj|
30
- obj_row(idx, obj)
50
+ table border: true, encoding: :ascii do
51
+ header_row
52
+ idx = 0
53
+ list = @object.is_a?(Array) ? @object : [@object]
54
+ list.each do |obj|
55
+ obj_row(idx, obj)
56
+ end
31
57
  end
32
58
  end
33
59
 
34
- capture_output
60
+ # string = restore_output
35
61
  rescue => exe
36
62
  restore_output
37
63
  raise exe
38
64
  end
39
65
 
40
66
  def header_row
41
- if @is_a_hash
42
- row color: 'light_yellow', bold: true, encoding: :ascii do
43
- @object[0].each do |key, _|
44
- column key.to_s, width: widths[key] if (@columns.nil? || @columns.keys.include?(key))
45
- end
67
+ list = @object.is_a?(Array) ? @object : [@object]
68
+ row color: 'light_yellow', bold: true, encoding: :ascii do
69
+ list[0].each do |key, _|
70
+ column key.to_s, width: widths[key] if (@columns.nil? || @columns.keys.include?(key))
46
71
  end
47
72
  end
48
73
  end
49
74
 
50
75
  def obj_row(idx, obj)
51
76
  row color: 'white', bold: false do
52
- if @is_a_hash
77
+ if obj.is_a? Hash
53
78
  obj.each do |key, val|
54
79
  if @columns.nil? || (@columns.keys.include?(key) && @columns[key].nil?)
55
80
  column val.to_s
@@ -64,7 +89,12 @@ module DLDInternet
64
89
  end
65
90
  end
66
91
 
67
- def format_it
92
+ def format_it(item=nil)
93
+ if item
94
+ @object = item
95
+ @is_a_hash = @object.is_a?(Hash)
96
+ @widths = nil
97
+ end
68
98
  run
69
99
  end
70
100
  end
@@ -1,5 +1,6 @@
1
1
  require 'thor'
2
2
  require 'dldinternet/thor/dynamic_command'
3
+ require 'dldinternet/thor/errors'
3
4
  require 'awesome_print'
4
5
 
5
6
  module DLDInternet
@@ -0,0 +1,5 @@
1
+ module DLDInternet
2
+ module Thor
3
+ class BadArgumentError < StandardError ; end
4
+ end
5
+ end
@@ -4,6 +4,7 @@ require 'yaml'
4
4
  require 'dldinternet/formatters'
5
5
  require 'hashie/mash'
6
6
  require 'dldinternet/thor/version'
7
+ require 'dldinternet/thor/errors'
7
8
  require 'inifile'
8
9
  require 'config/factory'
9
10
  require 'dldinternet/thor/vcr'
@@ -45,22 +46,32 @@ module DLDInternet
45
46
  LOG_LEVELS = [:trace, :debug, :info, :note, :warn, :error, :fatal, :todo]
46
47
 
47
48
  class OptionsMash < ::Hashie::Mash ; end
49
+ class ConfigMash < ::Hashie::Mash
50
+ def initialize(source_hash = nil, default = nil, &blk)
51
+ self.class.disable_warnings
52
+ super
53
+ end
54
+ end
48
55
 
49
56
  module MixIns
50
57
  module NoCommands
51
58
  require 'dldinternet/mixlib/logging'
52
59
  include DLDInternet::Mixlib::Logging
53
60
 
54
- def validate_options
61
+ def validate_options(*args)
55
62
  writeable_options
56
63
  if options[:log_level]
57
64
  log_level = options[:log_level].to_sym
58
65
  raise "Invalid log-level: #{log_level}" unless LOG_LEVELS.include?(log_level)
59
66
  options[:log_level] = log_level
60
67
  end
61
- @options[:log_level] ||= :warn
62
68
  @options[:format] ||= @options[:output]
63
69
  @options[:output] ||= @options[:format]
70
+
71
+ args.flatten!
72
+ if !args.empty? && args.map{ |a| /^-/.match(a) }.any?
73
+ raise DLDInternet::Thor::BadArgumentError, "Invalid arguments provided: #{args}"
74
+ end
64
75
  end
65
76
 
66
77
  def writeable_options
@@ -113,21 +124,25 @@ module DLDInternet
113
124
  end
114
125
 
115
126
  def load_config
116
- unless @options[:config].blank?
117
- @options[:config] = File.expand_path(@options[:config])
118
- if ::File.exist?(@options[:config])
127
+ if @options[:configfile].blank?
128
+ @logger.error 'Invalid/No configuration file specified'
129
+ else
130
+ @options[:configfile] = File.expand_path(@options[:configfile])
131
+ if ::File.exist?(@options[:configfile])
119
132
  begin
120
- envs = ::Config::Factory::Environments.load_file(@options[:config])
133
+ # envs = ::Config::Factory::Environments.load_file(@options[:configfile])
134
+ hash = config_to_yaml
135
+ envs = ::Config::Factory::Environments.load_hash(hash)
121
136
  if envs and envs.is_a?(Hash) and @options[:environment]
122
137
  @options[:environments] = ::Hashie::Mash.new(envs)
123
138
  else
124
- yaml = ::YAML.load(File.read(@options[:config]))
139
+ yaml = ::YAML.load(File.read(@options[:configfile]))
125
140
  if yaml
126
141
  yaml.each {|key, value|
127
142
  @options[key.to_s.gsub(%r{[-]}, '_').to_sym]=value
128
143
  }
129
144
  else
130
- msg = "#{options.config} is not a valid configuration!"
145
+ msg = "#{options[:configfile]} is not a valid configuration!"
131
146
  @logger.error msg
132
147
  raise StandardError.new(msg)
133
148
  end
@@ -137,27 +152,67 @@ module DLDInternet
137
152
  raise e
138
153
  end
139
154
  else
140
- @logger.warn "#{options.config} not found"
155
+ @logger.warn "'#{options[:configfile]}' not found"
141
156
  @logger.error "Invalid/No configuration file specified"
142
157
  exit 2
143
158
  #@options[:environments] = ::Hashie::Mash.new
144
159
  end
145
- else
146
- @logger.error 'Invalid/No configuration file specified'
147
160
  end
148
161
  end
149
162
 
150
- def parse_options
151
- validate_options
163
+ def solve_pointers(haystack, hash=nil)
164
+ hash ||= haystack
165
+ return haystack unless hash.is_a?(Hash) && hash.size
152
166
 
167
+ hash.dup.each do |k,v|
168
+ if %r{^[#/]}.match?(k) && v.nil?
169
+ begin
170
+ require 'hana'
171
+ pointer = Hana::Pointer.new k
172
+ v = pointer.eval(haystack)
173
+ hash.delete(k)
174
+ hash.merge!(v)
175
+ rescue Exception => e
176
+ require 'json-pointer'
177
+ pointer = ::JsonPointer.new(haystack, k, :symbolize_keys => true)
178
+ if pointer.exists?
179
+ hash.delete(k)
180
+ hash.merge!(pointer.value)
181
+ end
182
+ end
183
+ end
184
+ end
185
+ hash.each do |k,v|
186
+ if v && v.is_a?(Hash)
187
+ haystack = solve_pointers(haystack, v)
188
+ end
189
+ end
190
+ haystack
191
+ end
192
+
193
+ def config_to_yaml
194
+ begin
195
+ yaml = ConfigMash.new(::YAML.load(File.read(@options[:configfile])))
196
+ yaml = solve_pointers(yaml)
197
+ yaml
198
+ rescue StandardError => e
199
+ raise e
200
+ end
201
+ end
202
+
203
+ def parse_options(*args)
153
204
  get_logger(true)
154
205
 
206
+ args.flatten!
207
+ check_for_help(args)
208
+ validate_options(args)
209
+
155
210
  if @options[:inifile]
156
211
  @options[:inifile] = File.expand_path(@options[:inifile])
157
212
  load_inifile
158
- elsif @options[:config]
159
- if @options[:config] =~ /\.ini/i
160
- @options[:inifile] = @options[:config]
213
+ elsif @options[:configfile]
214
+ if @options[:configfile] =~ /\.ini/i
215
+ @options[:inifile] = @options[:configfile]
161
216
  load_inifile
162
217
  else
163
218
  load_config
@@ -166,19 +221,22 @@ module DLDInternet
166
221
  if options[:debug]
167
222
  @logger.info "Options:\n#{options.ai}"
168
223
  end
169
- if options[:stubber].is_a?(String)
170
- options[:stubber] = options[:stubber].split(/\s*,\s*/).map(&:to_sym)
171
- elsif options[:stubber].is_a?(Array) && options[:stubber].size == 1 && options[:stubber][0].is_a?(String)
172
- options[:stubber] = options[:stubber][0].split(/\s*,\s*/).map(&:to_sym)
173
- elsif options[:stubber].is_a?(Array) && options[:stubber].size > 1 && options[:stubber][0].is_a?(String)
174
- options[:stubber] = options[:stubber].map(&:to_sym)
175
- end
176
224
 
177
225
  end
178
226
 
227
+ # Child classes can override this if desired
228
+ def check_for_help(args)
229
+ if args && args.size > 0 && (args[0] && args[0].downcase.eql?('help') || args.select {|a| a.match(/--help/i)}.any?)
230
+ invocations = @_invocations.map {|_, v| v[0]}
231
+ self.class.command_help(shell, invocations[-1], invocations)
232
+ exit 0
233
+ end
234
+ end
235
+
179
236
  def get_logger(force=false)
180
237
  return unless force || @logger.nil?
181
238
  writeable_options
239
+ @options[:log_level] ||= :warn
182
240
  lcs = ::Logging::ColorScheme.new('compiler', :levels => {
183
241
  :trace => :blue,
184
242
  :debug => :cyan,
@@ -217,7 +275,7 @@ module DLDInternet
217
275
  end
218
276
 
219
277
  def notation
220
- @config[:output] || :none
278
+ @config[:format] || :none
221
279
  end
222
280
 
223
281
  def default_formatter(obj, opts=nil)
@@ -226,8 +284,9 @@ module DLDInternet
226
284
  case notation.to_sym
227
285
  when :json
228
286
  when :yaml
287
+ when :csv
229
288
  when :none
230
- when :basic
289
+ # when :basic
231
290
  when :text
232
291
  # noop
233
292
  when :awesome
@@ -291,8 +350,8 @@ module DLDInternet
291
350
  end
292
351
 
293
352
  def command_pre(*args)
294
- args.flatten!
295
- parse_options
353
+ # args.flatten!
354
+ parse_options(args)
296
355
  @logger.info @_invocations.map{ |_,v| v[0]}.join(' ') if options[:verbose]
297
356
  command_pre_start_vcr(args)
298
357
  end
@@ -308,6 +367,8 @@ module DLDInternet
308
367
  fmtr = formatter.call(res, options)
309
368
  fmtr.table_widths
310
369
  end
370
+ # [2017-10-06 Christo] header_line and format_line serves to invoke client hooks if provided.
371
+ # It means we may go through the process once with an object and a second time with a formatted string
311
372
  case options[:format]
312
373
  when /text|none|plain/
313
374
  output(header_line(res, fmtr), fmtr, true) unless options[:header] === false
@@ -361,6 +422,13 @@ module DLDInternet
361
422
 
362
423
  def command_pre_start_vcr(*args)
363
424
  args.flatten!
425
+ if options[:stubber].is_a?(String)
426
+ options[:stubber] = options[:stubber].split(/\s*,\s*/).map(&:to_sym)
427
+ elsif options[:stubber].is_a?(Array) && options[:stubber].size == 1 && options[:stubber][0].is_a?(String)
428
+ options[:stubber] = options[:stubber][0].split(/\s*,\s*/).map(&:to_sym)
429
+ elsif options[:stubber].is_a?(Array) && options[:stubber].size > 1 && options[:stubber][0].is_a?(String)
430
+ options[:stubber] = options[:stubber].map(&:to_sym)
431
+ end
364
432
  if options[:vcr]
365
433
  unless options[:cassette_path].match(%r{^#{File::SEPARATOR}})
366
434
  if File.dirname($0).eql?(Dir.pwd)
@@ -369,19 +437,24 @@ module DLDInternet
369
437
  end
370
438
  end
371
439
 
372
- @vcr_logger ||= ::DLDInternet::Thor::VCR::Logger.new(nil, @logger)
373
- ::VCR.configure do |config|
374
- config.cassette_library_dir = options[:cassette_path]
375
- config.hook_into *options[:stubber]
376
- config.logger = @vcr_logger
377
- end
440
+ command_pre_config_vcr
378
441
  opts = args[0].is_a?(Hash) ? args.shift : {}
379
442
  options[:cassette] ||= @_invocations.map{ |_,v| v[0]}.join('-')
380
- @cassette = ::VCR.insert_cassette(opts[:cassette] || options[:cassette], match_requests_on: [:method,:uri,:headers,:body], record: options[:record_mode])
443
+ @cassette = ::VCR.insert_cassette(opts[:cassette] || options[:cassette])
381
444
  end
382
445
  yield if block_given?
383
446
  end
384
447
 
448
+ def command_pre_config_vcr
449
+ @vcr_logger ||= ::DLDInternet::Thor::VCR::Logger.new(nil, @logger)
450
+ ::VCR.configure do |config|
451
+ config.cassette_library_dir = options[:cassette_path]
452
+ config.hook_into *options[:stubber]
453
+ config.logger = @vcr_logger
454
+ config.default_cassette_options.merge!({ match_requests_on: [:method, :uri, :headers, :body], record: options[:record_mode] })
455
+ end
456
+ end
457
+
385
458
  def command_post_stop_vcr
386
459
  if options[:vcr]
387
460
  ::VCR.eject_cassette
@@ -1,7 +1,7 @@
1
1
  module Dldinternet
2
2
  module Mixlib
3
3
  module Thor
4
- VERSION = '0.7.0'
4
+ VERSION = '0.9.1'
5
5
 
6
6
  module Version # :nodoc: all
7
7
  MAJOR, MINOR, RELEASE, *OTHER = VERSION.split '.'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dldinternet-mixlib-thor
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.0
4
+ version: 0.9.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Christo De Lange
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-09-27 00:00:00.000000000 Z
11
+ date: 2017-10-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: thor
@@ -174,6 +174,26 @@ dependencies:
174
174
  - - ">="
175
175
  - !ruby/object:Gem::Version
176
176
  version: 5.1.4
177
+ - !ruby/object:Gem::Dependency
178
+ name: json-pointer
179
+ requirement: !ruby/object:Gem::Requirement
180
+ requirements:
181
+ - - "~>"
182
+ - !ruby/object:Gem::Version
183
+ version: '0.0'
184
+ - - "<"
185
+ - !ruby/object:Gem::Version
186
+ version: '0.1'
187
+ type: :runtime
188
+ prerelease: false
189
+ version_requirements: !ruby/object:Gem::Requirement
190
+ requirements:
191
+ - - "~>"
192
+ - !ruby/object:Gem::Version
193
+ version: '0.0'
194
+ - - "<"
195
+ - !ruby/object:Gem::Version
196
+ version: '0.1'
177
197
  - !ruby/object:Gem::Dependency
178
198
  name: bundler
179
199
  requirement: !ruby/object:Gem::Requirement
@@ -239,6 +259,7 @@ files:
239
259
  - lib/dldinternet/formatters/table.rb
240
260
  - lib/dldinternet/thor/command.rb
241
261
  - lib/dldinternet/thor/dynamic_command.rb
262
+ - lib/dldinternet/thor/errors.rb
242
263
  - lib/dldinternet/thor/mixins/no_commands.rb
243
264
  - lib/dldinternet/thor/vcr.rb
244
265
  - lib/dldinternet/thor/vcr/logger.rb
@@ -263,7 +284,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
263
284
  version: '0'
264
285
  requirements: []
265
286
  rubyforge_project:
266
- rubygems_version: 2.4.8
287
+ rubygems_version: 2.6.13
267
288
  signing_key:
268
289
  specification_version: 4
269
290
  summary: Thor no_commands reuse