noah 0.0.5 → 0.0.9

Sign up to get free protection for your applications and to get access to all the features.
Files changed (90) hide show
  1. data/.gemtest +0 -0
  2. data/.gitignore +9 -0
  3. data/LICENSE +201 -0
  4. data/README.md +68 -212
  5. data/Rakefile +70 -41
  6. data/TODO.md +59 -0
  7. data/bin/noah +2 -1
  8. data/bin/noah-watcher.rb +93 -0
  9. data/config.ru +6 -3
  10. data/config/warble.rb +18 -0
  11. data/examples/README.md +116 -0
  12. data/examples/cluster.ru +2 -0
  13. data/examples/custom-watcher.rb +10 -0
  14. data/examples/httpclient-server.rb +7 -0
  15. data/examples/httpclient.rb +12 -0
  16. data/examples/httpclient2.rb +28 -0
  17. data/examples/js/FABridge.js +1452 -0
  18. data/examples/js/WebSocketMain.swf +830 -0
  19. data/examples/js/swfobject.js +851 -0
  20. data/examples/js/web_socket.js +312 -0
  21. data/examples/logger.rb +11 -0
  22. data/examples/reconfiguring-sinatra-watcher.rb +11 -0
  23. data/examples/reconfiguring-sinatra.rb +32 -0
  24. data/examples/simple-post.rb +17 -0
  25. data/examples/websocket.html +24 -0
  26. data/examples/websocket.rb +41 -0
  27. data/lib/noah.rb +5 -8
  28. data/lib/noah/app.rb +20 -268
  29. data/lib/noah/application_routes.rb +70 -0
  30. data/lib/noah/ark.rb +0 -0
  31. data/lib/noah/configuration_routes.rb +81 -0
  32. data/lib/noah/ephemeral_routes.rb +19 -0
  33. data/lib/noah/helpers.rb +12 -14
  34. data/lib/noah/host_routes.rb +69 -0
  35. data/lib/noah/models.rb +86 -5
  36. data/lib/noah/models/applications.rb +41 -0
  37. data/lib/noah/models/configurations.rb +49 -0
  38. data/lib/noah/models/ephemerals.rb +33 -0
  39. data/lib/noah/models/hosts.rb +56 -0
  40. data/lib/noah/models/services.rb +54 -0
  41. data/lib/noah/models/watchers.rb +54 -0
  42. data/lib/noah/passthrough.rb +11 -0
  43. data/lib/noah/service_routes.rb +71 -0
  44. data/lib/noah/validations.rb +1 -0
  45. data/lib/noah/validations/watcher_validations.rb +48 -0
  46. data/lib/noah/version.rb +1 -1
  47. data/lib/noah/watcher.rb +75 -0
  48. data/lib/noah/watcher_routes.rb +12 -0
  49. data/lib/vendor/em-hiredis/Gemfile +4 -0
  50. data/lib/vendor/em-hiredis/README.md +61 -0
  51. data/lib/vendor/em-hiredis/Rakefile +2 -0
  52. data/lib/vendor/em-hiredis/em-hiredis-0.0.1.gem +0 -0
  53. data/lib/vendor/em-hiredis/em-hiredis.gemspec +23 -0
  54. data/lib/vendor/em-hiredis/lib/em-hiredis.rb +22 -0
  55. data/lib/vendor/em-hiredis/lib/em-hiredis/client.rb +131 -0
  56. data/lib/vendor/em-hiredis/lib/em-hiredis/connection.rb +61 -0
  57. data/lib/vendor/em-hiredis/lib/em-hiredis/event_emitter.rb +29 -0
  58. data/lib/vendor/em-hiredis/lib/em-hiredis/version.rb +5 -0
  59. data/noah.gemspec +21 -17
  60. data/spec/application_spec.rb +30 -30
  61. data/spec/configuration_spec.rb +81 -14
  62. data/spec/ephemeral_spec.rb +52 -0
  63. data/spec/host_spec.rb +21 -21
  64. data/spec/noahapp_application_spec.rb +6 -6
  65. data/spec/noahapp_configuration_spec.rb +3 -3
  66. data/spec/noahapp_host_spec.rb +2 -2
  67. data/spec/noahapp_service_spec.rb +9 -9
  68. data/spec/noahapp_watcher_spec.rb +34 -0
  69. data/spec/service_spec.rb +27 -27
  70. data/spec/spec_helper.rb +13 -22
  71. data/spec/support/db/.keep +0 -0
  72. data/spec/support/test-redis.conf +8 -0
  73. data/spec/watcher_spec.rb +62 -0
  74. data/views/index.haml +21 -15
  75. metadata +124 -148
  76. data/Gemfile.lock +0 -85
  77. data/doc/coverage/index.html +0 -138
  78. data/doc/coverage/jquery-1.3.2.min.js +0 -19
  79. data/doc/coverage/jquery.tablesorter.min.js +0 -15
  80. data/doc/coverage/lib-helpers_rb.html +0 -393
  81. data/doc/coverage/lib-models_rb.html +0 -1449
  82. data/doc/coverage/noah_rb.html +0 -2019
  83. data/doc/coverage/print.css +0 -12
  84. data/doc/coverage/rcov.js +0 -42
  85. data/doc/coverage/screen.css +0 -270
  86. data/lib/noah/applications.rb +0 -46
  87. data/lib/noah/configurations.rb +0 -49
  88. data/lib/noah/hosts.rb +0 -54
  89. data/lib/noah/services.rb +0 -57
  90. data/lib/noah/watchers.rb +0 -18
