From ee53f3fcd1f511af2669109595bfa41aeaf5795b Mon Sep 17 00:00:00 2001 From: Rene Saarsoo Date: Thu, 16 Feb 2012 12:39:02 +0200 Subject: [PATCH] Completely hide members tagged with @hide. @hide is no more equivalent of @private. Members tagged with @hide won't appear in documentation at all. --- lib/jsduck/class.rb | 3 ++ lib/jsduck/class_formatter.rb | 4 +-- lib/jsduck/doc_parser.rb | 4 +-- lib/jsduck/tag/hide.rb | 18 ++++++++++ spec/aggregator_private_spec.rb | 19 +++++++--- spec/hide_spec.rb | 61 +++++++++++++++++++++++++++++++++ 6 files changed, 100 insertions(+), 9 deletions(-) create mode 100644 lib/jsduck/tag/hide.rb create mode 100644 spec/hide_spec.rb diff --git a/lib/jsduck/class.rb b/lib/jsduck/class.rb index 807a374d..03c80646 100644 --- a/lib/jsduck/class.rb +++ b/lib/jsduck/class.rb @@ -168,6 +168,9 @@ module JsDuck ms.merge!(local_members_hash(type, :statics)) {|k,o,n| store_overrides(k,o,n)} end + # Remove explicitly hidden members (tagged with @hide) + ms.reject! {|k, v| v[:meta] && v[:meta][:hide] } + ms end diff --git a/lib/jsduck/class_formatter.rb b/lib/jsduck/class_formatter.rb index 8c390631..6b3d8cc5 100644 --- a/lib/jsduck/class_formatter.rb +++ b/lib/jsduck/class_formatter.rb @@ -27,8 +27,8 @@ module JsDuck cls[:doc] = @formatter.format(cls[:doc]) if cls[:doc] [:members, :statics].each do |group| cls[group].each_pair do |type, members| - # format all members - cls[group][type] = members.map {|m| format_member(m) } + # format all members (except hidden ones) + cls[group][type] = members.map {|m| m[:meta][:hide] ? m : format_member(m) } end end cls[:html_meta] = format_meta_data(cls) diff --git a/lib/jsduck/doc_parser.rb b/lib/jsduck/doc_parser.rb index b3799ae0..8a2617c1 100644 --- a/lib/jsduck/doc_parser.rb +++ b/lib/jsduck/doc_parser.rb @@ -134,8 +134,8 @@ module JsDuck at_var elsif look(/@inheritable\b/) boolean_at_tag(/@inheritable/, :inheritable) - elsif look(/@(private|ignore|hide)\b/) - boolean_at_tag(/@(private|ignore|hide)/, :private) + elsif look(/@(private|ignore)\b/) + boolean_at_tag(/@(private|ignore)/, :private) elsif look(/@accessor\b/) boolean_at_tag(/@accessor/, :accessor) elsif look(/@evented\b/) diff --git a/lib/jsduck/tag/hide.rb b/lib/jsduck/tag/hide.rb new file mode 100644 index 00000000..a66a31cf --- /dev/null +++ b/lib/jsduck/tag/hide.rb @@ -0,0 +1,18 @@ +require "jsduck/meta_tag" + +module JsDuck::Tag + # Implementation of @hide tag. + # + # Hides a member in parent class. + # + # The core of the implementation is built into jsduck. + # + class Hide < JsDuck::MetaTag + def initialize + @name = "hide" + @key = :hide + @boolean = true + end + end +end + diff --git a/spec/aggregator_private_spec.rb b/spec/aggregator_private_spec.rb index 6a988a09..ca2b6ce6 100644 --- a/spec/aggregator_private_spec.rb +++ b/spec/aggregator_private_spec.rb @@ -24,14 +24,23 @@ describe JsDuck::Aggregator do it_should_behave_like "private" end - describe "@hide" do - before { @tagname = "@hide" } - it_should_behave_like "private" - end - describe "@ignore" do before { @tagname = "@ignore" } it_should_behave_like "private" end + describe "@hide" do + before do + @doc = parse("/** @hide */")[0] + end + + it "does not mark item as private" do + @doc[:private].should_not == true + end + + it "marks item as :hide" do + @doc[:meta][:hide].should == true + end + end + end diff --git a/spec/hide_spec.rb b/spec/hide_spec.rb new file mode 100644 index 00000000..419b613c --- /dev/null +++ b/spec/hide_spec.rb @@ -0,0 +1,61 @@ +require "jsduck/class" + +# Test for the behavior of @hide tag + +describe JsDuck::Class do + + def members_as_hash(cls, type, context=:members) + h = {} + cls.members(type, context).each {|m| h[m[:name]] = m } + h + end + + before do + @classes = {} + @parent = JsDuck::Class.new({ + :name => "ParentClass", + :members => { + :method => [ + {:name => "foo", :owner => "ParentClass"}, + {:name => "bar", :owner => "ParentClass"}, + {:name => "zappa", :owner => "ParentClass"}, + ] + } + }); + @classes["ParentClass"] = @parent + @parent.relations = @classes + + @child = JsDuck::Class.new({ + :name => "ChildClass", + :extends => "ParentClass", + :members => { + :method => [ + {:name => "bar", :owner => "ChildClass"}, + {:name => "baz", :owner => "ChildClass"}, + {:name => "zappa", :owner => "ChildClass", :meta => {:hide => true}}, + ] + } + }); + @classes["ChildClass"] = @child + @child.relations = @classes + + @members = members_as_hash(@child, :method) + end + + it "has member that's inherited from parent" do + @members.should have_key("foo") + end + + it "has member that's overridden in child" do + @members.should have_key("bar") + end + + it "has member that's defined only in child" do + @members.should have_key("baz") + end + + it "doesn't have member that's tagged in child with @hide" do + @members.should_not have_key("zappa") + end + +end -- GitLab