pdoc 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (122) hide show
  1. data/README.markdown +34 -0
  2. data/Rakefile +46 -0
  3. data/bin/pdoc +58 -0
  4. data/lib/pdoc.rb +32 -0
  5. data/lib/pdoc/error.rb +4 -0
  6. data/lib/pdoc/generators.rb +6 -0
  7. data/lib/pdoc/generators/abstract_generator.rb +16 -0
  8. data/lib/pdoc/generators/html.rb +8 -0
  9. data/lib/pdoc/generators/html/helpers.rb +256 -0
  10. data/lib/pdoc/generators/html/page.rb +71 -0
  11. data/lib/pdoc/generators/html/syntax_highlighter.rb +41 -0
  12. data/lib/pdoc/generators/html/template.rb +37 -0
  13. data/lib/pdoc/generators/html/website.rb +194 -0
  14. data/lib/pdoc/generators/json.rb +15 -0
  15. data/lib/pdoc/generators/pythonesque.rb +105 -0
  16. data/lib/pdoc/models.rb +47 -0
  17. data/lib/pdoc/models/argument.rb +37 -0
  18. data/lib/pdoc/models/base.rb +107 -0
  19. data/lib/pdoc/models/callable.rb +19 -0
  20. data/lib/pdoc/models/class.rb +28 -0
  21. data/lib/pdoc/models/class_method.rb +18 -0
  22. data/lib/pdoc/models/class_property.rb +9 -0
  23. data/lib/pdoc/models/constant.rb +9 -0
  24. data/lib/pdoc/models/constructor.rb +14 -0
  25. data/lib/pdoc/models/container.rb +114 -0
  26. data/lib/pdoc/models/entity.rb +54 -0
  27. data/lib/pdoc/models/instance_method.rb +18 -0
  28. data/lib/pdoc/models/instance_property.rb +9 -0
  29. data/lib/pdoc/models/mixin.rb +10 -0
  30. data/lib/pdoc/models/namespace.rb +10 -0
  31. data/lib/pdoc/models/root.rb +27 -0
  32. data/lib/pdoc/models/section.rb +19 -0
  33. data/lib/pdoc/models/signature.rb +27 -0
  34. data/lib/pdoc/models/utility.rb +11 -0
  35. data/lib/pdoc/parser.rb +109 -0
  36. data/lib/pdoc/parser/argument_description_nodes.rb +21 -0
  37. data/lib/pdoc/parser/basic_nodes.rb +31 -0
  38. data/lib/pdoc/parser/description_nodes.rb +42 -0
  39. data/lib/pdoc/parser/documentation_nodes.rb +483 -0
  40. data/lib/pdoc/parser/ebnf_arguments_nodes.rb +58 -0
  41. data/lib/pdoc/parser/ebnf_expression_nodes.rb +227 -0
  42. data/lib/pdoc/parser/fragment.rb +55 -0
  43. data/lib/pdoc/parser/section_content_nodes.rb +19 -0
  44. data/lib/pdoc/parser/tags_nodes.rb +14 -0
  45. data/lib/pdoc/parser/treetop_files/argument_description.treetop +31 -0
  46. data/lib/pdoc/parser/treetop_files/basic.treetop +41 -0
  47. data/lib/pdoc/parser/treetop_files/description.treetop +7 -0
  48. data/lib/pdoc/parser/treetop_files/documentation.treetop +75 -0
  49. data/lib/pdoc/parser/treetop_files/ebnf_arguments.treetop +33 -0
  50. data/lib/pdoc/parser/treetop_files/ebnf_expression.treetop +70 -0
  51. data/lib/pdoc/parser/treetop_files/ebnf_javascript.treetop +54 -0
  52. data/lib/pdoc/parser/treetop_files/events.treetop +17 -0
  53. data/lib/pdoc/parser/treetop_files/section_content.treetop +8 -0
  54. data/lib/pdoc/parser/treetop_files/tags.treetop +31 -0
  55. data/lib/pdoc/runner.rb +110 -0
  56. data/lib/pdoc/treemaker.rb +94 -0
  57. data/pdoc.gemspec +31 -0
  58. data/templates/html/assets/images/pdoc/alias.png +0 -0
  59. data/templates/html/assets/images/pdoc/class.png +0 -0
  60. data/templates/html/assets/images/pdoc/class_deprecated.png +0 -0
  61. data/templates/html/assets/images/pdoc/class_method.png +0 -0
  62. data/templates/html/assets/images/pdoc/class_property.png +0 -0
  63. data/templates/html/assets/images/pdoc/constant.png +0 -0
  64. data/templates/html/assets/images/pdoc/constructor.png +0 -0
  65. data/templates/html/assets/images/pdoc/deprecated.png +0 -0
  66. data/templates/html/assets/images/pdoc/description.png +0 -0
  67. data/templates/html/assets/images/pdoc/information.png +0 -0
  68. data/templates/html/assets/images/pdoc/instance_method.png +0 -0
  69. data/templates/html/assets/images/pdoc/instance_property.png +0 -0
  70. data/templates/html/assets/images/pdoc/method.png +0 -0
  71. data/templates/html/assets/images/pdoc/method_deprecated.png +0 -0
  72. data/templates/html/assets/images/pdoc/mixin.png +0 -0
  73. data/templates/html/assets/images/pdoc/namespace.png +0 -0
  74. data/templates/html/assets/images/pdoc/property.png +0 -0
  75. data/templates/html/assets/images/pdoc/related_to.png +0 -0
  76. data/templates/html/assets/images/pdoc/search-background.png +0 -0
  77. data/templates/html/assets/images/pdoc/section-background.png +0 -0
  78. data/templates/html/assets/images/pdoc/section.png +0 -0
  79. data/templates/html/assets/images/pdoc/selected-section-background.png +0 -0
  80. data/templates/html/assets/images/pdoc/subclass.png +0 -0
  81. data/templates/html/assets/images/pdoc/superclass.png +0 -0
  82. data/templates/html/assets/images/pdoc/utility.png +0 -0
  83. data/templates/html/assets/javascripts/pdoc/application.js +478 -0
  84. data/templates/html/assets/javascripts/pdoc/prototype.js +4874 -0
  85. data/templates/html/assets/javascripts/pdoc/tabs.js +506 -0
  86. data/templates/html/assets/stylesheets/pdoc/api.css +677 -0
  87. data/templates/html/assets/stylesheets/pdoc/pygments.css +62 -0
  88. data/templates/html/helpers.rb +35 -0
  89. data/templates/html/index.erb +18 -0
  90. data/templates/html/item_index.js.erb +6 -0
  91. data/templates/html/layout.erb +67 -0
  92. data/templates/html/leaf.erb +22 -0
  93. data/templates/html/node.erb +30 -0
  94. data/templates/html/partials/class_relationships.erb +19 -0
  95. data/templates/html/partials/classes.erb +7 -0
  96. data/templates/html/partials/constructor.erb +5 -0
  97. data/templates/html/partials/description.erb +5 -0
  98. data/templates/html/partials/link_list.erb +1 -0
  99. data/templates/html/partials/method_signatures.erb +14 -0
  100. data/templates/html/partials/methodized_note.erb +9 -0
  101. data/templates/html/partials/mixins.erb +7 -0
  102. data/templates/html/partials/namespaces.erb +7 -0
  103. data/templates/html/partials/related_utilities.erb +5 -0
  104. data/templates/html/partials/relationships.erb +11 -0
  105. data/templates/html/partials/short_description_list.erb +7 -0
  106. data/templates/html/partials/title.erb +22 -0
  107. data/templates/html/section.erb +18 -0
  108. data/test/unit/parser/argument_description_test.rb +40 -0
  109. data/test/unit/parser/basic_test.rb +55 -0
  110. data/test/unit/parser/description_test.rb +34 -0
  111. data/test/unit/parser/documentation_test.rb +520 -0
  112. data/test/unit/parser/ebnf_arguments_test.rb +81 -0
  113. data/test/unit/parser/ebnf_expression_test.rb +382 -0
  114. data/test/unit/parser/ebnf_javascript_test.rb +37 -0
  115. data/test/unit/parser/events_test.rb +27 -0
  116. data/test/unit/parser/section_content_test.rb +44 -0
  117. data/test/unit/parser/tags_test.rb +39 -0
  118. data/test/unit/parser/test_fragment.rb +80 -0
  119. data/test/unit/parser_test_helper.rb +62 -0
  120. data/test/unit/runner/basic_test.rb +14 -0
  121. data/test/unit/templates/html_helpers_test.rb +25 -0
  122. metadata +222 -0
