constant_table_saver 3.0.1 → 4.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/lib/constant_table_saver.rb +66 -58
- data/lib/constant_table_saver/version.rb +1 -1
- data/test/activerecord_count_queries.rb +14 -19
- data/test/constant_table_saver_test.rb +76 -45
- data/test/test_helper.rb +10 -13
- metadata +64 -84
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 250b25d7f3fefffc880e4f1ed9bd349aaa9ed601
|
4
|
+
data.tar.gz: bc75e2890206f99c0b0bdd049921afca4a55b492
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 7d580056718eac74024e54d0cca28c0219551b9407e6d2540fa753117fd4c8e41d77c99180c009197c7a3e26432a2efaa05894c3a3d4c5de62a5717708be1237
|
7
|
+
data.tar.gz: baebaf8845f8ca7de92ea243bca01e5e69624d79f293b6b9415e80db9da39c2acbb54d9acf03baf700e2933a40bca563eabcf14de5f9eccd00f3c2aacf98a1a1
|
data/lib/constant_table_saver.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'active_record/fixtures' # so we can hook it & reset our cache afterwards
|
2
|
+
require 'active_support/core_ext/object/to_param'
|
2
3
|
|
3
4
|
module ConstantTableSaver
|
4
5
|
module BaseMethods
|
@@ -7,16 +8,15 @@ module ConstantTableSaver
|
|
7
8
|
class_attribute :constant_table_options, :instance_writer => false
|
8
9
|
self.constant_table_options = options
|
9
10
|
|
10
|
-
if ActiveRecord::VERSION::MAJOR
|
11
|
-
require 'active_support/core_ext/object/to_param'
|
11
|
+
if ActiveRecord::VERSION::MAJOR == 3
|
12
12
|
extend ActiveRecord3ClassMethods
|
13
13
|
else
|
14
|
-
extend
|
14
|
+
extend ActiveRecord4ClassMethods
|
15
15
|
end
|
16
16
|
extend ClassMethods
|
17
17
|
extend NameClassMethods if constant_table_options[:name]
|
18
18
|
|
19
|
-
klass = defined?(
|
19
|
+
klass = defined?(ActiveRecord::FixtureSet) ? ActiveRecord::FixtureSet : ActiveRecord::Fixtures
|
20
20
|
class <<klass
|
21
21
|
# normally, create_fixtures method gets called exactly once - but unfortunately, it
|
22
22
|
# loads the class and does a #respond_to?, which causes us to load and cache before
|
@@ -45,7 +45,55 @@ module ConstantTableSaver
|
|
45
45
|
# plugin on if the table isn't really constant!
|
46
46
|
def reset_constant_record_cache!
|
47
47
|
@constant_record_methods.each {|method_id| (class << self; self; end;).send(:remove_method, method_id)} if @constant_record_methods
|
48
|
-
@cached_records = @cached_records_by_id = @constant_record_methods = @cached_blank_scope = nil
|
48
|
+
@cached_records = @cached_records_by_id = @constant_record_methods = @cached_blank_scope = @find_by_sql = nil
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
module ActiveRecord4ClassMethods
|
53
|
+
def find_by_sql(sql, binds = [])
|
54
|
+
@find_by_sql ||= {}
|
55
|
+
@find_by_sql[:all] ||= all.to_sql
|
56
|
+
@find_by_sql[:id] ||= relation.where(relation.table[primary_key].eq(connection.substitute_at(columns_hash[primary_key], 1))).limit(1).to_sql
|
57
|
+
@find_by_sql[:oldid] ||= relation.where(relation.table[primary_key].eq(connection.substitute_at(columns_hash[primary_key], 1))).
|
58
|
+
order(relation.table[primary_key].asc).limit(1).to_sql # used by 4.0
|
59
|
+
@find_by_sql[:first] ||= relation.order(relation.table[primary_key].asc).limit(1).to_sql
|
60
|
+
@find_by_sql[:last] ||= relation.order(relation.table[primary_key].desc).limit(1).to_sql
|
61
|
+
|
62
|
+
_sql = sanitize_sql(sql)
|
63
|
+
_sql = _sql.to_sql if sql.respond_to?(:to_sql)
|
64
|
+
|
65
|
+
if binds.empty?
|
66
|
+
if _sql == @find_by_sql[:all]
|
67
|
+
return @cached_records ||= super(relation.to_sql).each(&:freeze)
|
68
|
+
elsif _sql == @find_by_sql[:first]
|
69
|
+
return [relation.to_a.first].compact
|
70
|
+
elsif _sql == @find_by_sql[:last]
|
71
|
+
return [relation.to_a.last].compact
|
72
|
+
end
|
73
|
+
|
74
|
+
elsif (_sql == @find_by_sql[:id] || _sql == @find_by_sql[:oldid]) &&
|
75
|
+
binds.length == 1 &&
|
76
|
+
binds.first.first.is_a?(ActiveRecord::ConnectionAdapters::Column) &&
|
77
|
+
binds.first.first.name == primary_key
|
78
|
+
@cached_records_by_id ||= relation.to_a.index_by {|record| record.id.to_param}
|
79
|
+
return [@cached_records_by_id[binds.first.last.to_param]].compact
|
80
|
+
end
|
81
|
+
|
82
|
+
super
|
83
|
+
end
|
84
|
+
|
85
|
+
def relation
|
86
|
+
super.tap do |s|
|
87
|
+
class << s
|
88
|
+
# we implement find_some here because we'd have to use partial string matching to catch
|
89
|
+
# this case in find_by_sql, which would be ugly. (we do the other cases in find_by_sql
|
90
|
+
# because it's simpler & the only place to catch things like association find queries.)
|
91
|
+
def find_some(ids)
|
92
|
+
return super if @values.present? # special cases such as offset and limit
|
93
|
+
ids.collect {|id| find_one(id)}
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
49
97
|
end
|
50
98
|
end
|
51
99
|
|
@@ -110,23 +158,21 @@ module ConstantTableSaver
|
|
110
158
|
# this so we have to shove in the instance variables.
|
111
159
|
#
|
112
160
|
# it will be clear that this was a very problematic ActiveRecord refactoring.
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
end
|
122
|
-
|
123
|
-
def merge(other)
|
124
|
-
if belongs_to_record_scope = belongs_to_record_scopes[other.to_sql]
|
125
|
-
return belongs_to_record_scope
|
126
|
-
end
|
161
|
+
def belongs_to_record_scopes
|
162
|
+
@belongs_to_record_scopes ||= to_a.each_with_object({}) do |record, results|
|
163
|
+
scope_that_belongs_to_will_want = where(table[primary_key].eq(record.id))
|
164
|
+
scope_that_belongs_to_will_want.instance_variable_set("@loaded", true)
|
165
|
+
scope_that_belongs_to_will_want.instance_variable_set("@records", [record])
|
166
|
+
results[scope_that_belongs_to_will_want.to_sql] = scope_that_belongs_to_will_want
|
167
|
+
end.freeze
|
168
|
+
end
|
127
169
|
|
128
|
-
|
170
|
+
def merge(other)
|
171
|
+
if belongs_to_record_scope = belongs_to_record_scopes[other.to_sql]
|
172
|
+
return belongs_to_record_scope
|
129
173
|
end
|
174
|
+
|
175
|
+
super other
|
130
176
|
end
|
131
177
|
|
132
178
|
private
|
@@ -141,45 +187,7 @@ module ConstantTableSaver
|
|
141
187
|
end
|
142
188
|
end
|
143
189
|
end
|
144
|
-
|
145
|
-
module ActiveRecord2ClassMethods
|
146
|
-
def find(*args)
|
147
|
-
options = args.last if args.last.is_a?(Hash)
|
148
|
-
return super unless options.blank? || options.all? {|k, v| v.nil?}
|
149
|
-
scope_options = scope(:find)
|
150
|
-
return super unless scope_options.blank? || scope_options.all? {|k, v| v.nil?}
|
151
|
-
|
152
|
-
args.pop unless options.nil?
|
153
190
|
|
154
|
-
@cached_records ||= super(:all, :order => primary_key).each(&:freeze)
|
155
|
-
@cached_records_by_id ||= @cached_records.index_by {|record| record.id.to_param}
|
156
|
-
|
157
|
-
case args.first
|
158
|
-
when :first then @cached_records.first
|
159
|
-
when :last then @cached_records.last
|
160
|
-
when :all then @cached_records.dup # shallow copy of the array
|
161
|
-
else
|
162
|
-
expects_array = args.first.kind_of?(Array)
|
163
|
-
return args.first if expects_array && args.first.empty?
|
164
|
-
ids = expects_array ? args.first : args
|
165
|
-
ids = ids.flatten.compact.uniq
|
166
|
-
|
167
|
-
case ids.size
|
168
|
-
when 0
|
169
|
-
raise ::ActiveRecord::RecordNotFound, "Couldn't find #{name} without an ID"
|
170
|
-
when 1
|
171
|
-
result = @cached_records_by_id[ids.first.to_param] || raise(::ActiveRecord::RecordNotFound, "Couldn't find #{name} with ID=#{ids.first}")
|
172
|
-
expects_array ? [result] : result
|
173
|
-
else
|
174
|
-
ids.collect {|id| @cached_records_by_id[id.to_param]}.tap do |results|
|
175
|
-
results.compact!
|
176
|
-
raise(::ActiveRecord::RecordNotFound, "Couldn't find all #{name.pluralize} with IDs #{ids.join ','} (found #{results.size} results, but was looking for #{ids.size}") unless results.size == ids.size
|
177
|
-
end
|
178
|
-
end
|
179
|
-
end
|
180
|
-
end
|
181
|
-
end
|
182
|
-
|
183
191
|
module NameClassMethods
|
184
192
|
def define_named_record_methods
|
185
193
|
@constant_record_methods = [] # dummy so respond_to? & method_missing don't call us again if reading an attribute causes another method_missing
|
@@ -1,19 +1,6 @@
|
|
1
|
-
if ActiveRecord::VERSION::MAJOR
|
2
|
-
# proudly stolen from ActiveRecord's test suite, with addition of BEGIN and COMMIT
|
3
|
-
ActiveRecord::Base.connection.class.class_eval do
|
4
|
-
IGNORED_SQL = [/^PRAGMA/, /^SELECT currval/, /^SELECT CAST/, /^SELECT @@IDENTITY/, /^SELECT @@ROWCOUNT/, /^SAVEPOINT/, /^ROLLBACK TO SAVEPOINT/, /^RELEASE SAVEPOINT/, /SHOW FIELDS/, /^BEGIN$/, /^COMMIT$/]
|
5
|
-
|
6
|
-
def execute_with_query_record(sql, name = nil, &block)
|
7
|
-
$queries_executed ||= []
|
8
|
-
$queries_executed << sql unless IGNORED_SQL.any? { |r| sql =~ r }
|
9
|
-
execute_without_query_record(sql, name, &block)
|
10
|
-
end
|
11
|
-
|
12
|
-
alias_method_chain :execute, :query_record
|
13
|
-
end
|
14
|
-
elsif ActiveRecord::VERSION::MAJOR == 3 && ActiveRecord::VERSION::MINOR < 2
|
1
|
+
if ActiveRecord::VERSION::MAJOR == 3 && ActiveRecord::VERSION::MINOR < 2
|
15
2
|
# this is from 3.1's test suite. ugly.
|
16
|
-
class
|
3
|
+
class SQLCounter
|
17
4
|
cattr_accessor :ignored_sql
|
18
5
|
self.ignored_sql = [/^PRAGMA (?!(table_info))/, /^SELECT currval/, /^SELECT CAST/, /^SELECT @@IDENTITY/, /^SELECT @@ROWCOUNT/, /^SAVEPOINT/, /^ROLLBACK TO SAVEPOINT/, /^RELEASE SAVEPOINT/, /^SHOW max_identifier_length/, /^BEGIN/, /^COMMIT/]
|
19
6
|
|
@@ -21,10 +8,14 @@ elsif ActiveRecord::VERSION::MAJOR == 3 && ActiveRecord::VERSION::MINOR < 2
|
|
21
8
|
# ignored SQL. This ignored SQL is for Oracle.
|
22
9
|
ignored_sql.concat [/^select .*nextval/i, /^SAVEPOINT/, /^ROLLBACK TO/, /^\s*select .* from all_triggers/im]
|
23
10
|
|
24
|
-
def
|
11
|
+
def self.clear_log
|
25
12
|
$queries_executed = []
|
26
13
|
end
|
27
14
|
|
15
|
+
def initialize
|
16
|
+
$queries_executed.clear
|
17
|
+
end
|
18
|
+
|
28
19
|
def call(name, start, finish, message_id, values)
|
29
20
|
sql = values[:sql]
|
30
21
|
|
@@ -36,10 +27,10 @@ elsif ActiveRecord::VERSION::MAJOR == 3 && ActiveRecord::VERSION::MINOR < 2
|
|
36
27
|
end
|
37
28
|
end
|
38
29
|
end
|
39
|
-
ActiveSupport::Notifications.subscribe('sql.active_record',
|
30
|
+
ActiveSupport::Notifications.subscribe('sql.active_record', SQLCounter.new)
|
40
31
|
else
|
41
32
|
# this is from 3.2's test suite. ugly.
|
42
|
-
class
|
33
|
+
class SQLCounter
|
43
34
|
cattr_accessor :ignored_sql
|
44
35
|
self.ignored_sql = [/^PRAGMA (?!(table_info))/, /^SELECT currval/, /^SELECT CAST/, /^SELECT @@IDENTITY/, /^SELECT @@ROWCOUNT/, /^SAVEPOINT/, /^ROLLBACK TO SAVEPOINT/, /^RELEASE SAVEPOINT/, /^SHOW max_identifier_length/, /^BEGIN/, /^COMMIT/]
|
45
36
|
|
@@ -52,6 +43,10 @@ else
|
|
52
43
|
|
53
44
|
attr_reader :ignore
|
54
45
|
|
46
|
+
def self.clear_log
|
47
|
+
self.log.clear
|
48
|
+
end
|
49
|
+
|
55
50
|
def initialize(ignore = self.class.ignored_sql)
|
56
51
|
@ignore = ignore
|
57
52
|
end
|
@@ -66,5 +61,5 @@ else
|
|
66
61
|
end
|
67
62
|
end
|
68
63
|
|
69
|
-
ActiveSupport::Notifications.subscribe('sql.active_record',
|
64
|
+
ActiveSupport::Notifications.subscribe('sql.active_record', SQLCounter.new)
|
70
65
|
end
|
@@ -9,11 +9,7 @@ class ConstantPie < ActiveRecord::Base
|
|
9
9
|
set_table_name "pies"
|
10
10
|
constant_table
|
11
11
|
|
12
|
-
|
13
|
-
named_scope :filled_with_unicorn, :conditions => {:filling => 'unicorn'}
|
14
|
-
else
|
15
|
-
scope :filled_with_unicorn, :conditions => {:filling => 'unicorn'}
|
16
|
-
end
|
12
|
+
scope :filled_with_unicorn, -> { where(:filling => 'unicorn') }
|
17
13
|
|
18
14
|
def self.with_unicorn_filling_scope
|
19
15
|
with_scope(:find => {:conditions => {:filling => 'unicorn'}}) { yield }
|
@@ -40,32 +36,45 @@ class IngredientForConstantPie < ActiveRecord::Base
|
|
40
36
|
belongs_to :pie, :class_name => "ConstantPie"
|
41
37
|
end
|
42
38
|
|
43
|
-
class ConstantTableSaverTest <
|
39
|
+
class ConstantTableSaverTest < ActiveSupport::TestCase
|
44
40
|
fixtures :all
|
45
41
|
|
46
|
-
setup
|
42
|
+
def setup
|
47
43
|
ConstantPie.reset_constant_record_cache!
|
48
44
|
end
|
49
45
|
|
50
|
-
|
51
|
-
|
46
|
+
def assert_queries(num = 1)
|
47
|
+
::SQLCounter.clear_log
|
48
|
+
yield
|
49
|
+
ensure
|
50
|
+
assert_equal num, ::SQLCounter.log.size, "#{::SQLCounter.log.size} instead of #{num} queries were executed.#{::SQLCounter.log.size == 0 ? '' : "\nQueries:\n#{::SQLCounter.log.join("\n")}"}"
|
51
|
+
end
|
52
|
+
|
53
|
+
def assert_no_queries(&block)
|
54
|
+
assert_queries(0, &block)
|
55
|
+
end
|
56
|
+
|
57
|
+
DEPRECATED_FINDERS = ActiveRecord::VERSION::MAJOR == 3 || (ActiveRecord::VERSION::MAJOR == 4 && ActiveRecord::VERSION::MINOR == 0)
|
58
|
+
|
59
|
+
test "it caches all() results" do
|
60
|
+
@pies = StandardPie.all.to_a
|
52
61
|
assert_queries(1) do
|
53
|
-
assert_equal @pies.collect(&:attributes), ConstantPie.
|
62
|
+
assert_equal @pies.collect(&:attributes), ConstantPie.all.to_a.collect(&:attributes)
|
54
63
|
end
|
55
64
|
assert_no_queries do
|
56
|
-
assert_equal @pies.collect(&:attributes), ConstantPie.
|
65
|
+
assert_equal @pies.collect(&:attributes), ConstantPie.all.to_a.collect(&:attributes)
|
57
66
|
end
|
58
67
|
end
|
59
68
|
|
60
|
-
test "it caches all
|
61
|
-
@pies = StandardPie.all
|
69
|
+
test "it caches find(:all) results" do
|
70
|
+
@pies = StandardPie.find(:all).to_a
|
62
71
|
assert_queries(1) do
|
63
|
-
assert_equal @pies.collect(&:attributes), ConstantPie.all.collect(&:attributes)
|
72
|
+
assert_equal @pies.collect(&:attributes), ConstantPie.find(:all).to_a.collect(&:attributes)
|
64
73
|
end
|
65
74
|
assert_no_queries do
|
66
|
-
assert_equal @pies.collect(&:attributes), ConstantPie.all.collect(&:attributes)
|
75
|
+
assert_equal @pies.collect(&:attributes), ConstantPie.find(:all).to_a.collect(&:attributes)
|
67
76
|
end
|
68
|
-
end
|
77
|
+
end if DEPRECATED_FINDERS
|
69
78
|
|
70
79
|
test "it caches find(id) results" do
|
71
80
|
@pie = StandardPie.find(1)
|
@@ -96,7 +105,7 @@ class ConstantTableSaverTest < ActiveRecord::TestCase
|
|
96
105
|
assert_no_queries do
|
97
106
|
assert_equal @pie.attributes, ConstantPie.find(:first).attributes
|
98
107
|
end
|
99
|
-
end
|
108
|
+
end if DEPRECATED_FINDERS
|
100
109
|
|
101
110
|
test "it caches first() results" do
|
102
111
|
@pie = StandardPie.first
|
@@ -116,7 +125,7 @@ class ConstantTableSaverTest < ActiveRecord::TestCase
|
|
116
125
|
assert_no_queries do
|
117
126
|
assert_equal @pie.attributes, ConstantPie.find(:last).attributes
|
118
127
|
end
|
119
|
-
end
|
128
|
+
end if DEPRECATED_FINDERS
|
120
129
|
|
121
130
|
test "it caches last() results" do
|
122
131
|
@pie = StandardPie.last
|
@@ -129,9 +138,9 @@ class ConstantTableSaverTest < ActiveRecord::TestCase
|
|
129
138
|
end
|
130
139
|
|
131
140
|
test "it caches belongs_to association find queries" do
|
132
|
-
@standard_pie_ingredients = IngredientForStandardPie.all
|
141
|
+
@standard_pie_ingredients = IngredientForStandardPie.all.to_a
|
133
142
|
@standard_pies = @standard_pie_ingredients.collect(&:pie)
|
134
|
-
@constant_pie_ingredients = IngredientForConstantPie.all
|
143
|
+
@constant_pie_ingredients = IngredientForConstantPie.all.to_a
|
135
144
|
assert_queries(1) do # doesn't need to make 3 queries for 3 pie assocations!
|
136
145
|
assert_equal @standard_pies.collect(&:attributes), @constant_pie_ingredients.collect(&:pie).collect(&:attributes)
|
137
146
|
end
|
@@ -141,46 +150,68 @@ class ConstantTableSaverTest < ActiveRecord::TestCase
|
|
141
150
|
end
|
142
151
|
|
143
152
|
test "it isn't affected by scopes active at the time of first load" do
|
144
|
-
assert_equal 0, ConstantPie.filled_with_unicorn.all.size
|
145
|
-
assert_equal 0, ConstantPie.with_unicorn_filling_scope { ConstantPie.all.length }
|
146
|
-
assert_equal StandardPie.all.size, ConstantPie.all.size
|
153
|
+
assert_equal 0, ConstantPie.filled_with_unicorn.all.to_a.size
|
154
|
+
assert_equal 0, ConstantPie.with_unicorn_filling_scope { ConstantPie.all.to_a.length } if DEPRECATED_FINDERS
|
155
|
+
assert_equal StandardPie.all.to_a.size, ConstantPie.all.to_a.size
|
147
156
|
end
|
148
157
|
|
149
158
|
test "it isn't affected by relational algebra active at the time of first load" do
|
150
|
-
assert_equal 0, ConstantPie.filled_with_unicorn.all.size
|
151
|
-
assert_equal 0, ConstantPie.where(:filling => 'unicorn').all.length
|
152
|
-
assert_equal 2, ConstantPie.where("filling LIKE 'Tasty%'").all.length
|
153
|
-
assert_equal StandardPie.all.size, ConstantPie.all.size
|
154
|
-
end
|
159
|
+
assert_equal 0, ConstantPie.filled_with_unicorn.all.to_a.size
|
160
|
+
assert_equal 0, ConstantPie.where(:filling => 'unicorn').all.to_a.length
|
161
|
+
assert_equal 2, ConstantPie.where("filling LIKE 'Tasty%'").all.to_a.length
|
162
|
+
assert_equal StandardPie.all.to_a.size, ConstantPie.all.to_a.size
|
163
|
+
end
|
155
164
|
|
156
165
|
test "prevents the returned records from modification" do
|
157
|
-
@pie = ConstantPie.
|
166
|
+
@pie = ConstantPie.first
|
158
167
|
assert @pie.frozen?
|
159
|
-
assert !StandardPie.
|
168
|
+
assert !StandardPie.first.frozen?
|
160
169
|
end
|
161
170
|
|
162
171
|
test "isn't affected by modifying the returned result arrays" do
|
163
|
-
@pies = ConstantPie.all
|
172
|
+
@pies = ConstantPie.all.to_a
|
164
173
|
@pies.reject! {|pie| pie.filling =~ /Steak/}
|
165
|
-
assert_equal StandardPie.all.collect(&:attributes), ConstantPie.all.collect(&:attributes)
|
174
|
+
assert_equal StandardPie.all.to_a.collect(&:attributes), ConstantPie.all.to_a.collect(&:attributes)
|
175
|
+
end
|
176
|
+
|
177
|
+
test "it doesn't cache find queries on scopes with options" do
|
178
|
+
@pies = StandardPie.select("id").all.to_a
|
179
|
+
@pie = StandardPie.select("id").find(1)
|
180
|
+
@second_pie = StandardPie.select("id").find(2)
|
181
|
+
assert_queries(3) do
|
182
|
+
assert_equal @pies.collect(&:attributes), ConstantPie.select("id").all.collect(&:attributes)
|
183
|
+
assert_equal @pie.attributes, ConstantPie.select("id").find(1).attributes
|
184
|
+
assert_equal [@pie, @second_pie].collect(&:attributes), ConstantPie.select("id").find([1, 2]).collect(&:attributes)
|
185
|
+
end
|
186
|
+
assert_queries(3) do
|
187
|
+
assert_equal @pies.collect(&:attributes), ConstantPie.select("id").all.collect(&:attributes)
|
188
|
+
assert_equal @pie.attributes, ConstantPie.select("id").find(1).attributes
|
189
|
+
assert_equal [@pie, @second_pie].collect(&:attributes), ConstantPie.select("id").find([1, 2]).collect(&:attributes)
|
190
|
+
end
|
166
191
|
end
|
167
192
|
|
168
193
|
test "it doesn't cache find queries with options" do
|
169
|
-
@pies = StandardPie.
|
170
|
-
@pie = StandardPie.find(1, :
|
171
|
-
assert_queries(
|
172
|
-
assert_equal @pies.collect(&:attributes), ConstantPie.
|
173
|
-
assert_equal @
|
194
|
+
@pies = StandardPie.all(:select => "id").to_a
|
195
|
+
@pie = StandardPie.find(1, :select => "id")
|
196
|
+
assert_queries(3) do
|
197
|
+
assert_equal @pies.collect(&:attributes), ConstantPie.all(:select => "id").collect(&:attributes)
|
198
|
+
assert_equal @pies.collect(&:attributes), ConstantPie.find(:all, :select => "id").collect(&:attributes)
|
199
|
+
assert_equal @pie.attributes, ConstantPie.find(1, :select => "id").attributes
|
174
200
|
end
|
175
|
-
assert_queries(
|
176
|
-
assert_equal @pies.collect(&:attributes), ConstantPie.
|
177
|
-
assert_equal @
|
201
|
+
assert_queries(3) do
|
202
|
+
assert_equal @pies.collect(&:attributes), ConstantPie.all(:select => "id").collect(&:attributes)
|
203
|
+
assert_equal @pies.collect(&:attributes), ConstantPie.find(:all, :select => "id").collect(&:attributes)
|
204
|
+
assert_equal @pie.attributes, ConstantPie.find(1, :select => "id").attributes
|
178
205
|
end
|
179
|
-
end
|
206
|
+
end if DEPRECATED_FINDERS
|
180
207
|
|
181
208
|
test "it passes the options preventing caching to the underlying query methods" do
|
182
|
-
assert_equal nil, ConstantPie.
|
183
|
-
assert_equal
|
209
|
+
assert_equal nil, ConstantPie.where(:filling => 'unicorn').first
|
210
|
+
assert_equal nil, ConstantPie.first(:conditions => {:filling => 'unicorn'}) if DEPRECATED_FINDERS
|
211
|
+
assert_equal nil, ConstantPie.find(:first, :conditions => {:filling => 'unicorn'}) if DEPRECATED_FINDERS
|
212
|
+
assert_equal [], ConstantPie.where(:filling => 'unicorn').all
|
213
|
+
assert_equal [], ConstantPie.all(:conditions => {:filling => 'unicorn'}) if DEPRECATED_FINDERS
|
214
|
+
assert_equal [], ConstantPie.find(:all, :conditions => {:filling => 'unicorn'}) if DEPRECATED_FINDERS
|
184
215
|
end
|
185
216
|
|
186
217
|
test "it creates named class methods if a :name option is given" do
|
@@ -215,14 +246,14 @@ class ConstantTableSaverTest < ActiveRecord::TestCase
|
|
215
246
|
end
|
216
247
|
|
217
248
|
test "it raises the usual exception if asked for a nonexistant records" do
|
218
|
-
max_id = ConstantPie.all.collect(&:id).max
|
249
|
+
max_id = ConstantPie.all.to_a.collect(&:id).max
|
219
250
|
assert_raises ActiveRecord::RecordNotFound do
|
220
251
|
ConstantPie.find(max_id + 1)
|
221
252
|
end
|
222
253
|
end
|
223
254
|
|
224
255
|
test "it raises the usual exception if asked for a mixture of present records and nonexistant records" do
|
225
|
-
max_id = ConstantPie.all.collect(&:id).max
|
256
|
+
max_id = ConstantPie.all.to_a.collect(&:id).max
|
226
257
|
assert_raises ActiveRecord::RecordNotFound do
|
227
258
|
ConstantPie.find([max_id, max_id + 1])
|
228
259
|
end
|
data/test/test_helper.rb
CHANGED
@@ -1,24 +1,15 @@
|
|
1
|
-
|
2
|
-
require "../../../config/boot.rb"
|
3
|
-
else
|
4
|
-
require 'rubygems'
|
5
|
-
end
|
1
|
+
require 'rubygems'
|
6
2
|
|
3
|
+
gem 'minitest', (ENV['RAILS_VERSION'] =~ /^(3\.|4\.0)/ ? '~> 4.0' : nil)
|
7
4
|
gem 'activesupport', ENV['RAILS_VERSION']
|
8
5
|
gem 'activerecord', ENV['RAILS_VERSION']
|
9
6
|
|
10
|
-
require '
|
7
|
+
require 'minitest/autorun'
|
11
8
|
require 'active_support'
|
12
9
|
require 'active_support/test_case'
|
13
10
|
require 'active_record'
|
14
11
|
require 'active_record/fixtures'
|
15
|
-
|
16
|
-
begin
|
17
|
-
require 'ruby-debug'
|
18
|
-
Debugger.start
|
19
|
-
rescue LoadError
|
20
|
-
# ruby-debug not installed, no debugging for you
|
21
|
-
end
|
12
|
+
require 'byebug' rescue nil
|
22
13
|
|
23
14
|
RAILS_ENV = ENV['RAILS_ENV'] ||= 'test'
|
24
15
|
|
@@ -28,4 +19,10 @@ load(File.join(File.dirname(__FILE__), "/schema.rb"))
|
|
28
19
|
ActiveSupport::TestCase.send(:include, ActiveRecord::TestFixtures) if ActiveRecord.const_defined?('TestFixtures')
|
29
20
|
ActiveSupport::TestCase.fixture_path = File.join(File.dirname(__FILE__), "fixtures")
|
30
21
|
|
22
|
+
ActiveRecord::Base.class_eval do
|
23
|
+
unless instance_methods.include?(:set_table_name)
|
24
|
+
eval "class << self; def set_table_name(x); self.table_name = x; end; end"
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
31
28
|
require File.expand_path(File.join(File.dirname(__FILE__), '../init')) # load the plugin
|
metadata
CHANGED
@@ -1,86 +1,75 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: constant_table_saver
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
prerelease:
|
6
|
-
segments:
|
7
|
-
- 3
|
8
|
-
- 0
|
9
|
-
- 1
|
10
|
-
version: 3.0.1
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 4.0.0
|
11
5
|
platform: ruby
|
12
|
-
authors:
|
6
|
+
authors:
|
13
7
|
- Will Bryant
|
14
8
|
autorequire:
|
15
9
|
bindir: bin
|
16
10
|
cert_chain: []
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
- !ruby/object:Gem::Dependency
|
11
|
+
date: 2014-05-18 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
21
14
|
name: activerecord
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
- !ruby/object:Gem::Version
|
28
|
-
hash: 3
|
29
|
-
segments:
|
30
|
-
- 0
|
31
|
-
version: "0"
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - '>='
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
32
20
|
type: :runtime
|
33
|
-
version_requirements: *id001
|
34
|
-
- !ruby/object:Gem::Dependency
|
35
|
-
name: rake
|
36
21
|
prerelease: false
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - '>='
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - '>='
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
46
34
|
type: :development
|
47
|
-
version_requirements: *id002
|
48
|
-
- !ruby/object:Gem::Dependency
|
49
|
-
name: sqlite3
|
50
35
|
prerelease: false
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - '>='
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: sqlite3
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - '>='
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
60
48
|
type: :development
|
61
|
-
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
62
55
|
description: |
|
63
56
|
Loads all records from the table on first use, and thereafter returns the
|
64
57
|
cached (and frozen) records for all find calls.
|
65
|
-
|
58
|
+
|
66
59
|
Optionally, creates class-level methods you can use to grab the records,
|
67
60
|
named after the name field you specify.
|
68
|
-
|
69
|
-
|
61
|
+
|
62
|
+
|
70
63
|
Compatibility
|
71
64
|
=============
|
72
|
-
|
65
|
+
|
73
66
|
Currently tested against Rails 3.2.13, on Ruby 1.8.7 and 2.0.0p0.
|
74
67
|
Was also tested compatible with 2.3.14, 3.0.17, and 3.1.8.
|
75
|
-
|
76
68
|
email: will.bryant@gmail.com
|
77
69
|
executables: []
|
78
|
-
|
79
70
|
extensions: []
|
80
|
-
|
81
71
|
extra_rdoc_files: []
|
82
|
-
|
83
|
-
files:
|
72
|
+
files:
|
84
73
|
- .gitignore
|
85
74
|
- Gemfile
|
86
75
|
- MIT-LICENSE
|
@@ -99,38 +88,29 @@ files:
|
|
99
88
|
- test/test_helper.rb
|
100
89
|
homepage: http://github.com/willbryant/constant_table_saver
|
101
90
|
licenses: []
|
102
|
-
|
91
|
+
metadata: {}
|
103
92
|
post_install_message:
|
104
93
|
rdoc_options: []
|
105
|
-
|
106
|
-
require_paths:
|
94
|
+
require_paths:
|
107
95
|
- lib
|
108
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
none: false
|
119
|
-
requirements:
|
120
|
-
- - ">="
|
121
|
-
- !ruby/object:Gem::Version
|
122
|
-
hash: 3
|
123
|
-
segments:
|
124
|
-
- 0
|
125
|
-
version: "0"
|
96
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
97
|
+
requirements:
|
98
|
+
- - '>='
|
99
|
+
- !ruby/object:Gem::Version
|
100
|
+
version: '0'
|
101
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
102
|
+
requirements:
|
103
|
+
- - '>='
|
104
|
+
- !ruby/object:Gem::Version
|
105
|
+
version: '0'
|
126
106
|
requirements: []
|
127
|
-
|
128
107
|
rubyforge_project:
|
129
|
-
rubygems_version:
|
108
|
+
rubygems_version: 2.2.2
|
130
109
|
signing_key:
|
131
|
-
specification_version:
|
132
|
-
summary: Caches the records from fixed tables, and provides convenience methods to
|
133
|
-
|
110
|
+
specification_version: 4
|
111
|
+
summary: Caches the records from fixed tables, and provides convenience methods to
|
112
|
+
get them.
|
113
|
+
test_files:
|
134
114
|
- test/activerecord_count_queries.rb
|
135
115
|
- test/constant_table_saver_test.rb
|
136
116
|
- test/database.yml
|