Class: JsDuck::FileCategories

Inherits:
Object
  • Object
show all
Defined in:
lib/jsduck/file_categories.rb

Overview

Reads categories info from config file

Instance Method Summary collapse

Constructor Details

#initialize(filename, relations) ⇒ FileCategories

Returns a new instance of FileCategories.



5
6
7
8
# File 'lib/jsduck/file_categories.rb', line 5

def initialize(filename, relations)
  @filename = filename
  @relations = relations
end

Instance Method Details

#expand(name) ⇒ Object

Expands class name like ‘Foo.*’ into multiple class names.



35
36
37
38
39
40
41
42
# File 'lib/jsduck/file_categories.rb', line 35

def expand(name)
  re = Regexp.new("^" + name.split(/\*/, -1).map {|part| Regexp.escape(part) }.join('.*') + "$")
  classes = @relations.to_a.find_all {|cls| re =~ cls[:name] && !cls[:private] }.map {|cls| cls[:name] }.sort
  if classes.length == 0
    Logger.instance.warn(:cat_no_match, "No class found matching a pattern '#{name}' in categories file.")
  end
  classes
end

#generateObject

Parses categories in JSON file



11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# File 'lib/jsduck/file_categories.rb', line 11

def generate
  @categories = JsonDuck.read(@filename)

  # Don't crash if old syntax is used.
  if @categories.is_a?(Hash) && @categories["categories"]
    Logger.instance.warn(:old_cat_format, 'Update categories file to contain just the array inside {"categories": [...]}')
    @categories = @categories["categories"]
  end

  # 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) # name =~ /\*/ ? expand(name) : name
      end.flatten
    end
  end

  validate

  @categories
end

#validateObject

Prints warnings for missing classes in categories file



45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
# File 'lib/jsduck/file_categories.rb', line 45

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 class is listed
  @relations.each do |cls|
    unless listed_classes[cls[:name]] || cls[:private]
      Logger.instance.warn(:cat_class_missing, "Class '#{cls[:name]}' not found in categories file")
    end
  end
end