class JsDuck::Categories::File

Reads categories info from config file

Public Class Methods

new(filename, relations) click to toggle source
# File lib/jsduck/categories/file.rb, line 9
def initialize(filename, relations)
  @filename = filename
  @relations = relations
end

Public Instance Methods

expand(name) click to toggle source

Expands class name like 'Foo.*' into multiple class names.

# File lib/jsduck/categories/file.rb, line 33
def expand(name)
  re = Regexp.new("^" + name.split(/\*/, -1).map {|part| Regexp.escape(part) }.join('.*') + "$")

  classes = @relations.to_a.find_all do |cls|
    re =~ cls[:name] && !cls[:private] && !cls[:deprecated]
  end.map {|cls| cls[:name] }.sort

  if classes.length == 0
    Logger.warn(:cat_no_match, "No class found matching a pattern '#{name}' in categories file", {:filename => @filename})
  end
  classes
end
generate() click to toggle source

Parses categories in JSON file

# File lib/jsduck/categories/file.rb, line 15
def generate
  @categories = Util::Json.read(@filename)

  # Perform expansion on all class names containing * wildcard
  @categories.each do |cat|
    cat["groups"].each do |group|
      group["classes"] = group["classes"].map do |name|
        expand(name)
      end.flatten
    end
  end

  validate

  @categories
end
validate() click to toggle source

Prints warnings for missing classes in categories file

# File lib/jsduck/categories/file.rb, line 47
def validate
  # Build a map of all classes listed in categories
  listed_classes = {}
  @categories.each do |cat|
    cat["groups"].each do |group|
      group["classes"].each do |cls_name|
        listed_classes[cls_name] = true
      end
    end
  end

  # Check that each existing non-private & non-deprecated class is listed
  @relations.each do |cls|
    unless listed_classes[cls[:name]] || cls[:private] || cls[:deprecated]
      Logger.warn(:cat_class_missing, "Class '#{cls[:name]}' not found in categories file", {:filename => @filename})
    end
  end
end