puppet-retrospec 0.5.1 → 0.6.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +2 -2
- data/VERSION +1 -1
- data/bin/retrospec +2 -5
- data/lib/retrospec.rb +41 -45
- data/lib/retrospec/exceptions.rb +4 -0
- data/lib/retrospec/puppet_module.rb +163 -0
- data/lib/retrospec/resource.rb +2 -3
- data/lib/retrospec/spec_object.rb +37 -0
- data/lib/retrospec/templates/gemfile.erb +12 -10
- data/lib/retrospec/templates/nodesets/centos-66-x64.yml +11 -0
- data/lib/retrospec/templates/rakefile.erb +3 -0
- data/lib/retrospec/templates/resource_spec_file.erb +3 -3
- data/lib/retrospec/templates/spec_helper_file.erb +1 -0
- data/lib/retrospec/templates/travis.yml.erb +14 -0
- data/lib/retrospec/type_code.rb +14 -2
- data/lib/retrospec/variable_store.rb +70 -9
- data/lib/retrospec/version.rb +1 -1
- data/puppet-retrospec.gemspec +14 -7
- data/spec/fixtures/fixture_modules/one_resource_module/manifests/{another_resource_class.pp → another_resource.pp} +4 -3
- data/spec/fixtures/fixture_modules/one_resource_module/manifests/inherits_params.pp +8 -0
- data/spec/fixtures/fixture_modules/one_resource_module/manifests/params.pp +19 -0
- data/spec/integration/retrospec_spec.rb +36 -0
- data/spec/unit/conditional_spec.rb +41 -23
- data/spec/unit/module_spec.rb +55 -0
- data/spec/unit/puppet-retrospec_spec.rb +15 -22
- data/spec/unit/resource_spec.rb +46 -38
- data/spec/unit/type_code_spec.rb +37 -19
- data/spec/unit/variable_store_spec.rb +72 -16
- metadata +40 -33
- data/lib/retrospec/module_utilities.rb +0 -80
- data/lib/retrospec/templates/nodesets/centos-65-x64.yml +0 -10
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3132a94b4025368f76a74202f2ffacfe5906b941
|
4
|
+
data.tar.gz: d0adc560eb50a6a89dc3ad9810f53516cc6f2c07
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e4fdd60ac3de7650f4ca6a0054fb292a9a55f25f68337d8b01b6f10e1db46915b8c6db0826f02d8ffb5447250cd4d223654a16a747653abc8c4f7303bf78fcc4
|
7
|
+
data.tar.gz: cce4b3c789ab9b41d16839d557ed2a83c6b2a25f062e3e4cd534ddf785e20591f157d93b59b22617b07bb556cfd553a1b85fe841a9154185483cd10f8c0f88c6
|
data/README.md
CHANGED
@@ -72,7 +72,7 @@ $ retrospec
|
|
72
72
|
```
|
73
73
|
|
74
74
|
Looking at the file we can see that it did a lot of work for us. Retrospec generate three tests automatically.
|
75
|
-
However the variable resolution isn't perfect so you will need to manually resolve
|
75
|
+
However the variable resolution isn't perfect so you will need to manually resolve some variables. This doesn't produce
|
76
76
|
100% coverage but all you did was press enter to produce all this anyways.
|
77
77
|
Below is the defines/instance_spec.rb file
|
78
78
|
|
@@ -161,7 +161,7 @@ For now you will probably want to read up on the following documentation:
|
|
161
161
|
How Does it do this
|
162
162
|
=======================
|
163
163
|
Basically Retrospec uses the puppet lexer and parser to scan your code in order to fill out some basic templates that will retrofit
|
164
|
-
your puppet module with unit tests. Currently I rely on the old AST parser to generate all this
|
164
|
+
your puppet module with unit tests. Currently I rely on the old AST parser to generate all this. This is why
|
165
165
|
|
166
166
|
Overriding the templates
|
167
167
|
=======================
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.6.0
|
data/bin/retrospec
CHANGED
@@ -1,7 +1,6 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
require 'trollop'
|
3
3
|
require 'retrospec'
|
4
|
-
require 'retrospec/version'
|
5
4
|
|
6
5
|
opts = Trollop::options do
|
7
6
|
opt :module_path, "The path (relative or absolute) to the module directory (Defaults to current directory) " ,
|
@@ -11,10 +10,8 @@ opts = Trollop::options do
|
|
11
10
|
opt :enable_user_templates, "Use Retrospec templates from #{File.expand_path('~/.puppet_retrospec_templates')}",
|
12
11
|
:require => false, :type => :boolean
|
13
12
|
opt :enable_beaker_tests, "Enable the creation of beaker tests", :require => false, :type => :boolean
|
14
|
-
opt :version, "The Version of the Gem", :required => false, :type => :boolean
|
15
|
-
end
|
16
|
-
if opts[:version]
|
17
|
-
puts "Puppet Retrospec Version: #{Puppet_Retrospec::VERSION}"
|
18
13
|
end
|
14
|
+
include Puppet_Retrospec
|
15
|
+
|
19
16
|
retro = Retrospec.new(opts[:module_path], opts)
|
20
17
|
retro.create_files
|
data/lib/retrospec.rb
CHANGED
@@ -5,20 +5,23 @@ require 'fileutils'
|
|
5
5
|
require 'retrospec/resource'
|
6
6
|
require 'retrospec/conditional'
|
7
7
|
require 'retrospec/variable_store'
|
8
|
-
require 'retrospec/
|
8
|
+
require 'retrospec/puppet_module'
|
9
|
+
require 'retrospec/spec_object'
|
10
|
+
require 'retrospec/exceptions'
|
11
|
+
require 'retrospec/version'
|
9
12
|
|
10
13
|
class Retrospec
|
11
|
-
include PuppetModule::Utilities
|
12
14
|
|
13
|
-
attr_reader :module_path
|
14
15
|
attr_reader :template_dir
|
16
|
+
attr_reader :module_path
|
17
|
+
attr_reader :spec_object
|
15
18
|
|
16
19
|
# module path is the relative or absolute path to the module that should retro fitted
|
17
20
|
# opts hash contains additional flags and options that can be user to control the creation of the tests
|
18
21
|
# opts[:enable_user_templates]
|
19
22
|
# opts[:enable_beaker_tests]
|
20
23
|
# opts[:template_dir]
|
21
|
-
def initialize(
|
24
|
+
def initialize(supplied_module_path=nil,opts={})
|
22
25
|
# user supplied a template path or user wants to use local templates
|
23
26
|
if opts[:template_dir] or opts[:enable_user_templates]
|
24
27
|
@template_dir = Helpers.setup_user_template_dir(opts[:template_dir])
|
@@ -26,13 +29,13 @@ class Retrospec
|
|
26
29
|
# if user doesn't supply template directory we assume we should use the templates in this gem
|
27
30
|
@template_dir = Helpers.gem_template_dir
|
28
31
|
end
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
32
|
+
begin
|
33
|
+
Utilities::PuppetModule.instance.module_path = supplied_module_path
|
34
|
+
Utilities::PuppetModule.create_tmp_module_path # this is required to finish initialization
|
35
|
+
@module_path = Utilities::PuppetModule.module_path
|
36
|
+
@spec_object = Utilities::SpecObject.new(Utilities::PuppetModule.instance)
|
37
|
+
spec_object.enable_beaker_tests = opts[:enable_beaker_tests]
|
38
|
+
end
|
36
39
|
end
|
37
40
|
|
38
41
|
def create_files
|
@@ -41,15 +44,19 @@ class Retrospec
|
|
41
44
|
safe_create_gemfile
|
42
45
|
safe_create_rakefile
|
43
46
|
safe_make_shared_context
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
47
|
+
safe_create_ci_file
|
48
|
+
safe_create_acceptance_spec_helper if spec_object.enable_beaker_tests?
|
49
|
+
safe_create_node_sets if spec_object.enable_beaker_tests?
|
50
|
+
# a Type is nothing more than a defined type or puppet class
|
51
|
+
# we could have named this manifest but there could be multiple types
|
52
|
+
# in a manifest.
|
53
|
+
spec_object.types.each do |type|
|
54
|
+
safe_create_resource_spec_files(type)
|
55
|
+
if spec_object.enable_beaker_tests?
|
56
|
+
safe_create_acceptance_tests(type)
|
57
|
+
end
|
51
58
|
end
|
52
|
-
|
59
|
+
Utilities::PuppetModule.clean_tmp_modules_dir
|
53
60
|
true
|
54
61
|
end
|
55
62
|
|
@@ -61,6 +68,10 @@ class Retrospec
|
|
61
68
|
end
|
62
69
|
end
|
63
70
|
|
71
|
+
def safe_create_ci_file(template='travis.yml.erb')
|
72
|
+
safe_create_template_file('.travis.yml.erb', template)
|
73
|
+
end
|
74
|
+
|
64
75
|
def safe_create_acceptance_spec_helper(template='spec_helper_acceptance.rb.erb')
|
65
76
|
safe_create_template_file(File.join('spec', 'spec_helper_acceptance.rb'), template)
|
66
77
|
end
|
@@ -94,7 +105,7 @@ class Retrospec
|
|
94
105
|
template_path = File.join(template_dir, template)
|
95
106
|
File.open(template_path) do |file|
|
96
107
|
renderer = ERB.new(file.read, 0, '-')
|
97
|
-
content = renderer.result
|
108
|
+
content = renderer.result spec_object.get_binding
|
98
109
|
dest_path = File.expand_path(File.join(module_path,path))
|
99
110
|
Helpers.safe_create_file(dest_path, content)
|
100
111
|
end
|
@@ -102,12 +113,13 @@ class Retrospec
|
|
102
113
|
|
103
114
|
# Creates an associated spec file for each type and even creates the subfolders for nested classes one::two::three
|
104
115
|
def safe_create_resource_spec_files(type,template='resource_spec_file.erb')
|
105
|
-
|
106
|
-
|
107
|
-
@resources = Resource.all(type)
|
108
|
-
# pass the type to the variable store and it will discover all the variables and try to resolve them.
|
116
|
+
spec_object.parameters = type.arguments
|
117
|
+
spec_object.type = type
|
109
118
|
VariableStore.populate(type)
|
110
|
-
|
119
|
+
spec_object.resources = Resource.all(type)
|
120
|
+
# pass the type to the variable store and it will discover all the variables and try to resolve them.
|
121
|
+
# this does not get deep nested conditional blocks
|
122
|
+
spec_object.resources += Conditional.all(type)
|
111
123
|
file_path = generate_file_path(type, false)
|
112
124
|
safe_create_template_file(file_path, template)
|
113
125
|
file_path
|
@@ -146,11 +158,13 @@ class Retrospec
|
|
146
158
|
file_name = generate_file_name(type.name)
|
147
159
|
tokens = type.name.split('::')
|
148
160
|
# if there are only two tokens ie. tomcat::params we dont need to create a subdirectory
|
149
|
-
if tokens.count >
|
161
|
+
if tokens.count > 2
|
150
162
|
# this is a deep level resource ie. tomcat::config::server::connector
|
151
163
|
# however we don't need the tomcat directory so we can just remove it
|
152
164
|
# this should leave us with config/server/connector_spec.rb
|
153
165
|
tokens.delete_at(0)
|
166
|
+
# remove the last token since its the class name
|
167
|
+
tokens.pop
|
154
168
|
# so lets make a directory structure out of it
|
155
169
|
dir_name = File.join(tokens) # config/server
|
156
170
|
dir_name = File.join(type_dir_name,dir_name, file_name) # spec/classes/tomcat/config/server
|
@@ -169,23 +183,5 @@ class Retrospec
|
|
169
183
|
|
170
184
|
private
|
171
185
|
|
172
|
-
|
173
|
-
# returns the validated dir
|
174
|
-
def validate_module_dir(dir)
|
175
|
-
# first check to see if manifests directory even exists when path is nil
|
176
|
-
if dir.nil?
|
177
|
-
dir = '.'
|
178
|
-
elsif dir.instance_of?(Array)
|
179
|
-
raise "Retrospec - an array of moudule paths is not supported at this time"
|
180
|
-
end
|
181
|
-
dir = File.expand_path(dir)
|
182
|
-
manifest_dir = File.join(dir,'manifests')
|
183
|
-
if ! File.exist?(manifest_dir)
|
184
|
-
raise "No manifest directory in #{manifest_dir}, cannot validate this is a module"
|
185
|
-
else
|
186
|
-
files = Dir.glob("#{manifest_dir}/**/*.pp")
|
187
|
-
warn 'No puppet manifest files found at #' if files.length < 1
|
188
|
-
end
|
189
|
-
dir
|
190
|
-
end
|
186
|
+
|
191
187
|
end
|
@@ -0,0 +1,163 @@
|
|
1
|
+
require 'singleton'
|
2
|
+
|
3
|
+
module Utilities
|
4
|
+
class PuppetModule
|
5
|
+
attr_writer :module_path
|
6
|
+
|
7
|
+
include Singleton
|
8
|
+
|
9
|
+
def self.tmp_module_path
|
10
|
+
Utilities::PuppetModule.instance.tmp_module_path
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.tmp_modules_dir
|
14
|
+
Utilities::PuppetModule.instance.tmp_modules_dir
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.module_path
|
18
|
+
Utilities::PuppetModule.instance.module_path
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.module_name
|
22
|
+
Utilities::PuppetModule.instance.module_name
|
23
|
+
end
|
24
|
+
|
25
|
+
def self.module_dir_name
|
26
|
+
Utilities::PuppetModule.instance.module_dir_name
|
27
|
+
end
|
28
|
+
|
29
|
+
def self.module_types
|
30
|
+
Utilities::PuppetModule.instance.types
|
31
|
+
end
|
32
|
+
|
33
|
+
# create the temporary module create, validate the
|
34
|
+
def self.create_tmp_module_path
|
35
|
+
Utilities::PuppetModule::instance.create_tmp_module_path(module_path)
|
36
|
+
end
|
37
|
+
|
38
|
+
def self.clean_tmp_modules_dir
|
39
|
+
FileUtils.remove_entry_secure instance.tmp_modules_dir # ensure we remove the temporary directory
|
40
|
+
end
|
41
|
+
|
42
|
+
def module_path
|
43
|
+
@module_path
|
44
|
+
end
|
45
|
+
|
46
|
+
# validate and set the module path
|
47
|
+
def module_path=(path)
|
48
|
+
@module_path = validate_module_dir(path)
|
49
|
+
end
|
50
|
+
|
51
|
+
# gets an instance of the module class. The create_tmp_module_path must first be called
|
52
|
+
# before instance can do anything useful.
|
53
|
+
def self.instance
|
54
|
+
@@instance ||= new
|
55
|
+
end
|
56
|
+
|
57
|
+
# processes a directory and expands to its full path, assumes './'
|
58
|
+
# returns the validated dir
|
59
|
+
def validate_module_dir(dir)
|
60
|
+
# first check to see if manifests directory even exists when path is nil
|
61
|
+
if dir.nil?
|
62
|
+
dir = '.'
|
63
|
+
elsif dir.instance_of?(Array)
|
64
|
+
puts "Retrospec - an array of module paths is not supported at this time"
|
65
|
+
exit 1
|
66
|
+
end
|
67
|
+
dir = File.expand_path(dir)
|
68
|
+
manifest_dir = File.join(dir,'manifests')
|
69
|
+
if ! File.exist?(manifest_dir)
|
70
|
+
puts "No manifest directory in #{manifest_dir}, cannot validate this is a module"
|
71
|
+
exit 1
|
72
|
+
else
|
73
|
+
files = Dir.glob("#{manifest_dir}/**/*.pp")
|
74
|
+
warn "No puppet manifest files found at #{manifest_dir}" if files.length < 1
|
75
|
+
end
|
76
|
+
dir
|
77
|
+
end
|
78
|
+
|
79
|
+
# puts a symlink in that module directory that points back to the user supplied module path
|
80
|
+
def create_tmp_module_path(module_path)
|
81
|
+
raise "ModulePathNotFound" unless module_path
|
82
|
+
path = File.join(tmp_modules_dir, module_dir_name)
|
83
|
+
unless File.exists?(path) # only create if it doesn't already exist
|
84
|
+
# create a link where source is the current repo and dest is /tmp/modules/module_name
|
85
|
+
FileUtils.ln_s(module_path, path)
|
86
|
+
end
|
87
|
+
path
|
88
|
+
end
|
89
|
+
|
90
|
+
def tmp_module_path
|
91
|
+
@tmp_module_path ||= File.join(tmp_modules_dir, module_dir_name)
|
92
|
+
end
|
93
|
+
|
94
|
+
# the directory name of the module
|
95
|
+
# usually this is the same as the module name but it can be namespaced sometimes
|
96
|
+
def module_dir_name
|
97
|
+
raise "ModulePathNotFound" unless module_path
|
98
|
+
@module_dir_name ||= File.basename(module_path)
|
99
|
+
end
|
100
|
+
|
101
|
+
def module_type_names
|
102
|
+
types.map {|x| x.name}
|
103
|
+
end
|
104
|
+
|
105
|
+
# returns the name of the module ie. mysql::config => mysql
|
106
|
+
def module_name
|
107
|
+
begin
|
108
|
+
@module_name ||= types.first.name.split('::').first
|
109
|
+
rescue
|
110
|
+
@module_name = module_dir_name
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
# creates a tmp module directory so puppet can work correctly
|
115
|
+
def tmp_modules_dir
|
116
|
+
if @tmp_modules_dir.nil? or not File.exists?(@tmp_modules_dir)
|
117
|
+
dir = Dir.mktmpdir
|
118
|
+
tmp_path = File.expand_path(File.join(dir, 'modules'))
|
119
|
+
FileUtils.mkdir_p(tmp_path)
|
120
|
+
@tmp_modules_dir = tmp_path
|
121
|
+
end
|
122
|
+
@tmp_modules_dir
|
123
|
+
end
|
124
|
+
|
125
|
+
|
126
|
+
# creates a puppet environment given a module path and environment name
|
127
|
+
def puppet_environment
|
128
|
+
@puppet_environment ||= Puppet::Node::Environment.create('production', [tmp_modules_dir])
|
129
|
+
end
|
130
|
+
|
131
|
+
# creates a puppet resource request to be used indirectly
|
132
|
+
def request(key, method)
|
133
|
+
instance = Puppet::Indirector::Indirection.instance(:resource_type)
|
134
|
+
indirection_name = 'test'
|
135
|
+
@request = Puppet::Indirector::Request.new(indirection_name, method, key, instance)
|
136
|
+
@request.environment = puppet_environment
|
137
|
+
@request
|
138
|
+
end
|
139
|
+
|
140
|
+
# creates an instance of the resource type parser
|
141
|
+
def resource_type_parser
|
142
|
+
@resource_type_parser ||= Puppet::Indirector::ResourceType::Parser.new
|
143
|
+
end
|
144
|
+
|
145
|
+
# returns the resource type object given a resource name ie. tomcat::connector
|
146
|
+
def find_resource(resource_name)
|
147
|
+
request = request(resource_name, 'find')
|
148
|
+
resource_type_parser.find(request)
|
149
|
+
end
|
150
|
+
|
151
|
+
# returns the resource types found in the module
|
152
|
+
def search_module(pattern='*')
|
153
|
+
request = request(pattern, 'search')
|
154
|
+
resource_type_parser.search(request)
|
155
|
+
end
|
156
|
+
|
157
|
+
# TODO we need to parse the types and find all the types that inherit other types and then order them so we can load the files first
|
158
|
+
def types
|
159
|
+
@types ||= search_module || []
|
160
|
+
end
|
161
|
+
end
|
162
|
+
end
|
163
|
+
|
data/lib/retrospec/resource.rb
CHANGED
@@ -5,6 +5,7 @@ class Resource
|
|
5
5
|
attr_reader :type, :title, :parameters, :scope_name
|
6
6
|
|
7
7
|
def initialize(type_name,instance)
|
8
|
+
# we don't store the resource parameters in the variablestore because they are never referenced
|
8
9
|
@parameters = Hash[instance.parameters.map { |k| [k.param, VariableStore.resolve(k.value).gsub("\"", '')]}]
|
9
10
|
@type = type_name
|
10
11
|
@title = VariableStore.resolve(instance.title).gsub("\"", '')
|
@@ -13,9 +14,7 @@ class Resource
|
|
13
14
|
# Gets all resources in the type that are not in a code block
|
14
15
|
def self.all(statements)
|
15
16
|
if statements.respond_to?(:code)
|
16
|
-
#
|
17
|
-
statements.arguments.each {|k,v| VariableStore.add(k,v)}
|
18
|
-
# if we accidently pass a type in without specifing the code
|
17
|
+
# if we accidentally pass a type in without specifying the code
|
19
18
|
statements = statements.code unless statements.nil?
|
20
19
|
end
|
21
20
|
a = []
|
@@ -0,0 +1,37 @@
|
|
1
|
+
|
2
|
+
module Utilities
|
3
|
+
class SpecObject
|
4
|
+
attr_reader :instance
|
5
|
+
attr_accessor :enable_beaker_tests, :parameters, :types, :resources, :type
|
6
|
+
|
7
|
+
def initialize(mod_instance)
|
8
|
+
@instance = mod_instance
|
9
|
+
end
|
10
|
+
|
11
|
+
def types
|
12
|
+
instance.types
|
13
|
+
end
|
14
|
+
|
15
|
+
def module_name
|
16
|
+
instance.module_name
|
17
|
+
end
|
18
|
+
|
19
|
+
def module_path
|
20
|
+
instance.module_path
|
21
|
+
end
|
22
|
+
|
23
|
+
def get_binding
|
24
|
+
binding
|
25
|
+
end
|
26
|
+
|
27
|
+
def enable_beaker_tests?
|
28
|
+
@enable_beaker_tests == true
|
29
|
+
end
|
30
|
+
|
31
|
+
# allows the user to use the variable store to resolve the variable if it exists
|
32
|
+
def variable_value(key)
|
33
|
+
VariableStore.resolve(key)
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
37
|
+
end
|
@@ -2,26 +2,28 @@ source "https://rubygems.org"
|
|
2
2
|
|
3
3
|
group :test do
|
4
4
|
gem "rake"
|
5
|
-
gem "puppet", ENV['PUPPET_VERSION'] || '~> 3.7.
|
5
|
+
gem "puppet", ENV['PUPPET_VERSION'] || '~> 3.7.3'
|
6
6
|
gem "rspec-puppet", :git => 'https://github.com/rodjek/rspec-puppet.git'
|
7
7
|
gem "puppetlabs_spec_helper"
|
8
8
|
gem 'rspec-puppet-utils', :git => 'https://github.com/Accuity/rspec-puppet-utils.git'
|
9
9
|
gem 'hiera-puppet-helper', :git => 'https://github.com/bobtfish/hiera-puppet-helper.git'
|
10
|
-
|
10
|
+
<%- if enable_beaker_tests? -%>
|
11
|
+
gem "beaker", :git => 'https://github.com/puppetlabs/beaker.git'
|
12
|
+
gem "beaker-rspec", :git => 'https://github.com/puppetlabs/beaker-rspec.git'
|
13
|
+
gem "vagrant-wrapper"
|
14
|
+
gem 'serverspec'
|
15
|
+
<%- end -%>
|
16
|
+
# there seems to be a bug with puppet-blacksmith and metadata-json-lint
|
17
|
+
# removing metadata for now
|
18
|
+
gem "metadata-json-lint"
|
19
|
+
gem 'puppet-syntax'
|
20
|
+
gem 'puppet-lint'
|
11
21
|
end
|
12
22
|
|
13
23
|
group :development do
|
14
24
|
gem "travis"
|
15
25
|
gem "travis-lint"
|
16
|
-
<%- if enable_beaker_tests? -%>
|
17
|
-
gem "beaker", :git => 'https://github.com/puppetlabs/beaker.git'
|
18
|
-
gem "beaker-rspec", :git => 'https://github.com/puppetlabs/beaker-rspec.git'
|
19
|
-
gem "vagrant-wrapper"
|
20
|
-
<%- end -%>
|
21
26
|
gem "puppet-blacksmith"
|
22
27
|
gem "guard-rake"
|
23
|
-
gem "metadata-json-lint"
|
24
|
-
gem 'puppet-syntax'
|
25
|
-
gem 'serverspec'
|
26
28
|
end
|
27
29
|
|