hammer_cli_foreman 0.1.1 → 0.1.2

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 (92) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +11 -3
  3. data/doc/developer_docs.md +13 -0
  4. data/doc/name_id_resolution.md +50 -0
  5. data/doc/option_builder.md +48 -0
  6. data/doc/release_notes.md +64 -0
  7. data/lib/hammer_cli_foreman.rb +100 -23
  8. data/lib/hammer_cli_foreman/architecture.rb +0 -1
  9. data/lib/hammer_cli_foreman/associating_commands.rb +71 -0
  10. data/lib/hammer_cli_foreman/auth.rb +0 -1
  11. data/lib/hammer_cli_foreman/commands.rb +112 -80
  12. data/lib/hammer_cli_foreman/common_parameter.rb +5 -3
  13. data/lib/hammer_cli_foreman/compute_resource.rb +0 -2
  14. data/lib/hammer_cli_foreman/dependency_resolver.rb +32 -0
  15. data/lib/hammer_cli_foreman/domain.rb +0 -1
  16. data/lib/hammer_cli_foreman/environment.rb +0 -2
  17. data/lib/hammer_cli_foreman/exception_handler.rb +3 -3
  18. data/lib/hammer_cli_foreman/fact.rb +1 -1
  19. data/lib/hammer_cli_foreman/filter.rb +102 -0
  20. data/lib/hammer_cli_foreman/host.rb +5 -7
  21. data/lib/hammer_cli_foreman/hostgroup.rb +4 -3
  22. data/lib/hammer_cli_foreman/id_resolver.rb +60 -51
  23. data/lib/hammer_cli_foreman/image.rb +0 -1
  24. data/lib/hammer_cli_foreman/location.rb +7 -3
  25. data/lib/hammer_cli_foreman/media.rb +1 -1
  26. data/lib/hammer_cli_foreman/model.rb +1 -1
  27. data/lib/hammer_cli_foreman/operating_system.rb +4 -6
  28. data/lib/hammer_cli_foreman/option_builders.rb +285 -0
  29. data/lib/hammer_cli_foreman/organization.rb +7 -3
  30. data/lib/hammer_cli_foreman/param_filters.rb +61 -0
  31. data/lib/hammer_cli_foreman/parameter.rb +5 -3
  32. data/lib/hammer_cli_foreman/partition_table.rb +1 -1
  33. data/lib/hammer_cli_foreman/puppet_class.rb +1 -1
  34. data/lib/hammer_cli_foreman/references.rb +16 -0
  35. data/lib/hammer_cli_foreman/report.rb +1 -1
  36. data/lib/hammer_cli_foreman/role.rb +78 -0
  37. data/lib/hammer_cli_foreman/smart_class_parameter.rb +1 -1
  38. data/lib/hammer_cli_foreman/smart_proxy.rb +17 -2
  39. data/lib/hammer_cli_foreman/smart_variables.rb +111 -0
  40. data/lib/hammer_cli_foreman/subnet.rb +1 -1
  41. data/lib/hammer_cli_foreman/template.rb +10 -4
  42. data/lib/hammer_cli_foreman/user.rb +5 -1
  43. data/lib/hammer_cli_foreman/usergroup.rb +58 -0
  44. data/lib/hammer_cli_foreman/version.rb +1 -1
  45. data/locale/Makefile +12 -11
  46. data/locale/README.md +18 -0
  47. data/locale/en/LC_MESSAGES/hammer-cli-foreman.mo +0 -0
  48. data/locale/en/hammer-cli-foreman.po +1584 -0
  49. data/locale/en_GB/LC_MESSAGES/hammer-cli-foreman.mo +0 -0
  50. data/locale/en_GB/hammer-cli-foreman.po +1975 -0
  51. data/locale/es/LC_MESSAGES/hammer-cli-foreman.mo +0 -0
  52. data/locale/es/hammer-cli-foreman.po +1976 -0
  53. data/locale/fr/LC_MESSAGES/hammer-cli-foreman.mo +0 -0
  54. data/locale/fr/hammer-cli-foreman.po +1976 -0
  55. data/locale/hammer-cli-foreman.pot +1197 -787
  56. data/test/unit/api_test.rb +25 -0
  57. data/test/unit/architecture_test.rb +1 -0
  58. data/test/unit/commands_test.rb +18 -0
  59. data/test/unit/common_parameter_test.rb +1 -0
  60. data/test/unit/compute_resource_test.rb +1 -0
  61. data/test/unit/data/1.6/foreman_api.json +1 -0
  62. data/test/unit/dependency_resolver_test.rb +42 -0
  63. data/test/unit/domain_test.rb +1 -0
  64. data/test/unit/environment_test.rb +1 -0
  65. data/test/unit/fact_test.rb +1 -0
  66. data/test/unit/filter_test.rb +133 -0
  67. data/test/unit/helpers/command.rb +0 -13
  68. data/test/unit/host_test.rb +3 -0
  69. data/test/unit/hostgroup_test.rb +1 -0
  70. data/test/unit/id_resolver_test.rb +21 -68
  71. data/test/unit/image_test.rb +1 -1
  72. data/test/unit/location_test.rb +2 -0
  73. data/test/unit/media_test.rb +2 -0
  74. data/test/unit/model_test.rb +1 -0
  75. data/test/unit/operating_system_test.rb +1 -0
  76. data/test/unit/option_builders_test.rb +543 -0
  77. data/test/unit/organization_test.rb +1 -0
  78. data/test/unit/param_filters_test.rb +143 -0
  79. data/test/unit/partition_table_test.rb +1 -0
  80. data/test/unit/puppet_class_test.rb +1 -0
  81. data/test/unit/report_test.rb +1 -0
  82. data/test/unit/role_test.rb +94 -0
  83. data/test/unit/smart_class_parameter_test.rb +1 -0
  84. data/test/unit/smart_proxy_test.rb +14 -1
  85. data/test/unit/subnet_test.rb +1 -0
  86. data/test/unit/template_test.rb +1 -0
  87. data/test/unit/test_helper.rb +1 -1
  88. data/test/unit/user_test.rb +1 -0
  89. data/test/unit/usergroup_test.rb +80 -0
  90. metadata +50 -7
  91. data/lib/hammer_cli_foreman/searchables_option_builder.rb +0 -99
  92. data/test/unit/searchables_option_builder_test.rb +0 -172
