puppet-retrospec 0.10.0 → 0.11.0
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.
- checksums.yaml +4 -4
- data/Gemfile +2 -1
- data/Gemfile.lock +5 -3
- data/README.md +2 -0
- data/VERSION +1 -1
- data/lib/retrospec-puppet.rb +1 -0
- data/lib/retrospec/plugins/v1/plugin/generators/fact_generator.rb +93 -0
- data/lib/retrospec/plugins/v1/plugin/generators/facter.rb +116 -0
- data/lib/retrospec/plugins/v1/plugin/generators/module_generator.rb +114 -0
- data/lib/retrospec/plugins/v1/plugin/puppet.rb +26 -57
- data/lib/retrospec/plugins/v1/plugin/spec_object.rb +51 -46
- data/lib/retrospec/plugins/v1/plugin/version.rb +1 -1
- data/puppet-retrospec.gemspec +16 -5
- data/spec/fixtures/facts/datacenter_facts.rb +15 -0
- data/spec/fixtures/facts/facts_with_methods.rb +19 -0
- data/spec/fixtures/facts/node_role.rb +8 -0
- data/spec/spec_helper.rb +4 -0
- data/spec/unit/conditional_spec.rb +0 -3
- data/spec/unit/generators/fact_generater_spec.rb +53 -0
- data/spec/unit/generators/fact_spec.rb +58 -0
- data/spec/unit/puppet-retrospec_spec.rb +5 -2
- metadata +26 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4a46b9123ebdcbabc88aea95e6d9bf8bc4d8186e
|
4
|
+
data.tar.gz: d051e9b7a2e86b5a6260382b5ce41517a058d7d6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ea9f08b9433abd1b92cbcc4ebef5e161acba887b78dc9048b442f308d4f210bf02a11936b3593edd55f94d0c4acc19b403a9e8b6f07f790dcdf911552db2684a
|
7
|
+
data.tar.gz: d55f442ff7e53df1b2736ea9fc493da6b1fdaca921f151402a0548b95327e2bb86e875772d04a9b325b3a90402912f7fd395f28130697f0a59b75e11bc09d8c1
|
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -11,6 +11,7 @@ GEM
|
|
11
11
|
specs:
|
12
12
|
CFPropertyList (2.2.8)
|
13
13
|
addressable (2.3.8)
|
14
|
+
awesome_print (1.6.1)
|
14
15
|
builder (3.2.2)
|
15
16
|
coderay (1.1.0)
|
16
17
|
descendants_tracker (0.0.4)
|
@@ -19,7 +20,7 @@ GEM
|
|
19
20
|
facter (2.4.4)
|
20
21
|
CFPropertyList (~> 2.2.6)
|
21
22
|
fakefs (0.6.7)
|
22
|
-
faraday (0.9.
|
23
|
+
faraday (0.9.2)
|
23
24
|
multipart-post (>= 1.2, < 3)
|
24
25
|
git (1.2.9.1)
|
25
26
|
github_api (0.12.4)
|
@@ -33,7 +34,7 @@ GEM
|
|
33
34
|
hashie (3.4.2)
|
34
35
|
hiera (1.3.4)
|
35
36
|
json_pure
|
36
|
-
highline (1.7.
|
37
|
+
highline (1.7.8)
|
37
38
|
jeweler (2.0.1)
|
38
39
|
builder
|
39
40
|
bundler (>= 1.0)
|
@@ -91,13 +92,14 @@ PLATFORMS
|
|
91
92
|
ruby
|
92
93
|
|
93
94
|
DEPENDENCIES
|
95
|
+
awesome_print
|
94
96
|
bundler (~> 1.0)
|
95
97
|
fakefs
|
96
98
|
jeweler
|
97
99
|
pry
|
98
100
|
puppet (= 3.7.3)!
|
99
101
|
rdoc (~> 3.12)
|
100
|
-
retrospec (~> 0.4
|
102
|
+
retrospec (~> 0.4)
|
101
103
|
rspec (~> 3.2)
|
102
104
|
trollop
|
103
105
|
yard (~> 0.7)
|
data/README.md
CHANGED
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.11.0
|
data/lib/retrospec-puppet.rb
CHANGED
@@ -0,0 +1,93 @@
|
|
1
|
+
require_relative 'facter'
|
2
|
+
|
3
|
+
module Retrospec
|
4
|
+
module Puppet
|
5
|
+
module Generators
|
6
|
+
class FactGenerator < Retrospec::Plugins::V1::Plugin
|
7
|
+
|
8
|
+
attr_reader :template_dir, :context, :module_path, :fact_name, :config_data
|
9
|
+
|
10
|
+
# retrospec will initilalize this class so its up to you
|
11
|
+
# to set any additional variables you need to get the job done.
|
12
|
+
def initialize(module_path, spec_object={})
|
13
|
+
# below is the Spec Object which serves as a context for template rendering
|
14
|
+
# you will need to initialize this object, so the erb templates can get the binding
|
15
|
+
# the SpecObject can be customized to your liking as its different for every plugin gem.
|
16
|
+
@module_path = module_path
|
17
|
+
@config_data = spec_object
|
18
|
+
@context = OpenStruct.new(:fact_name => spec_object[:name])
|
19
|
+
end
|
20
|
+
|
21
|
+
# used to display subcommand options to the cli
|
22
|
+
# the global options are passed in for your usage
|
23
|
+
# http://trollop.rubyforge.org
|
24
|
+
# all options here are available in the config passed into config object
|
25
|
+
def self.run_cli(global_opts)
|
26
|
+
sub_command_opts = Trollop::options do
|
27
|
+
banner <<-EOS
|
28
|
+
Generates a new fact with the given name
|
29
|
+
|
30
|
+
EOS
|
31
|
+
opt :name, "The name of the fact you wish to create", :type => :string, :require => :true, :short => '-n'
|
32
|
+
end
|
33
|
+
unless sub_command_opts[:name]
|
34
|
+
Trollop.educate
|
35
|
+
exit 1
|
36
|
+
end
|
37
|
+
plugin_data = global_opts.merge(sub_command_opts)
|
38
|
+
Retrospec::Puppet::Generators::FactGenerator.new(plugin_data[:module_path], plugin_data)
|
39
|
+
end
|
40
|
+
|
41
|
+
def fact_name
|
42
|
+
context[:fact_name]
|
43
|
+
end
|
44
|
+
|
45
|
+
def facter_dir
|
46
|
+
@facter_dir ||= File.join(module_path, 'lib', 'facter')
|
47
|
+
end
|
48
|
+
|
49
|
+
def facter_spec_dir
|
50
|
+
@facter_spec_dir ||= File.join(module_path, 'spec', 'unit', 'facter')
|
51
|
+
end
|
52
|
+
|
53
|
+
def fact_name_path
|
54
|
+
File.join(facter_dir, "#{fact_name}.rb")
|
55
|
+
end
|
56
|
+
|
57
|
+
# generates a fact file with the given name based on the template in the templates directory
|
58
|
+
def generate_fact_file
|
59
|
+
safe_create_template_file(fact_name_path, File.join(template_dir, 'fact.rb.retrospec.erb'), context)
|
60
|
+
generate_fact_spec_files
|
61
|
+
end
|
62
|
+
|
63
|
+
# generates spec files for each fact defined in the fact file
|
64
|
+
def generate_fact_spec_files
|
65
|
+
fact_files = Dir.glob(File.join(facter_dir, '*.rb')).sort
|
66
|
+
fact_files.each do | fact_file|
|
67
|
+
fact_file_data = Retrospec::Puppet::Generators::Facter.load_fact(fact_file)
|
68
|
+
fact_file_data.facts.each do |name, fact_data|
|
69
|
+
# because many facts can be in a single file we want to create a unique file for each fact
|
70
|
+
fact_spec_path = File.join(facter_spec_dir, "#{name}_spec.rb")
|
71
|
+
safe_create_template_file(fact_spec_path, File.join(template_dir, 'fact_spec.rb.retrospec.erb'), fact_data)
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
# the template directory located inside the your retrospec plugin gem
|
77
|
+
# you should not have to modify this unless you move the templates directory
|
78
|
+
# for now we are going to choose the correct template directory that contains the templates
|
79
|
+
def template_dir
|
80
|
+
unless @template_dir
|
81
|
+
external_templates = File.expand_path(File.join(config_data[:template_dir], 'facts', 'fact.rb.retrospec.erb'))
|
82
|
+
if File.exists?(external_templates)
|
83
|
+
@template_dir = File.join(config_data[:template_dir], 'facts')
|
84
|
+
else
|
85
|
+
@template_dir = File.expand_path(File.join(File.dirname(File.dirname(__FILE__)), 'templates', 'facts'))
|
86
|
+
end
|
87
|
+
end
|
88
|
+
@template_dir
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
@@ -0,0 +1,116 @@
|
|
1
|
+
require 'ostruct'
|
2
|
+
|
3
|
+
# this is required to use when processing erb templates
|
4
|
+
class OpenStruct
|
5
|
+
def get_binding
|
6
|
+
binding()
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
module Retrospec
|
11
|
+
module Puppet
|
12
|
+
module Generators
|
13
|
+
class Facter
|
14
|
+
# anytime a fact uses a facter lib we need to "mock" the fuction and record the value
|
15
|
+
class Core
|
16
|
+
class Execution
|
17
|
+
def self.execute(command, options={})
|
18
|
+
value = {:klass => self.to_s.gsub('Retrospec::Puppet::Generators::', ''),
|
19
|
+
:method => :execute, :value => command}
|
20
|
+
Retrospec::Puppet::Generators::Facter.exec_calls[command] = value
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
@model = OpenStruct.new(:facts => {})
|
26
|
+
@used_facts = {}
|
27
|
+
@confines = []
|
28
|
+
@methods_defined = []
|
29
|
+
|
30
|
+
def initialize(name, options, &block)
|
31
|
+
@fact_name = name
|
32
|
+
#block.call
|
33
|
+
end
|
34
|
+
|
35
|
+
def self.exec_calls
|
36
|
+
@exec_calls ||= {}
|
37
|
+
end
|
38
|
+
|
39
|
+
def self.used_facts
|
40
|
+
@used_facts ||= {}
|
41
|
+
end
|
42
|
+
|
43
|
+
def self.value(name)
|
44
|
+
used_facts[name] = {:name => name}
|
45
|
+
end
|
46
|
+
|
47
|
+
def self.fact(name)
|
48
|
+
fake_fact = OpenStruct.new(:value => '')
|
49
|
+
used_facts[name] = {:name => name}
|
50
|
+
fake_fact
|
51
|
+
end
|
52
|
+
|
53
|
+
def self.method_missing(method_sym, *arguments, &block)
|
54
|
+
@methods_defined << method_sym
|
55
|
+
end
|
56
|
+
|
57
|
+
def self.setcode(&block)
|
58
|
+
begin
|
59
|
+
block.call
|
60
|
+
rescue NameError => e
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
def self.confine(fact, *values)
|
65
|
+
@confines << fact
|
66
|
+
end
|
67
|
+
|
68
|
+
# loads the fact into the loader for evaluation
|
69
|
+
# and data collection
|
70
|
+
def self.load_fact(file)
|
71
|
+
@model = OpenStruct.new(:facts => {})
|
72
|
+
@used_facts = {}
|
73
|
+
@model = eval(File.read(file))
|
74
|
+
transform_data(@model)
|
75
|
+
end
|
76
|
+
|
77
|
+
# every fact will have a Facter.add functionality
|
78
|
+
# this is the startign point to collect all data
|
79
|
+
def self.add(name, options={}, &block)
|
80
|
+
@model.facts[name] = OpenStruct.new(:fact_name => name)
|
81
|
+
# calls the facter.add block
|
82
|
+
# this may call separate confine statements
|
83
|
+
@model.global_used_facts = used_facts
|
84
|
+
@used_facts = {} # clear before fact specific are evaluated
|
85
|
+
@model.global_used_execs = exec_calls
|
86
|
+
@exec_calls = {}
|
87
|
+
begin
|
88
|
+
block.call
|
89
|
+
rescue NameError => e
|
90
|
+
end
|
91
|
+
@model.facts[name].used_facts = used_facts
|
92
|
+
@model.facts[name].confines = @confines
|
93
|
+
# clear any persistant data
|
94
|
+
@confines = []
|
95
|
+
@model.defined_methods = @methods_defined
|
96
|
+
@model.facts[name].exec_calls = exec_calls
|
97
|
+
@model
|
98
|
+
end
|
99
|
+
|
100
|
+
def self.transform_data(data)
|
101
|
+
#ObenStruct.new(:)
|
102
|
+
# {:method_fact=>
|
103
|
+
# {:fact_name=>:method_fact,
|
104
|
+
# :used_facts=>{:is_virtual=>{:name=>:is_virtual}},
|
105
|
+
# :confines=>[{:kernel=>"Linux"}],
|
106
|
+
# :exec_calls=>["which lsb"]},
|
107
|
+
# :global_used_facts=>{},
|
108
|
+
# :global_used_execs=>[],
|
109
|
+
# :defined_methods=>[:default_kernel]}
|
110
|
+
data
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
@@ -0,0 +1,114 @@
|
|
1
|
+
require 'retrospec/plugins/v1/module_helpers'
|
2
|
+
require 'retrospec/plugins/v1'
|
3
|
+
|
4
|
+
module Retrospec
|
5
|
+
module Puppet
|
6
|
+
module Generators
|
7
|
+
class ModuleGenerator < Retrospec::Plugins::V1::Plugin
|
8
|
+
|
9
|
+
attr_reader :template_dir, :context, :module_path, :fact_name, :config_data
|
10
|
+
|
11
|
+
# retrospec will initilalize this class so its up to you
|
12
|
+
# to set any additional variables you need to get the job done.
|
13
|
+
def initialize(module_path, spec_object={})
|
14
|
+
super
|
15
|
+
# below is the Spec Object which serves as a context for template rendering
|
16
|
+
# you will need to initialize this object, so the erb templates can get the binding
|
17
|
+
# the SpecObject can be customized to your liking as its different for every plugin gem.
|
18
|
+
@template_dir = spec_object[:template_dir]
|
19
|
+
@context = OpenStruct.new(:module_name => spec_object[:name])
|
20
|
+
end
|
21
|
+
|
22
|
+
# used to display subcommand options to the cli
|
23
|
+
# the global options are passed in for your usage
|
24
|
+
# http://trollop.rubyforge.org
|
25
|
+
# all options here are available in the config passed into config object
|
26
|
+
# returns a new instance of this class
|
27
|
+
def self.run_cli(global_opts)
|
28
|
+
namespace = global_opts['plugins::puppet::namespace'] || 'namespace'
|
29
|
+
author = global_opts['plugins::puppet::author'] || 'author_name'
|
30
|
+
sub_command_opts = Trollop::options do
|
31
|
+
banner <<-EOS
|
32
|
+
Generates a new module with the given name and namespace
|
33
|
+
|
34
|
+
EOS
|
35
|
+
opt :name, "The name of the module you wish to create", :type => :string, :required => false, :short => '-n',
|
36
|
+
:default => File.basename(global_opts[:module_path])
|
37
|
+
opt :namespace, "The namespace to use only when creating a new module", :default => namespace, :required => false,
|
38
|
+
:type => :string
|
39
|
+
opt :author, "The full name of the module author", :default => author, :required => false, :short => '-a',
|
40
|
+
:type => :string
|
41
|
+
end
|
42
|
+
unless sub_command_opts[:name]
|
43
|
+
Trollop.educate
|
44
|
+
exit 1
|
45
|
+
end
|
46
|
+
plugin_data = global_opts.merge(sub_command_opts)
|
47
|
+
Retrospec::Puppet::Generators::ModuleGenerator.new(plugin_data[:module_path], plugin_data)
|
48
|
+
end
|
49
|
+
|
50
|
+
def run(manifest_dir)
|
51
|
+
unless File.exist?(manifest_dir)
|
52
|
+
init_class = File.join(manifest_dir, 'init.pp')
|
53
|
+
content = File.read(File.join(template_dir, 'manifest_file.pp'))
|
54
|
+
unless ENV['RETROSPEC_PUPPET_AUTO_GENERATE'] == 'true'
|
55
|
+
print "The module located at: #{module_path} does not exist, do you wish to create it? (y/n): "
|
56
|
+
answer = gets.chomp
|
57
|
+
unless answer =~ /y/i
|
58
|
+
exit 1
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
create_manifest_file(init_class, content)
|
63
|
+
generate_metadata_file(config_data[:name], config_data)
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
def create_manifest_file(dest, content)
|
68
|
+
# replace the name in the target file with the module_name from this class
|
69
|
+
# I would have just used a template but the context does not exist yet
|
70
|
+
new_content = content.gsub('CLASS_NAME', config_data[:name])
|
71
|
+
safe_create_file(dest, new_content)
|
72
|
+
end
|
73
|
+
|
74
|
+
def self.generate_metadata_file(mod_name, config_data)
|
75
|
+
f = Retrospec::Puppet::Generators::ModuleGenerator.new(config_data[:module_path], config_data)
|
76
|
+
f.generate_metadata_file(mod_name, config_data)
|
77
|
+
end
|
78
|
+
|
79
|
+
# generates the metadata file in the module directory
|
80
|
+
def generate_metadata_file(mod_name,config_data)
|
81
|
+
require 'puppet/module_tool/metadata'
|
82
|
+
# make sure the metadata file exists
|
83
|
+
module_path = config_data[:module_path]
|
84
|
+
author = config_data[:author] || config_data['plugins::puppet::author'] || 'your_name'
|
85
|
+
namespace = config_data[:namespace] || config_data['plugins::puppet::namespace'] || 'namespace'
|
86
|
+
metadata_file = File.join(module_path, 'metadata.json')
|
87
|
+
unless File.exists?(metadata_file)
|
88
|
+
# by default the module tool metadata checks for a namespece
|
89
|
+
if ! mod_name.include?('-')
|
90
|
+
name = "#{namespace}-#{mod_name}"
|
91
|
+
else
|
92
|
+
name = mod_name
|
93
|
+
end
|
94
|
+
begin
|
95
|
+
metadata = ::Puppet::ModuleTool::Metadata.new.update(
|
96
|
+
'name' => name.downcase,
|
97
|
+
'version' => '0.1.0',
|
98
|
+
'author' => author,
|
99
|
+
'dependencies' => [
|
100
|
+
{ 'name' => 'puppetlabs-stdlib', 'version_requirement' => '>= 4.9.0' }
|
101
|
+
]
|
102
|
+
)
|
103
|
+
rescue ArgumentError => e
|
104
|
+
puts e.message
|
105
|
+
exit -1
|
106
|
+
end
|
107
|
+
safe_create_file(metadata_file, metadata.to_json)
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
@@ -1,6 +1,8 @@
|
|
1
1
|
require 'retrospec/plugins/v1/module_helpers'
|
2
2
|
require 'retrospec/plugins/v1'
|
3
3
|
require 'retrospec/config'
|
4
|
+
require_relative 'generators/fact_generator'
|
5
|
+
require_relative 'generators/module_generator'
|
4
6
|
require_relative 'spec_object'
|
5
7
|
require 'erb'
|
6
8
|
require_relative 'template_helpers'
|
@@ -35,7 +37,7 @@ module Retrospec
|
|
35
37
|
Utilities::PuppetModule.instance.module_path = module_path
|
36
38
|
Utilities::PuppetModule.create_tmp_module_path # this is required to finish initialization
|
37
39
|
# setting the context is require to make other methods below work. #TODO lazy create the context
|
38
|
-
@context = ::Puppet::SpecObject.new(module_path, Utilities::PuppetModule.instance, config_data)
|
40
|
+
@context = ::Retrospec::Puppet::SpecObject.new(module_path, Utilities::PuppetModule.instance, config_data)
|
39
41
|
end
|
40
42
|
|
41
43
|
# if the module does not exist lets create it
|
@@ -44,17 +46,9 @@ module Retrospec
|
|
44
46
|
# anything since it is not mandatory
|
45
47
|
# I thought about using the the module face to perform this generation but it seems like its not
|
46
48
|
# supported at this time, and you can't specify the path to generate the module in
|
47
|
-
def new_module
|
48
|
-
|
49
|
-
|
50
|
-
content = File.read(File.join(template_dir, 'manifest_file.pp'))
|
51
|
-
print "The module located at: #{module_path} does not exist, do you wish to create it? (y/n): "
|
52
|
-
answer = gets.chomp
|
53
|
-
unless answer =~ /y/i
|
54
|
-
exit 1
|
55
|
-
end
|
56
|
-
create_manifest_file(init_class, content)
|
57
|
-
end
|
49
|
+
def new_module(plugin_data)
|
50
|
+
f = Retrospec::Puppet::Generators::ModuleGenerator.run_cli(plugin_data)
|
51
|
+
f.run(manifest_dir)
|
58
52
|
end
|
59
53
|
|
60
54
|
# used to display subcommand options to tglobal_confighe cli
|
@@ -68,16 +62,15 @@ module Retrospec
|
|
68
62
|
scm_branch = ENV['RETROSPEC_PUPPET_SCM_BRANCH'] || plugin_config['plugins::puppet::templates::ref'] || 'master'
|
69
63
|
future_parser = plugin_config['plugins::puppet::enable_future_parser'] || false
|
70
64
|
beaker_tests = plugin_config['plugins::puppet::enable_beaker_tests'] || false
|
71
|
-
namespace = plugin_config['plugins::puppet::namespace'] || 'namespace'
|
72
65
|
# a list of subcommands for this plugin
|
73
|
-
sub_commands = [
|
66
|
+
sub_commands = ['new_module', 'new_fact']
|
74
67
|
if sub_commands.count > 0
|
75
68
|
sub_command_help = "Subcommands:\n#{sub_commands.join("\n")}\n"
|
76
69
|
else
|
77
70
|
sub_command_help = ""
|
78
71
|
end
|
79
72
|
plugin_opts = Trollop::options do
|
80
|
-
version "#{Retrospec::Puppet::VERSION} (c) Corey Osman"
|
73
|
+
version "Retrospec puppet plugin: #{Retrospec::Puppet::VERSION} (c) Corey Osman"
|
81
74
|
banner <<-EOS
|
82
75
|
Generates puppet rspec test code based on the classes and defines inside the manifests directory.\n
|
83
76
|
#{sub_command_help}
|
@@ -87,12 +80,8 @@ Generates puppet rspec test code based on the classes and defines inside the man
|
|
87
80
|
:required => false, :default => template_dir
|
88
81
|
opt :scm_url, "SCM url for retrospec templates", :type => :string, :required => false,
|
89
82
|
:default => scm_url
|
90
|
-
opt :name, "The name of the module you wish to create", :type => :string, :require => :false, :short => '-n',
|
91
|
-
:default => File.basename(global_opts[:module_path])
|
92
83
|
opt :branch, "Branch you want to use for the retrospec template repo", :type => :string, :required => false,
|
93
84
|
:default => scm_branch
|
94
|
-
opt :namespace, "The namespace to use only when creating a new module", :default => namespace, :required => false,
|
95
|
-
:type => :string
|
96
85
|
opt :enable_beaker_tests, "Enable the creation of beaker tests", :require => false, :type => :boolean, :default => beaker_tests
|
97
86
|
opt :enable_future_parser, "Enables the future parser only during validation", :default => future_parser, :require => false, :type => :boolean
|
98
87
|
stop_on sub_commands
|
@@ -107,13 +96,15 @@ Generates puppet rspec test code based on the classes and defines inside the man
|
|
107
96
|
if plugin.respond_to?(sub_command)
|
108
97
|
case sub_command
|
109
98
|
when :new_module
|
110
|
-
plugin.send(sub_command)
|
99
|
+
plugin.send(sub_command, plugin_data)
|
111
100
|
plugin.post_init # finish initialization
|
112
101
|
when :run
|
113
102
|
plugin.post_init # finish initialization
|
103
|
+
when :new_fact
|
104
|
+
plugin.new_fact(plugin_data)
|
114
105
|
else
|
115
106
|
plugin.post_init # finish initialization
|
116
|
-
plugin.send(sub_command)
|
107
|
+
plugin.send(sub_command, plugin_data[:module_path], plugin_data)
|
117
108
|
end
|
118
109
|
plugin.send(:run)
|
119
110
|
else
|
@@ -122,6 +113,18 @@ Generates puppet rspec test code based on the classes and defines inside the man
|
|
122
113
|
end
|
123
114
|
end
|
124
115
|
|
116
|
+
def new_fact(plugin_data)
|
117
|
+
f = Retrospec::Puppet::Generators::FactGenerator.run_cli(plugin_data)
|
118
|
+
post_init # finish initialization
|
119
|
+
f.generate_fact_file
|
120
|
+
end
|
121
|
+
|
122
|
+
# generates the fact spec files
|
123
|
+
def fact(module_path, config)
|
124
|
+
f = Retrospec::Puppet::Generators::FactGenerator.new(module_path, config)
|
125
|
+
f.generate_fact_spec_files
|
126
|
+
end
|
127
|
+
|
125
128
|
# this is the main method the starts all the magic
|
126
129
|
def run
|
127
130
|
run_pre_hook
|
@@ -168,7 +171,8 @@ Generates puppet rspec test code based on the classes and defines inside the man
|
|
168
171
|
def create_files
|
169
172
|
types = context.types
|
170
173
|
safe_create_module_files
|
171
|
-
|
174
|
+
fact(module_path, config_data)
|
175
|
+
Retrospec::Puppet::Generators::ModuleGenerator.generate_metadata_file(context.module_name, config_data)
|
172
176
|
# a Type is nothing more than a defined type or puppet class
|
173
177
|
# we could have named this manifest but there could be multiple types
|
174
178
|
# in a manifest.
|
@@ -303,41 +307,6 @@ Generates puppet rspec test code based on the classes and defines inside the man
|
|
303
307
|
'.pp'
|
304
308
|
end
|
305
309
|
|
306
|
-
def create_manifest_file(dest, content)
|
307
|
-
# replace the name in the target file with the module_name from this class
|
308
|
-
# I would have just used a template but the context does not exist yet
|
309
|
-
new_content = content.gsub('CLASS_NAME', config_data[:name])
|
310
|
-
safe_create_file(dest, new_content)
|
311
|
-
end
|
312
|
-
|
313
|
-
# generates the metadata file in the module directory
|
314
|
-
def generate_metadata_file
|
315
|
-
require 'puppet/module_tool/metadata'
|
316
|
-
# make sure the metadata file exists
|
317
|
-
metadata_file = File.join(module_path, 'metadata.json')
|
318
|
-
unless File.exists?(metadata_file)
|
319
|
-
# by default the module tool metadata checks for a namespece
|
320
|
-
if ! config_data[:name].include?('-')
|
321
|
-
name = "#{config_data[:namespace]}-#{config_data[:name]}"
|
322
|
-
else
|
323
|
-
name = config_data[:name]
|
324
|
-
end
|
325
|
-
begin
|
326
|
-
metadata = ::Puppet::ModuleTool::Metadata.new.update(
|
327
|
-
'name' => name,
|
328
|
-
'version' => '0.1.0',
|
329
|
-
'author' => (config_data['plugins::puppet::author'] || nil ),
|
330
|
-
'dependencies' => [
|
331
|
-
{ 'name' => 'puppetlabs-stdlib', 'version_requirement' => '>= 1.0.0' }
|
332
|
-
]
|
333
|
-
)
|
334
|
-
rescue ArgumentError => e
|
335
|
-
puts e.message
|
336
|
-
exit -1
|
337
|
-
end
|
338
|
-
safe_create_file(metadata_file, metadata.to_json)
|
339
|
-
end
|
340
|
-
end
|
341
310
|
end
|
342
311
|
end
|
343
312
|
end
|
@@ -1,65 +1,70 @@
|
|
1
1
|
require 'retrospec/plugins/v1/context_object'
|
2
|
+
module Retrospec
|
3
|
+
module Puppet
|
4
|
+
# this object is passed to the templates for erb template rendering
|
5
|
+
# you can use data contained in this object in your templates
|
6
|
+
class SpecObject < Retrospec::Plugins::V1::ContextObject
|
2
7
|
|
3
|
-
|
4
|
-
|
5
|
-
# you can use data contained in this object in your templates
|
6
|
-
class SpecObject < Retrospec::Plugins::V1::ContextObject
|
8
|
+
attr_reader :instance, :module_path, :module_name, :all_hiera_data, :config
|
9
|
+
attr_accessor :enable_beaker_tests, :parameters, :types, :resources, :type
|
7
10
|
|
8
|
-
attr_reader :instance, :module_path, :module_name, :all_hiera_data, :config
|
9
|
-
attr_accessor :enable_beaker_tests, :parameters, :types, :resources, :type
|
10
11
|
|
12
|
+
def initialize(mod_path, instance_data, config_data)
|
13
|
+
@instance = instance_data
|
14
|
+
@config = config_data
|
15
|
+
@module_path = mod_path
|
16
|
+
all_hiera_data
|
17
|
+
end
|
11
18
|
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
@module_path = mod_path
|
16
|
-
all_hiera_data
|
17
|
-
end
|
18
|
-
|
19
|
-
def module_name
|
20
|
-
instance.module_name
|
21
|
-
end
|
22
|
-
|
23
|
-
def types
|
24
|
-
instance.types
|
25
|
-
end
|
19
|
+
def module_name
|
20
|
+
instance.module_name
|
21
|
+
end
|
26
22
|
|
27
|
-
|
28
|
-
|
29
|
-
types.each do |t|
|
30
|
-
next unless t.type == :hostclass #defines don't have hiera lookup values
|
31
|
-
next unless t.name == classname
|
32
|
-
t.arguments.each do |k, v|
|
33
|
-
key = "#{t.name}::#{k}"
|
34
|
-
data[key] = nil
|
35
|
-
end
|
23
|
+
def types
|
24
|
+
instance.types
|
36
25
|
end
|
37
|
-
data
|
38
|
-
end
|
39
26
|
|
40
|
-
|
41
|
-
|
42
|
-
if @all_hiera_data.nil?
|
43
|
-
@all_hiera_data = {}
|
27
|
+
def class_hiera_data(classname)
|
28
|
+
data = {}
|
44
29
|
types.each do |t|
|
45
30
|
next unless t.type == :hostclass #defines don't have hiera lookup values
|
31
|
+
next unless t.name == classname
|
46
32
|
t.arguments.each do |k, v|
|
47
33
|
key = "#{t.name}::#{k}"
|
48
|
-
|
34
|
+
data[key] = nil
|
49
35
|
end
|
50
36
|
end
|
37
|
+
data
|
51
38
|
end
|
52
|
-
@all_hiera_data
|
53
|
-
end
|
54
39
|
|
55
|
-
|
56
|
-
|
57
|
-
|
40
|
+
# gathers all the class parameters that could be used in hiera data mocking
|
41
|
+
def all_hiera_data
|
42
|
+
if @all_hiera_data.nil?
|
43
|
+
@all_hiera_data = {}
|
44
|
+
types.each do |t|
|
45
|
+
next unless t.type == :hostclass #defines don't have hiera lookup values
|
46
|
+
t.arguments.each do |k, v|
|
47
|
+
key = "#{t.name}::#{k}"
|
48
|
+
@all_hiera_data[key] = nil
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
@all_hiera_data
|
53
|
+
end
|
58
54
|
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
end
|
55
|
+
def enable_beaker_tests?
|
56
|
+
config[:enable_beaker_tests]
|
57
|
+
end
|
63
58
|
|
59
|
+
# allows the user to use the variable store to resolve the variable if it exists
|
60
|
+
def variable_value(key)
|
61
|
+
VariableStore.resolve(key)
|
62
|
+
end
|
63
|
+
|
64
|
+
def fact_name
|
65
|
+
instance[:name]
|
66
|
+
end
|
67
|
+
|
68
|
+
end
|
64
69
|
end
|
65
|
-
end
|
70
|
+
end
|
data/puppet-retrospec.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = "puppet-retrospec"
|
8
|
-
s.version = "0.
|
8
|
+
s.version = "0.11.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Corey Osman"]
|
12
|
-
s.date = "2015-10-
|
12
|
+
s.date = "2015-10-26"
|
13
13
|
s.description = "Retrofits and generates valid puppet rspec test code to existing modules"
|
14
14
|
s.email = "corey@logicminds.biz"
|
15
15
|
s.extra_rdoc_files = [
|
@@ -29,6 +29,9 @@ Gem::Specification.new do |s|
|
|
29
29
|
"VERSION",
|
30
30
|
"lib/retrospec-puppet.rb",
|
31
31
|
"lib/retrospec/plugins/v1/plugin/conditional.rb",
|
32
|
+
"lib/retrospec/plugins/v1/plugin/generators/fact_generator.rb",
|
33
|
+
"lib/retrospec/plugins/v1/plugin/generators/facter.rb",
|
34
|
+
"lib/retrospec/plugins/v1/plugin/generators/module_generator.rb",
|
32
35
|
"lib/retrospec/plugins/v1/plugin/helpers.rb",
|
33
36
|
"lib/retrospec/plugins/v1/plugin/puppet.rb",
|
34
37
|
"lib/retrospec/plugins/v1/plugin/puppet_module.rb",
|
@@ -40,6 +43,9 @@ Gem::Specification.new do |s|
|
|
40
43
|
"lib/retrospec/plugins/v1/plugin/variable_store.rb",
|
41
44
|
"lib/retrospec/plugins/v1/plugin/version.rb",
|
42
45
|
"puppet-retrospec.gemspec",
|
46
|
+
"spec/fixtures/facts/datacenter_facts.rb",
|
47
|
+
"spec/fixtures/facts/facts_with_methods.rb",
|
48
|
+
"spec/fixtures/facts/node_role.rb",
|
43
49
|
"spec/fixtures/fixture_modules/one_resource_module/manifests/another_resource.pp",
|
44
50
|
"spec/fixtures/fixture_modules/one_resource_module/manifests/inherits_params.pp",
|
45
51
|
"spec/fixtures/fixture_modules/one_resource_module/manifests/one_resource_class.pp",
|
@@ -559,6 +565,8 @@ Gem::Specification.new do |s|
|
|
559
565
|
"spec/integration/retrospec_spec.rb",
|
560
566
|
"spec/spec_helper.rb",
|
561
567
|
"spec/unit/conditional_spec.rb",
|
568
|
+
"spec/unit/generators/fact_generater_spec.rb",
|
569
|
+
"spec/unit/generators/fact_spec.rb",
|
562
570
|
"spec/unit/module_spec.rb",
|
563
571
|
"spec/unit/plugin_spec.rb",
|
564
572
|
"spec/unit/puppet-retrospec_spec.rb",
|
@@ -1822,7 +1830,8 @@ Gem::Specification.new do |s|
|
|
1822
1830
|
|
1823
1831
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
1824
1832
|
s.add_runtime_dependency(%q<trollop>, [">= 0"])
|
1825
|
-
s.add_runtime_dependency(%q<retrospec>, ["~> 0.4
|
1833
|
+
s.add_runtime_dependency(%q<retrospec>, ["~> 0.4"])
|
1834
|
+
s.add_runtime_dependency(%q<awesome_print>, [">= 0"])
|
1826
1835
|
s.add_development_dependency(%q<rspec>, ["~> 3.2"])
|
1827
1836
|
s.add_development_dependency(%q<puppet>, ["= 3.7.3"])
|
1828
1837
|
s.add_development_dependency(%q<yard>, ["~> 0.7"])
|
@@ -1833,7 +1842,8 @@ Gem::Specification.new do |s|
|
|
1833
1842
|
s.add_development_dependency(%q<fakefs>, [">= 0"])
|
1834
1843
|
else
|
1835
1844
|
s.add_dependency(%q<trollop>, [">= 0"])
|
1836
|
-
s.add_dependency(%q<retrospec>, ["~> 0.4
|
1845
|
+
s.add_dependency(%q<retrospec>, ["~> 0.4"])
|
1846
|
+
s.add_dependency(%q<awesome_print>, [">= 0"])
|
1837
1847
|
s.add_dependency(%q<rspec>, ["~> 3.2"])
|
1838
1848
|
s.add_dependency(%q<puppet>, ["= 3.7.3"])
|
1839
1849
|
s.add_dependency(%q<yard>, ["~> 0.7"])
|
@@ -1845,7 +1855,8 @@ Gem::Specification.new do |s|
|
|
1845
1855
|
end
|
1846
1856
|
else
|
1847
1857
|
s.add_dependency(%q<trollop>, [">= 0"])
|
1848
|
-
s.add_dependency(%q<retrospec>, ["~> 0.4
|
1858
|
+
s.add_dependency(%q<retrospec>, ["~> 0.4"])
|
1859
|
+
s.add_dependency(%q<awesome_print>, [">= 0"])
|
1849
1860
|
s.add_dependency(%q<rspec>, ["~> 3.2"])
|
1850
1861
|
s.add_dependency(%q<puppet>, ["= 3.7.3"])
|
1851
1862
|
s.add_dependency(%q<yard>, ["~> 0.7"])
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# this is an example of a fact file with multiple facts
|
2
|
+
Facter.add(:fact1) do
|
3
|
+
confine :kernel => 'Linux'
|
4
|
+
setcode do
|
5
|
+
'value1'
|
6
|
+
end
|
7
|
+
end
|
8
|
+
Facter.add(:fact2) do
|
9
|
+
confine :kernel => 'Windows'
|
10
|
+
setcode do
|
11
|
+
'value2'
|
12
|
+
Facter::Core::Execution.execute('which lsb')
|
13
|
+
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# this is just an example fact that uses method logic outside the Facter.add block
|
2
|
+
def default_kernel
|
3
|
+
if Facter.value(:kernel) == 'Windows'
|
4
|
+
'Windows'
|
5
|
+
else
|
6
|
+
'Linux'
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
Facter.add(:method_fact) do
|
11
|
+
confine :kernel => 'Linux'
|
12
|
+
confine :osfamily => 'RedHat'
|
13
|
+
setcode do
|
14
|
+
is_virtual = Facter.fact(:is_virtual).value
|
15
|
+
default_kernel
|
16
|
+
Facter::Core::Execution.execute('which lsb')
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
data/spec/spec_helper.rb
CHANGED
@@ -11,6 +11,10 @@ def fixtures_path
|
|
11
11
|
@fixtures_path ||= File.expand_path(File.join(File.dirname(__FILE__), 'fixtures'))
|
12
12
|
end
|
13
13
|
|
14
|
+
def fixtures_facts_path
|
15
|
+
@fixtures_facts_path ||= File.expand_path(File.join(fixtures_path, 'facts'))
|
16
|
+
end
|
17
|
+
|
14
18
|
def clean_up_spec_dir(dir)
|
15
19
|
#puts "removing directory #{dir}"
|
16
20
|
FileUtils.rm_rf(File.join(dir, 'spec'))
|
@@ -0,0 +1,53 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe "fact generator" do
|
4
|
+
|
5
|
+
before :each do
|
6
|
+
FileUtils.rm_rf(facter_spec_dir)
|
7
|
+
allow(generator).to receive(:facter_dir).and_return(fixtures_facts_path)
|
8
|
+
allow(generator).to receive(:fact_name_path).and_return(File.join(module_path, 'lib', 'facter', "#{generator.fact_name}.rb"))
|
9
|
+
end
|
10
|
+
|
11
|
+
after :each do
|
12
|
+
FileUtils.rm_f(generator.fact_name_path) # ensure the file does not exist
|
13
|
+
end
|
14
|
+
|
15
|
+
let(:facter_spec_dir) do
|
16
|
+
File.join(module_path, 'spec', 'unit', 'facter')
|
17
|
+
end
|
18
|
+
|
19
|
+
let(:module_path) do
|
20
|
+
File.join(fixture_modules_path, 'tomcat')
|
21
|
+
end
|
22
|
+
|
23
|
+
let(:context) do
|
24
|
+
{:name => 'datacenter', :template_dir => File.expand_path(File.join(ENV['HOME'], '.retrospec', 'repos', 'retrospec-puppet-templates'))}
|
25
|
+
end
|
26
|
+
|
27
|
+
let(:generator) do
|
28
|
+
Retrospec::Puppet::Generators::FactGenerator.new(module_path, context )
|
29
|
+
end
|
30
|
+
|
31
|
+
it 'returns facter dir' do
|
32
|
+
expect(generator.facter_dir).to eq(fixtures_facts_path)
|
33
|
+
end
|
34
|
+
|
35
|
+
it 'returns module path' do
|
36
|
+
expect(generator.facter_spec_dir).to eq(facter_spec_dir)
|
37
|
+
end
|
38
|
+
|
39
|
+
it 'can return fact name' do
|
40
|
+
expect(generator.fact_name).to eq('datacenter')
|
41
|
+
end
|
42
|
+
|
43
|
+
it 'can generate a fact file' do
|
44
|
+
expect(generator.generate_fact_file.count).to eq(3)
|
45
|
+
expect(File.exists?(File.join(generator.facter_dir, "#{generator.fact_name}.rb")))
|
46
|
+
end
|
47
|
+
|
48
|
+
it 'can generate a spec file' do
|
49
|
+
|
50
|
+
expect(generator.generate_fact_spec_files.count).to eq(3)
|
51
|
+
end
|
52
|
+
|
53
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe "facter" do
|
4
|
+
|
5
|
+
let(:file) do
|
6
|
+
File.join(fixtures_facts_path , 'node_role.rb')
|
7
|
+
end
|
8
|
+
|
9
|
+
it 'can eval code' do
|
10
|
+
models = Retrospec::Puppet::Generators::Facter.load_fact(file)
|
11
|
+
fact_name = models.facts.keys.first
|
12
|
+
fact_data = models.facts[fact_name]
|
13
|
+
confines = fact_data.confines
|
14
|
+
model_facts = models.facts[fact_name].used_facts
|
15
|
+
global_used_facts = models.global_used_facts
|
16
|
+
expect(fact_name).to eq(:node_role)
|
17
|
+
expect(confines).to eq([{:kernel=>"Windows"}, {:is_virtual=>true}])
|
18
|
+
expect(model_facts).to eq({})
|
19
|
+
expect(global_used_facts).to eq({})
|
20
|
+
end
|
21
|
+
|
22
|
+
describe 'multiple facts' do
|
23
|
+
let(:file) do
|
24
|
+
File.join(fixtures_facts_path , 'datacenter_facts.rb')
|
25
|
+
end
|
26
|
+
|
27
|
+
it 'can eval code with multiple facts' do
|
28
|
+
models = Retrospec::Puppet::Generators::Facter.load_fact(file)
|
29
|
+
global_used_facts = models[:global_used_facts]
|
30
|
+
fact_name = models.facts.keys.first
|
31
|
+
fact_data = models.facts[fact_name]
|
32
|
+
confines = fact_data.confines
|
33
|
+
model_facts = fact_data.used_facts
|
34
|
+
expect(fact_name).to eq(:fact1)
|
35
|
+
expect(confines).to eq([{:kernel=>"Linux"}])
|
36
|
+
expect(model_facts).to eq({})
|
37
|
+
expect(global_used_facts).to eq({})
|
38
|
+
fact_name = models.facts.keys.last
|
39
|
+
fact_data = models.facts[fact_name]
|
40
|
+
confines = fact_data.confines
|
41
|
+
model_facts = fact_data.used_facts
|
42
|
+
expect(fact_name).to eq(:fact2)
|
43
|
+
expect(confines).to eq([{:kernel=>"Windows"}])
|
44
|
+
expect(model_facts).to eq({})
|
45
|
+
expect(global_used_facts).to eq({})
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
describe 'fact value' do
|
50
|
+
let(:file) do
|
51
|
+
File.join(fixtures_facts_path , 'facts_with_methods.rb')
|
52
|
+
end
|
53
|
+
it 'can be processed' do
|
54
|
+
Retrospec::Puppet::Generators::Facter.load_fact(file)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
end
|
@@ -63,10 +63,13 @@ describe "puppet-retrospec" do
|
|
63
63
|
it 'should create a module when it does not exist' do
|
64
64
|
opts = {'plugins::puppet::author' => 'test_name', :module_path => '/tmp/new_module', :create => true,
|
65
65
|
:namespace => 'retrospec', :enable_beaker_tests => false,
|
66
|
-
:enable_user_templates => false, :name => 'moduletest',
|
66
|
+
:enable_user_templates => false, :name => 'moduletest',
|
67
|
+
:template_dir => File.expand_path(File.join(ENV['HOME'], '.retrospec', 'repos', 'retrospec-puppet-templates')),
|
68
|
+
:enable_future_parser => true }
|
69
|
+
ENV['RETROSPEC_PUPPET_AUTO_GENERATE'] = 'true'
|
67
70
|
new_module = Retrospec::Plugins::V1::Puppet.new(opts[:module_path], opts)
|
68
71
|
allow(new_module).to receive(:gets).and_return("y\n")
|
69
|
-
new_module.new_module
|
72
|
+
new_module.new_module(opts)
|
70
73
|
new_module.post_init
|
71
74
|
new_module.run
|
72
75
|
expect(File.exists?(File.join(new_module.manifest_dir, 'init.pp'))).to eq(true)
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: puppet-retrospec
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.11.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Corey Osman
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-10-
|
11
|
+
date: 2015-10-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: trollop
|
@@ -30,14 +30,28 @@ dependencies:
|
|
30
30
|
requirements:
|
31
31
|
- - ~>
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: 0.4
|
33
|
+
version: '0.4'
|
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.4
|
40
|
+
version: '0.4'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: awesome_print
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - '>='
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
41
55
|
- !ruby/object:Gem::Dependency
|
42
56
|
name: rspec
|
43
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -170,6 +184,9 @@ files:
|
|
170
184
|
- VERSION
|
171
185
|
- lib/retrospec-puppet.rb
|
172
186
|
- lib/retrospec/plugins/v1/plugin/conditional.rb
|
187
|
+
- lib/retrospec/plugins/v1/plugin/generators/fact_generator.rb
|
188
|
+
- lib/retrospec/plugins/v1/plugin/generators/facter.rb
|
189
|
+
- lib/retrospec/plugins/v1/plugin/generators/module_generator.rb
|
173
190
|
- lib/retrospec/plugins/v1/plugin/helpers.rb
|
174
191
|
- lib/retrospec/plugins/v1/plugin/puppet.rb
|
175
192
|
- lib/retrospec/plugins/v1/plugin/puppet_module.rb
|
@@ -181,6 +198,9 @@ files:
|
|
181
198
|
- lib/retrospec/plugins/v1/plugin/variable_store.rb
|
182
199
|
- lib/retrospec/plugins/v1/plugin/version.rb
|
183
200
|
- puppet-retrospec.gemspec
|
201
|
+
- spec/fixtures/facts/datacenter_facts.rb
|
202
|
+
- spec/fixtures/facts/facts_with_methods.rb
|
203
|
+
- spec/fixtures/facts/node_role.rb
|
184
204
|
- spec/fixtures/fixture_modules/one_resource_module/manifests/another_resource.pp
|
185
205
|
- spec/fixtures/fixture_modules/one_resource_module/manifests/inherits_params.pp
|
186
206
|
- spec/fixtures/fixture_modules/one_resource_module/manifests/one_resource_class.pp
|
@@ -700,6 +720,8 @@ files:
|
|
700
720
|
- spec/integration/retrospec_spec.rb
|
701
721
|
- spec/spec_helper.rb
|
702
722
|
- spec/unit/conditional_spec.rb
|
723
|
+
- spec/unit/generators/fact_generater_spec.rb
|
724
|
+
- spec/unit/generators/fact_spec.rb
|
703
725
|
- spec/unit/module_spec.rb
|
704
726
|
- spec/unit/plugin_spec.rb
|
705
727
|
- spec/unit/puppet-retrospec_spec.rb
|