ses-proxy 0.1.0

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 (57) hide show
  1. data/app/public/bootstrap/css/bootstrap-responsive.css +1092 -0
  2. data/app/public/bootstrap/css/bootstrap-responsive.min.css +9 -0
  3. data/app/public/bootstrap/css/bootstrap.css +6039 -0
  4. data/app/public/bootstrap/css/bootstrap.min.css +9 -0
  5. data/app/public/bootstrap/img/glyphicons-halflings-white.png +0 -0
  6. data/app/public/bootstrap/img/glyphicons-halflings.png +0 -0
  7. data/app/public/bootstrap/js/bootstrap.js +2159 -0
  8. data/app/public/bootstrap/js/bootstrap.min.js +6 -0
  9. data/app/public/css/application.css +16 -0
  10. data/app/public/datepicker/css/datepicker.css +7 -0
  11. data/app/public/datepicker/js/bootstrap-datepicker.js +454 -0
  12. data/app/public/datepicker/less/datepicker.less +119 -0
  13. data/app/public/highcharts/adapters/mootools-adapter.js +13 -0
  14. data/app/public/highcharts/adapters/mootools-adapter.src.js +327 -0
  15. data/app/public/highcharts/adapters/prototype-adapter.js +16 -0
  16. data/app/public/highcharts/adapters/prototype-adapter.src.js +385 -0
  17. data/app/public/highcharts/highcharts-more.js +35 -0
  18. data/app/public/highcharts/highcharts.js +246 -0
  19. data/app/public/highcharts/highcharts.src.js +15111 -0
  20. data/app/public/highcharts/modules/canvas-tools.js +133 -0
  21. data/app/public/highcharts/modules/canvas-tools.src.js +3113 -0
  22. data/app/public/highcharts/modules/data.js +11 -0
  23. data/app/public/highcharts/modules/data.src.js +277 -0
  24. data/app/public/highcharts/modules/exporting.js +23 -0
  25. data/app/public/highcharts/modules/exporting.src.js +736 -0
  26. data/app/public/highcharts/themes/dark-blue.js +263 -0
  27. data/app/public/highcharts/themes/dark-green.js +263 -0
  28. data/app/public/highcharts/themes/gray.js +262 -0
  29. data/app/public/highcharts/themes/grid.js +95 -0
  30. data/app/public/highcharts/themes/skies.js +89 -0
  31. data/app/public/images/loader.gif +0 -0
  32. data/app/public/js/application.js +81 -0
  33. data/app/views/_chart.haml +2 -0
  34. data/app/views/_search_form.haml +23 -0
  35. data/app/views/bounces.haml +23 -0
  36. data/app/views/kaminari/_first_page.html.erb +3 -0
  37. data/app/views/kaminari/_gap.html.erb +3 -0
  38. data/app/views/kaminari/_last_page.html.erb +3 -0
  39. data/app/views/kaminari/_next_page.html.erb +3 -0
  40. data/app/views/kaminari/_page.html.erb +3 -0
  41. data/app/views/kaminari/_paginator.html.erb +17 -0
  42. data/app/views/kaminari/_prev_page.html.erb +3 -0
  43. data/app/views/layout.haml +25 -0
  44. data/app/views/mails.haml +26 -0
  45. data/app/web_panel.rb +149 -0
  46. data/bin/ses_proxy +20 -0
  47. data/lib/ses_proxy/conf.rb +9 -0
  48. data/lib/ses_proxy/main_command.rb +154 -0
  49. data/lib/ses_proxy/models/bounce.rb +14 -0
  50. data/lib/ses_proxy/models/complaint.rb +13 -0
  51. data/lib/ses_proxy/models/email.rb +15 -0
  52. data/lib/ses_proxy/smtp_server.rb +122 -0
  53. data/lib/ses_proxy/sns_endpoint.rb +199 -0
  54. data/ses_proxy.rb +10 -0
  55. data/template/mongoid.yml +12 -0
  56. data/template/ses-proxy.yml +19 -0
  57. metadata +294 -0