@@ -149,7 +149,7 @@ module HammerCLIForeman
149
149
  end
150
150
 
151
151
  def get_parameters(host_id)
152
- params = HammerCLIForeman.foreman_resource(:parameters).call(:index, :host_id => host_id)
152
+ params = HammerCLIForeman.foreman_resource!(:parameters).call(:index, :host_id => host_id)
153
153
  HammerCLIForeman.collection_to_common_format(params)
154
154
  end
155
155
 
@@ -323,7 +323,7 @@ module HammerCLIForeman
323
323
 
324
324
  def validate_options
325
325
  super
326
- unless validator.option(:option_hostgroup_id).exist?
326
+ unless validator.any(:option_hostgroup_id, :option_hostgroup_name).exist?
327
327
  if option_managed
328
328
  validator.all(:option_environment_id, :option_architecture_id, :option_domain_id,
329
329
  :option_puppet_proxy_id, :option_operatingsystem_id,
@@ -395,7 +395,7 @@ module HammerCLIForeman
395
395
  end
396
396
 
397
397
  def request_params
398
- params = method_options
398
+ params = super
399
399
  params['id'] = get_identifier
400
400
  params
401
401
  end
@@ -429,7 +429,7 @@ module HammerCLIForeman
429
429
  end
430
430
 
431
431
  def request_params
432
- params = method_options
432
+ params = super
433
433
  params['id'] = get_identifier
434
434
  params
435
435
  end
@@ -449,7 +449,7 @@ module HammerCLIForeman
449
449
  end
450
450
 
451
451
  def request_params
452
- params = method_options
452
+ params = super
453
453
  params['id'] = get_identifier
454
454
  params
455
455
  end
@@ -466,5 +466,3 @@ module HammerCLIForeman
466
466
  end
467
467
 
468
468
  end
469
-
470
- HammerCLI::MainCommand.subcommand 'host', ("Manipulate hosts."), HammerCLIForeman::Host
@@ -1,11 +1,12 @@
1
1
  require 'hammer_cli_foreman/smart_class_parameter'
2
+ require 'hammer_cli_foreman/puppet_class'
2
3
 
3
4
  module HammerCLIForeman
4
5
 
5
6
  module HostgroupUpdateCreateCommons
6
7
 
7
8
  def request_params
8
- params = method_options
9
+ params = super
9
10
  params['hostgroup']['puppetclass_ids'] = option_puppetclass_ids
10
11
  params
11
12
  end
@@ -99,7 +100,7 @@ module HammerCLIForeman
99
100
  end
100
101
 
101
102
  def request_params
102
- params = method_options
103
+ params = super
103
104
  params['hostgroup_id'] = get_identifier
104
105
  params
105
106
  end
@@ -138,4 +139,4 @@ module HammerCLIForeman
138
139
 
139
140
  end
140
141
 
141
- HammerCLI::MainCommand.subcommand 'hostgroup', _("Manipulate hostgroups."), HammerCLIForeman::Hostgroup
142
+
@@ -18,13 +18,45 @@ module HammerCLIForeman
18
18
 
19
19
  class Searchables
20
20
 
21
+ protected
22
+
23
+ def self.s(name, description, options={})
24
+ Searchable.new(name, description, options)
25
+ end
26
+
27
+ def self.s_name(description, options={})
28
+ s("name", description, options)
29
+ end
30
+
21
31
  SEARCHABLES = {
22
- :user => [ Searchable.new("login", _("User's login to search by")) ],
23
- :template => [],
24
- :image => [],
25
- :operatingsystem => []
32
+ :architecture => [ s_name(_("Architecture name")) ],
33
+ :compute_resource => [ s_name(_("Compute resource name")) ],
34
+ :domain => [ s_name(_("Domain name")) ],
35
+ :environment => [ s_name(_("Environment name")) ],
36
+ :fact_value => [],
37
+ :filter => [],
38
+ :host => [ s_name(_("Host name")) ],
39
+ :hostgroup => [ s_name(_("Hostgroup name")) ],
40
+ :image => [],
41
+ :location => [ s_name(_("Location name")) ],
42
+ :medium => [ s_name(_("Medium name")) ],
43
+ :model => [ s_name(_("Model name")) ],
44
+ :organization => [ s_name(_("Organization name")) ],
45
+ :operatingsystem => [],
46
+ :ptable => [ s_name(_("Partition table name")) ],
47
+ :proxy => [ s_name(_("Proxy name")) ],
48
+ :puppetclass => [ s_name(_("Puppet class name")) ],
49
+ :report => [ s_name(_("Report name")) ],
50
+ :role => [ s_name(_("User role name")) ],
51
+ :subnet => [ s_name(_("Subnet name")) ],
52
+ :template => [],
53
+ :user => [ s("login", _("User's login to search by")) ],
54
+ :common_parameter => [ s_name(_("Common parameter name")) ],
55
+ :smart_class_parameter => [ s_name(_("Smart class parameter name")) ]
26
56
  }
27
- DEFAULT_SEARCHABLES = [ Searchable.new("name", _("Name to search by")) ]
57
+ DEFAULT_SEARCHABLES = [ s_name(_("Name to search by")) ]
58
+
59
+ public
28
60
 
29
61
  def for(resource)
30
62
  SEARCHABLES[resource.singular_name.to_sym] || DEFAULT_SEARCHABLES
@@ -43,59 +75,31 @@ module HammerCLIForeman
43
75
  end
44
76
 
45
77
  def scoped_options(scope, options)
46
- prefix = HammerCLI.option_accessor_name("#{scope}_")
47
- plain_prefix = HammerCLI.option_accessor_name("")
48
-
49
78
  scoped_options = options.dup
50
- options.each do |k, v|
51
- if k.start_with? prefix
52
- # remove the scope
53
- # e.g. option_architecture_id -> option_id
54
- scoped_options[k.sub(prefix, plain_prefix)] = v
55
- scoped_options.delete(k)
79
+
80
+ resource = HammerCLIForeman.param_to_resource(scope)
81
+ return scoped_options unless resource
82
+
83
+ option_names = searchables(resource).map { |s| s.name }
84
+ option_names << "id"
85
+
86
+ option_names.each do |name|
87
+ option = HammerCLI.option_accessor_name(name)
88
+ scoped_option = HammerCLI.option_accessor_name("#{scope}_#{name}")
89
+ # remove the scope
90
+ # e.g. option_architecture_id -> option_id
91
+ if scoped_options[scoped_option]
92
+ scoped_options[option] = scoped_options.delete(scoped_option)
93
+ else
94
+ scoped_options.delete(option)
56
95
  end
57
96
  end
58
97
  scoped_options
59
98
  end
60
99
 
61
- def dependent_resources(resource, options={})
62
- options[:required] = (options[:required] == true)
63
- options[:recursive] = !(options[:recursive] == false)
64
-
65
- resolve_dependent_resources(resource, [], options)
66
- end
67
-
68
- def id_params(action, options={})
69
- required = !(options[:required] == false)
70
-
71
- params = action.params.reject{ |p| !(p.name.end_with?("_id")) }
72
- params = params.reject{ |p| !(p.required?) } if required
73
- params
74
- end
75
-
76
- def param_to_resource(param_name)
77
- resource_name = param_name.gsub(/_id$/, "")
78
- resource_name = ApipieBindings::Inflector.pluralize(resource_name.to_s).to_sym
79
- begin
80
- @api.resource(resource_name)
81
- rescue NameError
82
- nil
83
- end
84
- end
85
100
 
86
101
  protected
87
102
 
88
- def resolve_dependent_resources(resource, resources_found, options)
89
- id_params(resource.action(:index), :required => options[:required]).each do |param|
90
- res = param_to_resource(param.name)
91
- if res and !resources_found.map(&:name).include?(res.name)
92
- resources_found << res
93
- resolve_dependent_resources(res, resources_found, options) if options[:recursive]
94
- end
95
- end
96
- resources_found
97
- end
98
-
99
103
  def define_id_finders
100
104
  @api.resources.each do |resource|
101
105
  method_name = "#{resource.singular_name}_id"
@@ -114,7 +118,7 @@ module HammerCLIForeman
114
118
  resource = @api.resource(resource_name)
115
119
 
116
120
  search_options = search_options(options, resource)
117
- id_params(resource.action(:index), :required => true).each do |param|
121
+ IdParamsFilter.new(:only_required => true).for_action(resource.action(:index)).each do |param|
118
122
  search_options[param.name] ||= send(param.name, scoped_options(param.name.gsub(/_id$/, ""), options))
119
123
  end
120
124
  resource.action(:index).routes.each do |route|
@@ -139,7 +143,12 @@ module HammerCLIForeman
139
143
  end
140
144
 
141
145
  def search_options(options, resource)
142
- search_options = create_search_options(options, resource)
146
+ method = "create_#{resource.name}_search_options"
147
+ search_options = if respond_to?(method)
148
+ send(method, options)
149
+ else
150
+ create_search_options(options, resource)
151
+ end
143
152
  raise MissingSeachOptions.new(_("Missing options to search %s") % resource.singular_name) if search_options.empty?
144
153
  search_options
145
154
  end
@@ -1,4 +1,3 @@
1
- require 'hammer_cli_foreman/compute_resource'
2
1
 
3
2
  module HammerCLIForeman
4
3
 
@@ -40,7 +40,9 @@ module HammerCLIForeman
40
40
  HammerCLIForeman::References.timestamps(self)
41
41
  end
42
42
 
43
- build_options
43
+ build_options do |o|
44
+ o.expand.primary(:organizations)
45
+ end
44
46
  end
45
47
 
46
48
 
@@ -74,7 +76,9 @@ module HammerCLIForeman
74
76
  success_message _("Location deleted")
75
77
  failure_message _("Could not delete the location")
76
78
 
77
- build_options
79
+ build_options do |o|
80
+ o.expand.primary(:organizations)
81
+ end
78
82
  end
79
83
 
80
84
  HammerCLIForeman::AssociatingCommands::Hostgroup.extend_command(self)
@@ -93,5 +97,5 @@ module HammerCLIForeman
93
97
 
94
98
  end
95
99
 
96
- HammerCLI::MainCommand.subcommand 'location', _("Manipulate locations."), HammerCLIForeman::Location
100
+
97
101
 
@@ -61,5 +61,5 @@ module HammerCLIForeman
61
61
 
62
62
  end
63
63
 
64
- HammerCLI::MainCommand.subcommand 'medium', _("Manipulate installation media."), HammerCLIForeman::Medium
64
+
65
65
 
@@ -55,5 +55,5 @@ module HammerCLIForeman
55
55
 
56
56
  end
57
57
 
58
- HammerCLI::MainCommand.subcommand 'model', _("Manipulate hardware models."), HammerCLIForeman::Model
58
+
59
59
 
@@ -56,7 +56,7 @@ module HammerCLIForeman
56
56
  failure_message _("Could not create the operating system")
57
57
 
58
58
  def request_params
59
- params = method_options
59
+ params = super
60
60
  params["operatingsystem"]["architecture_ids"] = option_architecture_ids if option_architecture_ids
61
61
  params["operatingsystem"]["config_template_ids"] = option_config_template_ids if option_config_template_ids
62
62
  params["operatingsystem"]["medium_ids"] = option_medium_ids if option_medium_ids
@@ -83,7 +83,7 @@ module HammerCLIForeman
83
83
  failure_message _("Could not update the operating system")
84
84
 
85
85
  def request_params
86
- params = method_options
86
+ params = super
87
87
  params["operatingsystem"]["architecture_ids"] = option_architecture_ids if option_architecture_ids
88
88
  params["operatingsystem"]["config_template_ids"] = option_config_template_ids if option_config_template_ids
89
89
  params["operatingsystem"]["medium_ids"] = option_medium_ids if option_medium_ids
@@ -146,7 +146,7 @@ module HammerCLIForeman
146
146
 
147
147
  def option_type_name
148
148
  tpl = HammerCLIForeman.collection_to_common_format(
149
- HammerCLIForeman.foreman_resource(:config_templates).call(:show, {"id" => option_config_template_id}))
149
+ HammerCLIForeman.foreman_resource!(:config_templates).call(:show, {"id" => option_config_template_id}))
150
150
  tpl[0]["template_kind_name"]
