noah 0.0.5-jruby → 0.1-jruby

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.
Files changed (81) hide show
  1. data/.gemtest +0 -0
  2. data/.gitignore +10 -0
  3. data/LICENSE +201 -0
  4. data/README.md +68 -212
  5. data/Rakefile +65 -41
  6. data/TODO.md +65 -0
  7. data/bin/noah +2 -1
  8. data/bin/noah-watcher.rb +103 -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 +33 -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 +6 -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/custom_watcher.rb +79 -0
  33. data/lib/noah/ephemeral_routes.rb +47 -0
  34. data/lib/noah/helpers.rb +37 -14
  35. data/lib/noah/host_routes.rb +69 -0
  36. data/lib/noah/models.rb +86 -5
  37. data/lib/noah/models/applications.rb +41 -0
  38. data/lib/noah/models/configurations.rb +49 -0
  39. data/lib/noah/models/ephemerals.rb +54 -0
  40. data/lib/noah/models/hosts.rb +56 -0
  41. data/lib/noah/models/services.rb +54 -0
  42. data/lib/noah/models/watchers.rb +62 -0
  43. data/lib/noah/passthrough.rb +11 -0
  44. data/lib/noah/service_routes.rb +71 -0
  45. data/lib/noah/validations.rb +1 -0
  46. data/lib/noah/validations/watcher_validations.rb +48 -0
  47. data/lib/noah/version.rb +1 -1
  48. data/lib/noah/watcher_routes.rb +45 -0
  49. data/noah.gemspec +25 -17
  50. data/spec/application_spec.rb +30 -30
  51. data/spec/configuration_spec.rb +78 -14
  52. data/spec/ephemeral_spec.rb +59 -0
  53. data/spec/host_spec.rb +21 -21
  54. data/spec/noahapp_application_spec.rb +6 -6
  55. data/spec/noahapp_configuration_spec.rb +5 -5
  56. data/spec/noahapp_ephemeral_spec.rb +115 -0
  57. data/spec/noahapp_host_spec.rb +3 -3
  58. data/spec/noahapp_service_spec.rb +10 -10
  59. data/spec/noahapp_watcher_spec.rb +123 -0
  60. data/spec/service_spec.rb +27 -27
  61. data/spec/spec_helper.rb +13 -22
  62. data/spec/support/db/.keep +0 -0
  63. data/spec/support/test-redis.conf +8 -0
  64. data/spec/watcher_spec.rb +62 -0
  65. data/views/index.haml +21 -15
  66. metadata +189 -146
  67. data/Gemfile.lock +0 -83
  68. data/doc/coverage/index.html +0 -138
  69. data/doc/coverage/jquery-1.3.2.min.js +0 -19
  70. data/doc/coverage/jquery.tablesorter.min.js +0 -15
  71. data/doc/coverage/lib-helpers_rb.html +0 -393
  72. data/doc/coverage/lib-models_rb.html +0 -1449
  73. data/doc/coverage/noah_rb.html +0 -2019
  74. data/doc/coverage/print.css +0 -12
  75. data/doc/coverage/rcov.js +0 -42
  76. data/doc/coverage/screen.css +0 -270
  77. data/lib/noah/applications.rb +0 -46
  78. data/lib/noah/configurations.rb +0 -49
  79. data/lib/noah/hosts.rb +0 -54
  80. data/lib/noah/services.rb +0 -57
  81. 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