Skip to content

Commit a6fa6a1

Browse files
authored
Merge pull request #10 from sivakumar-kailasam/improvements
Incremental docs publish, travis builds n more enhancements
2 parents 7024361 + 945e9e9 commit a6fa6a1

File tree

12 files changed

+2783
-58
lines changed

12 files changed

+2783
-58
lines changed

.editorconfig

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
# EditorConfig helps developers define and maintain consistent
2+
# coding styles between different editors and IDEs
3+
# editorconfig.org
4+
5+
root = true
6+
7+
8+
[*]
9+
end_of_line = lf
10+
charset = utf-8
11+
trim_trailing_whitespace = true
12+
insert_final_newline = true
13+
indent_style = space
14+
indent_size = 2
15+
16+
[*.js]
17+
indent_style = space
18+
indent_size = 2
19+
20+
[*.{diff,md}]
21+
trim_trailing_whitespace = false

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
node_modules
22
tmp
3+
.vscode

.travis.yml

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
language: node_js
2+
node_js: '6'
3+
env:
4+
- COUCH_URL="https://sivakumar-kailasam.cloudant.com/ember-docs-api"
5+
6+
cache:
7+
directories:
8+
- $HOME/.yarn-cache
9+
- node_modules
10+
- tmp
11+
12+
script:
13+
- yarn run test
14+
- yarn start
15+
16+
branches:
17+
only:
18+
- master

index.js

Lines changed: 36 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,22 @@
22

33
let RSVP = require('rsvp')
44
let _ = require('lodash')
5-
var fetch = require('./lib/fetch')
6-
var readDocs = require('./lib/read-docs')
7-
var addSinceTags = require('./lib/add-since-tags')
8-
var addInheritedItems = require('./lib/add-inherited-items')
9-
var putClassesInCouch = require('./lib/classes-in-couch')
10-
var createVersionIndex = require('./lib/create-version-index')
11-
let normalizeEmberDependencies = require('./lib/normalize-ember-dependencies')
12-
let normalizeIDs = require('./lib/normalize-ids')
135
let rm = require('rimraf')
146
let PouchDB = require('pouchdb')
7+
let fs = require('fs')
8+
let glob = require('glob')
9+
10+
let fetch = require('./lib/fetch')
11+
let readDocs = require('./lib/read-docs')
12+
let addSinceTags = require('./lib/add-since-tags')
13+
let addInheritedItems = require('./lib/add-inherited-items')
14+
let putClassesInCouch = require('./lib/classes-in-couch')
15+
let createVersionIndex = require('./lib/create-version-index')
16+
let normalizeEmberDependencies = require('./lib/normalize-ember-dependencies')
17+
let normalizeIDs = require('./lib/normalize-ids')
18+
let markup = require('./lib/markup')
19+
let batchUpdate = require('./lib/batch-update')
20+
1521
require('marked')
1622

