ecology 0.0.14 → 0.0.18

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/.gitignore CHANGED
@@ -1 +1,3 @@
1
1
  *.gem
2
+ .yardoc/*
3
+ doc/*
@@ -0,0 +1 @@
1
+ --no-private --protected -- **/*.rb
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- ecology (0.0.12)
4
+ ecology (0.0.17)
5
5
  erubis
6
6
  multi_json
7
7
 
@@ -11,7 +11,7 @@ GEM
11
11
  erubis (2.7.0)
12
12
  minitest (2.3.0)
13
13
  mocha (0.9.12)
14
- multi_json (1.0.3)
14
+ multi_json (1.0.4)
15
15
  rake (0.9.2)
16
16
  scope (0.2.1)
17
17
  minitest
data/README.md CHANGED
@@ -103,9 +103,58 @@ the :as option:
103
103
  Ecology.property("logging:extra_json_fields", :as => Symbol) # error!
104
104
  Ecology.property("logging:file_path", :as => :path) # "/home/theuser/sub/log_to"
105
105
 
106
+ Embedded Ruby
107
+ =============
108
+
109
+ If instead of a .ecology file, you have a .ecology.erb file, it will
110
+ be parsed using Erubis and *then* parsed using JSON. This makes it
111
+ easy to have conditional properties.
112
+
113
+ Using outside Ruby
114
+ ==================
115
+
116
+ Use the with_ecology binary to pre-parse, pre-use Erb and then run
117
+ another binary with the Ecology data put into environment variables.
118
+
119
+ For example, assume you have a my.ecology.erb that looks like:
120
+
121
+ {
122
+ "application": "<%= "bob" %>",
123
+ "property1": {
124
+ "foo": "bar",
125
+ "baz": 7
126
+ }
127
+ }
128
+
129
+ Now run the following:
130
+
131
+ $ with_ecology my.ecology env | grep ECOLOGY
132
+
133
+ You'll see:
134
+
135
+ ECOLOGY_application=bob
136
+ ECOLOGY_application_TYPE=string
137
+ ECOLOGY_property1_foo=bar
138
+ ECOLOGY_property1_foo_TYPE=string
139
+ ECOLOGY_property1_baz=7
140
+ ECOLOGY_property1_baz_TYPE=int
141
+
142
+ This is just a translations of the ecology fields into environment
143
+ variable names. You can usually ignore the types, but (rarely) this
144
+ can be important if you need to know whether the ecology specified a
145
+ number directly or as a string, or to find out whether a field was
146
+ a null or the empty string.
147
+
148
+ This can be useful to pass variables to non-Ruby programs, or any time
149
+ you don't want to have to link with Erubis and a JSON parser. You'll
150
+ need to parse the properties from environment variables yourself,
151
+ though.
152
+
106
153
  Environment-Specific Data
107
154
  =========================
108
155
 
156
+ (Note: this section is mostly obsolete. You can use Erb for this)
157
+
109
158
  Often you'll want to supply a different path, hostname or other
110
159
  configuration variable depending on what environment you're
111
160
  currently deployed to - staging may want a different MemCacheD
@@ -180,14 +229,20 @@ Ecology.read Etiquette
180
229
  ======================
181
230
 
182
231
  If you're writing an application, try to call Ecology.read early.
183
- Libraries depending on it can then initialize themselves, now that
184
- they know where your Ecology data is.
185
-
186
- If you're writing a library, call Ecology.on_initialize early to make
187
- sure you get initialized as soon as possible. You'll probably need
188
- your own Ecology.read call since your containing application may not
189
- use Ecology, or have an Ecology file. Try to make Ecology.read happen
190
- as late as you can - the first time you genuinely need the data, for
232
+ Libraries depending on it can then initialize themselves since they
233
+ know where your Ecology data is.
234
+
235
+ If you're writing a library, call Ecology.read as late as you can. If
236
+ your applications that use your library also use Ecology, maybe you can
237
+ go without using it at all. But if you're calling Ecology.read with
238
+ no filename to make sure data is initialized, do it as late as you can
239
+ possibly get away with it.
240
+
241
+ But in a library, call Ecology.on_initialize early to make sure you
242
+ get initialized as soon as possible. You'll probably need your own
243
+ Ecology.read call since your containing application may not use
244
+ Ecology, or have an Ecology file. Try to make Ecology.read happen as
245
+ late as you can - the first time you genuinely need the data, for
191
246
  instance.
