lib/specinfra/command_factory.rb in specinfra-2.21.1 vs lib/specinfra/command_factory.rb in specinfra-2.22.0
- old
+ new
@@ -1,77 +1,83 @@
class Specinfra::CommandFactory
- class << self
- @@types = nil
+ @@types = nil
- def get(meth, *args)
- action, resource_type, subaction = breakdown(meth)
- method = action
- method += "_#{subaction}" if subaction
- command_class = create_command_class(resource_type)
- if command_class.respond_to?(method)
- command_class.send(method, *args)
- else
- raise NotImplementedError.new("#{method} is not implemented in #{command_class}")
- end
- end
+ def self.instance
+ self.new(os)
+ end
- private
- def create_command_class(resource_type)
- family = os[:family]
- version = os[:release] ? "V#{os[:release].to_i}" : nil
+ def initialize(os_info)
+ @os_info = os_info
+ end
- common_class = Specinfra::Command
- base_class = common_class.const_get('Base')
- os_class = family.nil? ? base_class : common_class.const_get(family.capitalize)
+ def get(meth, *args)
+ action, resource_type, subaction = breakdown(meth)
+ method = action
+ method += "_#{subaction}" if subaction
+ command_class = create_command_class(resource_type)
+ if command_class.respond_to?(method)
+ command_class.send(method, *args)
+ else
+ raise NotImplementedError.new("#{method} is not implemented in #{command_class}")
+ end
+ end
- if family && version
- begin
- version_class = os_class.const_get(version)
- rescue
- version_class = os_class.const_get('Base')
- end
- elsif family.nil?
- version_class = os_class
- elsif family != 'base' && version.nil?
- version_class = os_class.const_get('Base')
- end
+ private
+ def create_command_class(resource_type)
+ family = @os_info[:family]
+ version = @os_info[:release] ? "V#{@os_info[:release].to_i}" : nil
+ common_class = Specinfra::Command
+ base_class = common_class.const_get('Base')
+ os_class = family.nil? ? base_class : common_class.const_get(family.capitalize)
+
+ if family && version
begin
- command_class = version_class.const_get(resource_type.to_camel_case)
+ version_class = os_class.const_get(version)
rescue
+ version_class = os_class.const_get('Base')
end
+ elsif family.nil?
+ version_class = os_class
+ elsif family != 'base' && version.nil?
+ version_class = os_class.const_get('Base')
+ end
- if command_class.nil? ||( (command_class < Specinfra::Command::Base).nil? && (command_class < Specinfra::Command::Windows::Base).nil? )
- command_class = base_class.const_get(resource_type.to_camel_case)
- end
+ begin
+ command_class = version_class.const_get(resource_type.to_camel_case)
+ rescue
+ end
- command_class.create
+ if command_class.nil? ||( (command_class < Specinfra::Command::Base).nil? && (command_class < Specinfra::Command::Windows::Base).nil? )
+ command_class = base_class.const_get(resource_type.to_camel_case)
end
- def breakdown(meth)
- # Somtimes `selinux_module' type matches `selinux' and error occurs.
- # Reverse sorting is needed to avoid this problem.
- types = resource_types.map {|t| t.to_snake_case }.sort.reverse.join('|')
- md = meth.to_s.match(/^([^_]+)_(#{types})_?(.+)?$/)
- if md.nil?
- message = "Could not break down `#{meth}' to appropriate type and method.\n"
- message += "The method name shoud be in the form of `action_type_subaction'."
- raise message
- end
- return md[1], md[2], md[3]
+ command_class.create
+ end
+
+ def breakdown(meth)
+ # Somtimes `selinux_module' type matches `selinux' and error occurs.
+ # Reverse sorting is needed to avoid this problem.
+ types = resource_types.map {|t| t.to_snake_case }.sort.reverse.join('|')
+ md = meth.to_s.match(/^([^_]+)_(#{types})_?(.+)?$/)
+ if md.nil?
+ message = "Could not break down `#{meth}' to appropriate type and method.\n"
+ message += "The method name shoud be in the form of `action_type_subaction'."
+ raise message
end
+ return md[1], md[2], md[3]
+ end
- def resource_types
- if @@types.nil?
- @@types = []
- Specinfra::Command::Base.subclasses.each do |s|
- @@types << s.to_s.split(':')[-1]
- end
- Specinfra::Command::Windows::Base.subclasses.each do |s|
- @@types << s.to_s.split(':')[-1]
- end
- @@types.uniq!
+ def resource_types
+ if @@types.nil?
+ @@types = []
+ Specinfra::Command::Base.subclasses.each do |s|
+ @@types << s.to_s.split(':')[-1]
end
- @@types
+ Specinfra::Command::Windows::Base.subclasses.each do |s|
+ @@types << s.to_s.split(':')[-1]
+ end
+ @@types.uniq!
end
+ @@types
end
end