Commit 31781f20 authored by Rene Saarsoo's avatar Rene Saarsoo
Browse files

Encapsulate most of Aggregator class methods.

Aggregator now only exposes #aggregate and #result methods.  The result
now returns a Hash instead of Array - a change which caused a change in
lots of specs, but we're now better off as the specs rely less on
positional indexing in #result and instead look up classes by name.
parent 3cba7a80
Loading
Loading
Loading
Loading
+17 −10
Original line number Diff line number Diff line
@@ -2,12 +2,12 @@ require 'jsduck/logger'

module JsDuck

  # Combines JavaScript Parser, DocParser and Merger.
  # Produces array of classes as result.
  # Groups parsed documentation data from source files into classes.
  #
  # Produces Hash of classes as result.  When a member is found that
  # doesn't belong to any class, it's placed into special "global"
  # class.
  class Aggregator
    # Access to internal classes hash.
    attr_reader :classes

    def initialize
      @documentation = []
      @classes = {}
@@ -27,6 +27,18 @@ module JsDuck
      file.each {|doc| register(doc) }
    end

    # Returns the final result which is a Hash of all classes indexed
    # by name.  It's a hash because some processors applied to this
    # returned classes list need a random-access look up classes by
    # name.
    def result
      classify_orphans
      create_global_class
      @classes
    end

    private

    # Registers documentation node either as class or as member of
    # some class.
    def register(node)
@@ -187,11 +199,6 @@ module JsDuck
        :files => [{:filename => "", :linenr => 0, :href => ""}],
      })
    end

    # Now used only in tests.
    def result
      @documentation + @orphans
    end
  end

end
+7 −9
Original line number Diff line number Diff line
@@ -60,18 +60,16 @@ module JsDuck
        Logger.log("Aggregating", file.filename)
        agr.aggregate(file)
      end
      agr.classify_orphans
      agr.create_global_class
      classes = agr.classes
      classes_hash = agr.result

      Process::IgnoredClasses.new(classes).process_all!
      Process::Accessors.new(classes).process_all!
      Process::Ext4Events.new(classes, @opts).process_all!
      Process::Enums.new(classes).process_all!
      Process::IgnoredClasses.new(classes_hash).process_all!
      Process::Accessors.new(classes_hash).process_all!
      Process::Ext4Events.new(classes_hash, @opts).process_all!
      Process::Enums.new(classes_hash).process_all!
      # Ignore override classes after applying them to actual classes
      @opts.external_classes += Process::Overrides.new(classes).process_all!
      @opts.external_classes += Process::Overrides.new(classes_hash).process_all!

      classes.values
      classes_hash.values
    end

    # Turns all aggregated data into Class objects.
+10 −9
Original line number Diff line number Diff line
@@ -6,8 +6,9 @@ describe JsDuck::Aggregator do
  def parse(string)
    agr = JsDuck::Aggregator.new
    agr.aggregate(JsDuck::Source::File.new(string))
    JsDuck::Process::Accessors.new(agr.classes).process_all!
    agr.result
    classes = agr.result
    JsDuck::Process::Accessors.new(classes).process_all!
    classes
  end

  describe "@cfg foo with @accessor" do
@@ -21,7 +22,7 @@ describe JsDuck::Aggregator do
           */
      EOF
      @members = {}
      @docs[0][:members].each do |m|
      @docs["MyClass"][:members].each do |m|
        @members[m[:name]] = m
      end
    end
@@ -96,7 +97,7 @@ describe JsDuck::Aggregator do
           */
      EOF
      @members = {}
      @docs[0][:members].each do |m|
      @docs["MyClass"][:members].each do |m|
        @members[m[:name]] = m
      end
    end
@@ -130,8 +131,8 @@ describe JsDuck::Aggregator do
           * @evented
           */
      EOF
      @accessors = @docs[0][:members].find_all {|m| m[:tagname] == :method }
      @events = @docs[0][:members].find_all {|m| m[:tagname] == :event }
      @accessors = @docs["MyClass"][:members].find_all {|m| m[:tagname] == :method }
      @events = @docs["MyClass"][:members].find_all {|m| m[:tagname] == :event }
    end

    it "creates accessors" do
@@ -161,7 +162,7 @@ describe JsDuck::Aggregator do
           * @accessor
           */
      EOF
      @accessors = @docs[0][:members].find_all {|m| m[:tagname] == :method }
      @accessors = @docs["MyClass"][:members].find_all {|m| m[:tagname] == :method }
    end

    it "creates accessors" do
@@ -188,7 +189,7 @@ describe JsDuck::Aggregator do
           * @evented
           */
      EOF
      @events = @docs[0][:members].find_all {|m| m[:tagname] == :event }
      @events = @docs["MyClass"][:members].find_all {|m| m[:tagname] == :event }
    end

    it "creates foochange event" do
@@ -274,7 +275,7 @@ describe JsDuck::Aggregator do
           * Event comment.
           */
      EOF
      @events = @docs[0][:members].find_all {|m| m[:tagname] == :event }
      @events = @docs["MyClass"][:members].find_all {|m| m[:tagname] == :event }
    end

    it "doesn't create any additional events" do
