kafo_parsers 0.1.6 → 1.2.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 +5 -5
- data/README.md +5 -19
- data/lib/kafo_parsers/parsers.rb +1 -2
- data/lib/kafo_parsers/puppet_strings_module_parser.rb +47 -9
- data/lib/kafo_parsers/version.rb +1 -1
- metadata +24 -27
- data/lib/kafo_parsers/puppet_module_parser.rb +0 -138
- data/lib/kafo_parsers/validation.rb +0 -14
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: f510d851fccf71e96f9fd835195990a4e669fd5722592f1673823a4a651eeb77
|
4
|
+
data.tar.gz: e98e7f725fd65d900371fef825db343b25fedd70ac9aee21edaeeaef25ca7d98
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cdbe4e4c5ebab2e4e41f29209c4b84f8c595e7585f0deb1d8f94ae2c90519810874b76458a96acf98255de9721c3502cbbd97390829180caa125bcda0673778b
|
7
|
+
data.tar.gz: da851240e0bde3e0fe253b9c3e9e6953fb83e21eea8c15740f28df6065192b0d446c4dcc7825d0d8204ebcdfb4368c69238e0d978a3cf598d10115e21fd5485e
|
data/README.md
CHANGED
@@ -44,34 +44,21 @@ KafoParsers::Parsers.find_available(:logger => logger)
|
|
44
44
|
|
45
45
|
To load a specific parser:
|
46
46
|
```ruby
|
47
|
-
require 'kafo_parsers/
|
48
|
-
hash = KafoParsers::
|
47
|
+
require 'kafo_parsers/puppet_strings_module_parser'
|
48
|
+
hash = KafoParsers::PuppetStringsModuleParser.parse('/puppet/module/manifests/init.pp')
|
49
49
|
```
|
50
50
|
|
51
|
-
#### PuppetModuleParser
|
52
|
-
|
53
|
-
The standard PuppetModuleParser loads Puppet as a regular library or gem, so it
|
54
|
-
must be installed in the same Ruby that's running kafo_parsers.
|
55
|
-
|
56
|
-
Only Puppet versions 2.6.x, 2.7.x and 3.x are supported.
|
57
|
-
|
58
|
-
Add `gem 'puppet', '< 4'` to your application's Gemfile to use this.
|
59
|
-
|
60
51
|
#### PuppetStringsModuleParser
|
61
52
|
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
Puppet AIO installation.
|
53
|
+
Leverage puppet-strings to parse puppet manifests. This requires puppet-strings
|
54
|
+
1.2.0 or higher and may be installed either as a gem in the same environment,
|
55
|
+
or in a Puppet AIO installation.
|
66
56
|
|
67
57
|
```ruby
|
68
58
|
require 'kafo_parsers/puppet_strings_module_parser'
|
69
59
|
hash = KafoParsers::PuppetStringsModuleParser.parse('/puppet/module/manifests/init.pp')
|
70
60
|
```
|
71
61
|
|
72
|
-
Output will be similar to PuppetModuleParser, only validations are not supported,
|
73
|
-
since they are not parsed by puppet-strings.
|
74
|
-
|
75
62
|
## Documentation syntax
|
76
63
|
|
77
64
|
### RDoc syntax
|
@@ -110,7 +97,6 @@ Supports:
|
|
110
97
|
|
111
98
|
Used by:
|
112
99
|
|
113
|
-
* `PuppetModuleParser`
|
114
100
|
* `PuppetStringsModuleParser` (but deprecated, prefer YARD)
|
115
101
|
|
116
102
|
### YARD syntax
|
data/lib/kafo_parsers/parsers.rb
CHANGED
@@ -1,10 +1,9 @@
|
|
1
|
-
require 'kafo_parsers/puppet_module_parser.rb'
|
2
1
|
require 'kafo_parsers/puppet_strings_module_parser.rb'
|
3
2
|
|
4
3
|
module KafoParsers
|
5
4
|
module Parsers
|
6
5
|
def self.all
|
7
|
-
[
|
6
|
+
[ PuppetStringsModuleParser ]
|
8
7
|
end
|
9
8
|
|
10
9
|
def self.find_available(options = {})
|
@@ -1,5 +1,7 @@
|
|
1
1
|
# encoding: UTF-8
|
2
2
|
require 'json'
|
3
|
+
require 'open3'
|
4
|
+
|
3
5
|
require 'kafo_parsers/doc_parser'
|
4
6
|
require 'kafo_parsers/param_doc_parser'
|
5
7
|
|
@@ -25,25 +27,25 @@ module KafoParsers
|
|
25
27
|
end
|
26
28
|
|
27
29
|
def self.available?
|
28
|
-
|
29
|
-
if
|
30
|
+
_stdout, _stderr, status = run_puppet(['help', 'strings'])
|
31
|
+
if status.success?
|
30
32
|
return true
|
31
33
|
else
|
32
|
-
raise KafoParsers::ParserNotAvailable.new("#{puppet_bin} does not have strings module installed")
|
34
|
+
raise KafoParsers::ParserNotAvailable.new("#{puppet_bin} does not have strings module installed.")
|
33
35
|
end
|
34
36
|
end
|
35
37
|
|
36
38
|
def initialize(file)
|
37
39
|
@file = file = File.expand_path(file)
|
38
|
-
raise KafoParsers::ModuleName, "File not found #{file}, check your answer file" unless File.
|
40
|
+
raise KafoParsers::ModuleName, "File not found #{file}, check your answer file" unless File.exist?(file)
|
41
|
+
|
42
|
+
command = ['strings', 'generate', '--format', 'json', file]
|
43
|
+
@raw_json, stderr, status = self.class.run_puppet(command)
|
39
44
|
|
40
|
-
|
41
|
-
|
42
|
-
unless $?.success?
|
43
|
-
raise KafoParsers::ParseError, "'#{command}' returned error\n#{@raw_json}"
|
45
|
+
unless status.success?
|
46
|
+
raise KafoParsers::ParseError, "'#{command}' returned error:\n #{@raw_json}\n #{stderr}"
|
44
47
|
end
|
45
48
|
|
46
|
-
Encoding.default_external = Encoding::UTF_8 if defined?(Encoding)
|
47
49
|
begin
|
48
50
|
@complete_hash = ::JSON.parse(@raw_json)
|
49
51
|
rescue ::JSON::ParserError => e
|
@@ -131,6 +133,42 @@ module KafoParsers
|
|
131
133
|
|
132
134
|
private
|
133
135
|
|
136
|
+
def self.search_puppet_path(bin_name)
|
137
|
+
# Find the location of the puppet executable and use that to
|
138
|
+
# determine the path of all executables
|
139
|
+
bin_path = (::ENV['PATH'].split(File::PATH_SEPARATOR) + ['/opt/puppetlabs/bin']).find do |path|
|
140
|
+
File.executable?(File.join(path, 'puppet')) && File.executable?(File.join(path, bin_name))
|
141
|
+
end
|
142
|
+
File.join([bin_path, bin_name].compact)
|
143
|
+
end
|
144
|
+
|
145
|
+
def self.is_aio_puppet?
|
146
|
+
puppet_command = search_puppet_path('puppet')
|
147
|
+
File.realpath(puppet_command).start_with?('/opt/puppetlabs')
|
148
|
+
rescue Errno::ENOENT
|
149
|
+
false
|
150
|
+
end
|
151
|
+
|
152
|
+
def self.run_puppet(command)
|
153
|
+
command = command.unshift(self.puppet_bin)
|
154
|
+
|
155
|
+
if is_aio_puppet?
|
156
|
+
Open3.capture3(clean_env_vars, *command, :unsetenv_others => true)
|
157
|
+
else
|
158
|
+
Open3.capture3(::ENV, *command, :unsetenv_others => false)
|
159
|
+
end
|
160
|
+
end
|
161
|
+
|
162
|
+
def self.clean_env_vars
|
163
|
+
# Cleaning ENV vars and keeping required vars only because,
|
164
|
+
# When using SCL it adds GEM_HOME and GEM_PATH ENV vars.
|
165
|
+
whitelisted_vars = %w[HOME USER LANG]
|
166
|
+
|
167
|
+
cleaned_env = ::ENV.select { |var| whitelisted_vars.include?(var) || var.start_with?('LC_') }
|
168
|
+
cleaned_env['PATH'] = '/sbin:/bin:/usr/sbin:/usr/bin:/opt/puppetlabs/bin'
|
169
|
+
cleaned_env
|
170
|
+
end
|
171
|
+
|
134
172
|
# default values using puppet strings includes $ symbol, e.g. "$::foreman::params::ssl"
|
135
173
|
#
|
136
174
|
# values are reported as strings which is issue especially for :under
|
data/lib/kafo_parsers/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: kafo_parsers
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 1.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Marek Hulan
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-03-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -28,58 +28,58 @@ dependencies:
|
|
28
28
|
name: rake
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- - "
|
31
|
+
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '
|
33
|
+
version: '0'
|
34
34
|
type: :development
|
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: '
|
40
|
+
version: '0'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: minitest
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- - "
|
45
|
+
- - ">="
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: '
|
47
|
+
version: '0'
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- - "
|
52
|
+
- - ">="
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: '
|
54
|
+
version: '0'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: simplecov
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
|
-
- - "
|
59
|
+
- - ">="
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version: '0
|
61
|
+
version: '0'
|
62
62
|
type: :development
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
|
-
- - "
|
66
|
+
- - ">="
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version: '0
|
68
|
+
version: '0'
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
|
-
name:
|
70
|
+
name: ci_reporter_minitest
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
72
72
|
requirements:
|
73
|
-
- - "
|
73
|
+
- - ">="
|
74
74
|
- !ruby/object:Gem::Version
|
75
|
-
version:
|
75
|
+
version: '0'
|
76
76
|
type: :development
|
77
77
|
prerelease: false
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
|
-
- - "
|
80
|
+
- - ">="
|
81
81
|
- !ruby/object:Gem::Version
|
82
|
-
version:
|
82
|
+
version: '0'
|
83
83
|
- !ruby/object:Gem::Dependency
|
84
84
|
name: rdoc
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|
@@ -124,15 +124,13 @@ files:
|
|
124
124
|
- lib/kafo_parsers/exceptions.rb
|
125
125
|
- lib/kafo_parsers/param_doc_parser.rb
|
126
126
|
- lib/kafo_parsers/parsers.rb
|
127
|
-
- lib/kafo_parsers/puppet_module_parser.rb
|
128
127
|
- lib/kafo_parsers/puppet_strings_module_parser.rb
|
129
|
-
- lib/kafo_parsers/validation.rb
|
130
128
|
- lib/kafo_parsers/version.rb
|
131
129
|
homepage: https://github.com/theforeman/kafo_parsers
|
132
130
|
licenses:
|
133
|
-
-
|
131
|
+
- GPL-3.0+
|
134
132
|
metadata: {}
|
135
|
-
post_install_message:
|
133
|
+
post_install_message:
|
136
134
|
rdoc_options: []
|
137
135
|
require_paths:
|
138
136
|
- lib
|
@@ -147,9 +145,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
147
145
|
- !ruby/object:Gem::Version
|
148
146
|
version: '0'
|
149
147
|
requirements: []
|
150
|
-
|
151
|
-
|
152
|
-
signing_key:
|
148
|
+
rubygems_version: 3.1.4
|
149
|
+
signing_key:
|
153
150
|
specification_version: 4
|
154
151
|
summary: Puppet module parsers
|
155
152
|
test_files: []
|
@@ -1,138 +0,0 @@
|
|
1
|
-
# encoding: UTF-8
|
2
|
-
require 'kafo_parsers/doc_parser'
|
3
|
-
require 'kafo_parsers/validation'
|
4
|
-
|
5
|
-
module KafoParsers
|
6
|
-
# Based on ideas from puppet-parse by Johan van den Dorpe
|
7
|
-
# we don't build any tree structure since e.g. params from doc does not
|
8
|
-
# have to be defined in puppet DSL and vice versa, we just gather all info
|
9
|
-
# we can read from the whole manifest
|
10
|
-
class PuppetModuleParser
|
11
|
-
@@puppet_initialized = false
|
12
|
-
|
13
|
-
def self.available?
|
14
|
-
require 'puppet'
|
15
|
-
[2, 3].include?(Puppet::PUPPETVERSION.to_i)
|
16
|
-
rescue LoadError => e
|
17
|
-
raise KafoParsers::ParserNotAvailable.new(e)
|
18
|
-
end
|
19
|
-
|
20
|
-
# You can call this method to get all supported information from a given manifest
|
21
|
-
#
|
22
|
-
# @param [ String ] manifest file path to parse
|
23
|
-
# @return [ Hash ] hash containing values, validations, documentation, types, groups and conditions
|
24
|
-
def self.parse(file)
|
25
|
-
content = new(file)
|
26
|
-
docs = content.docs
|
27
|
-
|
28
|
-
data = {
|
29
|
-
:values => content.values,
|
30
|
-
:validations => content.validations
|
31
|
-
}
|
32
|
-
data[:parameters] = data[:values].keys
|
33
|
-
data.merge!(docs)
|
34
|
-
data
|
35
|
-
end
|
36
|
-
|
37
|
-
def initialize(file)
|
38
|
-
called_before_each_test = false
|
39
|
-
|
40
|
-
@file = file = File.expand_path(file)
|
41
|
-
raise KafoParsers::ModuleName, "File not found #{file}, check your answer file" unless File.exists?(file)
|
42
|
-
|
43
|
-
unless @@puppet_initialized
|
44
|
-
require 'puppet'
|
45
|
-
if Puppet::PUPPETVERSION.to_i >= 3
|
46
|
-
require 'puppet/test/test_helper'
|
47
|
-
if Puppet::Test::TestHelper.respond_to?(:initialize) # 3.1+
|
48
|
-
Puppet::Test::TestHelper.initialize
|
49
|
-
end
|
50
|
-
Puppet::Test::TestHelper.before_all_tests
|
51
|
-
else
|
52
|
-
Puppet.parse_config
|
53
|
-
end
|
54
|
-
Encoding.default_external = Encoding::UTF_8 if defined?(Encoding)
|
55
|
-
@@puppet_initialized = true
|
56
|
-
end
|
57
|
-
|
58
|
-
if Puppet::PUPPETVERSION.to_i >= 3
|
59
|
-
Puppet::Test::TestHelper.before_each_test
|
60
|
-
called_before_each_test = true
|
61
|
-
end
|
62
|
-
|
63
|
-
env = Puppet::Node::Environment.new
|
64
|
-
parser = Puppet::Parser::Parser.new(env)
|
65
|
-
parser.import(@file)
|
66
|
-
|
67
|
-
# Find object corresponding to class defined in init.pp in list of hostclasses
|
68
|
-
ast_types = parser.environment.known_resource_types.hostclasses.map(&:last)
|
69
|
-
@object = ast_types.find { |ast_type| ast_type.file == file }
|
70
|
-
|
71
|
-
# Find object in list of definitions if not found among hostclasses
|
72
|
-
if @object.nil?
|
73
|
-
ast_types = parser.environment.known_resource_types.definitions.map(&:last)
|
74
|
-
@object = ast_types.find { |ast_type| ast_type.file == file }
|
75
|
-
end
|
76
|
-
|
77
|
-
parser
|
78
|
-
ensure
|
79
|
-
Puppet::Test::TestHelper.after_each_test if called_before_each_test
|
80
|
-
end
|
81
|
-
|
82
|
-
# TODO - store parsed object type (Puppet::Parser::AST::Variable must be dumped later)
|
83
|
-
def values
|
84
|
-
parameters = {}
|
85
|
-
arguments = @object.respond_to?(:arguments) ? @object.arguments : {}
|
86
|
-
arguments.each { |k, v| parameters[k] = interpret_ast([v])[0] }
|
87
|
-
parameters
|
88
|
-
end
|
89
|
-
|
90
|
-
def validations(param = nil)
|
91
|
-
return [] if @object.code.nil?
|
92
|
-
@object.code.select { |stmt| stmt.is_a?(Puppet::Parser::AST::Function) && stmt.name =~ /^validate_/ }.map do |v|
|
93
|
-
Validation.new(v.name, interpret_ast(v.arguments))
|
94
|
-
end
|
95
|
-
end
|
96
|
-
|
97
|
-
# returns data in following form
|
98
|
-
# {
|
99
|
-
# :docs => { $param1 => 'documentation without types and conditions'}
|
100
|
-
# :types => { $param1 => 'boolean'},
|
101
|
-
# :groups => { $param1 => ['Parameters', 'Advanced']},
|
102
|
-
# :conditions => { $param1 => '$db_type == "mysql"'},
|
103
|
-
# :object_type => 'hostclass' # or definition
|
104
|
-
# }
|
105
|
-
def docs
|
106
|
-
data = { :docs => {}, :types => {}, :groups => {}, :conditions => {}, :object_type => '' }
|
107
|
-
if @object.nil?
|
108
|
-
raise KafoParsers::DocParseError, "no documentation found for manifest #{@file}, parsing error?"
|
109
|
-
elsif !@object.doc.nil?
|
110
|
-
parser = DocParser.new(@object.doc).parse
|
111
|
-
data[:docs] = parser.docs
|
112
|
-
data[:groups] = parser.groups
|
113
|
-
data[:types] = Hash.new('string').merge(parser.types)
|
114
|
-
data[:conditions] = parser.conditions
|
115
|
-
data[:object_type] = @object.type.to_s
|
116
|
-
end
|
117
|
-
data
|
118
|
-
end
|
119
|
-
|
120
|
-
private
|
121
|
-
|
122
|
-
def interpret_ast(args)
|
123
|
-
args.map do |arg|
|
124
|
-
if arg.is_a?(Puppet::Parser::AST::Variable)
|
125
|
-
arg.to_s
|
126
|
-
elsif arg.is_a?(Puppet::Parser::AST::ASTArray)
|
127
|
-
interpret_ast(arg.to_a)
|
128
|
-
elsif arg.is_a?(Puppet::Parser::AST::Concat)
|
129
|
-
interpret_ast(arg.value).join
|
130
|
-
elsif arg.respond_to? :value
|
131
|
-
arg.value
|
132
|
-
else
|
133
|
-
arg
|
134
|
-
end
|
135
|
-
end
|
136
|
-
end
|
137
|
-
end
|
138
|
-
end
|