Skip to content
This repository was archived by the owner on Sep 25, 2020. It is now read-only.

Commit 8a4a868

Browse files
committed
Merge pull request #9 from uber/dcValue
Add support for dcValue
2 parents 84c8982 + a219f6a commit 8a4a868

File tree

6 files changed

+80
-33
lines changed

6 files changed

+80
-33
lines changed

README.md

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,12 +31,13 @@ A zero configuration configuration loader
3131

3232
```js
3333
// server.js
34+
var fs = require('fs');
3435
var fetchConfig = require('playdoh-server/config')
3536

36-
var NODE_ENV = process.env.NODE_ENV
3737
var config = fetchConfig(__dirname, {
38-
dc: NODE_ENV === 'production' ?
39-
'/etc/playdoh/datacenter' : null
38+
dcValue: fs.existsSync('/etc/zero-config/datacenter') ?
39+
fs.readFileSync('/etc/zero-config/datacenter', 'utf8') :
40+
null
4041
})
4142

4243
var port = config.get("port")

errors.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,10 @@ var MissingDatacenter = TypedError({
1818

1919
var DatacenterRequired = TypedError({
2020
type: 'datacenter.option.required',
21-
message: 'expected `opts.dc` to be passed to fetchConfig.\n' +
22-
'must call `fetchConfig(__dirname, { dc: "..." }).\n' +
21+
message: 'expected `opts.dcValue` to be passed to fetchConfig.\n' +
22+
'must call `fetchConfig(__dirname, { dcValue: "..." }).\n' +
2323
'instead I got opts: {strOpts}.\n' +
24-
'`opts.dc` is not optional when NODE_ENV is "production".\n' +
24+
'`opts.dcValue` is not optional when NODE_ENV is "production".\n' +
2525
'SUGGESTED FIX: update the `fetchConfig()` callsite.\n'
2626
});
2727

index.js

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
var process = require('process');
22
var EventEmitter = require('events').EventEmitter;
3+
var Result = require('raynos-rust-result');
34

