anchormodel 0.3.1 → 0.4.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 (43) hide show
  1. checksums.yaml +4 -4
  2. data/.ruby-version +1 -1
  3. data/CHANGELOG.md +14 -0
  4. data/EXAMPLES.md +408 -0
  5. data/Gemfile.lock +1 -1
  6. data/README.md +43 -1
  7. data/VERSION +1 -1
  8. data/anchormodel.gemspec +3 -3
  9. data/bin/test +9 -0
  10. data/doc/Anchormodel/ActiveModelTypeValueMulti.html +204 -42
  11. data/doc/Anchormodel/ActiveModelTypeValueSingle.html +243 -54
  12. data/doc/Anchormodel/Attribute.html +60 -37
  13. data/doc/Anchormodel/ModelMixin.html +166 -16
  14. data/doc/Anchormodel/SimpleFormInputs/Helpers/AnchormodelInputsCommon.html +82 -21
  15. data/doc/Anchormodel/SimpleFormInputs/Helpers.html +2 -11
  16. data/doc/Anchormodel/SimpleFormInputs.html +2 -11
  17. data/doc/Anchormodel/Util.html +497 -38
  18. data/doc/Anchormodel/Version.html +2 -20
  19. data/doc/Anchormodel.html +536 -129
  20. data/doc/AnchormodelCheckBoxesInput.html +22 -1
  21. data/doc/AnchormodelGenerator.html +64 -13
  22. data/doc/AnchormodelInput.html +24 -1
  23. data/doc/AnchormodelRadioButtonsInput.html +22 -1
  24. data/doc/_index.html +16 -1
  25. data/doc/class_list.html +1 -1
  26. data/doc/file.README.html +40 -2
  27. data/doc/index.html +40 -2
  28. data/doc/method_list.html +57 -17
  29. data/doc/top-level-namespace.html +1 -1
  30. data/lib/anchormodel/active_model_type_value_multi.rb +31 -5
  31. data/lib/anchormodel/active_model_type_value_single.rb +34 -6
  32. data/lib/anchormodel/attribute.rb +20 -8
  33. data/lib/anchormodel/model_mixin.rb +43 -8
  34. data/lib/anchormodel/simple_form_inputs/anchormodel_check_boxes_input.rb +7 -0
  35. data/lib/anchormodel/simple_form_inputs/anchormodel_input.rb +9 -0
  36. data/lib/anchormodel/simple_form_inputs/anchormodel_radio_buttons_input.rb +7 -0
  37. data/lib/anchormodel/simple_form_inputs/helpers/anchormodel_inputs_common.rb +14 -0
  38. data/lib/anchormodel/util.rb +102 -17
  39. data/lib/anchormodel.rb +109 -15
  40. data/lib/generators/anchormodel/anchormodel_generator.rb +8 -0
  41. data/test/active_record_model/user_test.rb +221 -10
  42. data/test/dummy/app/anchormodels/animal.rb +1 -0
  43. metadata +3 -1
@@ -103,15 +103,26 @@
103
103
 
104
104
  </div>
105
105
 
106
- <div class="docstring">
106
+ <h2>Overview</h2><div class="docstring">
107
107
  <div class="discussion">
108
108
 
109
+ <p>ActiveModel type adapter for collection-valued anchormodel attributes (<code>belongs_to_anchormodels</code>).</p>
110
+
111
+ <p>Translates between an in-memory <code>Set&lt;Anchormodel&gt;</code> and a CSV <code>String</code> stored in a single DB column. Inherits scalar handling from <span class='object_link'><a href="ActiveModelTypeValueSingle.html" title="Anchormodel::ActiveModelTypeValueSingle (class)">ActiveModelTypeValueSingle</a></span> and overrides the collection-aware methods.</p>
112
+
109
113
 
110
114
  </div>
111
115
  </div>
112
116
  <div class="tags">
113
117
 
114
118
 
119
+ <p class="tag_title">See Also:</p>
120
+ <ul class="see">
121
+
122
+ <li><a href="https://www.rubydoc.info/docs/rails/ActiveModel/Type/Value" target="_parent" title="Rails type interface">Rails type interface</a></li>
123
+
124
+ </ul>
125
+
115
126
  </div>
116
127
 
117
128
 
@@ -135,7 +146,7 @@
135
146
  <li class="public ">
136
147
  <span class="summary_signature">
137
148
 
138
- <a href="#cast-instance_method" title="#cast (instance method)">#<strong>cast</strong>(values) &#x21d2; Object </a>
149
+ <a href="#cast-instance_method" title="#cast (instance method)">#<strong>cast</strong>(values) &#x21d2; Set&lt;Anchormodel&gt; </a>
139
150
 
