Skip to content

Commit

Permalink
Merge pull request #312 from danielparks/fix_plan_parsing
Browse files Browse the repository at this point in the history
(#307) Always enable plan parsing
  • Loading branch information
chelnak authored Sep 29, 2022
2 parents e7e4444 + f14c95e commit ece8be7
Show file tree
Hide file tree
Showing 3 changed files with 46 additions and 12 deletions.
10 changes: 4 additions & 6 deletions lib/puppet-strings/yard/parsers/puppet/parser.rb
Original file line number Diff line number Diff line change
Expand Up @@ -24,13 +24,11 @@ def initialize(source, filename) # rubocop:disable Lint/MissingSuper
# @return [void]
def parse
begin
if @file.to_s.match?(%r{^plans|/plans/})
if Puppet::Util::Package.versioncmp(Puppet.version, '5.0.0') < 0
log.warn "Skipping #{@file}: Puppet Plans require Puppet 5 or greater."
return
end
Puppet[:tasks] = true if Puppet.settings.include?(:tasks)
if @file.to_s.match?(%r{^plans|/plans/}) && Puppet::Util::Package.versioncmp(Puppet.version, '5.0.0') < 0
log.warn "Skipping #{@file}: Puppet Plans require Puppet 5 or greater."
return
end
Puppet[:tasks] = true if Puppet.settings.include?(:tasks)
@statements ||= (@visitor.visit(::Puppet::Pops::Parser::Parser.new.parse_string(source)) || []).compact
rescue ::Puppet::ParseError => e
log.error "Failed to parse #{@file}: #{e.message}"
Expand Down
12 changes: 6 additions & 6 deletions spec/unit/puppet-strings/json_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
describe PuppetStrings::Json do
before :each do
# Populate the YARD registry with both Puppet and Ruby source
YARD::Parser::SourceParser.parse_string(<<-SOURCE, :puppet)
expect(YARD::Parser::SourceParser.parse_string(<<-SOURCE, :puppet).enumerator.length).to eq(2)
# A simple class.
# @todo Do a thing
# @note Some note
Expand All @@ -25,7 +25,7 @@ class klass(Integer $param1, $param2, String $param3 = hi) inherits foo::bar {
}
SOURCE

YARD::Parser::SourceParser.parse_string(<<-SOURCE, :puppet) if TEST_PUPPET_PLANS
expect(YARD::Parser::SourceParser.parse_string(<<-SOURCE, :puppet).enumerator.length).to eq(1) if TEST_PUPPET_PLANS
# A simple plan.
# @param param1 First param.
# @param param2 Second param.
Expand All @@ -35,7 +35,7 @@ class klass(Integer $param1, $param2, String $param3 = hi) inherits foo::bar {
SOURCE

# Only include Puppet functions for 4.1+
YARD::Parser::SourceParser.parse_string(<<-SOURCE, :puppet) if TEST_PUPPET_FUNCTIONS
expect(YARD::Parser::SourceParser.parse_string(<<-SOURCE, :puppet).enumerator.length).to eq(1) if TEST_PUPPET_FUNCTIONS
# A simple function.
# @param param1 First param.
# @param param2 Second param.
Expand All @@ -46,7 +46,7 @@ class klass(Integer $param1, $param2, String $param3 = hi) inherits foo::bar {
SOURCE

# Only include Puppet types for 5.0+
YARD::Parser::SourceParser.parse_string(<<-SOURCE, :ruby) if TEST_PUPPET_DATATYPES
expect(YARD::Parser::SourceParser.parse_string(<<-SOURCE, :ruby).enumerator.length).to eq(1) if TEST_PUPPET_DATATYPES
# Basic Puppet Data Type in Ruby
#
# @param msg A message parameter
Expand All @@ -67,7 +67,7 @@ class klass(Integer $param1, $param2, String $param3 = hi) inherits foo::bar {
end
SOURCE

YARD::Parser::SourceParser.parse_string(<<-SOURCE, :json)
expect(YARD::Parser::SourceParser.parse_string(<<-SOURCE, :json).enumerator.length).to eq(1)
{
"description": "Allows you to backup your database to local file.",
"input_method": "stdin",
Expand All @@ -92,7 +92,7 @@ class klass(Integer $param1, $param2, String $param3 = hi) inherits foo::bar {
}
SOURCE

YARD::Parser::SourceParser.parse_string(<<-SOURCE, :ruby)
expect(YARD::Parser::SourceParser.parse_string(<<-SOURCE, :ruby).enumerator.length).to eq(6)
Puppet::Parser::Functions.newfunction(:func3x, doc: <<-DOC
An example 3.x function.
@param [String] first The first parameter.
Expand Down
36 changes: 36 additions & 0 deletions spec/unit/puppet-strings/yard/parsers/puppet/parser_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -140,6 +140,42 @@ class bar {
end
end

describe 'parsing puppet plans', if: TEST_PUPPET_PLANS do
# The parsing code actually checks this and sets a global (Puppet[:tasks]).
# Plan parsing will fail if it hasn't yet encountered a file under plans/.
let(:file) { 'plans/test.pp' }
let(:source) { <<~'SOURCE' }
# A simple plan.
# @param param1 First param.
# @param param2 Second param.
# @param param3 Third param.
plan plann(String $param1, $param2, Integer $param3 = 1) {
}
SOURCE

it 'parses the puppet plan statement' do
spec_subject.parse
expect(spec_subject.enumerator.size).to eq(1)
statement = spec_subject.enumerator.first
expect(statement).to be_a(PuppetStrings::Yard::Parsers::Puppet::PlanStatement)
expect(statement.name).to eq('plann')
expect(statement.source).to eq(source.sub(%r{\A.*?\n([^#])}m, '\1').chomp)
expect(statement.file).to eq(file)
expect(statement.line).to eq(5)
expect(statement.docstring).to eq('A simple plan.')
expect(statement.parameters.size).to eq(3)
expect(statement.parameters[0].name).to eq('param1')
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('Integer')
expect(statement.parameters[2].value).to eq('1')
end
end

describe 'parsing puppet functions', if: TEST_PUPPET_FUNCTIONS do
let(:source) do
<<SOURCE
Expand Down

0 comments on commit ece8be7

Please sign in to comment.