+21 −21
Original line number Diff line number Diff line
@@ -23,7 +23,7 @@ describe JsDuck::Aggregator do

  describe "class with @alias" do
    before do
      @doc = parse(<<-EOS)[0]
      @doc = parse(<<-EOS)["MyClass"]
        /**
         * @class MyClass
         * @alias widget.foo
@@ -35,7 +35,7 @@ describe JsDuck::Aggregator do

  describe "class with multiple @alias tags" do
    before do
      @doc = parse(<<-EOS)[0]
      @doc = parse(<<-EOS)["MyClass"]
        /**
         * @class MyClass
         * @alias widget.foo
@@ -48,7 +48,7 @@ describe JsDuck::Aggregator do

  describe "class with @alias tag without name" do
    before do
      @doc = parse(<<-EOS)[0]
      @doc = parse(<<-EOS)["MyClass"]
        /**
         * @class MyClass
         * @alias
@@ -62,7 +62,7 @@ describe JsDuck::Aggregator do

  describe "class with @alias tag without namespace" do
    before do
      @doc = parse(<<-EOS)[0]
      @doc = parse(<<-EOS)["MyClass"]
        /**
         * @class MyClass
         * @alias foo
@@ -76,7 +76,7 @@ describe JsDuck::Aggregator do

  describe "class with @xtype" do
    before do
      @doc = parse(<<-EOS)[0]
      @doc = parse(<<-EOS)["MyClass"]
        /**
         * @class MyClass
         * @xtype foo
@@ -88,7 +88,7 @@ describe JsDuck::Aggregator do

  describe "class with @xtype tag without name" do
    before do
      @doc = parse(<<-EOS)[0]
      @doc = parse(<<-EOS)["MyClass"]
        /**
         * @class MyClass
         * @xtype
@@ -102,7 +102,7 @@ describe JsDuck::Aggregator do

  describe "class with @ftype" do
    before do
      @doc = parse(<<-EOS)[0]
      @doc = parse(<<-EOS)["MyClass"]
        /**
         * @class MyClass
         * @ftype foo
@@ -116,7 +116,7 @@ describe JsDuck::Aggregator do

  describe "class with @ptype" do
    before do
      @doc = parse(<<-EOS)[0]
      @doc = parse(<<-EOS)["MyClass"]
        /**
         * @class MyClass
         * @ptype foo
@@ -130,7 +130,7 @@ describe JsDuck::Aggregator do

  describe "@xtype after @constructor" do
    before do
      @doc = parse(<<-EOS)[0]
      @doc = parse(<<-EOS)["MyClass"]
        /**
         * @class MyClass
         * Comment here.
@@ -145,7 +145,7 @@ describe JsDuck::Aggregator do

  describe "class with multiple @xtypes" do
    before do
      @doc = parse(<<-EOS)[0]
      @doc = parse(<<-EOS)["MyClass"]
        /**
         * @class MyClass
         * @xtype foo
@@ -159,7 +159,7 @@ describe JsDuck::Aggregator do

  describe "Alias with more than one dot (.) in it" do
    before do
      @doc = parse(<<-EOS)[0]
      @doc = parse(<<-EOS)["MyClass"]
        /**
         * @class MyClass
         * @alias widget.foo.bar
@@ -173,7 +173,7 @@ describe JsDuck::Aggregator do

  describe "Ext.define() with simple alias" do
    before do
      @doc = parse(<<-EOS)[0]
      @doc = parse(<<-EOS)["MyClass"]
        /** */
        Ext.define('MyClass', {
          alias: 'widget.foo'
@@ -185,7 +185,7 @@ describe JsDuck::Aggregator do

  describe "Ext.define() with @alias overriding alias" do
    before do
      @doc = parse(<<-EOS)[0]
      @doc = parse(<<-EOS)["MyClass"]
        /**
         * @alias widget.foo
         */
@@ -199,7 +199,7 @@ describe JsDuck::Aggregator do

  describe "Ext.define() with @xtype overriding alias" do
    before do
      @doc = parse(<<-EOS)[0]
      @doc = parse(<<-EOS)["MyClass"]
        /**
         * @xtype foo
         */
@@ -213,7 +213,7 @@ describe JsDuck::Aggregator do

  describe "Ext.define() with array of aliases" do
    before do
      @doc = parse(<<-EOS)[0]
      @doc = parse(<<-EOS)["MyClass"]
        /** */
        Ext.define('MyClass', {
          alias: ['widget.foo', 'widget.bar']
@@ -225,7 +225,7 @@ describe JsDuck::Aggregator do

  describe "Ext.define() with different kinds of aliases" do
    before do
      @doc = parse(<<-EOS)[0]
      @doc = parse(<<-EOS)["MyClass"]
        /** */
        Ext.define('MyClass', {
          alias: ['store.json', 'store.ajax', 'component.myclass']
@@ -239,7 +239,7 @@ describe JsDuck::Aggregator do

  describe "Ext.define() with dash inside alias name" do
    before do
      @doc = parse(<<-EOS)[0]
      @doc = parse(<<-EOS)["MyClass"]
        /** */
        Ext.define('MyClass', {
          alias: 'widget.foo-bar'
@@ -253,7 +253,7 @@ describe JsDuck::Aggregator do

  describe "Ext.define() with xtype property" do
    before do
      @doc = parse(<<-EOS)[0]
      @doc = parse(<<-EOS)["MyClass"]
        /** */
        Ext.define('MyClass', {
          xtype: 'foo'
@@ -265,7 +265,7 @@ describe JsDuck::Aggregator do

  describe "Ext.define() with array xtype property" do
    before do
      @doc = parse(<<-EOS)[0]
      @doc = parse(<<-EOS)["MyClass"]
        /** */
        Ext.define('MyClass', {
          xtype: ['foo', 'bar']
@@ -277,7 +277,7 @@ describe JsDuck::Aggregator do

  describe "Ext.define() with both xtype and alias" do
    before do
      @doc = parse(<<-EOS)[0]
      @doc = parse(<<-EOS)["MyClass"]
        /** */
        Ext.define('MyClass', {
          alias: 'widget.foo',
@@ -290,7 +290,7 @@ describe JsDuck::Aggregator do

  describe "one class many times" do
    before do
      @doc = parse(<<-EOS)[0]
      @doc = parse(<<-EOS)["Foo"]
        /**
         * @class Foo
         */
+16 −12
Original line number Diff line number Diff line
@@ -8,9 +8,13 @@ describe JsDuck::Aggregator do
    agr.result
  end

  def parse_member(string)
    parse(string)["global"][:members][0]
  end

  describe "member with @protected" do
    before do
      @doc = parse("/** @protected */")[0]
      @doc = parse_member("/** @protected */")
    end

    it "gets protected attribute" do
@@ -20,7 +24,7 @@ describe JsDuck::Aggregator do

  describe "member with @abstract" do
    before do
      @doc = parse("/** @abstract */")[0]
      @doc = parse_member("/** @abstract */")
    end

    it "gets abstract attribute" do
@@ -30,7 +34,7 @@ describe JsDuck::Aggregator do

  describe "member with @static" do
    before do
      @doc = parse("/** @static */")[0]
      @doc = parse_member("/** @static */")
    end

    it "gets static attribute" do
@@ -40,7 +44,7 @@ describe JsDuck::Aggregator do

  describe "Property with @readonly" do
    before do
      @doc = parse("/** @readonly */")[0]
      @doc = parse_member("/** @readonly */")
    end

    it "gets readonly attribute" do
@@ -50,7 +54,7 @@ describe JsDuck::Aggregator do

  describe "method with @template" do
    before do
      @doc = parse(<<-EOS)[0]
      @doc = parse_member(<<-EOS)
        /**
         * @method foo
         * Some function
@@ -65,7 +69,7 @@ describe JsDuck::Aggregator do

  describe "event with @preventable" do
    before do
      @doc = parse(<<-EOS)[0]
      @doc = parse_member(<<-EOS)
        /**
         * @event foo
         * @preventable bla blah
@@ -83,7 +87,7 @@ describe JsDuck::Aggregator do

  describe "a normal config option" do
    before do
      @doc = parse(<<-EOS)[0]
      @doc = parse_member(<<-EOS)
        /**
         * @cfg foo Something
         */
@@ -96,7 +100,7 @@ describe JsDuck::Aggregator do

  describe "a config option labeled as required" do
    before do
      @doc = parse(<<-EOS)[0]
      @doc = parse_member(<<-EOS)
        /**
         * @cfg foo (required) Something
         */
@@ -109,7 +113,7 @@ describe JsDuck::Aggregator do

  describe "a class with @cfg (required)" do
    before do
      @doc = parse(<<-EOS)[0]
      @doc = parse(<<-EOS)["MyClass"]
        /**
         * @class MyClass
         * @cfg foo (required)
@@ -126,7 +130,7 @@ describe JsDuck::Aggregator do

  describe "member with @deprecated" do
    before do
      @deprecated = parse(<<-EOS)[0][:deprecated]
      @deprecated = parse_member(<<-EOS)[:deprecated]
        /**
         * @deprecated 4.0 Use escapeRegex instead.
         */
@@ -148,7 +152,7 @@ describe JsDuck::Aggregator do

  describe "member with @deprecated without version number" do
    before do
      @deprecated = parse(<<-EOS)[0][:deprecated]
      @deprecated = parse_member(<<-EOS)[:deprecated]
        /**
         * @deprecated Use escapeRegex instead.
         */
@@ -166,7 +170,7 @@ describe JsDuck::Aggregator do

  describe "class with @markdown" do
    before do
      @doc = parse(<<-EOS)[0]
      @doc = parse(<<-EOS)["MyClass"]
        /**
         * @class MyClass
         * @markdown
Loading