kafo_parsers 0.1.5 → 1.1.2

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: 050298bac1a3127c0f8a02392ae7789d601d2136
4
- data.tar.gz: fc1fd7e4f29774e9882ffd4b67d9b08267cbff07
2
+ SHA256:
3
+ metadata.gz: e59aa9f14c8c8c6888b69b88521c9fcd589dfe122d7dc0a1bc9d3df32262969a
4
+ data.tar.gz: 99682f87e85a3c3994313f50d4942ae1f4f51a22564532af2e78c0ee48bf869a
5
5
  SHA512:
6
- metadata.gz: 2e2ebe79c2084ba65c66ee986d03097121e5429142aefce6a41c04fe7c671bd4c0051526dc31256e2986f7cc493519661b6cd0fd43521ea077bf2053b612f5e9
7
- data.tar.gz: 2abdd8b59c17f7bd10d1a93a4b223bde07aad6fcd8f4acde7d30ce42ee4f67b60497fe2ce569063e556775695f5dabfbd3f8e8a6f00c800c1ceefd16e84571da
6
+ metadata.gz: 04e1546703475de823ed9a40fa9e05515c9bdc7a39c20e7cddfaf180f64a6771813539f9264f145664ae0d50a653e2474cc9313dcd76ab1bd573fa68fd377813
7
+ data.tar.gz: ea384ebd11d468bfc8e8c81f126483481273a34abdb9acec94f6cfe9a5bfeb535eb84ed323a4fa0a55ac5e90a2cdc742a4379f6c88d4abb3d22751946b13ba82
data/README.md CHANGED
@@ -44,33 +44,99 @@ 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.
62
+ ## Documentation syntax
63
+
64
+ ### RDoc syntax
65
+
66
+ Classes and defined types should be prefixed with a comment section with an RDoc
67
+ block, containing a description, headings for different parameter groups and
68
+ parameters laid out as shown below:
69
+
70
+ ```puppet
71
+ # Example class that installs Example
72
+ #
73
+ # Supports version 1 to 3.
74
+ #
75
+ # === Parameters::
76
+ #
77
+ # $foo:: Sets the value of foo in the Example config
78
+ #
79
+ # === Advanced parameters::
80
+ #
81
+ # $bar:: Sets the value of bar in the advanced config
82
+ ```
83
+
84
+ Parameters may have multi-line descriptions and can have extra attributes
85
+ defined on new lines below them. Supports:
86
+
87
+ ```puppet
88
+ # $foo:: Sets the value of foo in the Example config
89
+ # condition: $bar == 'use_foo'
90
+ # type: Optional[String]
91
+ ```
92
+
93
+ Supports:
94
+
95
+ * `condition:` an expression to determine if the parameter is used
96
+ * `type:` the data type of the parameter
97
+
98
+ Used by:
99
+
100
+ * `PuppetStringsModuleParser` (but deprecated, prefer YARD)
101
+
102
+ ### YARD syntax
103
+
104
+ Classes and defined types should be prefixed with a comment section in YARD
105
+ following the Puppet Strings documentation standard, as shown below:
106
+
107
+ ```puppet
108
+ # Example class that installs Example
109
+ #
110
+ # Supports version 1 to 3.
111
+ #
112
+ # @param foo Sets the value of foo in the Example config
113
+ # @param bar Sets the value of bar in the advanced config
114
+ # group: Advanced parameters
115
+ ```
116
+
117
+ Parameters may have multi-line descriptions and can have extra attributes
118
+ defined on new lines below them. Supports:
119
+
120
+ ```puppet
121
+ # @param foo Sets the value of foo in the Example config
122
+ # condition: $bar == 'use_foo'
123
+ ```
124
+
125
+ Supports:
126
+
127
+ * `condition:` an expression to determine if the parameter is used
128
+ * `group:` comma-separated list of groups, increasing in specificity
129
+
130
+ Data types are given in the parameter list of the class, or can be given inline
131
+ for Puppet 3 compatibility:
132
+
133
+ ```puppet
134
+ # @param foo [Integer] Sets the value of foo in the Example config
135
+ ```
136
+
137
+ Used by:
138
+
139
+ * `PuppetStringsModuleParser`
74
140
 
