lookup_by 0.1.2 → 0.1.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: ea1f94799e8cd1ce83a24d9c91ce3ca5e84a9db2
4
- data.tar.gz: b2b4a26d4f25ccaf5a3435d7a8c2436393472300
3
+ metadata.gz: 170c2ef2408cf8495f0cfe3f30cd4811ee17cd6f
4
+ data.tar.gz: 14e0c54b5ec327fa87cd0044b67cd921df3a002b
5
5
  SHA512:
6
- metadata.gz: 3ddc4e6763d8886696d8f7967e79e9920984adf1ec569da6c5bf0dc2711e114371533b5c3abfbe96103146b84b139492d86d2fadf2ccb5fde94f557acd7795f2
7
- data.tar.gz: 145ab131848f7fc9a62eb2be3e2367854f2d6485e04216e36527872b90cbf8c950e030200f496c089ecbde93e321945fe8f92e3c40d3341f967ddd3e85a498d9
6
+ metadata.gz: 258e5adbe68b2c181613e08e5cb59e6d8044e1b28cea20dffb282d3489826aa9061e884cd200844953e95a23cc4e9286595f0a3e849205faa4ba6a102bd27d71
7
+ data.tar.gz: 76c03e4a60019234ba204c47d65520076b5dad3705a765523be4706b9caa78ae5199d9f9f992dca7e7c3ef65a48f8dc0d1563bdaf666bcc970e5343e29f7b0fd
@@ -1,30 +1,28 @@
1
1
  module LookupBy
2
2
  class Cache
3
- attr_reader :klass, :primary_key
4
- attr_reader :cache, :stats
5
- attr_reader :field, :order, :type, :limit, :find, :write, :normalize
6
-
7
- attr_accessor :enabled
3
+ attr_reader :cache, :field, :stats
4
+ attr_accessor :testing
8
5
 
9
6
  def initialize(klass, options = {})
10
7
  @klass = klass
11
8
  @primary_key = klass.primary_key
12
9
  @field = options[:field].to_sym
13
10
  @cache = {}
14
- @order = options[:order] || field
11
+ @order = options[:order] || @field
15
12
  @read = options[:find]
16
13
  @write = options[:find_or_create]
17
14
  @normalize = options[:normalize]
15
+ @testing = false
18
16
  @enabled = true
19
17
 
20
18
  @stats = { db: Hash.new(0), cache: Hash.new(0) }
21
19
 