140
151
 
141
152
 
@@ -150,7 +161,7 @@
150
161
 
151
162
 
152
163
  <span class="summary_desc"><div class='inline'>
153
- <p>This converts DB or input to an Anchormodel instance.</p>
164
+ <p>Splits the stored CSV and casts each entry into an Anchormodel instance.</p>
154
165
  </div></span>
155
166
 
156
167
  </li>
@@ -173,7 +184,9 @@
173
184
 
174
185
 
175
186
 
176
- <span class="summary_desc"><div class='inline'></div></span>
187
+ <span class="summary_desc"><div class='inline'>
188
+ <p>Reports whether <span class='object_link'><a href="#serialize-instance_method" title="Anchormodel::ActiveModelTypeValueMulti#serialize (method)">#serialize</a></span> would accept <code>values</code>.</p>
189
+ </div></span>
177
190
 
178
191
  </li>
179
192
 
@@ -181,7 +194,7 @@
181
194
  <li class="public ">
182
195
  <span class="summary_signature">
183
196
 
184
- <a href="#serialize-instance_method" title="#serialize (instance method)">#<strong>serialize</strong>(values) &#x21d2; Object </a>
197
+ <a href="#serialize-instance_method" title="#serialize (instance method)">#<strong>serialize</strong>(values) &#x21d2; String </a>
185
198
 
186
199
 
187
200
 
@@ -196,7 +209,7 @@
196
209
 
197
210
 
198
211
  <span class="summary_desc"><div class='inline'>
199
- <p>This converts an Anchormodel instance to string for DB.</p>
212
+ <p>Serializes a Set/Array of anchormodel-shaped values into a CSV <code>String</code> for the DB.</p>
200
213
  </div></span>
201
214
 
202
215
  </li>
@@ -232,7 +245,7 @@
232
245
  <div class="method_details first">
233
246
  <h3 class="signature first" id="cast-instance_method">
234
247
 
235
- #<strong>cast</strong>(values) &#x21d2; <tt>Object</tt>
248
+ #<strong>cast</strong>(values) &#x21d2; <tt>Set&lt;<span class='object_link'><a href="../Anchormodel.html" title="Anchormodel (class)">Anchormodel</a></span>&gt;</tt>
236
249
 
237
250
 
238
251
 
@@ -241,13 +254,69 @@
241
254
  </h3><div class="docstring">
242
255
  <div class="discussion">
243
256
 
244
- <p>This converts DB or input to an Anchormodel instance</p>
257
+ <p>Splits the stored CSV and casts each entry into an Anchormodel instance.</p>
245
258
 
246
259
 
247
260
  </div>
248
261
  </div>
249
262
  <div class="tags">
263
+ <p class="tag_title">Parameters:</p>
264
+ <ul class="param">
265
+
266
+ <li>
267
+
268
+ <span class='name'>values</span>
269
+
270
+
271
+ <span class='type'>(<tt>String</tt>, <tt>nil</tt>)</span>
272
+
273
+
274
+
275
+ &mdash;
276
+ <div class='inline'>
277
+ <p>CSV string from the DB, or <code>nil</code> (NULL).</p>
278
+ </div>
279
+
280
+ </li>
281
+
282
+ </ul>
283
+
284
+ <p class="tag_title">Returns:</p>
285
+ <ul class="return">
286
+
287
+ <li>
288
+
289
+
290
+ <span class='type'>(<tt>Set&lt;<span class='object_link'><a href="../Anchormodel.html" title="Anchormodel (class)">Anchormodel</a></span>&gt;</tt>)</span>
291
+
292
+
293
+
294
+ &mdash;
295
+ <div class='inline'>
296
+ <p>Set of Anchormodel instances. Empty when <code>values</code> is nil or <code>&quot;&quot;</code>.</p>
297
+ </div>
298
+
299
+ </li>
300
+
301
+ </ul>
302
+ <p class="tag_title">Raises:</p>
303
+ <ul class="raise">
304
+
305
+ <li>
306
+
307
+
308
+ <span class='type'>(<tt><span class='object_link'><a href="InvalidKey.html" title="Anchormodel::InvalidKey (class)">Anchormodel::InvalidKey</a></span></tt>)</span>
309
+
310
+
311
+
312
+ &mdash;
313
+ <div class='inline'>
314
+ <p>if any CSV entry is not a registered key.</p>
315
+ </div>
316
+
317
+ </li>
250
318
 
319
+ </ul>
251
320
 