75
141
  # License
76
142
 
@@ -3,6 +3,7 @@ require 'rdoc'
3
3
  require 'rdoc/markup' # required for RDoc < 0.9.5
4
4
  require 'rdoc/markup/parser' # required for RDoc < 0.9.5
5
5
  require 'kafo_parsers/exceptions'
6
+ require 'kafo_parsers/param_doc_parser'
6
7
 
7
8
  module KafoParsers
8
9
  class DocParser
@@ -15,7 +16,7 @@ module KafoParsers
15
16
  @docs = {}
16
17
  @groups = {}
17
18
  @conditions = {}
18
- @types = Hash.new('string')
19
+ @types = {}
19
20
  @rdoc = rdoc_parser.parse(@text)
20
21
  end
21
22
 
@@ -46,34 +47,17 @@ module KafoParsers
46
47
  return if label.nil?
47
48
  key = label.gsub(/[^A-Za-z0-9_-]/, '')
48
49
  @groups[key] = current_groups
49
- text_parts = para.parts.first.parts.map!(&:strip)
50
- attributes, docs = text_parts.partition { |line| line =~ ATTRIBUTE_LINE }
51
- parse_attributes(key, attributes)
52
- @docs[key] = docs
53
- end
50
+ text_parts = para.parts.first.parts
54
51
 
55
- def parse_attributes(parameter, attributes)
56
- condition = nil
57
- attributes.each do |attribute|
58
- data = attribute.match(ATTRIBUTE_LINE)
59
- name, value = data[1], data[2]
60
-
61
- case name
62
- when 'type'
63
- @types[parameter] = value
64
- when 'condition'
65
- if condition.nil?
66
- condition = value
67
- else
68
- raise KafoParsers::DocParseError, "Two or more conditions defined for #{name}"
69
- end
70
- else
71
- raise KafoParsers::DocParseError, "Unknown attribute #{name}"
72
- end
52
+ param_parser = ParamDocParser.new(key, text_parts)
53
+ @docs[key] = param_parser.doc
54
+ parse_attributes(key, param_parser)
55
+ end
73
56
 
74
- end
75
- condition = [current_condition, condition].compact.join(' && ')
57
+ def parse_attributes(parameter, parser)
58
+ condition = [current_condition, parser.condition].compact.join(' && ')
76
59
  @conditions[parameter] = condition.empty? ? nil : condition
60
+ @types[parameter] = parser.type unless parser.type.nil?
77
61
  end
78
62
 
79
63
  def parse_header(heading)
@@ -0,0 +1,42 @@
1
+ require 'kafo_parsers/exceptions'
2
+
3
+ module KafoParsers
4
+ class ParamDocParser
5
+ ATTRIBUTE_LINE = /^(condition|group|type)\s*:\s*(.*)/
6
+
7
+ def initialize(param, text)
8
+ @param = param
9
+ @metadata = {}
10
+ parse_paragraph([text].flatten)
11
+ end
12
+
13
+ attr_reader :param, :doc
14
+ [:condition, :group, :type].each do |attr|
15
+ define_method(attr) do
16
+ @metadata[attr]
17
+ end
18
+ end
19
+
20
+ private
21
+
22
+ def parse_paragraph(text)
23
+ text_parts = text.map(&:strip)
24
+ attributes, docs = text_parts.partition { |line| line =~ ATTRIBUTE_LINE }
25
+ parse_attributes(attributes)
26
+ @doc = docs
27
+ end
28
+
29
+ def parse_attributes(attributes)
30
+ attributes.each do |attribute|
31
+ data = attribute.match(ATTRIBUTE_LINE)
32
+ name, value = data[1], data[2]
33
+ raise KafoParsers::DocParseError, "Two or more #{name} lines defined for #{param}" if @metadata.key?(name)
34
+ @metadata[name.to_sym] = value
35
+ end
36
+
37
+ if @metadata.key?(:group)
38
+ @metadata[:group] = @metadata[:group].split(/\s*,\s*/)
39
+ end
40
+ end
41
+ end
42
+ end
@@ -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,6 +1,9 @@
1
1
  # encoding: UTF-8
