Skip to content

Commit 1b748ba

Browse files
committed
successfully pulled!
1 parent 3becffe commit 1b748ba

File tree

8 files changed

+65
-21
lines changed

8 files changed

+65
-21
lines changed

README.md

+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
# heroku-config
2+
3+
Push and pull your [Heroku](https://www.heroku.com) configs to your local environment.
4+
5+
Heavily inspired by [ddollar's version](https://github.com/ddollar/heroku-config), but using the new Heroku [cli](https://github.com/heroku/cli).
6+
7+
After cloning, follow [these](https://devcenter.heroku.com/articles/developing-cli-plug-ins#installing-the-plugin) instructions to run locally!

commands/pull.js

+3-2
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,12 @@
33
const cli = require('heroku-cli-util')
44
const co = require('co')
55
const merge = require('../util/merge')
6+
const file = require('../util/file')
67

78
function * pull (context, heroku) {
89
let config = yield heroku.get(`/apps/${context.app}/config-vars`)
9-
cli.debug(config)
10-
cli.debug(merge({a: 1}, {b: 2}, context.flags))
10+
let fname = context.flags.env || '.env'
11+
file.write(merge(config, file.read(fname), context.flags), fname)
1112
}
1213

1314
module.exports = {

commands/push.js

+1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
const cli = require('heroku-cli-util')
44
const co = require('co')
55
const merge = require('../util/merge')
6+
const file = require('../util/file')
67

78
function * push (context, heroku) {
89
let config = yield heroku.get(`/apps/${context.app}/config-vars`)

package.json

+2-2
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
"description": "Push and pull environment variables from a Heroku instance",
55
"main": "index.js",
66
"scripts": {
7-
"test": "./node_modules/tape/bin/tape test.js | tap-dot",
7+
"test": "./node_modules/tape/bin/tape test.js | tap-spec",
88
"preversion": "npm test",
99
"postversion": "npm publish && git push && git push --tags"
1010
},
@@ -26,7 +26,7 @@
2626
"lodash.assign": "^4.0.8"
2727
},
2828
"devDependencies": {
29-
"tap-dot": "^1.0.5",
29+
"tap-spec": "^4.1.1",
3030
"tape": "^4.5.1"
3131
}
3232
}

pushable.txt

+15
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
NAME=david
2+
SQ_NAME='david'
3+
DQ_NAME="david"
4+
5+
RAND_ID=6be-42c0
6+
SQ_RAND_ID='6be4-2c0'
7+
DQ_RAND_ID="6be4-2c0"
8+
9+
MONGO_URL=mongodb://un:pass@ds08.mongolab.com:53428/kinect
10+
SQ_MONGO_URL='mongodb://un:pass@ds08.mongolab.com:53428/kinect'
11+
DQ_MONGO_URL="mongodb://un:pass@ds08.mongolab.com:53428/kinect"
12+
13+
WEIRD_PASS=9v\$tQnv&7crj
14+
SQ_WEIRD_PASS='9v\$tQnv&7crj'
15+
DQ_WEIRD_PASS="9v\$tQnv&7crj"

test.js

+21-7
Original file line numberDiff line numberDiff line change
@@ -11,17 +11,31 @@ let remote = {
1111
}
1212

1313
let local = {
14-
NODE_ENV: 'production',
14+
NODE_ENV: 'test',
1515
SOURCE: 'local',
1616
DB_STRING: 'mongo://blah@thing.mongo.thing.com:4567'
1717
}
1818

19+
let remote_win = {
20+
NODE_ENV: 'production',
21+
SOURCE: 'remote',
22+
DB_STRING: 'mongo://blah@thing.mongo.thing.com:4567',
23+
NAME: 'david'
24+
}
25+
26+
let local_win = {
27+
NODE_ENV: 'test',
28+
SOURCE: 'local',
29+
DB_STRING: 'mongo://blah@thing.mongo.thing.com:4567',
30+
NAME: 'david'
31+
}
32+
1933
test('Merging', (t) => {
20-
t.equal({
21-
NODE_ENV: 'production',
22-
SOURCE: 'local',
23-
DB_STRING: 'mongo://blah@thing.mongo.thing.com:4567',
24-
NAME: 'david'
25-
}, merge(remote, local, {}))
34+
t.deepEqual(remote_win, merge(local, remote, {}), 'Expect remote to overwrite local')
35+
t.deepEqual(local_win, merge(remote, local, {}), 'Expect local to overwrite remote')
36+
37+
t.deepEqual(remote_win, merge(remote, local, {overwrite: true}), 'Expect remote to overwrite local w/ overwrite')
38+
t.deepEqual(local_win, merge(local, remote, {overwrite: true}), 'Expect local to overwrite remote w/overwrite')
39+
2640
t.end()
2741
})

util/filer.js util/file.js

+10-6
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
// interface for reading/writing to .env file
2+
'use strict'
23

34
const fs = require('fs')
45

56
function obj_to_file_format (obj) {
67
let res = ''
78
for (let key in obj) {
8-
res += (`${key}="${obj[key]}"`)
9+
// standard removes the \n char in the ` string?
10+
res += (`${key}="${obj[key]}"` + '\n')
911
}
1012
return res
1113
}
@@ -32,16 +34,18 @@ module.exports = {
3234
read: (fname) => {
3335
fs.readFile(fname, (err, data) => {
3436
if (err) {
35-
console.error(`Unable to read from ${fname}`)
37+
console.warn(`WARN - Unable to read from ${fname}`)
38+
return {}
3639
} else {
40+
if (data) {
41+
data = data.toString()
42+
}
3743
return obj_from_file_format(data)
3844
}
3945
})
4046
},
41-
write: (fname, obj) => {
42-
let res = {}
43-
44-
fs.writeFile(fname, obj_to_file_format(res), (err) => {
47+
write: (obj, fname) => {
48+
fs.writeFile(fname, obj_to_file_format(obj).toString(), (err) => {
4549
if (err) {
4650
console.error(`Error writing to file ${fname}: ${err.message}`)
4751
} else {

util/merge.js

+6-4
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,14 @@
33

44
const assign = require('lodash.assign')
55

6-
module.exports = function (src, dest, flags) {
7-
console.log(`overwrite is ${flags.overwrite}`)
6+
module.exports = function (sub, dom, flags) {
7+
// console.log(`overwrite is ${flags.overwrite}`)
88
// check interactive and overwrite
9+
10+
// blank object is so sources aren't modified
911
if (flags.overwrite) {
10-
return assign({}, src, dest)
12+
return assign({}, dom, sub)
1113
} else {
12-
return assign({}, dest, src)
14+
return assign({}, sub, dom)
1315
}
1416
}

0 commit comments

Comments
 (0)