252
321
  </div><table class="source_code">
253
322
  <tr>
@@ -255,14 +324,16 @@
255
324
  <pre class="lines">
256
325
 
257
326
 
258
- 3
259
- 4
260
- 5</pre>
327
+ 14
328
+ 15
329
+ 16
330
+ 17</pre>
261
331
  </td>
262
332
  <td>
263
- <pre class="code"><span class="info file"># File 'lib/anchormodel/active_model_type_value_multi.rb', line 3</span>
333
+ <pre class="code"><span class="info file"># File 'lib/anchormodel/active_model_type_value_multi.rb', line 14</span>
264
334
 
265
335
  <span class='kw'>def</span> <span class='id identifier rubyid_cast'>cast</span><span class='lparen'>(</span><span class='id identifier rubyid_values'>values</span><span class='rparen'>)</span>
336
+ <span class='kw'>return</span> <span class='const'>Set</span><span class='period'>.</span><span class='id identifier rubyid_new'>new</span> <span class='kw'>if</span> <span class='id identifier rubyid_values'>values</span><span class='period'>.</span><span class='id identifier rubyid_nil?'>nil?</span>
266
337
  <span class='kw'>return</span> <span class='id identifier rubyid_values'>values</span><span class='period'>.</span><span class='id identifier rubyid_split'>split</span><span class='lparen'>(</span><span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>,</span><span class='tstring_end'>&#39;</span></span><span class='rparen'>)</span><span class='period'>.</span><span class='id identifier rubyid_map'>map</span> <span class='lbrace'>{</span> <span class='op'>|</span><span class='id identifier rubyid_value'>value</span><span class='op'>|</span> <span class='kw'>super</span><span class='lparen'>(</span><span class='id identifier rubyid_value'>value</span><span class='rparen'>)</span> <span class='rbrace'>}</span><span class='period'>.</span><span class='id identifier rubyid_compact'>compact</span><span class='period'>.</span><span class='id identifier rubyid_to_set'>to_set</span>
267
338
  <span class='kw'>end</span></pre>
268
339
  </td>
@@ -282,11 +353,28 @@
282
353
  </h3><div class="docstring">
283
354
  <div class="discussion">
284
355
 
356
+ <p>Reports whether <span class='object_link'><a href="#serialize-instance_method" title="Anchormodel::ActiveModelTypeValueMulti#serialize (method)">#serialize</a></span> would accept <code>values</code>. Returns strict Boolean.</p>
357
+
285
358
 
286
359
  </div>
287
360
  </div>
288
361
  <div class="tags">
362
+ <p class="tag_title">Parameters:</p>
363
+ <ul class="param">
289
364
 
365
+ <li>
366
+
367
+ <span class='name'>values</span>
368
+
369
+
370
+ <span class='type'>(<tt>Object</tt>)</span>
371
+
372
+
373
+
374
+ </li>
375
+
376
+ </ul>
377
+
290
378
  <p class="tag_title">Returns:</p>
291
379
  <ul class="return">
292
380
 
@@ -307,26 +395,30 @@
307
395
  <pre class="lines">
308
396
 
309
397
 
310
- 21
311
- 22
312
- 23
313
- 24
314
- 25
315
- 26
316
- 27
317
- 28
318
- 29
319
- 30</pre>
398
+ 45
399
+ 46
400
+ 47
401
+ 48
402
+ 49
403
+ 50
404
+ 51
405
+ 52
406
+ 53
407
+ 54
408
+ 55
409
+ 56</pre>
320
410
  </td>
321
411
  <td>
322
- <pre class="code"><span class="info file"># File 'lib/anchormodel/active_model_type_value_multi.rb', line 21</span>
412
+ <pre class="code"><span class="info file"># File 'lib/anchormodel/active_model_type_value_multi.rb', line 45</span>
323
413
 
324
414
  <span class='kw'>def</span> <span class='id identifier rubyid_serializable?'>serializable?</span><span class='lparen'>(</span><span class='id identifier rubyid_values'>values</span><span class='rparen'>)</span>
325
415
  <span class='kw'>return</span> <span class='kw'>case</span> <span class='id identifier rubyid_values'>values</span>
326
416
  <span class='kw'>when</span> <span class='const'>Enumerable</span>
327
- <span class='id identifier rubyid_values'>values</span><span class='period'>.</span><span class='id identifier rubyid_map'>map</span> <span class='lbrace'>{</span> <span class='op'>|</span><span class='id identifier rubyid_value'>value</span><span class='op'>|</span> <span class='kw'>super</span><span class='lparen'>(</span><span class='id identifier rubyid_value'>value</span><span class='rparen'>)</span> <span class='rbrace'>}</span><span class='period'>.</span><span class='id identifier rubyid_compact'>compact</span><span class='period'>.</span><span class='id identifier rubyid_join'>join</span><span class='lparen'>(</span><span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>,</span><span class='tstring_end'>&#39;</span></span><span class='rparen'>)</span>
417
+ <span class='id identifier rubyid_values'>values</span><span class='period'>.</span><span class='id identifier rubyid_all?'>all?</span> <span class='lbrace'>{</span> <span class='op'>|</span><span class='id identifier rubyid_value'>value</span><span class='op'>|</span> <span class='kw'>super</span><span class='lparen'>(</span><span class='id identifier rubyid_value'>value</span><span class='rparen'>)</span> <span class='rbrace'>}</span>
328
418
  <span class='kw'>when</span> <span class='const'>String</span>
329
- <span class='id identifier rubyid_values'>values</span><span class='period'>.</span><span class='id identifier rubyid_split'>split</span><span class='lparen'>(</span><span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>,</span><span class='tstring_end'>&#39;</span></span><span class='rparen'>)</span><span class='period'>.</span><span class='id identifier rubyid_map'>map</span> <span class='lbrace'>{</span> <span class='op'>|</span><span class='id identifier rubyid_value'>value</span><span class='op'>|</span> <span class='kw'>super</span><span class='lparen'>(</span><span class='id identifier rubyid_value'>value</span><span class='rparen'>)</span> <span class='rbrace'>}</span><span class='period'>.</span><span class='id identifier rubyid_compact'>compact</span>
419
+ <span class='id identifier rubyid_values'>values</span><span class='period'>.</span><span class='id identifier rubyid_split'>split</span><span class='lparen'>(</span><span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>,</span><span class='tstring_end'>&#39;</span></span><span class='rparen'>)</span><span class='period'>.</span><span class='id identifier rubyid_all?'>all?</span> <span class='lbrace'>{</span> <span class='op'>|</span><span class='id identifier rubyid_value'>value</span><span class='op'>|</span> <span class='kw'>super</span><span class='lparen'>(</span><span class='id identifier rubyid_value'>value</span><span class='rparen'>)</span> <span class='rbrace'>}</span>
420
+ <span class='kw'>when</span> <span class='kw'>nil</span>
421
+ <span class='kw'>true</span>
330
422
  <span class='kw'>else</span>
331
423
  <span class='kw'>false</span>
332
424
  <span class='kw'>end</span>
@@ -339,7 +431,7 @@
339
431
  <div class="method_details ">
340
432
  <h3 class="signature " id="serialize-instance_method">
341
433
 
342
- #<strong>serialize</strong>(values) &#x21d2; <tt>Object</tt>
434
+ #<strong>serialize</strong>(values) &#x21d2; <tt>String</tt>
343
435
 
344
436
 
345
437
 
@@ -348,13 +440,83 @@
348
440
  </h3><div class="docstring">
349
441
  <div class="discussion">
350
442
 
351
- <p>This converts an Anchormodel instance to string for DB</p>
443
+ <p>Serializes a Set/Array of anchormodel-shaped values into a CSV <code>String</code> for the DB. Validates every entry and raises immediately on invalid keys (rather than deferring the error to the next read).</p>
352
444
 
353
445
 
354
446
  </div>
355
447
  </div>
356
448
  <div class="tags">
449
+ <p class="tag_title">Parameters:</p>
450
+ <ul class="param">
451
+
452
+ <li>
453
+
454
+ <span class='name'>values</span>
455
+
456
+
457
+ <span class='type'>(<tt>Enumerable</tt>, <tt>String</tt>, <tt>nil</tt>)</span>
458
+
459
+
460
+
461
+ &mdash;
462
+ <div class='inline'>
463
+ <p>Collection of anchormodel-shaped values, a pre-formed CSV <code>String</code>, or <code>nil</code>.</p>
464
+ </div>
465
+
466
+ </li>
357
467
 
468
+ </ul>
469
+
470
+ <p class="tag_title">Returns:</p>
471
+ <ul class="return">
472
+
473
+ <li>
474
+
475
+
476
+ <span class='type'>(<tt>String</tt>)</span>
477
+
478
+
479
+
480
+ &mdash;
481
+ <div class='inline'>
482
+ <p>CSV of validated keys, or <code>&quot;&quot;</code> for nil / empty collection.</p>
483
+ </div>
484
+
485
+ </li>
486
+
487
+ </ul>
488
+ <p class="tag_title">Raises:</p>
489
+ <ul class="raise">
490
+
491
+ <li>
492
+
493
+
494
+ <span class='type'>(<tt><span class='object_link'><a href="InvalidKey.html" title="Anchormodel::InvalidKey (class)">Anchormodel::InvalidKey</a></span></tt>)</span>
495
+
496
+
497
+
498
+ &mdash;
499
+ <div class='inline'>
500
+ <p>if any element is an unknown key.</p>
501
+ </div>
502
+
503
+ </li>
504
+
505
+ <li>
506
+
507
+
508
+ <span class='type'>(<tt>RuntimeError</tt>)</span>
509
+
510
+
511
+
512
+ &mdash;
513
+ <div class='inline'>
514
+ <p>if <code>values</code> is not an Enumerable, String, or <code>nil</code>.</p>
515
+ </div>
516
+
517
+ </li>
518
+
519
+ </ul>
358
520
 
359
521
  </div><table class="source_code">
360
522
  <tr>
@@ -362,28 +524,28 @@
362
524
  <pre class="lines">
363
525
 
364
526
 
365
- 8
366
- 9
367
- 10
368
- 11
369
- 12
370
- 13
371
- 14
372
- 15
373
- 16
374
- 17
375
- 18
376
- 19</pre>
527
+ 28
528
+ 29
529
+ 30
530
+ 31
531
+ 32
532
+ 33
533
+ 34
534
+ 35
535
+ 36
536
+ 37
537
+ 38
538
+ 39</pre>
377
539
  </td>
378
540
  <td>
379
- <pre class="code"><span class="info file"># File 'lib/anchormodel/active_model_type_value_multi.rb', line 8</span>
541
+ <pre class="code"><span class="info file"># File 'lib/anchormodel/active_model_type_value_multi.rb', line 28</span>
380
542
 
381
543
  <span class='kw'>def</span> <span class='id identifier rubyid_serialize'>serialize</span><span class='lparen'>(</span><span class='id identifier rubyid_values'>values</span><span class='rparen'>)</span>
382
544
  <span class='kw'>return</span> <span class='kw'>case</span> <span class='id identifier rubyid_values'>values</span>
383
545
  <span class='kw'>when</span> <span class='const'>Enumerable</span>
384
546
  <span class='id identifier rubyid_values'>values</span><span class='period'>.</span><span class='id identifier rubyid_map'>map</span> <span class='lbrace'>{</span> <span class='op'>|</span><span class='id identifier rubyid_value'>value</span><span class='op'>|</span> <span class='kw'>super</span><span class='lparen'>(</span><span class='id identifier rubyid_value'>value</span><span class='rparen'>)</span> <span class='rbrace'>}</span><span class='period'>.</span><span class='id identifier rubyid_compact'>compact</span><span class='period'>.</span><span class='id identifier rubyid_join'>join</span><span class='lparen'>(</span><span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>,</span><span class='tstring_end'>&#39;</span></span><span class='rparen'>)</span>
385
547
  <span class='kw'>when</span> <span class='const'>String</span>
386
- <span class='id identifier rubyid_values'>values</span>
548
+ <span class='id identifier rubyid_values'>values</span><span class='period'>.</span><span class='id identifier rubyid_split'>split</span><span class='lparen'>(</span><span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>,</span><span class='tstring_end'>&#39;</span></span><span class='rparen'>)</span><span class='period'>.</span><span class='id identifier rubyid_map'>map</span> <span class='lbrace'>{</span> <span class='op'>|</span><span class='id identifier rubyid_value'>value</span><span class='op'>|</span> <span class='kw'>super</span><span class='lparen'>(</span><span class='id identifier rubyid_value'>value</span><span class='rparen'>)</span> <span class='rbrace'>}</span><span class='period'>.</span><span class='id identifier rubyid_compact'>compact</span><span class='period'>.</span><span class='id identifier rubyid_join'>join</span><span class='lparen'>(</span><span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>,</span><span class='tstring_end'>&#39;</span></span><span class='rparen'>)</span>
387
549
  <span class='kw'>when</span> <span class='kw'>nil</span>
388
550
  <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_end'>&#39;</span></span>
389
551
  <span class='kw'>else</span>
@@ -400,7 +562,7 @@
400
562
  </div>
401
563
 
402
564
  <div id="footer">
403
- Generated on Wed May 13 11:46:10 2026 by
565
+ Generated on Wed May 13 15:48:25 2026 by
404
566
  <a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
405
567
  0.9.28 (ruby-3.3.5).
406
568
  </div>