hammer_cli 0.1.3 → 0.1.4

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.
Files changed (64) hide show
  1. checksums.yaml +4 -4
  2. data/bin/hammer +3 -1
  3. data/config/cli_config.template.yml +3 -0
  4. data/doc/creating_commands.md +1 -1
  5. data/doc/installation.md +3 -2
  6. data/doc/release_notes.md +17 -0
  7. data/doc/writing_a_plugin.md +1 -1
  8. data/lib/hammer_cli/abstract.rb +46 -9
  9. data/lib/hammer_cli/apipie/command.rb +10 -1
  10. data/lib/hammer_cli/apipie/option_builder.rb +29 -11
  11. data/lib/hammer_cli/apipie/option_definition.rb +18 -0
  12. data/lib/hammer_cli/apipie/resource.rb +4 -22
  13. data/lib/hammer_cli/exception_handler.rb +18 -6
  14. data/lib/hammer_cli/exceptions.rb +1 -0
  15. data/lib/hammer_cli/i18n.rb +4 -0
  16. data/lib/hammer_cli/main.rb +2 -0
  17. data/lib/hammer_cli/modules.rb +30 -2
  18. data/lib/hammer_cli/options/matcher.rb +48 -0
  19. data/lib/hammer_cli/output/adapter.rb +3 -1
  20. data/lib/hammer_cli/output/adapter/csv.rb +5 -2
  21. data/lib/hammer_cli/output/adapter/json.rb +17 -0
  22. data/lib/hammer_cli/output/adapter/table.rb +11 -17
  23. data/lib/hammer_cli/output/adapter/tree_structure.rb +74 -0
  24. data/lib/hammer_cli/output/adapter/wrapper_formatter.rb +20 -0
  25. data/lib/hammer_cli/output/adapter/yaml.rb +16 -0
  26. data/lib/hammer_cli/shell.rb +3 -8
  27. data/lib/hammer_cli/utils.rb +10 -0
  28. data/lib/hammer_cli/version.rb +1 -1
  29. data/locale/de/LC_MESSAGES/hammer-cli.mo +0 -0
  30. data/locale/de/hammer-cli.po +296 -0
  31. data/locale/en/LC_MESSAGES/hammer-cli.mo +0 -0
  32. data/locale/en/hammer-cli.po +1 -1
  33. data/locale/en_GB/LC_MESSAGES/hammer-cli.mo +0 -0
  34. data/locale/en_GB/hammer-cli.po +133 -133
  35. data/locale/es/LC_MESSAGES/hammer-cli.mo +0 -0
  36. data/locale/es/hammer-cli.po +148 -147
  37. data/locale/fr/LC_MESSAGES/hammer-cli.mo +0 -0
  38. data/locale/fr/hammer-cli.po +142 -141
  39. data/locale/hammer-cli.pot +39 -32
  40. data/locale/it/LC_MESSAGES/hammer-cli.mo +0 -0
  41. data/locale/it/hammer-cli.po +293 -0
  42. data/locale/ja/LC_MESSAGES/hammer-cli.mo +0 -0
  43. data/locale/ja/hammer-cli.po +291 -0
  44. data/locale/ko/LC_MESSAGES/hammer-cli.mo +0 -0
  45. data/locale/ko/hammer-cli.po +292 -0
  46. data/locale/pt_BR/LC_MESSAGES/hammer-cli.mo +0 -0
  47. data/locale/pt_BR/hammer-cli.po +294 -0
  48. data/locale/ru/LC_MESSAGES/hammer-cli.mo +0 -0
  49. data/locale/ru/hammer-cli.po +293 -0
  50. data/locale/zh_CN/LC_MESSAGES/hammer-cli.mo +0 -0
  51. data/locale/zh_CN/hammer-cli.po +292 -0
  52. data/locale/zh_TW/LC_MESSAGES/hammer-cli.mo +0 -0
  53. data/locale/zh_TW/hammer-cli.po +292 -0
  54. data/test/unit/apipie/command_test.rb +22 -0
  55. data/test/unit/apipie/option_builder_test.rb +21 -7
  56. data/test/unit/apipie/option_definition_test.rb +26 -0
  57. data/test/unit/fixtures/apipie/documented.json +26 -0
  58. data/test/unit/modules_test.rb +13 -2
  59. data/test/unit/options/matcher_test.rb +61 -0
  60. data/test/unit/output/adapter/json_test.rb +214 -0
  61. data/test/unit/output/adapter/table_test.rb +66 -0
  62. data/test/unit/output/adapter/yaml_test.rb +213 -0
  63. data/test/unit/utils_test.rb +17 -0
  64. metadata +249 -205
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: f291ac84923a7a842e1464948770660d9eda7bc9
4
- data.tar.gz: 593e26e92e365344b6b5e2f319266e7a842a10d6
3
+ metadata.gz: dfc3de6a7599c2ab526183074b333b1c3ad55970
4
+ data.tar.gz: 0c5a264582fdd5dc5fcfcdbfe4f20cb1ccb8f3f0
5
5
  SHA512:
