hood 0.0.0 → 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.
data/HISTORY.md ADDED
@@ -0,0 +1,6 @@
1
+ ## 0.0.1 (11-1-11)
2
+
3
+ * First release
4
+ * Basic support for required variables
5
+ * DSL is complete
6
+ * Barebones Railtie is finished
data/README.md CHANGED
@@ -1,7 +1,7 @@
1
1
  # Hood
2
2
 
3
- *Hood is currently in alpha development. Our feature-set isn't fully developed,
4
- our specs are weak, and there are probably bugs.*
3
+ **Hood is currently in alpha development. Our feature-set isn't fully developed,
4
+ our specs are weak, and there are probably bugs.**
5
5
 
6
6
  Hood is to enviroment variables as bundler is to gems. To put it simply, we have
7
7
  the following goals:
@@ -17,7 +17,11 @@ Hood uses something called an "Envfile" to define environment variables. It uses
17
17
  a DSL (Domain Specific Language) similar to Bundler's to do so:
18
18
 
19
19
  ```ruby
20
- env "GOOGLE_MAPS_API_KEY", required: true
20
+ env "GOOGLE_MAPS_API_KEY"
21
+
22
+ env "REDIS_URI", :default => "localhost:6379"
23
+
24
+ env "SALES_TAX", :description => "Current sales tax in Los Angeles (eg. 0.0875)"
21
25
 
22
26
  prefix "DB_" do
23
27
  env "PASSWORD"
@@ -31,5 +35,19 @@ end
31
35
  ## Options
32
36
  * :description - If the desired value isn't obvious, you can include a string
33
37
  * :optional - Pass true to avoid throwing a runtime error when the app starts and this var isn't present
34
- * :prefix - Prefixes the group (or env I guess) with the passed string. Useful when you have a group where all vars have the same prefix
35
38
  * :default - A pre-defined default value for this var
39
+
40
+ ## Compatibility
41
+
42
+ Hood is tested against the following Rubies: MRI 1.8.7, MRI 1.9.2, MRI 1.9.3,
43
+ Rubinius 2.0, and JRuby.
44
+
45
+ ![Build Status](https://secure.travis-ci.org/bloudermilk/hood.png?branch=master&.png)
46
+
47
+ [Build History](http://travis-ci.org/#!/bloudermilk/hood)
48
+
49
+
50
+ ## License
51
+
52
+ Hood is released under the MIT license. See the LICENSE file for more
53
+ info.
data/lib/hood/dsl.rb CHANGED
@@ -1,8 +1,13 @@
1
1
  module Hood
2
2
  class DSL
3
+ VALID_OPTION_KEYS = [:default, :description, :optional]
4
+
5
+ attr_reader :variables
6
+
3
7
  def self.evaluate(envfile)
4
8
  builder = new
5
- #builder.instance_eval(
9
+ builder.instance_eval(Hood.read_file(envfile.to_s), envfile.to_s, 1)
10
+ builder
6
11
  end
7
12
 
8
13
  def initialize
@@ -11,10 +16,23 @@ module Hood
11
16
  @prefix = ""
12
17
  end
13
18
 
19
+ def exists?(name)
20
+ !!@variables.index {|v| v.name == name }
21
+ end
22
+
14
23
  def env(name, opts={})
15
- _normalize_options(name, opts)
24
+ name, opts = _normalize_options(name, opts)
16
25
 
17
26
  var = Variable.new(name, opts)
27
+
28
+ if exists? var.name
29
+ message = "You tried to define the variable '#{var.name}' twice."
30
+ raise DuplicateVariableError, message
31
+ end
32
+
33
+ @variables << var
34
+
35
+ var
18
36
  end
19
37
 
20
38
  def optional
@@ -24,7 +42,7 @@ module Hood
24
42
  @optional = old
25
43
  end
26
44
 
27
- def prefix(prefix)
45
+ def prefix(prefix, &block)
28
46
  @prefix, old = @prefix + prefix, @prefix
29
47
  yield
30
48
  ensure
@@ -36,10 +54,10 @@ module Hood
36
54
  def _normalize_hash(opts)
37
55
  # Cannot modify a hash during an iteration in 1.9
38
56
  opts.keys.each do |k|
39
- next if String === k
57
+ next if k.is_a? Symbol
40
58
  v = opts[k]
41
59
  opts.delete(k)
42
- opts[k.to_s] = v
60
+ opts[k.to_sym] = v
43
61
  end
44
62
  opts
45
63
  end
@@ -47,17 +65,25 @@ module Hood
47
65
  def _normalize_options(name, opts)
48
66
  _normalize_hash(opts)
49
67
 
50
- invalid_keys = opts.keys - %w(description prefix optional)
68
+ invalid_keys = opts.keys - VALID_OPTION_KEYS
51
69
  if invalid_keys.any?
52
70
  plural = invalid_keys.size > 1
53
- message = "You passed #{invalid_keys.map{|k| ':'+k }.join(", ")} "
71
+ message = "You passed #{invalid_keys.map{|k| ":#{k}" }.join(", ")} "
54
72
  if plural
55
- message << "as options for env '#{name}', but they are invalid."
73
+ message << "as options for variable '#{name}', but they are invalid."
56
74
  else
57
- message << "as an option for env '#{name}', but it is invalid."
75
+ message << "as an option for variable '#{name}', but it is invalid."
58
76
  end
59
- raise InvalidOption, message
77
+ raise InvalidOptionError, message
60
78
  end
79
+
80
+ # The :optional option should default to the builder's state
81
+ opts[:optional] = @optional if opts[:optional].nil?
82
+
83
+ # Prepend the prefix
84
+ name = @prefix + name
85
+
86
+ [name, opts]
61
87
  end
62
88
  end
63
89
  end
@@ -0,0 +1,7 @@
1
+ module Hood
2
+ class Railtie < Rails::Railtie
3
+ config.to_prepare do
4
+ Hood.setup!
5
+ end
6
+ end
7
+ end
data/lib/hood/variable.rb CHANGED
@@ -1,7 +1,29 @@
1
1
  module Hood
2
2
  class Variable
3
+ attr_reader :name, :description, :default
4
+
3
5
  def initialize(name, opts={})
4
- @name = opts[:name]
6
+ @name = name
7
+ @default = opts[:default]
8
+ @description = opts[:description]
9
+ @optional = !!opts[:optional]
10
+ end
11
+
12
+ def optional?
13
+ @optional
14
+ end
15
+
16
+ def fulfill!
17
+ ENV[name] ||= @default
18
+
19
+ unless valid?
20
+ message = "Missing required environment variable '#{name}'"
21
+ raise UnfulfilledVariableError, message
22
+ end
23
+ end
24
+
25
+ def valid?
26
+ !!ENV[name] || optional?
5
27
  end
6
28
  end
7
29
  end
data/lib/hood/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Hood
2
- VERSION = "0.0.0"
2
+ VERSION = "0.0.1"
3
3
  end
data/lib/hood.rb CHANGED
@@ -1,6 +1,32 @@
1
1
  module Hood
2
2
  autoload :DSL, "hood/dsl"
3
- autoload :Variable, "hood/dsl"
3
+ autoload :Variable, "hood/variable"
4
+ autoload :VERSION, "hood/version"
4
5
 
6
+ class HoodError < StandardError ; end
7
+ class DslError < HoodError ; end
8
+ class InvalidOptionError < DslError ; end
9
+ class DuplicateVariableError < DslError ; end
10
+ class UnfulfilledVariableError < HoodError ; end
5
11
 
12
+ class << self
13
+ def read_file(file)
14
+ File.open(file, "rb") { |f| f.read }
15
+ end
16
+
17
+ def setup!
18
+ load_envfile
19
+ fulfull_requirements
20
+ end
21
+
22
+ def load_envfile
23
+ @builder = DSL.evaluate("Envfile")
24
+ end
25
+
26
+ def fulfill_requirements
27
+ @builder.variables.each(&:fulfill!)
28
+ end
29
+ end
6
30
  end
31
+
32
+ require "hood/railtie" if defined?(Rails)
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hood
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.0
4
+ version: 0.0.1
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,9 +9,10 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2011-10-31 00:00:00.000000000Z
12
+ date: 2011-11-01 00:00:00.000000000Z
13
13
  dependencies: []
14
- description: Description has not been written yet.
14
+ description: Hood gives you a standard way to define environment variable requirements
15
+ for your app.
15
16
  email:
16
17
  - brendan@gophilosophie.com
17
18
  executables: []
@@ -19,9 +20,11 @@ extensions: []
19
20
  extra_rdoc_files: []
20
21
  files:
21
22
  - lib/hood/dsl.rb
23
+ - lib/hood/railtie.rb
22
24
  - lib/hood/variable.rb
23
25
  - lib/hood/version.rb
24
26
  - lib/hood.rb
27
+ - HISTORY.md
25
28
  - LICENSE
26
29
  - Rakefile
27
30
  - README.md
@@ -39,7 +42,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
39
42
  version: '0'
40
43
  segments:
41
44
  - 0
42
- hash: 2469481964501867426
45
+ hash: -1841366577289620485
43
46
  required_rubygems_version: !ruby/object:Gem::Requirement
44
47
  none: false
45
48
  requirements:
@@ -48,11 +51,11 @@ required_rubygems_version: !ruby/object:Gem::Requirement
48
51
  version: '0'
49
52
  segments:
50
53
  - 0
51
- hash: 2469481964501867426
54
+ hash: -1841366577289620485
52
55
  requirements: []
53
56
  rubyforge_project:
54
57
  rubygems_version: 1.8.10
55
58
  signing_key:
56
59
  specification_version: 3
57
- summary: Summary has not been written yet
60
+ summary: Hood is the easiest way to manage your applications environment variables.
58
61
  test_files: []