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.



8
9
10
11
# File 'lib/jsduck/file_categories.rb', line 8

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

Instance Method Details

#deprecated?(cls) ⇒ Boolean

Returns:

  • (Boolean)


71
72
73
# File 'lib/jsduck/file_categories.rb', line 71

def deprecated?(cls)
  cls[:meta] && cls[:meta][:deprecated]
end

#expand(name) ⇒ Object

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



38
39
40
41
42
43
44
45
46
47
48
49
# File 'lib/jsduck/file_categories.rb', line 38

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] && !deprecated?(cls)
  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)
  end
  classes
end

#generateObject

Parses categories in JSON file



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

def generate
  @categories = Util::Json.read(@filename)

  # Don't crash if old syntax is used.
  if @categories.is_a?(Hash) && @categories["categories"]
    Logger.warn(nil, 'Update categories file to contain just the array inside {"categories": [...]}', @filename)
    @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)
      end.flatten
    end
  end

  validate

  @categories
end

#validateObject

Prints warnings for missing classes in categories file



52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
# File 'lib/jsduck/file_categories.rb', line 52

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] || deprecated?(cls)
      Logger.warn(:cat_class_missing, "Class '#{cls[:name]}' not found in categories file", @filename)
    end
  end
end