card-mod-solid_cache 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/README.md +36 -0
- data/set/abstract/solid_cache.rb +114 -0
- data/set/all/solid_cache.rb +15 -0
- data/set/right/solid_cache.rb +48 -0
- metadata +63 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 0b322e3029fa67070e6c4cba4bfe4713367188fc3b3322010df453960776d2b8
|
4
|
+
data.tar.gz: 5ec067371aac1ce2ee721bd011a788f93f5aa790c5bdd0689f284dc040fe9e2c
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: f6feb7d1863300120d5980f60fac939b3c2b83da0b20169afdc5cc156d31f81494a5351797f5161fbf4ef506b518a1f13d571266ff36e8d979f9f696e2886cef
|
7
|
+
data.tar.gz: 31e92670dcb54408bbd6b1d828fe0c12496b5a22378314bc6d1c028327eec22d196d3a8207e85faf5a474195345a9bbdba4cadbe87c8f1d8575c79f4d8752855
|
data/README.md
ADDED
@@ -0,0 +1,36 @@
|
|
1
|
+
<!--
|
2
|
+
# @title README - mod: solid cache
|
3
|
+
-->
|
4
|
+
|
5
|
+
# Solid Cache mod (experimental)
|
6
|
+
|
7
|
+
This mod supports caching rendered card content in the database.
|
8
|
+
|
9
|
+
## Why
|
10
|
+
|
11
|
+
Decko has a powerful caching system that handles caching code objects
|
12
|
+
(especially cards) and rendered views. The view caching is smart about nests and
|
13
|
+
generally caches nested content separately from the content that nests it, so
|
14
|
+
that you don't have to expire the cache of the nesting content so frequently. In
|
15
|
+
most cases, this is a fast and efficient way to handle content.
|
16
|
+
|
17
|
+
However, there are cases where a deeper and more permanent cache is appropriate.
|
18
|
+
Sometimes it's more important that a very complex page be fast than perfectly up
|
19
|
+
to date, for example. This mod can be helpful in such cases.
|
20
|
+
|
21
|
+
## How
|
22
|
+
|
23
|
+
If you include `Abstract::SolidCache` in a set, then anything that renders the
|
24
|
+
`:core` view of a card in that set will trigger the generation of a
|
25
|
+
`+:solid_cache` card. That raw content (db_content) of that new cache card will
|
26
|
+
contain the rendered core view of the original card. Any further rendering of
|
27
|
+
the core view will use that cached view until the cache is explicitly cleared or
|
28
|
+
updated.
|
29
|
+
|
30
|
+
To clear or update the cache, you will need to call one of the following methods
|
31
|
+
to the set of a card that should clear/update the cache when changed.
|
32
|
+
|
33
|
+
- `#cache_update_trigger`
|
34
|
+
- `#cache_expire_trigger`
|
35
|
+
|
36
|
+
See {Card::Set::Abstract::SolidCache} for more on those methods.
|
@@ -0,0 +1,114 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
2
|
+
|
3
|
+
# A card that includes Abstract::SolidCache has its "core" view fully rendered
|
4
|
+
# and stored in a '+*solid cache' card.
|
5
|
+
# If that card exists the core view returns its content as rendered view.
|
6
|
+
# If it doesn't exist the usual core view is rendered and saved in that card.
|
7
|
+
#
|
8
|
+
# The cache expiration can be controlled with the cache_update_trigger and
|
9
|
+
# cache_expire_trigger methods.
|
10
|
+
|
11
|
+
card_accessor :solid_cache, type: HtmlID
|
12
|
+
|
13
|
+
class << self
|
14
|
+
def included host_class
|
15
|
+
host_class.format(host_class.try(:cached_format) || :base) do
|
16
|
+
view :core, cache: :never do
|
17
|
+
return super() if voo.hide? :solid_cache
|
18
|
+
_render_solid_cache
|
19
|
+
end
|
20
|
+
|
21
|
+
view :solid_cache, cache: :never do
|
22
|
+
card.with_solid_cache do |cache_card|
|
23
|
+
subformat(cache_card)._render_core
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
module ClassMethods
|
31
|
+
# If a card of the set given by 'set_of_changed_card' is changed
|
32
|
+
# the given block is executed. It is supposed to return an array of
|
33
|
+
# cards whose solid caches are expired because of the change.
|
34
|
+
# @param set_of_changed_card [set constant] a set of cards that triggers
|
35
|
+
# a cache update
|
36
|
+
# @param args [Hash]
|
37
|
+
# @option args [Symbol, Array<Symbol>] :on the action(s)
|
38
|
+
# (:create, :update, or :delete) on which the cache update
|
39
|
+
# should be triggered. Default is all actions.
|
40
|
+
# @option args [Stage] :in_stage the stage when the update is executed.
|
41
|
+
# Default is :integrate
|
42
|
+
# @yield return a card or an array of cards with solid cache that need to be
|
43
|
+
# updated
|
44
|
+
def cache_update_trigger set_of_changed_card, args={}, &block
|
45
|
+
define_event_to_update_expired_cached_cards(
|
46
|
+
set_of_changed_card, args, :update_solid_cache, &block
|
47
|
+
)
|
48
|
+
end
|
49
|
+
|
50
|
+
# Same as 'cache_update_trigger' but expires instead of updates the
|
51
|
+
# outdated solid caches
|
52
|
+
def cache_expire_trigger set_of_changed_card, args={}, &block
|
53
|
+
define_event_to_update_expired_cached_cards(
|
54
|
+
set_of_changed_card, args, :expire_solid_cache, &block
|
55
|
+
)
|
56
|
+
end
|
57
|
+
|
58
|
+
private
|
59
|
+
|
60
|
+
def define_event_to_update_expired_cached_cards set_of_changed_card, args,
|
61
|
+
method_name
|
62
|
+
args[:on] ||= %i[create update delete]
|
63
|
+
name = event_name set_of_changed_card, args
|
64
|
+
stage = args[:in_stage] || :integrate
|
65
|
+
Card::Set.register_set set_of_changed_card
|
66
|
+
set_of_changed_card.event name, stage, args do
|
67
|
+
Array.wrap(yield(self)).compact.each do |expired_cache_card|
|
68
|
+
next unless expired_cache_card.solid_cache?
|
69
|
+
expired_cache_card.send method_name
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
def event_name set, args
|
75
|
+
changed_card_set = set.underscore
|
76
|
+
solid_cache_set = underscore + "__solid_cache"
|
77
|
+
actions = Array.wrap(args[:on]).join("_")
|
78
|
+
["update", solid_cache_set,
|
79
|
+
"changed_by", changed_card_set,
|
80
|
+
"on", actions].join("___").to_sym
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
def solid_cache?
|
85
|
+
true
|
86
|
+
end
|
87
|
+
|
88
|
+
def with_solid_cache
|
89
|
+
update_solid_cache if solid_cache_card.new?
|
90
|
+
yield solid_cache_card
|
91
|
+
end
|
92
|
+
|
93
|
+
def expire_solid_cache _changed_card=nil
|
94
|
+
return unless solid_cache? && solid_cache_card.real?
|
95
|
+
Auth.as_bot do
|
96
|
+
solid_cache_card.delete!
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
def update_solid_cache
|
101
|
+
return unless solid_cache?
|
102
|
+
new_content = generate_content_for_cache
|
103
|
+
write_to_solid_cache new_content
|
104
|
+
new_content
|
105
|
+
end
|
106
|
+
|
107
|
+
def generate_content_for_cache
|
108
|
+
format_type = try(:cached_format) || :base
|
109
|
+
format(format_type)._render_core hide: :solid_cache
|
110
|
+
end
|
111
|
+
|
112
|
+
def write_to_solid_cache new_content
|
113
|
+
solid_cache_card.write! new_content
|
114
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# for override
|
2
|
+
def solid_cache?
|
3
|
+
false
|
4
|
+
end
|
5
|
+
|
6
|
+
module ClassMethods
|
7
|
+
def clear_solid_cache
|
8
|
+
Auth.as_bot do
|
9
|
+
Card.search(right: { codename: "solid_cache" }).each do |card|
|
10
|
+
card.update_columns trash: true
|
11
|
+
card.expire
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
include_set Abstract::Lock
|
2
|
+
|
3
|
+
def ok_to_read
|
4
|
+
left.ok_to_read
|
5
|
+
end
|
6
|
+
|
7
|
+
def followable?
|
8
|
+
false
|
9
|
+
end
|
10
|
+
|
11
|
+
def history?
|
12
|
+
false
|
13
|
+
end
|
14
|
+
|
15
|
+
def clean_html?
|
16
|
+
false
|
17
|
+
end
|
18
|
+
|
19
|
+
def write! new_content
|
20
|
+
lock do
|
21
|
+
if new_card?
|
22
|
+
update! content: new_content
|
23
|
+
elsif new_content != solid_cache_card.content
|
24
|
+
update_column :db_content, new_content
|
25
|
+
expire
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
format :html do
|
31
|
+
view :core, cache: :never do
|
32
|
+
return super() unless card.new_card?
|
33
|
+
@denied_view = :core
|
34
|
+
_render_unknown
|
35
|
+
end
|
36
|
+
|
37
|
+
view :unknown, cache: :never do
|
38
|
+
if @card.new_card? && (l = @card.left) && l.solid_cache?
|
39
|
+
l.update_solid_cache
|
40
|
+
@card = Card.fetch card.name
|
41
|
+
render! @denied_view
|
42
|
+
else
|
43
|
+
super()
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
view :new, :unknown
|
48
|
+
end
|
metadata
ADDED
@@ -0,0 +1,63 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: card-mod-solid_cache
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: '0.1'
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Philipp Kühl
|
8
|
+
- Ethan McCutchen
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2021-10-26 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: card
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
requirements:
|
18
|
+
- - ">="
|
19
|
+
- !ruby/object:Gem::Version
|
20
|
+
version: '0'
|
21
|
+
type: :runtime
|
22
|
+
prerelease: false
|
23
|
+
version_requirements: !ruby/object:Gem::Requirement
|
24
|
+
requirements:
|
25
|
+
- - ">="
|
26
|
+
- !ruby/object:Gem::Version
|
27
|
+
version: '0'
|
28
|
+
description: ''
|
29
|
+
email:
|
30
|
+
- info@decko.org
|
31
|
+
executables: []
|
32
|
+
extensions: []
|
33
|
+
extra_rdoc_files: []
|
34
|
+
files:
|
35
|
+
- README.md
|
36
|
+
- set/abstract/solid_cache.rb
|
37
|
+
- set/all/solid_cache.rb
|
38
|
+
- set/right/solid_cache.rb
|
39
|
+
homepage: http://decko.org
|
40
|
+
licenses:
|
41
|
+
- GPL-3.0
|
42
|
+
metadata:
|
43
|
+
card-mod: solid_cache
|
44
|
+
post_install_message:
|
45
|
+
rdoc_options: []
|
46
|
+
require_paths:
|
47
|
+
- lib
|
48
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
49
|
+
requirements:
|
50
|
+
- - ">="
|
51
|
+
- !ruby/object:Gem::Version
|
52
|
+
version: '2.5'
|
53
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
54
|
+
requirements:
|
55
|
+
- - ">="
|
56
|
+
- !ruby/object:Gem::Version
|
57
|
+
version: '0'
|
58
|
+
requirements: []
|
59
|
+
rubygems_version: 3.2.28
|
60
|
+
signing_key:
|
61
|
+
specification_version: 4
|
62
|
+
summary: solid cache
|
63
|
+
test_files: []
|