docurium 0.3.2 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.travis.yml +13 -0
- data/Gemfile +6 -0
- data/Rakefile +6 -0
- data/docurium.gemspec +5 -3
- data/lib/docurium.rb +186 -137
- data/lib/docurium/docparser.rb +292 -0
- data/lib/docurium/version.rb +1 -1
- data/lib/libdetect.rb +23 -0
- data/site/css/style.css +4 -0
- data/site/index.html +56 -10
- data/site/js/docurium.js +28 -5
- data/site/shared/css/documentation.css +1 -0
- data/test/fixtures/git2/errors.h +2 -0
- data/test/parser_test.rb +333 -46
- data/test/repo_test.rb +14 -6
- metadata +59 -44
data/test/fixtures/git2/errors.h
CHANGED
data/test/parser_test.rb
CHANGED
@@ -1,21 +1,20 @@
|
|
1
1
|
require 'minitest/autorun'
|
2
2
|
require 'docurium'
|
3
|
+
require 'pp'
|
3
4
|
|
4
5
|
class TestParser < Minitest::Unit::TestCase
|
5
6
|
|
6
7
|
def setup
|
7
|
-
@parser = Docurium::
|
8
|
+
@parser = Docurium::DocParser.new
|
8
9
|
end
|
9
10
|
|
10
11
|
# e.g. parse('git2/refs.h')
|
11
|
-
def parse(path)
|
12
|
-
|
13
|
-
|
14
|
-
parser = Docurium::CParser.new
|
15
|
-
parser.parse_text(path, File.read(realpath))
|
12
|
+
def parse(path, contents)
|
13
|
+
@parser.parse_file(path, [[path, contents]])
|
16
14
|
end
|
17
15
|
|
18
16
|
def test_single_function
|
17
|
+
|
19
18
|
name = 'function.h'
|
20
19
|
contents = <<EOF
|
21
20
|
/**
|
@@ -29,21 +28,17 @@ class TestParser < Minitest::Unit::TestCase
|
|
29
28
|
int some_function(char *string);
|
30
29
|
EOF
|
31
30
|
|
32
|
-
|
33
|
-
Do something
|
34
|
-
|
35
|
-
More explanation of what we do
|
36
|
-
|
37
|
-
@param string a sequence of characters
|
38
|
-
@return an integer value
|
39
|
-
EOF
|
40
|
-
|
41
|
-
actual = @parser.parse_text(name, contents)
|
31
|
+
actual = parse(name, contents)
|
42
32
|
expected = [{:file => "function.h",
|
43
33
|
:line => 9,
|
44
|
-
:
|
45
|
-
:
|
34
|
+
:lineto => 9,
|
35
|
+
:tdef => nil,
|
46
36
|
:type => :function,
|
37
|
+
:name => 'some_function',
|
38
|
+
:body => 'int some_function(char *string);',
|
39
|
+
:description => ' Do something',
|
40
|
+
:comments => " More explanation of what we do\n\n ",
|
41
|
+
:sig => 'char *',
|
47
42
|
:args => [{
|
48
43
|
:name => 'string',
|
49
44
|
:type => 'char *',
|
@@ -51,22 +46,20 @@ EOF
|
|
51
46
|
}],
|
52
47
|
:return => {
|
53
48
|
:type => 'int',
|
54
|
-
:comment => 'an integer value'
|
49
|
+
:comment => ' an integer value'
|
55
50
|
},
|
56
|
-
:argline => 'char *string',
|
57
|
-
:sig => 'char *',
|
58
|
-
:description => 'Do something',
|
59
|
-
:lineto => 9,
|
60
|
-
:comments => "More explanation of what we do\n",
|
61
51
|
:decl => 'int some_function(char *string)',
|
62
|
-
:
|
52
|
+
:argline => 'char *string',
|
53
|
+
}]
|
63
54
|
|
64
55
|
assert_equal expected, actual
|
65
56
|
end
|
66
57
|
|
67
58
|
def test_single_multiline_function
|
59
|
+
|
68
60
|
name = 'function.h'
|
69
61
|
contents = <<EOF
|
62
|
+
#include <stdlib.h>
|
70
63
|
/**
|
71
64
|
* Do something
|
72
65
|
*
|
@@ -80,22 +73,17 @@ int some_function(
|
|
80
73
|
size_t len);
|
81
74
|
EOF
|
82
75
|
|
83
|
-
|
84
|
-
Do something
|
85
|
-
|
86
|
-
More explanation of what we do
|
87
|
-
|
88
|
-
@param string a sequence of characters
|
89
|
-
@return an integer value
|
90
|
-
EOF
|
91
|
-
|
92
|
-
actual = @parser.parse_text(name, contents)
|
76
|
+
actual = parse(name, contents)
|
93
77
|
expected = [{:file => "function.h",
|
94
|
-
:line =>
|
95
|
-
:
|
96
|
-
:
|
97
|
-
:rawComments => raw_comments.strip,
|
78
|
+
:line => 10,
|
79
|
+
:lineto => 12,
|
80
|
+
:tdef => nil,
|
98
81
|
:type => :function,
|
82
|
+
:name => 'some_function',
|
83
|
+
:body => "int some_function(char *string, size_t len);",
|
84
|
+
:description => ' Do something',
|
85
|
+
:comments => " More explanation of what we do\n\n ",
|
86
|
+
:sig => 'char *::size_t',
|
99
87
|
:args => [{
|
100
88
|
:name => 'string',
|
101
89
|
:type => 'char *',
|
@@ -104,19 +92,318 @@ EOF
|
|
104
92
|
{
|
105
93
|
:name => 'len',
|
106
94
|
:type => 'size_t',
|
95
|
+
:comment => nil
|
107
96
|
}],
|
108
97
|
:return => {
|
109
98
|
:type => 'int',
|
110
|
-
:comment => 'an integer value'
|
99
|
+
:comment => ' an integer value'
|
111
100
|
},
|
112
|
-
:
|
113
|
-
:
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
101
|
+
:decl => "int some_function(char *string, size_t len)",
|
102
|
+
:argline => "char *string, size_t len",
|
103
|
+
}]
|
104
|
+
|
105
|
+
assert_equal expected, actual
|
106
|
+
end
|
107
|
+
|
108
|
+
def test_parsing_with_extern
|
109
|
+
|
110
|
+
name_a = 'common.h'
|
111
|
+
contents_a = <<EOF
|
112
|
+
# define GIT_EXTERN(type) extern type
|
113
|
+
EOF
|
114
|
+
|
115
|
+
name_b = 'function.h'
|
116
|
+
contents_b = <<EOF
|
117
|
+
#include "common.h"
|
118
|
+
|
119
|
+
/**
|
120
|
+
* Awesomest API
|
121
|
+
*/
|
122
|
+
GIT_EXTERN(int) some_public_function(int val);
|
123
|
+
EOF
|
124
|
+
|
125
|
+
actual = @parser.parse_file(name_b, [[name_a, contents_a], [name_b, contents_b]])
|
126
|
+
# "Fix" the path so we remove the temp dir
|
127
|
+
actual[0][:file] = File.split(actual[0][:file])[-1]
|
128
|
+
|
129
|
+
expected = [{
|
130
|
+
:file => "function.h",
|
131
|
+
:line => 6,
|
132
|
+
:lineto => 6,
|
133
|
+
:tdef => nil,
|
134
|
+
:type => :function,
|
135
|
+
:name => "some_public_function",
|
136
|
+
:body => "int some_public_function(int val);",
|
137
|
+
:description => " Awesomest API",
|
138
|
+
:comments => "",
|
139
|
+
:sig => "int",
|
140
|
+
:args => [{
|
141
|
+
:name=>"val",
|
142
|
+
:type=>"int",
|
143
|
+
:comment=>nil
|
144
|
+
}],
|
145
|
+
:return => {
|
146
|
+
:type=>"int",
|
147
|
+
:comment=>nil
|
148
|
+
},
|
149
|
+
:decl =>"int some_public_function(int val)",
|
150
|
+
:argline =>"int val"
|
151
|
+
}]
|
152
|
+
|
153
|
+
assert_equal expected, actual
|
154
|
+
|
155
|
+
end
|
156
|
+
|
157
|
+
|
158
|
+
def test_return_struct
|
159
|
+
name = 'tree.h'
|
160
|
+
contents = <<EOF
|
161
|
+
typedef struct git_repository git_repository;
|
162
|
+
typedef struct git_tree git_tree;
|
163
|
+
|
164
|
+
/**
|
165
|
+
* Weak owner ref
|
166
|
+
*/
|
167
|
+
git_repository *git_tree_owner(git_tree *tree);
|
168
|
+
EOF
|
169
|
+
|
170
|
+
actual = parse(name, contents)
|
171
|
+
expected = [{
|
172
|
+
:file => "tree.h",
|
173
|
+
:line => 7,
|
174
|
+
:lineto => 7,
|
175
|
+
:tdef => nil,
|
176
|
+
:type => :function,
|
177
|
+
:name => "git_tree_owner",
|
178
|
+
:body => "git_repository * git_tree_owner(git_tree *tree);",
|
179
|
+
:description => " Weak owner ref",
|
180
|
+
:comments => "",
|
181
|
+
:sig => "git_tree *",
|
182
|
+
:args => [{
|
183
|
+
:name => "tree",
|
184
|
+
:type => "git_tree *",
|
185
|
+
:comment => nil
|
186
|
+
}],
|
187
|
+
:return => {
|
188
|
+
:type => "git_repository *",
|
189
|
+
:comment => nil
|
190
|
+
},
|
191
|
+
:decl => "git_repository * git_tree_owner(git_tree *tree)",
|
192
|
+
:argline => "git_tree *tree"
|
193
|
+
}]
|
194
|
+
|
195
|
+
assert_equal actual, expected
|
196
|
+
|
197
|
+
end
|
198
|
+
|
199
|
+
def test_parse_struct
|
200
|
+
|
201
|
+
name = 'struct.h'
|
202
|
+
|
203
|
+
contents = <<EOF
|
204
|
+
/**
|
205
|
+
* Foo to the bar
|
206
|
+
*/
|
207
|
+
typedef struct {
|
208
|
+
int val;
|
209
|
+
char *name;
|
210
|
+
} git_foo;
|
211
|
+
EOF
|
212
|
+
|
213
|
+
actual = parse(name, contents)
|
214
|
+
|
215
|
+
expected = [{
|
216
|
+
:file => "struct.h",
|
217
|
+
:line => 4,
|
218
|
+
:lineto => 7,
|
219
|
+
:tdef => :typedef,
|
220
|
+
:type => :struct,
|
221
|
+
:name => "git_foo",
|
222
|
+
:underlying_type => 'struct git_foo',
|
223
|
+
:description => " Foo to the bar",
|
224
|
+
:comments => "",
|
225
|
+
:fields => [
|
226
|
+
{
|
227
|
+
:type => "int",
|
228
|
+
:name => "val",
|
229
|
+
:comments => "",
|
230
|
+
},
|
231
|
+
{
|
232
|
+
:type => "char *",
|
233
|
+
:name => "name",
|
234
|
+
:comments => "",
|
235
|
+
}
|
236
|
+
],
|
237
|
+
:decl => ["int val", "char * name"],
|
238
|
+
:block => "int val\nchar * name"
|
239
|
+
}]
|
240
|
+
|
241
|
+
assert_equal expected, actual
|
242
|
+
|
243
|
+
end
|
244
|
+
|
245
|
+
def test_parse_struct_with_field_docs
|
246
|
+
|
247
|
+
name = 'struct.h'
|
248
|
+
|
249
|
+
contents = <<EOF
|
250
|
+
/**
|
251
|
+
* Foo to the bar
|
252
|
+
*/
|
253
|
+
typedef struct {
|
254
|
+
/**
|
255
|
+
* This stores a value
|
256
|
+
*/
|
257
|
+
int val;
|
258
|
+
/**
|
259
|
+
* And this stores its name
|
260
|
+
*
|
261
|
+
* Which should be pretty descriptive
|
262
|
+
*/
|
263
|
+
char *name;
|
264
|
+
} git_foo;
|
265
|
+
EOF
|
266
|
+
|
267
|
+
actual = parse(name, contents)
|
268
|
+
expected = [{
|
269
|
+
:file => "struct.h",
|
270
|
+
:line => 4,
|
271
|
+
:lineto => 15,
|
272
|
+
:tdef => :typedef,
|
273
|
+
:type => :struct,
|
274
|
+
:name => "git_foo",
|
275
|
+
:underlying_type => 'struct git_foo',
|
276
|
+
:description => " Foo to the bar",
|
277
|
+
:comments => "",
|
278
|
+
:fields => [
|
279
|
+
{
|
280
|
+
:type => "int",
|
281
|
+
:name => "val",
|
282
|
+
:comments => " This stores a value",
|
283
|
+
},
|
284
|
+
{
|
285
|
+
:type => "char *",
|
286
|
+
:name => "name",
|
287
|
+
:comments => " And this stores its name\n\n Which should be pretty descriptive",
|
288
|
+
}
|
289
|
+
],
|
290
|
+
:decl => ["int val", "char * name"],
|
291
|
+
:block => "int val\nchar * name"
|
292
|
+
}]
|
293
|
+
|
294
|
+
assert_equal expected, actual
|
295
|
+
|
296
|
+
end
|
297
|
+
|
298
|
+
def test_parse_enum
|
299
|
+
|
300
|
+
name = 'enum.h'
|
301
|
+
contents = <<EOF
|
302
|
+
/**
|
303
|
+
* Magical enum of power
|
304
|
+
*/
|
305
|
+
typedef enum {
|
306
|
+
FF = 0,
|
307
|
+
/** Do not allow fast-forwards */
|
308
|
+
NO_FF = 1 << 2
|
309
|
+
} git_merge_action;
|
310
|
+
EOF
|
311
|
+
|
312
|
+
actual = parse(name, contents)
|
313
|
+
expected = [{
|
314
|
+
:file => 'enum.h',
|
315
|
+
:line => 4,
|
316
|
+
:lineto => 8,
|
317
|
+
:tdef => :typedef,
|
318
|
+
:type => :enum,
|
319
|
+
:name => "git_merge_action",
|
320
|
+
:underlying_type => 'enum git_merge_action',
|
321
|
+
:description => " Magical enum of power",
|
322
|
+
:comments => "",
|
323
|
+
:fields => [{
|
324
|
+
:type => "int",
|
325
|
+
:name => "FF",
|
326
|
+
:comments => "",
|
327
|
+
:value => 0,
|
328
|
+
},
|
329
|
+
{
|
330
|
+
:type => "int",
|
331
|
+
:name => "NO_FF",
|
332
|
+
:comments => " Do not allow fast-forwards ",
|
333
|
+
:value => 4,
|
334
|
+
}],
|
335
|
+
:block => "FF\nNO_FF",
|
336
|
+
:decl => ["FF", "NO_FF"]
|
337
|
+
}]
|
118
338
|
|
119
339
|
assert_equal expected, actual
|
340
|
+
|
341
|
+
end
|
342
|
+
|
343
|
+
def test_parse_define
|
344
|
+
|
345
|
+
name = 'define.h'
|
346
|
+
contents = <<EOF
|
347
|
+
/**
|
348
|
+
* Path separator
|
349
|
+
*/
|
350
|
+
#define PATH_SEPARATOR '/'
|
351
|
+
EOF
|
352
|
+
|
353
|
+
actual = parse(name, contents)
|
354
|
+
|
355
|
+
#Clang won't let us do comments on defines :("
|
356
|
+
assert_equal [], actual
|
357
|
+
|
358
|
+
end
|
359
|
+
|
360
|
+
def test_type_reference
|
361
|
+
|
362
|
+
name = 'typeref.h'
|
363
|
+
contents = <<EOF
|
364
|
+
/**
|
365
|
+
* My very own type
|
366
|
+
*/
|
367
|
+
typedef int my_type;
|
368
|
+
EOF
|
369
|
+
|
370
|
+
actual = parse(name, contents)
|
371
|
+
expected = [{
|
372
|
+
:file => "typeref.h",
|
373
|
+
:line => 4,
|
374
|
+
:lineto => 4,
|
375
|
+
:tdef => :typedef,
|
376
|
+
:name => "my_type",
|
377
|
+
:underlying_type => "int"
|
378
|
+
}]
|
379
|
+
|
380
|
+
assert_equal actual, expected
|
381
|
+
|
382
|
+
name = 'typeref.h'
|
383
|
+
contents = <<EOF
|
384
|
+
/**
|
385
|
+
* My very own type
|
386
|
+
*/
|
387
|
+
typedef struct my_type my_type;
|
388
|
+
EOF
|
389
|
+
|
390
|
+
actual = parse(name, contents)
|
391
|
+
expected = [{
|
392
|
+
:file => "typeref.h",
|
393
|
+
:line => 4,
|
394
|
+
:lineto => 4,
|
395
|
+
:tdef => :typedef,
|
396
|
+
:name => "my_type",
|
397
|
+
:decl => 'my_type',
|
398
|
+
:underlying_type => "struct my_type",
|
399
|
+
:type => :struct,
|
400
|
+
:description => ' My very own type',
|
401
|
+
:comments => '',
|
402
|
+
}]
|
403
|
+
|
404
|
+
assert_equal actual, expected
|
405
|
+
|
406
|
+
|
120
407
|
end
|
121
408
|
|
122
409
|
end
|