puppet-validator 0.0.7 → 0.0.8
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/README.md +20 -1
- data/bin/grapher +44 -0
- data/bin/puppet-validator +10 -0
- data/config.ru +15 -0
- data/lib/puppet-validator.rb +46 -6
- data/public/relationships.html +59 -0
- data/public/styles.css +15 -6
- data/views/index.erb +30 -17
- data/views/result.erb +21 -6
- metadata +23 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 67c8ee96635e89f10fdb0562b7c34444aaa46090
|
4
|
+
data.tar.gz: 832192f6b3ee57c0f418fe86d12dbc2dbdd99c4a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: be779caf3b0cd291459dcb74c4b48608e6e731babfa3fbb42bbf76b054a349dc3e600d2319c9fe27c08741a84222dccc561ffbc564641871748f6088d566866d
|
7
|
+
data.tar.gz: b52bfc8a76c77bfd87661dbb964a85411c628f3e5c7c17d4d97b3bf05c757d67e95569b260a2f8d91d1af46aa2e21771ff84c33af08811d68dc86937f7a8c636
|
data/README.md
CHANGED
@@ -29,7 +29,11 @@ Options:
|
|
29
29
|
/var/log/puppet-validator if no filename is passed.
|
30
30
|
-p, --port PORT Port to listen on. Defaults to 9000.
|
31
31
|
-t, --theme THEMEDIR Path to the theme directory.
|
32
|
-
|
32
|
+
-x, --csrf Protect from cross site request forgery. Requires code to be
|
33
|
+
submitted for validation via the webpage.
|
34
|
+
-g, --graph Generate relationship graphs from validated code. Requires
|
35
|
+
`graphviz` to be installed.
|
36
|
+
|
33
37
|
-h, --help Displays this help
|
34
38
|
|
35
39
|
#### Integrating with Middleware
|
@@ -80,8 +84,23 @@ logger.level = Logger::WARN
|
|
80
84
|
PuppetValidator.set :puppet_versions, Dir.glob('*').select {|f| File.symlink? f and File.readlink(f) == '.' }
|
81
85
|
PuppetValidator.set :root, File.dirname(__FILE__)
|
82
86
|
PuppetValidator.set :logger, logger
|
87
|
+
|
88
|
+
# List out the lint checks you want disabled. By default, this will enable
|
89
|
+
# all installed checks. puppet-lint --help will list known checks.
|
90
|
+
#
|
83
91
|
PuppetValidator.set :disabled_lint_checks, ['80chars']
|
84
92
|
|
93
|
+
# Protect from cross site request forgery. With this set, code may be
|
94
|
+
# submitted for validation by the website only.
|
95
|
+
#
|
96
|
+
# Note: This will currently break multiple version validation.
|
97
|
+
PuppetValidator.set :csrf, false
|
98
|
+
|
99
|
+
# Provide the option to generate relationship graphs from validated code.
|
100
|
+
# This requires that the `graphviz` package be installed.
|
101
|
+
#
|
102
|
+
PuppetValidator.set :graph, false
|
103
|
+
|
85
104
|
run PuppetValidator
|
86
105
|
```
|
87
106
|
|
data/bin/grapher
ADDED
@@ -0,0 +1,44 @@
|
|
1
|
+
#! /usr/bin/env ruby
|
2
|
+
require 'puppet'
|
3
|
+
require 'graphviz'
|
4
|
+
|
5
|
+
Puppet.initialize_settings
|
6
|
+
|
7
|
+
Puppet[:code] = <<-EOF
|
8
|
+
|
9
|
+
notify { 'hello there':
|
10
|
+
require => File['/tmp/foo'],
|
11
|
+
}
|
12
|
+
file { '/tmp/foo':
|
13
|
+
ensure => file,
|
14
|
+
}
|
15
|
+
notify { 'goodbye':
|
16
|
+
require => File['/tmp/nope'],
|
17
|
+
}
|
18
|
+
|
19
|
+
file{'/tmp/nope':}
|
20
|
+
|
21
|
+
poodles{'oogles': }
|
22
|
+
|
23
|
+
define poodles {}
|
24
|
+
EOF
|
25
|
+
|
26
|
+
|
27
|
+
node = Puppet::Node.indirection.find(Puppet[:node_name_value])
|
28
|
+
catalog = Puppet::Resource::Catalog.indirection.find(node.name, :use_node => node).to_ral
|
29
|
+
|
30
|
+
#catalog.vertices.each { |v| catalog.remove_vertex! v if v.is_a? Puppet::Type::Stage }
|
31
|
+
#catalog.vertices.each { |v| catalog.remove_vertex! v if v.is_a? Puppet::Type::Component }
|
32
|
+
|
33
|
+
graph = catalog.relationship_graph.to_dot
|
34
|
+
|
35
|
+
GraphViz.parse_string(graph) do |graph|
|
36
|
+
graph[:label] = 'Resource Relationships'
|
37
|
+
|
38
|
+
w = graph.get_node('Whit[Admissible_class[Main]]')
|
39
|
+
w[:label] = 'Start'
|
40
|
+
|
41
|
+
w = graph.get_node('Whit[Completed_class[Main]]')
|
42
|
+
w[:label] = 'Finish'
|
43
|
+
|
44
|
+
end.output(:svg => "sample.svg")
|
data/bin/puppet-validator
CHANGED
@@ -10,6 +10,8 @@ options = {
|
|
10
10
|
:host => '0.0.0.0',
|
11
11
|
:bind => '0.0.0.0',
|
12
12
|
:root => gemroot,
|
13
|
+
:csrf => false,
|
14
|
+
:graph => false,
|
13
15
|
}
|
14
16
|
logfile = $stderr
|
15
17
|
loglevel = Logger::WARN
|
@@ -45,6 +47,14 @@ optparse = OptionParser.new { |opts|
|
|
45
47
|
options[:root] = arg
|
46
48
|
end
|
47
49
|
|
50
|
+
opts.on("-x", "--csrf", "Protect from cross site request forgery. Requires code to be submitted for validation via the webpage.") do
|
51
|
+
options[:csrf] = true
|
52
|
+
end
|
53
|
+
|
54
|
+
opts.on("-g", "--graph", "Generate relationship graphs from validated code. Requires `graphviz` to be installed.") do
|
55
|
+
options[:graph] = true
|
56
|
+
end
|
57
|
+
|
48
58
|
opts.separator('')
|
49
59
|
|
50
60
|
opts.on("-h", "--help", "Displays this help") do
|
data/config.ru
CHANGED
@@ -7,6 +7,21 @@ logger.level = Logger::WARN
|
|
7
7
|
PuppetValidator.set :puppet_versions, Dir.glob('*').select {|f| File.symlink? f and File.readlink(f) == '.' }
|
8
8
|
PuppetValidator.set :root, File.dirname(__FILE__)
|
9
9
|
PuppetValidator.set :logger, logger
|
10
|
+
|
11
|
+
# List out the lint checks you want disabled. By default, this will enable
|
12
|
+
# all installed checks. puppet-lint --help will list known checks.
|
13
|
+
#
|
10
14
|
PuppetValidator.set :disabled_lint_checks, ['80chars']
|
11
15
|
|
16
|
+
# Protect from cross site request forgery. With this set, code may be
|
17
|
+
# submitted for validation by the website only.
|
18
|
+
#
|
19
|
+
# Note: This will currently break multiple version validation.
|
20
|
+
PuppetValidator.set :csrf, false
|
21
|
+
|
22
|
+
# Provide the option to generate relationship graphs from validated code.
|
23
|
+
# This requires that the `graphviz` package be installed.
|
24
|
+
#
|
25
|
+
PuppetValidator.set :graph, false
|
26
|
+
|
12
27
|
run PuppetValidator
|
data/lib/puppet-validator.rb
CHANGED
@@ -5,6 +5,7 @@ require 'puppet'
|
|
5
5
|
require 'puppet/parser'
|
6
6
|
require 'puppet-lint'
|
7
7
|
|
8
|
+
require 'graphviz'
|
8
9
|
require 'nokogiri'
|
9
10
|
require 'cgi'
|
10
11
|
|
@@ -21,17 +22,19 @@ class PuppetValidator < Sinatra::Base
|
|
21
22
|
before do
|
22
23
|
env["rack.logger"] = settings.logger if settings.logger
|
23
24
|
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
25
|
+
if settings.csrf
|
26
|
+
session[:csrf] ||= SecureRandom.hex(32)
|
27
|
+
response.set_cookie 'authenticity_token', {
|
28
|
+
:value => session[:csrf],
|
29
|
+
:expires => Time.now + (60 * 60 * 24),
|
30
|
+
}
|
31
|
+
end
|
29
32
|
end
|
30
33
|
|
31
34
|
def initialize(app=nil)
|
32
35
|
super(app)
|
33
36
|
|
34
|
-
Puppet.initialize_settings
|
37
|
+
Puppet.initialize_settings rescue nil
|
35
38
|
|
36
39
|
# there must be a better way
|
37
40
|
if settings.respond_to? :disabled_lint_checks
|
@@ -114,6 +117,7 @@ class PuppetValidator < Sinatra::Base
|
|
114
117
|
acc.merge({item[:line] => "#{item[:kind].upcase}: #{item[:message]}"})
|
115
118
|
end.to_json
|
116
119
|
|
120
|
+
@relationships = rendered_dot(@code) if params['relationships'] == 'on'
|
117
121
|
else
|
118
122
|
@message = "Submitted code size is #{request.body.size}, which is larger than the maximum size of #{MAXSIZE}."
|
119
123
|
@status = :fail
|
@@ -130,6 +134,7 @@ class PuppetValidator < Sinatra::Base
|
|
130
134
|
helpers do
|
131
135
|
|
132
136
|
def safe?
|
137
|
+
return true unless settings.csrf
|
133
138
|
if session[:csrf] == params['_csrf'] && session[:csrf] == request.cookies['authenticity_token']
|
134
139
|
true
|
135
140
|
else
|
@@ -198,5 +203,40 @@ class PuppetValidator < Sinatra::Base
|
|
198
203
|
PuppetLint.configuration.checks.map {|check| check.to_s}
|
199
204
|
end
|
200
205
|
|
206
|
+
def rendered_dot(code)
|
207
|
+
return unless settings.graph
|
208
|
+
|
209
|
+
begin
|
210
|
+
Puppet::Node::Facts.indirection.terminus_class = :memory
|
211
|
+
Puppet::Node.indirection.cache_class = nil
|
212
|
+
node = Puppet::Node.indirection.find(Puppet[:node_name_value])
|
213
|
+
catalog = Puppet::Resource::Catalog.indirection.find(node.name, :use_node => node)
|
214
|
+
|
215
|
+
catalog.remove_resource(catalog.resource("Stage", :main))
|
216
|
+
catalog.remove_resource(catalog.resource("Class", :settings))
|
217
|
+
|
218
|
+
graph = catalog.to_ral.relationship_graph.to_dot
|
219
|
+
|
220
|
+
svg = GraphViz.parse_string(graph) do |graph|
|
221
|
+
graph[:label] = 'Resource Relationships'
|
222
|
+
|
223
|
+
graph.each_node do |name, node|
|
224
|
+
next unless name.start_with? 'Whit'
|
225
|
+
newname = name.dup
|
226
|
+
newname.sub!('Admissible_class', 'Starting Class')
|
227
|
+
newname.sub!('Completed_class', 'Finishing Class')
|
228
|
+
node[:label] = newname[5..-2]
|
229
|
+
end
|
230
|
+
end.output(:svg => String)
|
231
|
+
|
232
|
+
rescue => detail
|
233
|
+
logger.warn detail.message
|
234
|
+
logger.debug detail.backtrace.join "\n"
|
235
|
+
return { :status => false, :message => detail.message }
|
236
|
+
end
|
237
|
+
|
238
|
+
{ :status => true, :data => svg }
|
239
|
+
end
|
240
|
+
|
201
241
|
end
|
202
242
|
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
<html>
|
2
|
+
<head>
|
3
|
+
<title>Puppet Validator</title>
|
4
|
+
<link rel="stylesheet" href="styles.css">
|
5
|
+
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.0/jquery.min.js"></script>
|
6
|
+
</head>
|
7
|
+
<body>
|
8
|
+
<a href="https://github.com/puppetlabs/puppet-validator"><img style="position: absolute; top: 0; right: 0; border: 0;" src="https://camo.githubusercontent.com/365986a132ccd6a44c23a9169022c0b5c890c387/68747470733a2f2f73332e616d617a6f6e6177732e636f6d2f6769746875622f726962626f6e732f666f726b6d655f72696768745f7265645f6161303030302e706e67" alt="Fork me on GitHub" data-canonical-src="https://s3.amazonaws.com/github/ribbons/forkme_right_red_aa0000.png"></a>
|
9
|
+
<h1>Interpreting Relationship Graphs</h1>
|
10
|
+
<p>
|
11
|
+
This tool will compile a catalog, using <em>only the information you provide</em>.
|
12
|
+
This means that all facts will be empty, and custom resources types, such as the
|
13
|
+
<em>mysql_grant</em> type (installed via the <code>puppetlabs/mysql</code> module)
|
14
|
+
will cause an <code>unknown resource type</code> failure.
|
15
|
+
</p>
|
16
|
+
<p>
|
17
|
+
If you need to test code that depends on fact values you should define a variable
|
18
|
+
with the same name at the top of your code.
|
19
|
+
</p>
|
20
|
+
<div class="results">
|
21
|
+
<pre><code># fake fact(s)
|
22
|
+
$osfamily = 'RedHat'
|
23
|
+
|
24
|
+
case $osfamily {
|
25
|
+
'RedHat': { notify { 'This is a RedHat family node': } }
|
26
|
+
default : { notify { "I don't know what ${osfamily} is.": } }
|
27
|
+
}</code></pre>
|
28
|
+
</div>
|
29
|
+
<p>
|
30
|
+
If you are testing a class, you will need to <code>include</code> it or it won't
|
31
|
+
appear in the catalog.
|
32
|
+
</p>
|
33
|
+
<div class="results">
|
34
|
+
<pre><code>class silly {
|
35
|
+
file { '/tmp/foo':
|
36
|
+
ensure => file,
|
37
|
+
before => Notify['hi'],
|
38
|
+
}
|
39
|
+
notify { 'hi': }
|
40
|
+
}
|
41
|
+
|
42
|
+
#include the class in the rendered catalog.
|
43
|
+
include silly</code></pre>
|
44
|
+
</div>
|
45
|
+
<p>
|
46
|
+
Any class or type you use or set a relationship on <strong>must be defined</strong>,
|
47
|
+
or Puppet won't be able to autoload it.
|
48
|
+
<p>
|
49
|
+
<div class="results">
|
50
|
+
<pre><code>include apache
|
51
|
+
|
52
|
+
class apache {
|
53
|
+
# a stub class so the catalog will compile.
|
54
|
+
}</code></pre>
|
55
|
+
</div>
|
56
|
+
|
57
|
+
<div class="links"><a href="javascript:history.back();">Try Again</a> • <a href="/">Validate More Code</a></div>
|
58
|
+
</body>
|
59
|
+
</html>
|
data/public/styles.css
CHANGED
@@ -40,7 +40,8 @@ div.line-highlight.with-tooltip {
|
|
40
40
|
display: block;
|
41
41
|
}
|
42
42
|
|
43
|
-
.results
|
43
|
+
.results,
|
44
|
+
.warning {
|
44
45
|
width: 65%;
|
45
46
|
border: 1px solid black;
|
46
47
|
border-radius: 0.25em;
|
@@ -83,6 +84,13 @@ div.line-highlight.with-tooltip {
|
|
83
84
|
padding-right: 0.5em;
|
84
85
|
}
|
85
86
|
|
87
|
+
.relationships {
|
88
|
+
text-align: center;
|
89
|
+
}
|
90
|
+
.warning {
|
91
|
+
background-color: #ffb6b6;
|
92
|
+
}
|
93
|
+
|
86
94
|
div.links {
|
87
95
|
margin: 1em auto;
|
88
96
|
padding: 0.5em;
|
@@ -101,9 +109,13 @@ div.entry {
|
|
101
109
|
width: 100%;
|
102
110
|
font-family: monospace;
|
103
111
|
}
|
112
|
+
div.row {
|
113
|
+
text-align: center;
|
114
|
+
}
|
104
115
|
|
105
116
|
input#validate,
|
106
|
-
select#versions
|
117
|
+
select#versions,
|
118
|
+
a#customize {
|
107
119
|
margin-right: 2em;
|
108
120
|
}
|
109
121
|
|
@@ -135,7 +147,7 @@ fieldset.menu ul {
|
|
135
147
|
column-gap: 20px;
|
136
148
|
}
|
137
149
|
|
138
|
-
|
150
|
+
.info {
|
139
151
|
background: #fefefe url('info.png') no-repeat 5px 5px !important;
|
140
152
|
border: 1px solid #efefef;
|
141
153
|
padding: 0.5em;
|
@@ -147,9 +159,6 @@ p.info {
|
|
147
159
|
-khtml-border-radius: 0.5em;
|
148
160
|
border-radius: 0.5em;
|
149
161
|
}
|
150
|
-
p.info:first-line {
|
151
|
-
font-weight: bold;
|
152
|
-
}
|
153
162
|
|
154
163
|
/* jquery UI overrides */
|
155
164
|
.ui-widget {
|
data/views/index.erb
CHANGED
@@ -10,19 +10,24 @@
|
|
10
10
|
<h1>Puppet Code Validator</h1>
|
11
11
|
<p>Paste Puppet code into the following textbox and check it for validity.</p>
|
12
12
|
<form action="/validate" method="post">
|
13
|
-
|
13
|
+
<% if settings.csrf %><input name="_csrf", type="hidden" value="<%= session[:csrf] %>" /><% end %>
|
14
14
|
<div class="entry">
|
15
15
|
<textarea name="code" id="code" cols="65" rows="25"></textarea>
|
16
|
-
<
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
<
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
16
|
+
<div class="row">
|
17
|
+
<input type="submit" value="Validate" id="validate">
|
18
|
+
</div>
|
19
|
+
<div class="row">
|
20
|
+
Puppet version
|
21
|
+
<select id="versions">
|
22
|
+
<% version = @versions.shift %><option value='/'><%= version %></option>
|
23
|
+
<% @versions.each do |version| %>
|
24
|
+
<option><%= version %></option>
|
25
|
+
<% end %>
|
26
|
+
</select>
|
27
|
+
<label><input type="checkbox" name="lint" id="lint" onchange="toggleChecks();">Include <code>puppet-lint</code> style checks.</label>
|
28
|
+
<a id="customize" class="button" href="javascript:toggleMenu();">customize ▾</a>
|
29
|
+
<% if settings.graph %><label><input type="checkbox" name="relationships" id="relationships">Show relationships.</label><% end %>
|
30
|
+
</div>
|
26
31
|
<fieldset id="checks-menu" class="menu">
|
27
32
|
<legend>Enabled Lint Checks</legend>
|
28
33
|
<ul id="checks">
|
@@ -35,11 +40,19 @@
|
|
35
40
|
</fieldset>
|
36
41
|
</div>
|
37
42
|
</form>
|
38
|
-
<
|
39
|
-
Be aware that
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
43
|
+
<div class="info">
|
44
|
+
<p><strong>Be aware that valid syntax does not mean you have valid code.</strong></p>
|
45
|
+
<p>
|
46
|
+
The validator <em>only validates syntax</em> and doesn't actually compile or enforce
|
47
|
+
a catalog. This means that there are many mistakes that it will not identify. See
|
48
|
+
<a href="/testing.html">more information</a> on testing and validating Puppet code.
|
49
|
+
</p>
|
50
|
+
<p>
|
51
|
+
If you show relationships, then we'll try to compile an abbreviated catalog. This
|
52
|
+
won't use any facts, and won't know how to compile non-core resource types. See
|
53
|
+
<a href="/relationships.html">more information</a> on building a self-contained
|
54
|
+
catalog in order to generate a dependency graph.
|
55
|
+
</p>
|
56
|
+
</div>
|
44
57
|
</body>
|
45
58
|
</html>
|
data/views/result.erb
CHANGED
@@ -36,12 +36,27 @@
|
|
36
36
|
<% end %>
|
37
37
|
</fieldset>
|
38
38
|
<pre data-line='<%= @highlights %>' class="line-numbers language-puppet"><code id="code" class="line-numbers language-puppet"><%= @code %></code></pre>
|
39
|
+
<% if @relationships %>
|
40
|
+
<% if @relationships[:status] %>
|
41
|
+
<div class="relationships"><%= @relationships[:data] %></div>
|
42
|
+
<% else %>
|
43
|
+
<div class="warning"><%= @relationships[:message] %></div>
|
44
|
+
<% end %>
|
45
|
+
<% end %>
|
39
46
|
<div class="links"><a href="javascript:history.back();">Try Again</a> • <a href="/">Validate More Code</a></div>
|
40
|
-
<
|
41
|
-
Be aware that
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
47
|
+
<div class="info">
|
48
|
+
<p><strong>Be aware that valid syntax does not mean you have valid code.</strong></p>
|
49
|
+
<p>
|
50
|
+
The validator <em>only validates syntax</em> and doesn't actually compile or enforce
|
51
|
+
a catalog. This means that there are many mistakes that it will not identify. See
|
52
|
+
<a href="/testing.html">more information</a> on testing and validating Puppet code.
|
53
|
+
</p>
|
54
|
+
<p>
|
55
|
+
If you show relationships, then we'll try to compile an abbreviated catalog. This
|
56
|
+
won't use any facts, and won't know how to compile non-core resource types. See
|
57
|
+
<a href="/relationships.html">more information</a> on building a self-contained
|
58
|
+
catalog in order to generate a dependency graph.
|
59
|
+
</p>
|
60
|
+
</div>
|
46
61
|
</body>
|
47
62
|
</html>
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: puppet-validator
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.8
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ben Ford
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-03-
|
11
|
+
date: 2017-03-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: sinatra
|
@@ -78,6 +78,20 @@ dependencies:
|
|
78
78
|
- - ">="
|
79
79
|
- !ruby/object:Gem::Version
|
80
80
|
version: 1.6.5
|
81
|
+
- !ruby/object:Gem::Dependency
|
82
|
+
name: ruby-graphviz
|
83
|
+
requirement: !ruby/object:Gem::Requirement
|
84
|
+
requirements:
|
85
|
+
- - "~>"
|
86
|
+
- !ruby/object:Gem::Version
|
87
|
+
version: '1.2'
|
88
|
+
type: :runtime
|
89
|
+
prerelease: false
|
90
|
+
version_requirements: !ruby/object:Gem::Requirement
|
91
|
+
requirements:
|
92
|
+
- - "~>"
|
93
|
+
- !ruby/object:Gem::Version
|
94
|
+
version: '1.2'
|
81
95
|
description: |2
|
82
96
|
Puppet Validator is a simple web service that accepts arbitrary code submissions and
|
83
97
|
validates it the way `puppet parser validate` would. It can optionally also
|
@@ -88,20 +102,22 @@ executables:
|
|
88
102
|
extensions: []
|
89
103
|
extra_rdoc_files: []
|
90
104
|
files:
|
91
|
-
- LICENSE
|
92
105
|
- README.md
|
93
|
-
-
|
106
|
+
- LICENSE
|
94
107
|
- config.ru
|
108
|
+
- bin/puppet-validator
|
95
109
|
- lib/puppet-validator.rb
|
110
|
+
- bin/grapher
|
111
|
+
- views/index.erb
|
112
|
+
- views/result.erb
|
96
113
|
- public/gist.png
|
97
114
|
- public/info.png
|
98
115
|
- public/prism-default.css
|
99
116
|
- public/prism.js
|
117
|
+
- public/relationships.html
|
100
118
|
- public/scripts.js
|
101
119
|
- public/styles.css
|
102
120
|
- public/testing.html
|
103
|
-
- views/index.erb
|
104
|
-
- views/result.erb
|
105
121
|
homepage: https://github.com/puppetlabs/puppet-validator/
|
106
122
|
licenses:
|
107
123
|
- Apache-2.0
|
@@ -122,7 +138,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
122
138
|
version: '0'
|
123
139
|
requirements: []
|
124
140
|
rubyforge_project:
|
125
|
-
rubygems_version: 2.
|
141
|
+
rubygems_version: 2.0.14.1
|
126
142
|
signing_key:
|
127
143
|
specification_version: 4
|
128
144
|
summary: Puppet code validator as a service
|