45
var errors = require('./errors.js');
56
var readDatacenter = require('./read-datacenter.js');
@@ -21,16 +22,17 @@ function fetchConfigSync(dirname, opts) {
2122
// config is EventEmitter purely for `.emit('error', err)`
2223
var config = new EventEmitter();
2324

24-
var datacenterTuple = readDatacenter(opts);
25+
var result = readDatacenter(opts);
2526

26-
if (datacenterTuple[0]) {
27+
if (Result.isErr(result)) {
28+
var err = Result.Err(result);
2729
// throw error async. this allows for breaking a
2830
// circular dependency between config & logger.
2931
process.nextTick(function () {
30-
config.emit('error', datacenterTuple[0]);
32+
config.emit('error', err);
3133
});
3234
} else {
33-
opts.datacenterValue = datacenterTuple[1];
35+
opts.datacenterValue = Result.Ok(result);
3436
}
3537

3638
var configState = getConfigState(dirname, opts);

package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,8 @@
1818
"error": "^4.1.1",
1919
"flatten-prototypes": "^3.0.0",
2020
"minimist": "^1.1.0",
21-
"process": "^0.7.0"
21+
"process": "^0.7.0",
22+
"raynos-rust-result": "0.1.0-improvement3"
2223
},
2324
"devDependencies": {
2425
"coveralls": "^2.10.0",

read-datacenter.js

Lines changed: 25 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
var fs = require('fs');
2+
var Result = require('raynos-rust-result');
23

34
var errors = require('./errors.js');
45

@@ -8,46 +9,51 @@ function readDatacenter(opts) {
89
var env = opts.env || process.env;
910
var NODE_ENV = env.NODE_ENV;
1011

11-
if (NODE_ENV === 'production' && !opts.dc) {
12+
// specifying a datacenter is optional in dev but required
13+
// in production.
14+
if (NODE_ENV === 'production' && !opts.dc && !opts.dcValue) {
1215
throw errors.DatacenterRequired({
1316
strOpts: JSON.stringify(opts)
1417
});
1518
}
1619

17-
var result, error = null;
20+
var result;
1821

19-
// specifying a datacenter is optional in dev but required
20-
// in production.
21-
if (opts.dc) {
22-
var tuple = readFileOrError(opts.dc);
23-
if (tuple[0]) {
24-
var err = tuple[0];
22+
if (opts.dcValue) {
23+
result = Result.Ok({
24+
'datacenter': opts.dcValue.replace(/\s/g, '')
25+
});
26+
} else if (opts.dc) {
27+
var fileResult = readFileOrError(opts.dc);
28+
if (Result.isErr(fileResult)) {
29+
var err = Result.Err(fileResult);
2530
// create error synchronously for correct stack trace
2631
if (NODE_ENV === 'production') {
27-
error = errors.DatacenterFileRequired({
32+
result = Result.Err(errors.DatacenterFileRequired({
2833
path: err.path,
2934
errno: err.errno,
3035
code: err.code,
3136
syscall: err.syscall
32-
});
37+
}));
3338
} else {
34-
error = errors.MissingDatacenter({
39+
result = Result.Err(errors.MissingDatacenter({
3540
path: err.path,
3641
errno: err.errno,
3742
code: err.code,
3843
syscall: err.syscall
39-
});
44+
}));
4045
}
4146
} else {
42-
result = {
43-
'datacenter': tuple[1].replace(/\s/g, '')
44-
};
47+
result = Result.Ok({
48+
'datacenter': Result.Ok(fileResult)
49+
.replace(/\s/g, '')
50+
});
4551
}
4652
} else {
47-
result = null;
53+
result = Result.Ok(null);
4854
}
4955

50-
return [error, result];
56+
return result;
5157
}
5258

5359
// break try catch into small function to avoid v8 de-optimization
@@ -56,8 +62,8 @@ function readFileOrError(uri) {
5662
try {
5763
content = fs.readFileSync(uri, 'utf8');
5864
} catch (err) {
59-
return [err, null];
65+
return Result.Err(err);
6066
}
6167

62-
return [null, content];
68+
return Result.Ok(content);
6369
}

test/index.js

Lines changed: 40 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,43 @@ test('config loads from datacenter file', withFixtures(__dirname, {
137137
assert.end();
138138
}));
139139

140+
test('config loads from dcValue', withFixtures(__dirname, {
141+
'config': {
142+
'common.json': JSON.stringify({
143+
a: 'a',
144+
b: {
145+
c: 'c',
146+
d: 'd'
147+
}
148+
}),
149+
'production.json': JSON.stringify({
150+
b: {
151+
c: 'c2'
152+
}
153+
}),
154+
'production.peak1.json': JSON.stringify({
155+
a: 'a3'
156+
})
157+
}
158+
}, function (assert) {
159+
var env = {
160+
'NODE_ENV': 'production'
161+
};
162+
163+
var config = fetchConfig(__dirname, {
164+
env: env,
165+
dcValue: 'peak1'
166+
});
167+
168+
assert.equal(config.get('datacenter'), 'peak1');
169+
assert.equal(config.get('a'), 'a3');
170+
assert.equal(config.get('b.c'), 'c2');
171+
assert.equal(config.get('b.d'), 'd');
172+
assert.deepEqual(config.get('b'), { c: 'c2', d: 'd' });
173+
174+
assert.end();
175+
}));
176+
140177
test('config reads a datacenter file', withFixtures(__dirname, {
141178
datacenter: 'peak1'
142179
}, function (assert) {
@@ -201,7 +238,7 @@ test('will load from --config', withFixtures(__dirname, {
201238
assert.end();
202239
}));
203240

204-
test('no opts.dc in production', function (assert) {
241+
test('no opts.dcValue in production', function (assert) {
205242
var err = catchFn(function () {
206243
fetchConfig(__dirname, {
207244
env: { NODE_ENV: 'production' }
@@ -210,8 +247,8 @@ test('no opts.dc in production', function (assert) {
210247

211248
assert.ok(err);
212249
assert.equal(err.type, 'datacenter.option.required');
213-
assert.ok(/expected `opts.dc`/.test(err.message));
214-
assert.ok(/`opts.dc` is not optional/.test(err.message));
250+
assert.ok(/expected `opts.dcValue`/.test(err.message));
251+
assert.ok(/`opts.dcValue` is not optional/.test(err.message));
215252

216253
assert.end();
217254
});

0 commit comments

Comments
 (0)