jsduck 3.1.0 → 3.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. data/README.md +14 -9
  2. data/Rakefile +31 -230
  3. data/jsduck.gemspec +2 -2
  4. data/lib/jsduck/accessors.rb +14 -6
  5. data/lib/jsduck/aggregator.rb +9 -4
  6. data/lib/jsduck/app.rb +1 -0
  7. data/lib/jsduck/app_data.rb +14 -7
  8. data/lib/jsduck/app_exporter.rb +3 -3
  9. data/lib/jsduck/class.rb +8 -5
  10. data/lib/jsduck/class_formatter.rb +1 -3
  11. data/lib/jsduck/css_parser.rb +1 -1
  12. data/lib/jsduck/doc_formatter.rb +140 -36
  13. data/lib/jsduck/doc_parser.rb +27 -44
  14. data/lib/jsduck/index_html.rb +0 -3
  15. data/lib/jsduck/inherit_doc.rb +20 -4
  16. data/lib/jsduck/js_parser.rb +1 -1
  17. data/lib/jsduck/lint.rb +15 -0
  18. data/lib/jsduck/logger.rb +9 -7
  19. data/lib/jsduck/merger.rb +18 -16
  20. data/lib/jsduck/meta_tag.rb +28 -5
  21. data/lib/jsduck/meta_tag_loader.rb +38 -21
  22. data/lib/jsduck/meta_tag_registry.rb +79 -0
  23. data/lib/jsduck/options.rb +69 -12
  24. data/lib/jsduck/renderer.rb +10 -38
  25. data/lib/jsduck/search_data.rb +53 -3
  26. data/lib/jsduck/tag/abstract.rb +14 -0
  27. data/lib/jsduck/{author_tag.rb → tag/author.rb} +2 -2
  28. data/lib/jsduck/tag/deprecated.rb +33 -0
  29. data/lib/jsduck/{doc_author_tag.rb → tag/docauthor.rb} +2 -2
  30. data/lib/jsduck/tag/markdown.rb +12 -0
  31. data/lib/jsduck/tag/preventable.rb +28 -0
  32. data/lib/jsduck/tag/protected.rb +14 -0
  33. data/lib/jsduck/tag/readonly.rb +14 -0
  34. data/lib/jsduck/tag/required.rb +21 -0
  35. data/lib/jsduck/tag/static.rb +14 -0
  36. data/lib/jsduck/tag/template.rb +23 -0
  37. data/opt/example.js +149 -0
  38. metadata +17 -9
  39. data/opt/extjs-welcome.html +0 -74
  40. data/opt/touch-iframe.html +0 -85
  41. data/opt/touch-welcome.html +0 -122
@@ -1,5 +1,5 @@
1
1
  require 'optparse'
2
- require 'jsduck/meta_tag_loader'
2
+ require 'jsduck/meta_tag_registry'
3
3
  require 'jsduck/logger'
4
4
 
5
5
  module JsDuck
@@ -11,7 +11,6 @@ module JsDuck
11
11
  attr_accessor :output_dir
12
12
  attr_accessor :ignore_global
13
13
  attr_accessor :external_classes
14
- attr_accessor :meta_tags
15
14
 
16
15
  # Customizing output
17
16
  attr_accessor :title
@@ -70,10 +69,9 @@ module JsDuck
70
69
  # Special anything-goes type
71
70
  "Mixed",
72
71
  ]
73
- @meta_tags = []
74
72
  @meta_tag_paths = []
75
73
 
76
- @version = "3.1.0"
74
+ @version = "3.2.1"
77
75
 
78
76
  # Customizing output
79
77
  @title = "Sencha Docs - Ext JS"
@@ -107,6 +105,10 @@ module JsDuck
107
105
  @local_storage_db = "docs"
108
106
  @touch_examples_ui = false
109
107
  @ext_namespaces = ["Ext"]
108
+
109
+ # enable all warnings except :link_auto
110
+ Logger.instance.set_warning(:all, true)
111
+ Logger.instance.set_warning(:link_auto, false)
110
112
  end
111
113
 
112
114
  # Make options object behave like hash.
@@ -120,11 +122,11 @@ module JsDuck
120
122
  read_filenames(canonical(fname))
121
123
  end
122
124
  validate
123
- @meta_tags = MetaTagLoader.new.load(@meta_tag_paths)
125
+ MetaTagRegistry.instance.load([:builtins] + @meta_tag_paths)
124
126
  end
125
127
 
126
128
  def create_option_parser
127
- return OptionParser.new do | opts |
129
+ optparser = OptionParser.new do | opts |
128
130
  opts.banner = "Usage: jsduck [options] files/dirs...\n\n"
129
131
 