151
151
  end
152
152
 
@@ -214,7 +214,7 @@ module HammerCLIForeman
214
214
  tpl = templates.find { |p| p["template_kind_name"] == option_type }
215
215
 
216
216
  if tpl.nil?
217
- raise RuntimeError.new(_("Default template of type #{option_type} not found"))
217
+ raise RuntimeError.new(_("Default template of type %s not found") % option_type)
218
218
  end
219
219
 
220
220
  params = {
@@ -244,5 +244,3 @@ module HammerCLIForeman
244
244
 
245
245
  end
246
246
 
247
- HammerCLI::MainCommand.subcommand 'os', "Manipulate operating system.", HammerCLIForeman::OperatingSystem
248
-
@@ -0,0 +1,285 @@
1
+ module HammerCLIForeman
2
+
3
+ class BuildParams
4
+
5
+ class ExpansionParams
6
+
7
+ def initialize(params={})
8
+ @params = params || {}
9
+ end
10
+
11
+ def except(*resource_names)
12
+ @params[:except] = resource_names
13
+ self
14
+ end
15
+
16
+ def including(*resource_names)
17
+ @params[:including] = resource_names
18
+ self
19
+ end
20
+
21
+ def only(*resource_names)
22
+ @params[:only] = resource_names
23
+ self
24
+ end
25
+
26
+ def primary(resource_name)
27
+ @params[:primary] = resource_name
28
+ self
29
+ end
30
+
31
+ def to_hash
32
+ @params
33
+ end
34
+ end
35
+
36
+
37
+ def initialize(params={})
38
+ @params = params || {}
39
+ end
40
+
41
+ def without(*option_names)
42
+ @params[:without] = option_names
43
+ end
44
+
45
+ def expand(switch = :all)
46
+ @expansion ||= ExpansionParams.new(@params[:expand])
47
+ if (switch == :none)
48
+ @expansion.only()
49
+ end
50
+ @expansion
51
+ end
52
+
53
+ def to_hash
54
+ @params[:expand] = @expansion.to_hash if @expansion
55
+ @params
56
+ end
57
+
58
+ end
59
+
60
+ class BuilderConfigurator
61
+
62
+ def initialize(searchables, dependency_resolver)
63
+ @searchables = searchables
64
+ @dependency_resolver = dependency_resolver
65
+ end
66
+
67
+ def builders_for(resource, action)
68
+ builders = []
69
+
70
+ dependent_resources = []
71
+
72
+ if action.params.find{ |p| p.name == "id" }
73
+ builders << SearchablesOptionBuilder.new(resource, @searchables)
74
+ dependent_resources += @dependency_resolver.resource_dependencies(resource, :only_required => true, :recursive => true)
75
+ end
76
+
77
+ dependent_resources += @dependency_resolver.action_dependencies(action, :only_required => false, :recursive => false)
78
+ dependent_resources += @dependency_resolver.action_dependencies(action, :only_required => true, :recursive => true)
79
+
80
+ unique(dependent_resources).each do |dep_resource|
81
+ builders << DependentSearchablesOptionBuilder.new(dep_resource, @searchables)
82
+ end
83
+
84
+ builders
85
+ end
86
+
87
+ protected
88
+
89
+ def unique(resources)
90
+ # ruby 1.8 hack - it does not support passing blocks to Array#uniq
91
+ resources.inject({}) do |h, r|
92
+ h.update(r.name => r)
93
+ end.values
94
+ end
95
+
96
+ end
97
+
98
+ class ForemanOptionBuilder < HammerCLI::OptionBuilderContainer
99
+
100
+ def initialize(searchables)
101
+ @searchables = searchables
102
+ end
103
+
104
+ def build(builder_params={})
105
+ expansion_options = builder_params[:expand] || {}
106
+
107
+ allowed_resources = expansion_options[:only] || default_dependent_resources
108
+ allowed_resources -= expansion_options[:except] || []
109
+ allowed_resources += expansion_options[:including] || []
110
+ allowed_resources.uniq!
111
+
112
+ primary_resource = expansion_options[:primary]
113
+
114
+ to_remove = default_dependent_resources - allowed_resources
115
+ to_add = allowed_resources - default_dependent_resources
116
+
117
+ builders.reject! do |b|
118
+ b.class <= DependentSearchablesOptionBuilder && to_remove.include?(b.resource.name)
119
+ end
120
+ to_add.each do |resource_name|
121
+ builders << DependentSearchablesOptionBuilder.new(HammerCLIForeman.foreman_resource(resource_name), @searchables)
122
+ end
123
+
124
+ if !primary_resource.nil?
125
+ builders.reject! do |b|
126
+ b.class <= SearchablesOptionBuilder
127
+ end
128
+ builders << SearchablesOptionBuilder.new(HammerCLIForeman.foreman_resource(primary_resource), @searchables) if primary_resource != false
129
+ end
130
+
131
+ super
132
+ end
133
+
134
+ def default_dependent_resources
135
+ dependent_searchable_builders.map(&:resource).map(&:name)
136
+ end
137
+
138
+ def dependent_searchable_builders
139
+ self.builders.select{|b| b.class <= DependentSearchablesOptionBuilder }
140
+ end
141
+
142
+ end
143
+
144
+ class SearchablesAbstractOptionBuilder < HammerCLI::AbstractOptionBuilder
145
+
146
+ protected
147
+
148
+ def description(param_name, action_name)
149
+ return " " unless @resource.has_action? action_name
150
+
151
+ params = ParamsNameFilter.new(param_name).for_action(@resource.action(action_name))
152
+ if params.empty?
153
+ return " "
154
+ else
155
+ return params[0].description
156
+ end
157
+ end
158
+
159
+ end
160
+
161
+ class SearchablesOptionBuilder < SearchablesAbstractOptionBuilder
162
+
163
+ def initialize(resource, searchables)
164
+ @resource = resource
165
+ @searchables = searchables
166
+ end
167
+
168
+ attr_reader :resource
169
+
170
+ def build(builder_params={})
171
+ @searchables.for(@resource).collect do |s|
172
+ option(
173
+ optionamize("--#{s.name}"),
174
+ s.name.upcase,
175
+ s.description
176
+ )
177
+ end
178
+ end
179
+ end
180
+
181
+
182
+ class DependentSearchablesOptionBuilder < SearchablesAbstractOptionBuilder
183
+
184
+ def initialize(resource, searchables)
185
+ @resource = resource
186
+ @searchables = searchables
187
+ end
188
+
189
+ attr_reader :resource
190
+
191
+ def build(builder_params={})
192
+ resource_name_map = builder_params[:resource_mapping] || {}
193
+ dependent_options(@resource, resource_name_map)
194
+ end
195
+
196
+ protected
197
+
198
+ def dependent_options(resource, resource_name_map)
199
+ options = []
200
+ searchables = @searchables.for(resource)
201
+ resource_name = resource.singular_name
202
+ aliased_name = aliased(resource_name, resource_name_map)
203
+
204
+ unless searchables.empty?
205
+ first = searchables[0]
206
+ remaining = searchables[1..-1] || []
207
+
208
+ # First option is named by the resource
209
+ # Eg. --organization with accessor option_organization_name
210
+ options << option(
211
+ optionamize("--#{aliased_name}"),
212
+ "#{aliased_name}_#{first.name}".upcase,
213
+ first.description || " ",
214
+ :attribute_name => HammerCLI.option_accessor_name("#{resource_name}_#{first.name}")
215
+ )
216
+
217
+ # Other options are named by the resource plus the searchable name
218
+ # Eg. --organization-label with accessor option_organization_label
219
+ remaining.each do |s|
220
+ options << option(
221
+ optionamize("--#{aliased_name}-#{s.name}"),
222
+ "#{aliased_name}_#{s.name}".upcase,
223
+ s.description || " ",
224
+ :attribute_name => HammerCLI.option_accessor_name("#{resource_name}_#{s.name}")
225
+ )
226
+ end
227
+ end
228
+
229
+ options << option(
230
+ optionamize("--#{aliased_name}-id"),
231
+ "#{aliased_name}_id".upcase,
232
+ description("id", :show),
233
+ :attribute_name => HammerCLI.option_accessor_name("#{resource_name}_id")
234
+ )
235
+ options
236
+ end
237
+
238
+ def aliased(name, resource_name_map)
239
+ resource_name_map[name.to_s] || resource_name_map[name.to_sym] || name
240
+ end
241
+
242
+ end
243
+
244
+ class SearchablesUpdateOptionBuilder < SearchablesAbstractOptionBuilder
245
+
246
+ def initialize(resource, searchables)
247
+ @resource = resource
248
+ @searchables = searchables
249
+ end
250
+
251
+ attr_reader :resource
252
+
253
+ def build(builder_params={})
254
+
255
+ @searchables.for(@resource).collect do |s|
256
+ if s.editable?
257
+ option(
258
+ optionamize("--new-#{s.name}"),
259
+ "NEW_#{s.name.upcase}",
260
+ description(s.name, :update)
261
+ )
262
+ end
263
+ end.compact
264
+ end
265
+
266
+ end
267
+
268
+ # it adds id with description of the id param from resource's show action
269
+ class IdOptionBuilder < SearchablesAbstractOptionBuilder
270
+
271
+ def initialize(resource)
272
+ @resource = resource
273
+ end
274
+
275
+ attr_reader :resource
276
+
277
+ def build(builder_params={})
278
+ [
279
+ option("--id", "ID", description("id", :show))
280
+ ]
281
+ end
282
+
283
+ end
284
+
285
+ end