Skip to content

Commit

Permalink
Merge pull request #30 from stephanebachelier/yaml
Browse files Browse the repository at this point in the history
Add support for yaml
  • Loading branch information
stephanebachelier committed Feb 19, 2015
2 parents 70615a2 + baab364 commit c5ae10b
Show file tree
Hide file tree
Showing 4 changed files with 78 additions and 28 deletions.
10 changes: 9 additions & 1 deletion Gruntfile.js
Expand Up @@ -20,7 +20,7 @@ module.exports = function(grunt) {
}
},
testDotEnv : {
src : ['.env', '.env.json']
src : ['.env', '.env.json', '.env.ini', '.env.yaml']
},
testEnvdir: {
src : ['.envdir/*'],
Expand Down Expand Up @@ -124,6 +124,8 @@ module.exports = function(grunt) {
grunt.registerTask('writeDotEnv', function(){
grunt.file.write('.env', "dotEnvFileData=bar\ndotEnvFileOption=baz");
grunt.file.write('.env.json', '{"jsonValue" : "foo","push" : {"PATHLIKE":"jsonPath"}}');
grunt.file.write('.env.ini', "dotEnvIniFileData=bar.ini\ndotEnvIniFileOption=baz.ini\n");
grunt.file.write('.env.yaml', 'yamlValue: foo');
});

grunt.registerTask('testDotEnv', function(){
Expand All @@ -133,11 +135,17 @@ module.exports = function(grunt) {
assert.equal(process.env.globalOption, 'foo', 'should still get global options');
assert.equal(process.env.dotEnvFileData, 'bar', 'dotEnvFileData should be set');
assert.equal(process.env.dotEnvFileOption, 'baz', 'dotEnvFileOption should be set');
assert.equal(process.env.dotEnvIniFileData, 'bar.ini', 'dotEnvIniFileData should be set');
assert.equal(process.env.dotEnvIniFileOption, 'baz.ini', 'ndotEnvIniFileOption should be set');
assert.equal(process.env.yamlValue, 'foo', 'yamlValue should be set');
delete process.env.jsonValue;
delete process.env.dotEnvFileData;
delete process.env.dotEnvFileOption;
delete process.env.PATHLIKE;
delete process.env.globalOption;
delete process.env.dotEnvIniFileData;
delete process.env.dotEnvIniFileOption;
delete process.env.yamlValue;
});

grunt.registerTask("writeEnvdir", function(){
Expand Down
5 changes: 4 additions & 1 deletion README.md
Expand Up @@ -51,13 +51,16 @@ grunt.loadNpmTasks('grunt-env');
```
## Using external files

You can specify environment values in INI or JSON style and load them via the src option.
You can specify environment values in INI, JSON or YAML style and load them via the src option.

```js
env : {
dev : {
src : "dev.json"
},
prod: {
src: "settings.yaml"
}
heroku : {
src : ".env"
}
Expand Down
56 changes: 56 additions & 0 deletions lib/utils.js
@@ -0,0 +1,56 @@
var ini = require('ini');

var types = {
json: readJson,
yaml: readYaml,
ini: readIni,
env: readIni,
default: readFile // default for unsupported format or no extension file
};

var extensionPattern = /\.([^\.]+)$/i;

function readFile(grunt, file) {
return grunt.file.read(file);
};

function readJson(grunt, file) {
try {
return grunt.file.readJSON(file);
} catch(e) {
return;
}
}

function readYaml(grunt, file) {
try {
return grunt.file.readYAML(file);
} catch(e) {
return;
}
}

function readIni(grunt, file) {
try {
return ini.parse(grunt.file.read(file));
} catch(e) {
return;
}
}

module.exports = {
// Export a single parse function that call the proper parsing function
// Grunt is used here as it as already some parsing functions
parse: function (grunt, file) {
var match = file.match(extensionPattern);
var type = match ? match[1] : 'default'; // default to ini format

try {
var parseFn = types[type] || types.default;
return parseFn(grunt, file) || {};
}
catch (e) {
return;
}
}
};
35 changes: 9 additions & 26 deletions tasks/env.js
Expand Up @@ -9,14 +9,18 @@
"use strict";

var _ = require('lodash'),
ini = require('ini'),
path = require('path');
path = require('path'),
utils = require(process.cwd() + '/lib/utils');

module.exports = function (grunt) {
var parse = function (file) {
// pass grunt reference to parse
return utils.parse(grunt, file);
};

grunt.registerMultiTask('env', 'Specify an ENV configuration for future tasks in the chain', function() {

var data = grunt.util._.clone(this.data);
var data = _.clone(this.data);
delete data.src;
processDirectives(data);

Expand All @@ -26,15 +30,13 @@ module.exports = function (grunt) {
if(options.envdir) {
var d = _.zipObject(this.files[0].src.map(function(file){
if(grunt.file.isFile(file)) {
return [path.basename(file), grunt.file.read(file)];
return [path.basename(file), parse(file)];
}
}));
processDirectives(d);
} else {
this.files[0].src.forEach(function(file){
var fileContent = grunt.file.read(file);
var data = readJson(fileContent) || readIni(fileContent) || {};
processDirectives(data);
processDirectives(parse(file));
});
}
}
Expand Down Expand Up @@ -92,22 +94,3 @@ module.exports = function (grunt) {
}
}
};



function readJson(content) {
try {
return JSON.parse(content);
} catch(e) {
return;
}
}

function readIni(content) {
try {
return ini.parse(content);
} catch(e) {
return;
}
}

0 comments on commit c5ae10b

Please sign in to comment.