forked from angular/protractor
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathgenerate-docs.js
More file actions
executable file
·157 lines (135 loc) · 3.86 KB
/
generate-docs.js
File metadata and controls
executable file
·157 lines (135 loc) · 3.86 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
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
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
#!/usr/bin/env node
/*
* Usage:
*
* ./scripts/generate-docs.js [--use_hash auto|someValue]
*/
'use strict';
var docGenerator = require('dgeni');
var rimraf = require('rimraf');
var fs = require('fs');
var path = require('path');
var _ = require('lodash');
var argv = require('optimist').argv;
var q = require('q');
var apiFileName = 'api.md',
configPath = path.resolve(__dirname, '../docs/dgeni-config.js'),
buildPath = path.resolve(__dirname, '../docs/build'),
docsPath = path.resolve(__dirname, '../docs'),
apiFilePath = path.resolve(docsPath, apiFileName);
/**
* Delete the docs/build directory.
*/
function deleteBuildDir() {
console.log('Deleting build directory', buildPath);
var deferred = q.defer();
rimraf(buildPath, function(err) {
if (err) {
console.log('Error deleting build path', err);
return deferred.reject(err);
}
console.log('Done deleting build directory');
deferred.resolve();
});
return deferred.promise;
}
/**
* Generate the docs/api.md document.
*/
function generateDocs(config) {
console.log('Generating docs');
docGenerator(config).generateDocs().then(function() {
fs.readdir(buildPath, function(err, files) {
if (err) {
throw err;
}
var sortedFiles = [];
// Group by file name.
var grouped = _.groupBy(files, function(fileName) {
return fileName.replace(/\d*\.md/, '');
});
// Sort the files in the following order:
// toc - table of contents
// protractor
// locators
// webdriver
var fileOrder = ['toc', 'protractor', 'locators', 'webdriver'];
fileOrder.forEach(function(fileName) {
sortedFiles = sortedFiles.concat(grouped[fileName]);
});
mergeFiles(sortedFiles);
});
});
}
/**
* Merge all the partial files into the final api.md file.
* @param {Array.<string>} files Partial files containing the functions.
*/
function mergeFiles(files) {
console.log('Merging ' + files.length + ' files into ' + apiFileName);
var buffer = [];
// Read each file and put them into the buffer.
files.forEach(function(file) {
var contents = fs.readFileSync(path.resolve(buildPath, file), 'utf-8');
buffer.push(contents);
});
if (buffer.length === 0) {
return;
}
// Write the buffer into the output file.
var contents = buffer.join('\n');
fs.writeFile(apiFilePath, contents, function(err) {
if (err) {
throw err;
}
console.log('Done writing file', apiFilePath);
});
}
/**
* Get the hash used to link to the source code.
* @return {Q.promise.<string>} A promise that resolves to the git hash used to
* link to the source code.
*/
function readGitHash() {
var deferred = q.defer();
var useHash = argv.use_hash;
// No hash, use master.
if (!useHash) {
deferred.resolve('master');
} else if (useHash.toLowerCase() === 'auto') {
// Auto? query git to use the latest commit hash.
var exec = require('child_process').exec;
exec('git log -n 1 --pretty=format:"%H"', function(error, stdout, stderr) {
if (error) {
console.log('Error reading hash from git', error);
deferred.reject(error);
return;
}
deferred.resolve(stdout);
});
} else {
// Use the hash provided.
deferred.resolve(useHash);
}
return deferred.promise;
}
/*
* Delete the 'docs/build' directory.
* Get the hash for the source code links.
* Create the configuration obj.
* Generate the api.md file.
*/
deleteBuildDir().
then(function() {
return readGitHash();
}).
then(function(linksHash) {
console.log('Using hash for doc links', linksHash);
return _.extend(require('dgeni/lib/utils/config').load(configPath), {
linksHash: linksHash
});
}).then(function(config) {
generateDocs(config);
}).catch(function(err) {
console.log('Error generating docs', err);
});