From da0659ab43f095cbabde5685be7a400c92e9b581 Mon Sep 17 00:00:00 2001 From: Daniel Parks Date: Sun, 25 Sep 2022 02:04:56 -0700 Subject: [PATCH] (#240) Fix output of default values that are expressions MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Previously, parameters with a default value that was an expression were not outputted into the documentation correctly. For example, Integer $param = 1 + 1, Would be shown in the documentation to have a default value of “+”. This switches to using `extract_tree_text` instead of `extract_text` to get the text representation of the parsed Puppet code. This also gets rid of the dependency on `Puppet::Pops::Adapters::SourcePosAdapter`, which was [deprecated in 2017](https://github.com/puppetlabs/puppet/commit/68498adfa2560c9cbf28d7a46ebc1aef14c69992). --- .../yard/handlers/ruby/data_type_handler.rb | 4 ++-- .../yard/parsers/puppet/statement.rb | 21 +++++++------------ lib/puppet-strings/yard/util.rb | 7 +++++++ .../yard/parsers/puppet/parser_spec.rb | 10 ++++----- spec/unit/puppet-strings/yard/util_spec.rb | 7 +++++++ 5 files changed, 29 insertions(+), 20 deletions(-) diff --git a/lib/puppet-strings/yard/handlers/ruby/data_type_handler.rb b/lib/puppet-strings/yard/handlers/ruby/data_type_handler.rb index 54f85e33e..abc1a55c8 100644 --- a/lib/puppet-strings/yard/handlers/ruby/data_type_handler.rb +++ b/lib/puppet-strings/yard/handlers/ruby/data_type_handler.rb @@ -150,12 +150,12 @@ def literal_Object(o) def literal_AccessExpression(o) # Extract the raw text of the Access Expression - ::Puppet::Pops::Adapters::SourcePosAdapter.adapt(o).extract_text + PuppetStrings::Yard::Util.ast_to_text(o) end def literal_QualifiedReference(o) # Extract the raw text of the Qualified Reference - ::Puppet::Pops::Adapters::SourcePosAdapter.adapt(o).extract_text + PuppetStrings::Yard::Util.ast_to_text(o) end # ----- The following methods are the same as the original Literal_evaluator diff --git a/lib/puppet-strings/yard/parsers/puppet/statement.rb b/lib/puppet-strings/yard/parsers/puppet/statement.rb index 01d8a16ca..d252ac8d4 100644 --- a/lib/puppet-strings/yard/parsers/puppet/statement.rb +++ b/lib/puppet-strings/yard/parsers/puppet/statement.rb @@ -21,9 +21,8 @@ class Statement def initialize(object, file) @file = file - adapter = ::Puppet::Pops::Adapters::SourcePosAdapter.adapt(object) - @source = adapter.extract_text - @line = adapter.line + @source = PuppetStrings::Yard::Util.ast_to_text(object) + @line = object.line @comments_range = nil end @@ -85,13 +84,11 @@ def initialize(parameter) @name = parameter.name # Take the exact text for the type expression if parameter.type_expr - adapter = ::Puppet::Pops::Adapters::SourcePosAdapter.adapt(parameter.type_expr) - @type = adapter.extract_text + @type = PuppetStrings::Yard::Util.ast_to_text(parameter.type_expr) end # Take the exact text for the default value expression if parameter.value - adapter = ::Puppet::Pops::Adapters::SourcePosAdapter.adapt(parameter.value) - @value = adapter.extract_text + @value = PuppetStrings::Yard::Util.ast_to_text(parameter.value) end end end @@ -149,8 +146,7 @@ def initialize(object, file) if object.respond_to? :return_type type = object.return_type if type - adapter = ::Puppet::Pops::Adapters::SourcePosAdapter.adapt(type) - @type = adapter.extract_text.gsub('>> ', '') + @type = PuppetStrings::Yard::Util.ast_to_text(type).gsub('>> ', '') end end end @@ -184,12 +180,11 @@ def initialize(object, file) case type_expr when Puppet::Pops::Model::AccessExpression # TODO: I don't like rebuilding the source from the AST, but AccessExpressions don't expose the original source - @alias_of = ::Puppet::Pops::Adapters::SourcePosAdapter.adapt(type_expr.left_expr).extract_text + '[' - @alias_of << type_expr.keys.map { |key| ::Puppet::Pops::Adapters::SourcePosAdapter.adapt(key).extract_text }.join(', ') + @alias_of = PuppetStrings::Yard::Util.ast_to_text(type_expr.left_expr) + '[' + @alias_of << type_expr.keys.map { |key| PuppetStrings::Yard::Util.ast_to_text(key) }.join(', ') @alias_of << ']' else - adapter = ::Puppet::Pops::Adapters::SourcePosAdapter.adapt(type_expr) - @alias_of = adapter.extract_text + @alias_of = PuppetStrings::Yard::Util.ast_to_text(type_expr) end @name = object.name end diff --git a/lib/puppet-strings/yard/util.rb b/lib/puppet-strings/yard/util.rb index c2a5a82bd..a55b96dff 100644 --- a/lib/puppet-strings/yard/util.rb +++ b/lib/puppet-strings/yard/util.rb @@ -79,4 +79,11 @@ def self.docstring_to_hash(docstring, select_tags=nil) hash end + + # Convert Puppet AST to text. + # @param [Puppet::Pops::Model::PopsObject] ast The Puppet AST to convert to text. + # @return [String] Returns a string of Puppet code. + def self.ast_to_text(ast) + ast.locator.extract_tree_text(ast) + end end diff --git a/spec/unit/puppet-strings/yard/parsers/puppet/parser_spec.rb b/spec/unit/puppet-strings/yard/parsers/puppet/parser_spec.rb index eefc0da4c..82b842e29 100644 --- a/spec/unit/puppet-strings/yard/parsers/puppet/parser_spec.rb +++ b/spec/unit/puppet-strings/yard/parsers/puppet/parser_spec.rb @@ -42,7 +42,7 @@ class foo { # @param param1 First param. # @param param2 Second param. # @param param3 Third param. -class foo(Integer $param1, $param2, String $param3 = hi) inherits foo::bar { +class foo(String $param1, $param2, Integer $param3 = 1 + 1) inherits foo::bar { file { '/tmp/foo': ensure => present } @@ -55,7 +55,7 @@ class foo(Integer $param1, $param2, String $param3 = hi) inherits foo::bar { expect(subject.enumerator.size).to eq(1) statement = subject.enumerator.first expect(statement).to be_a(PuppetStrings::Yard::Parsers::Puppet::ClassStatement) - expect(statement.source).to eq("class foo(Integer $param1, $param2, String $param3 = hi) inherits foo::bar {\n file { '/tmp/foo':\n ensure => present\n }\n}") + expect(statement.source).to eq(source.sub(/\A.*\nclass/m, 'class').chomp) expect(statement.file).to eq(file) expect(statement.line).to eq(6) expect(statement.docstring).to eq('A simple foo class.') @@ -63,14 +63,14 @@ class foo(Integer $param1, $param2, String $param3 = hi) inherits foo::bar { expect(statement.parent_class).to eq('foo::bar') expect(statement.parameters.size).to eq(3) expect(statement.parameters[0].name).to eq('param1') - expect(statement.parameters[0].type).to eq('Integer') + expect(statement.parameters[0].type).to eq('String') expect(statement.parameters[0].value).to be_nil expect(statement.parameters[1].name).to eq('param2') expect(statement.parameters[1].type).to be_nil expect(statement.parameters[1].value).to be_nil expect(statement.parameters[2].name).to eq('param3') - expect(statement.parameters[2].type).to eq('String') - expect(statement.parameters[2].value).to eq('hi') + expect(statement.parameters[2].type).to eq('Integer') + expect(statement.parameters[2].value).to eq('1 + 1') end end diff --git a/spec/unit/puppet-strings/yard/util_spec.rb b/spec/unit/puppet-strings/yard/util_spec.rb index 148f9c0f6..5b8b6fc94 100644 --- a/spec/unit/puppet-strings/yard/util_spec.rb +++ b/spec/unit/puppet-strings/yard/util_spec.rb @@ -47,4 +47,11 @@ expect(subject.github_to_yard_links(str)).to eq(' module-description') end end + + describe 'ast_to_text' do + it 'converts a simple AST correctly' do + model = Puppet::Pops::Parser::Parser.new().parse_string('class test {}').model + expect(subject.ast_to_text(model.body)).to eq('class test {}') + end + end end