192
247
 
193
248
  For test purposes, if you set a bunch of data with
@@ -195,9 +250,23 @@ Ecology.on_initialize, try to register Ecology.on_reset to clear that
195
250
  same data. Then a test using Ecology.reset can test your library with
196
251
  different settings.
197
252
 
253
+ Ecology and Libraries
254
+ =====================
255
+
256
+ In Rails 3, Ecology.read belongs somewhere like config/application.rb.
257
+ In Rails 2, Ecology.read should probably be in config/environment.rb,
258
+ early on. In Sinatra, you want it in your configure block. In
259
+ general, it should go with configuration information and it should be
260
+ executed as soon as possible.
261
+
198
262
  Testing with an Ecology
199
263
  =======================
200
264
 
265
+ The Ecology library provides a simple hook for setting up an ecology
266
+ for your application. Just require "ecology/test_methods" into your
267
+ test or test_helper, then call set_up_ecology with the text of the
268
+ ecology as the first argument.
269
+
201
270
  In production use, you'll probably never reset the ecology. However,
202
271
  in testing you may frequently want to, especially if you're testing a
203
272
  library that ties closely into the ecology.
@@ -234,7 +303,7 @@ Releasing within Ooyala
234
303
 
235
304
  Ooyalans, to release Ecology to gems.sv2, use the following:
236
305
 
237
- gem build
306
+ rake build
238
307
  rake _0.8.7_ -f ../ooyala_gems.rake gem:push ecology-0.0.1.gem
239
308
 
240
309
  Change the version to the actual version you'd like to push.
data/TODO CHANGED
@@ -1,7 +1,4 @@
1
- * On Ecology.read calls, make sure ecology filename hasn't changed (and warn if it has)
2
-
3
1
  * Have Ecology.read try to do a read relative to the executable's directory first rather than relative to cwd.
4
2
 
5
- * Register properties by top-level tag
6
-
7
- * Allow setting environment variables based on Ecology
3
+ * Allow registration of properties by top-level tag - a particular gem can say "these are the permitted properties
4
+ under this top-level tag".
@@ -0,0 +1,75 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "rubygems"
4
+ require "ecology"
5
+ require "multi_json"
6
+
7
+ if ARGV.size == 0
8
+ $stderr.puts <<USAGE
9
+ Usage: with_ecology [-simple] <ecology-name>.ecology[.erb] <binary> [<args>]
10
+
11
+ Use "-simple" to exclude ECOLOGY_property_LENGTH and _TYPE fields.
12
+ USAGE
13
+ exit -1
14
+ end
15
+
16
+ @exclude_fields = false
17
+
18
+ ARGS = ["-simple"]
19
+
20
+ arg = ARGV.shift
21
+
22
+ while ARGS.include?(arg)
23
+ if arg == "-simple"
24
+ @exclude_fields = true
25
+ arg = ARGV.shift
26
+ end
27
+ end
28
+
29
+ arg = ARGV.shift if arg == "--"
30
+
31
+ Ecology.read(arg)
32
+
33
+ def export_prefix_key_value(prefix, key, value)
34
+ env_var_name = "#{prefix}#{key}"
35
+
36
+ type = case value
37
+ when Fixnum
38
+ "int"
39
+ when String
40
+ "string"
41
+ when Float
42
+ "float"
43
+ when TrueClass
44
+ "bool"
45
+ when FalseClass
46
+ "bool"
47
+ when NilClass
48
+ "null"
49
+ else
50
+ "unknown"
51
+ end
52
+
53
+ ENV[env_var_name] = value.to_s
54
+
55
+ unless @exclude_fields
56
+ ENV[env_var_name + "_TYPE"] = type
57
+ ENV[env_var_name + "_LENGTH"] = value.to_s.length.to_s
58
+ end
59
+ end
60
+
61
+ def export_properties(data, prefix)
62
+ data.each do |key, value|
63
+ if value.is_a?(Hash)
64
+ export_properties(value, "#{prefix}#{key}_")
65
+ elsif value.is_a?(Array)
66
+ export_prefix_key_value prefix, key, MultiJSON.encode(value)
67
+ else
68
+ export_prefix_key_value prefix, key, value
69
+ end
70
+ end
71
+ end
72
+
73
+ export_properties(Ecology.data, "ECOLOGY_")
74
+
75
+ exec ARGV.join(" ")
@@ -24,7 +24,9 @@ EOS
24
24
  dotfiles = Dir[".*"]
