thor-addons 0.1.6 → 1.0.0

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: 0637e70de16cdaca1968148540bc7919e001497e8c60d5212a6a5cc2bc760678
4
- data.tar.gz: 1f53c76ebc9e27064fb9660c7123a740420ebe4e186884995bb4c694f0dbc66e
3
+ metadata.gz: '0805d43eb2a94a29a350e4d325f786627dbf24aea71e8d7bf481519901a9698a'
4
+ data.tar.gz: 89c2db5f9e7c866da3c40beec05e670b74d7a72a8bebfadc3d9dbd73621da1db
5
5
  SHA512:
6
- metadata.gz: 0bbd51f8c4ff0a3ca464f3e3f3d6fa45053b20d874f4f094338d9743135749eec3e0fa3fa222cb4d78e7ae8d5a954e23d221caa7c2dd6b326e5c3c97be7f4cfb
7
- data.tar.gz: 5af2e01103e9fa9b2603303260b873fddf52a3da26a7cb02b59bfbabb0a88d245a153bcbc8b4a0b1c0efe692e34ceea005c0738161030e27589a935b1de74e9f
6
+ metadata.gz: 7147d625670b7c69be63866b31d5a09a73e54521786c7af166704ceb7067988def0dacf97bb440dd2175243fe865e096efe3e73c1422c45078444036f3d59c79
7
+ data.tar.gz: 3af249f36fee8007549a23ba780d1bb184e64996fc4117a7b6a6734d66495f4d86ac2efc332e99606a4b8803c756aa3f2eee6dc15bb77689cbb83081bcdceb33
data/.rubocop.yml ADDED
@@ -0,0 +1,18 @@
1
+ Style/StringLiterals:
2
+ EnforcedStyle: double_quotes
3
+
4
+ Layout/MultilineMethodCallIndentation:
5
+ EnforcedStyle: indented
6
+
7
+ Naming/FileName:
8
+ Exclude:
9
+ - lib/thor-addons.rb
10
+ - spec/lib/thor-addons_spec.rb
11
+
12
+ # disable for now
13
+ Style/Documentation:
14
+ Enabled: false
15
+
16
+ Metrics/BlockLength:
17
+ Exclude:
18
+ - "spec/**/*"
data/.ruby-version ADDED
@@ -0,0 +1 @@
1
+ 2.5.1
data/.travis.yml CHANGED
@@ -1,6 +1,9 @@
1
1
  language: ruby
2
2
  rvm:
3
- - 2.3.3
4
- - 2.3.1
3
+ - 2.5.1
4
+ - 2.4.4
5
+ - 2.3.7
6
+ before_script:
7
+ - bundle exec rubocop
5
8
  notifications:
6
9
  email: false
data/CHANGELOG.md CHANGED
@@ -1,3 +1,11 @@
1
+ 1.0.0 (14/04/2018)
2
+
3
+ IMPROVEMENTS:
4
+
5
+ * Convert ENV vars to correct type
6
+ * Fail if type is incorrect
7
+ * add rubocop
8
+
1
9
  0.1.5 (13/03/2018)
2
10
 
3
11
  BUG FIXES:
data/Dockerfile CHANGED
@@ -1,4 +1,4 @@
1
- FROM ruby:2.3.3
1
+ FROM ruby:2.5.1
2
2
 
3
3
  ENV WORKDIR /thor-addons
4
4
 
data/Gemfile CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  source "https://rubygems.org"
2
4
 
3
5
  gemspec
