kafo_parsers 0.1.6 → 1.2.0

Sign up to get free protection for your applications and to get access to all the features.
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