Commit 91181f84 authored by Rene Saarsoo's avatar Rene Saarsoo
Browse files

Automatic loading of all builtin meta-tags.

MetaTagLoader now only deals with loading and has no other knowledge
of builtin tags than the path ./tag from which it loads when :builtins
is passed to #load method.

The loader is now only accessed through MetaTagRegistry#load and not
directly any more.  This simplifies the tests a little bit - they now
only have to do one simple call to MetaTagRegistry.instance.load.
parent ea8ebe9f
Loading
Loading
Loading
Loading
+24 −27
Original line number Diff line number Diff line
require "jsduck/meta_tag"
require 'jsduck/tag/author'
require 'jsduck/tag/docauthor'
require 'jsduck/tag/static'
require 'jsduck/tag/protected'
require 'jsduck/tag/deprecated'
require 'jsduck/tag/required'
require 'jsduck/tag/template'
require 'jsduck/tag/abstract'
require 'jsduck/tag/readonly'

module JsDuck

  # Loads user-defined meta-tags
  # Loader for built-in and user-defined meta-tags.
  class MetaTagLoader
    attr_reader :meta_tags

    # instatiates builtin meta tags
    def initialize
      @classes = MetaTag.descendants
      @meta_tags = @classes.map {|cls| create_tag(cls) }
      @classes = []
      @meta_tags = []
    end

    # Loads user-defined meta-tags from given paths.
    # Returns list of meta-tag instances.
    def load(paths)
      paths.each do |path|
        if File.directory?(path)
          Dir[path+"/**/*.rb"].each do |file|
            require(file)
            init_remaining
          end
    # Loads user-defined meta-tags from given path.
    #
    # * If path is a directory, loads all *.rb files in it.
    # * If path is the symbol :builtins, loads the builtin
    #   tags from ./tag dir.
    # * Otherwise loads tags from the single file.
    def load(path)
      if path == :builtins
        load(File.dirname(__FILE__) + "/tag")
      elsif File.directory?(path)
        Dir[path+"/**/*.rb"].each {|file| load_file(file) }
      else
          require(path)
          init_remaining
        load_file(path)
      end
    end
      @meta_tags

    private

    # Loads just one file.
    def load_file(file)
      require(file)
      init_remaining
    end

    # Instantiates meta tag classes that haven't been instantiated
+22 −7
Original line number Diff line number Diff line
require 'singleton'
require "jsduck/meta_tag_loader"

module JsDuck

@@ -11,13 +12,26 @@ module JsDuck
      @map = {}
    end

    # Adds tags to registry
    def add(tags)
      @tags += tags
      register_keys(tags)
    # Loads meta-tags from the given paths.  See MetaTagLoader#load
    # for details.
    #
    # This should only be called once. Calling it twice will override
    # the previously loaded tags.
    def load(paths)
      loader = MetaTagLoader.new
      paths.each {|p| loader.load(p) }
      register(loader.meta_tags)
    end

    # Returns list of all available tags
    # Registers MetaTag instances.
    #
    # NB! This is for testing purposes only, elsewhere always use #load.
    def register(tags)
      @tags = tags
      register_keys
    end

    # Returns array of all available tag instances
    def tags
      @tags
    end
@@ -61,8 +75,9 @@ module JsDuck

    private

    def register_keys(tags)
      tags.each do |tag|
    def register_keys
      @map = {}
      @tags.each do |tag|
        @map[tag.key] = tag
        @map[tag.name] = tag
      end
+2 −2
Original line number Diff line number Diff line
require 'optparse'
require 'jsduck/meta_tag_loader'
require 'jsduck/meta_tag_registry'
require 'jsduck/logger'

module JsDuck
@@ -118,7 +118,7 @@ module JsDuck
        read_filenames(canonical(fname))
      end
      validate
      MetaTagRegistry.instance.add(MetaTagLoader.new.load(@meta_tag_paths))
      MetaTagRegistry.instance.load([:builtins] + @meta_tag_paths)
    end

    def create_option_parser
+1 −2
Original line number Diff line number Diff line
require "jsduck/aggregator"
require "jsduck/source_file"
require "jsduck/meta_tag_loader"
require "jsduck/meta_tag_registry"

describe JsDuck::Aggregator do
  before(:all) do
    JsDuck::MetaTagRegistry.instance.add(JsDuck::MetaTagLoader.new.meta_tags)
    JsDuck::MetaTagRegistry.instance.load([:builtins])
  end

  def parse(string)
+1 −2
Original line number Diff line number Diff line
require "jsduck/aggregator"
require "jsduck/source_file"
require "jsduck/meta_tag_loader"
require "jsduck/meta_tag_registry"

describe JsDuck::Aggregator do
  before(:all) do
    JsDuck::MetaTagRegistry.instance.add(JsDuck::MetaTagLoader.new.meta_tags)
    JsDuck::MetaTagRegistry.instance.load([:builtins])
  end

  def parse(string)
Loading