6
- metadata.gz: 8ecca4d5ca8efe937fa4194f807f555078b7c494fbf33c78b88dbd7cbdae2a21d41835d255e1bbebcfdba5fd9ebef01e9b3c55a678413c4ac41026ba188318c8
7
- data.tar.gz: 263225f32a3c48c8a4de9748436f3129ebca50f0d2ce3a41c25188c77370125e9c22766870e038a82ca9a2af490935aa95548226b34681fa3ee16f926817afae
6
+ metadata.gz: 75df4210b14e233c11f681e06d2045518e9fb39233094b5283012ebd4ff59e341edc74a077f986c8da14770b5c507a0ed0e6d623098357a7e74ca70fae345594
7
+ data.tar.gz: 06045bbf7c133b0b826a6822faa9df3f215f19895b2d3b76f73e9bbaefe9f4d4b0a3e3a91c97ee7a7a59aae0a70728a7c10bc93dcd27af2762227dbdc0747524
data/bin/hammer CHANGED
@@ -17,6 +17,7 @@ class PreParser < Clamp::Command
17
17
  option ["-u", "--username"], "USERNAME", _("username to access the remote system")
18
18
  option ["-p", "--password"], "PASSWORD", _("password to access the remote system")
19
19
  option ["-s", "--server"], "SERVER", _("remote system address")
20
+ option ["-r", "--reload-cache"], :flag, _("force reload of Apipie cache")
20
21
  option ["--interactive"], "INTERACTIVE", _("Explicitly turn interactive mode on/off") do |value|
21
22
  bool_normalizer = HammerCLI::Options::Normalizers::Bool.new
22
23
  bool_normalizer.format(value)
@@ -57,7 +58,8 @@ HammerCLI::Settings.load({
57
58
  :password => preparser.password,
58
59
  :host => preparser.server,
59
60
  :interactive => preparser.interactive,
60
- :verbose => preparser.verbose? || preparser.debug?
61
+ :verbose => preparser.verbose? || preparser.debug?,
62
+ :reload_cache => preparser.reload_cache?
61
63
  }})
62
64
 
63
65
  if HammerCLI::Settings.get(:mark_translated)
@@ -11,6 +11,9 @@
11
11
  # Enable/disable color output of logger in Clamp commands
12
12
  :watch_plain: false
13
13
 
14
+ # Forece relaod of Apipie cache with every Hammer invocation
15
+ :reload_cache: false
16
+
14
17
  # Directory where the logs are stored. The default is /var/log/hammer/ and the log file is named hammer.log
15
18
  :log_dir: '~/.hammer/log'
16
19
 
@@ -572,5 +572,5 @@ There are more ways where to place your config file for hammer.
572
572
  The best practice is to place module's configuration into a separate file named by
573
573
  the module. In this example it would be `~/.hammer/cli.modules.d/hello_world.yml`.
574
574
 
