noah 0.0.5

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,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
+