card 1.101.3 → 1.101.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/VERSION +1 -1
- data/config/initializers/02_patches/active_record.rb +1 -1
- data/config/locales/en.yml +155 -378
- data/db/migrate_core_cards/20150202143810_import_bootstrap_layout.rb +1 -1
- data/lib/card.rb +15 -2
- data/lib/card/auth.rb +5 -2
- data/lib/card/auth/current.rb +39 -100
- data/lib/card/auth/proxy.rb +36 -16
- data/lib/card/auth/token.rb +6 -0
- data/lib/card/cache/all.rb +83 -0
- data/lib/card/cache/card_class.rb +41 -0
- data/lib/card/cache/persistent.rb +3 -34
- data/lib/card/cache/persistent_class.rb +28 -0
- data/lib/card/codename.rb +1 -1
- data/lib/card/content.rb +16 -2
- data/lib/card/content/all.rb +59 -0
- data/lib/card/director/act_direction.rb +4 -0
- data/lib/card/director/all.rb +61 -0
- data/lib/card/director/card_class.rb +18 -0
- data/lib/card/director/phases.rb +0 -1
- data/lib/card/dirty.rb +13 -3
- data/lib/card/env/success.rb +14 -14
- data/lib/card/env/success/target.rb +9 -11
- data/lib/card/error.rb +1 -1
- data/lib/card/fetch/all.rb +32 -0
- data/lib/card/fetch/card_class.rb +147 -0
- data/lib/card/format.rb +1 -1
- data/lib/card/format/error.rb +3 -3
- data/lib/card/format/nest.rb +1 -1
- data/lib/card/format/nest/fetch.rb +1 -1
- data/lib/card/lexicon.rb +2 -2
- data/lib/card/name/all.rb +8 -0
- data/lib/card/name/all/descendants.rb +6 -3
- data/lib/card/name/card_class.rb +26 -0
- data/lib/card/reference/all.rb +131 -0
- data/lib/card/rule/all.rb +75 -0
- data/lib/card/set/event/all.rb +95 -0
- data/lib/card/set/event/skip_and_trigger.rb +89 -0
- data/lib/card/set/pattern/all.rb +63 -0
- data/lib/card/subcards/all.rb +103 -0
- data/lib/cardio/migration/import.rb +1 -1
- data/lib/cardio/utils.rb +5 -3
- data/mod/admin/set/self/admin_info.rb +3 -5
- data/mod/admin/set/self/trash.rb +2 -2
- data/mod/core/set/all/autoname.rb +17 -0
- data/mod/core/set/all/codename.rb +2 -2
- data/mod/core/set/all/content.rb +52 -97
- data/mod/core/set/all/name_events.rb +69 -58
- data/mod/core/set/all/reference_events.rb +67 -0
- data/mod/core/set/all/states.rb +2 -2
- data/mod/core/set/all/subcards.rb +0 -100
- data/mod/core/set/all/trash.rb +11 -13
- data/mod/core/set/all/type.rb +7 -9
- data/mod/core/set/all/utils.rb +3 -0
- data/mod/core/set/type/cardtype.rb +3 -3
- data/mod/core/set_pattern/06_rule.rb +1 -1
- data/mod/core/spec/set/all/{rules2_spec.rb → clean_me_spec.rb} +0 -0
- data/mod/core/spec/set/all/name_events_spec.rb +204 -0
- metadata +30 -37
- data/lib/card/mod_inflector.rb +0 -16
- data/lib/card/name/all/class_methods.rb +0 -28
- data/mod/core/set/all/actify.rb +0 -68
- data/mod/core/set/all/cache.rb +0 -109
- data/mod/core/set/all/event_conditions.rb +0 -172
- data/mod/core/set/all/fetch.rb +0 -122
- data/mod/core/set/all/fetch_helper.rb +0 -35
- data/mod/core/set/all/i18n.rb +0 -9
- data/mod/core/set/all/pattern.rb +0 -54
- data/mod/core/set/all/references.rb +0 -191
- data/mod/core/set/all/rename.rb +0 -33
- data/mod/core/set/all/rules.rb +0 -81
- data/mod/core/spec/set/all/actify_spec.rb +0 -58
- data/mod/core/spec/set/all/content_spec.rb +0 -15
- data/mod/core/spec/set/all/event_conditions_spec.rb +0 -217
- data/mod/core/spec/set/all/fetch_helper_spec.rb +0 -65
- data/mod/core/spec/set/all/fetch_spec.rb +0 -338
- data/mod/core/spec/set/all/i18n_spec.rb +0 -17
- data/mod/core/spec/set/all/pattern_spec.rb +0 -101
- data/mod/core/spec/set/all/permissions/reader_rules_spec.rb +0 -166
- data/mod/core/spec/set/all/references_spec.rb +0 -62
- data/mod/core/spec/set/all/rename_spec.rb +0 -189
- data/mod/core/spec/set/all/rules_spec.rb +0 -100
- data/mod/core/spec/set/all/subcards_spec.rb +0 -102
@@ -1,15 +0,0 @@
|
|
1
|
-
# -*- encoding : utf-8 -*-
|
2
|
-
|
3
|
-
describe Card::Set::All::Content do
|
4
|
-
describe "save_content_draft" do
|
5
|
-
it "stores a draft revision" do
|
6
|
-
@card = Card.create! name: "mango", content: "foo"
|
7
|
-
@card.save_content_draft("bar")
|
8
|
-
expect(@card.drafts.length).to eq 1
|
9
|
-
@card.save_content_draft("booboo")
|
10
|
-
@card.reload
|
11
|
-
expect(@card.drafts.length).to eq 1
|
12
|
-
expect(@card.drafts[0].value(:db_content)).to eq "booboo"
|
13
|
-
end
|
14
|
-
end
|
15
|
-
end
|
@@ -1,217 +0,0 @@
|
|
1
|
-
# -*- encoding : utf-8 -*-
|
2
|
-
|
3
|
-
RSpec.describe Card::Set::All::EventConditions do
|
4
|
-
let(:create_card) {Card.create!(name: "main card")}
|
5
|
-
let(:create_card_with_subcards) do
|
6
|
-
Card.create name: "main card",
|
7
|
-
subcards: {
|
8
|
-
"11" => { subcards: { "111" => "A" } },
|
9
|
-
"12" => { subcards: { "121" => "A" } }
|
10
|
-
}
|
11
|
-
end
|
12
|
-
|
13
|
-
context "restricted to changed content:" do
|
14
|
-
STAGES = [:validate, :store, :finalize, :integrate]
|
15
|
-
|
16
|
-
def add_to_log entry
|
17
|
-
@log << entry
|
18
|
-
end
|
19
|
-
|
20
|
-
def change_content
|
21
|
-
Card["A"].update! content: "changed content"
|
22
|
-
end
|
23
|
-
|
24
|
-
before do
|
25
|
-
@log = []
|
26
|
-
end
|
27
|
-
|
28
|
-
it "is executed when content changed" do
|
29
|
-
with_test_events do
|
30
|
-
STAGES.each do |stage|
|
31
|
-
test_event stage, on: :update, changed: :content, for: "A" do
|
32
|
-
# can't access instance variables here but methods are fine
|
33
|
-
add_to_log stage
|
34
|
-
end
|
35
|
-
end
|
36
|
-
change_content
|
37
|
-
expect(@log).to contain_exactly(*STAGES)
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
|
-
specify "content change is accessible in all stages" do
|
42
|
-
with_test_events do
|
43
|
-
STAGES.each do |stage|
|
44
|
-
test_event stage, on: :update, changed: :content, for: "A" do
|
45
|
-
add_to_log db_content_before_act
|
46
|
-
end
|
47
|
-
end
|
48
|
-
content_before_change = [Card["A"].db_content] * STAGES.size
|
49
|
-
change_content
|
50
|
-
expect(@log).to contain_exactly(*content_before_change)
|
51
|
-
end
|
52
|
-
end
|
53
|
-
|
54
|
-
context "when changing type" do
|
55
|
-
def update_type
|
56
|
-
Card::Auth.as_bot do
|
57
|
-
Card["Sample Pointer"].update! type: "Search"
|
58
|
-
end
|
59
|
-
end
|
60
|
-
|
61
|
-
it "does NOT run update events from sets that no longer apply after change" do
|
62
|
-
with_test_events do
|
63
|
-
test_event :validate, on: :update, set: Card::Set::Type::Pointer do
|
64
|
-
add_to_log "NO to run"
|
65
|
-
end
|
66
|
-
update_type
|
67
|
-
expect(@log).to be_empty
|
68
|
-
end
|
69
|
-
end
|
70
|
-
|
71
|
-
it "does run update events from old sets when `changing` value present" do
|
72
|
-
with_test_events do
|
73
|
-
test_event :validate,
|
74
|
-
on: :update, set: Card::Set::Type::Pointer, changing: :type do
|
75
|
-
add_to_log "YES to run"
|
76
|
-
end
|
77
|
-
update_type
|
78
|
-
expect(@log).to contain_exactly("YES to run")
|
79
|
-
end
|
80
|
-
end
|
81
|
-
|
82
|
-
it "does run update events from sets that apply after change" do
|
83
|
-
with_test_events do
|
84
|
-
test_event :validate, on: :update, set: Card::Set::Type::SearchType do
|
85
|
-
add_to_log "YES to run"
|
86
|
-
end
|
87
|
-
update_type
|
88
|
-
expect(@log).to contain_exactly("YES to run")
|
89
|
-
end
|
90
|
-
end
|
91
|
-
|
92
|
-
# following does not yet work, because old card has both old sets and new sets
|
93
|
-
# when conditions are tested.
|
94
|
-
xit "does NOT run update events from new sets when `changing` value present" do
|
95
|
-
with_test_events do
|
96
|
-
test_event :validate,
|
97
|
-
on: :update, set: Card::Set::Type::SearchType, changing: :type do
|
98
|
-
add_to_log "NO to run"
|
99
|
-
end
|
100
|
-
update_type
|
101
|
-
expect(@log).to be_empty
|
102
|
-
end
|
103
|
-
end
|
104
|
-
end
|
105
|
-
|
106
|
-
context "when changing name" do
|
107
|
-
def update_name
|
108
|
-
Card::Auth.as_bot do
|
109
|
-
Card["Cardtype B+*type+*create"].update! name: "B+*update"
|
110
|
-
end
|
111
|
-
end
|
112
|
-
|
113
|
-
it "does NOT run update events from sets that no longer apply after change" do
|
114
|
-
with_test_events do
|
115
|
-
test_event :validate, on: :update, set: Card::Set::Right::Create do
|
116
|
-
add_to_log "NO to run"
|
117
|
-
end
|
118
|
-
update_name
|
119
|
-
expect(@log).to be_empty
|
120
|
-
end
|
121
|
-
end
|
122
|
-
|
123
|
-
it "does run update events from old sets when `changing` value present" do
|
124
|
-
with_test_events do
|
125
|
-
test_event :validate,
|
126
|
-
on: :update, set: Card::Set::Right::Create, changing: :name do
|
127
|
-
add_to_log "YES to run"
|
128
|
-
end
|
129
|
-
update_name
|
130
|
-
expect(@log).to contain_exactly("YES to run")
|
131
|
-
end
|
132
|
-
end
|
133
|
-
|
134
|
-
it "does run update events from sets that apply after change" do
|
135
|
-
with_test_events do
|
136
|
-
test_event :validate, on: :update, set: Card::Set::Right::Update do
|
137
|
-
add_to_log "YES to run"
|
138
|
-
end
|
139
|
-
update_name
|
140
|
-
expect(@log).to contain_exactly("YES to run")
|
141
|
-
end
|
142
|
-
end
|
143
|
-
end
|
144
|
-
|
145
|
-
describe "trigger option" do
|
146
|
-
specify "trigger for whole act" do
|
147
|
-
with_test_events do
|
148
|
-
test_event :validate, on: :update, trigger: :required, for: "A" do
|
149
|
-
add_to_log "triggered"
|
150
|
-
end
|
151
|
-
Card["A"].update! content: "changed content"
|
152
|
-
|
153
|
-
aggregate_failures do
|
154
|
-
expect(@log).to be_empty
|
155
|
-
Card["A"].update! content: "changed content", trigger: :test_event_0
|
156
|
-
expect(@log).to contain_exactly "triggered"
|
157
|
-
end
|
158
|
-
end
|
159
|
-
end
|
160
|
-
end
|
161
|
-
|
162
|
-
describe "skip option" do
|
163
|
-
def expect_skipping changes, log1, log2,
|
164
|
-
for_name: nil, skip_key: :skip, allowed: :allowed, force: false
|
165
|
-
with_test_events do
|
166
|
-
add_logging_test_event allowed, for_name
|
167
|
-
update_with_skip force, changes, skip_key
|
168
|
-
|
169
|
-
aggregate_failures do
|
170
|
-
expect(@log).to eq(log1) # logging with skip
|
171
|
-
Card["A"].update! changes # update without skip
|
172
|
-
expect(@log).to contain_exactly(*log2) # logging without skip
|
173
|
-
end
|
174
|
-
end
|
175
|
-
end
|
176
|
-
|
177
|
-
def add_logging_test_event allowed, for_name
|
178
|
-
event_args = { on: :update, skip: allowed }
|
179
|
-
event_args[:for] = for_name if for_name
|
180
|
-
test_event(:validate, event_args) do
|
181
|
-
add_to_log "#{name} executed"
|
182
|
-
end
|
183
|
-
end
|
184
|
-
|
185
|
-
def update_with_skip force, changes, skip_key
|
186
|
-
skip_card = Card["A"]
|
187
|
-
if force
|
188
|
-
skip_card.skip_event! :test_event_0
|
189
|
-
skip_card.update! changes
|
190
|
-
else
|
191
|
-
skip_card.update! changes.merge(skip_key => :test_event_0)
|
192
|
-
end
|
193
|
-
end
|
194
|
-
|
195
|
-
specify "skip condition" do
|
196
|
-
expect_skipping({ content: "changed" }, [], "A executed", for_name: "A")
|
197
|
-
end
|
198
|
-
|
199
|
-
specify "skip condition in subcard" do
|
200
|
-
expect_skipping({ content: "changed", subcards: { "+B" => "changed +B" } },
|
201
|
-
[], "A+B executed", for_name: "A+B")
|
202
|
-
end
|
203
|
-
|
204
|
-
specify "skip_in_action condition" do
|
205
|
-
expect_skipping({ content: "changed", subcards: { "+B" => "changed +B" } },
|
206
|
-
["A+B executed"],
|
207
|
-
["A executed", "A+B executed", "A+B executed"],
|
208
|
-
skip_key: :skip_in_action)
|
209
|
-
end
|
210
|
-
|
211
|
-
specify "force skip" do
|
212
|
-
expect_skipping({ content: "changed" }, [], "A executed",
|
213
|
-
force: true, for_name: "A")
|
214
|
-
end
|
215
|
-
end
|
216
|
-
end
|
217
|
-
end
|
@@ -1,65 +0,0 @@
|
|
1
|
-
# -*- encoding : utf-8 -*-
|
2
|
-
|
3
|
-
RSpec.describe Card::Set::All::FetchHelper do
|
4
|
-
let(:retrieve) { test_retrieve_existing }
|
5
|
-
let(:retrieve_from_trash) { test_retrieve_existing look_in_trash: true }
|
6
|
-
|
7
|
-
def fetch_object opts={}
|
8
|
-
if @fetch_object
|
9
|
-
@fetch_object.opts.merge! opts
|
10
|
-
@fetch_object
|
11
|
-
else
|
12
|
-
@fetch_object = Card::Fetch.new("A".to_name, opts)
|
13
|
-
end
|
14
|
-
end
|
15
|
-
|
16
|
-
def test_retrieve_existing opts={}
|
17
|
-
fetch_object(opts)&.retrieve_existing
|
18
|
-
end
|
19
|
-
|
20
|
-
describe "#controller fetch" do
|
21
|
-
it "removes underscores from new card names" do
|
22
|
-
expect(Card.controller_fetch(mark: "no_un_der_score").name).to eq("no un der score")
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
describe "retrieve_existing" do
|
27
|
-
it "looks for non-cached card in database" do
|
28
|
-
# expect_db_retrieval_with(:key, "a", nil) { retrieve }
|
29
|
-
expect_db_retrieval { retrieve }
|
30
|
-
end
|
31
|
-
|
32
|
-
it "doesn't look in db for cached cards(real)" do
|
33
|
-
Card.cache.write "a", Card["B"]
|
34
|
-
expect_no_db_retrieval { retrieve }
|
35
|
-
end
|
36
|
-
|
37
|
-
it "doesn't look in db for cached cards (new)" do
|
38
|
-
Card.cache.write "a", Card.new
|
39
|
-
expect_no_db_retrieval { retrieve }
|
40
|
-
end
|
41
|
-
|
42
|
-
it "doesn't look in db for cached cards (real) if 'look_in_trash' option used" do
|
43
|
-
Card.cache.write "a", Card["B"]
|
44
|
-
expect_no_db_retrieval { retrieve_from_trash }
|
45
|
-
end
|
46
|
-
|
47
|
-
it "looks in db for cached cards (new) if 'look_in_trash' option used" do
|
48
|
-
Card.cache.write "a", Card.new
|
49
|
-
# expect_db_retrieval_with(:key, "a", true) { retrieve_from_trash }
|
50
|
-
expect_db_retrieval { retrieve_from_trash }
|
51
|
-
end
|
52
|
-
|
53
|
-
def expect_no_db_retrieval
|
54
|
-
allow(fetch_object).to receive(:retrieve_from_db)
|
55
|
-
yield
|
56
|
-
expect(fetch_object).not_to have_received(:retrieve_from_db)
|
57
|
-
end
|
58
|
-
|
59
|
-
def expect_db_retrieval
|
60
|
-
allow(fetch_object).to receive(:retrieve_from_db)
|
61
|
-
yield
|
62
|
-
expect(fetch_object).to have_received(:retrieve_from_db) # .with(*args)
|
63
|
-
end
|
64
|
-
end
|
65
|
-
end
|
@@ -1,338 +0,0 @@
|
|
1
|
-
# -*- encoding : utf-8 -*-
|
2
|
-
|
3
|
-
RSpec.describe Card::Set::All::Fetch do
|
4
|
-
describe "#fetch" do
|
5
|
-
it "returns and caches existing cards" do
|
6
|
-
card_double = class_double("Card")
|
7
|
-
expect(Card.fetch("A")).to be_instance_of(Card)
|
8
|
-
expect(Card.cache.read("a")).to be_instance_of(Card)
|
9
|
-
expect(card_double).not_to receive(:find_by_key)
|
10
|
-
expect(Card.fetch("A")).to be_instance_of(Card)
|
11
|
-
end
|
12
|
-
|
13
|
-
it "returns nil and caches missing cards" do
|
14
|
-
expect(Card.fetch("Zork")).to be_nil
|
15
|
-
expect(Card.cache.read("zork").new_card?).to be_truthy
|
16
|
-
expect(Card.fetch("Zork")).to be_nil
|
17
|
-
end
|
18
|
-
|
19
|
-
it "returns nil and caches trash cards" do
|
20
|
-
Card::Auth.as_bot do
|
21
|
-
card_double = class_double("Card")
|
22
|
-
Card.fetch("A").delete!
|
23
|
-
expect(Card.fetch("A")).to be_nil
|
24
|
-
expect(card_double).not_to receive(:find_by_key_and_trash)
|
25
|
-
expect(Card.fetch("A")).to be_nil
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
29
|
-
it "returns and caches builtin cards" do
|
30
|
-
expect(Card.fetch("*head")).to be_instance_of(Card)
|
31
|
-
expect(Card.cache.read("*head")).not_to be_nil
|
32
|
-
end
|
33
|
-
|
34
|
-
it "returns virtual cards and caches them as missing" do
|
35
|
-
Card::Auth.as_bot do
|
36
|
-
card = Card.fetch("Joe User+*email")
|
37
|
-
expect(card).to be_a(Card).and have_name "Joe User+*email"
|
38
|
-
expect(card.format.render_raw).to eq("joe@user.com")
|
39
|
-
end
|
40
|
-
# card.content.should == 'joe@user.com'
|
41
|
-
# cached_card = Card.cache.read('joe_user+*email')
|
42
|
-
# cached_card.missing?.should be_true
|
43
|
-
# cached_card.virtual?.should be_true
|
44
|
-
end
|
45
|
-
|
46
|
-
it "fetches virtual cards after skipping them" do
|
47
|
-
expect(Card["A+*self"]).to be_nil
|
48
|
-
expect(Card.fetch("A+*self")).not_to be_nil
|
49
|
-
end
|
50
|
-
|
51
|
-
it "fetches newly virtual cards", as_bot: true do
|
52
|
-
expect(Card.fetch("A+virtual")).to be_nil
|
53
|
-
create "virtual+*right+*structure"
|
54
|
-
expect(Card.fetch("A+virtual")).not_to be_nil
|
55
|
-
end
|
56
|
-
|
57
|
-
it "fetches virtual set cards" do
|
58
|
-
aself = Card.fetch("A+*self")
|
59
|
-
Card::Cache.reset_all
|
60
|
-
Card.fetch "A+*self"
|
61
|
-
|
62
|
-
expect(aself.set_names).to include("Set+*type")
|
63
|
-
end
|
64
|
-
|
65
|
-
it "fetches structured cards" do
|
66
|
-
Card::Auth.as_bot do
|
67
|
-
Card.create! name: "y+*right+*structure", content: "Formatted Content"
|
68
|
-
Card.create! name: "a+y", content: "DB Content"
|
69
|
-
end
|
70
|
-
card = Card.fetch("a+y")
|
71
|
-
expect(card).to be_real.and have_content("Formatted Content").and have_db_content("DB Content")
|
72
|
-
end
|
73
|
-
|
74
|
-
it "handles name variants of cached cards" do
|
75
|
-
expect(Card.fetch("yomama+*self").name).to eq("yomama+*self")
|
76
|
-
expect(Card.fetch("YOMAMA+*self").name).to eq("YOMAMA+*self")
|
77
|
-
expect(Card.fetch("yomama", new: {}).name).to eq("yomama")
|
78
|
-
expect(Card.fetch("YOMAMA", new: {}).name).to eq("YOMAMA")
|
79
|
-
expect(Card.fetch("yomama!", new: { name: "Yomama" }).name)
|
80
|
-
.to eq("Yomama")
|
81
|
-
end
|
82
|
-
|
83
|
-
it "fetches junction of names" do
|
84
|
-
card = Card.fetch "A", "B"
|
85
|
-
expect(card).to be_instance_of(Card)
|
86
|
-
expect(card.name).to eq "A+B"
|
87
|
-
end
|
88
|
-
|
89
|
-
it "fetches junction of string, id, and codename" do
|
90
|
-
card = Card.fetch "Book", Card.fetch_id(:type), :structure
|
91
|
-
expect(card).to be_instance_of(Card)
|
92
|
-
expect(card.name).to eq "Book+*type+*structure"
|
93
|
-
end
|
94
|
-
|
95
|
-
it "fetches junction of name, card object, and codename" do
|
96
|
-
card = Card.fetch "Book".to_name, Card.fetch(:type), :structure
|
97
|
-
expect(card).to be_instance_of(Card)
|
98
|
-
expect(card.name).to eq "Book+*type+*structure"
|
99
|
-
end
|
100
|
-
|
101
|
-
it "does not recurse infinitely on template templates" do
|
102
|
-
expect(Card.fetch("*structure+*right+*structure")).to be_nil
|
103
|
-
end
|
104
|
-
|
105
|
-
it "expires card and dependencies on save" do
|
106
|
-
# Card.cache.dump # should be empty
|
107
|
-
Card.cache.soft.reset
|
108
|
-
expect(Card.cache.soft.store.keys).to eq([])
|
109
|
-
|
110
|
-
Card::Auth.as_bot do
|
111
|
-
a = Card.fetch("A")
|
112
|
-
expect(a).to be_instance_of(Card)
|
113
|
-
|
114
|
-
# expires the saved card
|
115
|
-
expect(a).to receive(:expire).and_call_original
|
116
|
-
# expect().to receive(:delete).with('a#SUBCARDS#').and_call_original
|
117
|
-
# expires plus cards
|
118
|
-
# expect(Card.cache).to receive(:delete).with('c+a')
|
119
|
-
# expect(Card.cache).to receive(:delete).with('d+a')
|
120
|
-
# expect(Card.cache).to receive(:delete).with('f+a')
|
121
|
-
# expect(Card.cache).to receive(:delete).with('a+b')
|
122
|
-
# expect(Card.cache).to receive(:delete).with('a+c')
|
123
|
-
# expect(Card.cache).to receive(:delete).with('a+d')
|
124
|
-
# expect(Card.cache).to receive(:delete).with('a+e')
|
125
|
-
# expect(Card.cache).to receive(:delete).with('a+b+c')
|
126
|
-
|
127
|
-
# expired including? cards
|
128
|
-
# expect(Card.cache).to receive(:delete).with('x').exactly(2).times
|
129
|
-
# expect(Card.cache).to receive(:delete).with('y').exactly(2).times
|
130
|
-
a.save!
|
131
|
-
end
|
132
|
-
end
|
133
|
-
|
134
|
-
describe "default option" do
|
135
|
-
context "when card doesn't exist" do
|
136
|
-
it "initializes new cards" do
|
137
|
-
card = Card.fetch "non-existent",
|
138
|
-
new: { default_content: "default content" }
|
139
|
-
expect(card.db_content).to eq "default content"
|
140
|
-
end
|
141
|
-
end
|
142
|
-
context "when new card exist" do
|
143
|
-
it "doesn't change anything" do
|
144
|
-
Card.new name: "new card",
|
145
|
-
"+sub" => { content: "some content" }
|
146
|
-
card = Card.fetch "new card+sub",
|
147
|
-
new: { default_content: "new content" }
|
148
|
-
expect(card.db_content).to eq "some content"
|
149
|
-
end
|
150
|
-
end
|
151
|
-
end
|
152
|
-
|
153
|
-
describe "preferences" do
|
154
|
-
before do
|
155
|
-
Card::Auth.signin Card::WagnBotID
|
156
|
-
end
|
157
|
-
|
158
|
-
it "prefers db cards to pattern virtual cards" do
|
159
|
-
Card.create! name: "y+*right+*structure",
|
160
|
-
content: "Formatted Content"
|
161
|
-
Card.create! name: "a+y", content: "DB Content"
|
162
|
-
card = Card.fetch("a+y")
|
163
|
-
expect(card).to be_not_virtual.and have_db_content "DB Content"
|
164
|
-
expect(card.rule(:structure)).to eq("Formatted Content")
|
165
|
-
end
|
166
|
-
|
167
|
-
it "prefers a pattern virtual card to trash cards" do
|
168
|
-
Card.create!(name: "y+*right+*structure", content: "Formatted Content")
|
169
|
-
Card.create!(name: "a+y", content: "DB Content")
|
170
|
-
Card.fetch("a+y").delete!
|
171
|
-
|
172
|
-
card = Card.fetch("a+y")
|
173
|
-
expect(card).to be_virtual.and have_content "Formatted Content"
|
174
|
-
end
|
175
|
-
|
176
|
-
it "recognizes pattern overrides" do
|
177
|
-
# ~~~ create right rule
|
178
|
-
Card.create!(name: "y+*right+*structure", content: "Right Content")
|
179
|
-
card = Card.fetch("a+y")
|
180
|
-
expect(card).to be_virtual.and have_content "Right Content"
|
181
|
-
|
182
|
-
# warn 'creating template'
|
183
|
-
tpr = Card.create! name: "RichText+y+*type plus right+*structure",
|
184
|
-
content: "Type Plus Right Content"
|
185
|
-
card = Card.fetch("a+y")
|
186
|
-
expect(card).to be_virtual.and have_content "Type Plus Right Content"
|
187
|
-
|
188
|
-
# ~~~ delete type plus right rule
|
189
|
-
tpr.delete!
|
190
|
-
card = Card.fetch("a+y")
|
191
|
-
expect(card).to be_virtual.and have_content "Right Content"
|
192
|
-
end
|
193
|
-
|
194
|
-
it "does not hit the database for every fetch_virtual lookup" do
|
195
|
-
card_double = class_double("Card")
|
196
|
-
Card.create!(name: "y+*right+*structure", content: "Formatted Content")
|
197
|
-
Card.fetch("a+y")
|
198
|
-
expect(card_double).not_to receive(:find_by_key)
|
199
|
-
Card.fetch("a+y")
|
200
|
-
end
|
201
|
-
|
202
|
-
it "does not be a new_record after being saved" do
|
203
|
-
Card.create!(name: "growing up")
|
204
|
-
card = Card.fetch("growing up")
|
205
|
-
expect(card.new_record?).to be_falsey
|
206
|
-
end
|
207
|
-
end
|
208
|
-
|
209
|
-
describe "default_content option" do
|
210
|
-
context "when card doesn't exist" do
|
211
|
-
it "initializes card with default content" do
|
212
|
-
card = Card.fetch "non-existent",
|
213
|
-
new: { default_content: "default content" }
|
214
|
-
expect(card).to have_db_content "default content"
|
215
|
-
end
|
216
|
-
end
|
217
|
-
context "when new card exist" do
|
218
|
-
it "doesn't change content" do
|
219
|
-
Card.new name: "new card", "+sub" => { content: "some content" }
|
220
|
-
card = Card.fetch "new card+sub", new: { default_content: "new content" }
|
221
|
-
expect(card).to have_db_content "some content"
|
222
|
-
end
|
223
|
-
end
|
224
|
-
end
|
225
|
-
end
|
226
|
-
|
227
|
-
describe "#fetch new: { ... }" do
|
228
|
-
it "returns a new card if it doesn't find one" do
|
229
|
-
new_card = Card.fetch "Never Seen Me Before", new: {}
|
230
|
-
expect(new_card).to be_a(Card).and be_a_new_record
|
231
|
-
expect { new_card.save! }.to increase_card_count.by(1)
|
232
|
-
end
|
233
|
-
|
234
|
-
it "returns a card if it finds one" do
|
235
|
-
new_card = Card.fetch "A+B", new: {}
|
236
|
-
expect(new_card).to be_a(Card).and be_real
|
237
|
-
expect { new_card.save! }.not_to increase_card_count
|
238
|
-
end
|
239
|
-
|
240
|
-
it "takes a second hash of options as new card options" do
|
241
|
-
new_card = Card.fetch "Never Before", new: { type: "Image" }
|
242
|
-
expect(new_card).to be_a(Card).and be_a_new_record
|
243
|
-
.and have_type(:image)
|
244
|
-
expect(Card.fetch("Never Before", new: {})).to have_type(:basic)
|
245
|
-
end
|
246
|
-
end
|
247
|
-
|
248
|
-
describe "#fetch_virtual" do
|
249
|
-
before do
|
250
|
-
Card::Auth.as_bot do
|
251
|
-
Card.create! name: "testsearch+*right+*structure",
|
252
|
-
content: '{"plus":"_self"}', type: "Search"
|
253
|
-
end
|
254
|
-
end
|
255
|
-
it "finds cards with *right+*structure specified" do
|
256
|
-
expect(Card.fetch("A+testsearch".to_name))
|
257
|
-
.to be_virtual.and have_type(:search_type)
|
258
|
-
.and have_content '{"plus":"_self"}'
|
259
|
-
end
|
260
|
-
context "fetched virtual card with new args" do
|
261
|
-
it "fetchs the virtual card with type set in patterns" do
|
262
|
-
Card.fetch "+testsearch", new: { name: "+testsearch",
|
263
|
-
supercard: Card["home"] }
|
264
|
-
|
265
|
-
c = Card.fetch("Home+testsearch".to_name)
|
266
|
-
expect(c).to be_virtual.and have_type(:search_type)
|
267
|
-
.and have_content('{"plus":"_self"}')
|
268
|
-
|
269
|
-
patterns = c.instance_variable_get("@patterns").map(&:to_s)
|
270
|
-
expect(patterns).to include("Search+*type")
|
271
|
-
end
|
272
|
-
end
|
273
|
-
end
|
274
|
-
|
275
|
-
describe "#id" do
|
276
|
-
it "handles integer args" do
|
277
|
-
expect(Card.id(1234)).to eq(1234)
|
278
|
-
end
|
279
|
-
|
280
|
-
it "handles card args" do
|
281
|
-
a = Card["A"]
|
282
|
-
expect(Card.id(a)).to eq(a.id)
|
283
|
-
end
|
284
|
-
|
285
|
-
it "handles symbols" do
|
286
|
-
expect(Card.id(:structure)).to eq(Card::StructureID)
|
287
|
-
end
|
288
|
-
end
|
289
|
-
|
290
|
-
describe "#exists?" do
|
291
|
-
it "is true for cards that are there" do
|
292
|
-
expect(Card.exists?("A")).to eq(true)
|
293
|
-
end
|
294
|
-
|
295
|
-
it "is false for cards that aren't" do
|
296
|
-
expect(Card.exists?("Mumblefunk is gone")).to eq(false)
|
297
|
-
end
|
298
|
-
end
|
299
|
-
|
300
|
-
describe "#fetch_name" do
|
301
|
-
example "symbol" do
|
302
|
-
expect(Card.fetch_name(:all)).to eq "*all"
|
303
|
-
end
|
304
|
-
|
305
|
-
example "string" do
|
306
|
-
expect(Card.fetch_name("home")).to eq "Home"
|
307
|
-
end
|
308
|
-
|
309
|
-
example "id" do
|
310
|
-
expect(Card.fetch_name(Card::BasicID)).to eq "RichText"
|
311
|
-
end
|
312
|
-
|
313
|
-
example "invalid id" do
|
314
|
-
expect(Card.fetch_name("~1836/[[/assets/fonts")).to be_nil
|
315
|
-
end
|
316
|
-
|
317
|
-
example "array" do
|
318
|
-
expect(Card.fetch_name(%w[a b])).to eq "A+B"
|
319
|
-
end
|
320
|
-
|
321
|
-
example "param list" do
|
322
|
-
expect(Card.fetch_name("fruit", :type, "*create")).to eq "Fruit+*type+*create"
|
323
|
-
end
|
324
|
-
|
325
|
-
example "name doesn't exist" do
|
326
|
-
expect(Card.fetch_name("unknown_name")).to eq nil
|
327
|
-
end
|
328
|
-
|
329
|
-
example "fallback policy" do
|
330
|
-
name = Card.fetch_name("unknown_name") { "Unknown Name" }
|
331
|
-
expect(name).to eq "Unknown Name"
|
332
|
-
end
|
333
|
-
|
334
|
-
it "doesn't fetch virtual names" do
|
335
|
-
expect(Card.fetch_name(:all, :self, :create)).to eq nil
|
336
|
-
end
|
337
|
-
end
|
338
|
-
end
|