130
132
  opts.on('-o', '--output=PATH',
@@ -157,7 +159,9 @@ module JsDuck
157
159
  end
158
160
 
159
161
  opts.on('--no-warnings',
160
- "Turns off all warnings. Same as --warnings=-all", " ") do
162
+ "Turns off all warnings.",
163
+ "(Deprecated, use --warnings=-all instead.)", " ") do
164
+ Logger.instance.warn(nil, "--no-warnings is deprecated. Use --warnings=-all instead.")
161
165
  Logger.instance.set_warning(:all, false)
162
166
  end
163
167
 
@@ -177,8 +181,8 @@ module JsDuck
177
181
 
178
182
  opts.on('--footer=TEXT',
179
183
  "Custom footer text for the documentation.",
180
- "Defaults to: 'Generated with JSDuck.'", " ") do |text|
181
- @footer = text
184
+ "Defaults to: 'Generated with JSDuck {VERSION}.'", " ") do |text|
185
+ @footer = text.gsub(/\{VERSION\}/, @version)
182
186
  end
183
187
 
184
188
  opts.on('--head-html=HTML', "HTML to append to the <head> section of index.html.", " ") do |html|
@@ -277,8 +281,10 @@ module JsDuck
277
281
 
278
282
  opts.on('--warnings=+A,-B,+C', Array,
279
283
  "Turns warnings selectively on/off.",
280
- "+foo turns on a warning, -foo turns it off.",
281
- "Possible warning types are:",
284
+ " ",
285
+ " +all - to turn on all warnings",
286
+ " ",
287
+ "By default these warnings are turned +on/-off:",
282
288
  " ",
283
289
  *Logger.instance.doc_warnings) do |warnings|
284
290
  warnings.each do |op|
@@ -332,6 +338,17 @@ module JsDuck
332
338
  @ext_namespaces = ns
333
339
  end
334
340
 
341
+ opts.on('--config=PATH',
342
+ "Loads config options from JSON file.", " ") do |path|
343
+ path = canonical(path)
344
+ config = read_json_config(path)
345
+ # treat paths inside JSON config relative to the location of
346
+ # config file. When done, switch back to current working dir.
347
+ @working_dir = File.dirname(path)
348
+ optparser.parse!(config).each {|fname| read_filenames(canonical(fname)) }
349
+ @working_dir = nil
350
+ end
351
+
335
352
  opts.on('-h', '--help[=full]',
336
353
  "Short help or --help=full for all available options.", " ") do |v|
337
354
  if v == 'full'
@@ -378,6 +395,31 @@ module JsDuck
378
395
  exit
379
396
  end
380
397
  end
398
+
399
+ return optparser
400
+ end
401
+
402
+ # Reads JSON configuration from file and returns an array of
403
+ # config options that can be feeded into optparser.
404
+ def read_json_config(fname)
405
+ config = []
406
+ json = JsonDuck.read(fname)
407
+ json.each_pair do |key, value|
408
+ if key == "--"
409
+ # filenames
410
+ config += Array(value).map(&:to_s)
411
+ elsif value == true
412
+ # simple switch
413
+ config += [key.to_s]
414
+ else
415
+ # An option with value or with multiple values.
416
+ # In the latter case, add the option multiple times.
417
+ Array(value).each do |v|
418
+ config += [key.to_s, v.to_s]
419
+ end
420
+ end
421
+ end
422
+ config
381
423
  end
382
424
 
383
425
  # scans directory for .js files or simply adds file to input files list
@@ -385,6 +427,8 @@ module JsDuck
385
427
  if File.exists?(fname)
386
428
  if File.directory?(fname)
387
429
  Dir[fname+"/**/*.{js,css,scss}"].each {|f| @input_files << f }
430
+ elsif fname =~ /\.jsb3$/
431
+ @input_files += extract_jsb_files(fname)
388
432
  else
389
433
  @input_files << fname
390
434
  end
@@ -393,13 +437,26 @@ module JsDuck
393
437
  end
394
438
  end
395
439
 
440
+ # Extracts files of first build in jsb file
441
+ def extract_jsb_files(jsb_file)
442
+ json = JSON.parse(IO.read(jsb_file))
443
+ basedir = File.dirname(jsb_file)
444
+
445
+ return json["builds"][0]["packages"].map do |package_id|
446
+ package = json["packages"].find {|p| p["id"] == package_id }
447
+ (package ? package["files"] : []).map do |file|
448
+ File.expand_path(basedir + "/" + file["path"] + file["name"])
449
+ end
450
+ end.flatten
451
+ end
452
+
396
453
  # Converts relative path to full path
397
454
  #
398
455
  # Especially important for running on Windows where C:\foo\bar
399
456
  # pathnames are converted to C:/foo/bar which ruby can work on
400
457
  # more easily.
401
458
  def canonical(path)
402
- File.expand_path(path)
459
+ File.expand_path(path, @working_dir)
403
460
  end
404
461
 
405
462
  # Runs checks on the options
