acts_as_saveable 0.10.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gitignore +6 -0
- data/.travis.yml +25 -0
- data/Gemfile +17 -0
- data/README.markdown +399 -0
- data/Rakefile +10 -0
- data/acts_as_saveable.gemspec +24 -0
- data/lib/acts_as_saveable.rb +21 -0
- data/lib/acts_as_saveable/extenders/controller.rb +19 -0
- data/lib/acts_as_saveable/extenders/saveable.rb +25 -0
- data/lib/acts_as_saveable/extenders/saver.rb +24 -0
- data/lib/acts_as_saveable/helpers/words.rb +36 -0
- data/lib/acts_as_saveable/save.rb +28 -0
- data/lib/acts_as_saveable/saveable.rb +330 -0
- data/lib/acts_as_saveable/saver.rb +131 -0
- data/lib/acts_as_saveable/version.rb +3 -0
- data/lib/generators/acts_as_saveable/migration/migration_generator.rb +31 -0
- data/lib/generators/acts_as_saveable/migration/templates/active_record/migration.rb +27 -0
- data/spec/saveable_saver_spec.rb +21 -0
- data/spec/saveable_spec.rb +21 -0
- data/spec/saver_spec.rb +21 -0
- data/spec/shared_example/saveable_model_spec.rb +484 -0
- data/spec/shared_example/saver_model_spec.rb +275 -0
- data/spec/spec_helper.rb +132 -0
- data/spec/words_spec.rb +30 -0
- metadata +103 -0
@@ -0,0 +1,131 @@
|
|
1
|
+
module ActsAsSaveable
|
2
|
+
module Saver
|
3
|
+
|
4
|
+
def self.included(base)
|
5
|
+
|
6
|
+
# allow user to define these
|
7
|
+
aliases = {
|
8
|
+
:save_up_for => [:likes, :upsaves, :up_saves],
|
9
|
+
:save_down_for => [:dislikes, :downsaves, :down_saves],
|
10
|
+
:saved_on? => [:saved_for?],
|
11
|
+
:saved_up_on? => [:saved_up_for?],
|
12
|
+
:saved_down_on? => [:saved_down_for?],
|
13
|
+
:saved_as_when_saving_on => [:saved_as_when_saved_on, :saved_as_when_saving_for, :saved_as_when_saved_for],
|
14
|
+
}
|
15
|
+
|
16
|
+
base.class_eval do
|
17
|
+
|
18
|
+
has_many :saves, :class_name => 'ActsAsSaveable::Save', :as => :saver, :dependent => :destroy do
|
19
|
+
def saveables
|
20
|
+
includes(:saveable).map(&:saveable)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
aliases.each do |method, links|
|
25
|
+
links.each do |new_method|
|
26
|
+
alias_method(new_method, method)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
33
|
+
|
34
|
+
# saving
|
35
|
+
def saved args
|
36
|
+
args[:saveable].save_by args.merge({:saver => self})
|
37
|
+
end
|
38
|
+
|
39
|
+
def save_up_for model=nil, args={}
|
40
|
+
saved :saveable => model, :save_scope => args[:save_scope], :saved => true
|
41
|
+
end
|
42
|
+
|
43
|
+
def save_down_for model=nil, args={}
|
44
|
+
saved :saveable => model, :save_scope => args[:save_scope], :saved => false
|
45
|
+
end
|
46
|
+
|
47
|
+
def unsave_for model, args={}
|
48
|
+
model.unsaved :saver => self, :save_scope => args[:save_scope]
|
49
|
+
end
|
50
|
+
|
51
|
+
# results
|
52
|
+
def saved_on? saveable, args={}
|
53
|
+
saves = find_saves(:saveable_id => saveable.id, :saveable_type => saveable.class.base_class.name,
|
54
|
+
:save_scope => args[:save_scope])
|
55
|
+
saves.size > 0
|
56
|
+
end
|
57
|
+
|
58
|
+
def saved_up_on? saveable, args={}
|
59
|
+
saves = find_saves(:saveable_id => saveable.id, :saveable_type => saveable.class.base_class.name,
|
60
|
+
:save_scope => args[:save_scope], :save_flag => true)
|
61
|
+
saves.size > 0
|
62
|
+
end
|
63
|
+
|
64
|
+
def saved_down_on? saveable, args={}
|
65
|
+
saves = find_saves(:saveable_id => saveable.id, :saveable_type => saveable.class.base_class.name,
|
66
|
+
:save_scope => args[:save_scope], :save_flag => false)
|
67
|
+
saves.size > 0
|
68
|
+
end
|
69
|
+
|
70
|
+
def saved_as_when_saving_on saveable, args={}
|
71
|
+
saved = find_saves(:saveable_id => saveable.id, :saveable_type => saveable.class.base_class.name,
|
72
|
+
:save_scope => args[:save_scope]).select(:save_flag).last
|
73
|
+
return nil unless saved
|
74
|
+
return saved.save_flag
|
75
|
+
end
|
76
|
+
|
77
|
+
def find_saves extra_conditions = {}
|
78
|
+
saves.where(extra_conditions)
|
79
|
+
end
|
80
|
+
|
81
|
+
def find_up_saves args={}
|
82
|
+
find_saves :save_flag => true, :save_scope => args[:save_scope]
|
83
|
+
end
|
84
|
+
|
85
|
+
def find_down_saves args={}
|
86
|
+
find_saves :save_flag => false, :save_scope => args[:save_scope]
|
87
|
+
end
|
88
|
+
|
89
|
+
def find_saves_for_class klass, extra_conditions = {}
|
90
|
+
find_saves extra_conditions.merge({:saveable_type => klass.name})
|
91
|
+
end
|
92
|
+
|
93
|
+
def find_up_saves_for_class klass, args={}
|
94
|
+
find_saves_for_class klass, :save_flag => true, :save_scope => args[:save_scope]
|
95
|
+
end
|
96
|
+
|
97
|
+
def find_down_saves_for_class klass, args={}
|
98
|
+
find_saves_for_class klass, :save_flag => false, :save_scope => args[:save_scope]
|
99
|
+
end
|
100
|
+
|
101
|
+
# Including polymporphic relations for eager loading
|
102
|
+
def include_objects
|
103
|
+
ActsAsSaveable::Save.includes(:saveable)
|
104
|
+
end
|
105
|
+
|
106
|
+
def find_saved_items extra_conditions = {}
|
107
|
+
options = extra_conditions.merge :saver_id => id, :saver_type => self.class.base_class.name
|
108
|
+
include_objects.where(options).collect(&:saveable)
|
109
|
+
end
|
110
|
+
|
111
|
+
def find_up_saved_items extra_conditions = {}
|
112
|
+
find_saved_items extra_conditions.merge(:save_flag => true)
|
113
|
+
end
|
114
|
+
|
115
|
+
def find_down_saved_items extra_conditions = {}
|
116
|
+
find_saved_items extra_conditions.merge(:save_flag => false)
|
117
|
+
end
|
118
|
+
|
119
|
+
def get_saved klass, extra_conditions = {}
|
120
|
+
klass.joins(:saves_for).merge find_saves(extra_conditions)
|
121
|
+
end
|
122
|
+
|
123
|
+
def get_up_saved klass
|
124
|
+
klass.joins(:saves_for).merge find_up_saves
|
125
|
+
end
|
126
|
+
|
127
|
+
def get_down_saved klass
|
128
|
+
klass.joins(:saves_for).merge find_down_saves
|
129
|
+
end
|
130
|
+
end
|
131
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'rails/generators/migration'
|
2
|
+
|
3
|
+
module ActsAsSaveable
|
4
|
+
class MigrationGenerator < Rails::Generators::Base
|
5
|
+
include Rails::Generators::Migration
|
6
|
+
|
7
|
+
desc "Generates migration for saveable (saves table)"
|
8
|
+
|
9
|
+
def self.orm
|
10
|
+
Rails::Generators.options[:rails][:orm]
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.source_root
|
14
|
+
File.join(File.dirname(__FILE__), 'templates', (orm.to_s unless orm.class.eql?(String)) )
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.orm_has_migration?
|
18
|
+
[:active_record].include? orm
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.next_migration_number(path)
|
22
|
+
Time.now.utc.strftime("%Y%m%d%H%M%S")
|
23
|
+
end
|
24
|
+
|
25
|
+
def create_migration_file
|
26
|
+
if self.class.orm_has_migration?
|
27
|
+
migration_template 'migration.rb', 'db/migrate/acts_as_saveable_migration.rb'
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
class ActsAsSaveableMigration < ActiveRecord::Migration
|
2
|
+
def self.up
|
3
|
+
create_table :saves do |t|
|
4
|
+
|
5
|
+
t.references :saveable, :polymorphic => true
|
6
|
+
t.references :saver, :polymorphic => true
|
7
|
+
|
8
|
+
t.boolean :save_flag
|
9
|
+
t.string :save_scope
|
10
|
+
t.integer :save_weight
|
11
|
+
|
12
|
+
t.timestamps
|
13
|
+
end
|
14
|
+
|
15
|
+
if ActiveRecord::VERSION::MAJOR < 4
|
16
|
+
add_index :saves, [:saveable_id, :saveable_type]
|
17
|
+
add_index :saves, [:saver_id, :saver_type]
|
18
|
+
end
|
19
|
+
|
20
|
+
add_index :saves, [:saver_id, :saver_type, :save_scope]
|
21
|
+
add_index :saves, [:saveable_id, :saveable_type, :save_scope]
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.down
|
25
|
+
drop_table :saves
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'acts_as_saveable'
|
2
|
+
require 'spec_helper'
|
3
|
+
|
4
|
+
describe SaveableSaver do
|
5
|
+
it_behaves_like "a saveable_model" do
|
6
|
+
# TODO Replace with factories
|
7
|
+
let (:saver) { SaveableSaver.create(:name => 'i can saved!') }
|
8
|
+
let (:saver2) { SaveableSaver.create(:name => 'a new person') }
|
9
|
+
let (:saver3) { Saver.create(:name => 'another person') }
|
10
|
+
let (:saveable) { SaveableSaver.create(:name => 'a saving model') }
|
11
|
+
let (:saveable_cache) { SaveableCache.create(:name => 'saving model with cache') }
|
12
|
+
end
|
13
|
+
|
14
|
+
it_behaves_like "a saver_model" do
|
15
|
+
# TODO Replace with factories
|
16
|
+
let (:saver) { SaveableSaver.create(:name => 'i can saved!') }
|
17
|
+
let (:saver2) { SaveableSaver.create(:name => 'a new person') }
|
18
|
+
let (:saveable) { SaveableSaver.create(:name => 'a saving model') }
|
19
|
+
let (:saveable2) { SaveableSaver.create(:name => 'a 2nd saving model') }
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'acts_as_saveable'
|
2
|
+
require 'spec_helper'
|
3
|
+
|
4
|
+
describe ActsAsSaveable::Saveable do
|
5
|
+
it "should not be saveable" do
|
6
|
+
expect(NotSaveable).not_to be_saveable
|
7
|
+
end
|
8
|
+
|
9
|
+
it "should be saveable" do
|
10
|
+
expect(Saveable).to be_saveable
|
11
|
+
end
|
12
|
+
|
13
|
+
it_behaves_like "a saveable_model" do
|
14
|
+
# TODO Replace with factories
|
15
|
+
let (:saver) { Saver.create(:name =>'i can saved!') }
|
16
|
+
let (:saver2) { Saver.create(:name => 'a new person') }
|
17
|
+
let (:saver3) { Saver.create(:name => 'another person') }
|
18
|
+
let (:saveable) { Saveable.create(:name =>'a saving model') }
|
19
|
+
let (:saveable_cache) { SaveableCache.create(:name => 'saving model with cache') }
|
20
|
+
end
|
21
|
+
end
|
data/spec/saver_spec.rb
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'acts_as_saveable'
|
2
|
+
require 'spec_helper'
|
3
|
+
|
4
|
+
describe ActsAsSaveable::Saver do
|
5
|
+
|
6
|
+
it "should not be a saver" do
|
7
|
+
expect(NotSaveable).not_to be_saveable
|
8
|
+
end
|
9
|
+
|
10
|
+
it "should be a saver" do
|
11
|
+
expect(Saveable).to be_saveable
|
12
|
+
end
|
13
|
+
|
14
|
+
it_behaves_like "a saver_model" do
|
15
|
+
# TODO Replace with factories
|
16
|
+
let (:saver) { Saver.create(:name => 'i can saved!') }
|
17
|
+
let (:saver2) { Saver.create(:name => 'a new person') }
|
18
|
+
let (:saveable) { Saveable.create(:name => 'a saving model') }
|
19
|
+
let (:saveable2) { Saveable.create(:name => 'a 2nd saving model') }
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,484 @@
|
|
1
|
+
shared_examples "a saveable_model" do
|
2
|
+
it "should return false when a saved with no saver is saved" do
|
3
|
+
expect(saveable.save_by).to be false
|
4
|
+
end
|
5
|
+
|
6
|
+
it "should have one saved when saved" do
|
7
|
+
saveable.save_by :saver => saver, :saved => 'yes'
|
8
|
+
expect(saveable.saves_for.size).to eq(1)
|
9
|
+
end
|
10
|
+
|
11
|
+
it "should have one saved when saved on twice by the same person" do
|
12
|
+
saveable.save_by :saver => saver, :saved => 'yes'
|
13
|
+
saveable.save_by :saver => saver, :saved => 'no'
|
14
|
+
expect(saveable.saves_for.size).to eq(1)
|
15
|
+
end
|
16
|
+
|
17
|
+
it "should have two saves_for when saved on twice by the same person with duplicate paramenter" do
|
18
|
+
saveable.save_by :saver => saver, :saved => 'yes'
|
19
|
+
saveable.save_by :saver => saver, :saved => 'no', :duplicate => true
|
20
|
+
expect(saveable.saves_for.size).to eq(2)
|
21
|
+
end
|
22
|
+
|
23
|
+
it "should have one scoped saved when saving under an scope" do
|
24
|
+
saveable.save_by :saver => saver, :saved => 'yes', :save_scope => 'rank'
|
25
|
+
expect(saveable.find_saves_for(:save_scope => 'rank').size).to eq(1)
|
26
|
+
end
|
27
|
+
|
28
|
+
it "should have one saved when saved on twice using scope by the same person" do
|
29
|
+
saveable.save_by :saver => saver, :saved => 'yes', :save_scope => 'rank'
|
30
|
+
saveable.save_by :saver => saver, :saved => 'no', :save_scope => 'rank'
|
31
|
+
expect(saveable.find_saves_for(:save_scope => 'rank').size).to eq(1)
|
32
|
+
end
|
33
|
+
|
34
|
+
it "should have two saves_for when saving on two different scopes by the same person" do
|
35
|
+
saveable.save_by :saver => saver, :saved => 'yes', :save_scope => 'weekly_rank'
|
36
|
+
saveable.save_by :saver => saver, :saved => 'no', :save_scope => 'monthly_rank'
|
37
|
+
expect(saveable.saves_for.size).to eq(2)
|
38
|
+
end
|
39
|
+
|
40
|
+
it "should be callable with save_up" do
|
41
|
+
saveable.save_up saver
|
42
|
+
expect(saveable.get_up_saves.first.saver).to eq(saver)
|
43
|
+
end
|
44
|
+
|
45
|
+
it "should be callable with save_down" do
|
46
|
+
saveable.save_down saver
|
47
|
+
expect(saveable.get_down_saves.first.saver).to eq(saver)
|
48
|
+
end
|
49
|
+
|
50
|
+
it "should have 2 saves_for when saved on once by two different people" do
|
51
|
+
saveable.save_by :saver => saver
|
52
|
+
saveable.save_by :saver => saver2
|
53
|
+
expect(saveable.saves_for.size).to eq(2)
|
54
|
+
end
|
55
|
+
|
56
|
+
it "should have one true saved" do
|
57
|
+
saveable.save_by :saver => saver
|
58
|
+
saveable.save_by :saver => saver2, :saved => 'dislike'
|
59
|
+
expect(saveable.get_up_saves.size).to eq(1)
|
60
|
+
end
|
61
|
+
|
62
|
+
it "should have 2 false saves_for" do
|
63
|
+
saveable.save_by :saver => saver, :saved => 'no'
|
64
|
+
saveable.save_by :saver => saver2, :saved => 'dislike'
|
65
|
+
expect(saveable.get_down_saves.size).to eq(2)
|
66
|
+
end
|
67
|
+
|
68
|
+
it "should have been saved on by saver2" do
|
69
|
+
saveable.save_by :saver => saver2, :saved => true
|
70
|
+
expect(saveable.find_saves_for.first.saver.id).to be saver2.id
|
71
|
+
end
|
72
|
+
|
73
|
+
it "should count the saved as registered if this is the savers first saved" do
|
74
|
+
saveable.save_by :saver => saver
|
75
|
+
expect(saveable.save_registered?).to be true
|
76
|
+
end
|
77
|
+
|
78
|
+
it "should not count the saved as being registered if that saver has already saved and the saved has not changed" do
|
79
|
+
saveable.save_by :saver => saver, :saved => true
|
80
|
+
saveable.save_by :saver => saver, :saved => 'yes'
|
81
|
+
expect(saveable.save_registered?).to be false
|
82
|
+
end
|
83
|
+
|
84
|
+
it "should count the saved as registered if the saver has saved and the saved flag has changed" do
|
85
|
+
saveable.save_by :saver => saver, :saved => true
|
86
|
+
saveable.save_by :saver => saver, :saved => 'dislike'
|
87
|
+
expect(saveable.save_registered?).to be true
|
88
|
+
end
|
89
|
+
|
90
|
+
it "should count the saved as registered if the saver has saved and the saved weight has changed" do
|
91
|
+
saveable.save_by :saver => saver, :saved => true, :save_weight => 1
|
92
|
+
saveable.save_by :saver => saver, :saved => true, :save_weight => 2
|
93
|
+
expect(saveable.save_registered?).to be true
|
94
|
+
end
|
95
|
+
|
96
|
+
it "should be saved on by saver" do
|
97
|
+
saveable.save_by :saver => saver
|
98
|
+
expect(saveable.saved_on_by?(saver)).to be true
|
99
|
+
end
|
100
|
+
|
101
|
+
it "should be able to unsaved a saver" do
|
102
|
+
saveable.upsaved_by(saver)
|
103
|
+
saveable.unsave_by(saver)
|
104
|
+
expect(saveable.saved_on_by?(saver)).to be false
|
105
|
+
end
|
106
|
+
|
107
|
+
it "should unsaved a positive saved" do
|
108
|
+
saveable.save_by :saver => saver
|
109
|
+
saveable.unsaved :saver => saver
|
110
|
+
expect(saveable.find_saves_for.count).to eq(0)
|
111
|
+
end
|
112
|
+
|
113
|
+
it "should set the saveable to unregistered after unsaving" do
|
114
|
+
saveable.save_by :saver => saver
|
115
|
+
saveable.unsaved :saver => saver
|
116
|
+
expect(saveable.save_registered?).to be false
|
117
|
+
end
|
118
|
+
|
119
|
+
it "should unsaved a negative saved" do
|
120
|
+
saveable.save_by :saver => saver, :saved => 'no'
|
121
|
+
saveable.unsaved :saver => saver
|
122
|
+
expect(saveable.find_saves_for.count).to eq(0)
|
123
|
+
end
|
124
|
+
|
125
|
+
it "should unsaved only the from a single saver" do
|
126
|
+
saveable.save_by :saver => saver
|
127
|
+
saveable.save_by :saver => saver2
|
128
|
+
saveable.unsaved :saver => saver
|
129
|
+
expect(saveable.find_saves_for.count).to eq(1)
|
130
|
+
end
|
131
|
+
|
132
|
+
it "should be contained to instances" do
|
133
|
+
saveable2 = Saveable.new(:name => '2nd saveable')
|
134
|
+
saveable2.save
|
135
|
+
|
136
|
+
saveable.save_by :saver => saver, :saved => false
|
137
|
+
saveable2.save_by :saver => saver, :saved => true
|
138
|
+
saveable2.save_by :saver => saver, :saved => true
|
139
|
+
|
140
|
+
expect(saveable.save_registered?).to be true
|
141
|
+
expect(saveable2.save_registered?).to be false
|
142
|
+
end
|
143
|
+
|
144
|
+
it "should set default saved weight to 1 if not specified" do
|
145
|
+
saveable.upsave_by saver
|
146
|
+
expect(saveable.find_saves_for.first.save_weight).to eq(1)
|
147
|
+
end
|
148
|
+
|
149
|
+
describe "with cached saves_for" do
|
150
|
+
|
151
|
+
before(:each) do
|
152
|
+
clean_database
|
153
|
+
saver = Saver.new(:name => 'i can saved!')
|
154
|
+
saver.save
|
155
|
+
|
156
|
+
saveable = Saveable.new(:name => 'a saving model without a cache')
|
157
|
+
saveable.save
|
158
|
+
|
159
|
+
saveable_cache = SaveableCache.new(:name => 'saving model with cache')
|
160
|
+
saveable_cache.save
|
161
|
+
end
|
162
|
+
|
163
|
+
it "should not update cached saves_for if there are no columns" do
|
164
|
+
saveable.save_by :saver => saver
|
165
|
+
end
|
166
|
+
|
167
|
+
it "should update cached total saves_for if there is a total column" do
|
168
|
+
saveable_cache.cached_saves_total = 50
|
169
|
+
saveable_cache.save_by :saver => saver
|
170
|
+
expect(saveable_cache.cached_saves_total).to eq(1)
|
171
|
+
end
|
172
|
+
|
173
|
+
it "should update cached total saves_for when a saved up is removed" do
|
174
|
+
saveable_cache.save_by :saver => saver, :saved => 'true'
|
175
|
+
saveable_cache.unsaved :saver => saver
|
176
|
+
expect(saveable_cache.cached_saves_total).to eq(0)
|
177
|
+
end
|
178
|
+
|
179
|
+
it "should update cached total saves_for when a saved down is removed" do
|
180
|
+
saveable_cache.save_by :saver => saver, :saved => 'false'
|
181
|
+
saveable_cache.unsaved :saver => saver
|
182
|
+
expect(saveable_cache.cached_saves_total).to eq(0)
|
183
|
+
end
|
184
|
+
|
185
|
+
it "should update cached score saves_for if there is a score column" do
|
186
|
+
saveable_cache.cached_saves_score = 50
|
187
|
+
saveable_cache.save_by :saver => saver
|
188
|
+
expect(saveable_cache.cached_saves_score).to eq(1)
|
189
|
+
saveable_cache.save_by :saver => saver2, :saved => 'false'
|
190
|
+
expect(saveable_cache.cached_saves_score).to eq(0)
|
191
|
+
saveable_cache.save_by :saver => saver, :saved => 'false'
|
192
|
+
expect(saveable_cache.cached_saves_score).to eq(-2)
|
193
|
+
end
|
194
|
+
|
195
|
+
it "should update cached score saves_for when a saved up is removed" do
|
196
|
+
saveable_cache.save_by :saver => saver, :saved => 'true'
|
197
|
+
expect(saveable_cache.cached_saves_score).to eq(1)
|
198
|
+
saveable_cache.unsaved :saver => saver
|
199
|
+
expect(saveable_cache.cached_saves_score).to eq(0)
|
200
|
+
end
|
201
|
+
|
202
|
+
it "should update cached score saves_for when a saved down is removed" do
|
203
|
+
saveable_cache.save_by :saver => saver, :saved => 'false'
|
204
|
+
expect(saveable_cache.cached_saves_score).to eq(-1)
|
205
|
+
saveable_cache.unsaved :saver => saver
|
206
|
+
expect(saveable_cache.cached_saves_score).to eq(0)
|
207
|
+
end
|
208
|
+
|
209
|
+
it "should update cached weighted total if there is a weighted total column" do
|
210
|
+
saveable_cache.cached_weighted_total = 50
|
211
|
+
saveable_cache.save_by :saver => saver
|
212
|
+
expect(saveable_cache.cached_weighted_total).to eq(1)
|
213
|
+
saveable_cache.save_by :saver => saver2, :saved => 'false'
|
214
|
+
expect(saveable_cache.cached_weighted_total).to eq(2)
|
215
|
+
end
|
216
|
+
|
217
|
+
it "should update cached weighted total saves_for when a saved up is removed" do
|
218
|
+
saveable_cache.save_by :saver => saver, :saved => 'true', :save_weight => 3
|
219
|
+
expect(saveable_cache.cached_weighted_total).to eq(3)
|
220
|
+
saveable_cache.unsaved :saver => saver
|
221
|
+
expect(saveable_cache.cached_weighted_total).to eq(0)
|
222
|
+
end
|
223
|
+
|
224
|
+
it "should update cached weighted total saves_for when a saved down is removed" do
|
225
|
+
saveable_cache.save_by :saver => saver, :saved => 'false', :save_weight => 4
|
226
|
+
expect(saveable_cache.cached_weighted_total).to eq(4)
|
227
|
+
saveable_cache.unsaved :saver => saver
|
228
|
+
expect(saveable_cache.cached_weighted_total).to eq(0)
|
229
|
+
end
|
230
|
+
|
231
|
+
it "should update cached weighted score if there is a weighted score column" do
|
232
|
+
saveable_cache.cached_weighted_score = 50
|
233
|
+
saveable_cache.save_by :saver => saver, :save_weight => 3
|
234
|
+
expect(saveable_cache.cached_weighted_score).to eq(3)
|
235
|
+
saveable_cache.save_by :saver => saver2, :saved => 'false', :save_weight => 5
|
236
|
+
expect(saveable_cache.cached_weighted_score).to eq(-2)
|
237
|
+
# saver changes her saved from 3 to 5
|
238
|
+
saveable_cache.save_by :saver => saver, :save_weight => 5
|
239
|
+
expect(saveable_cache.cached_weighted_score).to eq(0)
|
240
|
+
saveable_cache.save_by :saver => saver3, :save_weight => 4
|
241
|
+
expect(saveable_cache.cached_weighted_score).to eq(4)
|
242
|
+
end
|
243
|
+
|
244
|
+
it "should update cached weighted score saves_for when a saved up is removed" do
|
245
|
+
saveable_cache.save_by :saver => saver, :saved => 'true', :save_weight => 3
|
246
|
+
expect(saveable_cache.cached_weighted_score).to eq(3)
|
247
|
+
saveable_cache.unsaved :saver => saver
|
248
|
+
expect(saveable_cache.cached_weighted_score).to eq(0)
|
249
|
+
end
|
250
|
+
|
251
|
+
it "should update cached weighted score saves_for when a saved down is removed" do
|
252
|
+
saveable_cache.save_by :saver => saver, :saved => 'false', :save_weight => 4
|
253
|
+
expect(saveable_cache.cached_weighted_score).to eq(-4)
|
254
|
+
saveable_cache.unsaved :saver => saver
|
255
|
+
expect(saveable_cache.cached_weighted_score).to eq(0)
|
256
|
+
end
|
257
|
+
|
258
|
+
it "should update cached weighted average if there is a weighted average column" do
|
259
|
+
saveable_cache.cached_weighted_average = 50.0
|
260
|
+
saveable_cache.save_by :saver => saver, :saved => 'true', :save_weight => 5
|
261
|
+
expect(saveable_cache.cached_weighted_average).to eq(5.0)
|
262
|
+
saveable_cache.save_by :saver => saver2, :saved => 'true', :save_weight => 3
|
263
|
+
expect(saveable_cache.cached_weighted_average).to eq(4.0)
|
264
|
+
# saver changes her saved from 5 to 4
|
265
|
+
saveable_cache.save_by :saver => saver, :saved => 'true', :save_weight => 4
|
266
|
+
expect(saveable_cache.cached_weighted_average).to eq(3.5)
|
267
|
+
saveable_cache.save_by :saver => saver3, :saved => 'true', :save_weight => 5
|
268
|
+
expect(saveable_cache.cached_weighted_average).to eq(4.0)
|
269
|
+
end
|
270
|
+
|
271
|
+
it "should update cached weighted average saves_for when a saved up is removed" do
|
272
|
+
saveable_cache.save_by :saver => saver, :saved => 'true', :save_weight => 5
|
273
|
+
saveable_cache.save_by :saver => saver2, :saved => 'true', :save_weight => 3
|
274
|
+
expect(saveable_cache.cached_weighted_average).to eq(4)
|
275
|
+
saveable_cache.unsaved :saver => saver
|
276
|
+
expect(saveable_cache.cached_weighted_average).to eq(3)
|
277
|
+
end
|
278
|
+
|
279
|
+
it "should update cached up saves_for if there is an up saved column" do
|
280
|
+
saveable_cache.cached_saves_up = 50
|
281
|
+
saveable_cache.save_by :saver => saver
|
282
|
+
saveable_cache.save_by :saver => saver
|
283
|
+
expect(saveable_cache.cached_saves_up).to eq(1)
|
284
|
+
end
|
285
|
+
|
286
|
+
it "should update cached down saves_for if there is a down saved column" do
|
287
|
+
saveable_cache.cached_saves_down = 50
|
288
|
+
saveable_cache.save_by :saver => saver, :saved => 'false'
|
289
|
+
expect(saveable_cache.cached_saves_down).to eq(1)
|
290
|
+
end
|
291
|
+
|
292
|
+
it "should update cached up saves_for when a saved up is removed" do
|
293
|
+
saveable_cache.save_by :saver => saver, :saved => 'true'
|
294
|
+
saveable_cache.unsaved :saver => saver
|
295
|
+
expect(saveable_cache.cached_saves_up).to eq(0)
|
296
|
+
end
|
297
|
+
|
298
|
+
it "should update cached down saves_for when a saved down is removed" do
|
299
|
+
saveable_cache.save_by :saver => saver, :saved => 'false'
|
300
|
+
saveable_cache.unsaved :saver => saver
|
301
|
+
expect(saveable_cache.cached_saves_down).to eq(0)
|
302
|
+
end
|
303
|
+
|
304
|
+
it "should select from cached total saves_for if there a total column" do
|
305
|
+
saveable_cache.save_by :saver => saver
|
306
|
+
saveable_cache.cached_saves_total = 50
|
307
|
+
expect(saveable_cache.count_saves_total).to eq(50)
|
308
|
+
end
|
309
|
+
|
310
|
+
it "should select from cached up saves_for if there is an up saved column" do
|
311
|
+
saveable_cache.save_by :saver => saver
|
312
|
+
saveable_cache.cached_saves_up = 50
|
313
|
+
expect(saveable_cache.count_saves_up).to eq(50)
|
314
|
+
end
|
315
|
+
|
316
|
+
it "should select from cached down saves_for if there is a down saved column" do
|
317
|
+
saveable_cache.save_by :saver => saver, :saved => 'false'
|
318
|
+
saveable_cache.cached_saves_down = 50
|
319
|
+
expect(saveable_cache.count_saves_down).to eq(50)
|
320
|
+
end
|
321
|
+
|
322
|
+
it "should select from cached weighted total if there is a weighted total column" do
|
323
|
+
saveable_cache.save_by :saver => saver, :saved => 'false'
|
324
|
+
saveable_cache.cached_weighted_total = 50
|
325
|
+
expect(saveable_cache.weighted_total).to eq(50)
|
326
|
+
end
|
327
|
+
|
328
|
+
it "should select from cached weighted score if there is a weighted score column" do
|
329
|
+
saveable_cache.save_by :saver => saver, :saved => 'false'
|
330
|
+
saveable_cache.cached_weighted_score = 50
|
331
|
+
expect(saveable_cache.weighted_score).to eq(50)
|
332
|
+
end
|
333
|
+
|
334
|
+
it "should select from cached weighted average if there is a weighted average column" do
|
335
|
+
saveable_cache.save_by :saver => saver, :saved => 'false'
|
336
|
+
saveable_cache.cached_weighted_average = 50
|
337
|
+
expect(saveable_cache.weighted_average).to eq(50)
|
338
|
+
end
|
339
|
+
|
340
|
+
it "should update cached total saves_for when saving under an scope" do
|
341
|
+
saveable_cache.save_by :saver => saver, :saved => 'true', :save_scope => 'rank'
|
342
|
+
expect(saveable_cache.cached_saves_total).to eq(1)
|
343
|
+
end
|
344
|
+
|
345
|
+
it "should update cached up saves_for when saving under an scope" do
|
346
|
+
saveable_cache.save_by :saver => saver, :saved => 'true', :save_scope => 'rank'
|
347
|
+
expect(saveable_cache.cached_saves_up).to eq(1)
|
348
|
+
end
|
349
|
+
|
350
|
+
it "should update cached total saves_for when a scoped saved down is removed" do
|
351
|
+
saveable_cache.save_by :saver => saver, :saved => 'true', :save_scope => 'rank'
|
352
|
+
saveable_cache.unsaved :saver => saver, :save_scope => 'rank'
|
353
|
+
expect(saveable_cache.cached_saves_total).to eq(0)
|
354
|
+
end
|
355
|
+
|
356
|
+
it "should update cached up saves_for when a scoped saved down is removed" do
|
357
|
+
saveable_cache.save_by :saver => saver, :saved => 'true', :save_scope => 'rank'
|
358
|
+
saveable_cache.unsaved :saver => saver, :save_scope => 'rank'
|
359
|
+
expect(saveable_cache.cached_saves_up).to eq(0)
|
360
|
+
end
|
361
|
+
|
362
|
+
it "should update cached down saves_for when downsaving under a scope" do
|
363
|
+
saveable_cache.save_by :saver => saver, :saved => 'false', :save_scope => 'rank'
|
364
|
+
expect(saveable_cache.cached_saves_down).to eq(1)
|
365
|
+
end
|
366
|
+
|
367
|
+
it "should update cached down saves_for when a scoped saved down is removed" do
|
368
|
+
saveable_cache.save_by :saver => saver, :saved => 'false', :save_scope => 'rank'
|
369
|
+
saveable_cache.unsaved :saver => saver, :save_scope => 'rank'
|
370
|
+
expect(saveable_cache.cached_saves_down).to eq(0)
|
371
|
+
end
|
372
|
+
|
373
|
+
end
|
374
|
+
|
375
|
+
describe "with scoped cached saves_for" do
|
376
|
+
|
377
|
+
it "should update cached total saves_for if there is a total column" do
|
378
|
+
saveable_cache.cached_scoped_test_saves_total = 50
|
379
|
+
saveable_cache.save_by :saver => saver, :save_scope => "test"
|
380
|
+
expect(saveable_cache.cached_scoped_test_saves_total).to eq(1)
|
381
|
+
end
|
382
|
+
|
383
|
+
it "should update cached total saves_for when a saved up is removed" do
|
384
|
+
saveable_cache.save_by :saver => saver, :saved => 'true', :save_scope => "test"
|
385
|
+
saveable_cache.unsaved :saver => saver, :save_scope => "test"
|
386
|
+
expect(saveable_cache.cached_scoped_test_saves_total).to eq(0)
|
387
|
+
end
|
388
|
+
|
389
|
+
it "should update cached total saves_for when a saved down is removed" do
|
390
|
+
saveable_cache.save_by :saver => saver, :saved => 'false', :save_scope => "test"
|
391
|
+
saveable_cache.unsaved :saver => saver, :save_scope => "test"
|
392
|
+
expect(saveable_cache.cached_scoped_test_saves_total).to eq(0)
|
393
|
+
end
|
394
|
+
|
395
|
+
it "should update cached score saves_for if there is a score column" do
|
396
|
+
saveable_cache.cached_scoped_test_saves_score = 50
|
397
|
+
saveable_cache.save_by :saver => saver, :save_scope => "test"
|
398
|
+
expect(saveable_cache.cached_scoped_test_saves_score).to eq(1)
|
399
|
+
saveable_cache.save_by :saver => saver2, :saved => 'false', :save_scope => "test"
|
400
|
+
expect(saveable_cache.cached_scoped_test_saves_score).to eq(0)
|
401
|
+
saveable_cache.save_by :saver => saver, :saved => 'false', :save_scope => "test"
|
402
|
+
expect(saveable_cache.cached_scoped_test_saves_score).to eq(-2)
|
403
|
+
end
|
404
|
+
|
405
|
+
it "should update cached score saves_for when a saved up is removed" do
|
406
|
+
saveable_cache.save_by :saver => saver, :saved => 'true', :save_scope => "test"
|
407
|
+
expect(saveable_cache.cached_scoped_test_saves_score).to eq(1)
|
408
|
+
saveable_cache.unsaved :saver => saver, :save_scope => "test"
|
409
|
+
expect(saveable_cache.cached_scoped_test_saves_score).to eq(0)
|
410
|
+
end
|
411
|
+
|
412
|
+
it "should update cached score saves_for when a saved down is removed" do
|
413
|
+
saveable_cache.save_by :saver => saver, :saved => 'false', :save_scope => "test"
|
414
|
+
expect(saveable_cache.cached_scoped_test_saves_score).to eq(-1)
|
415
|
+
saveable_cache.unsaved :saver => saver, :save_scope => "test"
|
416
|
+
expect(saveable_cache.cached_scoped_test_saves_score).to eq(0)
|
417
|
+
end
|
418
|
+
|
419
|
+
it "should update cached up saves_for if there is an up saved column" do
|
420
|
+
saveable_cache.cached_scoped_test_saves_up = 50
|
421
|
+
saveable_cache.save_by :saver => saver, :save_scope => "test"
|
422
|
+
saveable_cache.save_by :saver => saver, :save_scope => "test"
|
423
|
+
expect(saveable_cache.cached_scoped_test_saves_up).to eq(1)
|
424
|
+
end
|
425
|
+
|
426
|
+
it "should update cached down saves_for if there is a down saved column" do
|
427
|
+
saveable_cache.cached_scoped_test_saves_down = 50
|
428
|
+
saveable_cache.save_by :saver => saver, :saved => 'false', :save_scope => "test"
|
429
|
+
expect(saveable_cache.cached_scoped_test_saves_down).to eq(1)
|
430
|
+
end
|
431
|
+
|
432
|
+
it "should update cached up saves_for when a saved up is removed" do
|
433
|
+
saveable_cache.save_by :saver => saver, :saved => 'true', :save_scope => "test"
|
434
|
+
saveable_cache.unsaved :saver => saver, :save_scope => "test"
|
435
|
+
expect(saveable_cache.cached_scoped_test_saves_up).to eq(0)
|
436
|
+
end
|
437
|
+
|
438
|
+
it "should update cached down saves_for when a saved down is removed" do
|
439
|
+
saveable_cache.save_by :saver => saver, :saved => 'false', :save_scope => "test"
|
440
|
+
saveable_cache.unsaved :saver => saver, :save_scope => "test"
|
441
|
+
expect(saveable_cache.cached_scoped_test_saves_down).to eq(0)
|
442
|
+
end
|
443
|
+
|
444
|
+
it "should select from cached total saves_for if there a total column" do
|
445
|
+
saveable_cache.save_by :saver => saver, :save_scope => "test"
|
446
|
+
saveable_cache.cached_scoped_test_saves_total = 50
|
447
|
+
expect(saveable_cache.count_saves_total(false, "test")).to eq(50)
|
448
|
+
end
|
449
|
+
|
450
|
+
it "should select from cached up saves_for if there is an up saved column" do
|
451
|
+
saveable_cache.save_by :saver => saver, :save_scope => "test"
|
452
|
+
saveable_cache.cached_scoped_test_saves_up = 50
|
453
|
+
expect(saveable_cache.count_saves_up(false, "test")).to eq(50)
|
454
|
+
end
|
455
|
+
|
456
|
+
it "should select from cached down saves_for if there is a down saved column" do
|
457
|
+
saveable_cache.save_by :saver => saver, :saved => 'false', :save_scope => "test"
|
458
|
+
saveable_cache.cached_scoped_test_saves_down = 50
|
459
|
+
expect(saveable_cache.count_saves_down(false, "test")).to eq(50)
|
460
|
+
end
|
461
|
+
|
462
|
+
end
|
463
|
+
|
464
|
+
describe "sti models" do
|
465
|
+
|
466
|
+
it "should be able to saved on a saveable child of a non saveable sti model" do
|
467
|
+
saveable = SaveableChildOfStiNotSaveable.create(:name => 'sti child')
|
468
|
+
|
469
|
+
saveable.save_by :saver => saver, :saved => 'yes'
|
470
|
+
expect(saveable.saves_for.size).to eq(1)
|
471
|
+
end
|
472
|
+
|
473
|
+
it "should not be able to saved on a parent non saveable" do
|
474
|
+
expect(StiNotSaveable).not_to be_saveable
|
475
|
+
end
|
476
|
+
|
477
|
+
it "should be able to saved on a child when its parent is saveable" do
|
478
|
+
saveable = ChildOfStiSaveable.create(:name => 'sti child')
|
479
|
+
|
480
|
+
saveable.save_by :saver => saver, :saved => 'yes'
|
481
|
+
expect(saveable.saves_for.size).to eq(1)
|
482
|
+
end
|
483
|
+
end
|
484
|
+
end
|