2
2
  require 'json'
3
+ require 'open3'
4
+
3
5
  require 'kafo_parsers/doc_parser'
6
+ require 'kafo_parsers/param_doc_parser'
4
7
 
5
8
  module KafoParsers
6
9
  class PuppetStringsModuleParser
@@ -24,25 +27,25 @@ module KafoParsers
24
27
  end
25
28
 
26
29
  def self.available?
27
- `#{puppet_bin} help strings 2>&1`
28
- if $?.success?
30
+ _stdout, _stderr, status = run_puppet(['help', 'strings'])
31
+ if status.success?
29
32
  return true
30
33
  else
31
- 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.")
32
35
  end
33
36
  end
34
37
 
35
38
  def initialize(file)
36
39
  @file = file = File.expand_path(file)
37
- 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)
38
44
 
39
- command = "#{self.class.puppet_bin} strings generate --emit-json-stdout #{file}"
40
- @raw_json = `#{command}`
41
- unless $?.success?
42
- 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}"
43
47
  end
44
48
 
45
- Encoding.default_external = Encoding::UTF_8 if defined?(Encoding)
46
49
  begin
47
50
  @complete_hash = ::JSON.parse(@raw_json)
48
51
  rescue ::JSON::ParserError => e
@@ -91,7 +94,7 @@ module KafoParsers
91
94
 
92
95
  # returns data in following form
93
96
  # {
94
- # :docs => { $param1 => 'documentation without types and conditions'}
97
+ # :docs => { $param1 => ['documentation without types and conditions']}
95
98
  # :types => { $param1 => 'boolean'},
96
99
  # :groups => { $param1 => ['Parameters', 'Advanced']},
97
100
  # :conditions => { $param1 => '$db_type == "mysql"'},
@@ -101,19 +104,52 @@ module KafoParsers
101
104
  if @parsed_hash.nil?
102
105
  raise KafoParsers::DocParseError, "no documentation found for manifest #{@file}, parsing error?"
103
106
  elsif !@parsed_hash['docstring'].nil? && !@parsed_hash['docstring']['text'].nil?
104
- parser = DocParser.new(@parsed_hash['docstring']['text']).parse
105
- data[:docs] = parser.docs
106
- data[:groups] = parser.groups
107
- data[:types] = merge_doc_types(parser.types)
108
- data[:conditions] = parser.conditions
107
+ # Lowest precedence: types given in the strings hash from class definition
108
+ tag_params.each do |param|
109
+ data[:types][param['name']] = param['types'][0] unless param['types'].nil?
110
+ end
111
+
112
+ # Next: types and other data from RDoc parser
113
+ rdoc_parser = DocParser.new(@parsed_hash['docstring']['text']).parse
114
+ data[:docs] = rdoc_parser.docs
115
+ data[:groups] = rdoc_parser.groups
116
+ data[:conditions] = rdoc_parser.conditions
117
+ data[:types].merge! rdoc_parser.types
118
+
119
+ # Highest precedence: data in YARD @param stored in the 'text' field
120
+ tag_params.each do |param|
121
+ param_name = param['name']
122
+ unless param['text'].nil? || param['text'].empty?
123
+ param_parser = ParamDocParser.new(param_name, param['text'].split($/))
124
+ data[:docs][param_name] = param_parser.doc if param_parser.doc
125
+ data[:groups][param_name] = param_parser.group if param_parser.group
126
+ data[:conditions][param_name] = param_parser.condition if param_parser.condition
127
+ data[:types][param_name] = param_parser.type if param_parser.type
128
+ end
129
+ end
109
130
  end