25
25
  s.files = Dir["**/*"].reject {|f| File.directory?(f) || ignores.any? {|i| File.fnmatch(i, f) } } + dotfiles
26
26
  s.test_files = s.files.grep(/^test\//)
27
+ s.executables << "with_ecology"
27
28
 
29
+ s.bindir = "bin"
28
30
  s.require_paths = ["lib"]
29
31
 
30
32
  s.add_dependency "multi_json"
@@ -24,32 +24,34 @@ module Ecology
24
24
  @environment = nil
25
25
  @data = nil
26
26
  @ecology_initialized = nil
27
+ @ecology_path = nil
27
28
 
28
29
  publish_event :reset
29
30
  end
30
31
 
31
- def clear_triggers
32
- @triggers = {}
33
- end
34
-
32
+ # This function is called in applications or libraries to initialize the ecology
35
33
  def read(ecology_pathname = nil)
36
- return if @ecology_initialized
34
+ filelist = [ENV["ECOLOGY_SPEC"], ecology_pathname, default_ecology_name]
35
+ ecology_path = filelist.detect { |file_path|
36
+ file_path && (File.exist?(file_path) || File.exist?(file_path + ".erb"))
37
+ }
38
+
39
+ if @ecology_initialized
40
+ if ecology_path != nil && File.expand_path(ecology_path) != File.expand_path(@ecology_path)
41
+ raise "You've tried to load both #{ecology_path.inspect || "nothing"} and " +
42
+ "#{@ecology_path.inspect || "nothing"} as ecology files since last reset!"
43
+ end
44
+ return
45
+ end
37
46
 
38
47
  should_publish_event = false
39
48
 
40
49
  mutex.synchronize do
41
50
  return if @ecology_initialized
42
51
 
43
- filelist = [ENV["ECOLOGY_SPEC"], ecology_pathname, default_ecology_name]
44
- filelist.detect do |file_path|
45
- if file_path && (File.exist?(file_path) || File.exist?(file_path + ".erb"))
46
- @data = {}
47
- contents = merge_with_overrides(file_path)
48
- true
49
- else
50
- false
51
- end
52
- end
52
+ @ecology_path = ecology_path
53
+ @data ||= {}
54
+ merge_with_overrides!(@ecology_path) if @ecology_path
53
55
 
54
56
  @application ||= File.basename($0)
55
57
  @environment ||= ENV['RAILS_ENV'] || ENV['RACK_ENV'] || "development"
@@ -60,10 +62,13 @@ module Ecology
60
62
  end
61
63
 
62
64
  # Do this outside the mutex to reduce the likelihood
63
- # of deadlocks.
65
+ # of deadlocks. This will run all of the on_initialize triggers.
64
66
  publish_event(:initialize) if should_publish_event
67
+ nil
65
68
  end
66
69
 
70
+ # These functions are called to set and remove triggers that are called when
71
+ # the specified event has occurred.
67
72
  def on_initialize(token = nil, &block)
68
73
  on_event(:initialize, token, &block)
69
74
  end
@@ -79,6 +84,10 @@ module Ecology
79
84
  end
80
85
  end
81
86
 
87
+ def clear_triggers
88
+ @triggers = {}
89
+ end
90
+
82
91
  private
83
92
 
84
93
  def on_event(event, token = nil, &block)
@@ -96,6 +105,8 @@ module Ecology
96
105
  end
97
106
  end
98
107
 
108
+ # This function tells Ecology that a certain event (i.e. intialization) has happened.
109
+ # It will then proceed to run all of the triggers that have been set in the application for this event.
99
110
  def publish_event(event)
100
111
  @triggers ||= {}
101
112
 
@@ -108,7 +119,11 @@ module Ecology
108
119
  end
109
120
  end
110
121
 
111
- def merge_with_overrides(file_path)
122
+ # This function populates the @data, @application, and @environment objects,
123
+ # which are populated from the ecology file. It prefers earlier values (top-level first),
124
+ # to values defined in inherited ecologies. This function does not return anything,
125
+ # but modifies @data directly.
126
+ def merge_with_overrides!(file_path)
112
127
  if File.exist?(file_path + ".erb")
113
128
  contents = File.read(file_path + ".erb")
114
129
 
@@ -121,7 +136,7 @@ module Ecology
121
136
  else
122
137
  contents = File.read(file_path)
123
138
  end
124
- file_data = MultiJson.decode(contents);
139
+ file_data = MultiJson.load(contents);
125
140
 
126
141
  return unless file_data
127
142
 
@@ -133,28 +148,29 @@ module Ecology
133
148
  if !@environment && file_data["environment-from"]
134
149
  from = file_data["environment-from"]
135
150
  if from.respond_to?(:map)
136
- @environment ||= from.map {|v| ENV[v]}.compact.first
151
+ @environment ||= from.map {|env_var| ENV[env_var]}.compact.first
137
152
  else
138
- @environment = ENV[from] ? ENV[from].to_s : nil
153
+ @environment ||= ENV[from] ? ENV[from].to_s : nil
139
154
  end
140
155
  end
141
156
 
142
157
  # Next, filter the data by the current environment
143
158
  file_data = environmentize_data(file_data)
144
159
 
145
- # Merge the file data into @data
160
+ # Merge the file data into @data, preferring previous values in @data to new values from the file.
146
161
  @data = deep_merge(@data, file_data)
147
162
 
148
- # Finally, process any inheritance/overrides
163
+ # Finally, process any inheritance, without overriding already set values.
149
164
  if file_data["uses"]
150
165
  if file_data["uses"].respond_to?(:map)
151
- file_data["uses"].map { |file| merge_with_overrides(file) }
166
+ file_data["uses"].map { |file| merge_with_overrides!(file) }
152
167
  else
153
- merge_with_overrides(file_data["uses"])
168
+ merge_with_overrides!(file_data["uses"])
154
169
  end
155
170
  end
156
171
  end
157
172
 
173
+ # Merge two hashes, resolving conflicts by picking the value from the first.
158
174
  def deep_merge(hash1, hash2)
159
175
  all_keys = hash1.keys | hash2.keys
160
176
  ret = {}
@@ -176,32 +192,35 @@ module Ecology
176
192
  ret
177
193
  end
178
194
 
179
- def environmentize_data(data_in)
180
- if data_in.is_a?(Array)
181
- data_in.map { |subdata| environmentize_data(subdata) }
182
- elsif data_in.is_a?(Hash)
183
- if data_in.keys.any? { |k| k =~ /^env:/ }
184
- value = data_in["env:#{@environment}"] || data_in["env:*"]
195
+ # This function crawls through input_data, and chooses values for environment-based keys.
196
+ def environmentize_data(input_data)
197
+ if input_data.is_a?(Array)
198
+ input_data.map { |subdata| environmentize_data(subdata) }
199
+ elsif input_data.is_a?(Hash)
200
+ if input_data.keys.any? { |k| k =~ /^env:/ }
201
+ value = input_data["env:#{@environment}"] || input_data["env:*"]
185
202
  return nil unless value
186
203
  environmentize_data(value)
187
204
  else
188
- data_out = {}
189
- data_in.each { |k, v| data_out[k] = environmentize_data(v) }
190
- data_out
205
+ output_data = {}
206
+ input_data.each { |k, v| output_data[k] = environmentize_data(v) }
207
+ output_data
191
208
  end
192
209
  else
193
- data_in
210
+ input_data
194
211
  end
195
212
  end
196
213
 
197
214
  public
198
215
 
216
+ # Returns the value of a specified property, with nestings denoted with colons.
217
+ # This can be requested with :as => <type> as an option.
199
218
  def property(param, options = {})
200
219
  components = param.split(":").compact.select {|s| s != ""}
201
220
 
202
- value = components.inject(@data) do |data, component|
203
- if data
204
- data[component]
221
+ value = components.inject(@data) do |data_hash, component|
222
+ if data_hash
223
+ data_hash[component]
205
224
  else
206
225
  nil
207
226
  end
@@ -224,12 +243,12 @@ module Ecology
224
243
  elsif [:json].include?(options[:as])
225
244
  raise "JSON return type not yet supported!"
226
245
  else
227
- raise "Unknown type #{options[:as].inspect} passed to Ecology.data(:as) for property #{property}!"
246
+ raise "Unknown type #{options[:as].inspect} passed to Ecology.property(:as) for property #{param}!"
228
247
  end
229
248
  end
230
249
 
231
250
  return value if options[:as] == Hash
232
- raise "Couldn't convert JSON fields to #{options[:as].inspect} for property #{property}!"
251
+ raise "Couldn't convert JSON fields to #{options[:as].inspect} for property #{param}!"
233
252
  end
234
253
 
235
254
  PATH_SUBSTITUTIONS = {
@@ -0,0 +1,20 @@
1
+ module Ecology
2
+ module Test
3
+ def set_up_ecology(file_contents, filename = "some.ecology", options = {})
4
+ match = filename.match(/^(.*)\.erb$/)
5
+ if match
6
+ ENV["ECOLOGY_SPEC"] = match[1]
7
+ File.stubs(:exist?).with(match[1]).returns(false)
8
+ else
9
+ ENV["ECOLOGY_SPEC"] = filename
10
+ end
11
+
12
+ File.stubs(:exist?).with(filename + ".erb").returns(false)
13
+ File.stubs(:exist?).with(filename).returns(true)
14
+
15
+ unless options[:no_read]
16
+ File.expects(:read).with(filename).returns(file_contents).at_least_once
17
+ end
18
+ end
19
+ end
20
+ end
@@ -1,3 +1,3 @@
1
1
  module Ecology
2
- VERSION = "0.0.14"
2
+ VERSION = "0.0.18"
3
3
  end
@@ -1,3 +1,3 @@
1
1
  module Ecology
2
- VERSION = "0.0.13"
2
+ VERSION = "0.0.17"
3
3
  end
@@ -39,5 +39,52 @@ class EcologyTest < Scope::TestCase
39
39
 
40
40
  assert_equal "whatever_app.rb", Ecology.application
41
41
  end
42
+
43
+ should "prevent repeat Ecology.read with different ecology files" do
44
+ set_up_ecology <<JSON
45
+ {
46
+ "application": "bob"
47
+ }
48
+ JSON
49
+ Ecology.read
50
+ set_up_ecology(<<JSON, "other.ecology", :no_read => true)
51
+ {
52
+ "application": "sam"
53
+ }
54
+ JSON
55
+ assert_raises(RuntimeError) do
56
+ Ecology.read
57
+ end
58
+ end
59
+
60
+ should "allow repeat Ecology.read with same ecology files" do
61
+ set_up_ecology(<<JSON, "same.ecology")
62
+ {
63
+ "application": "bob"
64
+ }
65
+ JSON
66
+ Ecology.read
67
+ set_up_ecology(<<JSON, "same.ecology", :no_read => true)
68
+ {
69
+ "application": "sam"
70
+ }
71
+ JSON
72
+ Ecology.read # should not raise
73
+ end
74
+
75
+ should "allow repeat Ecology.read with different paths to the same ecology files" do
76
+ set_up_ecology(<<JSON, "same.ecology")
77
+ {
78
+ "application": "bob"
79
+ }
80
+ JSON
81
+ Ecology.read
82
+ set_up_ecology(<<JSON, "./same.ecology", :no_read => true)
83
+ {
84
+ "application": "sam"
85
+ }
86
+ JSON
87
+ Ecology.read # should not raise
88
+ end
42
89
  end
43
90
  end
@@ -7,20 +7,8 @@ require "minitest/autorun"
7
7
  $LOAD_PATH.unshift File.join(File.dirname(__FILE__), "..", "lib")
8
8
 
9
9
  require "ecology"
10
+ require "ecology/test_methods"
10
11
 
11
12
  class Scope::TestCase
12
- def set_up_ecology(file_contents, filename = "some.ecology")
13
- match = filename.match(/^(.*)\.erb$/)
14
- if match
15
- ENV["ECOLOGY_SPEC"] = match[1]
16
- File.stubs(:exist?).with(match[1]).returns(false)
17
- else
18
- ENV["ECOLOGY_SPEC"] = filename
19
- end
20
-
21
- File.stubs(:exist?).with(filename + ".erb").returns(false)
22
- File.stubs(:exist?).with(filename).returns(true)
23
- File.expects(:read).with(filename).returns(file_contents).at_least_once
24
- end
25
-
13
+ include Ecology::Test
26
14
  end
metadata CHANGED
@@ -1,102 +1,133 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: ecology
3
- version: !ruby/object:Gem::Version
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.18
4
5
  prerelease:
5
- version: 0.0.14
6
6
  platform: ruby
7
- authors:
7
+ authors:
8
8
  - Noah Gibbs
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
-
13
- date: 2011-10-19 00:00:00 Z
14
- dependencies:
15
- - !ruby/object:Gem::Dependency
12
+ date: 2012-06-27 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
16
15
  name: multi_json
17
- prerelease: false
18
- requirement: &id001 !ruby/object:Gem::Requirement
16
+ requirement: !ruby/object:Gem::Requirement
19
17
  none: false
20
- requirements:
21
- - - ">="
22
- - !ruby/object:Gem::Version
23
- version: "0"
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
24
22
  type: :runtime
25
- version_requirements: *id001
26
- - !ruby/object:Gem::Dependency
27
- name: erubis
28
23
  prerelease: false
29
- requirement: &id002 !ruby/object:Gem::Requirement
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
30
+ - !ruby/object:Gem::Dependency
31
+ name: erubis
32
+ requirement: !ruby/object:Gem::Requirement
30
33
  none: false
31
- requirements:
32
- - - ">="
33
- - !ruby/object:Gem::Version
34
- version: "0"
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
35
38
  type: :runtime
36
- version_requirements: *id002
37
- - !ruby/object:Gem::Dependency
38
- name: bundler
39
39
  prerelease: false
40
- requirement: &id003 !ruby/object:Gem::Requirement
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
46
+ - !ruby/object:Gem::Dependency
47
+ name: bundler
48
+ requirement: !ruby/object:Gem::Requirement
41
49
  none: false
42
- requirements:
50
+ requirements:
43
51
  - - ~>
44
- - !ruby/object:Gem::Version
52
+ - !ruby/object:Gem::Version
45
53
  version: 1.0.10
46
54
  type: :development
47
- version_requirements: *id003
48
- - !ruby/object:Gem::Dependency
49
- name: scope
50
55
  prerelease: false
51
- requirement: &id004 !ruby/object:Gem::Requirement
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ~>
60
+ - !ruby/object:Gem::Version
61
+ version: 1.0.10
62
+ - !ruby/object:Gem::Dependency
63
+ name: scope
64
+ requirement: !ruby/object:Gem::Requirement
52
65
  none: false
53
- requirements:
66
+ requirements:
54
67
  - - ~>
55
- - !ruby/object:Gem::Version
68
+ - !ruby/object:Gem::Version
56
69
  version: 0.2.1
57
70
  type: :development
58
- version_requirements: *id004
59
- - !ruby/object:Gem::Dependency
60
- name: mocha
61
71
  prerelease: false
62
- requirement: &id005 !ruby/object:Gem::Requirement
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ~>
76
+ - !ruby/object:Gem::Version
77
+ version: 0.2.1
78
+ - !ruby/object:Gem::Dependency
79
+ name: mocha
80
+ requirement: !ruby/object:Gem::Requirement
63
81
  none: false
64
- requirements:
65
- - - ">="
66
- - !ruby/object:Gem::Version
67
- version: "0"
82
+ requirements:
83
+ - - ! '>='
84
+ - !ruby/object:Gem::Version
85
+ version: '0'
68
86
  type: :development
69
- version_requirements: *id005
70
- - !ruby/object:Gem::Dependency
71
- name: rake
72
87
  prerelease: false
73
- requirement: &id006 !ruby/object:Gem::Requirement
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ! '>='
92
+ - !ruby/object:Gem::Version
93
+ version: '0'
94
+ - !ruby/object:Gem::Dependency
95
+ name: rake
96
+ requirement: !ruby/object:Gem::Requirement
74
97
  none: false
75
- requirements:
76
- - - ">="
77
- - !ruby/object:Gem::Version
78
- version: "0"
98
+ requirements:
99
+ - - ! '>='
100
+ - !ruby/object:Gem::Version
101
+ version: '0'
79
102
  type: :development
80
- version_requirements: *id006
81
- description: |
82
- Ecology sets configuration data for an application based
103
+ prerelease: false
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ! '>='
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
110
+ description: ! 'Ecology sets configuration data for an application based
111
+
83
112
  on environment variables and other factors. It is meant
113
+
84
114
  to unify configuration data for logging, testing, monitoring
115
+
85
116
  and deployment.
86
117
 
87
- email:
118
+ '
119
+ email:
88
120
  - noah@ooyala.com
89
- executables: []
90
-
121
+ executables:
122
+ - with_ecology
91
123
  extensions: []
92
-
93
124
  extra_rdoc_files: []
94
-
95
- files:
125
+ files:
126
+ - bin/with_ecology
96
127
  - ecology.gemspec
97
- - ecology.gemspec~
98
128
  - Gemfile
99
129
  - Gemfile.lock
130
+ - lib/ecology/test_methods.rb
100
131
  - lib/ecology/version.rb
101
132
  - lib/ecology/version.rb~
102
133
  - lib/ecology.rb
@@ -114,34 +145,32 @@ files:
114
145
  - test/trigger_test.rb
115
146
  - TODO
116
147
  - .gitignore
148
+ - .yardopts
117
149
  homepage: http://www.ooyala.com
118
150
  licenses: []
119
-
120
151
  post_install_message:
121
152
  rdoc_options: []
122
-
123
- require_paths:
153
+ require_paths:
124
154
  - lib
125
- required_ruby_version: !ruby/object:Gem::Requirement
155
+ required_ruby_version: !ruby/object:Gem::Requirement
126
156
  none: false
127
- requirements:
128
- - - ">="
129
- - !ruby/object:Gem::Version
130
- version: "0"
131
- required_rubygems_version: !ruby/object:Gem::Requirement
157
+ requirements:
158
+ - - ! '>='
159
+ - !ruby/object:Gem::Version
160
+ version: '0'
161
+ required_rubygems_version: !ruby/object:Gem::Requirement
132
162
  none: false
133
- requirements:
134
- - - ">="
135
- - !ruby/object:Gem::Version
136
- version: "0"
163
+ requirements:
164
+ - - ! '>='
165
+ - !ruby/object:Gem::Version
166
+ version: '0'
137
167
  requirements: []
138
-
139
168
  rubyforge_project: ecology
140
- rubygems_version: 1.8.10
169
+ rubygems_version: 1.8.24
141
170
  signing_key:
142
171
  specification_version: 3
143
172
  summary: Ruby config variable management
144
- test_files:
173
+ test_files:
145
174
  - test/ecology_test.rb
146
175
  - test/environment_test.rb
147
176
  - test/environment_var_test.rb
@@ -151,3 +180,4 @@ test_files:
151
180
  - test/property_test.rb
152
181
  - test/test_helper.rb
153
182
  - test/trigger_test.rb
183
+ has_rdoc:
@@ -1,36 +0,0 @@
1
- # -*- encoding: utf-8 -*-
2
- $:.push File.expand_path("../lib", __FILE__)
3
-
4
- require "ecology/version"
5
-
6
- Gem::Specification.new do |s|
7
- s.name = "ecology"
8
- s.version = Ecology::VERSION
9
- s.platform = Gem::Platform::RUBY
10
- s.authors = ["Noah Gibbs"]
11
- s.email = ["noah@ooyala.com"]
12
- s.homepage = "http://www.ooyala.com"
13
- s.summary = %q{Ruby config variable management}
14
- s.description = <<EOS
15
- Ecology sets configuration data for an application based
16
- on environment variables and other factors. It is meant
17
- to unify configuration data for logging, testing, monitoring
18
- and deployment.
19
- EOS
20
-
21
- s.rubyforge_project = "ecology"
22
-
23
- ignores = File.readlines(".gitignore").grep(/\S+/).map {|pattern| pattern.chomp }
24
- dotfiles = [".gemtest", ".gitignore", ".rspec", ".yardopts"]
25
- s.files = Dir["**/*"].reject {|f| File.directory?(f) || ignores.any? {|i| File.fnmatch(i, f) } } + dotfiles
26
- s.test_files = s.files.grep(/^spec\//)
27
-
28
- s.require_paths = ["lib"]
29
-
30
- s.add_dependency "multi_json"
31
-
32
- s.add_development_dependency "bundler", "~> 1.0.10"
33
- s.add_development_dependency "scope", "~> 0.2.1"
34
- s.add_development_dependency "mocha"
35
- s.add_development_dependency "rake"
36
- end