anchormodel 0.0.1
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 +7 -0
- data/.gitignore +2 -0
- data/.ruby-version +1 -0
- data/.yardopts +1 -0
- data/LICENSE +165 -0
- data/README.md +96 -0
- data/Rakefile +27 -0
- data/anchormodel.gemspec +33 -0
- data/doc/Anchormodel/ActiveModelTypeValue.html +513 -0
- data/doc/Anchormodel/Attribute.html +502 -0
- data/doc/Anchormodel/ModelMixin.html +307 -0
- data/doc/Anchormodel/Version.html +195 -0
- data/doc/Anchormodel.html +846 -0
- data/doc/_index.html +151 -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 +167 -0
- data/doc/file_list.html +56 -0
- data/doc/frames.html +17 -0
- data/doc/index.html +167 -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 +203 -0
- data/doc/top-level-namespace.html +110 -0
- data/lib/anchormodel/active_model_type_value.rb +37 -0
- data/lib/anchormodel/attribute.rb +24 -0
- data/lib/anchormodel/model_mixin.rb +46 -0
- data/lib/anchormodel/version.rb +11 -0
- data/lib/anchormodel.rb +65 -0
- metadata +114 -0
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,167 @@
|
|
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.28
|
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'><h1 id="introducing-anchormodel">Introducing Anchormodel</h1>
|
61
|
+
|
62
|
+
<p>This gem provides a simple but powerful alternative to <a href="https://api.rubyonrails.org/v7.0/classes/ActiveRecord/Enum.html">Rails
|
63
|
+
Enums</a>. In
|
64
|
+
contrast to regular Enums, Anchormodels can hold application logic, making them
|
65
|
+
ideal for tying code to database objects.</p>
|
66
|
+
|
67
|
+
<h1 id="use-case">Use case</h1>
|
68
|
+
|
69
|
+
<p>Typically, a Rails application consists of three kinds of state:</p>
|
70
|
+
|
71
|
+
<ul>
|
72
|
+
<li>The code, which we can consider static within a given version. Code can
|
73
|
+
reference to other code, e.g. <code>node.parent = other_node</code>.</li>
|
74
|
+
<li>The database contents, which can fluctuate within the bounds of the DB schema.
|
75
|
+
Data can reference to other data, ideally via foreign keys.</li>
|
76
|
+
<li>A mix of the two, where code needs to be specifically tailored for some kind
|
77
|
+
of data. A prominent example of such a mix would for instance be user roles:
|
78
|
+
roles must be hardcoded in the code because security logic is tied to them.
|
79
|
+
However, as users are assigned to roles in the database, roles also need to be
|
80
|
+
persisted in the database. This is where Anchormodel comes into play.</li>
|
81
|
+
</ul>
|
82
|
+
|
83
|
+
<h2 id="alternatives-coviering-the-same-use-case">Alternatives coviering the same use case</h2>
|
84
|
+
|
85
|
+
<h3 id="enum">Enum</h3>
|
86
|
+
|
87
|
+
<p>In Rails and other frameworks, the third point in the listing above is typically
|
88
|
+
achieved via Enums. Enums map either Integers or Strings to constants and
|
89
|
+
therefore provide a link between the DB and the application code.</p>
|
90
|
+
|
91
|
+
<p>However, at least in Rails, Enums provide very limited customization options.
|
92
|
+
They are basic values that can be used in if-statements. Anchormodels however
|
93
|
+
are regular classes and can easily be extended.</p>
|
94
|
+
|
95
|
+
<h3 id="activeenum">ActiveEnum</h3>
|
96
|
+
|
97
|
+
<p>The gem (ActiveEnum)[<a href="https://github.com/adzap/active_enum">https://github.com/adzap/active_enum</a>] allows to create
|
98
|
+
Enum-like classes that can be extended. However it only supports Integer keys. I
|
99
|
+
find this unsatisfactory, as debugging with tools like <code>psql</code> or <code>mysql</code> is made
|
100
|
+
unnecessarily hard when you only see numbers. Keys for enums should be
|
101
|
+
meaningful, making you immediately understand what they stand for.</p>
|
102
|
+
|
103
|
+
<p>This is why Anchormodel is strictly relying on String keys corresponding to the
|
104
|
+
entries of an Anchormodel.</p>
|
105
|
+
|
106
|
+
<h1 id="example">Example</h1>
|
107
|
+
|
108
|
+
<p><code>app/anchormodels/role.rb</code>:</p>
|
109
|
+
|
110
|
+
<pre class="code ruby"><code class="ruby"><span class='kw'>class</span> <span class='const'>Anchormodels</span><span class='op'>::</span><span class='const'>Role</span> <span class='op'><</span> <span class='const'><span class='object_link'><a href="Anchormodel.html" title="Anchormodel (class)">Anchormodel</a></span></span>
|
111
|
+
<span class='comment'># Expose the attribute privilege_level
|
112
|
+
</span> <span class='id identifier rubyid_attr_reader'>attr_reader</span> <span class='symbol'>:privilege_level</span>
|
113
|
+
|
114
|
+
<span class='comment'># Overload <=> to make user roles comparable based on the privilege level
|
115
|
+
</span> <span class='kw'>def</span> <span class='op'><=></span><span class='lparen'>(</span><span class='id identifier rubyid_other'>other</span><span class='rparen'>)</span>
|
116
|
+
<span class='id identifier rubyid_other'>other</span><span class='period'>.</span><span class='id identifier rubyid_privilege_level'>privilege_level</span> <span class='op'><=></span> <span class='ivar'>@privilege_level</span>
|
117
|
+
<span class='kw'>end</span>
|
118
|
+
|
119
|
+
<span class='comment'># Declare all available roles
|
120
|
+
</span> <span class='id identifier rubyid_new'>new</span> <span class='symbol'>:guest</span><span class='comma'>,</span> <span class='label'>privilege_level:</span> <span class='int'>0</span>
|
121
|
+
<span class='id identifier rubyid_new'>new</span> <span class='symbol'>:manager</span><span class='comma'>,</span> <span class='label'>privilege_level:</span> <span class='int'>1</span>
|
122
|
+
<span class='id identifier rubyid_new'>new</span> <span class='symbol'>:admin</span><span class='comma'>,</span> <span class='label'>privilege_level:</span> <span class='int'>2</span>
|
123
|
+
<span class='kw'>end</span>
|
124
|
+
</code></pre>
|
125
|
+
|
126
|
+
<p><code>app/models/user.rb</code></p>
|
127
|
+
|
128
|
+
<pre class="code ruby"><code class="ruby"><span class='comment'># The DB table `users` must have a String column `users.role`
|
129
|
+
</span><span class='kw'>class</span> <span class='const'>User</span> <span class='op'><</span> <span class='const'>ApplicationRecord</span>
|
130
|
+
<span class='id identifier rubyid_belongs_to_anchormodel'>belongs_to_anchormodel</span> <span class='symbol'>:role</span>
|
131
|
+
<span class='kw'>end</span>
|
132
|
+
</code></pre>
|
133
|
+
|
134
|
+
<p>You may now use the following methods:</p>
|
135
|
+
|
136
|
+
<pre class="code ruby"><code class="ruby"><span class='comment'># Retrieve all user roles:
|
137
|
+
</span><span class='const'>Anchormodels</span><span class='op'>::</span><span class='const'>Role</span><span class='period'>.</span><span class='id identifier rubyid_all'>all</span>
|
138
|
+
|
139
|
+
<span class='comment'># Retrieve a specific role from the String and find its privilege level
|
140
|
+
</span><span class='const'>Anchormodels</span><span class='op'>::</span><span class='const'>Role</span><span class='period'>.</span><span class='id identifier rubyid_find'>find</span><span class='lparen'>(</span><span class='symbol'>:guest</span><span class='rparen'>)</span><span class='period'>.</span><span class='id identifier rubyid_privilege_level'>privilege_level</span>
|
141
|
+
|
142
|
+
<span class='comment'># Implement a Rails helper that makes sure users can only edit other users that have a lower privilege level than themselves
|
143
|
+
</span><span class='kw'>def</span> <span class='id identifier rubyid_user_can_edit?'>user_can_edit?</span><span class='lparen'>(</span><span class='id identifier rubyid_this_user'>this_user</span><span class='comma'>,</span> <span class='id identifier rubyid_other_user'>other_user</span><span class='rparen'>)</span>
|
144
|
+
<span class='id identifier rubyid_this_user'>this_user</span><span class='period'>.</span><span class='id identifier rubyid_role'>role</span><span class='period'>.</span><span class='id identifier rubyid_privilege_level'>privilege_level</span> <span class='op'>></span> <span class='id identifier rubyid_other_user'>other_user</span><span class='period'>.</span><span class='id identifier rubyid_role'>role</span><span class='period'>.</span><span class='id identifier rubyid_privilege_level'>privilege_level</span>
|
145
|
+
<span class='kw'>end</span>
|
146
|
+
|
147
|
+
<span class='comment'># Pretty print a user's role, e.g. using the Rails FastGettext gem:
|
148
|
+
</span><span class='id identifier rubyid_puts'>puts</span><span class='lparen'>(</span><span class='tstring'><span class='tstring_beg'>"</span><span class='tstring_content'>User </span><span class='embexpr_beg'>#{</span><span class='ivar'>@user</span><span class='period'>.</span><span class='id identifier rubyid_name'>name</span><span class='embexpr_end'>}</span><span class='tstring_content'> has role </span><span class='embexpr_beg'>#{</span><span class='ivar'>@user</span><span class='period'>.</span><span class='id identifier rubyid_role'>role</span><span class='period'>.</span><span class='id identifier rubyid_label'>label</span><span class='embexpr_end'>}</span><span class='tstring_end'>"</span></span><span class='rparen'>)</span>
|
149
|
+
</code></pre>
|
150
|
+
|
151
|
+
<h1 id="installation">Installation</h1>
|
152
|
+
|
153
|
+
<ol>
|
154
|
+
<li>Add gem to Gemfile: <code>gem 'anchormodel'</code></li>
|
155
|
+
<li>In <code>application_record.rb</code>, add in the class body: <code>include Anchormodel::ModelMixin</code></li>
|
156
|
+
</ol>
|
157
|
+
</div></div>
|
158
|
+
|
159
|
+
<div id="footer">
|
160
|
+
Generated on Sat Dec 17 12:56:00 2022 by
|
161
|
+
<a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
|
162
|
+
0.9.28 (ruby-3.0.4).
|
163
|
+
</div>
|
164
|
+
|
165
|
+
</div>
|
166
|
+
</body>
|
167
|
+
</html>
|