chamber 1.0.3 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (73) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +288 -173
  3. data/bin/chamber +2 -288
  4. data/lib/chamber.rb +19 -67
  5. data/lib/chamber/binary/heroku.rb +59 -0
  6. data/lib/chamber/binary/runner.rb +94 -0
  7. data/lib/chamber/binary/travis.rb +23 -0
  8. data/lib/chamber/commands/base.rb +33 -0
  9. data/lib/chamber/commands/comparable.rb +37 -0
  10. data/lib/chamber/commands/compare.rb +46 -0
  11. data/lib/chamber/commands/context_resolver.rb +72 -0
  12. data/lib/chamber/commands/files.rb +12 -0
  13. data/lib/chamber/commands/heroku.rb +30 -0
  14. data/lib/chamber/commands/heroku/clear.rb +25 -0
  15. data/lib/chamber/commands/heroku/compare.rb +31 -0
  16. data/lib/chamber/commands/heroku/pull.rb +30 -0
  17. data/lib/chamber/commands/heroku/push.rb +25 -0
  18. data/lib/chamber/commands/initialize.rb +73 -0
  19. data/lib/chamber/commands/securable.rb +48 -0
  20. data/lib/chamber/commands/secure.rb +16 -0
  21. data/lib/chamber/commands/show.rb +23 -0
  22. data/lib/chamber/commands/travis.rb +14 -0
  23. data/lib/chamber/commands/travis/secure.rb +35 -0
  24. data/lib/chamber/configuration.rb +34 -0
  25. data/lib/chamber/environmentable.rb +23 -0
  26. data/lib/chamber/errors/undecryptable_value_error.rb +6 -0
  27. data/lib/chamber/file.rb +17 -5
  28. data/lib/chamber/file_set.rb +18 -12
  29. data/lib/chamber/filters/boolean_conversion_filter.rb +41 -0
  30. data/lib/chamber/filters/decryption_filter.rb +69 -0
  31. data/lib/chamber/filters/encryption_filter.rb +57 -0
  32. data/lib/chamber/filters/environment_filter.rb +75 -0
  33. data/lib/chamber/filters/namespace_filter.rb +37 -0
  34. data/lib/chamber/filters/secure_filter.rb +39 -0
  35. data/lib/chamber/instance.rb +40 -0
  36. data/lib/chamber/namespace_set.rb +55 -16
  37. data/lib/chamber/rails/railtie.rb +1 -1
  38. data/lib/chamber/settings.rb +103 -42
  39. data/lib/chamber/system_environment.rb +3 -93
  40. data/lib/chamber/version.rb +2 -2
  41. data/spec/fixtures/settings.yml +27 -0
  42. data/spec/lib/chamber/commands/context_resolver_spec.rb +106 -0
  43. data/spec/lib/chamber/commands/files_spec.rb +19 -0
  44. data/spec/lib/chamber/commands/heroku/clear_spec.rb +11 -0
  45. data/spec/lib/chamber/commands/heroku/compare_spec.rb +11 -0
  46. data/spec/lib/chamber/commands/heroku/pull_spec.rb +11 -0
  47. data/spec/lib/chamber/commands/heroku/push_spec.rb +11 -0
  48. data/spec/lib/chamber/commands/secure_spec.rb +29 -0
  49. data/spec/lib/chamber/commands/show_spec.rb +43 -0
  50. data/spec/lib/chamber/file_set_spec.rb +1 -1
  51. data/spec/lib/chamber/file_spec.rb +32 -9
  52. data/spec/lib/chamber/filters/boolean_conversion_filter_spec.rb +44 -0
  53. data/spec/lib/chamber/filters/decryption_filter_spec.rb +55 -0
  54. data/spec/lib/chamber/filters/encryption_filter_spec.rb +48 -0
  55. data/spec/lib/chamber/filters/environment_filter_spec.rb +35 -0
  56. data/spec/lib/chamber/filters/namespace_filter_spec.rb +73 -0
  57. data/spec/lib/chamber/filters/secure_filter_spec.rb +36 -0
  58. data/spec/lib/chamber/namespace_set_spec.rb +61 -18
  59. data/spec/lib/chamber/settings_spec.rb +99 -23
  60. data/spec/lib/chamber/system_environment_spec.rb +1 -71
  61. data/spec/lib/chamber_spec.rb +40 -26
  62. data/spec/rails-2-test/config.ru +0 -0
  63. data/spec/rails-2-test/config/application.rb +5 -0
  64. data/spec/rails-2-test/script/console +0 -0
  65. data/spec/rails-3-test/config.ru +0 -0
  66. data/spec/rails-3-test/config/application.rb +5 -0
  67. data/spec/rails-3-test/script/rails +0 -0
  68. data/spec/rails-4-test/bin/rails +0 -0
  69. data/spec/rails-4-test/config.ru +0 -0
  70. data/spec/rails-4-test/config/application.rb +5 -0
  71. data/spec/spec_key +27 -0
  72. data/spec/spec_key.pub +9 -0
  73. metadata +85 -4
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 4e991dd80673beb3645505e5b5571cf8c6529edc
4
- data.tar.gz: eb74b4013f2bec9a18957ef9c527ee11954e10d0
3
+ metadata.gz: e5d109673b130deb762adb5bb07bdce3f93c3848
4
+ data.tar.gz: 7bbce53ee5448ac94a876ca314461ce216ad881c
5
5
  SHA512:
6
- metadata.gz: 7b6cd7b23ebd25a196e304de3106fb1679c30c0b01c19a9fedccddfe83ee6340198ec1f21526f5a741d5ef3fbec9d440035845a2edf6d3feb43e2e557a39597a
7
- data.tar.gz: d39a4b31520431a209bacf8e11973b12981d5a24067f34d14a19bff860ac8e720825cda04762241e4dc82e4b566c834c6ee129c020da27bced522bd83dcb59bb
6
+ metadata.gz: 8e1cdda8675bdb504657159f52209dd24fa5bd9accecd2cfddbb68a1df08011684b1152eeb975362a0b3452d8a9183655e886f5b3078659a934349229ee5a4a3
7
+ data.tar.gz: d540cd77c3e966b9f355f1e910b74317254f4d8b6ea32e47db39fc92f567b3e6d71d029daebd059cbe371fcc5d63f7e3e106090dec9bb8f6944245cc3626dd0d
data/README.md CHANGED
@@ -1,8 +1,34 @@
1
1
  # Chamber [![Build Status](https://travis-ci.org/m5rk/chamber.png)](https://travis-ci.org/m5rk/chamber) [![Code Climate](https://codeclimate.com/github/m5rk/chamber.png)](https://codeclimate.com/github/m5rk/chamber)
2
2
 