575
- Read more in [the settings howto](https://github.com/theforeman/hammer-cli#configuration).
575
+ Read more about configuration locations in [the settings howto](installation.md#configuration).
576
576
 
@@ -29,10 +29,10 @@ Configuration is by default looked for in the following directories, loaded in t
29
29
  - custom location (file or directory) specified on command line - ```-c CONF_FILE_PATH```
30
30
 
31
31
  In each of these directories hammer is trying to load ```cli_config.yml``` and anything in
32
- the ```cli.modules.d``` subdirectory which is place for specific configuration of hammer modules.
32
+ the ```cli.modules.d``` subdirectory which is place for specific configuration of hammer modules a.k.a. plugins.
33
33
 
34
34
  Later directories and files have precedence if they redefine the same option. Files from ```cli.modules.d```
35
- are loaded in alphabetical order.
35
+ are loaded in alphabetical order. The modules are loaded in alphabetical order which can be overriden with explicit requirement of dependences in the modules.
36
36
 
37
37
  ### Manual installation
38
38
  The packaged version of hammer copies the template to `/etc/hammer` for you.
@@ -70,6 +70,7 @@ in ```~/.hammer/cli.modules.d/foreman.yml``` should look as follows:
70
70
  :password: 'changeme'
71
71
  ```
72
72
 
73
+
73
74
  Use the hammer
74
75
  --------------
75
76
 
@@ -1,6 +1,23 @@
1
1
  Release notes
2
2
  =============
3
3
 
4
+ ### 0.1.4 (2014-12-10)
5
+ * hammer-cli CSV formatter doesn't properly format values with custom formatters, moving to correct implementation ([#8569](http://projects.theforeman.org/issues/8569))
6
+ * added support for dependeces among modules ([#7566](http://projects.theforeman.org/issues/7566))
7
+ * Add option forcing apipie cache reload ([#8430](http://projects.theforeman.org/issues/8430))
8
+ * Missing search options error message ([#5556](http://projects.theforeman.org/issues/5556))
9
+ * Adds YAML and JSON output adapters (BZ1122650) ([#6754](http://projects.theforeman.org/issues/6754))
10
+ * Credentials interface definition moved to ApipieBindings ([#7408](http://projects.theforeman.org/issues/7408))
11
+ * Catching apipie-bindings' MissingArgumentsError ([#6820](http://projects.theforeman.org/issues/6820))
12
+ * Prints table headers when no data ([#7001](http://projects.theforeman.org/issues/7001))
13
+ * i18n - add zh_CN language
14
+ * i18n - add de, it, pt_BR, zh_TW, ru, ja, ko languages
15
+ * Readable help for long options ([#5417](http://projects.theforeman.org/issues/5417))
16
+ * Give usage information for boolean types ([#7284](http://projects.theforeman.org/issues/7284))
17
+ * Minor updates in devel docs ([#5052](http://projects.theforeman.org/issues/5052))
18
+ * Avoid locale domain name conflict ([#7262](http://projects.theforeman.org/issues/7262))
19
+
20
+
4
21
  ### 0.1.3
5
22
  * Fixed detection of list type options ([#7144](http://projects.theforeman.org/issues/7144))
6
23
  * Key-value normalizer accepts arrays ([#7133](http://projects.theforeman.org/issues/7133))
@@ -59,7 +59,7 @@ $ gem build ./hammer_cli_hello.gemspec
59
59
  $ gem install hammer_cli_hello-0.0.1.gem
60
60
  ```
61
61
 
62
- Place your module's config file into `~/.hammer/cli.modules.d/`.
62
+ Place your module's config file into `~/.hammer/cli.modules.d/hello_world.yml`.
63
63
  ```yaml
64
64
  :hello:
65
65
  :enable_module: true
@@ -3,6 +3,7 @@ require 'hammer_cli/logger_watch'
3
3
  require 'hammer_cli/options/option_definition'
4
4
  require 'hammer_cli/clamp'
5
5
  require 'hammer_cli/subcommand'
6
+ require 'hammer_cli/options/matcher'
6
7
  require 'logging'
7
8
 
8
9
  module HammerCLI
@@ -63,11 +64,29 @@ module HammerCLI
63
64
  end
64
65
 
65
66
  class SortedBuilder < Clamp::Help::Builder
67
+
68
+ DEFAULT_LABEL_INDENT = 29
69
+
66
70
  def add_list(heading, items)
67
71
  items.sort! do |a, b|
68
72
  a.help[0] <=> b.help[0]
69
73
  end
70
- super(heading, items)
74
+
75
+ puts "\n#{heading}:"
76
+
77
+ label_width = DEFAULT_LABEL_INDENT
78
+ items.each do |item|
79
+ label, description = item.help
80
+ label_width = label.size if label.size > label_width
81
+ end
82
+
83
+ items.each do |item|
84
+ label, description = item.help
85
+ description.each_line do |line|
86
+ puts " %-#{label_width}s %s" % [label, line]
87
+ label = ''
88
+ end
89
+ end
71
90
  end
72
91
  end
73
92
 
@@ -90,14 +109,6 @@ module HammerCLI
90
109
  self.class.output_definition
91
110
  end
92
111
 
93
- def self.inherited_output_definition
94
- od = nil
95
- if superclass.respond_to? :output_definition
96
- od_super = superclass.output_definition
97
- od = od_super.dup unless od_super.nil?
98
- end
99
- od
100
- end
101
112
 
102
113
  def self.output_definition
103
114
  @output_definition = @output_definition || inherited_output_definition || HammerCLI::Output::Definition.new
@@ -129,6 +140,20 @@ module HammerCLI
129
140
 
130
141
  protected
131
142
 
143
+ def self.find_options(switch_filter, other_filters={})
144
+ filters = other_filters
145
+ if switch_filter.is_a? Hash
146
+ filters.merge!(switch_filter)
147
+ else
148
+ filters[:long_switch] = switch_filter
149
+ end
150
+
151
+ m = HammerCLI::Options::Matcher.new(filters)
152
+ recognised_options.find_all do |opt|
153
+ m.matches? opt
154
+ end
155
+ end
156
+
132
157
  def self.create_option_builder
133
158
  OptionBuilderContainer.new
134
159
  end
@@ -217,5 +242,17 @@ module HammerCLI
217
242
  def options
218
243
  all_options.reject {|key, value| value.nil? }
219
244
  end
245
+
246
+ private
247
+
248
+ def self.inherited_output_definition
249
+ od = nil
250
+ if superclass.respond_to? :output_definition
251
+ od_super = superclass.output_definition
252
+ od = od_super.dup unless od_super.nil?
253
+ end
254
+ od
255
+ end
256
+
220
257
  end
221
258
  end
@@ -1,6 +1,7 @@
1
1
  require File.join(File.dirname(__FILE__), '../abstract')
2
2
  require File.join(File.dirname(__FILE__), '../messages')
3
3
  require File.join(File.dirname(__FILE__), 'options')
4
+ require File.join(File.dirname(__FILE__), 'option_definition')
4
5
  require File.join(File.dirname(__FILE__), 'resource')
5
6
 
6
7
  module HammerCLI::Apipie
@@ -20,7 +21,7 @@ module HammerCLI::Apipie
20
21
  def self.create_option_builder
21
22
  builder = super
22
23
  builder.builders += [
23
- OptionBuilder.new(resource.action(action), :require_options => false)
24
+ OptionBuilder.new(resource, resource.action(action), :require_options => false)
24
25
  ] if resource_defined?
25
26
  builder
26
27
  end
@@ -73,5 +74,13 @@ module HammerCLI::Apipie
73
74
  )
74
75
  end
75
76
 
77
+ def self.option(switches, type, description, opts = {}, &block)
78
+ HammerCLI::Apipie::OptionDefinition.new(switches, type, description, opts).tap do |option|
79
+ declared_options << option
80
+ block ||= option.default_conversion_block
81
+ define_accessors_for(option, &block)
82
+ end
83
+ end
84
+
76
85
  end
77
86
  end
@@ -3,8 +3,9 @@ module HammerCLI::Apipie
3
3
 
4
4
  class OptionBuilder < HammerCLI::AbstractOptionBuilder
5
5
 
6
- def initialize(action, options={})
6
+ def initialize(resource, action, options={})
7
7
  @action = action
8
+ @resource = resource
8
9
  @require_options = options[:require_options].nil? ? true : options[:require_options]
9
10
  end
10
11
 
@@ -22,6 +23,10 @@ module HammerCLI::Apipie
22
23
 
23
24
  protected
24
25
 
26
+ def option(*args)
27
+ HammerCLI::Apipie::OptionDefinition.new(*args)
28
+ end
29
+
25
30
  def options_for_params(params, filter, resource_name_map)
26
31
  opts = []
27
32
  params.each do |p|
@@ -45,11 +50,11 @@ module HammerCLI::Apipie
45
50
  end
46
51
 
47
52
  def option_switch(param, resource_name_map)
48
- '--' + optionamize(aliased(param.name, resource_name_map))
53
+ '--' + optionamize(aliased(param, resource_name_map))
49
54
  end
50
55
 
51
56
  def option_type(param, resource_name_map)
52
- aliased(param.name, resource_name_map).upcase.gsub('-', '_')
57
+ aliased(param, resource_name_map).upcase.gsub('-', '_')
53
58
  end
54
59
 
55
60
  def option_desc(param)
@@ -61,20 +66,33 @@ module HammerCLI::Apipie
61
66
  opts[:required] = true if (param.required? and require_options?)
62
67
  if param.expected_type == :array || param.validator =~ /Array/i
63
68
  opts[:format] = HammerCLI::Options::Normalizers::List.new
69
+ elsif param.expected_type == 'boolean' || param.validator =~ /Boolean/i
70
+ opts[:format] = HammerCLI::Options::Normalizers::Bool.new
64
71
  end
65
72
  opts[:attribute_name] = HammerCLI.option_accessor_name(param.name)
73
+ opts[:referenced_resource] = resource_name(param)
74
+
66
75
  return opts
67
76
  end
68
77
 
69
- def aliased(name, resource_name_map)
70
- resource_name = name.gsub(/_id[s]?$/, "")
71
- resource_name = resource_name_map[resource_name.to_s] || resource_name_map[resource_name.to_sym] || resource_name
72
- if name.end_with?("_id")
73
- return "#{resource_name}_id"
74
- elsif name.end_with?("_ids")
75
- return "#{resource_name}_ids"
78
+ def aliased(param, resource_name_map)
79
+ resource_name = resource_name(param)
80
+
81
+ if resource_name.nil?
82
+ return param.name
83
+ else
84
+ aliased_name = resource_name_map[resource_name.to_s] || resource_name_map[resource_name.to_sym] || resource_name
85
+ return param.name.gsub(resource_name, aliased_name.to_s)
86
+ end
87
+ end
88
+
89
+ def resource_name(param)
90
+ if (param.name =~ /^id[s]?$/)
91
+ @resource.singular_name
92
+ elsif(param.name =~ /_id[s]?$/)
93
+ param.name.to_s.gsub(/_id[s]?$/, "")
76
94
  else
77
- return name
95
+ nil
78
96
  end
79
97
  end
80
98
 
@@ -0,0 +1,18 @@
1
+ require File.join(File.dirname(__FILE__), 'options')
2
+
3
+ module HammerCLI::Apipie
4
+
5
+ class OptionDefinition < HammerCLI::Options::OptionDefinition
6
+
7
+ attr_accessor :referenced_resource
8
+
9
+ def initialize(switches, type, description, options = {})
10
+ if options.has_key? :referenced_resource
11
+ self.referenced_resource = options.delete(:referenced_resource).to_s if options[:referenced_resource]
12
+ end
13
+ super
14
+ end
15
+
16
+ end
17
+
18
+ end
@@ -1,36 +1,18 @@
1
1
  require 'apipie_bindings'
2
2
  module HammerCLI::Apipie
3
3
 
4
- class AbstractCredentials
5
-
6
- def to_params
7
- {}
8
- end
9
-
10
- private
11
-
12
- def ask_user(prompt, silent=false)
13
- if silent
14
- ask(prompt) {|q| q.echo = false}
15
- else
16
- ask(prompt)
17
- end
18
- end
19
-
20
- end
21
-
22
4
 
23
5
  class ApipieConnector < HammerCLI::AbstractConnector
24
6
 
25
7
  attr_reader :api
26
8
 
27
9
  def initialize(params)
28
- credentials = params.delete(:credentials)
29
- params.merge!(credentials.to_params) if credentials
30
-
31
10
  @api = ApipieBindings::API.new(params)
11
+ if HammerCLI::Settings.get(:_params, :reload_cache) || HammerCLI::Settings.get(:reload_cache)
12
+ @api.clean_cache
13
+ Logging.logger['Init'].debug 'Apipie cache was cleared'
14
+ end
32
15
  end
33
-
34
16
  end
35
17
 
36
18
 
@@ -17,6 +17,8 @@ module HammerCLI
17
17
  [RestClient::ResourceNotFound, :handle_not_found],
18
18
  [RestClient::Unauthorized, :handle_unauthorized],
19
19
  [ApipieBindings::DocLoadingError, :handle_apipie_docloading_error],
20
+ [ApipieBindings::MissingArgumentsError, :handle_apipie_missing_arguments_error],
21
+ [HammerCLI::ModuleDisabledButRequired, :handle_generic_config_error]
20
22
  ]
21
23
  end
22
24
 
@@ -48,10 +50,10 @@ module HammerCLI
48
50
  output.print_message(msg)
49
51
  end
50
52
 
51
- def log_full_error(e)
53
+ def log_full_error(e, message = e.message)
52
54
  backtrace = e.backtrace || []
53
- error = "\n\n#{e.class} (#{e.message}):\n " +
54
- backtrace.join("\n ")
55
+ error = "\n\n#{e.class} (#{message}):\n " +
56
+ backtrace.join("\n ") +
55
57
  "\n\n"
56
58
  @logger.error error
57
59
  end
@@ -95,8 +97,18 @@ module HammerCLI
95
97
  HammerCLI::EX_CONFIG
96
98
  end
97
99
 
98
- end
99
- end
100
-
100
+ def handle_apipie_missing_arguments_error(e)
101
+ message = _("Missing arguments for %s") % "'#{e.params.join("', '")}'"
102
+ print_error message
103
+ log_full_error e, message
104
+ HammerCLI::EX_USAGE
105
+ end
101
106
 
107
+ def handle_generic_config_error(e)
108
+ print_error e.message
109
+ log_full_error e
110
+ HammerCLI::EX_CONFIG
111
+ end
102
112
 
113
+ end
114
+ end
@@ -3,5 +3,6 @@ module HammerCLI
3
3
  class CommandConflict < StandardError; end
4
4
  class OperationNotSupportedError < StandardError; end
5
5
  class ModuleLoadingError < StandardError; end
6
+ class ModuleDisabledButRequired < StandardError; end
6
7
 
7
8
  end
@@ -108,6 +108,10 @@ module HammerCLI
108
108
  '/usr/share/locale'
109
109
  end
110
110
 
111
+ def domain_name
112
+ "#{super}@system"
113
+ end
114
+
111
115
  end
112
116
 
113
117
 
@@ -6,6 +6,8 @@ module HammerCLI
6
6
 
7
7
  option ["-v", "--verbose"], :flag, _("be verbose"), :context_target => :verbose
8
8
  option ["-d", "--debug"], :flag, _("show debugging output "), :context_target => :debug
9
+ option ["-r", "--reload-cache"], :flag, _("force reload of Apipie cache")
10
+
9
11
  option ["-c", "--config"], "CFG_FILE", _("path to custom config file")
10
12
 
11
13
  option ["-u", "--username"], "USERNAME", _("username to access the remote system"),
@@ -1,16 +1,18 @@
1
-
2
1
  module HammerCLI
3
2
 
4
3
  class Modules
5
4
 
6
5
  def self.names
6
+ enabled_modules.sort
7
+ end
7
8
 
9
+ def self.enabled_modules
8
10
  # legacy modules config
9
11
  modules = HammerCLI::Settings.get(:modules) || []
10
12
  logger.warn _("Legacy configuration of modules detected. Check section about configuration in user manual") unless modules.empty?
11
13
 
12
14
  HammerCLI::Settings.dump.inject(modules) do |names, (mod_name, mod_config)|
13
- if mod_config.kind_of?(Hash) && !mod_config[:enable_module].nil?
15
+ if is_module_config?(mod_config)
14
16
  mod = ["hammer_cli_#{mod_name}"]
15
17
  if mod_config[:enable_module]
16
18
  names += mod
@@ -22,6 +24,22 @@ module HammerCLI
22
24
  end
23
25
  end
24
26
 
27
+ def self.disabled_modules
28
+ HammerCLI::Settings.dump.inject([]) do |names, (mod_name, mod_config)|
29
+ if is_module_config?(mod_config)
30
+ mod = "hammer_cli_#{mod_name}"
31
+ names << mod unless mod_config[:enable_module]
32
+ end
33
+ names
34
+ end
35
+ end
36
+
37
+ def self.loaded_modules
38
+ Object.constants. \
39
+ select{ |c| c.to_s =~ /\AHammerCLI[A-Z]./ && Object.const_get(c).class == Module }. \
40
+ map{ |m| m.to_s.underscore }
41
+ end
42
+
25
43
  def self.find_by_name(name)
26
44
  possible_names = [
27
45
  name.camelize,
@@ -64,9 +82,19 @@ module HammerCLI
64
82
  HammerCLI::Modules.names.each do |m|
65
83
  Modules.load(m)
66
84
  end
85
+ loaded_for_deps = loaded_modules & disabled_modules
86
+ unless loaded_for_deps.empty?
87
+ message = _("Error: Some of the required modules are disabled in configuration: %s ") % loaded_for_deps.join(', ')
88
+ raise HammerCLI::ModuleDisabledButRequired.new(message)
89
+ end
67
90
  end
68
91
 
69
92
  protected
93
+
94
+ def self.is_module_config?(config)
95
+ config.kind_of?(Hash) && !config[:enable_module].nil?
96
+ end
97
+
70
98
  def self.logger
71
99
  Logging.logger['Modules']
72
100
  end