Skip to content

Commit eb53eab

Browse files
committed
cache by test file content and ava version hash
1 parent 9740986 commit eb53eab

File tree

3 files changed

+43
-10
lines changed

3 files changed

+43
-10
lines changed

index.js

+13
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,24 @@ require('./lib/babel').avaRequired();
33
var setImmediate = require('set-immediate-shim');
44
var hasFlag = require('has-flag');
55
var chalk = require('chalk');
6+
var join = require('path').join;
67
var relative = require('path').relative;
78
var serializeError = require('destroy-circular');
89
var Runner = require('./lib/runner');
910
var log = require('./lib/logger');
1011
var runner = new Runner();
12+
var xdgBasedir = require('xdg-basedir');
13+
var cache = require('cacha')(join(xdgBasedir.cache, 'ava'));
14+
var Configstore = require('configstore');
15+
var config = new Configstore('ava', {
16+
lastCacheClean: Date.now()
17+
});
18+
var WEEK = 7 * 24 * 60 * 60 * 1000;
19+
20+
if (Date.now() - config.get('lastCacheClean') > WEEK) {
21+
config.set('lastCacheClean', Date.now());
22+
cache.clean();
23+
}
1124

1225
// check if the test is being run without AVA cli
1326
var isForked = typeof process.send === 'function';

lib/babel.js

+24-9
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,11 @@
22
var resolveFrom = require('resolve-from');
33
var createEspowerPlugin = require('babel-plugin-espower/create');
44
var requireFromString = require('require-from-string');
5+
var hasha = require('hasha');
6+
var hashObj = require('hash-obj');
7+
var xdgBasedir = require('xdg-basedir');
8+
var path = require('path');
9+
var cache = require('cacha')(path.join(xdgBasedir.cache, 'ava'));
510

611
var hasGenerators = parseInt(process.version.slice(1), 10) > 0;
712
var testPath = process.argv[2];
@@ -24,16 +29,32 @@ var options = {
2429
]
2530
};
2631

27-
var avaRequired;
32+
process.on('message', function (message) {
33+
if (message['ava-kill-command']) {
34+
process.exit(0);
35+
}
36+
});
37+
38+
var hash = hashObj({
39+
code: hasha.fromFileSync(testPath),
40+
avaVersion: require('../package.json').version
41+
});
42+
43+
var code = cache.getSync(hash, 'utf8');
2844

45+
if (code === undefined) {
46+
code = babel.transformFileSync(testPath, options).code;
47+
cache.setSync(hash, code, 'utf8');
48+
}
49+
50+
var avaRequired;
2951
module.exports = {
3052
avaRequired: function () {
3153
avaRequired = true;
3254
}
3355
};
3456

35-
var transpiled = babel.transformFileSync(testPath, options);
36-
requireFromString(transpiled.code, testPath, {
57+
requireFromString(code, testPath, {
3758
appendPaths: module.paths
3859
});
3960

@@ -43,9 +64,3 @@ if (!avaRequired) {
4364
process.exit(1);
4465
});
4566
}
46-
47-
process.on('message', function (message) {
48-
if (message['ava-kill-command']) {
49-
process.exit(0);
50-
}
51-
});

package.json

+6-1
Original file line numberDiff line numberDiff line change
@@ -67,15 +67,19 @@
6767
"babel-plugin-espower": "^1.1.0",
6868
"babel-runtime": "^5.8.29",
6969
"bluebird": "^3.0.0",
70+
"cacha": "^1.0.3",
7071
"chalk": "^1.0.0",
7172
"co-with-promise": "^4.6.0",
73+
"configstore": "^1.3.0",
7274
"core-assert": "^0.1.0",
7375
"destroy-circular": "jamestalmage/destroy-circular#feeb7d1",
7476
"empower": "^1.1.0",
7577
"figures": "^1.4.0",
7678
"fn-name": "^2.0.0",
7779
"globby": "^3.0.1",
7880
"has-flag": "^1.0.0",
81+
"hash-obj": "^1.0.0",
82+
"hasha": "^2.0.2",
7983
"is-generator": "^1.0.2",
8084
"meow": "^3.3.0",
8185
"plur": "^2.0.0",
@@ -86,7 +90,8 @@
8690
"resolve-from": "^1.0.0",
8791
"set-immediate-shim": "^1.0.1",
8892
"squeak": "^1.2.0",
89-
"update-notifier": "^0.5.0"
93+
"update-notifier": "^0.5.0",
94+
"xdg-basedir": "^2.0.0"
9095
},
9196
"devDependencies": {
9297
"coveralls": "^2.11.4",

0 commit comments

Comments
 (0)