3
- Chamber lets you source your settings from an arbitrary number of YAML files that
4
- values convention over configuration and has an automatic mechanism for working
5
- with Heroku's (or anyone else's) ENV variables.
3
+ Chamber is the auto-encrypting, extremely organizable, Heroku-loving, CLI-having,
4
+ non-extra-repo-needing, non-Rails-specific-ing, CI-serving configuration
5
+ management library.
6
+
7
+ ## But What About Those Other Configuration Management Gems?
8
+
9
+ We reviewed [some other gems](#alternatives), and while each fit a specific need
10
+ and each did some things well, none of them met all of the criteria that we felt
11
+ we (and assumed others) needed.
12
+
13
+ <img src="https://akiajm7spx4gtbhaxe3qcomhaystacksoftwarearp.s3.amazonaws.com/photos/readmes/ten-commandments.png" align="right" />
14
+
15
+ **Our Ten Commandments of Configuration Management**
16
+
17
+ 1. Thou shalt be configurable, but use conventions so that configuration isn't
18
+ necessary
19
+ 1. Thou shalt seemlessly work with Heroku or other deployment platforms, where custom
20
+ settings must be stored in environment variables
21
+ 1. Thou shalt seemlessly work with Travis CI and other cloud CI platforms
22
+ 1. Thou shalt not force users to use arcane
23
+ really_long_variable_names_just_to_keep_their_settings_organized
24
+ 1. Thou shalt not require users keep a separate repo or cloud share sync just to
25
+ keep their secure settings updated
26
+ 1. Thou shalt not be bound to a single framework like Rails (it should be usable in
27
+ plain Ruby projects)
28
+ 1. Thou shalt have an easy-to-use CLI for scripting
29
+ 1. Thou shalt easily integrate with Capistrano for deployments
30
+ 1. Thou shalt be well documented with full test coverage
31
+ 1. Thou shalt not have to worry about accidentally committing secure settings
6
32
 
7
33
  ## Installation
8
34
 
@@ -24,6 +50,24 @@ Or install it yourself as:
24
50
  $ gem install chamber
25
51
  ```
26
52
 
53
+ Once the gem is installed, you'll want to add it to your project. To do this,
54
+ type:
55
+
56
+ ```sh
57
+ chamber init
58
+ ```
59
+
60
+ This creates a public/private keypair for you to use with your project. The
61
+ private key will be called `.chamber.pem`. The public key will be called
62
+ `.chamber.pem.pub`.
63
+
64
+ `.chamber.pem` will be added to your gitignore file so that it is not
65
+ accidentally checked in. *Keep this file safe* since anyone who has it will be
66
+ able to decrypt any settings that Chamber encrypts for you.
67
+
68
+ Lastly, it will create a sample `settings.yml` file for you which you should
69
+ modify as needed.
70
+
27
71
  ## Basic Usage
28
72
 
29
73
  ### Convention Over Configuration
@@ -31,7 +75,6 @@ $ gem install chamber
31
75
  By default Chamber only needs a base path to look for settings files. From
32
76
  that path it will search for:
33
77
 
34
- * The file `<basepath>/credentials.yml`
35
78
  * The file `<basepath>/settings.yml`
36
79
  * A set of files ending in `.yml` in the `<basepath>/settings` directory
37
80
 
@@ -43,12 +86,8 @@ Chamber.load basepath: '/path/to/my/application'
43
86
 
44
87
  ### In Rails
45
88
 
46
- If you're running a Rails app, by default Chamber will set the basepath to your
47
- Rails app's `config` directory, which is the equivalent of:
48
-
49
- ```ruby
50
- Chamber.load basepath: Rails.root.join('config')
51
- ```
89
+ You do not have to do anything. Chamber will auto-configure itself to point to
90
+ the `config` directory.
52
91
 
53
92
  ### Accessing Settings
54
93
 
@@ -61,7 +100,7 @@ Given a `settings.yml` file containing:
61
100
 
62
101
  ```yaml
63
102
  smtp:
64
- server: "example.com"
103
+ server: "example.com"
65
104
  username: "my_user"
66
105
  password: "my_pass"
67
106
  ```
@@ -80,15 +119,60 @@ Chamber.env.smtp.server
80
119
  # => example.com
81
120
  ```
82
121
 
83
- ### Keeping Your Settings Files Secure
122
+ ### Securing Your Settings
123
+
124
+ Certain settings you will want to keep from prying eyes. Unlike other
125
+ configuration management libraries, Chamber doesn't require you to keep those
126
+ files separate. You can check *everything* into your repo.
127
+
128
+ Why is keeping your secure files separate a pain? Because you must keep those
129
+ files in sync between all of your team members who are deploying the app.
130
+ Either you have to use a separate private repo, or you have to use something
131
+ like a Dropbox share. In either case, you'd then symlink the files from their
132
+ locations into your application. What. A. Pain.
133
+
134
+ Chamber uses public/private encryption keys to seemlessly store any of your
135
+ configuration values as encrypted text. The only file that needs to be synced
136
+ *once* between developers is the private key. And even that file would only be
137
+ needed by the users deploying the application. If you're deploying via CI,
138
+ Github, etc, then technically no developer needs it.
139
+
140
+ #### Working With Secure Configuration Settings
141
+
142
+ After running `chamber init` as described above, the hard work is done. From
143
+ here on out, Chamber makes working with secure settings almost an afterthought.
144
+
145
+ When you create your configuration YAML file (or add a new setting to an
146
+ existing one), you can format your secure keys like so:
147
+
148
+ ```yaml
149
+ # settings.yml
150
+
151
+ _secure_my_secure_key_name: 'my secure value'
152
+ ```
153
+
154
+ When Chamber sees this convention (`_secure_` followed by the key name), it will
155
+ automatically look to either encrypt or decrypt the value using the
156
+ public/private keys you generated above into something like:
157
+
158
+ ```yaml
159
+ # settings.yml
160
+
161
+ _secure_my_secure_key_name: 8239f293r9283r9823r92hf9823hf9uehfksdhviwuehf923uhrehf9238
162
+ ```
163
+
164
+ However you would still be able to access the value like so (assuming you had
165
+ the private key in the application's root):
84
166
 
85
- Check out [Keeping Private Settings Private](#keeping-private-settings-private)
86
- below.
167
+ ```ruby
168
+ Chamber.env.my_secure_key_name
169
+ # => 'my secure value'
170
+ ```
87
171
 
88
- ### Existing Environment Variables (aka Heroku)
172
+ ### Using Existing Environment Variables
89
173
 
90
- If deploying to a system which has all of your environment variables already
91
- set, you're not going to use all of the values stored in the YAML files.
174
+ If deploying to a system which has all of your environment variables already set
175
+ (eg Heroku), you're not going to use all of the values stored in the YAML files.
92
176
  Instead, you're going to want to pull certain values from environment variables.
93
177
 
94
178
  **Example:**
@@ -97,7 +181,7 @@ Given a `settings.yml` file containing:
97
181
 
98
182
  ```yaml
99
183
  smtp:
100
- server: "example.com"
184
+ server: "example.com"
101
185
  username: "my_user"
102
186
  password: "my_pass"
103
187
  ```
@@ -108,7 +192,7 @@ If an environment variable is already set like so:
108
192
  export SMTP_SERVER="myotherserverisapentium.com"
109
193
  ```
110
194
 
111
- Then when you ask Chamber to give you the SMTP server:
195
+ Then, when you ask Chamber to give you the SMTP server:
112
196
 
113
197
  ```ruby
114
198
  Chamber[:smtp][:server]
@@ -121,14 +205,15 @@ variable.
121
205
  ## Deploying to Heroku
122
206
 
123
207
  If you're deploying to Heroku, they won't let you upload custom config files. If
124
- you do not have your config files all stored in your repo (which you shouldn't
125
- if some of the information is sensitive), it becomes more difficult to gain
126
- access to that information on Heroku.
208
+ you do not have your config files all stored in your repo, or some of your
209
+ settings are encrypted, it becomes more difficult to gain access to that
210
+ information on Heroku.
127
211
 
128
212
  To solve this problem, Heroku allows you to set environment variables in your
129
213
  application. Unfortunately this has the nasty side effect of being a pain to
130
214
  deal with. For one, you have to deal with environment variables with unweildy
131
- names. For another, it makes the organization of those variables difficult.
215
+ names (eg `MY_THIRD_PARTY_SERVICE_DEV_API_KEY`). For another, it makes the
216
+ organization of those variables difficult.
132
217
 
133
218
  Fortunately, Chamber allows you to organize your environment variables in
134
219
  separate files and access them easily using hash or object notation, however at
@@ -137,18 +222,14 @@ configuration settings up to Heroku as environment variables.
137
222
 
138
223
  When Chamber accesses those same hash/object notated config values, it will
139
224
  first look to see if an associated environment variable exists. If it does, it
140
- will use that in place of any values inside of the config files.
225
+ will use that in place of any values inside of the config files as [described
226
+ above](#using-existing-environment-variables).
141
227
 
142
- Simply run:
228
+ To update Heroku with all the proper environment variables so that your app
229
+ works as expected, run the following from the root of your app:
143
230
 
144
231
  ```sh
145
- # In the root folder of your Rails app:
146
-
147
- chamber heroku push --preset=rails
148
-
149
- # In the root folder of another type of application:
150
-
151
- chamber heroku push --basepath=./
232
+ chamber heroku push
152
233
  ```
153
234
 
154
235
  And all of your settings will be converted to environment variable versions
@@ -168,7 +249,7 @@ information.
168
249
  To execute this, simply run:
169
250
 
170
251
  ```sh
171
- chamber travis secure --basepath=./
252
+ chamber travis secure
172
253
  ```
173
254
 
174
255
  This will add `secure` entries into your `.travis.yml` file. Each one will
@@ -202,15 +283,6 @@ associated namespaced files. Finally it will load all \*.yml files in the
202
283
  `chamber` directory *except* `credentials.yml` because it has previously been
203
284
  loaded.
204
285
 
205
- ### Object-Based Environment Variable Access
206
-
207
- If you aren't a fan of the hash-based access, you can also access them
208
- using methods:
209
-
210
- ```ruby
211
- Chamber.env.smtp.server
212
- ```
213
-
214
286
  ### Predicate Methods
215
287
 
216
288
  When using object notation, all settings have `?` and `_` predicate methods
@@ -256,28 +328,25 @@ Notice the difference:
256
328
 
257
329
  One of the nice things about Chamber is that it runs each settings file through
258
330
  ERB before it tries to parse it as YAML. The main benefit of this is that you
259
- can use settings from previous files in ERB for later files. This is mainly
260
- used if you follow our convention of putting all of your sensitive information
261
- in your `credentials.yml` file.
331
+ can use settings from previous files in ERB for later files.
262
332
 
263
333
  **Example:**
264
334
 
265
335
  ```yaml
266
- # credentials.yml
336
+ # settings.yml
267
337
 
268
338
  production:
269
339
  my_secret_key: 123456789
270
340
  ```
271
341
 
272
342
  ```erb
273
- <%# settings.yml %>
343
+ <%# settings/some_service-production.yml %>
274
344
 
275
- production:
276
- my_url: http://my_username:<%= Chamber[:my_secret_key] %>@my-url.com
345
+ my_service_url: http://my_username:<%= Chamber[:my_secret_key] %>@my-url.com
277
346
  ```
278
347
 
279
- Because by default Chamber processes `credentials` settings files before
280
- anything else, this works.
348
+ Because by default Chamber processes `settings*.yml` settings files before
349
+ anything in the `settings` subdirectory, this works.
281
350
 
282
351
  But it's all ERB so you can do as much crazy ERB stuff in your settings files as
283
352
  you'd like:
@@ -313,9 +382,9 @@ under specific circumstances, you can use Chamber's namespaces.
313
382
  **Example:**
314
383
 
315
384
  ```ruby
316
- Chamber.load( :basepath => '/tmp',
385
+ Chamber.load( :basepath => Rails.root.join('config'),
317
386
  :namespaces => {
318
- :environment => -> { ::Rails.env } } )
387
+ :environment => ::Rails.env } )
319
388
  ```
320
389
 
321
390
  For this class, it will not only try and load the file `config/settings.yml`,
@@ -383,17 +452,50 @@ smtp:
383
452
  ````
384
453
 
385
454
  The above will yield the same results, but allows you to keep the production
386
- values in a separate file which can be secured separately.
455
+ values in a separate file which can be secured separately. Although I would
456
+ recommend keeping everything together and just [encrpyting your sensitive
457
+ info](#securing-your-settings)
458
+
459
+ If you would like to have items shared among namespaces, you can easily use
460
+ YAML's built-in merge functionality to do that for you:
461
+
462
+ ```yaml
463
+ # settings.yml
464
+
465
+ default: &default
466
+ smtp:
467
+ headers:
468
+ X-MYAPP-NAME: My Application Name
469
+ X-MYAPP-STUFF: Other Stuff
470
+
471
+ development:
472
+ <<: *default
473
+ smtp:
474
+ username: my_development_username
475
+ password: my_development_password`
476
+
477
+ test:
478
+ <<: *default
479
+ smtp:
480
+ username: my_test_username
481
+ password: my_test_password`
482
+
483
+ staging:
484
+ <<: *default
485
+ smtp:
486
+ username: my_staging_username
487
+ password: my_staging_password`
488
+ ```
387
489
 
388
490
  #### Multiple Namespaces
389
491
 
390
492
  Multiple namespaces can be defined by passing multiple items to the loader:
391
493
 
392
494
  ```ruby
393
- Chamber.load( :basepath => '/tmp',
495
+ Chamber.load( :basepath => Rails.root.join('config'),
394
496
  :namespaces => {
395
- :environment => -> { ::Rails.env },
396
- :hostname => -> { ENV['HOST'] } } )
497
+ :environment => ::Rails.env,
498
+ :hostname => ENV['HOST'] } )
397
499
  ```
398
500
 
399
501
  When accessed within the `test` environment on a system named `tumbleweed`, it
@@ -468,22 +570,63 @@ Each of the commands described below takes a few common options.
468
570
 
469
571
  **Example:** `--preset=rails`
470
572
 
471
- * `--files` (or `-f`): Allows you to specifically set the file patterns that
472
- Chamber should look at in determining where to load settings information from.
573
+ * `--rootpath` (or `-r`): Allows you to quickly set the rootpath of the
574
+ application. By default this is the directory that the `chamber` executable is
575
+ run from.
473
576
 
474
- **Example:** `--files=/path/to/my/application/secret.yml /path/to/my/application/settings/*.yml`
577
+ **Example:** `--rootpath=/path/to/my/application`
475
578
 
476
579
  * `--basepath` (or `-b`): Sets the base path that Chamber will use to look for
477
580
  its [common settings files](#convention-over-configuration).
478
581
 
479
582
  **Example:** `--basepath=/path/to/my/application`
480
583
 
584
+ * `--files` (or `-f`): Allows you to specifically set the file patterns that
585
+ Chamber should look at in determining where to load settings information from.
586
+
587
+ **Example:** `--files=/path/to/my/application/secret.yml /path/to/my/application/settings/*.yml`
588
+
481
589
  * `--namespaces` (or `-n`): The namespace values which will be considered for
482
590
  loading settings files.
483
591
 
484
- **Example:** `--namespaces=development`
592
+ **Example:** `--namespaces=development tumbleweed`
593
+
594
+ * `--encryption-key`: The path to the key which will be used for encryption.
595
+ This is optional unless you need to secure any settings.
596
+
597
+ Additionally you may pass in the actual contents of the key for this option.
598
+
599
+ **Example:** `--keypair=/path/to/my/app/my_project_rsa.pub`
600
+
601
+ * `--decryption-key`: The path to the key which will be used for decryption.
602
+ This is optional unless you need to decrypt any settings.
603
+
604
+ Additionally you may pass in the actual contents of the key for this option.
605
+
606
+ **Example:** `--keypair=/path/to/my/app/my_project_rsa`
607
+
608
+ _**Note:** `--basepath` and `--files` are mutually exclusive. `--files` will
609
+ always take precedence._
610
+
611
+ #### Somewhat Common Options
485
612
 
486
- _**Note:** `--basepath`, `--preset` and `--files` are mutually exclusive._
613
+ _**Note:** Only select commands support the following options. Use `chamber help
614
+ SUBCOMMAND` to verify if a particular command does._
615
+
616
+ * `--dry-run` (or `-d`): The command will not actually execute, but will show
617
+ you a summary of what *would* have happened.
618
+
619
+ **Example:** `--dry-run`
620
+
621
+ * `--only-secured` (or `-o`): This is the default. Because most systems have no
622
+ issues reading from the config files you have stored in your repo, there is no
623
+ need to process *all* of your settings. So by default, Chamber will only
624
+ convert, push, etc those settings which have been gitignored or those which
625
+ have been encrpyted.
626
+
627
+ To process everything, use the `--skip-secure-only` flag.
628
+
629
+ **Example:** `--secure-only`, `--skip-secure-only`
487
630
 
488
631
  #### Settings
489
632
 
@@ -499,7 +642,7 @@ about for a given context. It will be output as a hash of hashes by default.
499
642
 
500
643
  **Example:** `--as-env`
501
644
 
502
- **Example:** `chamber settings show -p=rails`
645
+ **Example:** `chamber show --as-env`
503
646
 
504
647
  ###### Files
505
648
 
@@ -510,7 +653,19 @@ Additionally, the order is significant. Chamber will load settings from the
510
653
  top down so any duplicate items in subsequent entries will override items from
511
654
  previous ones.
512
655
 
513
- **Example:** `chamber settings files -p=rails`
656
+ **Example:** `chamber files`
657
+
658
+ ###### Secure
659
+
660
+ Will verify that any items which are marked as secure (eg `_secure_my_setting`)
661
+ have secure values. If it appears that one does not, the user will be prompted
662
+ as to whether or not they would like to encrpyt it.
663
+
664
+ This command differs from other tasks in that it will process all files that
665
+ match Chamber's conventions and not just those which match the passed in
666
+ namespaces.
667
+
668
+ **Example:** `chamber secure`
514
669
 
515
670
  ###### Compare
516
671
 
@@ -539,17 +694,25 @@ environments.
539
694
 
540
695
  **Example:** `--second=staging`, `--second=staging my_host_name`
541
696
 
542
- **Example:** `chamber settings compare --first=development --second=staging -p=rails`
697
+ **Example:** `chamber compare --first=development --second=staging`
698
+
699
+ ###### Init
700
+
701
+ Init can be used to initialize a new application/project with everything that
702
+ Chamber needs in order to run properly. This includes:
703
+
704
+ * Creating a public/private keypair
705
+ * Setting the proper permissions on the the newly created keypair
706
+ * Adding the private key to the gitignore file
707
+ * Creating a template `settings.yml` file
708
+
709
+ **Example:** `chamber init`
543
710
 
544
711
  #### Heroku
545
712
 
546
713
  As we described above, working with Heroku environment variables is tedious at
547
714
  best. Chamber gives you a few ways to help with that.
548
715
 
549
- _**Note:** I'll be using the `--preset` shorthand `-p` for brevity below but the
550
- examples will work with any of the other options described
551
- [above](#common-options)._
552
-
553
716
  ##### Heroku Common Options
554
717
 
555
718
  * `--app` (or `-a`): Heroku application name for which you would like to affect
@@ -557,20 +720,6 @@ examples will work with any of the other options described
557
720
 
558
721
  **Example:** `--app=my-heroku-app-name`
559
722
 
560
- * `--dry-run` (or `-d`): The command will not actually execute, but will show
561
- you a summary of what *would* have happened.
562
-
563
- **Example:** `--dry-run`
564
-
565
- * `--only-ignored` (or `-o`): This is the default. Because Heroku has no issues
566
- reading from the config files you have stored in your repo, there is no need
567
- to set *all* of your settings as environment variables. So by default,
568
- Chamber will only convert and push those settings which have been gitignored.
569
-
570
- To push everything, use the `--no-only-ignored` flag.
571
-
572
- **Example:** `--only-ignored`, `--no-only-ignored`
573
-
574
723
  ##### Heroku Commands
575
724
 
576
725
  ###### Push
@@ -579,10 +728,10 @@ As we described above, this command will take your current settings and push
579
728
  them to Heroku as environment variables that Chamber will be able to
580
729
  understand.
581
730
 
582
- **Example:** `chamber heroku push -a=my-heroku-app -p=rails -n=staging`
731
+ **Example:** `chamber heroku push --namespaces=production --app=my-heroku-app`
583
732
 
584
733
  _**Note:** To see exactly how Chamber sees your settings as environment variables, see
585
- the [chamber settings show](#general-settings-commands) command above._
734
+ the [chamber settings show](#settings-commands) command above._
586
735
 
587
736
  ###### Pull
588
737
 
@@ -598,9 +747,9 @@ specify the following option:
598
747
  _**Note:** Eventually this will be parsed into YAML that Chamber can load
599
748
  straight away, but for now, it's basically just redirecting the output._
600
749
 
601
- **Example:** `--into=/path/to/my/app/settings/heroku.yml`
750
+ **Example:** `--into=/path/to/my/app/settings/heroku.config`
602
751
 
603
- **Example:** `chamber heroku pull -a=my-heroku-app --into=/path/to/my/app/heroku.yml`
752
+ **Example:** `chamber heroku pull --app=my-heroku-app --into=/path/to/my/app/heroku.config`
604
753
 
605
754
  ###### Diff
606
755
 
@@ -608,7 +757,7 @@ Will use git's diff function to display the difference between what Chamber
608
757
  knows about locally and what Heroku currently has set. This is very handy for
609
758
  knowing what changes may be made if `chamber heroku push` is executed.
610
759
 
611
- **Example:** `chamber heroku diff -a=my-heroku-app -p=rails -n=staging`
760
+ **Example:** `chamber heroku diff --namespaces=production --app=my-heroku-app`
612
761
 
613
762
  ###### Clear
614
763
 
@@ -616,34 +765,18 @@ Will remove any environment variables from Heroku that Chamber knows about.
616
765
  This is useful for clearing out Chamber-related settings without touching
617
766
  Heroku addon-specific items.
618
767
 
619
- **Example:** `chamber heroku clear -a=my-heroku-app -p=rails -n=staging`
768
+ **Example:** `chamber heroku clear --namespaces=production --app=my-heroku-app`
620
769
 
621
770
  #### Travis CI
622
771
 
623
- ##### Travis Common Options
624
-
625
- * `--dry-run` (or `-d`): The command will not actually execute, but will show
626
- you a summary of what *would* have happened.
627
-
628
- **Example:** `--dry-run`
629
-
630
- * `--only-ignored` (or `-o`): This is the default. Because Travis has no issues
631
- reading from the config files you have stored in your repo, there is no need
632
- to set *all* of your settings as environment variables. So by default,
633
- Chamber will only convert and push those settings which have been gitignored.
634
-
635
- To push everything, use the `--no-only-ignored` flag.
636
-
637
- **Example:** `--only-ignored`, `--no-only-ignored`
638
-
639
772
  ##### Travis Commands
640
773
 
641
774
  ###### Secure
642
775
 
643
- Travis CI allows you to use the public key on your Travis repo to encrypt
644
- items such as environment variables which you would like for Travis to be able
645
- to have access to, but which you wouldn't necessarily want to be in plain text
646
- inside of your repo.
776
+ Travis CI allows you to use the public key on your Travis repo to encrypt items
777
+ as environment variables which you would like for Travis to be able to have
778
+ access to, but which you wouldn't necessarily want to be in plain text inside of
779
+ your repo.
647
780
 
648
781
  This command takes the settings that Chamber knows about, encrypts them, and
649
782
  puts them inside of your .travis.yml at which point they can be safely
@@ -652,7 +785,7 @@ committed.
652
785
  _**Warning:** This will delete *all* of your previous 'secure' entries under
653
786
  'env.global' in your .travis.yml file._
654
787
 
655
- **Example:** `chamber travis secure -p=rails -n=continuous_integration`
788
+ **Example:** `chamber travis secure --namespaces=continuous_integration`
656
789
 
657
790
  ### Basic Boolean Conversion
658
791
 
@@ -674,12 +807,12 @@ if Chamber.env.my_feature.enabled?
674
807
  end
675
808
  ```
676
809
 
677
- Will always return true because `false` becomes `'false'` on Heroku which, as
678
- far as Ruby is concerned, is `true`. Now, you could completely omit the
679
- `enabled` key, however this causes issues if you would like to audit your
680
- settings (say for each environment) to make sure they are all the same. Some
681
- will have the `enabled` setting and some will not, which will give you false
682
- positives.
810
+ Now because environment variables are always strings, `false` becomes `'false'`.
811
+ And because, as far as Ruby is concerned, any `String` is `true`, `enabled?`
812
+ would return `true`. Now, you could completely omit the `enabled` key, however
813
+ this causes issues if you would like to audit your settings (say for each
814
+ environment) to make sure they are all the same. Some will have the `enabled`
815
+ setting and some will not, which will give you false positives.
683
816
 
684
817
  You could work around it by doing this:
685
818
 
@@ -689,7 +822,7 @@ if Chamber.env.my_feature.enabled == 'true'
689
822
  end
690
823
  ```
691
824
 
692
- but that looks awful.
825
+ but that looks awful and isn't very idomatic.
693
826
 
694
827
  To solve this problem, Chamber reviews all of your settings values and, if they
695
828
  are any of the following exact strings (case insensitive):
@@ -714,7 +847,8 @@ accessing it. Don't worry, Chamber will take you 98% of the way there.
714
847
  Just include it like so:
715
848
 
716
849
  ```ruby
717
- class Settings < Chamber
850
+ class Settings
851
+ extend Chamber
718
852
  end
719
853
  ```
720
854
 
@@ -723,51 +857,11 @@ environment, you can simply use `Settings[:application_host]`.
723
857
 
724
858
  ## Best Practices
725
859
 
726
- ### Why Do We Need Chamber?
727
-
728
- > Don't store sensitive information in git.
729
-
730
- A better way to say it is that you should store sensitive information separate
731
- from non-sensitive information. There's nothing inherently wrong with storing
732
- sensitive information in git. You just wouldn't want to store it in a public
733
- repository.
734
-
735
- If it weren't for this concern, managing settings would be trivial, easily
736
- solved use any number of approaches; e.g., [like using YAML and ERB in an
737
- initializer](http://urgetopunt.com/rails/2009/09/12/yaml-config-with-erb.html).
738
-
739
860
  ### Organizing Your Settings
740
861
 
741
- We recommend starting with a single `config/settings.yml` file. Once this file
742
- begins to become too unwieldy, you can begin to extract common options (let's
743
- say SMTP settings) into another file (perhaps `config/settings/smtp.yml`).
744
-
745
- ### Keeping Private Settings Private
746
-
747
- Obviously the greater the number of files which need to be kept private the more
748
- difficult it is to manage the settings. Therefore we suggest beginning with one
749
- private file that stores all of your credentials.
750
-
751
- ### Ignoring Settings Files
752
-
753
- We recommend adding the following to your `.gitignore` file:
754
-
755
- ```
756
- # Ignore the environment-specific files that contain the real credentials:
757
- /config/credentials.yml
758
- /config/credentials-*.yml
759
-
760
- # But don't ignore the example file that shows the structure:
761
- !/config/credentials-example.yml
762
- ```
763
-
764
- Along with any namespace-specific exclusions. For example, if you're using
765
- Rails, you may want to exclude some of your environment-specific files:
766
-
767
- ```
768
- *-staging.yml
769
- *-production.yml
770
- ```
862
+ We recommend starting with a single `settings.yml` file. Once this file begins
863
+ to become too unwieldy, you can begin to extract common options (let's say SMTP
864
+ settings) into another file (perhaps `settings/smtp.yml`).
771
865
 
772
866
  ### Full Example
773
867
 
@@ -778,29 +872,48 @@ Let's walk through how you might use Chamber to configure your SMTP settings:
778
872
 
779
873
  stuff:
780
874
  not: "Not Related to SMTP"
875
+ ```
781
876
 
877
+ ```yaml
782
878
  # config/settings/smtp.yml
783
879
 
784
- smtp:
785
- headers:
786
- X-MYAPP-NAME: My Application Name
787
- X-MYAPP-STUFF: Other Stuff
880
+ default: &shared
881
+ smtp:
882
+ headers:
883
+ X-MYAPP-NAME: My Application Name
884
+ X-MYAPP-STUFF: Other Stuff
788
885
 
789
- # config/settings/smtp-staging.yml
886
+ development:
887
+ <<: *shared
888
+ smtp:
889
+ username: my_dev_user
890
+ password: my_dev_password
790
891
 
791
- smtp:
792
- username: my_test_user
793
- password: my_test_password
892
+ staging:
893
+ <<: *shared
894
+ smtp:
895
+ _secure_username: my_staging_user
896
+ _secure_password: my_staging_password
897
+
898
+ production:
899
+ <<: *shared
900
+ smtp:
901
+ _secure_username: my_production_user
902
+ _secure_password: my_production_password
794
903
  ```
795
904
 
796
- Now you can access both `username` and `headers` off of `smtp` like so:
905
+ Now, assuming you're running in staging, you can access both `username` and
906
+ `headers` off of `smtp` like so:
797
907
 
798
908
  ```ruby
799
909
  Chamber[:smtp][:headers]
800
910
  # => { X-MYAPP-NAME: 'My Application Name', X-MYAPP-STUFF: 'Other Stuff' }
801
911
 
912
+ Chamber[:smtp][:username]
913
+ # => my_staging_username
914
+
802
915
  Chamber[:smtp][:password]
803
- # => my_test_password
916
+ # => my_staging_password
804
917
  ```
805
918
 
806
919
  ## Alternatives
@@ -810,9 +923,11 @@ Chamber[:smtp][:password]
810
923
  * [idkfa](https://github.com/bendyworks/idkfa)
811
924
  * [settingslogic](https://github.com/binarylogic/settingslogic)
812
925
 
813
- ### Others?
926
+ ## Thanks
814
927
 
815
- I'd love to hear of other gems and/or approaches to settings!
928
+ Special thanks to all those gem authors above @binarylogic, @bendyworks,
929
+ @laserlemon and @bkeepers. They gave us the inspiration to write this gem and
930
+ we would have made a lot more mistakes without them paving the way. Thanks all!
816
931
 
817
932
  ## Contributing
818
933