22
- raise ArgumentError, %Q(unknown attribute "#{field}" for <#{klass}>) unless klass.column_names.include?(field.to_s)
20
+ raise ArgumentError, %Q(unknown attribute "#{@field}" for <#{klass}>) unless klass.column_names.include?(@field.to_s)
23
21
 
24
22
  case options[:cache]
25
23
  when true
26
- @type = :all
27
- @read ||= false
24
+ @type = :all
25
+ @read ||= false
28
26
  when ::Fixnum
29
27
  raise ArgumentError, "`#{@klass}.lookup_by :#{@field}` options[:find] must be true when caching N" if @read == false
30
28
 
@@ -33,70 +31,87 @@ module LookupBy
33
31
  @cache = Rails.configuration.allow_concurrency ? Caching::SafeLRU.new(@limit) : Caching::LRU.new(@limit)
34
32
  @read = true
35
33
  @write ||= false
36
- @enabled = false if Rails.env.test? && write?
34
+ @testing = true if Rails.env.test? && @write
37
35
  else
38
36
  @read = true
39
37
  end
40
38
  end
41
39
 
42
40
  def reload
43
- return unless cache_all?
41
+ return unless @type == :all
44
42
 
45
43
  clear
46
44
 
47
- ::ActiveRecord::Base.connection.send :log, "", "#{klass.name} Load Cache All" do
48
- klass.order(order).each do |i|
49
- cache[i.id] = i
45
+ ::ActiveRecord::Base.connection.send :log, "", "#{@klass.name} Load Cache All" do
46
+ @klass.order(@order).each do |i|
47
+ @cache[i.id] = i
50
48
  end
51
49
  end
52
50
  end
53
51
 
54
52
  def clear
55
- cache.clear if cache?
53
+ @cache.clear
56
54
  end
57
55
 
58
56
  def create!(*args, &block)
59
- created = klass.create!(*args, &block)
60
- cache[created.id] = created if cache?
57
+ created = @klass.create!(*args, &block)
58
+ @cache[created.id] = created if cache?
61
59
  created
62
60
  end
63
61
 
64
62
  def fetch(value)
65
63
  increment :cache, :get
66
64
 
67
- value = clean(value) if normalize?
65
+ value = normalize(value) if @normalize && !value.is_a?(Fixnum)
68
66
 
69
67
  found = cache_read(value) if cache?
70
- found ||= db_read(value) if read_through?
68
+ found ||= db_read(value) if @read
69
+ found ||= db_read(value) if not @enabled
71
70
 
72
- cache[found.id] = found if found && cache?
71
+ @cache[found.id] = found if found && cache?
73
72
 
74
- found ||= db_write(value) if write?
73
+ found ||= db_write(value) if @write
75
74
 
76
75
  found
77
76
  end
78
77
 
79
78
  def has_cache?
80
- !!type
79
+ @type && @enabled
81
80
  end
82
81
 
83
82
  def read_through?
84
83
  @read
85
84
  end
86
85
 
87
- private
86
+ def enabled?
87
+ @enabled
88
+ end
88
89
 
89
- def clean(value)
90
- return value if value.is_a? Fixnum
90
+ def disabled?
91
+ !@enabled
92
+ end
91
93
 
92
- klass.new(field => value).send(field)
94
+ def enable!
95
+ @enabled = true
96
+ reload
97
+ end
98
+
99
+ def disable!
100
+ @enabled = false
101
+ clear
102
+ end
103
+
104
+ private
105
+
106
+ def normalize(value)
107
+ @klass.new(@field => value).send(@field)
93
108
  end
94
109
 
95
110
  def cache_read(value)
96
111
  if value.is_a? Fixnum
97
- found = cache[value]
112
+ found = @cache[value]
98
113
  else
99
- found = cache.values.detect { |o| o.send(field) == value }
114
+ found = @cache.values.detect { |o| o.send(@field) == value }
100
115
  end
101
116
 
102
117
  increment :cache, found ? :hit : :miss
@@ -107,7 +122,7 @@ module LookupBy
107
122
  def db_read(value)
108
123
  increment :db, :get
109
124
 
110
- found = klass.where(column_for(value) => value).first
125
+ found = @klass.where(column_for(value) => value).first
111
126
 
112
127
  increment :db, found ? :hit : :miss
113
128
 
@@ -118,32 +133,16 @@ module LookupBy
118
133
  def db_write(value)
119
134
  column = column_for(value)
120
135
 
121
- found = klass.create!(column => value) if column != primary_key
136
+ found = @klass.create!(column => value) if column != @primary_key
122
137
  found
123
138
  end
124
139
 
125
140
  def column_for(value)
126
- value.is_a?(Fixnum) ? primary_key : field
127
- end
128
-
129
- def enabled?
130
- enabled
131
- end
132
-
133
- def cache_all?
134
- type == :all
141
+ value.is_a?(Fixnum) ? @primary_key : @field
135
142
  end
136
143
 
137
144
  def cache?
138
- !!type && enabled?
139
- end
140
-
141
- def write?
142
- !!write
143
- end
144
-
145
- def normalize?
146
- !!normalize
145
+ @type && @enabled && !@testing
147
146
  end
148
147
 
149
148
  def increment(type, stat)
@@ -2,14 +2,26 @@ module LookupBy
2
2
  module Lookup
3
3
  module MacroMethods
4
4
  def is_a_lookup?
5
- is_a? LookupBy::Lookup::ClassMethods
5
+ is_a? Lookup::ClassMethods
6
+ end
7
+
8
+ def lookup_by_disable(*methods)
9
+ methods.each do |method|
10
+ instance_eval <<-"END", __FILE__, __LINE__ + 1
11
+ def self.#{method}(*args)
12
+ raise NotImplementedError, "#{name}.#{method} is not supported on cached lookup tables." if @lookup.has_cache?
13
+
14
+ super
15
+ end
16
+ END
17
+ end
6
18
  end
7
19
 
8
20
  def lookup_by(field, options = {})
9
21
  options.symbolize_keys!
10
22
  options.assert_valid_keys :order, :cache, :normalize, :find, :find_or_create, :raise
11
23
 
12
- raise "#{self} already called lookup_by" if is_a? LookupBy::Lookup::ClassMethods
24
+ raise "#{self} already called lookup_by" if is_a? Lookup::ClassMethods
13
25
  raise "#{self} responds_to :[], needed for lookup_by" if respond_to? :[]
14
26
  raise "#{self} responds_to :lookup, needed for lookup_by" if respond_to? :lookup
15
27
 
@@ -18,7 +30,11 @@ module LookupBy
18
30
  class_eval do
19
31
  include InstanceMethods
20
32
 
21
- class << self; attr_reader :lookup; end
33
+ singleton_class.class_eval do
34
+ attr_reader :lookup
35
+ end
36
+
37
+ lookup_by_disable :destroy, :destroy_all, :delete, :delete_all
22
38
 
23
39
  # TODO: check for a db unique constraint or Rails validation
24
40
 
@@ -65,30 +81,6 @@ module LookupBy
65
81
  else raise TypeError, "#{name}[arg]: arg must be a String, Symbol, Fixnum, nil, or #{name}"
66
82
  end
67
83
  end
68
-
69
- def destroy_all(conditions = nil)
70
- raise NotImplementedError, "#{name}.destroy_all is not supported on cached lookup tables." if @lookup.has_cache?
71
-
72
- super
73
- end
74
-
75
- def destroy(id)
76
- raise NotImplementedError, "#{name}.destroy(arg) is not supported on cached lookup tables" if @lookup.has_cache?
77
-
78
- super
79
- end
80
-
81
- def delete_all(conditions = nil)
82
- raise NotImplementedError, "#{name}.delete_all is not supported on cached lookup tables." if @lookup.has_cache?
83
-
84
- super
85
- end
86
-
87
- def delete(id_or_array)
88
- raise NotImplementedError, "#{name}.delete(arg) is not supported on cached lookup tables." if @lookup.has_cache?
89
-
90
- super
91
- end
92
84
  end
93
85
 
94
86
  module InstanceMethods
@@ -1,3 +1,3 @@
1
1
  module LookupBy
2
- VERSION = "0.1.2"
2
+ VERSION = "0.1.3"
3
3
  end
@@ -80,8 +80,8 @@ describe LookupBy::Lookup do
80
80
  it_behaves_like "a cache"
81
81
  it_behaves_like "a read-through cache"
82
82
 
83
- it "enables the LRU" do
84
- subject.lookup.enabled.should be_true
83
+ it "is not testing when not writing through the LRU" do
84
+ subject.lookup.testing.should be_false
85
85
  end
86
86
  end
87
87
 
@@ -93,8 +93,8 @@ describe LookupBy::Lookup do
93
93
  it_behaves_like "a read-through cache"
94
94
  it_behaves_like "a write-through cache"
95
95
 
96
- it "disables the LRU when RAILS_ENV=test" do
97
- subject.lookup.enabled.should be_false
96
+ it "sets testing when RAILS_ENV=test" do
97
+ subject.lookup.testing.should be_true
98
98
  end
99
99
  end
100
100
  end
@@ -60,8 +60,8 @@ end
60
60
 
61
61
  shared_examples "a cache" do
62
62
  it "caches records" do
63
- was_enabled = subject.lookup.enabled
64
- subject.lookup.enabled = true
63
+ was_testing = subject.lookup.testing
64
+ subject.lookup.testing = false
65
65
 
66
66
  original = subject.create(name: "original")
67
67
 
@@ -71,7 +71,7 @@ shared_examples "a cache" do
71
71
  subject.update(original.id, subject.lookup.field => "updated")
72
72
  subject[original.id].name.should eq "original"
73
73
 
74
- subject.lookup.enabled = was_enabled
74
+ subject.lookup.testing = was_testing
75
75
  end
76
76
 
77
77
  it "raises on .destroy_all" do
@@ -146,8 +146,8 @@ shared_examples "a read-through cache" do
146
146
  it_behaves_like "a read-through proxy"
147
147
 
148
148
  it "caches new records" do
149
- was_enabled = subject.lookup.enabled
150
- subject.lookup.enabled = true
149
+ was_testing = subject.lookup.testing
150
+ subject.lookup.testing = false
151
151
 
152
152
  created = subject.create(name: "cached")
153
153
 
@@ -157,7 +157,7 @@ shared_examples "a read-through cache" do
157
157
  subject.update(created.id, name: "changed")
158
158
  subject[created.id].name.should eq "cached"
159
159
 
160
- subject.lookup.enabled = was_enabled
160
+ subject.lookup.testing = was_testing
161
161
  end
162
162
  end
163
163
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lookup_by
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.1.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Erik Peterson