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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 0a6477915864cbf2a6ec73458c997e3665cb70d6
4
- data.tar.gz: 5556804196ff59db1f71c01f490544c90f6b92f5
2
+ SHA256:
3
+ metadata.gz: f510d851fccf71e96f9fd835195990a4e669fd5722592f1673823a4a651eeb77
4
+ data.tar.gz: e98e7f725fd65d900371fef825db343b25fedd70ac9aee21edaeeaef25ca7d98
5
5
  SHA512:
6
- metadata.gz: 1e1f5e24969c68aa7769e9969cd337d45292520780db95e97e4f11dd280bb1b6846d146829b1e0e51480fa103b9608241d2915466493a9e91ed0f971ab5e96e7
7
- data.tar.gz: a447adc8b3af98f7fb4430b11ba659ddd6ba0518c139d652b27fe2e1a16f05dbe06f0ad0e0902dabae46653b84da25bf01b36887a0df26a7b6671e6b7227d616
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/puppet_module_parser'
48
- hash = KafoParsers::PuppetModuleParser.parse('/puppet/module/manifests/init.pp')
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
- If you use Puppet 4 you prefer PuppetStringsModuleParser which leverages
63
- puppet-strings to parse puppet manifests. This requires puppet-strings 0.99 or
64
- higher and may be installed either as a gem in the same environment, or in a
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
@@ -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
- [ PuppetModuleParser, PuppetStringsModuleParser ]
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
- `#{puppet_bin} help strings 2>&1`
29
- if $?.success?
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.exists?(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
- command = "#{self.class.puppet_bin} strings generate --emit-json-stdout #{file}"
41
- @raw_json = `#{command}`
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
@@ -1,3 +1,3 @@
1
1
  module KafoParsers
2
- VERSION = "0.1.6"
2
+ VERSION = "1.2.0"
3
3
  end
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: 0.1.6
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: 2017-01-05 00:00:00.000000000 Z
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: '11'
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: '11'
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: '4.0'
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: '4.0'
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.9'
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.9'
68
+ version: '0'
69
69
  - !ruby/object:Gem::Dependency
70
- name: ci_reporter
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: 1.9.0
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: 1.9.0
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
- - GPLv3+
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
- rubyforge_project:
151
- rubygems_version: 2.4.5
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
@@ -1,14 +0,0 @@
1
- module KafoParsers
2
- class Validation
3
- attr_reader :name, :arguments
4
-
5
- def initialize(name, arguments)
6
- @name = name
7
- @arguments = arguments
8
- end
9
-
10
- def ==(other)
11
- name == other.name && arguments == other.arguments
12
- end
13
- end
14
- end