Commit 8a7b3721 authored by Rene Saarsoo's avatar Rene Saarsoo
Browse files

Allow wildcard '*' to be used in --external option.

External classes can be now specified as patterns. For example
'Foo.*' to ignore all classes in Foo namespace.
parent 769e14c0
Loading
Loading
Loading
Loading
+30 −0
Original line number Diff line number Diff line
module JsDuck

  # Handles patterns of external classes.
  #
  # A pattern can be a simple classname or a one with a wildcard "*".
  class ExternalClasses

    def initialize(classnames = [])
      @class_names = {}
      @patterns = []
      classnames.each do |name|
        if name =~ /\*/
          @patterns << make_pattern(name)
        else
          @class_names[name] = true
        end
      end
    end

    # True if the classname matches an external class pattern.
    def is?(classname)
      @class_names[classname] || @patterns.any? {|p| classname =~ p }
    end

    def make_pattern(pattern)
      Regexp.new("^" + pattern.split(/\*/, -1).map {|s| Regexp.escape(s) }.join(".*") + "$")
    end
  end

end
+4 −3
Original line number Diff line number Diff line
require 'jsduck/external_classes'

module JsDuck

  # Provides information about relations between classes.
@@ -13,8 +15,7 @@ module JsDuck

    def initialize(classes = [], ignorables = [])
      @classes = classes
      @ignorables = {}
      ignorables.each {|classname| @ignorables[classname] = true }
      @external_classes = ExternalClasses.new(ignorables)

      # First build class lookup table; building lookup tables for
      # mixins and subclasses will depend on that.
@@ -42,7 +43,7 @@ module JsDuck

    # Returns true if class is in list of ignored classes.
    def ignore?(classname)
      @ignorables[classname]
      @external_classes.is?(classname)
    end

    def each(&block)
+33 −0
Original line number Diff line number Diff line
require "jsduck/external_classes"

describe JsDuck::ExternalClasses do

  before do
    @external = JsDuck::ExternalClasses.new(["Foo", "Ns.bar.Baz", "Bla.*"])
  end

  it "matches simple classname" do
    @external.is?("Foo").should == true
  end

  it "matches namespaced classname" do
    @external.is?("Ns.bar.Baz").should == true
  end

  it "doesn't match completely different classname" do
    @external.is?("Zap").should_not == true
  end

  it "doesn't match classname beginning like an external classname" do
    @external.is?("Foo.Bar").should_not == true
  end

  it "matches external classname defined with a wildcard" do
    @external.is?("Bla.Bla").should == true
  end

  it "escapes '.' correctly in external pattern and doesn't match a classname missing the dot" do
    @external.is?("Bla_Bla").should == false
  end

end