@@ -1,12 +0,0 @@
1
- /* Hide controls */
2
-
3
- body {
4
- color: #000000;
5
- background-color: #ffffff;
6
- }
7
-
8
- /* Hide controls */
9
-
10
- div.filters {
11
- display: none;
12
- }
data/doc/coverage/rcov.js DELETED
@@ -1,42 +0,0 @@
1
- function toggleCode( id ) {
2
- if ( document.getElementById ) {
3
- elem = document.getElementById( id );
4
- } else if ( document.all ) {
5
- elem = eval( "document.all." + id );
6
- } else {
7
- return false;
8
- }
9
-
10
- elemStyle = elem.style;
11
-
12
- if ( elemStyle.display != "block" ) {
13
- elemStyle.display = "block";
14
- } else {
15
- elemStyle.display = "none";
16
- }
17
-
18
- return true;
19
- }
20
-
21
- function restripe() {
22
- i = 0;
23
- $('table#report_table tbody tr').each(function(){
24
- if (this.style.display != "none") {
25
- i += 1;
26
- classes = this.className.split(" ");
27
- if ($.inArray("even",classes) != -1) {
28
- classes.splice($.inArray("even",classes),1);
29
- } else if ($.inArray("odd",classes) != -1) {
30
- classes.splice($.inArray("odd",classes),1);
31
- }
32
- if (i % 2 === 0) {
33
- this.className = classes.join(" ") + " odd";
34
- } else {
35
- this.className = classes.join(" ") + " even";
36
- }
37
- }
38
- });
39
- }
40
-
41
- // Fix IE's lack of support for indexOf (!)
42
- if (!Array.indexOf) { Array.prototype.indexOf = function(obj){ for(var i=0; i<this.length; i++){ if(this[i]==obj){return i;} } return -1; }}
@@ -1,270 +0,0 @@
1
- /* @group General */
2
-
3
- body {
4
- font-family: Verdana, Helvetica, Arial, Sans-Serif;
5
- font-size: 12px;
6
- color: #4C4C4C;
7
- background-color: #F4F2ED;
8
- padding: 1em;
9
- }
10
-
11
- a:link {
12
- color: #191919;
13
- }
14
-
15
- a:visited {
16
- color: #191919;
17
- }
18
-
19
- pre, code {
20
- color: #000000;
21
- font-family: "Bitstream Vera Sans Mono","Monaco","Courier New",monospace;
22
- font-size: 95%;
23
- line-height: 1.3em;
24
- margin-top: 0;
25
- margin-bottom: 0;
26
- padding: 0;
27
- word-wrap: break-word;
28
- }
29
-
30
- h1, h2, h3, h4, h5, h6 {
31
- margin: 0em 0em 1em 0em;
32
- color: #666666;
33
- }
34
-
35
- h1 {
36
- display: block;
37
- font-size: 2em;
38
- letter-spacing: -1px;
39
- }
40
-
41
- h2 {
42
- margin-top: -1em;
43
- }
44
-
45
- fieldset {
46
- display: inline;
47
- border: 0px;
48
- padding: 0px;
49
- margin-right: 1em;
50
- }
51
-
52
- div.filters {
53
- margin-bottom: 1em;
54
- }
55
-
56
- .hidden {
57
- display: none;
58
- }
59
-
60
- /* @end */
61
-
62
- /* @group Cross-References */
63
-
64
- span.cross-ref-title {
65
- font-size: 140%;
66
- }
67
-
68
- span.cross-ref a {
69
- text-decoration: none;
70
- }
71
-
72
- span.cross-ref {
73
- background-color:#f3f7fa;
74
- border: 1px dashed #333;
75
- margin: 1em;
76
- padding: 0.5em;
77
- overflow: hidden;
78
- }
79
-
80
- a.crossref-toggle {
81
- text-decoration: none;
82
- }
83
-
84
- /* @end */
85
-
86
- /* @group Report Table */
87
-
88
- div.report_table_wrapper {
89
- min-width: 900px;
90
- }
91
-
92
- table.report {
93
- border-collapse: collapse;
94
- border: 1px solid #666666;
95
- width: 100%;
96
- margin-bottom: 1em;
97
- }
98
-
99
- table.report tr {
100
- line-height: 1.75em;
101
- }
102
-
103
- table.report th {
104
- background: #666666;
105
- color: #ffffff;
106
- text-align: right;
107
- text-transform: uppercase;
108
- font-size: .8em;
109
- font-weight: bold;
110
- padding: 0em .5em;
111
- border: 1px solid #666666;
112
- }
113
-
114
- table.report tfoot tr {
115
- background: #dddddd;
116
- font-weight: bold;
117
- padding: .5em;
118
- border: 1px solid #666666;
119
- }
120
-
121
- th.left_align, td.left_align {
122
- text-align: left !important;
123
- }
124
-
125
- th.right_align, td.right_align {
126
- text-align: right;
127
- padding-right: 2em !important;
128
- }
129
-
130
- table.report th.header:hover {
131
- cursor: pointer;
132
- text-decoration: underline;
133
- }
134
-
135
- table.report th.headerSortUp:after{
136
- content: "\25BC";
137
- margin-left: 1em;
138
- }
139
-
140
- table.report th.headerSortDown:after {
141
- content: "\25B2";
142
- margin-left: 1em;
143
- }
144
-
145
- table.report tr.summary_row {
146
- background: #cccccc;
147
- border: 1px solid #cccccc;
148
- }
149
-
150
- table.report tr.summary_row td {
151
- padding-left: .2em !important;
152
- color: #333333;
153
- font-weight: bold;
154
- }
155
-
156
- table.report td {
157
- padding: .2em .5em .2em .5em;
158
- }
159
-
160
- table.report td a {
161
- text-decoration: none;
162
- }
163
-
164
- table.report tbody tr:hover {
165
- background: #cccccc !important;
166
- }
167
-
168
- table.report tr.summary_row td {
169
- border-bottom: 1px solid #aaaaaa;
170
- }
171
-
172
- table.report tr {
173
- background-color: #eeeeee;
174
- }
175
-
176
- table.report tr.odd {
177
- background-color: #dddddd;
178
- }
179
-
180
- /* @end */
181
-
182
- /* @group Percentage Graphs */
183
-
184
- div.percent_graph_legend {
185
- width: 5.5em;
186
- float: left;
187
- margin: .5em 1em .5em 0em;
188
- height: 1em;
189
- line-height: 1em;
190
- }
191
-
192
- div.percent_graph {
193
- height: 1em;
194
- border: #333333 1px solid;
195
- empty-cells: show;
196
- padding: 0px;
197
- border-collapse: collapse;
198
- width: 100px !important;
199
- float: left;
200
- margin: .5em 1em .5em 0em;
201
- }
202
-
203
- div.percent_graph div {
204
- float: left;
205
- height: 1em;
206
- padding: 0px !important;
207
- }
208
-
209
- div.percent_graph div.covered {
210
- background: #649632;
211
- }
212
-
213
- div.percent_graph div.uncovered {
214
- background: #a92730;
215
- }
216
-
217
- div.percent_graph div.NA {
218
- background: #eaeaea;
219
- }
220
-
221
- /* @end */
222
-
223
- /* @group Details page */
224
-
225
- table.details {
226
- margin-top: 1em;
227
- border-collapse: collapse;
228
- width: 100%;
229
- border: 1px solid #666666;
230
- }
231
-
232
- table.details tr {
233
- line-height: 1.75em;
234
- }
235
-
236
- table.details td {
237
- padding: .25em;
238
- }
239
-
240
- span.inferred, span.inferred1, span.marked, span.marked1, span.uncovered, span.uncovered1 {
241
- display: block;
242
- padding: .25em;
243
- }
244
-
245
- tr.inferred td, span.inferred {
246
- background-color: #e0dedb;
247
- }
248
-
249
- tr.inferred1 td, span.inferred1 {
250
- background-color: #e0dedb;
251
- }
252
-
253
- tr.marked td, span.marked, span.marked1 {
254
- background-color: #bed2be;
255
- }
256
-
257
- tr.uncovered td, span.uncovered {
258
- background-color: #ce8b8c;
259
- }
260
-
261
- tr.uncovered1 td, span.uncovered1 {
262
- background-color: #ce8b8c;
263
- }
264
-
265
- div.key {
266
- border: 1px solid #666666;
267
- margin: 1em 0em;
268
- }
269
-
270
- /* @end */
@@ -1,46 +0,0 @@
1
- class Application < Ohm::Model
2
- include Ohm::Typecast
3
- include Ohm::Timestamping
4
- include Ohm::Callbacks
5
- include Ohm::ExtraValidations
6
-
7
- attribute :name
8
- collection :configurations, Configuration
9
-
10
- index :name
11
-
12
- def validate
13
- assert_present :name
14
- assert_unique :name
15
- end
16
-
17
- def to_hash
18
- arr = []
19
- configurations.sort.each {|c| arr << c.to_hash}
20
- super.merge(:name => name, :updated_at => updated_at, :configurations => arr)
21
- end
22
-
23
- def is_new?
24
- self.created_at == self.updated_at
25
- end
26
-
27
- class << self
28
- def find_or_create(opts = {})
29
- begin
30
- find(opts).first.nil? ? (app = create(opts)) : (app = find(opts).first)
31
- if app.valid?
32
- app.save
33
- end
34
- app
35
- rescue Exception => e
36
- e.message
37
- end
38
- end
39
- end
40
- end
41
-
42
- class Applications
43
- def self.all(options = {})
44
- options.empty? ? Application.all.sort : Application.find(options).sort
45
- end
46
- end
@@ -1,49 +0,0 @@
1
- class Configuration < Ohm::Model
2
- include Ohm::Typecast
3
- include Ohm::Timestamping
4
- include Ohm::Callbacks
5
- include Ohm::ExtraValidations
6
-
7
- attribute :name
8
- attribute :format
9
- attribute :body
10
- attribute :new_record
11
- reference :application, Application
12
-
13
- index :name
14
-
15
- def validate
16
- assert_present :name
17
- assert_present :format
18
- assert_present :body
19
- assert_unique [:name, :application_id]
20
- end
21
-
22
- def to_hash
23
- super.merge(:name => name, :format => format, :body => body, :update_at => updated_at, :application => Application[application_id].name)
24
- end
25
-
26
- def is_new?
27
- self.created_at == self.updated_at
28
- end
29
-
30
- class << self
31
- def find_or_create(opts={})
32
- begin
33
- if find(opts).first.nil?
34
- conf = create(opts)
35
- else
36
- conf = find(opts).first
37
- end
38
- rescue Exception => e
39
- e.message
40
- end
41
- end
42
- end
43
- end
44
-
45
- class Configurations
46
- def self.all(options = {})
47
- options.empty? ? Configuration.all.sort : Configuration.find(options).sort
48
- end
49
- end
data/lib/noah/hosts.rb DELETED
@@ -1,54 +0,0 @@
1
- class Host < Ohm::Model
2
- include Ohm::Typecast
3
- include Ohm::Timestamping
4
- include Ohm::Callbacks
5
- include Ohm::ExtraValidations
6
-
7
- attribute :name
8
- attribute :status
9
- collection :services, Service
10
-
11
- index :name
12
- index :status
13
-
14
- def validate
15
- assert_present :name
16
- assert_present :status
17
- assert_unique :name
18
- assert_member :status, ["up","down","pending"]
19
- end
20
-
21
- def to_hash
22
- arr = []
23
- services.sort.each {|s| arr << s.to_hash}
24
- h = {:name => name, :status => status, :created_at => created_at, :updated_at => updated_at, :services => arr}
25
- super.merge(h)
26
- end
27
-
28
- def is_new?
29
- self.created_at == self.updated_at
30
- end
31
-
32
- class << self
33
- def find_or_create(opts = {})
34
- begin
35
- # exclude requested status from lookup
36
- h = find(opts.reject{|key,value| key == :status}).first
37
- host = h.nil? ? create(opts) : h
38
- host.status = opts[:status]
39
- if host.valid?
40
- host.save
41
- end
42
- host
43
- rescue Exception => e
44
- e.message
45
- end
46
- end
47
- end
48
- end
49
-
50
- class Hosts
51
- def self.all(options = {})
52
- options.empty? ? Host.all.sort : Host.find(options).sort
53
- end
54
- end