diff --git a/lib/puppet_x/puppetlabs/strings/yard/core_ext/yard.rb b/lib/puppet_x/puppetlabs/strings/yard/core_ext/yard.rb new file mode 100644 index 0000000..d8accf2 --- /dev/null +++ b/lib/puppet_x/puppetlabs/strings/yard/core_ext/yard.rb @@ -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 diff --git a/lib/puppet_x/puppetlabs/strings/yard/handlers/base.rb b/lib/puppet_x/puppetlabs/strings/yard/handlers/base.rb index e601d08..66327ae 100644 --- a/lib/puppet_x/puppetlabs/strings/yard/handlers/base.rb +++ b/lib/puppet_x/puppetlabs/strings/yard/handlers/base.rb @@ -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 diff --git a/spec/unit/puppet_x/puppetlabs/strings/yard/defined_type_handler_spec.rb b/spec/unit/puppet_x/puppetlabs/strings/yard/defined_type_handler_spec.rb index 7d684da..542393c 100644 --- a/spec/unit/puppet_x/puppetlabs/strings/yard/defined_type_handler_spec.rb +++ b/spec/unit/puppet_x/puppetlabs/strings/yard/defined_type_handler_spec.rb @@ -58,4 +58,17 @@ describe PuppetX::PuppetLabs::Strings::YARD::Handlers::DefinedTypeHandler do 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 diff --git a/spec/unit/puppet_x/puppetlabs/strings/yard/host_class_handler_spec.rb b/spec/unit/puppet_x/puppetlabs/strings/yard/host_class_handler_spec.rb index 638eaaa..d926672 100644 --- a/spec/unit/puppet_x/puppetlabs/strings/yard/host_class_handler_spec.rb +++ b/spec/unit/puppet_x/puppetlabs/strings/yard/host_class_handler_spec.rb @@ -46,4 +46,17 @@ describe PuppetX::PuppetLabs::Strings::YARD::Handlers::HostClassHandler do 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