class GemBasedRuleRepo

Public Instance Methods

discover_rules() click to toggle source
# File lib/cfn-nag/rule_repos/gem_based_rule_repo.rb, line 7
def discover_rules
  rule_registry = RuleRegistry.new

  rule_gem_names.each do |rule_gem_name|
    next unless load_gem_entrypoint(rule_gem_name)

    gem_path = Gem.loaded_specs[rule_gem_name].full_gem_path
    require_all_rb_files_in_gem gem_path, rule_gem_name
  end

  unless rule_gem_names.empty?
    ObjectSpace.each_object do |object|
      if derives_from_base_rule?(object) || (object.respond_to?(:cfn_nag_rule?) && object.cfn_nag_rule?)
        rule_registry.definition(object)
      end
    end
  end

  rule_registry
end

Private Instance Methods

derives_from_base_rule?(object) click to toggle source
# File lib/cfn-nag/rule_repos/gem_based_rule_repo.rb, line 60
def derives_from_base_rule?(object)
  object.respond_to?(:superclass) && object.superclass == CfnNag::BaseRule
end
load_gem_entrypoint(rule_gem_name) click to toggle source
# File lib/cfn-nag/rule_repos/gem_based_rule_repo.rb, line 52
def load_gem_entrypoint(rule_gem_name)
  require rule_gem_name
  true
rescue LoadError
  $stderr.puts "Could not require #{rule_gem_name} - does the rule gem have a top level entry point?"
  false
end
require_all_rb_files_in_gem(gem_path, rule_gem_name) click to toggle source
# File lib/cfn-nag/rule_repos/gem_based_rule_repo.rb, line 30
def require_all_rb_files_in_gem(gem_path, rule_gem_name)
  Dir.glob("#{gem_path}/lib/#{rule_gem_name}/**/*.rb").sort.each do |rule_file|
    require rule_file
  end
end
rule_gem_names() click to toggle source
# File lib/cfn-nag/rule_repos/gem_based_rule_repo.rb, line 36
def rule_gem_names
  rule_gem_specs.map(&:name)
end
rule_gem_specs() click to toggle source
# File lib/cfn-nag/rule_repos/gem_based_rule_repo.rb, line 40
def rule_gem_specs
  specs = []

  # https://github.com/rvm/rubygems-bundler can interfere here
  # if you happen to have a gemspec in the current working directory?
  # Bundle.setup runs and replaces a SpecSet in here instead of collection of Specification?
  Gem::Specification.each do |spec|
    specs << spec if spec.metadata && spec.metadata['cfn_nag_rules'] == 'true'
  end
  specs
end