puppet-syntax 0.0.4 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.travis.yml +12 -0
- data/CHANGELOG +21 -0
- data/Gemfile +5 -0
- data/README.md +17 -0
- data/lib/puppet-syntax/manifests.rb +12 -9
- data/lib/puppet-syntax/tasks/puppet-syntax.rb +10 -2
- data/lib/puppet-syntax/templates.rb +7 -7
- data/lib/puppet-syntax/version.rb +1 -1
- data/spec/fixtures/test_module/manifests/fail_error.pp +3 -0
- data/spec/fixtures/test_module/manifests/fail_warning.pp +5 -0
- data/spec/fixtures/test_module/manifests/pass.pp +5 -0
- data/spec/fixtures/test_module/manifests/pass_storeconfigs.pp +3 -0
- data/spec/fixtures/test_module/templates/fail_error.erb +3 -0
- data/spec/fixtures/test_module/templates/fail_warning.erb +2 -0
- data/spec/fixtures/test_module/templates/pass.erb +2 -0
- data/spec/fixtures/test_module/templates/pass_unbound_var.erb +1 -0
- data/spec/puppet-syntax/manifests_spec.rb +36 -8
- data/spec/puppet-syntax/tasks/puppet-syntax_spec.rb +11 -0
- data/spec/puppet-syntax/templates_spec.rb +33 -10
- data/spec/spec_helper.rb +13 -0
- metadata +23 -4
data/.travis.yml
CHANGED
@@ -1,3 +1,15 @@
|
|
1
|
+
---
|
1
2
|
language: ruby
|
3
|
+
script: bundle exec rake
|
2
4
|
rvm:
|
5
|
+
- 1.8.7
|
3
6
|
- 1.9.3
|
7
|
+
env:
|
8
|
+
- PUPPET_VERSION="~> 2.7.0"
|
9
|
+
- PUPPET_VERSION="~> 3.0.0"
|
10
|
+
- PUPPET_VERSION="~> 3.1.0"
|
11
|
+
- PUPPET_VERSION="~> 3.2.0"
|
12
|
+
- PUPPET_VERSION=">= 0"
|
13
|
+
matrix:
|
14
|
+
allow_failures:
|
15
|
+
- env: PUPPET_VERSION=">= 0"
|
data/CHANGELOG
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
2013-07-04 Release 1.0.0
|
2
|
+
- Refactor code to make it easier to test.
|
3
|
+
- Implement spec tests for syntax checks.
|
4
|
+
- Pending spec tests for FileList matching.
|
5
|
+
- Matrix tests for other Ruby/Puppet versions.
|
6
|
+
- Improve usage example in README.
|
7
|
+
|
8
|
+
2013-06-14 Release 0.0.4
|
9
|
+
- Fix `$confdir` error for Puppet 3.x
|
10
|
+
|
11
|
+
2013-06-11 Release 0.0.3
|
12
|
+
- List rake as a dependency.
|
13
|
+
- Output names of tasks to STDERR.
|
14
|
+
- Match template paths correctly.
|
15
|
+
- Add pending spec tests, not yet working.
|
16
|
+
|
17
|
+
2013-06-10 Release 0.0.2
|
18
|
+
- Fix namespacing of rake tasks.
|
19
|
+
|
20
|
+
2013-06-10 Release 0.0.1
|
21
|
+
- Initial release
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -8,6 +8,23 @@ Include the following in your `Rakefile`:
|
|
8
8
|
|
9
9
|
require 'puppet-syntax/tasks/puppet-syntax'
|
10
10
|
|
11
|
+
Test all manifests and templates relative to your `Rakefile`:
|
12
|
+
|
13
|
+
➜ puppet git:(master) bundle exec rake syntax
|
14
|
+
---> syntax:manifests
|
15
|
+
---> syntax:templates
|
16
|
+
|
17
|
+
A non-zero exit code and error message will be returned for any failures:
|
18
|
+
|
19
|
+
➜ puppet git:(master) bundle exec rake syntax
|
20
|
+
---> syntax:manifests
|
21
|
+
rake aborted!
|
22
|
+
Could not parse for environment production: Syntax error at end of file at demo.pp:2
|
23
|
+
Tasks: TOP => syntax => syntax:manifests
|
24
|
+
(See full trace by running task with --trace)
|
25
|
+
|
26
|
+
## Configuration
|
27
|
+
|
11
28
|
Paths can be excluded with:
|
12
29
|
|
13
30
|
PuppetSyntax.exclude_paths = ["vendor/**/*"]
|
@@ -1,14 +1,11 @@
|
|
1
|
-
require 'rake'
|
2
1
|
require 'puppet'
|
3
2
|
require 'puppet/face'
|
4
3
|
|
5
4
|
module PuppetSyntax
|
6
5
|
class Manifests
|
7
|
-
def
|
8
|
-
|
9
|
-
end
|
6
|
+
def check(filelist)
|
7
|
+
raise "Expected an array of files" unless filelist.is_a?(Array)
|
10
8
|
|
11
|
-
def check
|
12
9
|
errors = []
|
13
10
|
|
14
11
|
# FIXME: We shouldn't need to do this. puppet/face should. See:
|
@@ -22,8 +19,7 @@ module PuppetSyntax
|
|
22
19
|
Puppet::Util::Log.newdestination(Puppet::Test::LogCollector.new(errors))
|
23
20
|
Puppet::Util::Log.level = :warning
|
24
21
|
|
25
|
-
|
26
|
-
matched_files.each do |puppet_file|
|
22
|
+
filelist.each do |puppet_file|
|
27
23
|
begin
|
28
24
|
validate_manifest(puppet_file)
|
29
25
|
rescue => error
|
@@ -31,13 +27,20 @@ module PuppetSyntax
|
|
31
27
|
end
|
32
28
|
end
|
33
29
|
|
34
|
-
# Exported resources will raise warnings when outside a puppetmaster.
|
35
30
|
Puppet::Util::Log.close_all
|
31
|
+
errors.map! { |e| e.to_s }
|
32
|
+
|
33
|
+
# Exported resources will raise warnings when outside a puppetmaster.
|
36
34
|
errors.reject! { |e|
|
37
|
-
e
|
35
|
+
e =~ /^You cannot collect( exported resources)? without storeconfigs being set/
|
38
36
|
}
|
39
37
|
|
40
38
|
errors
|
41
39
|
end
|
40
|
+
|
41
|
+
private
|
42
|
+
def validate_manifest(file)
|
43
|
+
Puppet::Face[:parser, '0.0.1'].validate(file)
|
44
|
+
end
|
42
45
|
end
|
43
46
|
end
|
@@ -15,16 +15,24 @@ module PuppetSyntax
|
|
15
15
|
desc 'Syntax check Puppet manifests'
|
16
16
|
task :manifests do |t|
|
17
17
|
$stderr.puts "---> #{t.name}"
|
18
|
+
files = FileList["**/*.pp"]
|
19
|
+
files.reject! { |f| File.directory?(f) }
|
20
|
+
files = files.exclude(*PuppetSyntax.exclude_paths)
|
21
|
+
|
18
22
|
c = PuppetSyntax::Manifests.new
|
19
|
-
errors = c.check
|
23
|
+
errors = c.check(files)
|
20
24
|
fail errors.join("\n") unless errors.empty?
|
21
25
|
end
|
22
26
|
|
23
27
|
desc 'Syntax check Puppet templates'
|
24
28
|
task :templates do |t|
|
25
29
|
$stderr.puts "---> #{t.name}"
|
30
|
+
files = FileList["**/templates/**/*"]
|
31
|
+
files.reject! { |f| File.directory?(f) }
|
32
|
+
files = files.exclude(*PuppetSyntax.exclude_paths)
|
33
|
+
|
26
34
|
c = PuppetSyntax::Templates.new
|
27
|
-
errors = c.check
|
35
|
+
errors = c.check(files)
|
28
36
|
fail errors.join("\n") unless errors.empty?
|
29
37
|
end
|
30
38
|
end
|
@@ -1,18 +1,16 @@
|
|
1
|
-
require 'rake'
|
2
1
|
require 'erb'
|
3
2
|
require 'stringio'
|
4
3
|
|
5
4
|
module PuppetSyntax
|
6
5
|
class Templates
|
7
|
-
def check
|
6
|
+
def check(filelist)
|
7
|
+
raise "Expected an array of files" unless filelist.is_a?(Array)
|
8
|
+
|
8
9
|
# We now have to redirect STDERR in order to capture warnings.
|
9
10
|
$stderr = warnings = StringIO.new()
|
10
11
|
errors = []
|
11
12
|
|
12
|
-
|
13
|
-
matched_files = FileList["**/templates/**/*"].exclude(*PuppetSyntax.exclude_paths)
|
14
|
-
matched_files.reject! { |f| File.directory?(f) }
|
15
|
-
matched_files.each do |erb_file|
|
13
|
+
filelist.each do |erb_file|
|
16
14
|
begin
|
17
15
|
erb = ERB.new(File.read(erb_file), nil, '-')
|
18
16
|
erb.filename = erb_file
|
@@ -20,13 +18,15 @@ module PuppetSyntax
|
|
20
18
|
rescue NameError
|
21
19
|
# This is normal because we don't have the variables that would
|
22
20
|
# ordinarily be bound by the parent Puppet manifest.
|
23
|
-
rescue
|
21
|
+
rescue SyntaxError => error
|
24
22
|
errors << error
|
25
23
|
end
|
26
24
|
end
|
27
25
|
|
28
26
|
$stderr = STDERR
|
29
27
|
errors << warnings.string unless warnings.string.empty?
|
28
|
+
errors.map! { |e| e.to_s }
|
29
|
+
|
30
30
|
errors
|
31
31
|
end
|
32
32
|
end
|
@@ -0,0 +1 @@
|
|
1
|
+
<%= this_variable_has_not_been_bound %>
|
@@ -1,29 +1,57 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe PuppetSyntax::Manifests do
|
4
|
+
let(:subject) { PuppetSyntax::Manifests.new }
|
5
|
+
|
6
|
+
it 'should expect an array of files' do
|
7
|
+
expect { subject.check(nil) }.to raise_error(/Expected an array of files/)
|
8
|
+
end
|
9
|
+
|
4
10
|
it 'should return nothing from a valid file' do
|
5
|
-
|
11
|
+
files = fixture_manifests('pass.pp')
|
12
|
+
res = subject.check(files)
|
13
|
+
|
14
|
+
res.should == []
|
6
15
|
end
|
7
16
|
|
8
17
|
it 'should return an error from an invalid file' do
|
9
|
-
|
18
|
+
files = fixture_manifests('fail_error.pp')
|
19
|
+
res = subject.check(files)
|
20
|
+
|
21
|
+
res.should have(1).items
|
22
|
+
res.first.should match(/Syntax error at '\}' .*:3$/)
|
10
23
|
end
|
11
24
|
|
12
25
|
it 'should return a warning from an invalid file' do
|
13
|
-
|
14
|
-
|
26
|
+
files = fixture_manifests('fail_warning.pp')
|
27
|
+
res = subject.check(files)
|
28
|
+
|
29
|
+
res.should have(2).items
|
30
|
+
res[0].should match(/Unrecognised escape sequence '\\\[' .* at line 3$/)
|
31
|
+
res[1].should match(/Unrecognised escape sequence '\\\]' .* at line 3$/)
|
15
32
|
end
|
16
33
|
|
17
34
|
it 'should ignore warnings about storeconfigs' do
|
18
|
-
|
19
|
-
|
35
|
+
files = fixture_manifests('pass_storeconfigs.pp')
|
36
|
+
res = subject.check(files)
|
37
|
+
|
38
|
+
res.should == []
|
20
39
|
end
|
21
40
|
|
22
41
|
it 'should read more than one valid file' do
|
23
|
-
|
42
|
+
files = fixture_manifests(['pass.pp', 'pass_storeconfigs.pp'])
|
43
|
+
res = subject.check(files)
|
44
|
+
|
45
|
+
res.should == []
|
24
46
|
end
|
25
47
|
|
26
48
|
it 'should continue after finding an error in the first file' do
|
27
|
-
|
49
|
+
files = fixture_manifests(['fail_error.pp', 'fail_warning.pp'])
|
50
|
+
res = subject.check(files)
|
51
|
+
|
52
|
+
res.should have(3).items
|
53
|
+
res[0].should match(/Syntax error at '\}' .*:3$/)
|
54
|
+
res[1].should match(/Unrecognised escape sequence '\\\[' .* at line 3$/)
|
55
|
+
res[2].should match(/Unrecognised escape sequence '\\\]' .* at line 3$/)
|
28
56
|
end
|
29
57
|
end
|
@@ -1,32 +1,55 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe PuppetSyntax::Templates do
|
4
|
+
let(:subject) { PuppetSyntax::Templates.new }
|
5
|
+
|
6
|
+
it 'should expect an array of files' do
|
7
|
+
expect { subject.check(nil) }.to raise_error(/Expected an array of files/)
|
8
|
+
end
|
9
|
+
|
4
10
|
it 'should return nothing from a valid file' do
|
5
|
-
|
11
|
+
files = fixture_templates('pass.erb')
|
12
|
+
res = subject.check(files)
|
13
|
+
|
14
|
+
res.should == []
|
6
15
|
end
|
7
16
|
|
8
17
|
it 'should ignore NameErrors from unbound variables' do
|
9
|
-
|
10
|
-
|
18
|
+
files = fixture_templates('pass_unbound_var.erb')
|
19
|
+
res = subject.check(files)
|
11
20
|
|
12
|
-
|
13
|
-
pending
|
21
|
+
res.should == []
|
14
22
|
end
|
15
23
|
|
16
24
|
it 'should catch SyntaxError' do
|
17
|
-
|
25
|
+
files = fixture_templates('fail_error.erb')
|
26
|
+
res = subject.check(files)
|
27
|
+
|
28
|
+
res.should have(1).items
|
29
|
+
res.first.should match(/2: syntax error, unexpected/)
|
18
30
|
end
|
19
31
|
|
20
32
|
it 'should catch Ruby warnings' do
|
21
|
-
|
22
|
-
|
33
|
+
files = fixture_templates('fail_warning.erb')
|
34
|
+
res = subject.check(files)
|
35
|
+
|
36
|
+
res.should have(1).items
|
37
|
+
res.first.should match(/2: warning: found = in conditional/)
|
23
38
|
end
|
24
39
|
|
25
40
|
it 'should read more than one valid file' do
|
26
|
-
|
41
|
+
files = fixture_templates(['pass.erb', 'pass_unbound_var.erb'])
|
42
|
+
res = subject.check(files)
|
43
|
+
|
44
|
+
res.should == []
|
27
45
|
end
|
28
46
|
|
29
47
|
it 'should continue after finding an error in the first file' do
|
30
|
-
|
48
|
+
files = fixture_templates(['fail_error.erb', 'fail_warning.erb'])
|
49
|
+
res = subject.check(files)
|
50
|
+
|
51
|
+
res.should have(2).items
|
52
|
+
res[0].should match(/2: syntax error, unexpected/)
|
53
|
+
res[1].should match(/2: warning: found = in conditional/)
|
31
54
|
end
|
32
55
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -1,6 +1,19 @@
|
|
1
1
|
require 'rspec'
|
2
2
|
require 'puppet-syntax'
|
3
3
|
|
4
|
+
def fixture_templates(list)
|
5
|
+
fixture_files(list, 'templates')
|
6
|
+
end
|
7
|
+
|
8
|
+
def fixture_manifests(list)
|
9
|
+
fixture_files(list, 'manifests')
|
10
|
+
end
|
11
|
+
|
12
|
+
def fixture_files(list, path)
|
13
|
+
list = [list].flatten
|
14
|
+
list.map { |f| File.expand_path("../fixtures/test_module/#{path}/#{f}", __FILE__) }
|
15
|
+
end
|
16
|
+
|
4
17
|
RSpec.configure do |config|
|
5
18
|
config.color_enabled = true
|
6
19
|
config.formatter = 'documentation'
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: puppet-syntax
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 1.0.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-
|
12
|
+
date: 2013-07-04 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rake
|
@@ -100,6 +100,7 @@ extra_rdoc_files: []
|
|
100
100
|
files:
|
101
101
|
- .gitignore
|
102
102
|
- .travis.yml
|
103
|
+
- CHANGELOG
|
103
104
|
- Gemfile
|
104
105
|
- LICENSE.txt
|
105
106
|
- README.md
|
@@ -110,7 +111,16 @@ files:
|
|
110
111
|
- lib/puppet-syntax/templates.rb
|
111
112
|
- lib/puppet-syntax/version.rb
|
112
113
|
- puppet-syntax.gemspec
|
114
|
+
- spec/fixtures/test_module/manifests/fail_error.pp
|
115
|
+
- spec/fixtures/test_module/manifests/fail_warning.pp
|
116
|
+
- spec/fixtures/test_module/manifests/pass.pp
|
117
|
+
- spec/fixtures/test_module/manifests/pass_storeconfigs.pp
|
118
|
+
- spec/fixtures/test_module/templates/fail_error.erb
|
119
|
+
- spec/fixtures/test_module/templates/fail_warning.erb
|
120
|
+
- spec/fixtures/test_module/templates/pass.erb
|
121
|
+
- spec/fixtures/test_module/templates/pass_unbound_var.erb
|
113
122
|
- spec/puppet-syntax/manifests_spec.rb
|
123
|
+
- spec/puppet-syntax/tasks/puppet-syntax_spec.rb
|
114
124
|
- spec/puppet-syntax/templates_spec.rb
|
115
125
|
- spec/puppet-syntax_spec.rb
|
116
126
|
- spec/spec_helper.rb
|
@@ -129,7 +139,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
129
139
|
version: '0'
|
130
140
|
segments:
|
131
141
|
- 0
|
132
|
-
hash: -
|
142
|
+
hash: -368354706311963489
|
133
143
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
134
144
|
none: false
|
135
145
|
requirements:
|
@@ -138,7 +148,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
138
148
|
version: '0'
|
139
149
|
segments:
|
140
150
|
- 0
|
141
|
-
hash: -
|
151
|
+
hash: -368354706311963489
|
142
152
|
requirements: []
|
143
153
|
rubyforge_project:
|
144
154
|
rubygems_version: 1.8.23
|
@@ -146,7 +156,16 @@ signing_key:
|
|
146
156
|
specification_version: 3
|
147
157
|
summary: ''
|
148
158
|
test_files:
|
159
|
+
- spec/fixtures/test_module/manifests/fail_error.pp
|
160
|
+
- spec/fixtures/test_module/manifests/fail_warning.pp
|
161
|
+
- spec/fixtures/test_module/manifests/pass.pp
|
162
|
+
- spec/fixtures/test_module/manifests/pass_storeconfigs.pp
|
163
|
+
- spec/fixtures/test_module/templates/fail_error.erb
|
164
|
+
- spec/fixtures/test_module/templates/fail_warning.erb
|
165
|
+
- spec/fixtures/test_module/templates/pass.erb
|
166
|
+
- spec/fixtures/test_module/templates/pass_unbound_var.erb
|
149
167
|
- spec/puppet-syntax/manifests_spec.rb
|
168
|
+
- spec/puppet-syntax/tasks/puppet-syntax_spec.rb
|
150
169
|
- spec/puppet-syntax/templates_spec.rb
|
151
170
|
- spec/puppet-syntax_spec.rb
|
152
171
|
- spec/spec_helper.rb
|