node_config 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1 @@
1
+ Gemfile.lock
@@ -0,0 +1 @@
1
+ 1.9.3-p0
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source("http://rubygems.org")
2
+
3
+ gemspec
@@ -0,0 +1,161 @@
1
+ # NodeConfig
2
+
3
+ Simple "node" configuration solution for Rails applications.
4
+
5
+ ## Prelude
6
+
7
+ "node" is a single machine, which your Rails application is running on.
8
+ So "node" configuration is the configuration for that specific machine. For example:
9
+
10
+ * Your development laptop is also a "node" and needs a local configuration for _development_.
11
+ * Your server is also a "node", but it needs a different configuration for _production_.
12
+
13
+ ## Purpose
14
+
15
+ We need to maintain lots of configuration keys specific for a "node", like AWS access keys,
16
+ Google-Analytics keys and much more...
17
+
18
+ Also:
19
+
20
+ * We want all of this keys to be defined in a _single_ _file_
21
+ * We want all of this keys to be _loaded_ _automatically_ on Rails startup
22
+ * We want all of this keys to be available inside Rails application
23
+ * We want that a missing key results in a _descriptive_ _error_
24
+ * We want this keys to be loaded into a process, which doesn't load the whole application
25
+
26
+ This is what `NodeConfig` tries to simplify.
27
+
28
+ ## Installation
29
+
30
+ ```ruby
31
+ # Gemfile
32
+ gem("node_config")
33
+ ```
34
+
35
+ ```bash
36
+ $ bundle install # Install the gem
37
+ $ rails generate node_config # Generate configuration files
38
+ ```
39
+
40
+ ## Usage
41
+
42
+ Put your node configuration into generated `RAILS_ROOT/config/node_config.yml`.
43
+
44
+
45
+ ### Within a loaded Rails application
46
+
47
+ Your node configuration is available in Rails application config.
48
+ This is done by the generated initializer `config/initializers/node_config.rb`.
49
+
50
+ ```yaml
51
+ # config/node_config.yml
52
+ foo:
53
+ bar: :baz
54
+ ```
55
+
56
+ ```ruby
57
+ # rails console
58
+ Rails.application.config.node_config.foo #=> {"bar" => :baz}
59
+ Rails.application.config.node_config.foo.bar #=> :baz
60
+ ```
61
+
62
+ In a Rake task:
63
+
64
+ ```ruby
65
+ # Rakefile
66
+ task :my_task do
67
+ puts(Rails.application.config.node_config.foo.bar) #=> baz
68
+ end
69
+ ```
70
+
71
+ ### Using without loading Rails
72
+
73
+ Outside the Rails you can access the node configuration through the top
74
+ level module named as your Rails application:
75
+
76
+ ```ruby
77
+ PetShop.node_config.foo.bar #=> :baz
78
+ ```
79
+
80
+ This is done by loading the generated `RAILS_ROOT/config/node_config.rb`.
81
+
82
+ If you have a Rake task for which the node configuration should be available
83
+ _without_ loading whole Rails, use the generated shortcut task.
84
+
85
+ ```ruby
86
+ # lib/tasks/my_task_which_doesnt_need_rails.rake
87
+ load File.expand_path("../node_config.rake", __FILE__)
88
+
89
+ task :my_task_which_doesnt_need_rails => :node_config do
90
+ puts(PetShop.node_config.foo.bar) #=> baz
91
+ end
92
+ ```
93
+
94
+ Or as command line in your `Procfile` (https://github.com/ddollar/foreman)
95
+ for a worker (https://github.com/defunkt/resque):
96
+
97
+ ```ruby
98
+ # Rakefile
99
+ load File.expand_path("../lib/tasks/node_config.rake", __FILE__)
100
+ ```
101
+
102
+ ```
103
+ worker: bundle exec rake node_config resque:work
104
+ ```
105
+
106
+ If you have a script for which the node configuration should be available
107
+ _without_ loading whole Rails, be aware that the process _has_ to be bundled.
108
+ Otherwise it may not find the gem.
109
+
110
+ For example in your backup script (https://github.com/meskyanichi/backup):
111
+
112
+ ```ruby
113
+ # config/backup.rb
114
+ require File.expand_path("../node_config", __FILE__)
115
+
116
+ PetShop.node_config.foo.bar #=> :baz
117
+ ```
118
+
119
+ Same when deploying with Capistrano (https://github.com/capistrano/capistrano):
120
+
121
+ ```ruby
122
+ # config/deploy.rb
123
+ require File.expand_path("../node_config", __FILE__)
124
+
125
+ PetShop.node_config.foo.bar #=> :baz
126
+ ```
127
+
128
+ Or even in an external Ruby script:
129
+
130
+ ```ruby
131
+ # foo.rb
132
+ require "/srv/www/pet_shop/current/config/node_config"
133
+
134
+ PetShop.node_config.foo.bar #=> :baz
135
+ ```
136
+
137
+ If you have a process, which isn't bundled, then require the gem manually:
138
+
139
+ ```ruby
140
+ # foo.rb
141
+ require "rubygems"
142
+ require "node_config"
143
+
144
+ require "/srv/www/pet_shop/current/config/node_config"
145
+
146
+ PetShop.node_config.foo.bar #=> :baz
147
+ ```
148
+
149
+ ## Errors
150
+
151
+ Under the hood `NodeConfig` uses `HashWithStructAccess`,
152
+ so a missing key will result in appropriate `NoMethodError`
153
+ (see https://github.com/kostia/hash_with_struct_access for details).
154
+
155
+
156
+ ## Using with Git
157
+
158
+ Of course you have instruct Git to ignore `config/node.yml`.
159
+
160
+ But it's a good practice to maintain a configuration template with the list of required keys,
161
+ for example in `config/node.yml.template`.
@@ -0,0 +1,8 @@
1
+ require "bundler/gem_tasks"
2
+ require "rake/testtask"
3
+
4
+ Rake::TestTask.new do |t|
5
+ t.test_files = FileList["test/*_test.rb"]
6
+ end
7
+
8
+ task(:default => :test)
@@ -0,0 +1,28 @@
1
+ require "rails/generators"
2
+
3
+ class NodeConfigGenerator < Rails::Generators::Base
4
+ desc("Install NodeConfig")
5
+ source_root(File.expand_path("../templates", __FILE__))
6
+
7
+ def generate_initializer
8
+ @both_app_modules = Rails.application.class.name
9
+ template("config/initializers/node_config.rb.erb", "config/initializers/node_config.rb")
10
+ end
11
+
12
+ def generate_loader
13
+ @top_level_app_module = Rails.application.class.name.split("::").first
14
+ template("config/node_config.rb.erb", "config/node_config.rb")
15
+ end
16
+
17
+ def create_rakefile
18
+ rakefile("node_config.rake") do
19
+ %Q{task :node_config do
20
+ load File.expand_path("../../../config/node_config.rb", __FILE__)
21
+ end}
22
+ end
23
+ end
24
+
25
+ def create_configuration
26
+ create_file("config/node_config.yml")
27
+ end
28
+ end
@@ -0,0 +1 @@
1
+ <%= @both_app_modules %>.config.node_config = NodeConfig.load_file(File.expand_path("../../node_config.yml", __FILE__))
@@ -0,0 +1,7 @@
1
+ require "node_config"
2
+
3
+ module <%= @top_level_app_module %>
4
+ def self.node_config
5
+ @node_config ||= NodeConfig.load_file(File.expand_path("../node_config.yml", __FILE__))
6
+ end
7
+ end
@@ -0,0 +1,8 @@
1
+ require "hash_with_struct_access"
2
+ require "yaml"
3
+
4
+ module NodeConfig
5
+ def self.load_file(path)
6
+ HashWithStructAccess.new(YAML.load_file(path))
7
+ end
8
+ end
@@ -0,0 +1,4 @@
1
+ module NodeConfig
2
+ class Railtie < Rails::Railtie
3
+ end
4
+ end
@@ -0,0 +1,3 @@
1
+ module NodeConfig
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,29 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require File.expand_path("../lib/node_config/version", __FILE__)
4
+
5
+ Gem::Specification.new do |gem|
6
+ gem.name = "node_config"
7
+ gem.version = NodeConfig::VERSION
8
+ gem.description = %q{Simple "node" configuration solution for Rails applications}
9
+ gem.summary = %q{
10
+ Simple "node" configuration solution for Rails applications.
11
+
12
+ We need to maintain lots of configuration keys specific for a "node", like AWS access keys,
13
+ Google-Analytics keys and much more.
14
+
15
+ This is what this gem tries to simplify.
16
+ }
17
+ gem.homepage = "https://github.com/kostia/node_config"
18
+ gem.authors = ["Kostiantyn Kahanskyi"]
19
+ gem.email = %w(kostiantyn.kahanskyi@googlemail.com)
20
+ gem.files = `git ls-files`.split("\n")
21
+ gem.test_files = `git ls-files -- test/*`.split("\n")
22
+ gem.require_paths = %w(lib)
23
+ gem.required_ruby_version = ">= 1.9.2"
24
+ gem.add_dependency("hash_with_struct_access")
25
+ gem.add_dependency("rails", ">= 3.2.1")
26
+ gem.add_development_dependency("minitest")
27
+ gem.add_development_dependency("rake")
28
+ gem.add_development_dependency("turn")
29
+ end
@@ -0,0 +1,2 @@
1
+ foo:
2
+ bar: :baz
@@ -0,0 +1,51 @@
1
+ require "./test/test_helper"
2
+
3
+ require "generators/node_config_generator"
4
+
5
+ module PetShop
6
+ class Application
7
+ def self.config
8
+ end
9
+ end
10
+ end
11
+
12
+ class NodeConfigGeneratorTest < Rails::Generators::TestCase
13
+ tests(NodeConfigGenerator)
14
+ destination("/tmp")
15
+ setup(:prepare_destination)
16
+
17
+ # Stub application module
18
+ def Rails.application
19
+ ::PetShop::Application.new
20
+ end
21
+
22
+ test "should create YAML config file" do
23
+ run_generator
24
+ assert_file("config/node_config.yml")
25
+ end
26
+
27
+ test "should create rakefile" do
28
+ run_generator
29
+ assert_file("lib/tasks/node_config.rake") do |rakefile|
30
+ rakefile.squeeze(" ").must_equal(%Q{task :node_config do
31
+ load File.expand_path("../../../config/node_config.rb", __FILE__)
32
+ end}.squeeze(" "))
33
+ end
34
+ end
35
+
36
+ test "should generate loader" do
37
+ run_generator
38
+ assert_file("config/node_config.rb") do |loader|
39
+ loader.must_match(/^require "node_config"/)
40
+ eval(loader)
41
+ Proc.new { PetShop.node_config }.must_raise(Errno::ENOENT)
42
+ end
43
+ end
44
+
45
+ test "should generate initializer" do
46
+ run_generator
47
+ assert_file("config/initializers/node_config.rb") do |initializer|
48
+ Proc.new { eval(initializer) }.must_raise(Errno::ENOENT)
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,22 @@
1
+ require "./test/test_helper"
2
+
3
+ require "node_config"
4
+
5
+ describe NodeConfig do
6
+ describe "#load_config" do
7
+ before do
8
+ @config_path = File.expand_path("../fixtures/node_config.yml", __FILE__)
9
+ end
10
+
11
+ it "should load and parse YAML file with given path" do
12
+ node_config = NodeConfig.load_file(@config_path)
13
+ node_config.must_equal({"foo" => {"bar" => :baz}})
14
+ end
15
+
16
+ it "should create a hash with struct access from loaded data" do
17
+ node_config = NodeConfig.load_file(@config_path)
18
+ node_config.must_be_kind_of(HashWithStructAccess)
19
+ node_config.foo.bar.must_equal(:baz)
20
+ end
21
+ end
22
+ end
@@ -0,0 +1 @@
1
+ require "turn/autorun"
metadata ADDED
@@ -0,0 +1,122 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: node_config
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Kostiantyn Kahanskyi
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-02-25 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: hash_with_struct_access
16
+ requirement: &70327627737620 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: *70327627737620
25
+ - !ruby/object:Gem::Dependency
26
+ name: rails
27
+ requirement: &70327627735420 !ruby/object:Gem::Requirement
28
+ none: false
29
+ requirements:
30
+ - - ! '>='
31
+ - !ruby/object:Gem::Version
32
+ version: 3.2.1
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: *70327627735420
36
+ - !ruby/object:Gem::Dependency
37
+ name: minitest
38
+ requirement: &70327627747880 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ! '>='
42
+ - !ruby/object:Gem::Version
43
+ version: '0'
44
+ type: :development
45
+ prerelease: false
46
+ version_requirements: *70327627747880
47
+ - !ruby/object:Gem::Dependency
48
+ name: rake
49
+ requirement: &70327627745120 !ruby/object:Gem::Requirement
50
+ none: false
51
+ requirements:
52
+ - - ! '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ type: :development
56
+ prerelease: false
57
+ version_requirements: *70327627745120
58
+ - !ruby/object:Gem::Dependency
59
+ name: turn
60
+ requirement: &70327627742600 !ruby/object:Gem::Requirement
61
+ none: false
62
+ requirements:
63
+ - - ! '>='
64
+ - !ruby/object:Gem::Version
65
+ version: '0'
66
+ type: :development
67
+ prerelease: false
68
+ version_requirements: *70327627742600
69
+ description: Simple "node" configuration solution for Rails applications
70
+ email:
71
+ - kostiantyn.kahanskyi@googlemail.com
72
+ executables: []
73
+ extensions: []
74
+ extra_rdoc_files: []
75
+ files:
76
+ - .gitignore
77
+ - .rbenv-version
78
+ - Gemfile
79
+ - README.md
80
+ - Rakefile
81
+ - lib/generators/node_config_generator.rb
82
+ - lib/generators/templates/config/initializers/node_config.rb.erb
83
+ - lib/generators/templates/config/node_config.rb.erb
84
+ - lib/node_config.rb
85
+ - lib/node_config/railtie.rb
86
+ - lib/node_config/version.rb
87
+ - node_config.gemspec
88
+ - test/fixtures/node_config.yml
89
+ - test/node_config_generator_test.rb
90
+ - test/node_config_test.rb
91
+ - test/test_helper.rb
92
+ homepage: https://github.com/kostia/node_config
93
+ licenses: []
94
+ post_install_message:
95
+ rdoc_options: []
96
+ require_paths:
97
+ - lib
98
+ required_ruby_version: !ruby/object:Gem::Requirement
99
+ none: false
100
+ requirements:
101
+ - - ! '>='
102
+ - !ruby/object:Gem::Version
103
+ version: 1.9.2
104
+ required_rubygems_version: !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ! '>='
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
110
+ requirements: []
111
+ rubyforge_project:
112
+ rubygems_version: 1.8.17
113
+ signing_key:
114
+ specification_version: 3
115
+ summary: Simple "node" configuration solution for Rails applications. We need to
116
+ maintain lots of configuration keys specific for a "node", like AWS access keys,
117
+ Google-Analytics keys and much more. This is what this gem tries to simplify.
118
+ test_files:
119
+ - test/fixtures/node_config.yml
120
+ - test/node_config_generator_test.rb
121
+ - test/node_config_test.rb
122
+ - test/test_helper.rb