noah 0.0.5

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,121 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
+
3
+ describe "Using the Service API", :reset_redis => false, :populate_sample_data => true do
4
+ before(:all) do
5
+ @sample_host = {:name => 'rspec_sample_host', :status => 'up'}
6
+ @sample_service = {:name => 'rspec_sample_service', :status => 'up'}
7
+ @h = Host.create(:name => 'rspec_sample_host', :status => 'up')
8
+ @h.services << Service.create({:host => @h}.merge(@sample_service))
9
+ @h.save
10
+ @s = Service.find(@sample_service).first
11
+ end
12
+ describe "calling" do
13
+
14
+ describe "GET" do
15
+ it "all services should work" do
16
+ get '/s'
17
+ last_response.should be_ok
18
+ response = last_response.should return_json
19
+ response.is_a?(Array).should == true
20
+ end
21
+ it "all named services should work" do
22
+ get "/s/#{@sample_service[:name]}"
23
+ last_response.should be_ok
24
+ response = last_response.should return_json
25
+ response.is_a?(Array).should == true
26
+ s = response.first
27
+ s["id"].should == @s.id
28
+ s["name"].should == @s.name
29
+ s["status"].should == @s.status
30
+ s["host"].should == @h.name
31
+ end
32
+ it "named service for host should work" do
33
+ get "/s/#{@sample_service[:name]}/#{@sample_host[:name]}"
34
+ last_response.should be_ok
35
+ response = last_response.should return_json
36
+ response["id"].should == @s.id
37
+ response["name"].should == @s.name
38
+ response["status"].should == @s.status
39
+ response["host"].should == @h.name
40
+ end
41
+ it "missing service for host should not work" do
42
+ get '/s/foobar/baz'
43
+ last_response.should be_missing
44
+ end
45
+ end
46
+
47
+ describe "PUT" do
48
+ before(:all) do
49
+ @payload = {:name => 'another_rspec_service', :status => 'up', :host => @h.name}
50
+ end
51
+ it "new service should work" do
52
+ put "/s/#{@payload[:name]}/", @payload.to_json, "CONTENT_TYPE" => "application/json"
53
+ last_response.should be_ok
54
+ response = last_response.should return_json
55
+ response["result"].should == "success"
56
+ response["action"].should == "create"
57
+ response["id"].nil?.should == false
58
+ response["name"].should == @payload[:name]
59
+ response["host"].should == @payload[:host]
60
+ Service.find(:name => @payload[:name]).size.should == 1
61
+ Service.find(:name => @payload[:name]).first.is_new?.should == true
62
+ end
63
+ it "new service without host should not work" do
64
+ put "/s/foobar", {:name => "foobar", :status => "up"}.to_json, "CONTENT_TYPE" => "application/json"
65
+ last_response.should be_invalid
66
+ end
67
+ it "new service with invalid status should not work" do
68
+ put "/s/foobar", {:name => "foobar", :status => "fsck", :host => @h.name}.to_json, "CONTENT_TYPE" => "application/json"
69
+ last_response.should_not be_ok
70
+ response = last_response.should return_json
71
+ response["error_message"].should == "[[:status, :not_member]]"
72
+ end
73
+ it "new service with missing name should not work" do
74
+ put "/s/foobar", {:status => "fsck", :host => @h.name}.to_json, "CONTENT_TYPE" => "application/json"
75
+ last_response.should be_invalid
76
+ end
77
+ it "new service with missing status should not work" do
78
+ put "/s/foobar", {:name => "foobar", :host => @h.name}.to_json, "CONTENT_TYPE" => "application/json"
79
+ last_response.should be_invalid
80
+ end
81
+ it "existing service should work" do
82
+ sleep 3
83
+ put "/s/#{@payload[:name]}", {:name => @payload[:name], :status => "down", :host => @payload[:host]}.to_json, "CONTENT_TYPE" => "application/json"
84
+ last_response.should be_ok
85
+ response = last_response.should return_json
86
+ response["result"].should == "success"
87
+ response["action"].should == "update"
88
+ response["id"].nil?.should == false
89
+ response["name"].should == @payload[:name]
90
+ response["host"].should == @payload[:host]
91
+ Service.find(:name => @payload[:name]).size.should == 1
92
+ Service.find(:name => @payload[:name]).first.is_new?.should == false
93
+ end
94
+ end
95
+
96
+ describe "DELETE" do
97
+ before(:all) do
98
+ @h = Host.create(:name => "h1", :status => "up")
99
+ @h.services << Service.create(:name => "s1", :status => "up", :host => @h)
100
+ @h.save
101
+ @s = @h.services.first
102
+ end
103
+ it "existing host should work" do
104
+ delete "/s/#{@s.name}/#{@h.name}"
105
+ last_response.should be_ok
106
+ response = last_response.should return_json
107
+
108
+ response["result"].should == "success"
109
+ response["action"].should == "delete"
110
+ response["id"].should == @s.id
111
+ response["host"].should == @h.name
112
+ response["service"].should == @s.name
113
+ end
114
+ it "invalid host should not work" do
115
+ delete "/s/#{@s.name}/#{@h.name}"
116
+ last_response.should be_missing
117
+ end
118
+ end
119
+
120
+ end
121
+ end
@@ -0,0 +1,20 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
+
3
+ describe "Noah App Basics", :reset_redis => true do
4
+
5
+ it "should show the index page" do
6
+ get '/'
7
+ last_response.should be_ok
8
+ last_response.body.include?("Noah Start Page").should == true
9
+ end
10
+
11
+ it "should test the 404 message" do
12
+ get '/foo'
13
+ last_response.status.should == 404
14
+ last_response.headers["Content-Type"].should == "application/json"
15
+ response = JSON.parse(last_response.body)
16
+ response["result"].should == "failure"
17
+ response["error_message"].should == "Resource not found"
18
+ end
19
+
20
+ end
@@ -0,0 +1,112 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
+
3
+ describe "Noah Service Model", :reset_redis => true do
4
+ describe "should" do
5
+
6
+ it "create a new Service" do
7
+ servicename = "myservice"
8
+ servicestatus = "up"
9
+ hostname = "mytesthost1"
10
+ hoststatus = "up"
11
+ host = Host.create(:name => hostname, :status => hoststatus)
12
+ host.save
13
+ service = Service.create(:name => servicename, :status => servicestatus, :host => host)
14
+ service.valid?.should == true
15
+ service.save
16
+ service.name.should == servicename
17
+ service.status.should == servicestatus
18
+ service.host_id.should == host.id
19
+ host.services[1].name.should == servicename
20
+ end
21
+
22
+ it "create a new Service with find_or_create" do
23
+ host = Host.create(:name => "h1", :status => "up")
24
+ host.save
25
+ service = Service.find_or_create(:name => "s1", :status => "up", :host => host)
26
+ service.save
27
+ service.is_new?.should == true
28
+ end
29
+
30
+ it "update an existing Service with find_or_create" do
31
+ host = Host.create(:name => "h2", :status => "up")
32
+ host.save
33
+ service = Service.find_or_create(:name => "s2", :status => "up", :host => host)
34
+ service.save
35
+ sleep 1
36
+ service2 = Service.find_or_create(:name => "s2", :status => "up", :host => host)
37
+ service2.save
38
+ service2.is_new?.should == false
39
+ end
40
+
41
+ it "delete a Service" do
42
+ h = Host.create(:name => "h1", :status => "up")
43
+ h.save
44
+ s = Service.create(:name => "s1", :status => "up", :host => h)
45
+ s.save
46
+ s = Service.find(:name => "s1").first
47
+ s.delete
48
+ s = Service.find(:name => "s1").first
49
+ s.should == nil
50
+ end
51
+
52
+ it "find multiple Services" do
53
+ h = Host.create(:name => "h1", :status => "up")
54
+ if h.valid?
55
+ h.services << Service.create(:name => "s1", :status => "up", :host => h)
56
+ h.services << Service.create(:name => "s2", :status => "up", :host => h)
57
+ h.save
58
+ end
59
+ Services.all.size.should == 2
60
+ Services.all.first.name.should == "s1"
61
+ Services.all.last.name.should == "s2"
62
+ end
63
+
64
+ end
65
+
66
+ describe "should not" do
67
+
68
+ it "create a new Service when missing a Host" do
69
+ servicename = "myservice1"
70
+ servicestatus = "up"
71
+ service = Service.create(:name => servicename, :status => servicestatus)
72
+ service.valid?.should == false
73
+ service.errors.should == [[:host_id, :not_present]]
74
+ end
75
+
76
+ it "create a new Service when missing a name" do
77
+ host = Host.create(:name => "host1.domain.com", :status => "up")
78
+ host.save
79
+ service = Service.create(:status => "up", :host => host)
80
+ service.valid?.should == false
81
+ service.errors.should == [[:name, :not_present]]
82
+ end
83
+
84
+ it "create a new Service when missing a status" do
85
+ host = Host.create(:name => "host1.domain.com", :status => "up")
86
+ host.save
87
+ service = Service.create(:name => 'foo', :host => host)
88
+ service.valid?.should == false
89
+ service.errors.should == [[:status, :not_present], [:status, :not_member]]
90
+ end
91
+
92
+ it "create a new Service with an invalid status" do
93
+ host = Host.create(:name => "host1.domain.com", :status => "up")
94
+ host.save
95
+ service = Service.create(:name => "myservice", :status => "invalid_status", :host => host)
96
+ service.valid?.should == false
97
+ service.errors.should == [[:status, :not_member]]
98
+ end
99
+
100
+ it "create a duplicate Service" do
101
+ host = Host.create(:name => "host1.domain.com", :status => "up")
102
+ host.save
103
+ s = Service.create(:name => "myservice", :status => "up", :host => host)
104
+ s.save
105
+ s1 = Service.create(:name => "myservice", :status => "up", :host => host)
106
+ s1.valid?.should == false
107
+ s1.errors.should == [[[:name, :host_id], :not_unique]]
108
+ end
109
+
110
+ end
111
+
112
+ end
@@ -0,0 +1,105 @@
1
+ require 'bundler/setup'
2
+ require 'ohm'
3
+ begin
4
+ require 'yajl'
5
+ rescue LoadError
6
+ require 'json'
7
+ end
8
+
9
+ ENV['RACK_ENV'] = 'test'
10
+ ENV['REDIS_URL'] = 'redis://localhost:6379/3'
11
+ Ohm::connect
12
+
13
+ require File.join(File.dirname(__FILE__), '..', 'lib', 'noah')
14
+ require File.join(File.dirname(__FILE__), '..', 'lib', 'noah', 'app')
15
+ require 'rspec'
16
+ require 'rack/test'
17
+
18
+ RSpec.configure do |config|
19
+ config.color_enabled = true
20
+ config.formatter = "documentation"
21
+ config.before(:each, :reset_redis => true) { Ohm::redis.flushdb }
22
+ config.after(:each, :reset_redis => true) {Ohm::redis.flushdb }
23
+ config.after(:all, :populate_sample_data => true) {Ohm::redis.flushdb }
24
+ config.before(:all, :populate_sample_data => true) do
25
+ Ohm::redis.flushdb
26
+ h = Host.create(:name => 'localhost', :status => "up")
27
+ if h.save
28
+ %w[redis noah].each do |service|
29
+ s = Service.create(:name => service, :status => "up", :host => h)
30
+ h.services << s
31
+ end
32
+ end
33
+
34
+ a = Application.create(:name => 'noah')
35
+ if a.save
36
+ cr = Configuration.create(:name => 'redis', :format => 'string', :body => 'redis://127.0.0.1:6379/0', :application => a)
37
+ ch = Configuration.create(:name => 'host', :format => 'string', :body => 'localhost', :application => a)
38
+ cp = Configuration.create(:name => 'port', :format => 'string', :body => '9292', :application => a)
39
+ %w[cr ch cp].each do |c|
40
+ a.configurations << eval(c)
41
+ end
42
+ end
43
+
44
+ my_yaml = <<EOY
45
+ development:
46
+ database: development_database
47
+ adapter: mysql
48
+ username: dev_user
49
+ password: dev_password
50
+ EOY
51
+ my_json = <<EOJ
52
+ {
53
+ "id":"hostname",
54
+ "data":"localhost"
55
+ }
56
+ EOJ
57
+
58
+ a1 = Application.create(:name => 'myrailsapp1')
59
+ if a1.save
60
+ c1 = Configuration.create(:name => 'database.yml', :format => 'yaml', :body => my_yaml, :application => a1)
61
+ a1.configurations << c1
62
+ end
63
+
64
+ a2 = Application.create(:name => 'myrestapp1')
65
+ if a2.save
66
+ c2 = Configuration.create(:name => 'config.json', :format => 'json', :body => my_json, :application => a2)
67
+ a2.configurations << c2
68
+ end
69
+ end
70
+ config.include Rack::Test::Methods
71
+ end
72
+
73
+ def app
74
+ Noah::App
75
+ end
76
+
77
+ RSpec::Matchers.define :return_json do
78
+ match do |last_response|
79
+ last_response.headers["Content-Type"].should == "application/json"
80
+ response = JSON.parse(last_response.body)
81
+ end
82
+
83
+ failure_message_for_should do
84
+ "Response was not valid JSON"
85
+ end
86
+ end
87
+
88
+ RSpec::Matchers.define :be_missing do
89
+ match do |last_response|
90
+ last_response.headers["Content-Type"].should == "application/json"
91
+ last_response.status.should == 404
92
+ response = JSON.parse(last_response.body)
93
+ response["result"].should == "failure"
94
+ response["error_message"].should == "Resource not found"
95
+ end
96
+ end
97
+
98
+ RSpec::Matchers.define :be_invalid do
99
+ match do |last_response|
100
+ last_response.headers["Content-Type"].should == "application/json"
101
+ response = JSON.parse(last_response.body)
102
+ response["result"].should == "failure"
103
+ response["error_message"].should == "Missing Parameters"
104
+ end
105
+ end
@@ -0,0 +1 @@
1
+ <%= {:status => "success"}.merge(api_call_results).to_json %>
@@ -0,0 +1 @@
1
+ {"result":"failure","error_message":"Resource not found"}
@@ -0,0 +1 @@
1
+ {"result":"failure","error_message":"<%= request.env['sinatra.error'].message %>"}
@@ -0,0 +1,49 @@
1
+ %html
2
+ %head
3
+ %title Noah Start Page
4
+
5
+ #header
6
+ %h1 Sample links
7
+ #header
8
+ %h2 Hosts
9
+ %ul
10
+ %li
11
+ %a{:href => "/h/"} All registered Hosts
12
+ %li
13
+ %a{:href => "/h/localhost"} localhost (this server)
14
+ %li
15
+ %a{:href => "/h/localhost/noah"} localhost noah service
16
+ #header
17
+ %h2 Services
18
+ %ul
19
+ %li
20
+ %a{:href => "/s/"} All registered Services
21
+ %li
22
+ %a{:href => "/s/http"} All hosts providing 'http'
23
+ %li
24
+ %a{:href => "/s/noah/localhost"} localhost noah service
25
+ #header
26
+ %h2 Applications
27
+ %ul
28
+ %li
29
+ %a{:href => "/a/"} All registered Applications
30
+ %li
31
+ %a{:href => "/a/noah"} Noah Application entry
32
+ %li
33
+ %a{:href => "/a/noah/redis"} Noah Redis configuration entry
34
+ #header
35
+ %h2 Configurations
36
+ %ul
37
+ %li
38
+ %a{:href => "/c/"} All registered Configurations
39
+ %li
40
+ %a{:href => "/c/noah"} Noah Configuration entry
41
+ %li
42
+ %a{:href => "/c/myrailsapp1"} myrailsapp1 Configuration entry
43
+ %li
44
+ %a{:href => "/c/myrestapp1"} myrestapp1 Configuration entry
45
+ %li
46
+ %a{:href => "/c/myrailsapp1/database.yml"} database.yml file for myrailsapp1 (should return the proper content-type)
47
+ %li
48
+ %a{:href => "/c/myrestapp1/config.json"} config.json file for myrestapp1
49
+
metadata ADDED
@@ -0,0 +1,348 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: noah
3
+ version: !ruby/object:Gem::Version
4
+ prerelease: false
5
+ segments:
6
+ - 0
7
+ - 0
8
+ - 5
9
+ version: 0.0.5
10
+ platform: ruby
11
+ authors:
12
+ - lusis
13
+ autorequire:
14
+ bindir: bin
15
+ cert_chain: []
16
+
17
+ date: 2011-02-07 00:00:00 -05:00
18
+ default_executable:
19
+ dependencies:
20
+ - !ruby/object:Gem::Dependency
21
+ name: rake
22
+ requirement: &id001 !ruby/object:Gem::Requirement
23
+ none: false
24
+ requirements:
25
+ - - "="
26
+ - !ruby/object:Gem::Version
27
+ segments:
28
+ - 0
29
+ - 8
30
+ - 7
31
+ version: 0.8.7
32
+ type: :runtime
33
+ prerelease: false
34
+ version_requirements: *id001
35
+ - !ruby/object:Gem::Dependency
36
+ name: sinatra
37
+ requirement: &id002 !ruby/object:Gem::Requirement
38
+ none: false
39
+ requirements:
40
+ - - "="
41
+ - !ruby/object:Gem::Version
42
+ segments:
43
+ - 1
44
+ - 1
45
+ - 2
46
+ version: 1.1.2
47
+ type: :runtime
48
+ prerelease: false
49
+ version_requirements: *id002
50
+ - !ruby/object:Gem::Dependency
51
+ name: sinatra-namespace
52
+ requirement: &id003 !ruby/object:Gem::Requirement
53
+ none: false
54
+ requirements:
55
+ - - "="
56
+ - !ruby/object:Gem::Version
57
+ segments:
58
+ - 0
59
+ - 6
60
+ - 1
61
+ version: 0.6.1
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: *id003
65
+ - !ruby/object:Gem::Dependency
66
+ name: ohm
67
+ requirement: &id004 !ruby/object:Gem::Requirement
68
+ none: false
69
+ requirements:
70
+ - - "="
71
+ - !ruby/object:Gem::Version
72
+ segments:
73
+ - 0
74
+ - 1
75
+ - 3
76
+ version: 0.1.3
77
+ type: :runtime
78
+ prerelease: false
79
+ version_requirements: *id004
80
+ - !ruby/object:Gem::Dependency
81
+ name: ohm-contrib
82
+ requirement: &id005 !ruby/object:Gem::Requirement
83
+ none: false
84
+ requirements:
85
+ - - "="
86
+ - !ruby/object:Gem::Version
87
+ segments:
88
+ - 0
89
+ - 1
90
+ - 0
91
+ version: 0.1.0
92
+ type: :runtime
93
+ prerelease: false
94
+ version_requirements: *id005
95
+ - !ruby/object:Gem::Dependency
96
+ name: haml
97
+ requirement: &id006 !ruby/object:Gem::Requirement
98
+ none: false
99
+ requirements:
100
+ - - "="
101
+ - !ruby/object:Gem::Version
102
+ segments:
103
+ - 3
104
+ - 0
105
+ - 25
106
+ version: 3.0.25
107
+ type: :runtime
108
+ prerelease: false
109
+ version_requirements: *id006
110
+ - !ruby/object:Gem::Dependency
111
+ name: vegas
112
+ requirement: &id007 !ruby/object:Gem::Requirement
113
+ none: false
114
+ requirements:
115
+ - - "="
116
+ - !ruby/object:Gem::Version
117
+ segments:
118
+ - 0
119
+ - 1
120
+ - 8
121
+ version: 0.1.8
122
+ type: :runtime
123
+ prerelease: false
124
+ version_requirements: *id007
125
+ - !ruby/object:Gem::Dependency
126
+ name: yajl-ruby
127
+ requirement: &id008 !ruby/object:Gem::Requirement
128
+ none: false
129
+ requirements:
130
+ - - "="
131
+ - !ruby/object:Gem::Version
132
+ segments:
133
+ - 0
134
+ - 7
135
+ - 9
136
+ version: 0.7.9
137
+ type: :runtime
138
+ prerelease: false
139
+ version_requirements: *id008
140
+ - !ruby/object:Gem::Dependency
141
+ name: thin
142
+ requirement: &id009 !ruby/object:Gem::Requirement
143
+ none: false
144
+ requirements:
145
+ - - "="
146
+ - !ruby/object:Gem::Version
147
+ segments:
148
+ - 1
149
+ - 2
150
+ - 7
151
+ version: 1.2.7
152
+ type: :runtime
153
+ prerelease: false
154
+ version_requirements: *id009
155
+ - !ruby/object:Gem::Dependency
156
+ name: sinatra-reloader
157
+ requirement: &id010 !ruby/object:Gem::Requirement
158
+ none: false
159
+ requirements:
160
+ - - "="
161
+ - !ruby/object:Gem::Version
162
+ segments:
163
+ - 0
164
+ - 5
165
+ - 0
166
+ version: 0.5.0
167
+ type: :development
168
+ prerelease: false
169
+ version_requirements: *id010
170
+ - !ruby/object:Gem::Dependency
171
+ name: rspec
172
+ requirement: &id011 !ruby/object:Gem::Requirement
173
+ none: false
174
+ requirements:
175
+ - - "="
176
+ - !ruby/object:Gem::Version
177
+ segments:
178
+ - 2
179
+ - 4
180
+ - 0
181
+ version: 2.4.0
182
+ type: :development
183
+ prerelease: false
184
+ version_requirements: *id011
185
+ - !ruby/object:Gem::Dependency
186
+ name: rcov
187
+ requirement: &id012 !ruby/object:Gem::Requirement
188
+ none: false
189
+ requirements:
190
+ - - "="
191
+ - !ruby/object:Gem::Version
192
+ segments:
193
+ - 0
194
+ - 9
195
+ - 9
196
+ version: 0.9.9
197
+ type: :development
198
+ prerelease: false
199
+ version_requirements: *id012
200
+ - !ruby/object:Gem::Dependency
201
+ name: rack-test
202
+ requirement: &id013 !ruby/object:Gem::Requirement
203
+ none: false
204
+ requirements:
205
+ - - "="
206
+ - !ruby/object:Gem::Version
207
+ segments:
208
+ - 0
209
+ - 5
210
+ - 7
211
+ version: 0.5.7
212
+ type: :development
213
+ prerelease: false
214
+ version_requirements: *id013
215
+ - !ruby/object:Gem::Dependency
216
+ name: ZenTest
217
+ requirement: &id014 !ruby/object:Gem::Requirement
218
+ none: false
219
+ requirements:
220
+ - - "="
221
+ - !ruby/object:Gem::Version
222
+ segments:
223
+ - 4
224
+ - 4
225
+ - 2
226
+ version: 4.4.2
227
+ type: :development
228
+ prerelease: false
229
+ version_requirements: *id014
230
+ - !ruby/object:Gem::Dependency
231
+ name: autotest
232
+ requirement: &id015 !ruby/object:Gem::Requirement
233
+ none: false
234
+ requirements:
235
+ - - "="
236
+ - !ruby/object:Gem::Version
237
+ segments:
238
+ - 4
239
+ - 4
240
+ - 6
241
+ version: 4.4.6
242
+ type: :development
243
+ prerelease: false
244
+ version_requirements: *id015
245
+ - !ruby/object:Gem::Dependency
246
+ name: autotest-growl
247
+ requirement: &id016 !ruby/object:Gem::Requirement
248
+ none: false
249
+ requirements:
250
+ - - "="
251
+ - !ruby/object:Gem::Version
252
+ segments:
253
+ - 0
254
+ - 2
255
+ - 9
256
+ version: 0.2.9
257
+ type: :development
258
+ prerelease: false
259
+ version_requirements: *id016
260
+ description: Application registry based on Apache Zookeeper
261
+ email:
262
+ - lusis.org+rubygems.org@gmail.com
263
+ executables:
264
+ - noah
265
+ extensions: []
266
+
267
+ extra_rdoc_files: []
268
+
269
+ files:
270
+ - .autotest
271
+ - .gitignore
272
+ - Gemfile
273
+ - Gemfile.lock
274
+ - README.md
275
+ - Rakefile
276
+ - autotest/discover.rb
277
+ - bin/noah
278
+ - config.ru
279
+ - doc/coverage/index.html
280
+ - doc/coverage/jquery-1.3.2.min.js
281
+ - doc/coverage/jquery.tablesorter.min.js
282
+ - doc/coverage/lib-helpers_rb.html
283
+ - doc/coverage/lib-models_rb.html
284
+ - doc/coverage/noah_rb.html
285
+ - doc/coverage/print.css
286
+ - doc/coverage/rcov.js
287
+ - doc/coverage/screen.css
288
+ - lib/noah.rb
289
+ - lib/noah/app.rb
290
+ - lib/noah/applications.rb
291
+ - lib/noah/configurations.rb
292
+ - lib/noah/helpers.rb
293
+ - lib/noah/hosts.rb
294
+ - lib/noah/models.rb
295
+ - lib/noah/services.rb
296
+ - lib/noah/version.rb
297
+ - lib/noah/watchers.rb
298
+ - noah.gemspec
299
+ - spec/application_spec.rb
300
+ - spec/configuration_spec.rb
301
+ - spec/host_spec.rb
302
+ - spec/noahapp_application_spec.rb
303
+ - spec/noahapp_configuration_spec.rb
304
+ - spec/noahapp_host_spec.rb
305
+ - spec/noahapp_service_spec.rb
306
+ - spec/noahapp_spec.rb
307
+ - spec/service_spec.rb
308
+ - spec/spec_helper.rb
309
+ - views/200.erb
310
+ - views/404.erb
311
+ - views/500.erb
312
+ - views/index.haml
313
+ has_rdoc: true
314
+ homepage: https://github.com/lusis/noah
315
+ licenses: []
316
+
317
+ post_install_message:
318
+ rdoc_options: []
319
+
320
+ require_paths:
321
+ - lib
322
+ required_ruby_version: !ruby/object:Gem::Requirement
323
+ none: false
324
+ requirements:
325
+ - - ">="
326
+ - !ruby/object:Gem::Version
327
+ hash: -1893767332938043475
328
+ segments:
329
+ - 0
330
+ version: "0"
331
+ required_rubygems_version: !ruby/object:Gem::Requirement
332
+ none: false
333
+ requirements:
334
+ - - ">="
335
+ - !ruby/object:Gem::Version
336
+ hash: -1893767332938043475
337
+ segments:
338
+ - 0
339
+ version: "0"
340
+ requirements: []
341
+
342
+ rubyforge_project: noah
343
+ rubygems_version: 1.3.7
344
+ signing_key:
345
+ specification_version: 3
346
+ summary: Application registry based on Apache Zookeeper
347
+ test_files: []
348
+