Class: JsDuck::App
- Inherits:
-
Object
- Object
- JsDuck::App
- Defined in:
- lib/jsduck/app.rb
Overview
The main application logic of jsduck
Instance Method Summary collapse
-
#aggregate(parsed_files) ⇒ Object
Aggregates parsing results sequencially.
-
#filter_classes(docs) ⇒ Object
Turns all aggregated data into Class objects.
-
#format_classes ⇒ Object
Formats each class.
-
#initialize(opts) ⇒ App
constructor
Initializes app with JsDuck::Options object.
-
#parallel_parse(filenames) ⇒ Object
Parses the files in parallel using as many processes as available CPU-s.
-
#run ⇒ Object
Call this after input parameters set.
Constructor Details
#initialize(opts) ⇒ App
Initializes app with JsDuck::Options object
34 35 36 37 38 39 40 41 |
# File 'lib/jsduck/app.rb', line 34 def initialize(opts) @opts = opts # Sets the nr of parallel processes to use. # Set to 0 to disable parallelization completely. @parallel = ParallelWrap.new(:in_processes => @opts.processes) # Turn JSON pretty-printing on/off JsonDuck.pretty = @opts.pretty_json end |
Instance Method Details
#aggregate(parsed_files) ⇒ Object
Aggregates parsing results sequencially
112 113 114 115 116 117 118 119 120 121 122 123 124 |
# File 'lib/jsduck/app.rb', line 112 def aggregate(parsed_files) agr = Aggregator.new parsed_files.each do |file| Logger.instance.log("Aggregating", file.filename) agr.aggregate(file) end agr.classify_orphans agr.create_global_class agr.remove_ignored_classes agr.create_accessors agr. agr.result end |
#filter_classes(docs) ⇒ Object
Turns all aggregated data into Class objects. Depending on –ignore-global either keeps or discards the global class. Warnings for global members are printed regardless of that setting, but of course can be turned off using –warnings=-global
130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 |
# File 'lib/jsduck/app.rb', line 130 def filter_classes(docs) classes = [] docs.each do |d| cls = Class.new(d) if d[:name] != "global" classes << cls else # add global class only if --ignore-global not specified classes << cls unless @opts.ignore_global # Print warning for each global member cls.all_local_members.each do |m| type = m[:tagname].to_s name = m[:name] file = m[:files][0] Logger.instance.warn(:global, "Global #{type}: #{name}", file[:filename], file[:linenr]) end end end Relations.new(classes, @opts.external_classes) end |
#format_classes ⇒ Object
Formats each class
153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 |
# File 'lib/jsduck/app.rb', line 153 def format_classes doc_formatter = DocFormatter.new(@relations, @opts) doc_formatter.img_path = "images" class_formatter = ClassFormatter.new(@relations, doc_formatter) # Don't format types when exporting class_formatter.include_types = !@opts.export # Format all doc-objects in parallel formatted_classes = @parallel.map(@relations.classes) do |cls| Logger.instance.log("Markdown formatting #{cls[:name]}") { :doc => class_formatter.format(cls.internal_doc), :images => doc_formatter.images } end # Then merge the data back to classes sequentially formatted_classes.each do |cls| @relations[cls[:doc][:name]].internal_doc = cls[:doc] cls[:images].each {|img| @assets.images.add(img) } end end |
#parallel_parse(filenames) ⇒ Object
Parses the files in parallel using as many processes as available CPU-s
104 105 106 107 108 109 |
# File 'lib/jsduck/app.rb', line 104 def parallel_parse(filenames) @parallel.map(filenames) do |fname| Logger.instance.log("Parsing", fname) SourceFile.new(JsDuck::IO.read(fname), fname, @opts) end end |
#run ⇒ Object
Call this after input parameters set
44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 |
# File 'lib/jsduck/app.rb', line 44 def run parsed_files = parallel_parse(@opts.input_files) result = aggregate(parsed_files) @relations = filter_classes(result) InheritDoc.new(@relations).resolve_all Lint.new(@relations).run # Initialize guides, videos, examples, ... @assets = Assets.new(@relations, @opts) # Give access to assets from all meta-tags MetaTagRegistry.instance.assets = @assets if @opts.export format_classes FileUtils.rm_rf(@opts.output_dir) unless @opts.output_dir == :stdout exporters = { :full => FullExporter, :api => ApiExporter, :examples => ExamplesExporter, } cw = ClassWriter.new(exporters[@opts.export], @relations, @opts) cw.write(@opts.output_dir, ".json") if @opts.export == :examples gw = GuideWriter.new(exporters[@opts.export], @assets.guides, @opts) gw.write(@opts.output_dir, ".json") end Stdout.instance.flush else FileUtils.rm_rf(@opts.output_dir) TemplateDir.new(@opts).write IndexHtml.new(@assets, @opts).write AppData.new(@relations, @assets, @opts).write(@opts.output_dir+"/data.js") # class-formatting is done in parallel which breaks the links # between source files and classes. Therefore it MUST to be done # after writing sources which needs the links to work. if @opts.source source_writer = SourceWriter.new(parsed_files, @parallel) source_writer.write(@opts.output_dir + "/source") end format_classes if @opts.tests examples = InlineExamples.new examples.add_classes(@relations) examples.add_guides(@assets.guides) examples.write(@opts.output_dir+"/inline-examples.js") end cw = ClassWriter.new(AppExporter, @relations, @opts) cw.write(@opts.output_dir+"/output", ".js") @assets.write end end |