Skip to content
New issue

Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? # to your account

(PDOC-25) Fix mangled puppet namespaces #27

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
40 changes: 40 additions & 0 deletions lib/puppet_x/puppetlabs/strings/yard/core_ext/yard.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
require 'yard'

require 'puppet_x/puppetlabs/strings'

# Patch the regular expression used to match namespaces
# so it will allow namespace segments that begin with
# both uppercase and lowercase letters (i.e. both
# Puppet::Namespace and puppet::namespace)
YARD::CodeObjects.send(:remove_const, :CONSTANTMATCH)
YARD::CodeObjects::CONSTANTMATCH = /[a-zA-Z]\w*/

# This is a temporary hack until a new version of YARD is
# released. We submitted a patch to YARD to add the
# CONSTANTSTART constant so that we could patch it and
# successfully match our own namesapces. However until
# the next version of the YARD gem is released, we must
# patch the problematic method itself as it is not yet
# using the added variable
if defined? YARD::CodeObjects::CONSTANTSTART
YARD::CodeObjects.send(:remove_const, :CONSTANTSTART)
YARD::CodeObjects::CONSTANTSTART = /^[a-zA-Z]/
else
class YARD::CodeObjects::Proxy
def proxy_path
if @namespace.root?
(@imethod ? YARD::CodeObjects::ISEP : "") + name.to_s
elsif @origname
if @origname =~ /^[a-zA-Z]/
@origname
else
[namespace.path, @origname].join
end
elsif name.to_s =~ /^[a-zA-Z]/ # const
name.to_s
else # class meth?
[namespace.path, name.to_s].join(YARD::CodeObjects::CSEP)
end
end
end
end
2 changes: 2 additions & 0 deletions lib/puppet_x/puppetlabs/strings/yard/handlers/base.rb
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
require 'puppet_x/puppetlabs/strings/yard/core_ext/yard'

class PuppetX::PuppetLabs::Strings::YARD::Handlers::Base < YARD::Handlers::Base
# Easy access to Pops model objects for handler matching.
include Puppet::Pops::Model
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,4 +58,17 @@ def the_definedtype()

expect(YARD::Registry.all).to be_empty
end

it "should generate the correct namespace " do
puppet_code = <<-PUPPET
define puppet_enterprise::mcollective::client::certs { }
PUPPET

parse(puppet_code, :puppet)
# If the namespace is not correctly generated, we will not be able to find the
# object via this name, meaning namespace will be nil
namespace = YARD::Registry.at("puppet_enterprise::mcollective::client::certs").namespace.to_s

expect(namespace).to_not be_nil
end
end
Original file line number Diff line number Diff line change
Expand Up @@ -46,4 +46,17 @@ class foo::bar { }

expect(the_hostclass).to document_a(:type => :hostclass, :docstring => "")
end

it "should generate the correct namespace " do
puppet_code = <<-PUPPET
class puppet_enterprise::mcollective::client::certs { }
PUPPET

parse(puppet_code, :puppet)
# If the namespace is not correctly generated, we will not be able to find the
# object via this name, meaning namespace will be nil
namespace = YARD::Registry.at("puppet_enterprise::mcollective::client::certs")

expect(namespace).to_not be_nil
end
end