hood 0.0.0 → 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
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: []