1723
let db = new PouchDB(process.env.COUCH_URL, {
@@ -20,19 +26,14 @@ let db = new PouchDB(process.env.COUCH_URL, {
2026
password: process.env.COUCH_PASSWORD
2127
}
2228
})
23-
let fs = require('fs')
2429

2530
if (fs.existsSync('tmp/docs')) {
2631
rm.sync('tmp/docs')
2732
}
2833

29-
function fetchProject (projectName) {
30-
console.log('downloading docs for ' + projectName)
31-
let promise = fetch()
32-
.then((stuff) => {
33-
console.log('reading docs for ' + projectName)
34-
return readDocs(projectName)
35-
})
34+
function transformProjectFiles (projectName) {
35+
console.log('reading docs for ' + projectName)
36+
let promise = RSVP.resolve(readDocs(projectName))
3637
.then((stuff) => {
3738
console.log('adding since tags for ' + projectName)
3839
return addSinceTags(stuff)
@@ -47,33 +48,33 @@ function fetchProject (projectName) {
4748
return createVersionIndex(db, projectName, doc).then(() => doc)
4849
}).then(doc => {
4950
console.log('converting markdown to html for ' + projectName)
50-
51-
return require('./lib/markup')(doc)
51+
return markup(doc)
5252
})
5353

5454
return promise
5555
}
5656

5757
let projects = ['ember', 'ember-data']
58+
let releaseToGenDocFor = process.argv[2] ? process.argv[2] : ''
5859

59-
RSVP.map(projects, fetchProject).then(docs => {
60-
let giantDocument = {
61-
data: _.flatten(docs.map(doc => doc.data))
62-
}
63-
console.log('normalizing dependencies')
64-
normalizeEmberDependencies(giantDocument)
65-
66-
return putClassesInCouch(giantDocument, db)
67-
}).then(function () {
68-
let glob = require('glob')
60+
console.log('downloading docs for ' + projects.join(' & '))
6961

70-
let docs = glob.sync('tmp/docs/**/*.json')
62+
fetch(db, releaseToGenDocFor).then(downloadedFiles => {
63+
RSVP.map(projects, transformProjectFiles).then(docs => {
64+
let giantDocument = {
65+
data: _.flatten(docs.map(doc => doc.data))
66+
}
67+
console.log('normalizing dependencies')
68+
normalizeEmberDependencies(giantDocument)
7169

72-
let batchUpdate = require('./lib/batch-update')
70+
return putClassesInCouch(giantDocument, db)
71+
}).then(function () {
72+
let docs = glob.sync('tmp/docs/**/*.json')
7373

74-
console.log('putting document in CouchDB')
75-
return batchUpdate(db, docs)
76-
}).catch(function (err) {
77-
console.warn('err!', err, err.stack)
78-
process.exit(1)
74+
console.log('putting document in CouchDB')
75+
return batchUpdate(db, docs)
76+
}).catch(function (err) {
77+
console.warn('err!', err, err.stack)
78+
process.exit(1)
79+
})
7980
})

lib/batch-update.js

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
'use strict'
22

3-
let _ = require('lodash')
3+
let chunk = require('lodash/array').chunk
44
let RSVP = require('rsvp')
55
let path = require('path')
66
let Queue = require('promise-queue')
77
let promiseRetry = require('promise-retry')
88

99
module.exports = function (db, docs) {
1010
let queue = new Queue(10)
11-
let chunks = _.chunk(docs, 20)
11+
let chunks = chunk(docs, 20)
1212

1313
return RSVP.map(chunks, chunk => {
1414
return promiseRetry((retry, number) => {
@@ -23,7 +23,13 @@ module.exports = function (db, docs) {
2323

2424
if (number > 0) {
2525
let timesLeft = 10 - number
26-
console.log('syncing for chunk failed, retrying ' + timesLeft + ' more times.', keys)
26+
if (number !== 1) {
27+
if (number !== 0) {
28+
console.log('syncing for chunk failed, retrying ' + timesLeft + ' more times.', keys)
29+
} else {
30+
console.log('syncing for chunk failed, retrying for the last time', keys)
31+
}
32+
}
2733
}
2834

2935
return db.allDocs({keys: keys}).catch(retry).then(results => {
@@ -39,7 +45,7 @@ module.exports = function (db, docs) {
3945
return new RSVP.Promise((resolve, reject) => {
4046
setTimeout(() => {
4147
return db.bulkDocs(docs).then(resolve, reject)
42-
}, 1000)
48+
}, 3000)
4349
})
4450
}).then(() => {
4551
}).catch(err => {

lib/create-version-index.js

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@
22

33
let saveDoc = require('./save-document')
44
let byType = require('./filter-jsonapi-doc').byType
5+
let fs = require('fs')
6+
let path = require('path')
7+
let _ = require('lodash')
58

69
// creates a version index at /projects/:project
710
// that contains a list of versions in the relationships
@@ -27,5 +30,12 @@ module.exports = function createVersionIndex (db, projectName, versions) {
2730
}
2831
}
2932

33+
let cachedProjectFile = path.join('tmp', 'cached-docs', `project-${projectName}.json`)
34+
if (fs.existsSync(cachedProjectFile)) {
35+
let cachedDocument = JSON.parse(fs.readFileSync(cachedProjectFile))
36+
37+
document.data.relationships['project-versions'].data = _.uniq(document.data.relationships['project-versions'].data.concat(cachedDocument.data.relationships['project-versions'].data))
38+
}
39+
3040
return saveDoc(document, db).then(() => versions)
3141
}

lib/fetch.js

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
1-
var S3 = require('s3')
2-
var RSVP = require('rsvp')
3-
var path = require('path')
4-
var fs = require('fs')
1+
let S3 = require('s3')
2+
let RSVP = require('rsvp')
3+
let path = require('path')
4+
let fs = require('fs')
5+
let getNewDocsToIndex = require('./identify-docs-to-index')
56

67
function mkdirp (dir) {
78
return new RSVP.Promise(function (resolve, reject) {
@@ -56,7 +57,7 @@ function downloadFile (document) {
5657
return mkdirp(path.dirname(finalFile)).then(function () {
5758
return new RSVP.Promise(function (resolve, reject) {
5859
if (fs.existsSync(finalFile)) {
59-
return resolve()
60+
return resolve(finalFile)
6061
} else {
6162
client.downloadFile({
6263
localFile: finalFile,
@@ -66,7 +67,7 @@ function downloadFile (document) {
6667
}
6768
})
6869
.on('end', function () {
69-
resolve()
70+
resolve(finalFile)
7071
})
7172
.on('error', function (err) {
7273
console.warn('err! ' + err)
@@ -84,6 +85,9 @@ function filterReleaseDocs (document) {
8485
return versionRegex.test(tag) && /-docs\.json/.test(key)
8586
}
8687

87-
module.exports = function fetch () {
88-
return getObjects().then(downloadReleaseDocs)
88+
module.exports = function fetch (db, releaseToGenDocFor) {
89+
return getObjects().then(docs => {
90+
let filteredDocs = docs.filter(doc => doc.Key.indexOf(releaseToGenDocFor) !== -1)
91+
return getNewDocsToIndex(db, filteredDocs)
92+
}).then(downloadReleaseDocs)
8993
}

lib/identify-docs-to-index.js

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
let path = require('path')
2+
let fs = require('fs')
3+
let RSVP = require('rsvp')
4+
5+
module.exports = function getNewDocsToIndex (db, docs) {
6+
return db.allDocs({
7+
keys: ['project-ember', 'project-ember-data'],
8+
include_docs: true
9+
}).then(projectVersions => {
10+
let docsToDownload = docs
11+
12+
if (projectVersions.total_rows > 0) {
13+
let [ {doc: emberProjectDoc}, {doc: emberDataProjectDoc} ] = projectVersions.rows
14+
15+
// Save now for merging later
16+
let cachedDocsFolder = path.join('tmp', 'cached-docs')
17+
require('mkdirp').sync(cachedDocsFolder)
18+
fs.writeFileSync(path.join(cachedDocsFolder, 'project-ember.json'), JSON.stringify(emberProjectDoc))
19+
fs.writeFileSync(path.join(cachedDocsFolder, 'project-ember-data.json'), JSON.stringify(emberDataProjectDoc))
20+
21+
let indexedEmberVersions = []
22+
let indexedEmberDataVersions = []
23+
24+
emberProjectDoc.data.relationships['project-versions'].data.forEach(doc => {
25+
indexedEmberVersions.push(doc.id.replace('ember-', ''))
26+
})
27+
28+
emberDataProjectDoc.data.relationships['project-versions'].data.forEach(doc => {
29+
indexedEmberDataVersions.push(doc.id.replace('ember-data-', ''))
30+
})
31+
32+
docsToDownload = docsToDownload.filter(doc => {
33+
let docString = doc.Key.split('/')
34+
let projectName = docString[2].replace('-docs.json', '')
35+
let projectVersion = docString[1].replace('v', '')
36+
37+
if (projectName === 'ember') {
38+
return indexedEmberVersions.indexOf(projectVersion) === -1
39+
} else if (projectName === 'ember-data') {
40+
return indexedEmberDataVersions.indexOf(projectVersion) === -1
41+
}
42+
})
43+
44+
if (docsToDownload.length === 0) {
45+
console.log('No more docs to index')
46+
process.exit(0)
47+
}
48+
}
49+
50+
return RSVP.resolve(docsToDownload)
51+
})
52+
}

lib/markup.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ marked.setOptions({
1818

1919
module.exports = (doc) => {
2020
doc.data.forEach(document => {
21+
console.log('Generating markup for ', document.id)
22+
2123
let description = document.attributes.description
2224

2325
if (description) {

package.json

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,32 +4,28 @@
44
"description": "audits ember docs and generates since tags",
55
"main": "index.js",
66
"scripts": {
7+
"autoformat": "standard --fix index.js lib/*.js",
8+
"start": "node index.js",
79
"test": "standard && mocha test"
810
},
911
"author": "Stanley Stuart <stanley+npm@stan.li>",
1012
"license": "MIT",
1113
"devDependencies": {
12-
"babel": "^6.3.26",
13-
"babel-cli": "^6.3.17",
14-
"babel-core": "^6.3.26",
15-
"babel-preset-es2015": "^6.3.13",
1614
"chai": "^3.4.1",
17-
"mocha": "^2.3.4",
18-
"standard": "^5.4.1",
15+
"mocha": "^3.2.0",
16+
"standard": "^8.6.0",
1917
"standard-format": "^2.1.0"
2018
},
2119
"dependencies": {
22-
"cheerio": "^0.19.0",
23-
"continuation-local-storage": "^3.1.4",
24-
"glob": "^6.0.2",
20+
"cheerio": "^0.22.0",
21+
"glob": "^7.1.1",
2522
"graceful-fs": "^4.1.2",
2623
"highlight.js": "^9.1.0",
2724
"inflected": "^1.1.6",
2825
"lodash": "^3.10.1",
29-
"lodash.sortby": "^3.1.5",
3026
"marked": "^0.3.5",
3127
"mkdirp": "^0.5.1",
32-
"pouchdb": "^5.1.0",
28+
"pouchdb": "^6.0.7",
3329
"promise-queue": "^2.2.0",
3430
"promise-retry": "^1.0.2",
3531
"rimraf": "^2.5.0",

test/.gitkeep

Whitespace-only changes.

0 commit comments

Comments
 (0)