outboxer 0.1.1 → 0.1.2
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.
- checksums.yaml +4 -4
- data/doc/Outboxer/Models/Exception.html +124 -0
- data/doc/Outboxer/Models/Message.html +144 -0
- data/doc/Outboxer/Models/Outboxable/ClassMethods.html +105 -0
- data/doc/Outboxer/Models/Outboxable.html +265 -0
- data/doc/Outboxer/Models.html +119 -0
- data/doc/Outboxer/Publisher/Args.html +310 -0
- data/doc/Outboxer/Publisher.html +384 -0
- data/doc/Outboxer/Railtie.html +124 -0
- data/doc/Outboxer.html +150 -0
- data/doc/_index.html +211 -0
- data/doc/class_list.html +51 -0
- data/doc/css/common.css +1 -0
- data/doc/css/full_list.css +58 -0
- data/doc/css/style.css +497 -0
- data/doc/file.README.html +180 -0
- data/doc/file_list.html +56 -0
- data/doc/frames.html +17 -0
- data/doc/index.html +180 -0
- data/doc/js/app.js +314 -0
- data/doc/js/full_list.js +216 -0
- data/doc/js/jquery.js +4 -0
- data/doc/method_list.html +99 -0
- data/doc/top-level-namespace.html +110 -0
- data/lib/outboxer/version.rb +1 -1
- data/outboxer.gemspec +1 -1
- metadata +25 -15
data/doc/css/style.css
ADDED
@@ -0,0 +1,497 @@
|
|
1
|
+
html {
|
2
|
+
width: 100%;
|
3
|
+
height: 100%;
|
4
|
+
}
|
5
|
+
body {
|
6
|
+
font-family: "Lucida Sans", "Lucida Grande", Verdana, Arial, sans-serif;
|
7
|
+
font-size: 13px;
|
8
|
+
width: 100%;
|
9
|
+
margin: 0;
|
10
|
+
padding: 0;
|
11
|
+
display: flex;
|
12
|
+
display: -webkit-flex;
|
13
|
+
display: -ms-flexbox;
|
14
|
+
}
|
15
|
+
|
16
|
+
#nav {
|
17
|
+
position: relative;
|
18
|
+
width: 100%;
|
19
|
+
height: 100%;
|
20
|
+
border: 0;
|
21
|
+
border-right: 1px dotted #eee;
|
22
|
+
overflow: auto;
|
23
|
+
}
|
24
|
+
.nav_wrap {
|
25
|
+
margin: 0;
|
26
|
+
padding: 0;
|
27
|
+
width: 20%;
|
28
|
+
height: 100%;
|
29
|
+
position: relative;
|
30
|
+
display: flex;
|
31
|
+
display: -webkit-flex;
|
32
|
+
display: -ms-flexbox;
|
33
|
+
flex-shrink: 0;
|
34
|
+
-webkit-flex-shrink: 0;
|
35
|
+
-ms-flex: 1 0;
|
36
|
+
}
|
37
|
+
#resizer {
|
38
|
+
position: absolute;
|
39
|
+
right: -5px;
|
40
|
+
top: 0;
|
41
|
+
width: 10px;
|
42
|
+
height: 100%;
|
43
|
+
cursor: col-resize;
|
44
|
+
z-index: 9999;
|
45
|
+
}
|
46
|
+
#main {
|
47
|
+
flex: 5 1;
|
48
|
+
-webkit-flex: 5 1;
|
49
|
+
-ms-flex: 5 1;
|
50
|
+
outline: none;
|
51
|
+
position: relative;
|
52
|
+
background: #fff;
|
53
|
+
padding: 1.2em;
|
54
|
+
padding-top: 0.2em;
|
55
|
+
box-sizing: border-box;
|
56
|
+
}
|
57
|
+
|
58
|
+
@media (max-width: 920px) {
|
59
|
+
.nav_wrap { width: 100%; top: 0; right: 0; overflow: visible; position: absolute; }
|
60
|
+
#resizer { display: none; }
|
61
|
+
#nav {
|
62
|
+
z-index: 9999;
|
63
|
+
background: #fff;
|
64
|
+
display: none;
|
65
|
+
position: absolute;
|
66
|
+
top: 40px;
|
67
|
+
right: 12px;
|
68
|
+
width: 500px;
|
69
|
+
max-width: 80%;
|
70
|
+
height: 80%;
|
71
|
+
overflow-y: scroll;
|
72
|
+
border: 1px solid #999;
|
73
|
+
border-collapse: collapse;
|
74
|
+
box-shadow: -7px 5px 25px #aaa;
|
75
|
+
border-radius: 2px;
|
76
|
+
}
|
77
|
+
}
|
78
|
+
|
79
|
+
@media (min-width: 920px) {
|
80
|
+
body { height: 100%; overflow: hidden; }
|
81
|
+
#main { height: 100%; overflow: auto; }
|
82
|
+
#search { display: none; }
|
83
|
+
}
|
84
|
+
|
85
|
+
#main img { max-width: 100%; }
|
86
|
+
h1 { font-size: 25px; margin: 1em 0 0.5em; padding-top: 4px; border-top: 1px dotted #d5d5d5; }
|
87
|
+
h1.noborder { border-top: 0px; margin-top: 0; padding-top: 4px; }
|
88
|
+
h1.title { margin-bottom: 10px; }
|
89
|
+
h1.alphaindex { margin-top: 0; font-size: 22px; }
|
90
|
+
h2 {
|
91
|
+
padding: 0;
|
92
|
+
padding-bottom: 3px;
|
93
|
+
border-bottom: 1px #aaa solid;
|
94
|
+
font-size: 1.4em;
|
95
|
+
margin: 1.8em 0 0.5em;
|
96
|
+
position: relative;
|
97
|
+
}
|
98
|
+
h2 small { font-weight: normal; font-size: 0.7em; display: inline; position: absolute; right: 0; }
|
99
|
+
h2 small a {
|
100
|
+
display: block;
|
101
|
+
height: 20px;
|
102
|
+
border: 1px solid #aaa;
|
103
|
+
border-bottom: 0;
|
104
|
+
border-top-left-radius: 5px;
|
105
|
+
background: #f8f8f8;
|
106
|
+
position: relative;
|
107
|
+
padding: 2px 7px;
|
108
|
+
}
|
109
|
+
.clear { clear: both; }
|
110
|
+
.inline { display: inline; }
|
111
|
+
.inline p:first-child { display: inline; }
|
112
|
+
.docstring, .tags, #filecontents { font-size: 15px; line-height: 1.5145em; }
|
113
|
+
.docstring p > code, .docstring p > tt, .tags p > code, .tags p > tt {
|
114
|
+
color: #c7254e; background: #f9f2f4; padding: 2px 4px; font-size: 1em;
|
115
|
+
border-radius: 4px;
|
116
|
+
}
|
117
|
+
.docstring h1, .docstring h2, .docstring h3, .docstring h4 { padding: 0; border: 0; border-bottom: 1px dotted #bbb; }
|
118
|
+
.docstring h1 { font-size: 1.2em; }
|
119
|
+
.docstring h2 { font-size: 1.1em; }
|
120
|
+
.docstring h3, .docstring h4 { font-size: 1em; border-bottom: 0; padding-top: 10px; }
|
121
|
+
.summary_desc .object_link a, .docstring .object_link a {
|
122
|
+
font-family: monospace; font-size: 1.05em;
|
123
|
+
color: #05a; background: #EDF4FA; padding: 2px 4px; font-size: 1em;
|
124
|
+
border-radius: 4px;
|
125
|
+
}
|
126
|
+
.rdoc-term { padding-right: 25px; font-weight: bold; }
|
127
|
+
.rdoc-list p { margin: 0; padding: 0; margin-bottom: 4px; }
|
128
|
+
.summary_desc pre.code .object_link a, .docstring pre.code .object_link a {
|
129
|
+
padding: 0px; background: inherit; color: inherit; border-radius: inherit;
|
130
|
+
}
|
131
|
+
|
132
|
+
/* style for <table> */
|
133
|
+
#filecontents table, .docstring table { border-collapse: collapse; }
|
134
|
+
#filecontents table th, #filecontents table td,
|
135
|
+
.docstring table th, .docstring table td { border: 1px solid #ccc; padding: 8px; padding-right: 17px; }
|
136
|
+
#filecontents table tr:nth-child(odd),
|
137
|
+
.docstring table tr:nth-child(odd) { background: #eee; }
|
138
|
+
#filecontents table tr:nth-child(even),
|
139
|
+
.docstring table tr:nth-child(even) { background: #fff; }
|
140
|
+
#filecontents table th, .docstring table th { background: #fff; }
|
141
|
+
|
142
|
+
/* style for <ul> */
|
143
|
+
#filecontents li > p, .docstring li > p { margin: 0px; }
|
144
|
+
#filecontents ul, .docstring ul { padding-left: 20px; }
|
145
|
+
/* style for <dl> */
|
146
|
+
#filecontents dl, .docstring dl { border: 1px solid #ccc; }
|
147
|
+
#filecontents dt, .docstring dt { background: #ddd; font-weight: bold; padding: 3px 5px; }
|
148
|
+
#filecontents dd, .docstring dd { padding: 5px 0px; margin-left: 18px; }
|
149
|
+
#filecontents dd > p, .docstring dd > p { margin: 0px; }
|
150
|
+
|
151
|
+
.note {
|
152
|
+
color: #222;
|
153
|
+
margin: 20px 0;
|
154
|
+
padding: 10px;
|
155
|
+
border: 1px solid #eee;
|
156
|
+
border-radius: 3px;
|
157
|
+
display: block;
|
158
|
+
}
|
159
|
+
.docstring .note {
|
160
|
+
border-left-color: #ccc;
|
161
|
+
border-left-width: 5px;
|
162
|
+
}
|
163
|
+
.note.todo { background: #ffffc5; border-color: #ececaa; }
|
164
|
+
.note.returns_void { background: #efefef; }
|
165
|
+
.note.deprecated { background: #ffe5e5; border-color: #e9dada; }
|
166
|
+
.note.title.deprecated { background: #ffe5e5; border-color: #e9dada; }
|
167
|
+
.note.private { background: #ffffc5; border-color: #ececaa; }
|
168
|
+
.note.title { padding: 3px 6px; font-size: 0.9em; font-family: "Lucida Sans", "Lucida Grande", Verdana, Arial, sans-serif; display: inline; }
|
169
|
+
.summary_signature + .note.title { margin-left: 7px; }
|
170
|
+
h1 .note.title { font-size: 0.5em; font-weight: normal; padding: 3px 5px; position: relative; top: -3px; text-transform: capitalize; }
|
171
|
+
.note.title { background: #efefef; }
|
172
|
+
.note.title.constructor { color: #fff; background: #6a98d6; border-color: #6689d6; }
|
173
|
+
.note.title.writeonly { color: #fff; background: #45a638; border-color: #2da31d; }
|
174
|
+
.note.title.readonly { color: #fff; background: #6a98d6; border-color: #6689d6; }
|
175
|
+
.note.title.private { background: #d5d5d5; border-color: #c5c5c5; }
|
176
|
+
.note.title.not_defined_here { background: transparent; border: none; font-style: italic; }
|
177
|
+
.discussion .note { margin-top: 6px; }
|
178
|
+
.discussion .note:first-child { margin-top: 0; }
|
179
|
+
|
180
|
+
h3.inherited {
|
181
|
+
font-style: italic;
|
182
|
+
font-family: "Lucida Sans", "Lucida Grande", Verdana, Arial, sans-serif;
|
183
|
+
font-weight: normal;
|
184
|
+
padding: 0;
|
185
|
+
margin: 0;
|
186
|
+
margin-top: 12px;
|
187
|
+
margin-bottom: 3px;
|
188
|
+
font-size: 13px;
|
189
|
+
}
|
190
|
+
p.inherited {
|
191
|
+
padding: 0;
|
192
|
+
margin: 0;
|
193
|
+
margin-left: 25px;
|
194
|
+
}
|
195
|
+
|
196
|
+
.box_info dl {
|
197
|
+
margin: 0;
|
198
|
+
border: 0;
|
199
|
+
width: 100%;
|
200
|
+
font-size: 1em;
|
201
|
+
display: flex;
|
202
|
+
display: -webkit-flex;
|
203
|
+
display: -ms-flexbox;
|
204
|
+
}
|
205
|
+
.box_info dl dt {
|
206
|
+
flex-shrink: 0;
|
207
|
+
-webkit-flex-shrink: 1;
|
208
|
+
-ms-flex-shrink: 1;
|
209
|
+
width: 100px;
|
210
|
+
text-align: right;
|
211
|
+
font-weight: bold;
|
212
|
+
border: 1px solid #aaa;
|
213
|
+
border-width: 1px 0px 0px 1px;
|
214
|
+
padding: 6px 0;
|
215
|
+
padding-right: 10px;
|
216
|
+
}
|
217
|
+
.box_info dl dd {
|
218
|
+
flex-grow: 1;
|
219
|
+
-webkit-flex-grow: 1;
|
220
|
+
-ms-flex: 1;
|
221
|
+
max-width: 420px;
|
222
|
+
padding: 6px 0;
|
223
|
+
padding-right: 20px;
|
224
|
+
border: 1px solid #aaa;
|
225
|
+
border-width: 1px 1px 0 0;
|
226
|
+
overflow: hidden;
|
227
|
+
position: relative;
|
228
|
+
}
|
229
|
+
.box_info dl:last-child > * {
|
230
|
+
border-bottom: 1px solid #aaa;
|
231
|
+
}
|
232
|
+
.box_info dl:nth-child(odd) > * { background: #eee; }
|
233
|
+
.box_info dl:nth-child(even) > * { background: #fff; }
|
234
|
+
.box_info dl > * { margin: 0; }
|
235
|
+
|
236
|
+
ul.toplevel { list-style: none; padding-left: 0; font-size: 1.1em; }
|
237
|
+
.index_inline_list { padding-left: 0; font-size: 1.1em; }
|
238
|
+
|
239
|
+
.index_inline_list li {
|
240
|
+
list-style: none;
|
241
|
+
display: inline-block;
|
242
|
+
padding: 0 12px;
|
243
|
+
line-height: 30px;
|
244
|
+
margin-bottom: 5px;
|
245
|
+
}
|
246
|
+
|
247
|
+
dl.constants { margin-left: 10px; }
|
248
|
+
dl.constants dt { font-weight: bold; font-size: 1.1em; margin-bottom: 5px; }
|
249
|
+
dl.constants.compact dt { display: inline-block; font-weight: normal }
|
250
|
+
dl.constants dd { width: 75%; white-space: pre; font-family: monospace; margin-bottom: 18px; }
|
251
|
+
dl.constants .docstring .note:first-child { margin-top: 5px; }
|
252
|
+
|
253
|
+
.summary_desc {
|
254
|
+
margin-left: 32px;
|
255
|
+
display: block;
|
256
|
+
font-family: sans-serif;
|
257
|
+
font-size: 1.1em;
|
258
|
+
margin-top: 8px;
|
259
|
+
line-height: 1.5145em;
|
260
|
+
margin-bottom: 0.8em;
|
261
|
+
}
|
262
|
+
.summary_desc tt { font-size: 0.9em; }
|
263
|
+
dl.constants .note { padding: 2px 6px; padding-right: 12px; margin-top: 6px; }
|
264
|
+
dl.constants .docstring { margin-left: 32px; font-size: 0.9em; font-weight: normal; }
|
265
|
+
dl.constants .tags { padding-left: 32px; font-size: 0.9em; line-height: 0.8em; }
|
266
|
+
dl.constants .discussion *:first-child { margin-top: 0; }
|
267
|
+
dl.constants .discussion *:last-child { margin-bottom: 0; }
|
268
|
+
|
269
|
+
.method_details { border-top: 1px dotted #ccc; margin-top: 25px; padding-top: 0; }
|
270
|
+
.method_details.first { border: 0; margin-top: 5px; }
|
271
|
+
.method_details.first h3.signature { margin-top: 1em; }
|
272
|
+
p.signature, h3.signature {
|
273
|
+
font-size: 1.1em; font-weight: normal; font-family: Monaco, Consolas, Courier, monospace;
|
274
|
+
padding: 6px 10px; margin-top: 1em;
|
275
|
+
background: #E8F4FF; border: 1px solid #d8d8e5; border-radius: 5px;
|
276
|
+
}
|
277
|
+
p.signature tt,
|
278
|
+
h3.signature tt { font-family: Monaco, Consolas, Courier, monospace; }
|
279
|
+
p.signature .overload,
|
280
|
+
h3.signature .overload { display: block; }
|
281
|
+
p.signature .extras,
|
282
|
+
h3.signature .extras { font-weight: normal; font-family: sans-serif; color: #444; font-size: 1em; }
|
283
|
+
p.signature .not_defined_here,
|
284
|
+
h3.signature .not_defined_here,
|
285
|
+
p.signature .aliases,
|
286
|
+
h3.signature .aliases { display: block; font-weight: normal; font-size: 0.9em; font-family: sans-serif; margin-top: 0px; color: #555; }
|
287
|
+
p.signature .aliases .names,
|
288
|
+
h3.signature .aliases .names { font-family: Monaco, Consolas, Courier, monospace; font-weight: bold; color: #000; font-size: 1.2em; }
|
289
|
+
|
290
|
+
.tags .tag_title { font-size: 1.05em; margin-bottom: 0; font-weight: bold; }
|
291
|
+
.tags .tag_title tt { color: initial; padding: initial; background: initial; }
|
292
|
+
.tags ul { margin-top: 5px; padding-left: 30px; list-style: square; }
|
293
|
+
.tags ul li { margin-bottom: 3px; }
|
294
|
+
.tags ul .name { font-family: monospace; font-weight: bold; }
|
295
|
+
.tags ul .note { padding: 3px 6px; }
|
296
|
+
.tags { margin-bottom: 12px; }
|
297
|
+
|
298
|
+
.tags .examples .tag_title { margin-bottom: 10px; font-weight: bold; }
|
299
|
+
.tags .examples .inline p { padding: 0; margin: 0; font-weight: bold; font-size: 1em; }
|
300
|
+
.tags .examples .inline p:before { content: "▸"; font-size: 1em; margin-right: 5px; }
|
301
|
+
|
302
|
+
.tags .overload .overload_item { list-style: none; margin-bottom: 25px; }
|
303
|
+
.tags .overload .overload_item .signature {
|
304
|
+
padding: 2px 8px;
|
305
|
+
background: #F1F8FF; border: 1px solid #d8d8e5; border-radius: 3px;
|
306
|
+
}
|
307
|
+
.tags .overload .signature { margin-left: -15px; font-family: monospace; display: block; font-size: 1.1em; }
|
308
|
+
.tags .overload .docstring { margin-top: 15px; }
|
309
|
+
|
310
|
+
.defines { display: none; }
|
311
|
+
|
312
|
+
#method_missing_details .notice.this { position: relative; top: -8px; color: #888; padding: 0; margin: 0; }
|
313
|
+
|
314
|
+
.showSource { font-size: 0.9em; }
|
315
|
+
.showSource a, .showSource a:visited { text-decoration: none; color: #666; }
|
316
|
+
|
317
|
+
#content a, #content a:visited { text-decoration: none; color: #05a; }
|
318
|
+
#content a:hover { background: #ffffa5; }
|
319
|
+
|
320
|
+
ul.summary {
|
321
|
+
list-style: none;
|
322
|
+
font-family: monospace;
|
323
|
+
font-size: 1em;
|
324
|
+
line-height: 1.5em;
|
325
|
+
padding-left: 0px;
|
326
|
+
}
|
327
|
+
ul.summary a, ul.summary a:visited {
|
328
|
+
text-decoration: none; font-size: 1.1em;
|
329
|
+
}
|
330
|
+
ul.summary li { margin-bottom: 5px; }
|
331
|
+
.summary_signature { padding: 4px 8px; background: #f8f8f8; border: 1px solid #f0f0f0; border-radius: 5px; }
|
332
|
+
.summary_signature:hover { background: #CFEBFF; border-color: #A4CCDA; cursor: pointer; }
|
333
|
+
.summary_signature.deprecated { background: #ffe5e5; border-color: #e9dada; }
|
334
|
+
ul.summary.compact li { display: inline-block; margin: 0px 5px 0px 0px; line-height: 2.6em;}
|
335
|
+
ul.summary.compact .summary_signature { padding: 5px 7px; padding-right: 4px; }
|
336
|
+
#content .summary_signature:hover a,
|
337
|
+
#content .summary_signature:hover a:visited {
|
338
|
+
background: transparent;
|
339
|
+
color: #049;
|
340
|
+
}
|
341
|
+
|
342
|
+
p.inherited a { font-family: monospace; font-size: 0.9em; }
|
343
|
+
p.inherited { word-spacing: 5px; font-size: 1.2em; }
|
344
|
+
|
345
|
+
p.children { font-size: 1.2em; }
|
346
|
+
p.children a { font-size: 0.9em; }
|
347
|
+
p.children strong { font-size: 0.8em; }
|
348
|
+
p.children strong.modules { padding-left: 5px; }
|
349
|
+
|
350
|
+
ul.fullTree { display: none; padding-left: 0; list-style: none; margin-left: 0; margin-bottom: 10px; }
|
351
|
+
ul.fullTree ul { margin-left: 0; padding-left: 0; list-style: none; }
|
352
|
+
ul.fullTree li { text-align: center; padding-top: 18px; padding-bottom: 12px; background: url(data:image/gif;base64,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) no-repeat top center; }
|
353
|
+
ul.fullTree li:first-child { padding-top: 0; background: transparent; }
|
354
|
+
ul.fullTree li:last-child { padding-bottom: 0; }
|
355
|
+
.showAll ul.fullTree { display: block; }
|
356
|
+
.showAll .inheritName { display: none; }
|
357
|
+
|
358
|
+
#search { position: absolute; right: 12px; top: 0px; z-index: 9000; }
|
359
|
+
#search a {
|
360
|
+
display: block; float: left;
|
361
|
+
padding: 4px 8px; text-decoration: none; color: #05a; fill: #05a;
|
362
|
+
border: 1px solid #d8d8e5;
|
363
|
+
border-bottom-left-radius: 3px; border-bottom-right-radius: 3px;
|
364
|
+
background: #F1F8FF;
|
365
|
+
box-shadow: -1px 1px 3px #ddd;
|
366
|
+
}
|
367
|
+
#search a:hover { background: #f5faff; color: #06b; fill: #06b; }
|
368
|
+
#search a.active {
|
369
|
+
background: #568; padding-bottom: 20px; color: #fff; fill: #fff;
|
370
|
+
border: 1px solid #457;
|
371
|
+
border-top-left-radius: 5px; border-top-right-radius: 5px;
|
372
|
+
}
|
373
|
+
#search a.inactive { color: #999; fill: #999; }
|
374
|
+
.inheritanceTree, .toggleDefines {
|
375
|
+
float: right;
|
376
|
+
border-left: 1px solid #aaa;
|
377
|
+
position: absolute; top: 0; right: 0;
|
378
|
+
height: 100%;
|
379
|
+
background: #f6f6f6;
|
380
|
+
padding: 5px;
|
381
|
+
min-width: 55px;
|
382
|
+
text-align: center;
|
383
|
+
}
|
384
|
+
|
385
|
+
#menu { font-size: 1.3em; color: #bbb; }
|
386
|
+
#menu .title, #menu a { font-size: 0.7em; }
|
387
|
+
#menu .title a { font-size: 1em; }
|
388
|
+
#menu .title { color: #555; }
|
389
|
+
#menu a, #menu a:visited { color: #333; text-decoration: none; border-bottom: 1px dotted #bbd; }
|
390
|
+
#menu a:hover { color: #05a; }
|
391
|
+
|
392
|
+
#footer { margin-top: 15px; border-top: 1px solid #ccc; text-align: center; padding: 7px 0; color: #999; }
|
393
|
+
#footer a, #footer a:visited { color: #444; text-decoration: none; border-bottom: 1px dotted #bbd; }
|
394
|
+
#footer a:hover { color: #05a; }
|
395
|
+
|
396
|
+
#listing ul.alpha { font-size: 1.1em; }
|
397
|
+
#listing ul.alpha { margin: 0; padding: 0; padding-bottom: 10px; list-style: none; }
|
398
|
+
#listing ul.alpha li.letter { font-size: 1.4em; padding-bottom: 10px; }
|
399
|
+
#listing ul.alpha ul { margin: 0; padding-left: 15px; }
|
400
|
+
#listing ul small { color: #666; font-size: 0.7em; }
|
401
|
+
|
402
|
+
li.r1 { background: #f0f0f0; }
|
403
|
+
li.r2 { background: #fafafa; }
|
404
|
+
|
405
|
+
#content ul.summary li.deprecated .summary_signature a,
|
406
|
+
#content ul.summary li.deprecated .summary_signature a:visited { text-decoration: line-through; font-style: italic; }
|
407
|
+
|
408
|
+
#toc {
|
409
|
+
position: relative;
|
410
|
+
float: right;
|
411
|
+
overflow-x: auto;
|
412
|
+
right: -3px;
|
413
|
+
margin-left: 20px;
|
414
|
+
margin-bottom: 20px;
|
415
|
+
padding: 20px; padding-right: 30px;
|
416
|
+
max-width: 300px;
|
417
|
+
z-index: 5000;
|
418
|
+
background: #fefefe;
|
419
|
+
border: 1px solid #ddd;
|
420
|
+
box-shadow: -2px 2px 6px #bbb;
|
421
|
+
}
|
422
|
+
#toc .title { margin: 0; }
|
423
|
+
#toc ol { padding-left: 1.8em; }
|
424
|
+
#toc li { font-size: 1.1em; line-height: 1.7em; }
|
425
|
+
#toc > ol > li { font-size: 1.1em; font-weight: bold; }
|
426
|
+
#toc ol > li > ol { font-size: 0.9em; }
|
427
|
+
#toc ol ol > li > ol { padding-left: 2.3em; }
|
428
|
+
#toc ol + li { margin-top: 0.3em; }
|
429
|
+
#toc.hidden { padding: 10px; background: #fefefe; box-shadow: none; }
|
430
|
+
#toc.hidden:hover { background: #fafafa; }
|
431
|
+
#filecontents h1 + #toc.nofloat { margin-top: 0; }
|
432
|
+
@media (max-width: 560px) {
|
433
|
+
#toc {
|
434
|
+
margin-left: 0;
|
435
|
+
margin-top: 16px;
|
436
|
+
float: none;
|
437
|
+
max-width: none;
|
438
|
+
}
|
439
|
+
}
|
440
|
+
|
441
|
+
/* syntax highlighting */
|
442
|
+
.source_code { display: none; padding: 3px 8px; border-left: 8px solid #ddd; margin-top: 5px; }
|
443
|
+
#filecontents pre.code, .docstring pre.code, .source_code pre { font-family: monospace; }
|
444
|
+
#filecontents pre.code, .docstring pre.code { display: block; }
|
445
|
+
.source_code .lines { padding-right: 12px; color: #555; text-align: right; }
|
446
|
+
#filecontents pre.code, .docstring pre.code,
|
447
|
+
.tags pre.example {
|
448
|
+
padding: 9px 14px;
|
449
|
+
margin-top: 4px;
|
450
|
+
border: 1px solid #e1e1e8;
|
451
|
+
background: #f7f7f9;
|
452
|
+
border-radius: 4px;
|
453
|
+
font-size: 1em;
|
454
|
+
overflow-x: auto;
|
455
|
+
line-height: 1.2em;
|
456
|
+
}
|
457
|
+
pre.code { color: #000; tab-size: 2; }
|
458
|
+
pre.code .info.file { color: #555; }
|
459
|
+
pre.code .val { color: #036A07; }
|
460
|
+
pre.code .tstring_content,
|
461
|
+
pre.code .heredoc_beg, pre.code .heredoc_end,
|
462
|
+
pre.code .qwords_beg, pre.code .qwords_end, pre.code .qwords_sep,
|
463
|
+
pre.code .words_beg, pre.code .words_end, pre.code .words_sep,
|
464
|
+
pre.code .qsymbols_beg, pre.code .qsymbols_end, pre.code .qsymbols_sep,
|
465
|
+
pre.code .symbols_beg, pre.code .symbols_end, pre.code .symbols_sep,
|
466
|
+
pre.code .tstring, pre.code .dstring { color: #036A07; }
|
467
|
+
pre.code .fid, pre.code .rubyid_new, pre.code .rubyid_to_s,
|
468
|
+
pre.code .rubyid_to_sym, pre.code .rubyid_to_f,
|
469
|
+
pre.code .dot + pre.code .id,
|
470
|
+
pre.code .rubyid_to_i pre.code .rubyid_each { color: #0085FF; }
|
471
|
+
pre.code .comment { color: #0066FF; }
|
472
|
+
pre.code .const, pre.code .constant { color: #585CF6; }
|
473
|
+
pre.code .label,
|
474
|
+
pre.code .symbol { color: #C5060B; }
|
475
|
+
pre.code .kw,
|
476
|
+
pre.code .rubyid_require,
|
477
|
+
pre.code .rubyid_extend,
|
478
|
+
pre.code .rubyid_include { color: #0000FF; }
|
479
|
+
pre.code .ivar { color: #318495; }
|
480
|
+
pre.code .gvar,
|
481
|
+
pre.code .rubyid_backref,
|
482
|
+
pre.code .rubyid_nth_ref { color: #6D79DE; }
|
483
|
+
pre.code .regexp, .dregexp { color: #036A07; }
|
484
|
+
pre.code a { border-bottom: 1px dotted #bbf; }
|
485
|
+
/* inline code */
|
486
|
+
*:not(pre) > code {
|
487
|
+
padding: 1px 3px 1px 3px;
|
488
|
+
border: 1px solid #E1E1E8;
|
489
|
+
background: #F7F7F9;
|
490
|
+
border-radius: 4px;
|
491
|
+
}
|
492
|
+
|
493
|
+
/* Color fix for links */
|
494
|
+
#content .summary_desc pre.code .id > .object_link a, /* identifier */
|
495
|
+
#content .docstring pre.code .id > .object_link a { color: #0085FF; }
|
496
|
+
#content .summary_desc pre.code .const > .object_link a, /* constant */
|
497
|
+
#content .docstring pre.code .const > .object_link a { color: #585CF6; }
|
@@ -0,0 +1,180 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html>
|
3
|
+
<head>
|
4
|
+
<meta charset="UTF-8">
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
6
|
+
<title>
|
7
|
+
File: README
|
8
|
+
|
9
|
+
— Documentation by YARD 0.9.34
|
10
|
+
|
11
|
+
</title>
|
12
|
+
|
13
|
+
<link rel="stylesheet" href="css/style.css" type="text/css" />
|
14
|
+
|
15
|
+
<link rel="stylesheet" href="css/common.css" type="text/css" />
|
16
|
+
|
17
|
+
<script type="text/javascript">
|
18
|
+
pathId = "README";
|
19
|
+
relpath = '';
|
20
|
+
</script>
|
21
|
+
|
22
|
+
|
23
|
+
<script type="text/javascript" charset="utf-8" src="js/jquery.js"></script>
|
24
|
+
|
25
|
+
<script type="text/javascript" charset="utf-8" src="js/app.js"></script>
|
26
|
+
|
27
|
+
|
28
|
+
</head>
|
29
|
+
<body>
|
30
|
+
<div class="nav_wrap">
|
31
|
+
<iframe id="nav" src="file_list.html?1"></iframe>
|
32
|
+
<div id="resizer"></div>
|
33
|
+
</div>
|
34
|
+
|
35
|
+
<div id="main" tabindex="-1">
|
36
|
+
<div id="header">
|
37
|
+
<div id="menu">
|
38
|
+
|
39
|
+
<a href="_index.html">Index</a> »
|
40
|
+
<span class="title">File: README</span>
|
41
|
+
|
42
|
+
</div>
|
43
|
+
|
44
|
+
<div id="search">
|
45
|
+
|
46
|
+
<a class="full_list_link" id="class_list_link"
|
47
|
+
href="class_list.html">
|
48
|
+
|
49
|
+
<svg width="24" height="24">
|
50
|
+
<rect x="0" y="4" width="24" height="4" rx="1" ry="1"></rect>
|
51
|
+
<rect x="0" y="12" width="24" height="4" rx="1" ry="1"></rect>
|
52
|
+
<rect x="0" y="20" width="24" height="4" rx="1" ry="1"></rect>
|
53
|
+
</svg>
|
54
|
+
</a>
|
55
|
+
|
56
|
+
</div>
|
57
|
+
<div class="clear"></div>
|
58
|
+
</div>
|
59
|
+
|
60
|
+
<div id="content"><div id='filecontents'>
|
61
|
+
<h1 id="label-Outboxer">Outboxer</h1>
|
62
|
+
|
63
|
+
<h2 id="label-Background">Background</h2>
|
64
|
+
|
65
|
+
<p>Typically in event driven Ruby on Rails applications:</p>
|
66
|
+
<ol><li>
|
67
|
+
<p>a domain event model is created in an SQL database table</p>
|
68
|
+
</li><li>
|
69
|
+
<p>a sidekiq worker is queued to handle the domain event asynchronously</p>
|
70
|
+
</li></ol>
|
71
|
+
|
72
|
+
<h2 id="label-Problem">Problem</h2>
|
73
|
+
|
74
|
+
<p>As these two operations span multiple database types (SQL and redis), they can not be combined into a single atomic operation using a transaction. If either step fails, inconsistencies can occur.</p>
|
75
|
+
|
76
|
+
<h2 id="label-Solution">Solution</h2>
|
77
|
+
|
78
|
+
<p>Outboxer is a simple Ruby on Rails implementation of the <a href="https://microservices.io/patterns/data/transactional-outbox.html">transactional outbox pattern</a>: a well established solution to this problem. It ensures both operations succeed <em>eventually</em>, or both fail.</p>
|
79
|
+
|
80
|
+
<h3 id="label-Getting+started">Getting started</h3>
|
81
|
+
|
82
|
+
<h3 id="label-Installation">Installation</h3>
|
83
|
+
<ol><li>
|
84
|
+
<p>Add the Outboxer gem to your application's Gemfile:</p>
|
85
|
+
</li></ol>
|
86
|
+
|
87
|
+
<pre class="code ruby"><code class="ruby"><span class='id identifier rubyid_gem'>gem</span> <span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>outboxer</span><span class='tstring_end'>'</span></span>
|
88
|
+
</code></pre>
|
89
|
+
<ol><li>
|
90
|
+
<p>Install the Outboxer gem:</p>
|
91
|
+
</li></ol>
|
92
|
+
|
93
|
+
<pre class="code ruby"><code class="ruby"><span class='id identifier rubyid_bundle'>bundle</span> <span class='id identifier rubyid_install'>install</span>
|
94
|
+
</code></pre>
|
95
|
+
<ol><li>
|
96
|
+
<p>Generate the migration and publisher files</p>
|
97
|
+
</li></ol>
|
98
|
+
|
99
|
+
<pre class="code ruby"><code class="ruby">bin/rails generate outboxer:install
|
100
|
+
</code></pre>
|
101
|
+
|
102
|
+
<h3 id="label-Usage">Usage</h3>
|
103
|
+
|
104
|
+
<h4 id="label-1.+Include+Outboxer-3A-3AOutboxable+into+your+existing+Message+model">1. Include <code>Outboxer::Outboxable</code> into your existing Message model</h4>
|
105
|
+
|
106
|
+
<pre class="code ruby"><code class="ruby"><span class='kw'>class</span> <span class='const'>Message</span> <span class='op'><</span> <span class='const'>ApplicationRecord</span>
|
107
|
+
<span class='id identifier rubyid_include'>include</span> <span class='const'><span class='object_link'><a href="Outboxer.html" title="Outboxer (module)">Outboxer</a></span></span><span class='op'>::</span><span class='const'><span class='object_link'><a href="Outboxer.html#Outboxable-constant" title="Outboxer::Outboxable (constant)">Outboxable</a></span></span>
|
108
|
+
<span class='kw'>end</span>
|
109
|
+
</code></pre>
|
110
|
+
|
111
|
+
<h4 id="label-2.+Update+the+generated+bin-2Fpublish+block+e.g.">2. Update the generated bin/publish block e.g.</h4>
|
112
|
+
|
113
|
+
<pre class="code ruby"><code class="ruby"><span class='const'><span class='object_link'><a href="Outboxer.html" title="Outboxer (module)">Outboxer</a></span></span><span class='op'>::</span><span class='const'><span class='object_link'><a href="Outboxer/Publisher.html" title="Outboxer::Publisher (module)">Publisher</a></span></span><span class='period'>.</span><span class='id identifier rubyid_publish'><span class='object_link'><a href="Outboxer/Publisher.html#publish-class_method" title="Outboxer::Publisher.publish (method)">publish</a></span></span> <span class='kw'>do</span> <span class='op'>|</span><span class='id identifier rubyid_args'>args</span><span class='op'>|</span>
|
114
|
+
<span class='id identifier rubyid_args'>args</span><span class='period'>.</span><span class='id identifier rubyid_logger'>logger</span><span class='period'>.</span><span class='id identifier rubyid_info'>info</span><span class='lparen'>(</span><span class='tstring'><span class='tstring_beg'>"</span><span class='tstring_content'>[</span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_message'>message</span><span class='period'>.</span><span class='id identifier rubyid_id'>id</span><span class='embexpr_end'>}</span><span class='tstring_content'>] publishing</span><span class='tstring_end'>"</span></span><span class='rparen'>)</span>
|
115
|
+
|
116
|
+
<span class='const'>Worker</span><span class='period'>.</span><span class='id identifier rubyid_perform_async'>perform_async</span><span class='lparen'>(</span><span class='lbrace'>{</span> <span class='label'>message_id:</span> <span class='id identifier rubyid_args'>args</span><span class='period'>.</span><span class='id identifier rubyid_message'>message</span><span class='period'>.</span><span class='id identifier rubyid_id'>id</span> <span class='rbrace'>}</span><span class='rparen'>)</span>
|
117
|
+
|
118
|
+
<span class='id identifier rubyid_args'>args</span><span class='period'>.</span><span class='id identifier rubyid_logger'>logger</span><span class='period'>.</span><span class='id identifier rubyid_info'>info</span><span class='lparen'>(</span><span class='tstring'><span class='tstring_beg'>"</span><span class='tstring_content'>[</span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_message'>message</span><span class='period'>.</span><span class='id identifier rubyid_id'>id</span><span class='embexpr_end'>}</span><span class='tstring_content'>] published</span><span class='tstring_end'>"</span></span><span class='rparen'>)</span>
|
119
|
+
<span class='kw'>end</span>
|
120
|
+
</code></pre>
|
121
|
+
|
122
|
+
<h4 id="label-3.+Migrate+the+database">3. Migrate the database</h4>
|
123
|
+
|
124
|
+
<pre class="code ruby"><code class="ruby">bin/rake db:migrate
|
125
|
+
</code></pre>
|
126
|
+
|
127
|
+
<h4 id="label-4.+Run+the+publisher">4. Run the publisher</h4>
|
128
|
+
|
129
|
+
<pre class="code ruby"><code class="ruby"><span class='id identifier rubyid_bin'>bin</span><span class='op'>/</span><span class='id identifier rubyid_publisher'>publisher</span>
|
130
|
+
</code></pre>
|
131
|
+
|
132
|
+
<h2 id="label-Implementation">Implementation</h2>
|
133
|
+
<ol><li>
|
134
|
+
<p>when an <code>ActiveRecord</code> model that includes <code>Outbox::Outboxable</code> is created, an <code>unpublished</code> <code>Outboxer::Message</code> is automatically created in the same transaction, with <code>Outboxer::Message#message</code> polymorphically assigned to the original model</p>
|
135
|
+
</li><li>
|
136
|
+
<p>When the publisher finds a new <code>unpublished</code> <code>Outboxer::Message</code>, it yields to a user-supplied block and then:</p>
|
137
|
+
<ul><li>
|
138
|
+
<p>removes it if the task completes successfully</p>
|
139
|
+
</li><li>
|
140
|
+
<p>marks it as failed and records the error if there's a problem</p>
|
141
|
+
</li></ul>
|
142
|
+
</li></ol>
|
143
|
+
|
144
|
+
<p>To see all the parts working together in a single place, check out the <a href="https://github.com/fast-programmer/outboxer/blob/master/spec/outboxer/publisher_spec.rb">publisher_spec.rb</a></p>
|
145
|
+
|
146
|
+
<h2 id="label-Motivation">Motivation</h2>
|
147
|
+
|
148
|
+
<p>Outboxer was created with 4 key benefits in mind:</p>
|
149
|
+
<ol><li>
|
150
|
+
<p>speed of integration into existing Ruby on Rails applications (< 1 hour)</p>
|
151
|
+
</li><li>
|
152
|
+
<p>comprehensive documentation that is easy to understand</p>
|
153
|
+
</li><li>
|
154
|
+
<p>high reliability in production environments (100% code coverage)</p>
|
155
|
+
</li><li>
|
156
|
+
<p>forever free to use in commerical applications (MIT licence)</p>
|
157
|
+
</li></ol>
|
158
|
+
|
159
|
+
<h2 id="label-Contributing">Contributing</h2>
|
160
|
+
|
161
|
+
<p>Bug reports and pull requests are welcome on GitHub at <a href="https://github.com/fast-programmer/outboxer">github.com/fast-programmer/outboxer</a>. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the <a href="https://github.com/fast-programmer/outboxer/blob/main/CODE_OF_CONDUCT.md">code of conduct</a>.</p>
|
162
|
+
|
163
|
+
<h2 id="label-License">License</h2>
|
164
|
+
|
165
|
+
<p>The gem is available as open source under the terms of the <a href="https://opensource.org/licenses/MIT">MIT License</a>.</p>
|
166
|
+
|
167
|
+
<h2 id="label-Code+of+Conduct">Code of Conduct</h2>
|
168
|
+
|
169
|
+
<p>Everyone interacting in the Outboxer project's codebases, issue trackers, chat rooms and mailing lists is expected to follow the <a href="https://github.com/fast-programmer/outboxer/blob/main/CODE_OF_CONDUCT.md">code of conduct</a>.</p>
|
170
|
+
</div></div>
|
171
|
+
|
172
|
+
<div id="footer">
|
173
|
+
Generated on Sat Aug 5 04:37:46 2023 by
|
174
|
+
<a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
|
175
|
+
0.9.34 (ruby-2.7.8).
|
176
|
+
</div>
|
177
|
+
|
178
|
+
</div>
|
179
|
+
</body>
|
180
|
+
</html>
|