node_js:
- "0.10"
-before_script:
- - npm install -g bower
- - bower install
-
script: "gulp travis"
],
autoWatch: false,
singleRun: true,
- reporters: ['mocha'], // ['spec', 'coverage'],
+ reporters: ['dots', 'coverage'], // or 'mocha', 'spec'
preprocessors: {
'dist/dygraph-combined.dev.js': ['coverage']
},
coverageReporter: {
- type: 'html',
- dir: 'dist/coverage'
+ dir: 'dist/coverage',
+ reporters: [
+ { type: 'html', subdir: 'report-html' },
+ { type: 'lcovonly', subdir: 'report-lcov' },
+ ]
},
browsers: ['PhantomJS'],
plugins: [
gulp.task('create-dev', function() {
var dest = 'dist';
- return gulp.src(mergePaths(src.polyfills, src.main, src.plugins, src.devOptions, src.datahandlers))
- .pipe(plugins.sourcemaps.init())
+ return gulp.src(mergePaths(src.polyfills, src.main, src.plugins, src.devOptions, src.datahandlers), {base: '.'})
+ .pipe(plugins.sourcemaps.init({debug:true}))
.pipe(plugins.concat('dygraph-combined.dev.js'))
.pipe(plugins.header(copyright))
+ .pipe(plugins.sourcemaps.write('.')) // '.' = external sourcemap
.pipe(gulp.dest(dest));
});
}, done);
});
+gulp.task('coveralls', ['test'], plugins.shell.task([
+ './scripts/transform-coverage.js ' +
+ 'dist/dygraph-combined.dev.js.map ' +
+ 'dist/coverage/report-lcov/lcov.info ' +
+ '| ./node_modules/.bin/coveralls'
+]));
+
gulp.task('watch', function() {
gulp.watch('src/**', ['concat']);
});
});
gulp.task('dist', ['gwt-dist', 'bower-dist']);
-gulp.task('travis', ['test']);
+gulp.task('travis', ['test', 'coveralls']);
gulp.task('default', ['test', 'dist']);
"gulp-load-plugins": "^0.8.0",
"gulp-rename": "^1.2.0",
"gulp-replace": "^0.5.0",
- "gulp-shell": "^0.2.11",
+ "gulp-shell": "^0.4.0",
"gulp-sourcemaps": "^1.3.0",
"gulp-uglify": "^1.0.2",
"jshint": "^2.5.10",
"karma-phantomjs-launcher": "^0.1.4",
"karma-spec-reporter": "0.0.16",
"lazypipe": "^0.2.2",
+ "lcov-parse": "0.0.9",
"mocha": "^2.1.0",
"obvious-closure-library": "^20140401.0.2",
+ "parse-data-uri": "^0.2.0",
"phantomjs": "^1.9.7-8",
+ "source-map": "^0.4.2",
"uglify-js": "^2"
},
"scripts": {
--- /dev/null
+#!/usr/bin/env node
+/**
+ * This script applies a source map to LCOV data. If you have coverage data for
+ * a concatenated file, plus a source map, this will output LCOV data for your
+ * original source files.
+ *
+ * Usage:
+ *
+ * transform-coverage.js path/to/soure.map path/to/coverage.lcov > out.lcov
+ */
+
+// TODO: make this a command line argument
+var SOURCE = 'src/'; // only report files under this directory
+
+var assert = require('assert'),
+ fs = require('fs'),
+ lcovParse = require('lcov-parse'),
+ parseDataUri = require('parse-data-uri'),
+ sourcemap = require('source-map');
+
+var sourcemapFile = process.argv[2];
+var lcovFile = process.argv[3];
+
+var sourcemapData = fs.readFileSync(sourcemapFile).toString();
+var sourcemap = new sourcemap.SourceMapConsumer(sourcemapData);
+
+lcovParse(lcovFile, function(err, data) {
+ assert(!err);
+ // TODO: 0 --> the correct file
+ var lines = data[0].lines.details;
+
+ var fileToCov = {}; // filename -> { line num -> hits }
+
+ lines.forEach(function(line) {
+ var pos = sourcemap.originalPositionFor({line: line.line, column: 0});
+ if (pos == null) {
+ return;
+ }
+
+ var filename = pos.source;
+
+ // Test coverage of node_modules is never interesting.
+ if (!filename || filename.indexOf('node_modules') >= 0) {
+ return;
+ }
+
+ // Strip paths down to the source root.
+ var base = filename.indexOf(SOURCE);
+ if (base == -1) return;
+ filename = filename.slice(base);
+
+ if (!fileToCov[filename]) fileToCov[filename] = [];
+ fileToCov[filename][pos.line] = line.hit;
+ });
+
+ // Other LCOV fields to translate:
+ // FN:2454
+ // FNF:465
+ // FNH:410
+ // FNDA:1,(anonymous_1)
+ // LF:4570
+ // LH:4002
+ // BRDA:13,1,0,1
+ // BRF:2213
+ // BRH:1684
+
+ // Convert to LCOV format
+ for (var filename in fileToCov) {
+ var cov = fileToCov[filename]
+ console.log('SF:' + filename);
+ for (var i = 0; i < cov.length; i++) {
+ if (cov[i] != null) {
+ console.log('DA:' + i + ',' + cov[i]);
+ }
+ }
+ console.log('end_of_record');
+ }
+});