From 8a7b3721a482b44ef6190121014f4d5a80aa0b9c Mon Sep 17 00:00:00 2001 From: Rene Saarsoo Date: Tue, 4 Dec 2012 13:11:01 -0800 Subject: [PATCH] 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. --- lib/jsduck/external_classes.rb | 30 ++++++++++++++++++++++++++++++ lib/jsduck/relations.rb | 7 ++++--- spec/external_classes_spec.rb | 33 +++++++++++++++++++++++++++++++++ 3 files changed, 67 insertions(+), 3 deletions(-) create mode 100644 lib/jsduck/external_classes.rb create mode 100644 spec/external_classes_spec.rb diff --git a/lib/jsduck/external_classes.rb b/lib/jsduck/external_classes.rb new file mode 100644 index 00000000..ba72be95 --- /dev/null +++ b/lib/jsduck/external_classes.rb @@ -0,0 +1,30 @@ +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 diff --git a/lib/jsduck/relations.rb b/lib/jsduck/relations.rb index 0bd02663..1fc2e633 100644 --- a/lib/jsduck/relations.rb +++ b/lib/jsduck/relations.rb @@ -1,3 +1,5 @@ +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) diff --git a/spec/external_classes_spec.rb b/spec/external_classes_spec.rb new file mode 100644 index 00000000..bb9cdbad --- /dev/null +++ b/spec/external_classes_spec.rb @@ -0,0 +1,33 @@ +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 -- GitLab