110
131
  data
111
132
  end
112
133
 
113
134
  private
114
135
 
136
+ def self.run_puppet(command)
137
+ env_vars = self.puppet_bin.start_with?('/opt/puppetlabs') ? clean_env_vars : ::ENV
138
+ command = command.unshift(self.puppet_bin)
139
+ Open3.capture3(env_vars, *command, :unsetenv_others => true)
140
+ end
141
+
142
+ def self.clean_env_vars
143
+ # Cleaning ENV vars and keeping required vars only because,
144
+ # When using SCL it adds GEM_HOME and GEM_PATH ENV vars.
145
+ whitelisted_vars = %w[HOME USER LANG]
146
+
147
+ cleaned_env = ::ENV.select { |var| whitelisted_vars.include?(var) || var.start_with?('LC_') }
148
+ cleaned_env['PATH'] = '/sbin:/bin:/usr/sbin:/usr/bin:/opt/puppetlabs/bin'
149
+ cleaned_env
150
+ end
151
+
115
152
  # default values using puppet strings includes $ symbol, e.g. "$::foreman::params::ssl"
116
- # to keep the same API we strip $ if it's present
117
153
  #
118
154
  # values are reported as strings which is issue especially for :under
119
155
  # strings are double quoted
@@ -122,16 +158,11 @@ module KafoParsers
122
158
  if (value.start_with?("'") && value.end_with?("'")) || (value.start_with?('"') && value.end_with?('"'))
123
159
  value = value[1..-2]
124
160
  end
125
- value = value[1..-1] if value.start_with?('$')
126
161
  value = :undef if value == 'undef'
127
162
 
128
163
  value
129
164
  end
130
165
 
131
- def merge_doc_types(types)
132
- Hash[tag_params.select { |param| !param['types'].nil? }.map { |param| [ param['name'], param['types'].first ] }].merge(types)
133
- end
134
-
135
166
  def tag_params
136
167
  if @parsed_hash['docstring']['tags']
137
168
  @parsed_hash['docstring']['tags'].select { |tag| tag['tag_name'] == 'param' }
@@ -1,3 +1,3 @@
1
1
  module KafoParsers
2
- VERSION = "0.1.5"
2
+ VERSION = "1.1.2"
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.5
4
+ version: 1.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Marek Hulan
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-11-23 00:00:00.000000000 Z
11
+ date: 2020-08-10 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
@@ -122,14 +122,13 @@ files:
122
122
  - lib/kafo_parsers.rb
123
123
  - lib/kafo_parsers/doc_parser.rb
124
124
  - lib/kafo_parsers/exceptions.rb
125
+ - lib/kafo_parsers/param_doc_parser.rb
125
126
  - lib/kafo_parsers/parsers.rb
126
- - lib/kafo_parsers/puppet_module_parser.rb
127
127
  - lib/kafo_parsers/puppet_strings_module_parser.rb
128
- - lib/kafo_parsers/validation.rb
129
128
  - lib/kafo_parsers/version.rb
130
129
  homepage: https://github.com/theforeman/kafo_parsers
131
130
  licenses:
132
- - GPLv3+
131
+ - GPL-3.0+
133
132
  metadata: {}
134
133
  post_install_message:
135
134
  rdoc_options: []
@@ -146,8 +145,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
146
145
  - !ruby/object:Gem::Version
147
146
  version: '0'
148
147
  requirements: []
149
- rubyforge_project:
150
- rubygems_version: 2.4.5
148
+ rubygems_version: 3.1.2
151
149
  signing_key:
152
150
  specification_version: 4
153
151
  summary: Puppet module parsers
@@ -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] = v.respond_to?(:value) ? v.value : nil }
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_validation_args(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] = 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_validation_args(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_validation_args(arg.to_a)
128
- elsif arg.is_a?(Puppet::Parser::AST::Concat)
129
- interpret_validation_args(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