data/README.md CHANGED
@@ -7,7 +7,7 @@ Extend [Thor](https://github.com/erikhuda/thor) with useful Add-ons
7
7
 
8
8
  ### Installation
9
9
 
10
- ```
10
+ ```shell
11
11
  gem install thor-addons
12
12
  ```
13
13
 
@@ -20,7 +20,7 @@ The `Options` module allows you to read the CLI options from a configuration fil
20
20
 
21
21
  include the Options module to your Thor class.
22
22
 
23
- ```
23
+ ```ruby
24
24
  require 'thor'
25
25
  require 'thor_addons'
26
26
 
@@ -39,7 +39,7 @@ end
39
39
 
40
40
  In the example above the `--bar` option will be read from the configuration file `--config-file`
41
41
 
42
- ```
42
+ ```ruby
43
43
  foo:
44
44
  bar: "zip"
45
45
  ```
@@ -48,7 +48,7 @@ and via the environment variable `BAR`
48
48
 
49
49
  if you want to disable the configuration file you need to set in your class
50
50
 
51
- ```
51
+ ```ruby
52
52
  def with_config_file?
53
53
  false
54
54
  end
@@ -56,7 +56,7 @@ end
56
56
 
57
57
  and for disabling the environment variables
58
58
 
59
- ```
59
+ ```ruby
60
60
  def with_env?
61
61
  false
62
62
  end
@@ -64,8 +64,9 @@ end
64
64
 
65
65
  you can also have environment variables aliases, by setting
66
66
 
67
- ```
67
+ ```ruby
68
68
  def envs_aliases
69
+ # source => alias
69
70
  { "BAR" => "MY_BAR" }
70
71
  end
71
72
  ```
data/Rakefile CHANGED
@@ -1,6 +1,8 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "bundler/gem_tasks"
2
4
  require "rspec/core/rake_task"
3
5
 
4
6
  RSpec::Core::RakeTask.new(:spec)
5
7
 
6
- task :default => :spec
8
+ task default: :spec
data/lib/ext/string.rb ADDED
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ class String
4
+ TRUES = %w[t true on y yes 1].freeze
5
+ FALSES = %w[f false off n no 0].freeze
6
+
7
+ def to_b(invalid_value_behaviour: proc { nil })
8
+ value = strip.downcase
9
+ return true if TRUES.include?(value)
10
+ return false if FALSES.include?(value)
11
+
12
+ invalid_value_behaviour.call
13
+ end
14
+
15
+ def to_a(delimiter: " ")
16
+ split(delimiter)
17
+ end
18
+
19
+ def to_h(arr_sep: " ", key_sep: ":")
20
+ split(arr_sep).each_with_object({}) do |e, hsh|
21
+ key, value = e.split(key_sep)
22
+
23
+ hsh[key] = value
24
+ end
25
+ end
26
+
27
+ def to_n
28
+ return to_f if self =~ /[0-9]+\.[0-9]+/
29
+
30
+ to_i
31
+ end
32
+ end
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ThorAddons
4
+ module Helpers
5
+ class Defaults
6
+ def self.load(klass, config)
7
+ options = klass.class_options.dup
8
+ options.merge!(config[:class_options]) if config[:class_options]
9
+ options.merge!(config[:command_options]) if config[:command_options]
10
+
11
+ options.each_with_object({}) do |(name, obj), hsh|
12
+ value = obj.respond_to?(:default) ? obj.default : nil
13
+ type = obj.respond_to?(:type) ? obj.type : :string
14
+
15
+ hsh[name] = { value: value, type: type }
16
+ end
17
+ end
18
+
19
+ def self.add(hash, defaults)
20
+ hash.each_with_object({}) do |(k, v), hsh|
21
+ hsh[k] = v.nil? ? defaults[k][:value] : v
22
+ end
23
+ end
24
+
25
+ def self.remove(hash, defaults)
26
+ hash.each_with_object({}) do |(k, v), hsh|
27
+ hsh[k] = nil
28
+
29
+ hsh[k] = v unless defaults[k][:value] == v
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ThorAddons
4
+ module Helpers
5
+ class OptionType
6
+ attr_reader :option, :type
7
+
8
+ def initialize(option, type)
9
+ @option = option
10
+ @type = type
11
+
12
+ raise TypeError, "Invalid type: '#{type}'" unless
13
+ TYPE_CLASS_MAP.keys.include?(type)
14
+ end
15
+
16
+ TYPE_CLASS_MAP = {
17
+ array: [Array],
18
+ boolean: [TrueClass, FalseClass],
19
+ hash: [Hash],
20
+ numeric: [Integer, Float],
21
+ string: [String]
22
+ }.freeze
23
+
24
+ def valid?
25
+ TYPE_CLASS_MAP[type].any? { |klass| option.is_a?(klass) }
26
+ end
27
+
28
+ def convert_string
29
+ case type
30
+ when :boolean then option.to_b
31
+ when :array then option.to_a
32
+ when :hash then option.to_h
33
+ when :numeric then option.to_n
34
+ else option
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,55 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ThorAddons
4
+ module Helpers
5
+ class OptionsConfigFile
6
+ def self.parse_config_file(config_file)
7
+ YAML.load_file(config_file) || {}
8
+ rescue Errno::ENOENT, Psych::SyntaxError
9
+ STDERR.puts("[WARN] Unable to parse 'config_file' '#{config_file}'.")
10
+ {}
11
+ end
12
+
13
+ def self.extract_command_data(data, command)
14
+ data_hash = data["global"] || {}
15
+
16
+ return data_hash if command.nil? || data[command].nil?
17
+
18
+ data_hash.merge(data[command])
19
+ end
20
+
21
+ def self.get_command_config_data(data, invocations, current_command_name)
22
+ invocations ||= {}
23
+ commands = (invocations.values.flatten << current_command_name)
24
+
25
+ command_options = extract_command_data(data, commands.shift)
26
+
27
+ commands.each do |cmd|
28
+ should_break = command_options[cmd].nil?
29
+ command_options.merge!(extract_command_data(command_options, cmd))
30
+
31
+ %W[#{cmd} global].each { |k| command_options.delete(k) }
32
+
33
+ break if should_break
34
+ end
35
+
36
+ command_options
37
+ end
38
+
39
+ def self.parse(config_file, invocations, current_command_name, defaults)
40
+ data = parse_config_file(config_file)
41
+ opts = get_command_config_data(data, invocations, current_command_name)
42
+
43
+ config_opts = opts.each_with_object({}) do |(key, value), hsh|
44
+ if defaults.keys.map(&:to_s).include?(key.to_s)
45
+ hsh[key] = value
46
+ else
47
+ STDERR.puts("[WARN] rejecting invalid config file option: '#{key}'")
48
+ end
49
+ end
50
+
51
+ OptionsHash.new(config_opts)
52
+ end
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ThorAddons
4
+ module Helpers
5
+ class OptionsENV
6
+ private_class_method def self.get_from_env_or_alias(env, envs_aliases)
7
+ return ENV[env] unless ENV[env].nil? && envs_aliases.keys.include?(env)
8
+
9
+ ENV[envs_aliases[env]]
10
+ end
11
+
12
+ def self.parse(defaults, envs_aliases)
13
+ opts = defaults.keys.each_with_object({}) do |option, hsh|
14
+ value = get_from_env_or_alias(option.to_s.upcase, envs_aliases)
15
+
16
+ next if value.nil?
17
+
18
+ hsh[option] = OptionType.new(value, defaults[option][:type])
19
+ .convert_string
20
+ end
21
+
22
+ OptionsHash.new(opts)
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ThorAddons
4
+ module Helpers
5
+ class OptionsHash < ::SymbolizedHash
6
+ private def value_empty?(value)
7
+ value.is_a?(NilClass) || (value.respond_to?(:empty?) && value.empty?)
8
+ end
9
+
10
+ def merge(new_hash)
11
+ new_hash.each_with_object(dup) do |(key, value), self_dup|
12
+ next if value_empty?(value) || !value_empty?(self_dup[key])
13
+
14
+ self_dup[key] = value
15
+ end
16
+ end
17
+
18
+ def merge!(options)
19
+ replace(merge(options))
20
+ end
21
+ end
22
+ end
23
+ end
@@ -1,13 +1,17 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ThorAddons
2
4
  module Options
3
- attr_reader :current_command_name, :defaults, :invoked_via_subcommand, :invocations
5
+ attr_reader :defaults, :invocations, :current_command_name
4
6
 
5
7
  def initialize(args = [], local_options = {}, config = {})
6
- @current_command_name = config[:current_command] ? config[:current_command].name : nil
7
- @defaults = load_defaults(config.dup)
8
- @invoked_via_subcommand = config[:invoked_via_subcommand]
8
+ @defaults = Helpers::Defaults.load(self.class, config.dup)
9
9
  @invocations = config[:invocations]
10
10
 
11
+ if config[:current_command].respond_to?(:name)
12
+ @current_command_name = config[:current_command].name
13
+ end
14
+
11
15
  super(args, local_options, config)
12
16
  end
13
17
 
@@ -19,126 +23,52 @@ module ThorAddons
19
23
  true
20
24
  end
21
25
 
22
- def options
23
- original = hash_with_indifferent_access(super)
24
- config_file = original[:config_file]
25
-
26
- return original unless with_env? || with_config_file?
27
-
28
- new_options = remove_defaults(original)
29
-
30
- if with_config_file? && !config_file.nil?
31
- merge(new_options, options_from_config(config_file))
32
- end
33
-
34
- if with_env?
35
- merge(new_options, options_from_env)
36
- end
37
-
38
- hash_with_indifferent_access(add_defaults(new_options))
39
- end
40
-
41
- private
42
-
43
- def merge(options_a, options_b)
44
- options_b.each do |key, value|
45
- next if value.to_s.empty? || !options_a[key].to_s.empty?
46
-
47
- options_a[key] = value
48
- end
49
-
50
- options_a
51
- end
52
-
53
26
  def envs_aliases
54
27
  {}
55
28
  end
56
29
 
57
- def options_from_env
58
- opts = {}
59
- defaults.keys.inject({}) do |memo, option|
60
- env = option.to_s.upcase
61
- opts[option] = ENV[env] unless ENV[env].nil?
62
-
63
- next unless envs_aliases.keys.include?(env) && opts[option].nil? && ENV[envs_aliases[env]]
64
-
65
- opts[option] = ENV[envs_aliases[env]]
66
- end
67
-
68
- hash_with_indifferent_access(opts)
69
- end
70
-
71
- def options_from_config(config_file)
72
- unless File.file?(config_file)
73
- STDERR.puts("[WARNING] Unable to read 'config_file' '#{config_file}' not found.")
74
- return {}
75
- end
76
-
77
- data = YAML.load_file(config_file)
78
- command_options = {}
79
- global = data["global"] || {}
80
-
81
- return hash_with_indifferent_access(global) if current_command_name.nil?
82
-
83
- if invoked_via_subcommand
84
- first_invoked, *remaining_invoked = invocations.values.flatten
85
- command_options = data[first_invoked] unless data[first_invoked].nil?
30
+ def options
31
+ original = Helpers::OptionsHash.new(super)
86
32
 
87
- remaining_invoked.each do |subcommand|
88
- break if command_options[subcommand].nil?
33
+ return original unless with_env? || with_config_file?
89
34
 
90
- subcommand_data = command_options[subcommand]
35
+ new_options = Helpers::Defaults.remove(original, defaults)
36
+ update_options!(new_options, original[:config_file])
91
37
 
92
- command_options.delete(subcommand)
93
- command_options.merge!(subcommand_data)
94
- end
95
- else
96
- command_options = data[current_command_name] unless data[current_command_name].nil?
97
- end
38
+ opts = Helpers::OptionsHash.new(
39
+ Helpers::Defaults.add(new_options, defaults)
40
+ )
98
41
 
99
- hash_with_indifferent_access(global.merge(command_options))
42
+ validate_options(opts)
100
43
  end
101
44
 
102
- def add_defaults(hash)
103
- hash.inject({}) do |memo, (k, v)|
104
- memo[k] = v.nil? ? defaults[k] : v
105
-
106
- memo
107
- end
45
+ private def update_options!(opts, cfg_file)
46
+ update_config_options!(opts, cfg_file) if with_config_file? && cfg_file
47
+ update_env_options!(opts) if with_env?
108
48
  end
109
49
 
110
- def remove_defaults(hash)
111
- hash.inject({}) do |memo, (k, v)|
112
- if defaults[k] == v
113
- memo[k] = nil
114
- else
115
- memo[k] = v
116
- end
117
-
118
- memo
119
- end
50
+ private def update_config_options!(opts, cfg_file)
51
+ opts.merge!(
52
+ Helpers::OptionsConfigFile.parse(
53
+ cfg_file,
54
+ invocations,
55
+ current_command_name,
56
+ defaults
57
+ )
58
+ )
120
59
  end
121
60
 
122
- def load_defaults(config)
123
- parse_options = self.class.class_options.dup
124
- parse_options.merge!(config[:class_options]) if config[:class_options]
125
- parse_options.merge!(config[:command_options]) if config[:command_options]
61
+ private def update_env_options!(opts)
62
+ opts.merge!(Helpers::OptionsENV.parse(defaults, envs_aliases))
63
+ end
126
64
 
127
- options_hash = parse_options.inject({}) do |memo, (key, value)|
128
- begin
129
- memo[key] = value.default
130
- rescue NoMethodError
131
- memo[key] = nil
132
- end
65
+ private def validate_options(opts)
66
+ opts.each do |key, value|
67
+ type = defaults[key][:type]
68
+ is_valid = Helpers::OptionType.new(value, type).valid?
133
69
 
134
- memo
70
+ raise TypeError, "'#{key}' should be a #{type}" unless is_valid
135
71
  end
136
-
137
- hash_with_indifferent_access(options_hash)
138
- end
139
-
140
- def hash_with_indifferent_access(hash)
141
- ::SymbolizedHash.new(hash)
142
72
  end
143
73
  end
144
74
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ThorAddons
2
- VERSION = "0.1.6"
4
+ VERSION = "1.0.0"
3
5
  end
data/lib/thor-addons.rb CHANGED
@@ -1,7 +1,14 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "yaml"
2
- require "thor"
3
- require "thor"
4
4
  require "symbolized"
5
+ require "thor"
5
6
 
6
- require "thor-addons/version"
7
+ require "ext/string"
8
+ require "thor-addons/helpers/defaults"
9
+ require "thor-addons/helpers/option_type"
10
+ require "thor-addons/helpers/options_config_file"
11
+ require "thor-addons/helpers/options_env"
12
+ require "thor-addons/helpers/options_hash"
7
13
  require "thor-addons/options"
14
+ require "thor-addons/version"
data/thor-addons.gemspec CHANGED
@@ -1,5 +1,6 @@
1
- # coding: utf-8
2
- lib = File.expand_path("../lib", __FILE__)
1
+ # frozen_string_literal: true
2
+
3
+ lib = File.expand_path("lib", __dir__)
3
4
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
5
  require "thor-addons/version"
5
6
 
@@ -9,18 +10,23 @@ Gem::Specification.new do |spec|
9
10
  spec.authors = ["Jacopo Scrinzi"]
10
11
  spec.email = ["scrinzi.jcopo@gmail.com"]
11
12
 
12
- spec.summary = %q{Thor CLI Add-ons}
13
- spec.description = %q{Useful Add-ons Thor CLI}
13
+ spec.summary = "Thor CLI Add-ons"
14
+ spec.description = "Useful Add-ons Thor CLI"
14
15
  spec.homepage = "https://github.com/eredi93/thor-addons"
15
16
  spec.license = "MIT"
16
17
 
17
- spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
18
18
  spec.require_paths = ["lib"]
19
19
 
20
- spec.add_dependency "thor", "~> 0.19"
20
+ spec.files = `git ls-files -z`.split("\x0")
21
+ .reject { |f| f.match(%r{^(test|spec|features)/}) }
22
+
21
23
  spec.add_dependency "symbolized", "~> 0.0.1"
24
+ spec.add_dependency "thor", "~> 0.19"
22
25
 
23
26
  spec.add_development_dependency "bundler"
27
+ spec.add_development_dependency "climate_control"
28
+ spec.add_development_dependency "gem-release"
24
29
  spec.add_development_dependency "rake"
25
30
  spec.add_development_dependency "rspec"
31
+ spec.add_development_dependency "rubocop"
26
32
  end
metadata CHANGED
@@ -1,43 +1,43 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: thor-addons
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.6
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jacopo Scrinzi
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-03-13 00:00:00.000000000 Z
11
+ date: 2018-04-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: thor
14
+ name: symbolized
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '0.19'
19
+ version: 0.0.1
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '0.19'
26
+ version: 0.0.1
27
27
  - !ruby/object:Gem::Dependency
28
- name: symbolized
28
+ name: thor
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: 0.0.1
33
+ version: '0.19'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: 0.0.1
40
+ version: '0.19'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: bundler
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -52,6 +52,34 @@ dependencies:
52
52
  - - ">="
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: climate_control
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: gem-release
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
55
83
  - !ruby/object:Gem::Dependency
56
84
  name: rake
57
85
  requirement: !ruby/object:Gem::Requirement
@@ -80,6 +108,20 @@ dependencies:
80
108
  - - ">="
81
109
  - !ruby/object:Gem::Version
82
110
  version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: rubocop
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
83
125
  description: Useful Add-ons Thor CLI
84
126
  email:
85
127
  - scrinzi.jcopo@gmail.com
@@ -88,6 +130,8 @@ extensions: []
88
130
  extra_rdoc_files: []
89
131
  files:
90
132
  - ".gitignore"
133
+ - ".rubocop.yml"
134
+ - ".ruby-version"
91
135
  - ".travis.yml"
92
136
  - CHANGELOG.md
93
137
  - CONTRIBUTING.md
@@ -96,7 +140,13 @@ files:
96
140
  - LICENSE.md
97
141
  - README.md
98
142
  - Rakefile
143
+ - lib/ext/string.rb
99
144
  - lib/thor-addons.rb
145
+ - lib/thor-addons/helpers/defaults.rb
146
+ - lib/thor-addons/helpers/option_type.rb
147
+ - lib/thor-addons/helpers/options_config_file.rb
148
+ - lib/thor-addons/helpers/options_env.rb
149
+ - lib/thor-addons/helpers/options_hash.rb
100
150
  - lib/thor-addons/options.rb
101
151
  - lib/thor-addons/version.rb
102
152
  - thor-addons.gemspec