@@ -0,0 +1,119 @@
1
+ /*!
2
+ * Datepicker for Bootstrap
3
+ *
4
+ * Copyright 2012 Stefan Petre
5
+ * Licensed under the Apache License v2.0
6
+ * http://www.apache.org/licenses/LICENSE-2.0
7
+ *
8
+ */
9
+
10
+ .datepicker {
11
+ top: 0;
12
+ left: 0;
13
+ padding: 4px;
14
+ margin-top: 1px;
15
+ .border-radius(4px);
16
+ &:before {
17
+ content: '';
18
+ display: inline-block;
19
+ border-left: 7px solid transparent;
20
+ border-right: 7px solid transparent;
21
+ border-bottom: 7px solid #ccc;
22
+ border-bottom-color: rgba(0,0,0,.2);
23
+ position: absolute;
24
+ top: -7px;
25
+ left: 6px;
26
+ }
27
+ &:after {
28
+ content: '';
29
+ display: inline-block;
30
+ border-left: 6px solid transparent;
31
+ border-right: 6px solid transparent;
32
+ border-bottom: 6px solid @white;
33
+ position: absolute;
34
+ top: -6px;
35
+ left: 7px;
36
+ }
37
+ >div {
38
+ display: none;
39
+ }
40
+ table{
41
+ width: 100%;
42
+ margin: 0;
43
+ }
44
+ td,
45
+ th{
46
+ text-align: center;
47
+ width: 20px;
48
+ height: 20px;
49
+ .border-radius(4px);
50
+ }
51
+ td {
52
+ &.day:hover {
53
+ background: @grayLighter;
54
+ cursor: pointer;
55
+ }
56
+ &.old,
57
+ &.new {
58
+ color: @grayLight;
59
+ }
60
+ &.active,
61
+ &.active:hover {
62
+ .buttonBackground(@primaryButtonBackground, spin(@primaryButtonBackground, 20));
63
+ color: #fff;
64
+ text-shadow: 0 -1px 0 rgba(0,0,0,.25);
65
+ }
66
+ span {
67
+ display: block;
68
+ width: 47px;
69
+ height: 54px;
70
+ line-height: 54px;
71
+ float: left;
72
+ margin: 2px;
73
+ cursor: pointer;
74
+ .border-radius(4px);
75
+ &:hover {
76
+ background: @grayLighter;
77
+ }
78
+ &.active {
79
+ .buttonBackground(@primaryButtonBackground, spin(@primaryButtonBackground, 20));
80
+ color: #fff;
81
+ text-shadow: 0 -1px 0 rgba(0,0,0,.25);
82
+ }
83
+ &.old {
84
+ color: @grayLight;
85
+ }
86
+ }
87
+ }
88
+
89
+ th {
90
+ &.switch {
91
+ width: 145px;
92
+ }
93
+ &.next,
94
+ &.prev {
95
+ font-size: @baseFontSize * 1.5;
96
+ }
97
+ }
98
+
99
+ thead tr:first-child th {
100
+ cursor: pointer;
101
+ &:hover{
102
+ background: @grayLighter;
103
+ }
104
+ }
105
+ /*.dow {
106
+ border-top: 1px solid #ddd !important;
107
+ }*/
108
+ }
109
+ .input-append,
110
+ .input-prepend {
111
+ &.date {
112
+ .add-on i {
113
+ display: block;
114
+ cursor: pointer;
115
+ width: 16px;
116
+ height: 16px;
117
+ }
118
+ }
119
+ }
@@ -0,0 +1,13 @@
1
+ /*
2
+ Highcharts JS v2.3.3 (2012-10-04)
3
+ MooTools adapter
4
+
5
+ (c) 2010-2011 Torstein Hønsi
6
+
7
+ License: www.highcharts.com/license
8
+ */
9
+ (function(){var e=window,i=document,f=e.MooTools.version.substring(0,3),g=f==="1.2"||f==="1.1",j=g||f==="1.3",h=e.$extend||function(){return Object.append.apply(Object,arguments)};e.HighchartsAdapter={init:function(a){var b=Fx.prototype,c=b.start,d=Fx.Morph.prototype,e=d.compute;b.start=function(b,d){var e=this.element;if(b.d)this.paths=a.init(e,e.d,this.toD);c.apply(this,arguments);return this};d.compute=function(b,c,d){var f=this.paths;if(f)this.element.attr("d",a.step(f[0],f[1],d,this.toD));else return e.apply(this,
10
+ arguments)}},adapterRun:function(a,b){if(b==="width"||b==="height")return parseInt($(a).getStyle(b),10)},getScript:function(a,b){var c=i.getElementsByTagName("head")[0],d=i.createElement("script");d.type="text/javascript";d.src=a;d.onload=b;c.appendChild(d)},animate:function(a,b,c){var d=a.attr,f=c&&c.complete;if(d&&!a.setStyle)a.getStyle=a.attr,a.setStyle=function(){var b=arguments;a.attr.call(a,b[0],b[1][0])},a.$family=function(){return!0};e.HighchartsAdapter.stop(a);c=new Fx.Morph(d?a:$(a),h({transition:Fx.Transitions.Quad.easeInOut},
11
+ c));if(d)c.element=a;if(b.d)c.toD=b.d;f&&c.addEvent("complete",f);c.start(b);a.fx=c},each:function(a,b){return g?$each(a,b):Array.each(a,b)},map:function(a,b){return a.map(b)},grep:function(a,b){return a.filter(b)},inArray:function(a,b,c){return b.indexOf(a,c)},merge:function(){var a=arguments,b=[{}],c=a.length;if(g)a=$merge.apply(null,a);else{for(;c--;)typeof a[c]!=="boolean"&&(b[c+1]=a[c]);a=Object.merge.apply(Object,b)}return a},offset:function(a){a=$(a).getOffsets();return{left:a.x,top:a.y}},
12
+ extendWithEvents:function(a){a.addEvent||(a.nodeName?$(a):h(a,new Events))},addEvent:function(a,b,c){typeof b==="string"&&(b==="unload"&&(b="beforeunload"),e.HighchartsAdapter.extendWithEvents(a),a.addEvent(b,c))},removeEvent:function(a,b,c){typeof a!=="string"&&(e.HighchartsAdapter.extendWithEvents(a),b?(b==="unload"&&(b="beforeunload"),c?a.removeEvent(b,c):a.removeEvents&&a.removeEvents(b)):a.removeEvents())},fireEvent:function(a,b,c,d){b={type:b,target:a};b=j?new Event(b):new DOMEvent(b);b=h(b,
13
+ c);b.preventDefault=function(){d=null};a.fireEvent&&a.fireEvent(b.type,b);d&&d(b)},washMouseEvent:function(a){return a.event||a},stop:function(a){a.fx&&a.fx.cancel()}}})();
@@ -0,0 +1,327 @@
1
+ /**
2
+ * @license Highcharts JS v2.3.3 (2012-10-04)
3
+ * MooTools adapter
4
+ *
5
+ * (c) 2010-2011 Torstein Hønsi
6
+ *
7
+ * License: www.highcharts.com/license
8
+ */
9
+
10
+ // JSLint options:
11
+ /*global Fx, $, $extend, $each, $merge, Events, Event, DOMEvent */
12
+
13
+ (function () {
14
+
15
+ var win = window,
16
+ doc = document,
17
+ mooVersion = win.MooTools.version.substring(0, 3), // Get the first three characters of the version number
18
+ legacy = mooVersion === '1.2' || mooVersion === '1.1', // 1.1 && 1.2 considered legacy, 1.3 is not.
19
+ legacyEvent = legacy || mooVersion === '1.3', // In versions 1.1 - 1.3 the event class is named Event, in newer versions it is named DOMEvent.
20
+ $extend = win.$extend || function () {
21
+ return Object.append.apply(Object, arguments);
22
+ };
23
+
24
+ win.HighchartsAdapter = {
25
+ /**
26
+ * Initialize the adapter. This is run once as Highcharts is first run.
27
+ * @param {Object} pathAnim The helper object to do animations across adapters.
28
+ */
29
+ init: function (pathAnim) {
30
+ var fxProto = Fx.prototype,
31
+ fxStart = fxProto.start,
32
+ morphProto = Fx.Morph.prototype,
33
+ morphCompute = morphProto.compute;
34
+
35
+ // override Fx.start to allow animation of SVG element wrappers
36
+ /*jslint unparam: true*//* allow unused parameters in fx functions */
37
+ fxProto.start = function (from, to) {
38
+ var fx = this,
39
+ elem = fx.element;
40
+
41
+ // special for animating paths
42
+ if (from.d) {
43
+ //this.fromD = this.element.d.split(' ');
44
+ fx.paths = pathAnim.init(
45
+ elem,
46
+ elem.d,
47
+ fx.toD
48
+ );
49
+ }
50
+ fxStart.apply(fx, arguments);
51
+
52
+ return this; // chainable
53
+ };
54
+
55
+ // override Fx.step to allow animation of SVG element wrappers
56
+ morphProto.compute = function (from, to, delta) {
57
+ var fx = this,
58
+ paths = fx.paths;
59
+
60
+ if (paths) {
61
+ fx.element.attr(
62
+ 'd',
63
+ pathAnim.step(paths[0], paths[1], delta, fx.toD)
64
+ );
65
+ } else {
66
+ return morphCompute.apply(fx, arguments);
67
+ }
68
+ };
69
+ /*jslint unparam: false*/
70
+ },
71
+
72
+ /**
73
+ * Run a general method on the framework, following jQuery syntax
74
+ * @param {Object} el The HTML element
75
+ * @param {String} method Which method to run on the wrapped element
76
+ */
77
+ adapterRun: function (el, method) {
78
+
79
+ // This currently works for getting inner width and height. If adding
80
+ // more methods later, we need a conditional implementation for each.
81
+ if (method === 'width' || method === 'height') {
82
+ return parseInt($(el).getStyle(method), 10);
83
+ }
84
+ },
85
+
86
+ /**
87
+ * Downloads a script and executes a callback when done.
88
+ * @param {String} scriptLocation
89
+ * @param {Function} callback
90
+ */
91
+ getScript: function (scriptLocation, callback) {
92
+ // We cannot assume that Assets class from mootools-more is available so instead insert a script tag to download script.
93
+ var head = doc.getElementsByTagName('head')[0];
94
+ var script = doc.createElement('script');
95
+
96
+ script.type = 'text/javascript';
97
+ script.src = scriptLocation;
98
+ script.onload = callback;
99
+
100
+ head.appendChild(script);
101
+ },
102
+
103
+ /**
104
+ * Animate a HTML element or SVG element wrapper
105
+ * @param {Object} el
106
+ * @param {Object} params
107
+ * @param {Object} options jQuery-like animation options: duration, easing, callback
108
+ */
109
+ animate: function (el, params, options) {
110
+ var isSVGElement = el.attr,
111
+ effect,
112
+ complete = options && options.complete;
113
+
114
+ if (isSVGElement && !el.setStyle) {
115
+ // add setStyle and getStyle methods for internal use in Moo
116
+ el.getStyle = el.attr;
117
+ el.setStyle = function () { // property value is given as array in Moo - break it down
118
+ var args = arguments;
119
+ el.attr.call(el, args[0], args[1][0]);
120
+ };
121
+ // dirty hack to trick Moo into handling el as an element wrapper
122
+ el.$family = function () { return true; };
123
+ }
124
+
125
+ // stop running animations
126
+ win.HighchartsAdapter.stop(el);
127
+
128
+ // define and run the effect
129
+ effect = new Fx.Morph(
130
+ isSVGElement ? el : $(el),
131
+ $extend({
132
+ transition: Fx.Transitions.Quad.easeInOut
133
+ }, options)
134
+ );
135
+
136
+ // Make sure that the element reference is set when animating svg elements
137
+ if (isSVGElement) {
138
+ effect.element = el;
139
+ }
140
+
141
+ // special treatment for paths
142
+ if (params.d) {
143
+ effect.toD = params.d;
144
+ }
145
+
146
+ // jQuery-like events
147
+ if (complete) {
148
+ effect.addEvent('complete', complete);
149
+ }
150
+
151
+ // run
152
+ effect.start(params);
153
+
154
+ // record for use in stop method
155
+ el.fx = effect;
156
+ },
157
+
158
+ /**
159
+ * MooTool's each function
160
+ *
161
+ */
162
+ each: function (arr, fn) {
163
+ return legacy ?
164
+ $each(arr, fn) :
165
+ Array.each(arr, fn);
166
+ },
167
+
168
+ /**
169
+ * Map an array
170
+ * @param {Array} arr
171
+ * @param {Function} fn
172
+ */
173
+ map: function (arr, fn) {
174
+ return arr.map(fn);
175
+ },
176
+
177
+ /**
178
+ * Grep or filter an array
179
+ * @param {Array} arr
180
+ * @param {Function} fn
181
+ */
182
+ grep: function (arr, fn) {
183
+ return arr.filter(fn);
184
+ },
185
+
186
+ /**
187
+ * Return the index of an item in an array, or -1 if not matched
188
+ */
189
+ inArray: function (item, arr, from) {
190
+ return arr.indexOf(item, from);
191
+ },
192
+
193
+ /**
194
+ * Deep merge two objects and return a third
195
+ */
196
+ merge: function () {
197
+ var args = arguments,
198
+ args13 = [{}], // MooTools 1.3+
199
+ i = args.length,
200
+ ret;
201
+
202
+ if (legacy) {
203
+ ret = $merge.apply(null, args);
204
+ } else {
205
+ while (i--) {
206
+ // Boolean argumens should not be merged.
207
+ // JQuery explicitly skips this, so we do it here as well.
208
+ if (typeof args[i] !== 'boolean') {
209
+ args13[i + 1] = args[i];
210
+ }
211
+ }
212
+ ret = Object.merge.apply(Object, args13);
213
+ }
214
+
215
+ return ret;
216
+ },
217
+
218
+ /**
219
+ * Get the offset of an element relative to the top left corner of the web page
220
+ */
221
+ offset: function (el) {
222
+ var offsets = $(el).getOffsets();
223
+ return {
224
+ left: offsets.x,
225
+ top: offsets.y
226
+ };
227
+ },
228
+
229
+ /**
230
+ * Extends an object with Events, if its not done
231
+ */
232
+ extendWithEvents: function (el) {
233
+ // if the addEvent method is not defined, el is a custom Highcharts object
234
+ // like series or point
235
+ if (!el.addEvent) {
236
+ if (el.nodeName) {
237
+ el = $(el); // a dynamically generated node
238
+ } else {
239
+ $extend(el, new Events()); // a custom object
240
+ }
241
+ }
242
+ },
243
+
244
+ /**
245
+ * Add an event listener
246
+ * @param {Object} el HTML element or custom object
247
+ * @param {String} type Event type
248
+ * @param {Function} fn Event handler
249
+ */
250
+ addEvent: function (el, type, fn) {
251
+ if (typeof type === 'string') { // chart broke due to el being string, type function
252
+
253
+ if (type === 'unload') { // Moo self destructs before custom unload events
254
+ type = 'beforeunload';
255
+ }
256
+
257
+ win.HighchartsAdapter.extendWithEvents(el);
258
+
259
+ el.addEvent(type, fn);
260
+ }
261
+ },
262
+
263
+ removeEvent: function (el, type, fn) {
264
+ if (typeof el === 'string') {
265
+ // el.removeEvents below apperantly calls this method again. Do not quite understand why, so for now just bail out.
266
+ return;
267
+ }
268
+
269
+ win.HighchartsAdapter.extendWithEvents(el);
270
+ if (type) {
271
+ if (type === 'unload') { // Moo self destructs before custom unload events
272
+ type = 'beforeunload';
273
+ }
274
+
275
+ if (fn) {
276
+ el.removeEvent(type, fn);
277
+ } else if (el.removeEvents) { // #958
278
+ el.removeEvents(type);
279
+ }
280
+ } else {
281
+ el.removeEvents();
282
+ }
283
+ },
284
+
285
+ fireEvent: function (el, event, eventArguments, defaultFunction) {
286
+ var eventArgs = {
287
+ type: event,
288
+ target: el
289
+ };
290
+ // create an event object that keeps all functions
291
+ event = legacyEvent ? new Event(eventArgs) : new DOMEvent(eventArgs);
292
+ event = $extend(event, eventArguments);
293
+ // override the preventDefault function to be able to use
294
+ // this for custom events
295
+ event.preventDefault = function () {
296
+ defaultFunction = null;
297
+ };
298
+ // if fireEvent is not available on the object, there hasn't been added
299
+ // any events to it above
300
+ if (el.fireEvent) {
301
+ el.fireEvent(event.type, event);
302
+ }
303
+
304
+ // fire the default if it is passed and it is not prevented above
305
+ if (defaultFunction) {
306
+ defaultFunction(event);
307
+ }
308
+ },
309
+
310
+ /**
311
+ * Set back e.pageX and e.pageY that MooTools has abstracted away
312
+ */
313
+ washMouseEvent: function (e) {
314
+ return e.event || e;
315
+ },
316
+
317
+ /**
318
+ * Stop running animations on the object
319
+ */
320
+ stop: function (el) {
321
+ if (el.fx) {
322
+ el.fx.cancel();
323
+ }
324
+ }
325
+ };
326
+
327
+ }());