Skip to content

Commit a6d733e

Browse files
committed
Add generator scripts
These can be cleaned up significantly, these are early prototypes.
1 parent ab5f14e commit a6d733e

File tree

5 files changed

+465
-0
lines changed

5 files changed

+465
-0
lines changed

generate/index.js

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
var generatedData = require('./lib/generated_data');
2+
var writeApiDocs = require('./lib/write_api_docs');
3+
var addConvenienceMethods = require('./lib/add_convenience_methods.js');
4+
5+
var idefsPath = 'generate/nodegit/generate/output/idefs.json';
6+
var missingtestsPath = 'generate/nodegit/generate/output/missing-tests.json'
7+
8+
var baseData = generatedData(idefsPath, missingtestsPath);
9+
var fullData;
10+
11+
addConvenienceMethods(baseData).then(function(fullData) {
12+
writeApiDocs(fullData);
13+
});
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
var dox = require('dox');
2+
var Promise = require('bluebird');
3+
var fs = require('fs-extra');
4+
var dive = Promise.promisify(require('dive'));
5+
var changeCase = require('change-case');
6+
var Path = require('path');
7+
var setDocDefaults = require('./set_doc_defaults');
8+
9+
var addConvenienceMethods = function(apiData) {
10+
return dive('generate/nodegit/lib', {recursive:false}, function(err, path) {
11+
var code = fs.readFileSync(path).toString();
12+
var className = changeCase.pascalCase(Path.basename(path, '.js'));
13+
dox.parseComments(code, {raw: true}).forEach(function(doc) {
14+
15+
if (!doc.ctx) return;
16+
17+
var data = {
18+
params: [],
19+
return: null,
20+
isAsync: false,
21+
description: doc.description.full
22+
}
23+
24+
doc.tags.forEach(function(tag) {
25+
switch(tag.type) {
26+
case 'param':
27+
data.params.push({
28+
"name": tag.name,
29+
"types": tag.types,
30+
"description": tag.description,
31+
"optional": tag.optional
32+
});
33+
break;
34+
case 'return':
35+
data.return = {
36+
name: tag.name,
37+
type: tag.types[0],
38+
description: tag.description || null
39+
};
40+
break;
41+
case 'isAsync':
42+
if (tag.value == 'true') {
43+
data.isAsync = true;
44+
}
45+
break;
46+
}
47+
});
48+
49+
if (doc.ctx.constructor == className) {
50+
var obj = setDocDefaults(apiData, className);
51+
apiData[className].prototypes[doc.ctx.name] = data;
52+
} else if (doc.ctx.receiver == className) {
53+
var obj = setDocDefaults(apiData, className);
54+
apiData[className].constructors[doc.ctx.name] = data;
55+
}
56+
});
57+
}).then(function() {
58+
return apiData;
59+
});
60+
}
61+
62+
module.exports = addConvenienceMethods;

generate/lib/generated_data.js

Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
var fs = require('fs-extra');
2+
var setDocDefaults = require('./set_doc_defaults');
3+
var changeCase = require('change-case');
4+
5+
var removePointerReferences = function(text) {
6+
if (!text) return '';
7+
text = text.replace(/a pointer to /ig, '');
8+
text = text.replace(/pointer where to store /ig, '');
9+
return text
10+
}
11+
12+
var sanitizeArgName = function(className, comment) {
13+
var argName = changeCase.camelCase(className);
14+
if (argName == 'number') {
15+
argName = 'result';
16+
}
17+
18+
return argName;
19+
}
20+
21+
var generatedData = function(path, missingTestsPath) {
22+
var apiData = {};
23+
var generatedJSON = fs.readJsonSync(path);
24+
25+
if (missingTestsPath) {
26+
var missingTests = fs.readJsonSync(missingTestsPath);
27+
}
28+
29+
generatedJSON.forEach(function(item) {
30+
switch (item.type) {
31+
case 'class':
32+
case 'struct':
33+
var obj = setDocDefaults(apiData, item.jsClassName);
34+
obj.type = item.type
35+
obj.hasConstructor = item.hasConstructor || false
36+
37+
item.functions.forEach(function(func) {
38+
data = {
39+
params: [],
40+
return: {
41+
type: func.return.jsClassName,
42+
name: sanitizeArgName(func.return.jsClassName, func.return.comment),
43+
description: removePointerReferences(func.return.comment)
44+
},
45+
isAsync: func.isAsync,
46+
description: "",
47+
experimental: false
48+
}
49+
50+
if (missingTests) {
51+
if (missingTests[item.filename].testFileMissing === false) {
52+
data.experimental = true;
53+
} else {
54+
if (missingTests[item.filename].functions.indexOf(item.jsClassName) != -1) {
55+
data.experimental = true;
56+
}
57+
}
58+
}
59+
60+
func.args.forEach(function(arg) {
61+
if (arg.isReturn) {
62+
data.return = {
63+
name: sanitizeArgName(arg.jsClassName, arg.comment),
64+
type: arg.jsClassName,
65+
description: removePointerReferences(arg.comment)
66+
};
67+
} else if (!arg.ignore && !arg.isSelf) {
68+
data.params.push({
69+
"name": arg.name,
70+
"types": [arg.jsClassName],
71+
"description": arg.comment,
72+
"optional": arg.isOptional || false
73+
});
74+
}
75+
});
76+
77+
if (func.isPrototypeMethod) {
78+
obj.prototypes[func.jsFunctionName] = data
79+
} else if (func.isConstructorMethod) {
80+
obj.constructors[func.jsFunctionName] = data
81+
}
82+
});
83+
84+
item.fields.forEach(function(field) {
85+
obj.fields[field.name] = field.jsClassName;
86+
});
87+
break;
88+
case 'enum':
89+
obj = setDocDefaults(apiData, item.owner);
90+
91+
var list = obj.enums[item.JsName] = {}
92+
item.values.forEach(function(value) {
93+
list[value.JsName] = value.value;
94+
});
95+
break;
96+
}
97+
});
98+
99+
return apiData;
100+
}
101+
102+
module.exports = generatedData;

generate/lib/set_doc_defaults.js

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
var setDocDefaults = function(apiData, className) {
2+
if (!apiData[className]) {
3+
apiData[className] = {
4+
constructors:{},
5+
prototypes:{},
6+
fields:{},
7+
enums:{}
8+
};
9+
}
10+
11+
return apiData[className];
12+
}
13+
14+
module.exports = setDocDefaults;

0 commit comments

Comments
 (0)