@@ -1,3 +1,4 @@
1
+ require 'jsduck/meta_tag_registry'
1
2
  require 'cgi'
2
3
 
3
4
  module JsDuck
@@ -5,12 +6,13 @@ module JsDuck
5
6
  # Ruby-side implementation of class docs Renderer.
6
7
  # Uses PhantomJS to run Docs.Renderer JavaScript.
7
8
  class Renderer
8
- # List of meta-tag implementations
9
- attr_accessor :meta_tags
10
-
11
9
  def render(cls)
12
10
  @cls = cls
13
11
 
12
+ # Set doc-formatter context to this class
13
+ MetaTagRegistry.instance.formatter.class_context = @cls[:name]
14
+ MetaTagRegistry.instance.formatter.doc_context = @cls[:files][0]
15
+
14
16
  return [
15
17
  "<div>",
16
18
  render_sidebar,
@@ -38,8 +40,8 @@ module JsDuck
38
40
  def render_meta_data(meta_data)
39
41
  return if meta_data.size == 0
40
42
 
41
- @meta_tags.map do |tag|
42
- contents = meta_data[tag.name]
43
+ MetaTagRegistry.instance.tags.map do |tag|
44
+ contents = meta_data[tag.key]
43
45
  if contents
44
46
  tag.to_html(contents)
45
47
  else
@@ -221,20 +223,8 @@ module JsDuck
221
223
  end
222
224
 
223
225
  after = ""
224
- if m[:protected]
225
- after += "<strong class='protected signature'>protected</strong>"
226
- end
227
- if m[:static]
228
- after += "<strong class='static signature'>static</strong>"
229
- end
230
- if m[:deprecated]
231
- after += "<strong class='deprecated signature'>deprecated</strong>"
232
- end
233
- if m[:required]
234
- after += "<strong class='required signature'>required</strong>"
235
- end
236
- if m[:template]
237
- after += "<strong class='template signature'>template</strong>"
226
+ MetaTagRegistry.instance.signatures.each do |s|
227
+ after += "<strong class='#{s[:key]} signature'>#{s[:long]}</strong>" if m[:meta][s[:key]]
238
228
  end
239
229
 
240
230
  uri = "#!/api/#{m[:owner]}-#{m[:id]}"
@@ -259,25 +249,7 @@ module JsDuck
259
249
  doc << "<p>Defaults to: <code>" + CGI.escapeHTML(m[:default]) + "</code></p>"
260
250
  end
261
251
 
262
- if m[:deprecated]
263
- v = m[:deprecated][:version] ? "since " + m[:deprecated][:version] : ""
264
- doc << [
265
- "<div class='signature-box deprecated'>",
266
- "<p>This #{m[:tagname]} has been <strong>deprecated</strong> #{v}</p>",
267
- m[:deprecated][:text],
268
- "</div>",
269
- ]
270
- end
271
-
272
- if m[:template]
273
- doc << [
274
- "<div class='signature-box template'>",
275
- "<p>This is a template method. A hook into the functionality of this class.",
276
- "Feel free to override it in child classes.</p>",
277
- "</div>",
278
- ]
279
- end
280
-
252
+ MetaTagRegistry.instance.formatter.doc_context = m[:files][0]
281
253
  doc << render_meta_data(m[:meta])
282
254
 
283
255
  doc << render_params_and_return(m)
@@ -10,6 +10,17 @@ module JsDuck
10
10
  list = []
11
11
  docs.each do |cls|
12
12
  list << class_node(cls)
13
+
14
+ cls[:alternateClassNames].each do |name|
15
+ list << alt_node(name, cls)
16
+ end
17
+
18
+ cls[:aliases].each_pair do |key, items|
19
+ items.each do |name|
20
+ list << alias_node(key, name, cls)
21
+ end
22
+ end
23
+
13
24
  [:members, :statics].each do |group|
14
25
  cls[group].each_key do |type|
15
26
  cls.members(type, group).each do |m|
@@ -24,13 +35,39 @@ module JsDuck
24
35
  list
25
36
  end
26
37
 
38
+ # Creates structure representing one alias
39
+ def alias_node(key, name, cls)
40
+ return {
41
+ :cls => alias_display_name(key)+": "+name,
42
+ :member => name,
43
+ :type => :class,
44
+ :icon => :subclass,
45
+ :id => cls.full_name,
46
+ :sort => 0,
47
+ }
48
+ end
49
+
27
50
  # Creates structure representing one class
28
51
  def class_node(cls)
29
52
  return {
30
53
  :cls => cls.full_name,
31
54
  :member => cls.short_name,
32
55
  :type => :class,
33
- :aliases => cls[:aliases]
56
+ :icon => :class,
57
+ :id => cls.full_name,
58
+ :sort => 1,
59
+ }
60
+ end
61
+
62
+ # Creates structure representing one alternate classname
63
+ def alt_node(name, cls)
64
+ return {
65
+ :cls => name,
66
+ :member => Class.short_name(name),
67
+ :type => :class,
68
+ :icon => :subclass,
69
+ :id => cls.full_name,
70
+ :sort => 2,
34
71
  }
35
72
  end
36
73
 
@@ -39,9 +76,22 @@ module JsDuck
39
76
  return {
40
77
  :cls => cls.full_name,
41
78
  :member => member[:name],
42
- :type => member[:tagname],
43
- :id => member[:id],
79
+ :type => :member,
80
+ :icon => member[:tagname],
81
+ :id => cls.full_name + "-" + member[:id],
82
+ :sort => 3,
83
+ }
84
+ end
85
+
86
+ # Some alias types are shown differently.
87
+ # e.g. instead of "widget:" we show "xtype:"
88
+ def alias_display_name(key)
89
+ titles = {
90
+ "widget" => "xtype",
91
+ "plugin" => "ptype",
92
+ "feature" => "ftype",
44
93
  }
94
+ titles[key] || key
45
95
  end
46
96
 
47
97
  end
@@ -0,0 +1,14 @@
1
+ require "jsduck/meta_tag"
2
+
3
+ module JsDuck::Tag
4
+ # Implementation of @abstract tag
5
+ class Abstract < JsDuck::MetaTag
6
+ def initialize
7
+ @name = "abstract"
8
+ @key = :abstract
9
+ @signature = {:long => "abstract", :short => "ABS"}
10
+ @boolean = true
11
+ end
12
+ end
13
+ end
14
+
@@ -1,8 +1,8 @@
1
1
  require "jsduck/meta_tag"
2
2
 
3
- module JsDuck
3
+ module JsDuck::Tag
4
4
  # Implementation of hidden @author tag
5
- class AuthorTag < MetaTag
5
+ class Author < JsDuck::MetaTag
6
6
  def initialize
7
7
  @name = "author"
8
8
  end
@@ -0,0 +1,33 @@
1
+ require "jsduck/meta_tag"
2
+
3
+ module JsDuck::Tag
4
+ # Implementation of @deprecated tag
5
+ class Deprecated < JsDuck::MetaTag
6
+ def initialize
7
+ @name = "deprecated"
8
+ @key = :deprecated
9
+ @signature = {:long => "deprecated", :short => "DEP"}
10
+ @multiline = true
11
+ end
12
+
13
+ def to_value(contents)
14
+ text = contents[0]
15
+ if text =~ /\A([0-9.]+)(.*)\Z/
16
+ {:version => $1, :text => $2.strip}
17
+ else
18
+ {:text => text || ""}
19
+ end
20
+ end
21
+
22
+ def to_html(depr)
23
+ v = depr[:version] ? "since " + depr[:version] : ""
24
+ <<-EOHTML
25
+ <div class='signature-box deprecated'>
26
+ <p>This member has been <strong>deprecated</strong> #{v}</p>
27
+ #{format(depr[:text])}
28
+ </div>
29
+ EOHTML
30
+ end
31
+ end
32
+ end
33
+
@@ -1,8 +1,8 @@
1
1
  require "jsduck/meta_tag"
2
2
 
3
- module JsDuck
3
+ module JsDuck::Tag
4
4
  # Implementation of hidden @docauthor tag
5
- class DocAuthorTag < MetaTag
5
+ class Docauthor < JsDuck::MetaTag
6
6
  def initialize
7
7
  @name = "docauthor"
8
8
  end
@@ -0,0 +1,12 @@
1
+ require "jsduck/meta_tag"
2
+
3
+ module JsDuck::Tag
4
+ # A @markdown tag that is simply ignored
5
+ class Markdown < JsDuck::MetaTag
6
+ def initialize
7
+ @name = "markdown"
8
+ @boolean = true
9
+ end
10
+ end
11
+ end
12
+
@@ -0,0 +1,28 @@
1
+ require "jsduck/meta_tag"
2
+
3
+ module JsDuck::Tag
4
+ # Implementation of @preventable tag
5
+ class Preventable < JsDuck::MetaTag
6
+ def initialize
7
+ @name = "preventable"
8
+ @key = :preventable
9
+ @signature = {:long => "preventable", :short => "PREV"}
10
+ end
11
+
12
+ # @preventable is optionally followed by some method name, but we
13
+ # don't document it.
14
+ def to_value(contents)
15
+ true
16
+ end
17
+
18
+ def to_html(v)
19
+ <<-EOHTML
20
+ <div class='signature-box preventable'>
21
+ <p>This action following this event is <b>preventable</b>.
22
+ When any of the listeners returns false, the action is cancelled.</p>
23
+ </div>
24
+ EOHTML
25
+ end
26
+ end
27
+ end
28
+