loggable_activity 0.1.54 → 0.1.55
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/GETTING-STARTED.md +2 -2
- data/docs/LoggableActivity/Activity.html +108 -139
- data/docs/LoggableActivity/Configuration.html +3 -3
- data/docs/LoggableActivity/Encryption.html +7 -4
- data/docs/LoggableActivity/EncryptionKey.html +4 -2
- data/docs/LoggableActivity/Hooks.html +37 -37
- data/docs/LoggableActivity/Payload.html +32 -6
- data/docs/LoggableActivity/PayloadsBuilder.html +14 -11
- data/docs/LoggableActivity/UpdatePayloadsBuilder.html +27 -26
- data/docs/LoggableActivity.html +3 -1
- data/docs/created.rid +10 -10
- data/docs/js/search_index.js +1 -1
- data/docs/js/search_index.js.gz +0 -0
- data/docs/table_of_contents.html +14 -4
- data/lib/generators/loggable_activity/.DS_Store +0 -0
- data/lib/generators/loggable_activity/templates/create_loggable_activities.rb +1 -0
- data/lib/generators/loggable_activity/templates/helpers/loggable_activity_helper.rb +2 -2
- data/lib/generators/loggable_activity/templates/loggable_activity_helper.rb +14 -5
- data/lib/loggable_activity/activity.rb +56 -107
- data/lib/loggable_activity/configuration.rb +1 -0
- data/lib/loggable_activity/encryption.rb +6 -2
- data/lib/loggable_activity/encryption_key.rb +2 -0
- data/lib/loggable_activity/hooks.rb +20 -1
- data/lib/loggable_activity/payload.rb +7 -0
- data/lib/loggable_activity/payloads_builder.rb +6 -3
- data/lib/loggable_activity/update_payloads_builder.rb +17 -7
- data/lib/loggable_activity/version.rb +3 -1
- data/lib/loggable_activity.rb +0 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2e2ab2f4d7ec08a5f53176ae3e3289b8470c5cc39013a1bc48e06c3b596f11ee
|
4
|
+
data.tar.gz: 3c5037f59fc9e408fd693afbd3208f530b52cb4f3791b91f8dfad603a66e2513
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 017f1f1418adb7acd44ed3af4cd08ccdcc396dc9d61c63b2b584c994b46018923832155a1ae64361a8d75c5414257591ff174e33696c356c844c241063343c14
|
7
|
+
data.tar.gz: 2da5d2b4981ad8470f6ed75b2710c6e75f36d19dafb99496cc0e49f1e7c2a0f008b94d234780c693e6eb841437ffa6933f7abd133526a6c9eec56b8e75fa1259
|
data/GETTING-STARTED.md
CHANGED
@@ -116,7 +116,7 @@ $ rails g loggable_activity:install_templates
|
|
116
116
|
```
|
117
117
|
or for the slim template language. (don't run both)
|
118
118
|
```
|
119
|
-
$ rails g loggable_activity:install_templates --template=
|
119
|
+
$ rails g loggable_activity:install_templates --template=slim
|
120
120
|
```
|
121
121
|
Now you got the `loggable_activity_helper.rb' installed.<br/>
|
122
122
|
You can use the `render_activity` method from your view like this.
|
@@ -155,4 +155,4 @@ end
|
|
155
155
|
If you can download and play around with a demo app
|
156
156
|
- 1 Down the demo project from [demo project on github](https://github.com/maxgronlund/LoggableActivityDemoApp)
|
157
157
|
- 2 Update the Gemfile in the demo project so it points to your localhost.
|
158
|
-
- 3 you can now build and test you version of the gem `$ gem build loggable_activity.gemspec`
|
158
|
+
- 3 you can now build and test you version of the gem `$ gem build loggable_activity.gemspec`
|
@@ -80,6 +80,7 @@
|
|
80
80
|
<li ><a href="#method-i-attrs">#attrs</a>
|
81
81
|
<li ><a href="#method-i-must_have_at_least_one_payload">#must_have_at_least_one_payload</a>
|
82
82
|
<li ><a href="#method-i-ordered_payloads">#ordered_payloads</a>
|
83
|
+
<li ><a href="#method-i-path">#path</a>
|
83
84
|
<li ><a href="#method-i-previous_associations_attrs">#previous_associations_attrs</a>
|
84
85
|
<li ><a href="#method-i-primary_payload">#primary_payload</a>
|
85
86
|
<li ><a href="#method-i-primary_payload_attrs">#primary_payload_attrs</a>
|
@@ -130,7 +131,7 @@
|
|
130
131
|
<p>Returns a list of activities for a given actor.</p>
|
131
132
|
|
132
133
|
<div class="method-source-code" id="activities_for_actor-source">
|
133
|
-
<pre><span class="ruby-comment"># File lib/loggable_activity/activity.rb, line
|
134
|
+
<pre><span class="ruby-comment"># File lib/loggable_activity/activity.rb, line 155</span>
|
134
135
|
<span class="ruby-keyword">def</span> <span class="ruby-keyword">self</span>.<span class="ruby-identifier ruby-title">activities_for_actor</span>(<span class="ruby-identifier">actor</span>, <span class="ruby-identifier">limit</span> = <span class="ruby-value">20</span>, <span class="ruby-identifier">params</span> = { <span class="ruby-value">offset:</span> <span class="ruby-value">0</span> })
|
135
136
|
<span class="ruby-constant">LoggableActivity</span><span class="ruby-operator">::</span><span class="ruby-constant">Activity</span>.<span class="ruby-identifier">latest</span>(<span class="ruby-identifier">limit</span>, <span class="ruby-identifier">params</span>).<span class="ruby-identifier">where</span>(<span class="ruby-value">actor:</span>)
|
136
137
|
<span class="ruby-keyword">end</span></pre>
|
@@ -153,7 +154,7 @@
|
|
153
154
|
<p>Returns the last activity.</p>
|
154
155
|
|
155
156
|
<div class="method-source-code" id="last-source">
|
156
|
-
<pre><span class="ruby-comment"># File lib/loggable_activity/activity.rb, line
|
157
|
+
<pre><span class="ruby-comment"># File lib/loggable_activity/activity.rb, line 171</span>
|
157
158
|
<span class="ruby-keyword">def</span> <span class="ruby-keyword">self</span>.<span class="ruby-identifier ruby-title">last</span>(<span class="ruby-identifier">limit</span> = <span class="ruby-value">1</span>)
|
158
159
|
<span class="ruby-keyword">return</span> <span class="ruby-identifier">latest</span>(<span class="ruby-value">1</span>).<span class="ruby-identifier">first</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">limit</span> <span class="ruby-operator">==</span> <span class="ruby-value">1</span>
|
159
160
|
|
@@ -178,7 +179,7 @@
|
|
178
179
|
<p>Returns a list of activities ordered by creation date.</p>
|
179
180
|
|
180
181
|
<div class="method-source-code" id="latest-source">
|
181
|
-
<pre><span class="ruby-comment"># File lib/loggable_activity/activity.rb, line
|
182
|
+
<pre><span class="ruby-comment"># File lib/loggable_activity/activity.rb, line 160</span>
|
182
183
|
<span class="ruby-keyword">def</span> <span class="ruby-keyword">self</span>.<span class="ruby-identifier ruby-title">latest</span>(<span class="ruby-identifier">limit</span> = <span class="ruby-value">20</span>, <span class="ruby-identifier">params</span> = { <span class="ruby-value">offset:</span> <span class="ruby-value">0</span> })
|
183
184
|
<span class="ruby-identifier">offset</span> = <span class="ruby-identifier">params</span>[<span class="ruby-value">:offset</span>] <span class="ruby-operator">||</span> <span class="ruby-value">0</span>
|
184
185
|
<span class="ruby-constant">LoggableActivity</span><span class="ruby-operator">::</span><span class="ruby-constant">Activity</span>
|
@@ -224,7 +225,7 @@
|
|
224
225
|
</pre>
|
225
226
|
|
226
227
|
<div class="method-source-code" id="actor_display_name-source">
|
227
|
-
<pre><span class="ruby-comment"># File lib/loggable_activity/activity.rb, line
|
228
|
+
<pre><span class="ruby-comment"># File lib/loggable_activity/activity.rb, line 148</span>
|
228
229
|
<span class="ruby-keyword">def</span> <span class="ruby-identifier ruby-title">actor_display_name</span>
|
229
230
|
<span class="ruby-keyword">return</span> <span class="ruby-constant">I18n</span>.<span class="ruby-identifier">t</span>(<span class="ruby-string">'loggable.activity.deleted'</span>) <span class="ruby-keyword">if</span> <span class="ruby-identifier">encrypted_actor_display_name</span>.<span class="ruby-identifier">nil?</span>
|
230
231
|
|
@@ -246,63 +247,40 @@
|
|
246
247
|
</div>
|
247
248
|
|
248
249
|
<div class="method-description">
|
249
|
-
<p>Returns
|
250
|
+
<p>Returns an array of hashes, each representing an activity’s attributes and its associated relations. The structure and relations to include are specified in ‘config/loggable_activity.yaml’. This format is designed for UI display purposes.</p>
|
250
251
|
|
251
|
-
<p>
|
252
|
+
<p>Each hash in the array contains:</p>
|
253
|
+
<ul><li>
|
254
|
+
<p>:record_type: The class name of the record.</p>
|
255
|
+
</li><li>
|
256
|
+
<p>:payload_type: A descriptor of the payload’s role (e.g., ‘primary_payload’ or ‘current_association’).</p>
|
257
|
+
</li><li>
|
258
|
+
<p>:attrs: A hash of the record’s attributes.</p>
|
259
|
+
</li></ul>
|
260
|
+
|
261
|
+
<p>Example usage:</p>
|
252
262
|
|
253
263
|
<pre class="ruby"><span class="ruby-ivar">@activity</span>.<span class="ruby-identifier">attrs</span>
|
254
264
|
</pre>
|
255
265
|
|
256
|
-
<p>
|
266
|
+
<p>Sample return value:</p>
|
257
267
|
|
258
|
-
<pre
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
<span class="ruby-string">"first_name"</span> <span class="ruby-operator">=></span> <span class="ruby-string">"David"</span>,
|
264
|
-
<span class="ruby-string">"last_name"</span> <span class="ruby-operator">=></span> <span class="ruby-string">"Bowie"</span>,
|
265
|
-
<span class="ruby-string">"age"</span> <span class="ruby-operator">=></span> <span class="ruby-string">"69"</span>,
|
266
|
-
<span class="ruby-string">"email"</span> <span class="ruby-operator">=></span> <span class="ruby-string">"david@example.com"</span>,
|
267
|
-
<span class="ruby-string">"user_type"</span> <span class="ruby-operator">=></span> <span class="ruby-string">"Patient"</span>
|
268
|
-
}
|
269
|
-
},
|
270
|
-
{
|
271
|
-
<span class="ruby-value">record_class:</span> <span class="ruby-string">"Demo::UserProfile"</span>,
|
272
|
-
<span class="ruby-value">payload_type:</span> <span class="ruby-string">"current_association"</span>,
|
273
|
-
<span class="ruby-value">attrs:</span> {
|
274
|
-
<span class="ruby-string">"sex"</span> <span class="ruby-operator">=></span> <span class="ruby-string">"Male"</span>,
|
275
|
-
<span class="ruby-string">"religion"</span> <span class="ruby-operator">=></span> <span class="ruby-string">"Agnostic"</span>
|
276
|
-
}
|
277
|
-
},
|
278
|
-
{
|
279
|
-
<span class="ruby-value">record_class:</span> <span class="ruby-string">"Demo::Address"</span>,
|
280
|
-
<span class="ruby-value">payload_type:</span> <span class="ruby-string">"current_association"</span>,
|
281
|
-
<span class="ruby-value">attrs:</span> {
|
282
|
-
<span class="ruby-string">"street"</span> <span class="ruby-operator">=></span> <span class="ruby-string">"Eiffel Tower"</span>,
|
283
|
-
<span class="ruby-string">"city"</span> <span class="ruby-operator">=></span> <span class="ruby-string">"Paris"</span>,
|
284
|
-
<span class="ruby-string">"country"</span> <span class="ruby-operator">=></span> <span class="ruby-string">"France"</span>,
|
285
|
-
<span class="ruby-string">"postal_code"</span> <span class="ruby-operator">=></span> <span class="ruby-string">"75007"</span>
|
286
|
-
}
|
287
|
-
},
|
288
|
-
{
|
289
|
-
<span class="ruby-value">record_class:</span> <span class="ruby-string">"Demo::Club"</span>,
|
290
|
-
<span class="ruby-value">payload_type:</span> <span class="ruby-string">"current_association"</span>,
|
291
|
-
<span class="ruby-value">attrs:</span> {
|
292
|
-
<span class="ruby-string">"name"</span> <span class="ruby-operator">=></span> <span class="ruby-string">"Mystic Fusion Lounge"</span>
|
293
|
-
}
|
294
|
-
}
|
295
|
-
]
|
296
|
-
</pre>
|
268
|
+
<pre>[
|
269
|
+
{ record_type: MODEL_NAME, payload_type: "primary_payload", attrs: { "KEY" => "VALUE", ... } },
|
270
|
+
{ record_type: MODEL_NAME, payload_type: "current_association", attrs: { "KEY" => "VALUE", ... } },
|
271
|
+
...
|
272
|
+
]</pre>
|
297
273
|
|
298
274
|
<div class="method-source-code" id="attrs-source">
|
299
|
-
<pre><span class="ruby-comment"># File lib/loggable_activity/activity.rb, line
|
275
|
+
<pre><span class="ruby-comment"># File lib/loggable_activity/activity.rb, line 37</span>
|
300
276
|
<span class="ruby-keyword">def</span> <span class="ruby-identifier ruby-title">attrs</span>
|
301
277
|
<span class="ruby-identifier">ordered_payloads</span>.<span class="ruby-identifier">map</span> <span class="ruby-keyword">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">payload</span><span class="ruby-operator">|</span>
|
302
278
|
{
|
303
|
-
<span class="ruby-value">
|
279
|
+
<span class="ruby-value">record_type:</span> <span class="ruby-identifier">payload</span>.<span class="ruby-identifier">record_type</span>,
|
280
|
+
<span class="ruby-value">record_id:</span> <span class="ruby-identifier">payload</span>.<span class="ruby-identifier">record_id</span>,
|
304
281
|
<span class="ruby-value">payload_type:</span> <span class="ruby-identifier">payload</span>.<span class="ruby-identifier">payload_type</span>,
|
305
|
-
<span class="ruby-value">attrs:</span> <span class="ruby-identifier">payload</span>.<span class="ruby-identifier">attrs</span
|
282
|
+
<span class="ruby-value">attrs:</span> <span class="ruby-identifier">payload</span>.<span class="ruby-identifier">attrs</span>,
|
283
|
+
<span class="ruby-value">path:</span> <span class="ruby-identifier">payload</span>.<span class="ruby-identifier">payload_route</span>
|
306
284
|
}
|
307
285
|
<span class="ruby-keyword">end</span>
|
308
286
|
<span class="ruby-keyword">end</span></pre>
|
@@ -310,6 +288,39 @@
|
|
310
288
|
</div>
|
311
289
|
|
312
290
|
|
291
|
+
</div>
|
292
|
+
|
293
|
+
<div id="method-i-path" class="method-detail ">
|
294
|
+
<div class="method-header">
|
295
|
+
<div class="method-heading">
|
296
|
+
<span class="method-name">path</span><span
|
297
|
+
class="method-args">()</span>
|
298
|
+
<span class="method-click-advice">click to toggle source</span>
|
299
|
+
</div>
|
300
|
+
</div>
|
301
|
+
|
302
|
+
<div class="method-description">
|
303
|
+
<p>Returns the path for the activity.</p>
|
304
|
+
|
305
|
+
<p>Example:</p>
|
306
|
+
|
307
|
+
<pre class="ruby"><span class="ruby-ivar">@activity</span>.<span class="ruby-identifier">path</span>
|
308
|
+
</pre>
|
309
|
+
|
310
|
+
<p>Returns:</p>
|
311
|
+
|
312
|
+
<pre class="ruby"><span class="ruby-string">"/path/to/activity"</span>
|
313
|
+
</pre>
|
314
|
+
|
315
|
+
<div class="method-source-code" id="path-source">
|
316
|
+
<pre><span class="ruby-comment"># File lib/loggable_activity/activity.rb, line 135</span>
|
317
|
+
<span class="ruby-keyword">def</span> <span class="ruby-identifier ruby-title">path</span>
|
318
|
+
<span class="ruby-identifier">primary_payload</span>&.<span class="ruby-identifier">route</span>
|
319
|
+
<span class="ruby-keyword">end</span></pre>
|
320
|
+
</div>
|
321
|
+
</div>
|
322
|
+
|
323
|
+
|
313
324
|
</div>
|
314
325
|
|
315
326
|
<div id="method-i-primary_payload_attrs" class="method-detail ">
|
@@ -331,17 +342,10 @@
|
|
331
342
|
|
332
343
|
<p>Returns:</p>
|
333
344
|
|
334
|
-
<pre
|
335
|
-
<span class="ruby-string">"first_name"</span> <span class="ruby-operator">=></span> <span class="ruby-string">"David"</span>,
|
336
|
-
<span class="ruby-string">"last_name"</span> <span class="ruby-operator">=></span> <span class="ruby-string">"Bowie"</span>,
|
337
|
-
<span class="ruby-string">"age"</span> <span class="ruby-operator">=></span> <span class="ruby-string">"69"</span>,
|
338
|
-
<span class="ruby-string">"email"</span> <span class="ruby-operator">=></span> <span class="ruby-string">"david@example.com"</span>,
|
339
|
-
<span class="ruby-string">"user_type"</span> <span class="ruby-operator">=></span> <span class="ruby-string">"Patient"</span>
|
340
|
-
}
|
341
|
-
</pre>
|
345
|
+
<pre>{ "KEY_A" => "VALUE_A", "KEY_B" => "VALUE_B", ... }</pre>
|
342
346
|
|
343
347
|
<div class="method-source-code" id="primary_payload_attrs-source">
|
344
|
-
<pre><span class="ruby-comment"># File lib/loggable_activity/activity.rb, line
|
348
|
+
<pre><span class="ruby-comment"># File lib/loggable_activity/activity.rb, line 88</span>
|
345
349
|
<span class="ruby-keyword">def</span> <span class="ruby-identifier ruby-title">primary_payload_attrs</span>
|
346
350
|
<span class="ruby-identifier">primary_payload</span> <span class="ruby-operator">?</span> <span class="ruby-identifier">primary_payload</span>.<span class="ruby-identifier">attrs</span> <span class="ruby-operator">:</span> {}
|
347
351
|
<span class="ruby-keyword">end</span></pre>
|
@@ -374,7 +378,7 @@
|
|
374
378
|
</pre>
|
375
379
|
|
376
380
|
<div class="method-source-code" id="record_display_name-source">
|
377
|
-
<pre><span class="ruby-comment"># File lib/loggable_activity/activity.rb, line
|
381
|
+
<pre><span class="ruby-comment"># File lib/loggable_activity/activity.rb, line 120</span>
|
378
382
|
<span class="ruby-keyword">def</span> <span class="ruby-identifier ruby-title">record_display_name</span>
|
379
383
|
<span class="ruby-keyword">return</span> <span class="ruby-constant">I18n</span>.<span class="ruby-identifier">t</span>(<span class="ruby-string">'loggable.activity.deleted'</span>) <span class="ruby-keyword">if</span> <span class="ruby-identifier">encrypted_record_display_name</span>.<span class="ruby-identifier">nil?</span>
|
380
384
|
|
@@ -405,24 +409,17 @@
|
|
405
409
|
|
406
410
|
<p>Returns:</p>
|
407
411
|
|
408
|
-
<pre
|
412
|
+
<pre>[
|
409
413
|
{
|
410
|
-
|
411
|
-
|
412
|
-
|
413
|
-
|
414
|
-
<span class="ruby-value">attrs:</span> {
|
415
|
-
<span class="ruby-string">"street"</span> <span class="ruby-operator">=></span> <span class="ruby-string">"The Palace of Versailles"</span>,
|
416
|
-
<span class="ruby-string">"city"</span> <span class="ruby-operator">=></span> <span class="ruby-string">"Versailles"</span>,
|
417
|
-
<span class="ruby-string">"country"</span> <span class="ruby-operator">=></span> <span class="ruby-string">"France"</span>,
|
418
|
-
<span class="ruby-string">"postal_code"</span> <span class="ruby-operator">=></span> <span class="ruby-string">"78000"</span>
|
419
|
-
}
|
414
|
+
record_type: CLASS.NAME,
|
415
|
+
record_id: INTEGER,
|
416
|
+
payload_type: ENUM
|
417
|
+
attrs: { "KEY_A" => "VALUE_A", "KEY_B" => "VALUE_B", ... }
|
420
418
|
}
|
421
|
-
]
|
422
|
-
</pre>
|
419
|
+
]</pre>
|
423
420
|
|
424
421
|
<div class="method-source-code" id="relations_attrs-source">
|
425
|
-
<pre><span class="ruby-comment"># File lib/loggable_activity/activity.rb, line
|
422
|
+
<pre><span class="ruby-comment"># File lib/loggable_activity/activity.rb, line 107</span>
|
426
423
|
<span class="ruby-keyword">def</span> <span class="ruby-identifier ruby-title">relations_attrs</span>
|
427
424
|
<span class="ruby-identifier">attrs</span>.<span class="ruby-identifier">filter</span> { <span class="ruby-operator">|</span><span class="ruby-identifier">p</span><span class="ruby-operator">|</span> <span class="ruby-identifier">p</span>[<span class="ruby-value">:payload_type</span>] <span class="ruby-operator">==</span> <span class="ruby-string">'current_association'</span> }
|
428
425
|
<span class="ruby-keyword">end</span></pre>
|
@@ -442,66 +439,38 @@
|
|
442
439
|
</div>
|
443
440
|
|
444
441
|
<div class="method-description">
|
445
|
-
<p>Returns the attributes of an
|
442
|
+
<p>Returns a hash describing the attributes of an update activity, including updated attributes for a record and any updated related attributes.</p>
|
446
443
|
|
447
444
|
<p>Example:</p>
|
448
445
|
|
449
446
|
<pre class="ruby"><span class="ruby-ivar">@activity</span>.<span class="ruby-identifier">update_activity_attrs</span>
|
450
447
|
</pre>
|
451
448
|
|
452
|
-
<p>
|
449
|
+
<p>The return value is structured as follows:</p>
|
450
|
+
<ul><li>
|
451
|
+
<p>:update_attrs contains the attributes of the record being updated, detailing changes from previous to new values.</p>
|
452
|
+
</li><li>
|
453
|
+
<p>:updated_relations_attrs is an array of hashes, each representing an updated related record. Each hash details the previous and current attributes of the relation.</p>
|
454
|
+
</li></ul>
|
455
|
+
|
456
|
+
<p>Example Return Structure:</p>
|
453
457
|
|
454
|
-
<pre
|
455
|
-
|
456
|
-
|
457
|
-
|
458
|
-
<span class="ruby-value">attrs:</span> [
|
459
|
-
{
|
460
|
-
<span class="ruby-string">"name"</span> <span class="ruby-operator">=></span> {
|
461
|
-
<span class="ruby-comment"># Previous name</span>
|
462
|
-
<span class="ruby-value">from:</span> <span class="ruby-string">"Electric Oasis Club"</span>,
|
463
|
-
<span class="ruby-comment"># New name</span>
|
464
|
-
<span class="ruby-value">to:</span> <span class="ruby-string">"Electric Oasis Club nr 5"</span>
|
465
|
-
}
|
466
|
-
}
|
467
|
-
]
|
458
|
+
<pre>{
|
459
|
+
update_attrs: {
|
460
|
+
record_class: "CLASS.NAME",
|
461
|
+
attrs: [{ "KEY" => { from: "OLD_VALUE", to: "NEW_VALUE" } }]
|
468
462
|
},
|
469
|
-
|
470
|
-
<span class="ruby-value">updated_relations_attrs:</span> [
|
463
|
+
updated_relations_attrs: [
|
471
464
|
{
|
472
|
-
|
473
|
-
|
474
|
-
|
475
|
-
<span class="ruby-value">record_class:</span> <span class="ruby-string">"Demo::Address"</span>,
|
476
|
-
<span class="ruby-comment"># Previous association payload type</span>
|
477
|
-
<span class="ruby-value">payload_type:</span> <span class="ruby-string">"previous_association"</span>,
|
478
|
-
<span class="ruby-comment"># Previous attributes for Demo::Address</span>
|
479
|
-
<span class="ruby-value">attrs:</span> {
|
480
|
-
<span class="ruby-string">"street"</span> <span class="ruby-operator">=></span> <span class="ruby-string">"Ice Hotel, Marknadsvägen 63"</span>,
|
481
|
-
<span class="ruby-string">"city"</span> <span class="ruby-operator">=></span> <span class="ruby-string">"Jukkasjärvi"</span>,
|
482
|
-
<span class="ruby-string">"country"</span> <span class="ruby-operator">=></span> <span class="ruby-string">"Sweden"</span>,
|
483
|
-
<span class="ruby-string">"postal_code"</span> <span class="ruby-operator">=></span> <span class="ruby-string">"981 91"</span>
|
484
|
-
}
|
485
|
-
},
|
486
|
-
<span class="ruby-value">current_attrs:</span> {
|
487
|
-
<span class="ruby-value">record_class:</span> <span class="ruby-string">"Demo::Address"</span>,
|
488
|
-
<span class="ruby-comment"># Current association payload type</span>
|
489
|
-
<span class="ruby-value">payload_type:</span> <span class="ruby-string">"current_association"</span>,
|
490
|
-
<span class="ruby-comment"># Current attributes for Demo::Address</span>
|
491
|
-
<span class="ruby-value">attrs:</span> {
|
492
|
-
<span class="ruby-string">"street"</span> <span class="ruby-operator">=></span> <span class="ruby-string">"The Palace of Versailles"</span>,
|
493
|
-
<span class="ruby-string">"city"</span> <span class="ruby-operator">=></span> <span class="ruby-string">"Versailles"</span>,
|
494
|
-
<span class="ruby-string">"country"</span> <span class="ruby-operator">=></span> <span class="ruby-string">"France"</span>,
|
495
|
-
<span class="ruby-string">"postal_code"</span> <span class="ruby-operator">=></span> <span class="ruby-string">"78000"</span>
|
496
|
-
}
|
497
|
-
}
|
465
|
+
record_class: "CLASS.NAME",
|
466
|
+
previous_attrs: { attrs: { "KEY" => "VALUE", ... } },
|
467
|
+
current_attrs: { attrs: { "KEY" => "VALUE", ... } }
|
498
468
|
}
|
499
469
|
]
|
500
|
-
}
|
501
|
-
</pre>
|
470
|
+
}</pre>
|
502
471
|
|
503
472
|
<div class="method-source-code" id="update_activity_attrs-source">
|
504
|
-
<pre><span class="ruby-comment"># File lib/loggable_activity/activity.rb, line
|
473
|
+
<pre><span class="ruby-comment"># File lib/loggable_activity/activity.rb, line 72</span>
|
505
474
|
<span class="ruby-keyword">def</span> <span class="ruby-identifier ruby-title">update_activity_attrs</span>
|
506
475
|
{
|
507
476
|
<span class="ruby-value">update_attrs:</span>,
|
@@ -531,10 +500,10 @@
|
|
531
500
|
</div>
|
532
501
|
|
533
502
|
<div class="method-description">
|
534
|
-
|
503
|
+
<p>Returns the key for the actor.</p>
|
535
504
|
|
536
505
|
<div class="method-source-code" id="actor_key-source">
|
537
|
-
<pre><span class="ruby-comment"># File lib/loggable_activity/activity.rb, line
|
506
|
+
<pre><span class="ruby-comment"># File lib/loggable_activity/activity.rb, line 224</span>
|
538
507
|
<span class="ruby-keyword">def</span> <span class="ruby-identifier ruby-title">actor_key</span>
|
539
508
|
<span class="ruby-keyword">return</span> <span class="ruby-keyword">nil</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">actor</span>.<span class="ruby-identifier">nil?</span>
|
540
509
|
|
@@ -556,10 +525,10 @@
|
|
556
525
|
</div>
|
557
526
|
|
558
527
|
<div class="method-description">
|
559
|
-
|
528
|
+
<p>Validates that the activity has at least one payload.</p>
|
560
529
|
|
561
530
|
<div class="method-source-code" id="must_have_at_least_one_payload-source">
|
562
|
-
<pre><span class="ruby-comment"># File lib/loggable_activity/activity.rb, line
|
531
|
+
<pre><span class="ruby-comment"># File lib/loggable_activity/activity.rb, line 231</span>
|
563
532
|
<span class="ruby-keyword">def</span> <span class="ruby-identifier ruby-title">must_have_at_least_one_payload</span>
|
564
533
|
<span class="ruby-identifier">errors</span>.<span class="ruby-identifier">add</span>(<span class="ruby-value">:payloads</span>, <span class="ruby-string">'must have at least one payload'</span>) <span class="ruby-keyword">if</span> <span class="ruby-identifier">payloads</span>.<span class="ruby-identifier">empty?</span>
|
565
534
|
<span class="ruby-keyword">end</span></pre>
|
@@ -579,10 +548,10 @@
|
|
579
548
|
</div>
|
580
549
|
|
581
550
|
<div class="method-description">
|
582
|
-
|
551
|
+
<p>Returns payloads sorted by :payload_type.</p>
|
583
552
|
|
584
553
|
<div class="method-source-code" id="ordered_payloads-source">
|
585
|
-
<pre><span class="ruby-comment"># File lib/loggable_activity/activity.rb, line
|
554
|
+
<pre><span class="ruby-comment"># File lib/loggable_activity/activity.rb, line 212</span>
|
586
555
|
<span class="ruby-keyword">def</span> <span class="ruby-identifier ruby-title">ordered_payloads</span>
|
587
556
|
<span class="ruby-identifier">payloads</span>.<span class="ruby-identifier">order</span>(<span class="ruby-value">:payload_type</span>)
|
588
557
|
<span class="ruby-keyword">end</span></pre>
|
@@ -602,10 +571,10 @@
|
|
602
571
|
</div>
|
603
572
|
|
604
573
|
<div class="method-description">
|
605
|
-
|
574
|
+
<p>Returns the previous association attributes.</p>
|
606
575
|
|
607
576
|
<div class="method-source-code" id="previous_associations_attrs-source">
|
608
|
-
<pre><span class="ruby-comment"># File lib/loggable_activity/activity.rb, line
|
577
|
+
<pre><span class="ruby-comment"># File lib/loggable_activity/activity.rb, line 207</span>
|
609
578
|
<span class="ruby-keyword">def</span> <span class="ruby-identifier ruby-title">previous_associations_attrs</span>
|
610
579
|
<span class="ruby-identifier">attrs</span>.<span class="ruby-identifier">select</span> { <span class="ruby-operator">|</span><span class="ruby-identifier">p</span><span class="ruby-operator">|</span> <span class="ruby-identifier">p</span>[<span class="ruby-value">:payload_type</span>] <span class="ruby-operator">==</span> <span class="ruby-string">'previous_association'</span> }
|
611
580
|
<span class="ruby-keyword">end</span></pre>
|
@@ -625,10 +594,10 @@
|
|
625
594
|
</div>
|
626
595
|
|
627
596
|
<div class="method-description">
|
628
|
-
|
597
|
+
<p>Returns the primary payload.</p>
|
629
598
|
|
630
599
|
<div class="method-source-code" id="primary_payload-source">
|
631
|
-
<pre><span class="ruby-comment"># File lib/loggable_activity/activity.rb, line
|
600
|
+
<pre><span class="ruby-comment"># File lib/loggable_activity/activity.rb, line 189</span>
|
632
601
|
<span class="ruby-keyword">def</span> <span class="ruby-identifier ruby-title">primary_payload</span>
|
633
602
|
<span class="ruby-identifier">ordered_payloads</span>.<span class="ruby-identifier">find</span> { <span class="ruby-operator">|</span><span class="ruby-identifier">p</span><span class="ruby-operator">|</span> <span class="ruby-identifier">p</span>.<span class="ruby-identifier">payload_type</span> <span class="ruby-operator">==</span> <span class="ruby-string">'primary_payload'</span> }
|
634
603
|
<span class="ruby-keyword">end</span></pre>
|
@@ -648,10 +617,10 @@
|
|
648
617
|
</div>
|
649
618
|
|
650
619
|
<div class="method-description">
|
651
|
-
|
620
|
+
<p>Returns the key for the logged record.</p>
|
652
621
|
|
653
622
|
<div class="method-source-code" id="record_key-source">
|
654
|
-
<pre><span class="ruby-comment"># File lib/loggable_activity/activity.rb, line
|
623
|
+
<pre><span class="ruby-comment"># File lib/loggable_activity/activity.rb, line 217</span>
|
655
624
|
<span class="ruby-keyword">def</span> <span class="ruby-identifier ruby-title">record_key</span>
|
656
625
|
<span class="ruby-keyword">return</span> <span class="ruby-keyword">nil</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">record</span>.<span class="ruby-identifier">nil?</span>
|
657
626
|
|
@@ -673,10 +642,10 @@
|
|
673
642
|
</div>
|
674
643
|
|
675
644
|
<div class="method-description">
|
676
|
-
|
645
|
+
<p>Returns the attributes for the update+payload.</p>
|
677
646
|
|
678
647
|
<div class="method-source-code" id="update_attrs-source">
|
679
|
-
<pre><span class="ruby-comment"># File lib/loggable_activity/activity.rb, line
|
648
|
+
<pre><span class="ruby-comment"># File lib/loggable_activity/activity.rb, line 180</span>
|
680
649
|
<span class="ruby-keyword">def</span> <span class="ruby-identifier ruby-title">update_attrs</span>
|
681
650
|
<span class="ruby-identifier">update_payload_attrs</span> = <span class="ruby-identifier">attrs</span>.<span class="ruby-identifier">find</span> { <span class="ruby-operator">|</span><span class="ruby-identifier">p</span><span class="ruby-operator">|</span> <span class="ruby-identifier">p</span>[<span class="ruby-value">:payload_type</span>] <span class="ruby-operator">==</span> <span class="ruby-string">'update_payload'</span> }
|
682
651
|
<span class="ruby-keyword">return</span> <span class="ruby-keyword">nil</span> <span class="ruby-keyword">unless</span> <span class="ruby-identifier">update_payload_attrs</span>
|
@@ -700,19 +669,19 @@
|
|
700
669
|
</div>
|
701
670
|
|
702
671
|
<div class="method-description">
|
703
|
-
|
672
|
+
<p>Returns the attributes for the updated relations.</p>
|
704
673
|
|
705
674
|
<div class="method-source-code" id="updated_relations_attrs-source">
|
706
|
-
<pre><span class="ruby-comment"># File lib/loggable_activity/activity.rb, line
|
675
|
+
<pre><span class="ruby-comment"># File lib/loggable_activity/activity.rb, line 194</span>
|
707
676
|
<span class="ruby-keyword">def</span> <span class="ruby-identifier ruby-title">updated_relations_attrs</span>
|
708
|
-
<span class="ruby-identifier">grouped_associations</span> = <span class="ruby-identifier">attrs</span>.<span class="ruby-identifier">group_by</span> { <span class="ruby-operator">|</span><span class="ruby-identifier">p</span><span class="ruby-operator">|</span> <span class="ruby-identifier">p</span>[<span class="ruby-value">:
|
677
|
+
<span class="ruby-identifier">grouped_associations</span> = <span class="ruby-identifier">attrs</span>.<span class="ruby-identifier">group_by</span> { <span class="ruby-operator">|</span><span class="ruby-identifier">p</span><span class="ruby-operator">|</span> <span class="ruby-identifier">p</span>[<span class="ruby-value">:record_type</span>] }
|
709
678
|
|
710
|
-
<span class="ruby-identifier">grouped_associations</span>.<span class="ruby-identifier">map</span> <span class="ruby-keyword">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">
|
679
|
+
<span class="ruby-identifier">grouped_associations</span>.<span class="ruby-identifier">map</span> <span class="ruby-keyword">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">record_type</span>, <span class="ruby-identifier">payloads</span><span class="ruby-operator">|</span>
|
711
680
|
<span class="ruby-identifier">previous_attrs</span> = <span class="ruby-identifier">payloads</span>.<span class="ruby-identifier">find</span> { <span class="ruby-operator">|</span><span class="ruby-identifier">p</span><span class="ruby-operator">|</span> <span class="ruby-identifier">p</span>[<span class="ruby-value">:payload_type</span>] <span class="ruby-operator">==</span> <span class="ruby-string">'previous_association'</span> }
|
712
681
|
<span class="ruby-identifier">current_attrs</span> = <span class="ruby-identifier">payloads</span>.<span class="ruby-identifier">find</span> { <span class="ruby-operator">|</span><span class="ruby-identifier">p</span><span class="ruby-operator">|</span> <span class="ruby-identifier">p</span>[<span class="ruby-value">:payload_type</span>] <span class="ruby-operator">==</span> <span class="ruby-string">'current_association'</span> }
|
713
682
|
<span class="ruby-keyword">next</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">previous_attrs</span>.<span class="ruby-identifier">nil?</span> <span class="ruby-operator">&&</span> <span class="ruby-identifier">current_attrs</span>.<span class="ruby-identifier">nil?</span>
|
714
683
|
|
715
|
-
{ <span class="ruby-value">
|
684
|
+
{ <span class="ruby-value">record_type:</span>, <span class="ruby-value">previous_attrs:</span>, <span class="ruby-value">current_attrs:</span> }
|
716
685
|
<span class="ruby-keyword">end</span>.<span class="ruby-identifier">compact</span>
|
717
686
|
<span class="ruby-keyword">end</span></pre>
|
718
687
|
</div>
|
@@ -136,7 +136,7 @@
|
|
136
136
|
</pre>
|
137
137
|
|
138
138
|
<div class="method-source-code" id="for_class-source">
|
139
|
-
<pre><span class="ruby-comment"># File lib/loggable_activity/configuration.rb, line
|
139
|
+
<pre><span class="ruby-comment"># File lib/loggable_activity/configuration.rb, line 28</span>
|
140
140
|
<span class="ruby-keyword">def</span> <span class="ruby-keyword">self</span>.<span class="ruby-identifier ruby-title">for_class</span>(<span class="ruby-identifier">class_name</span>)
|
141
141
|
<span class="ruby-ivar">@config_data</span>[<span class="ruby-identifier">class_name</span>]
|
142
142
|
<span class="ruby-keyword">end</span></pre>
|
@@ -156,10 +156,10 @@
|
|
156
156
|
</div>
|
157
157
|
|
158
158
|
<div class="method-description">
|
159
|
-
|
159
|
+
<p>Loads the configuration file</p>
|
160
160
|
|
161
161
|
<div class="method-source-code" id="load_config_file-source">
|
162
|
-
<pre><span class="ruby-comment"># File lib/loggable_activity/configuration.rb, line
|
162
|
+
<pre><span class="ruby-comment"># File lib/loggable_activity/configuration.rb, line 7</span>
|
163
163
|
<span class="ruby-keyword">def</span> <span class="ruby-keyword">self</span>.<span class="ruby-identifier ruby-title">load_config_file</span>(<span class="ruby-identifier">config_file_path</span>)
|
164
164
|
<span class="ruby-ivar">@config_data</span> = <span class="ruby-constant">YAML</span>.<span class="ruby-identifier">load_file</span>(<span class="ruby-identifier">config_file_path</span>)
|
165
165
|
<span class="ruby-keyword">end</span></pre>
|
@@ -107,10 +107,10 @@
|
|
107
107
|
</div>
|
108
108
|
|
109
109
|
<div class="method-description">
|
110
|
-
|
110
|
+
<p>Returns true if the given value is blank</p>
|
111
111
|
|
112
112
|
<div class="method-source-code" id="blank-3F-source">
|
113
|
-
<pre><span class="ruby-comment"># File lib/loggable_activity/encryption.rb, line
|
113
|
+
<pre><span class="ruby-comment"># File lib/loggable_activity/encryption.rb, line 69</span>
|
114
114
|
<span class="ruby-keyword">def</span> <span class="ruby-keyword">self</span>.<span class="ruby-identifier ruby-title">blank?</span>(<span class="ruby-identifier">value</span>)
|
115
115
|
<span class="ruby-identifier">value</span>.<span class="ruby-identifier">respond_to?</span>(<span class="ruby-value">:empty?</span>) <span class="ruby-operator">?</span> <span class="ruby-identifier">value</span>.<span class="ruby-identifier">empty?</span> <span class="ruby-operator">:</span> <span class="ruby-operator">!</span><span class="ruby-identifier">value</span>
|
116
116
|
<span class="ruby-keyword">end</span></pre>
|
@@ -148,7 +148,7 @@
|
|
148
148
|
<span class="ruby-keyword">return</span> <span class="ruby-string">''</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">data</span>.<span class="ruby-identifier">nil?</span> <span class="ruby-operator">||</span> <span class="ruby-identifier">encoded_key</span>.<span class="ruby-identifier">nil?</span>
|
149
149
|
|
150
150
|
<span class="ruby-identifier">encryption_key</span> = <span class="ruby-constant">Base64</span>.<span class="ruby-identifier">decode64</span>(<span class="ruby-identifier">encoded_key</span>)
|
151
|
-
<span class="ruby-identifier">raise</span> <span class="ruby-constant">EncryptionError</span>, <span class="ruby-
|
151
|
+
<span class="ruby-identifier">raise</span> <span class="ruby-constant">EncryptionError</span>, <span class="ruby-node">"Decryption failed: Invalid encoded_key length: #{encryption_key.bytesize}"</span> <span class="ruby-keyword">unless</span> <span class="ruby-identifier">encryption_key</span>.<span class="ruby-identifier">bytesize</span> <span class="ruby-operator">==</span> <span class="ruby-value">32</span>
|
152
152
|
|
153
153
|
<span class="ruby-identifier">cipher</span> = <span class="ruby-constant">OpenSSL</span><span class="ruby-operator">::</span><span class="ruby-constant">Cipher</span>.<span class="ruby-identifier">new</span>(<span class="ruby-string">'AES-256-CBC'</span>).<span class="ruby-identifier">decrypt</span>
|
154
154
|
<span class="ruby-identifier">cipher</span>.<span class="ruby-identifier">key</span> = <span class="ruby-identifier">encryption_key</span>
|
@@ -160,6 +160,9 @@
|
|
160
160
|
<span class="ruby-identifier">decrypted_data</span>.<span class="ruby-identifier">force_encoding</span>(<span class="ruby-string">'UTF-8'</span>)
|
161
161
|
<span class="ruby-keyword">rescue</span> <span class="ruby-constant">OpenSSL</span><span class="ruby-operator">::</span><span class="ruby-constant">Cipher</span><span class="ruby-operator">::</span><span class="ruby-constant">CipherError</span> <span class="ruby-operator">=></span> <span class="ruby-identifier">e</span>
|
162
162
|
<span class="ruby-identifier">raise</span> <span class="ruby-constant">EncryptionError</span>, <span class="ruby-node">"Decryption failed: #{e.message}"</span>
|
163
|
+
<span class="ruby-keyword">rescue</span> <span class="ruby-constant">EncryptionError</span> <span class="ruby-operator">=></span> <span class="ruby-identifier">e</span>
|
164
|
+
<span class="ruby-identifier">puts</span> <span class="ruby-identifier">e</span>.<span class="ruby-identifier">message</span>
|
165
|
+
<span class="ruby-string">'*** DECRYPTION FAILED ***'</span>
|
163
166
|
<span class="ruby-keyword">end</span></pre>
|
164
167
|
</div>
|
165
168
|
</div>
|
@@ -195,7 +198,7 @@
|
|
195
198
|
<span class="ruby-keyword">return</span> <span class="ruby-keyword">nil</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">data</span>.<span class="ruby-identifier">nil?</span> <span class="ruby-operator">||</span> <span class="ruby-identifier">encoded_key</span>.<span class="ruby-identifier">nil?</span>
|
196
199
|
|
197
200
|
<span class="ruby-identifier">encryption_key</span> = <span class="ruby-constant">Base64</span>.<span class="ruby-identifier">decode64</span>(<span class="ruby-identifier">encoded_key</span>)
|
198
|
-
<span class="ruby-identifier">raise</span> <span class="ruby-constant">EncryptionError</span>, <span class="ruby-node">"Encryption failed: Invalid
|
201
|
+
<span class="ruby-identifier">raise</span> <span class="ruby-constant">EncryptionError</span>, <span class="ruby-node">"Encryption failed: Invalid encoded_key length #{encryption_key.bytesize}"</span> <span class="ruby-keyword">unless</span> <span class="ruby-identifier">encryption_key</span>.<span class="ruby-identifier">bytesize</span> <span class="ruby-operator">==</span> <span class="ruby-value">32</span>
|
199
202
|
|
200
203
|
<span class="ruby-identifier">cipher</span> = <span class="ruby-constant">OpenSSL</span><span class="ruby-operator">::</span><span class="ruby-constant">Cipher</span>.<span class="ruby-identifier">new</span>(<span class="ruby-string">'AES-256-CBC'</span>).<span class="ruby-identifier">encrypt</span>
|
201
204
|
<span class="ruby-identifier">cipher</span>.<span class="ruby-identifier">key</span> = <span class="ruby-identifier">encryption_key</span>
|
@@ -139,7 +139,7 @@
|
|
139
139
|
</pre>
|
140
140
|
|
141
141
|
<div class="method-source-code" id="create_encryption_key-source">
|
142
|
-
<pre><span class="ruby-comment"># File lib/loggable_activity/encryption_key.rb, line
|
142
|
+
<pre><span class="ruby-comment"># File lib/loggable_activity/encryption_key.rb, line 95</span>
|
143
143
|
<span class="ruby-keyword">def</span> <span class="ruby-keyword">self</span>.<span class="ruby-identifier ruby-title">create_encryption_key</span>(<span class="ruby-identifier">record_type</span>, <span class="ruby-identifier">record_id</span>, <span class="ruby-identifier">parent_key</span> = <span class="ruby-keyword">nil</span>)
|
144
144
|
<span class="ruby-keyword">if</span> <span class="ruby-identifier">parent_key</span>
|
145
145
|
<span class="ruby-identifier">create</span>(<span class="ruby-value">record_type:</span>, <span class="ruby-value">record_id:</span>, <span class="ruby-value">key:</span> <span class="ruby-identifier">random_key</span>, <span class="ruby-value">parent_key:</span>)
|
@@ -189,6 +189,8 @@
|
|
189
189
|
<div class="method-source-code" id="for_record-source">
|
190
190
|
<pre><span class="ruby-comment"># File lib/loggable_activity/encryption_key.rb, line 67</span>
|
191
191
|
<span class="ruby-keyword">def</span> <span class="ruby-keyword">self</span>.<span class="ruby-identifier ruby-title">for_record</span>(<span class="ruby-identifier">record</span>, <span class="ruby-identifier">parent_key</span> = <span class="ruby-keyword">nil</span>)
|
192
|
+
<span class="ruby-keyword">return</span> <span class="ruby-keyword">nil</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">record</span>.<span class="ruby-identifier">nil?</span>
|
193
|
+
|
192
194
|
<span class="ruby-identifier">encryption_key</span> = <span class="ruby-identifier">find_by</span>(<span class="ruby-value">record:</span>)
|
193
195
|
<span class="ruby-keyword">return</span> <span class="ruby-identifier">encryption_key</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">encryption_key</span>
|
194
196
|
|
@@ -272,7 +274,7 @@
|
|
272
274
|
</pre>
|
273
275
|
|
274
276
|
<div class="method-source-code" id="random_key-source">
|
275
|
-
<pre><span class="ruby-comment"># File lib/loggable_activity/encryption_key.rb, line
|
277
|
+
<pre><span class="ruby-comment"># File lib/loggable_activity/encryption_key.rb, line 113</span>
|
276
278
|
<span class="ruby-keyword">def</span> <span class="ruby-keyword">self</span>.<span class="ruby-identifier ruby-title">random_key</span>
|
277
279
|
<span class="ruby-comment"># Generate 32 random bytes (256 bits) directly</span>
|
278
280
|
<span class="ruby-identifier">encryption_key</span> = <span class="ruby-constant">SecureRandom</span>.<span class="ruby-identifier">random_bytes</span>(<span class="ruby-value">32</span>)
|