node_config 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -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