G'day Brice.

I have been staring at this on and off during the weekend, trying to
work out how to test it.  Specifically, I really want to make sure
that this doesn't regress due to other changes in puppet if we drop it
in – it seems a very valuable behaviour fix, and worth preserving.

Have you, or anyone else, an idea of how this could be unit-tested
effectively?  I can probably write a reasonable enough integration
test to cover it, but that would be at a level that would risk a whole
bunch of sins slipping through...

Daniel

On Sat, Feb 12, 2011 at 06:06, Brice Figureau
<[email protected]> wrote:
> Puppetdoc was relying on RDoc to provide the puppet entity (class, definition
> node, etc...) hyperlinking in comments.
> Unfortunately, RDoc was assuming namespaces are capitalized like Ruby
> namespaces and that definition would use the # or . separator.
>
> This change adds on top of RDoc puppet namespace format for classes and
> definition.
>
> This will make sure the comment hyperlinking will work as intented.
>
> Signed-off-by: Brice Figureau <[email protected]>
> ---
>  lib/puppet/util/rdoc/code_objects.rb               |   39 
> ++++++++++++++++++++
>  .../util/rdoc/generators/puppet_generator.rb       |   18 +++++++++
>  2 files changed, 57 insertions(+), 0 deletions(-)
>
> diff --git a/lib/puppet/util/rdoc/code_objects.rb 
> b/lib/puppet/util/rdoc/code_objects.rb
> index 3854fbc..3c789a0 100644
> --- a/lib/puppet/util/rdoc/code_objects.rb
> +++ b/lib/puppet/util/rdoc/code_objects.rb
> @@ -124,6 +124,45 @@ module RDoc
>     def add_child(child)
>       @childs << child
>     end
> +
> +    # Look up the given symbol. RDoc only looks for class1::class2.method
> +    # or class1::class2#method. Since our definitions are mapped to RDoc 
> methods
> +    # but are written class1::class2::define we need to perform the lookup by
> +    # ourselves.
> +    def find_symbol(symbol, method=nil)
> +      result = super
> +      if not result and symbol =~ /::/
> +        modules = symbol.split(/::/)
> +        unless modules.empty?
> +          module_name = modules.shift
> +          result = find_module_named(module_name)
> +          if result
> +            last_name = ""
> +            previous = nil
> +            modules.each do |module_name|
> +              previous = result
> +              last_name = module_name
> +              result = result.find_module_named(module_name)
> +              break unless result
> +            end
> +            unless result
> +              result = previous
> +              method = last_name
> +            end
> +          end
> +        end
> +        if result && method
> +          if !result.respond_to?(:find_local_symbol)
> +            p result.name
> +            p method
> +            fail
> +          end
> +          result = result.find_local_symbol(method)
> +        end
> +      end
> +      result
> +    end
> +
>   end
>
>   # PuppetNode holds a puppet node
> diff --git a/lib/puppet/util/rdoc/generators/puppet_generator.rb 
> b/lib/puppet/util/rdoc/generators/puppet_generator.rb
> index e6bbb2e..249c9a8 100644
> --- a/lib/puppet/util/rdoc/generators/puppet_generator.rb
> +++ b/lib/puppet/util/rdoc/generators/puppet_generator.rb
> @@ -31,6 +31,24 @@ module Generators
>   NODE_DIR = "nodes"
>   PLUGIN_DIR = "plugins"
>
> +  # We're monkey patching RDoc markup to allow
> +  # lowercase class1::class2::class3 crossref hyperlinking
> +  module MarkUp
> +    alias :old_markup :markup
> +
> +    def new_markup(str, remove_para=false)
> +      first = @markup.nil?
> +      res = old_markup(str, remove_para)
> +      if first and not @markup.nil?
> +        @markup.add_special(/\b([a-z]\w+(::\w+)*)/,:CROSSREF)
> +        # we need to call it again, since we added a rule
> +        res = old_markup(str, remove_para)
> +      end
> +      res
> +    end
> +    alias :markup :new_markup
> +  end
> +
>   # This is a specialized HTMLGenerator tailored to Puppet manifests
>   class PuppetGenerator < HTMLGenerator
>
> --
> 1.7.2.1
>
> --
> You received this message because you are subscribed to the Google Groups 
> "Puppet Developers" group.
> To post to this group, send email to [email protected].
> To unsubscribe from this group, send email to 
> [email protected].
> For more options, visit this group at 
> http://groups.google.com/group/puppet-dev?hl=en.
>
>



-- 
⎋ Puppet Labs Developer – http://puppetlabs.com
✉ Daniel Pittman <[email protected]>
✆ Contact me via gtalk, email, or phone: +1 (877) 575-9775
♲ Made with 100 percent post-consumer electrons

-- 
You received this message because you are subscribed to the Google Groups 
"Puppet Developers" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/puppet-dev?hl=en.

Reply via email to