@@ -0,0 +1,58 @@
1
+ module EbnfArguments
2
+ class Argument < Treetop::Runtime::SyntaxNode
3
+ def name
4
+ text_value.strip
5
+ end
6
+
7
+ def optional?
8
+ false
9
+ end
10
+
11
+ def default_value
12
+ nil
13
+ end
14
+
15
+ def flatten_nested_args
16
+ [self]
17
+ end
18
+ end
19
+
20
+ class OptionalArgument < Treetop::Runtime::SyntaxNode
21
+ def name
22
+ required_argument.name
23
+ end
24
+
25
+ def optional?
26
+ true
27
+ end
28
+
29
+ def default_value
30
+ unless default.empty?
31
+ value = default.value.text_value.strip
32
+ value.empty? ? nil : value
33
+ end
34
+ end
35
+
36
+ def flatten_nested_args
37
+ arguments = [self]
38
+ unless nested.empty?
39
+ nested.elements.each do |optional|
40
+ arguments.concat(optional.flatten_nested_args)
41
+ end
42
+ end
43
+ arguments
44
+ end
45
+ end
46
+
47
+ class Arguments < Treetop::Runtime::SyntaxNode
48
+ def to_a
49
+ first_argument.flatten_nested_args + rest_arguments_flattened
50
+ end
51
+
52
+ def rest_arguments_flattened
53
+ rest.elements.inject([]) do |args, e|
54
+ args.concat(e.argument.flatten_nested_args)
55
+ end
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,227 @@
1
+ module EbnfExpression
2
+ class Base < Treetop::Runtime::SyntaxNode
3
+ def klass_name
4
+ js_namespace.to_a.last
5
+ end
6
+
7
+ def name
8
+ js_variable.value
9
+ end
10
+
11
+ def full_name
12
+ js_namespace.text_value
13
+ end
14
+
15
+ def namespace
16
+ js_namespace.text_value
17
+ end
18
+
19
+ def returns
20
+ return_value.value.text_value.strip
21
+ end
22
+
23
+ def to_s
24
+ text_value
25
+ end
26
+
27
+ def inspect
28
+ "#<#{self.class} @input=#{@input.inspect}>"
29
+ end
30
+ end
31
+
32
+ class Method < Base
33
+ def arguments
34
+ args.arguments.to_a
35
+ end
36
+
37
+ def methodized?
38
+ false
39
+ end
40
+
41
+ def signature
42
+ "#{name}#{args.text_value}"
43
+ end
44
+ end
45
+
46
+ class KlassMethod < Method
47
+ def klass_name
48
+ js_namespace.to_a.slice(-2)
49
+ end
50
+
51
+ def name
52
+ js_namespace.to_a.last
53
+ end
54
+
55
+ def methodized?
56
+ args.methodize.text_value == '@'
57
+ end
58
+
59
+ def namespace
60
+ js_namespace.to_a.slice(0..-2).join(".")
61
+ end
62
+
63
+ def signature
64
+ "#{namespace}.#{name}#{args.text_value.sub('@', '')}"
65
+ end
66
+ end
67
+
68
+ class Utility < Method
69
+ def klass_name
70
+ nil
71
+ end
72
+
73
+ def name
74
+ utility_name.text_value
75
+ end
76
+
77
+ def full_name
78
+ name
79
+ end
80
+
81
+ def namespace
82
+ ""
83
+ end
84
+ end
85
+
86
+ class InstanceMethod < Method
87
+ def accessor
88
+ instance_signature.instance_accessor
89
+ end
90
+
91
+ def args
92
+ instance_signature.args
93
+ end
94
+
95
+ def js_namespace
96
+ accessor.js_namespace
97
+ end
98
+
99
+ def js_variable
100
+ accessor.js_variable
101
+ end
102
+
103
+ def full_name
104
+ accessor.text_value
105
+ end
106
+
107
+ def signature
108
+ instance_signature.text_value
109
+ end
110
+ end
111
+
112
+ class Constructor < Method
113
+ def name
114
+ "new"
115
+ end
116
+
117
+ def full_name
118
+ "new #{super}"
119
+ end
120
+
121
+ def returns
122
+ nil
123
+ end
124
+
125
+ def signature
126
+ "#{full_name}#{args.text_value}"
127
+ end
128
+ end
129
+
130
+ class KlassProperty < Base
131
+ def klass_name
132
+ js_namespace.to_a.slice(-2)
133
+ end
134
+
135
+ def name
136
+ js_namespace.to_a.last
137
+ end
138
+
139
+ def namespace
140
+ js_namespace.to_a.slice(0..-2).join(".")
141
+ end
142
+
143
+ def signature
144
+ "#{namespace}.#{name}"
145
+ end
146
+ end
147
+
148
+ class InstanceProperty < Base
149
+ def accessor
150
+ instance_accessor
151
+ end
152
+
153
+ def js_namespace
154
+ accessor.js_namespace
155
+ end
156
+
157
+ def js_variable
158
+ accessor.js_variable
159
+ end
160
+
161
+ def full_name
162
+ accessor.text_value
163
+ end
164
+
165
+ def signature
166
+ "#{namespace}##{name}"
167
+ end
168
+ end
169
+
170
+ class Constant < Base
171
+ def klass_name
172
+ nil
173
+ end
174
+
175
+ def name
176
+ js_namespace.to_a.last
177
+ end
178
+
179
+ def namespace
180
+ js_namespace.to_a.slice(0..-2).join(".")
181
+ end
182
+
183
+ def returns
184
+ value.text_value.strip
185
+ end
186
+
187
+ def signature
188
+ "#{namespace}.#{name}"
189
+ end
190
+ end
191
+
192
+ class Namespace < Base
193
+ def klass_name
194
+ nil
195
+ end
196
+
197
+ def name
198
+ js_namespace.to_a.last
199
+ end
200
+
201
+ def namespace
202
+ js_namespace.to_a.slice(0..-2).join(".")
203
+ end
204
+
205
+ def mixins
206
+ second_line = elements.last
207
+ if second_line.empty?
208
+ []
209
+ else
210
+ [second_line.js_namespace].concat(second_line.more.elements.map{|e| e.elements.last})
211
+ end
212
+ end
213
+ end
214
+
215
+ class Klass < Namespace
216
+ def subklass?
217
+ !extends.elements.nil?
218
+ end
219
+
220
+ def superklass
221
+ subklass? ? extends.elements.last : nil
222
+ end
223
+ end
224
+
225
+ class Mixin < Namespace
226
+ end
227
+ end
@@ -0,0 +1,55 @@
1
+ require 'pdoc/error'
2
+
3
+ module PDoc
4
+ class Fragment
5
+ PREFIX_REGEXP = /^\s*\*?\s*/
6
+
7
+ attr_reader :line_number
8
+ def initialize(string, line_number)
9
+ @line_number = line_number
10
+ @string = string
11
+ end
12
+
13
+ def normalize
14
+ # Cleans up the text by removing opening and closing comment tags
15
+ # and removing the prefix off of every line.
16
+ # Raises and error if prefix are inconsistent. (Prefix is calculated
17
+ # by looking at line 2 of the comment)
18
+ results = []
19
+ lines.each_with_index do |line, index|
20
+ if index == 0 # first line
21
+ results << line.sub(/\s*\/\*\*\s*/, '') # remove opening /**
22
+ elsif index == lines.size - 1 # last line
23
+ results << line.sub(/\s*\*\*?\/\s*/, '') # remove closing **/
24
+ elsif line =~ prefix_regexp # correctly prefixed lines
25
+ results << line.sub(prefix_regexp, '') # remove optional prefix
26
+ else
27
+ raise InconsistentPrefixError.new(self, line, index)
28
+ end
29
+ end
30
+ results
31
+ end
32
+
33
+ def prefix
34
+ PREFIX_REGEXP.match(lines[1])[0] if lines.size > 2
35
+ end
36
+
37
+ def prefix_regexp
38
+ @prefix_regexp ||= Regexp.new('^' << Regexp.escape(prefix))
39
+ end
40
+
41
+ def lines
42
+ @lines ||= @string.split("\n")
43
+ end
44
+
45
+ class InconsistentPrefixError < PDocError
46
+ def initialize(fragment, line, index)
47
+ @fragment = fragment
48
+ actual = PREFIX_REGEXP.match(line)[0].inspect
49
+ msg = "Inconsistent prefixing at line ##{fragment.line_number + index}."
50
+ msg << "Expected prefix is: #{fragment.prefix.inspect}, actual prefix is: #{actual}"
51
+ super(msg)
52
+ end
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,19 @@
1
+ module SectionContent
2
+ class Section < Treetop::Runtime::SyntaxNode
3
+ def name
4
+ title.text_value.strip
5
+ end
6
+
7
+ def description
8
+ text.to_s
9
+ end
10
+
11
+ def full_name
12
+ name
13
+ end
14
+
15
+ def id
16
+ name.downcase.gsub(/\s+/, "_")
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,14 @@
1
+ module Tags
2
+ class Tags < Treetop::Runtime::SyntaxNode
3
+ include Enumerable
4
+
5
+ def include?(tag_name)
6
+ any? {|tag| tag.name == tag_name }
7
+ end
8
+
9
+ def each
10
+ yield tag
11
+ more.elements.each { |e| yield e.tag }
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,31 @@
1
+ grammar ArgumentDescription
2
+ include EbnfJavascript
3
+
4
+ rule argument_description
5
+ first:argument_description_first_line more:(argument_description_line)* <ArgumentDescription>
6
+ end
7
+
8
+ rule argument_description_first_line
9
+ line space* '-' space+ argument_name arg_types:(space+ arguments_types)? ':' description:char+
10
+ end
11
+
12
+ rule argument_description_line
13
+ line space* first_char:(!'-' .) more_char:char+ {
14
+ def to_s
15
+ first_char.text_value << more_char.text_value
16
+ end
17
+ }
18
+ end
19
+
20
+ rule argument_name
21
+ '@'? name:[a-zA-Z$]+
22
+ end
23
+
24
+ rule arguments_types
25
+ '(' space* argument_type more:(space+ '|' space+ argument_type)* space* ')'
26
+ end
27
+
28
+ rule argument_type
29
+ js_namespace / '?'
30
+ end
31
+ end
@@ -0,0 +1,41 @@
1
+ grammar Basic
2
+ rule test_base
3
+ (blank_line / text_line / comment_start / comment_end / line / line_break / space / char)+
4
+ end
5
+
6
+ rule blank_line
7
+ line_break space* line_separator space* &(line_break) <BlankLine>
8
+ end
9
+
10
+ rule text_line
11
+ line text:char+ <TextLine>
12
+ end
13
+
14
+ rule line
15
+ line_break space* line_separator space <Line>
16
+ end
17
+
18
+ rule comment_start
19
+ line_break space* "/**" space* <CommentStart>
20
+ end
21
+
22
+ rule comment_end
23
+ line_break space* "**/" space* line_break <CommentEnd>
24
+ end
25
+
26
+ rule line_break
27
+ [\n] <LineBreak>
28
+ end
29
+
30
+ rule line_separator
31
+ "*"
32
+ end
33
+
34
+ rule char
35
+ ![\n] . <Char>
36
+ end
37
+
38
+ rule space
39
+ " " <Space>
40
+ end
41
+ end