lookup_by 0.9.0 → 0.9.1

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: a9069b037b67c4736e52daba941f7e8400e3d9fd
4
- data.tar.gz: 9873f3240c8330dd94839498167fa803895fbbd0
3
+ metadata.gz: f743786ef23e1404d94ab4e182d9fc4e56ebf02b
4
+ data.tar.gz: 544619c07c7172702cba5729e8a8c1bb80783ddf
5
5
  SHA512:
6
- metadata.gz: efadbc68cbbc32082253e4a7dd84ab65e916df444e19af1e6b47717a3bb78e25721add3776659a61f4abe0b87e7009da05cb1c40b1081234f112b3fb4079affa
7
- data.tar.gz: 0a0bb1622e3af6281e3049b7e4e4e8d5fa41665acc8c78fa9bab6e02bad9a9d7442c7eab0f5feddad404ee03d89c9d8c690d5d86e9acb242053084cba64c2ae8
6
+ metadata.gz: c5e44713f89aaca0651af41331620efec4fd7e42a9dbf2d72b2617ddb95ee77d96b8f1bcb17832a31d65365aa62af4820ed29c6b23fc84e99c262446c875af59
7
+ data.tar.gz: 46803218755acd5241351f1ae535a6a71b41f8adfbd0fe9d53897ea677cd11358318a134c14a5ddf61487c4f823cd9eab7a6123d36c6a5ee3b2d1e211ad7577c
data/Appraisals CHANGED
@@ -9,3 +9,7 @@ end
9
9
  appraise 'rails-4.1' do
10
10
  gem 'rails', '~> 4.1.0'
11
11
  end
12
+
13
+ appraise 'rails-4.2' do
14
+ gem 'rails', '~> 4.2.0.beta1'
15
+ end
data/Gemfile CHANGED
@@ -10,7 +10,8 @@ group :development, :test do
10
10
 
11
11
  gem 'rspec'
12
12
  gem 'rspec-its'
13
- gem 'database_cleaner'
13
+ gem 'rspec-rails'
14
+ # gem 'database_cleaner'
14
15
 
15
16
  gem "pg", platform: :ruby
16
17
  gem "activerecord-jdbcpostgresql-adapter", platform: :jruby
data/README.md CHANGED
@@ -16,36 +16,31 @@
16
16
 
17
17
  # Overview
18
18
 
19
- LookupBy is a thread-safe lookup table cache for ActiveRecord that reduces normalization pains and supports:
19
+ LookupBy is a thread-safe lookup table cache for ActiveRecord that reduces normalization pains.
20
20
 
21
- * configurable column names
22
- * caching (read-through, write-through, least recently used (LRU))
23
- * symbols
21
+ * Configurable lookup column
22
+ * Caching (read-through, write-through, least recently used (LRU))
23
+ * Symbolized values
24
+ * Normalized values, _e.g. canonicalizing UTF-8 before lookup_
24
25
 
25
26
  ### Dependencies
26
27
 
27
- * Rails 3.2+
28
+ * Rails 3.2+, _tested on Rails 3.2, 4.0, 4.1, and 4.2_
28
29
  * PostgreSQL
29
30
 
30
31
  ### Development
31
32
 
32
- [github.com/companygardener/lookup_by][development]
33
+ * [github.com/companygardener/lookup_by][development]
33
34
 
34
35
  ### Source
35
36
 
36
- git clone git://github.com/companygardener/lookup_by.git
37
+ * git clone git://github.com/companygardener/lookup_by.git
37
38
 
38
39
  ### Bug reports
39
40
 
40
- If you discover a problem with LookupBy, please let me know. However, I ask that you'd kindly review these guidelines before creating [Issues][]:
41
+ Please create [Issues][] to submit bug reports and feature requests. However, I ask that you'd kindly review [these bug reporting guidelines](https://github.com/companygardener/lookup_by/wiki/Bug-Reports) first.
41
42
 
42
- https://github.com/companygardener/lookup_by/wiki/Bug-Reports
43
-
44
- If you find a security bug, please **_do not_** use the issue tracker. Instead, send an email to: thecompanygardener@gmail.com.
45
-
46
- Please create [Issues][issues] to submit bug reports and feature requests.
47
-
48
- _Provide a failing rspec test that concisely demonstrates the issue._
43
+ _If you find a security bug, **_do not_** use the public issue tracker. Instead, send an email to: thecompanygardener@gmail.com._
49
44
 
50
45
  # Installation
51
46
 
@@ -211,7 +206,7 @@ lookup_by :column_name, cache: 50
211
206
 
212
207
  ### Cache miss
213
208
 
214
- You can enable read-throughs using the `:find` option.
209
+ Enable cache read-throughs using the `:find` option.
215
210
 
216
211
  ```ruby
217
212
  # Return nil
@@ -229,7 +224,7 @@ lookup_by :column_name, cache: true, find: true
229
224
 
230
225
  ### DB miss
231
226
 
232
- You can enable write-throughs using the `:find_or_create` option.
227
+ Enable cache write-throughs using the `:find_or_create` option.
233
228
 
234
229
  _Note: This will only work if the primary key is a sequence and all columns but the lookup column are optional._
235
230
 
@@ -246,7 +241,7 @@ lookup_by :column_name, cache: 20, find_or_create: true
246
241
 
247
242
  ### Raise on Miss
248
243
 
249
- You can configure cache misses to raise a `LookupBy::RecordNotFound` error.
244
+ Configure cache misses to raise a `LookupBy::RecordNotFound` error.
250
245
 
251
246
  ```ruby
252
247
  # Return nil
@@ -260,7 +255,6 @@ lookup_by :column_name, cache: true, raise: true
260
255
  lookup_by :column_name, cache: true, find: true, raise: true
261
256
  ```
262
257
 
263
-
264
258
  ### Normalize values
265
259
 
266
260
  ```ruby
@@ -279,6 +273,18 @@ Can be useful to handle `params` that are not required.
279
273
  lookup_by :column_name, allow_blank: true
280
274
  ```
281
275
 
276
+ ### Threadsafety
277
+
278
+ Force the LRU to be threadsafe (used to test the SafeLRU).
279
+
280
+ With Rails 4, the Safe LRU is selected automatically in production-like environments.
281
+
282
+ ```ruby
283
+ # Safe
284
+ # Use threadsafe cache
285
+ lookup_by :column_name, cache: 10, safe: true
286
+ ```
287
+
282
288
  # Integration
283
289
 
284
290
  ### Cucumber
data/Rakefile CHANGED
@@ -1,4 +1,5 @@
1
1
  begin
2
+ require 'rubygems'
2
3
  require 'bundler/setup'
3
4
  rescue LoadError
4
5
  puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
@@ -8,7 +8,7 @@ group :development, :test do
8
8
  gem "appraisal", "~> 1.0", :require => false
9
9
  gem "rspec"
10
10
  gem "rspec-its"
11
- gem "database_cleaner"
11
+ gem "rspec-rails"
12
12
  gem "pg", :platform => :ruby
13
13
  gem "activerecord-jdbcpostgresql-adapter", :platform => :jruby
14
14
  gem "simplecov", :require => false
@@ -8,7 +8,7 @@ group :development, :test do
8
8
  gem "appraisal", "~> 1.0", :require => false
9
9
  gem "rspec"
10
10
  gem "rspec-its"
11
- gem "database_cleaner"
11
+ gem "rspec-rails"
12
12
  gem "pg", :platform => :ruby
13
13
  gem "activerecord-jdbcpostgresql-adapter", :platform => :jruby
14
14
  gem "simplecov", :require => false
@@ -8,7 +8,7 @@ group :development, :test do
8
8
  gem "appraisal", "~> 1.0", :require => false
9
9
  gem "rspec"
10
10
  gem "rspec-its"
11
- gem "database_cleaner"
11
+ gem "rspec-rails"
12
12
  gem "pg", :platform => :ruby
13
13
  gem "activerecord-jdbcpostgresql-adapter", :platform => :jruby
14
14
  gem "simplecov", :require => false
@@ -0,0 +1,22 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "rails", "~> 4.2.0.beta1"
6
+
7
+ group :development, :test do
8
+ gem "appraisal", "~> 1.0", :require => false
9
+ gem "rspec"
10
+ gem "rspec-its"
11
+ gem "rspec-rails"
12
+ gem "pg", :platform => :ruby
13
+ gem "activerecord-jdbcpostgresql-adapter", :platform => :jruby
14
+ gem "simplecov", :require => false
15
+ gem "coveralls", :require => false
16
+ gem "pry", :require => false
17
+ gem "colored", :require => false
18
+ gem "racc"
19
+ gem "json"
20
+ end
21
+
22
+ gemspec :path => "../"
@@ -17,6 +17,7 @@ module LookupBy
17
17
  @raise_on_miss = options[:raise] || false
18
18
  @testing = false
19
19
  @enabled = true
20
+ @safe = options[:safe] || concurrent?
20
21
 
21
22
  @stats = { db: Hash.new(0), cache: Hash.new(0) }
22
23
 
@@ -33,7 +34,7 @@ module LookupBy
33
34
 
34
35
  @type = :lru
35
36
  @limit = options[:cache]
36
- @cache = concurrent? ? Caching::SafeLRU.new(@limit) : Caching::LRU.new(@limit)
37
+ @cache = @safe ? Caching::SafeLRU.new(@limit) : Caching::LRU.new(@limit)
37
38
  @read = true
38
39
  @write ||= false
39
40
  @testing = true if Rails.env.test? && @write
@@ -1,62 +1,56 @@
1
1
  module LookupBy
2
2
  module Caching
3
- class LRU < ::Hash
3
+ class LRU
4
4
  attr_reader :lru
5
5
 
6
6
  def initialize(maxsize)
7
- super()
8
-
9
7
  @maxsize = maxsize
10
8
  @lru = []
11
- end
12
-
13
- def clear
14
- @lru.clear
15
-
16
- super
9
+ @hash = {}
17
10
  end
18
11
 
19
12
  def [](key)
20
- return nil unless has_key?(key)
13
+ return nil unless @hash.key?(key)
21
14
  touch(key)
22
- super
15
+ @hash[key]
23
16
  end
24
17
 
25
18
  def []=(key, value)
26
19
  touch(key)
27
- super
28
- prune
20
+ @hash[key] = value
21
+ @hash.delete(@lru.shift) while @hash.size > @maxsize
29
22
  end
30
23
 
31
- def merge(hash)
32
- dup.merge!(hash)
24
+ def delete(key)
25
+ @lru.delete(key)
26
+
27
+ @hash.delete(key)
33
28
  end
34
29
 
35
- def merge!(hash)
36
- hash.each { |k, v| self[k] = v }
30
+ def clear
31
+ @lru.clear
32
+ @hash.clear
37
33
  self
38
34
  end
39
35
 
40
- def delete(key)
41
- @lru.delete(key)
36
+ def values
37
+ @hash.values
38
+ end
42
39
 
43
- super
40
+ def size
41
+ @hash.size
44
42
  end
45
43
 
46
44
  def to_h
47
- {}.merge!(self)
45
+ @hash.dup
48
46
  end
49
47
 
50
- protected
51
-
48
+ private
52
49
  def touch(key)
50
+ # TODO: LRU deletes are O(N)
53
51
  @lru.delete(key)
54
52
  @lru << key
55
53
  end
56
-
57
- def prune
58
- delete(@lru.shift) while size > @maxsize
59
- end
60
54
  end
61
55
  end
62
56
  end
@@ -1,29 +1,42 @@
1
+ # TODO: Evaluate using ThreadSafe::Hash and ThreadSafe::Array.
2
+
3
+ require "mutex_m"
4
+
1
5
  module LookupBy
2
6
  module Caching
3
7
  class SafeLRU < LRU
8
+ include Mutex_m
9
+
4
10
  def initialize(maxsize = nil)
5
- @mutex = Mutex.new
6
11
  super
7
12
  end
8
13
 
9
- def clear
10
- @mutex.synchronize { super }
11
- end
12
-
13
14
  def [](key)
14
- @mutex.synchronize { super }
15
+ synchronize { super }
15
16
  end
16
17
 
17
18
  def []=(key, value)
18
- @mutex.synchronize { super }
19
+ synchronize { super }
19
20
  end
20
21
 
21
- def merge!(hash)
22
- @mutex.synchronize { super }
22
+ def delete(key)
23
+ synchronize { super }
23
24
  end
24
25
 
25
- def delete(key)
26
- @mutex.synchronize { super }
26
+ def clear
27
+ synchronize { super }
28
+ end
29
+
30
+ def values
31
+ synchronize { super }
32
+ end
33
+
34
+ def size
35
+ synchronize { super }
36
+ end
37
+
38
+ def to_h
39
+ synchronize { super }
27
40
  end
28
41
  end
29
42
  end
@@ -29,7 +29,7 @@ module LookupBy
29
29
  end
30
30
 
31
31
  options.symbolize_keys!
32
- options.assert_valid_keys :allow_blank, :order, :cache, :normalize, :find, :find_or_create, :raise
32
+ options.assert_valid_keys :allow_blank, :order, :cache, :normalize, :find, :find_or_create, :raise, :safe
33
33
 
34
34
  raise "#{self} already called lookup_by" if is_a? Lookup::ClassMethods
35
35
  raise "#{self} responds_to :[], needed for lookup_by" if respond_to? :[]
@@ -1,3 +1,3 @@
1
1
  module LookupBy
2
- VERSION = "0.9.0"
2
+ VERSION = "0.9.1"
3
3
  end
@@ -1,4 +1,4 @@
1
- require "spec_helper"
1
+ require "rails_helper"
2
2
  require "lookup_by"
3
3
 
4
4
  describe ::ActiveRecord::Base do
@@ -1,77 +1,58 @@
1
- require "spec_helper"
1
+ require "rails_helper"
2
2
  require "lookup_by/caching/lru"
3
3
 
4
4
  include LookupBy::Caching
5
5
 
6
- module LookupBy::Caching
7
- describe LRU do
8
- before(:each) do
9
- @cache = LRU.new(2)
6
+ describe LookupBy::Caching::LRU do
7
+ let(:cache) do
8
+ cache = LRU.new(2)
10
9
 
11
- @cache[1] = "one"
12
- @cache[2] = "two"
13
- end
14
-
15
- subject { @cache }
16
-
17
- it "stores entries" do
18
- expect(@cache[1]).to eq "one"
19
- expect(@cache[2]).to eq "two"
20
- end
21
-
22
- it "drops oldest" do
23
- @cache[3] = "three"
10
+ cache[1] = "one"
11
+ cache[2] = "two"
12
+ cache
13
+ end
24
14
 
25
- expect(@cache[1]).to be_nil
15
+ describe "#[]" do
16
+ it "caches" do
17
+ expect(cache[1]).to eq "one"
18
+ expect(cache[2]).to eq "two"
26
19
  end
27
20
 
28
- it "keeps gets" do
29
- @cache[1]
30
- @cache[3] = "three"
21
+ it "promotes gets" do
22
+ cache[1]
23
+ cache[3] = "three"
31
24
 
32
- expect(@cache[1]).to eq "one"
33
- expect(@cache[2]).to be_nil
34
- expect(@cache[3]).to eq "three"
25
+ expect(cache[2]).to be_nil
35
26
  end
27
+ end
36
28
 
37
- it "keeps sets" do
38
- @cache[1] = "one"
39
- @cache[3] = "three"
29
+ describe "#[]=" do
30
+ it "promotes sets" do
31
+ cache[3] = "three"
40
32
 
41
- expect(@cache[1]).to eq "one"
42
- expect(@cache[2]).to be_nil
43
- expect(@cache[3]).to eq "three"
33
+ expect(cache[1]).to be_nil
44
34
  end
45
35
 
46
- it "#clear" do
47
- cache = LRU.new(2)
36
+ it "deletes least-recently accessed value" do
37
+ cache[3] = "three"
48
38
 
49
- cache[1] = "one"
50
- expect(cache.size).to eq 1
51
- cache.clear
52
- expect(cache.size).to eq 0
53
- end
54
-
55
- specify "#merge" do
56
- merged = @cache.merge(1 => "change", 3 => "three")
57
- expect(merged).to be_instance_of(LRU)
58
- expect(merged).to eq(1 => "change", 3 => "three")
39
+ expect(cache[1]).to be_nil
59
40
  end
41
+ end
60
42
 
61
- specify "#merge!" do
62
- cache = LRU.new(3)
63
- object_id = cache.object_id
43
+ describe "#clear" do
44
+ specify { expect(cache.clear.size).to eq 0 }
45
+ end
64
46
 
65
- cache[1] = "one"
66
- cache[2] = "two"
47
+ describe "#size" do
48
+ specify { expect(cache.size).to eq 2 }
49
+ end
67
50
 
68
- cache.merge!(1 => "change", 3 => "three")
69
- expect(cache.object_id).to eql(object_id)
70
- expect(cache).to eq(1 => "change", 2 => "two", 3 => "three")
71
- end
51
+ describe "#values" do
52
+ specify { expect(cache.values).to eq ["one", "two"] }
53
+ end
72
54
 
73
- it "better include the values under test" do
74
- expect(subject.to_h).to eq(1 => "one", 2 => "two")
75
- end
55
+ describe "#to_h" do
56
+ specify { expect(cache.to_h).to eq(1 => "one", 2 => "two") }
76
57
  end
77
58
  end
@@ -0,0 +1,3 @@
1
+ class Unsynchronizable < ActiveRecord::Base
2
+ lookup_by :unsynchronizable, cache: 1, find_or_create: true, safe: true
3
+ end
@@ -16,6 +16,8 @@ class CreateTables < ActiveRecord::Migration
16
16
  create_lookup_table :raisins
17
17
  create_lookup_table :read_through_raisins
18
18
 
19
+ create_lookup_table :unsynchronizables
20
+
19
21
  enable_extension 'uuid-ossp'
20
22
 
21
23
  execute 'CREATE SCHEMA traffic;'
@@ -469,6 +469,35 @@ CREATE SEQUENCE unfindables_unfindable_id_seq
469
469
  ALTER SEQUENCE unfindables_unfindable_id_seq OWNED BY unfindables.unfindable_id;
470
470
 
471
471
 
472
+ --
473
+ -- Name: unsynchronizables; Type: TABLE; Schema: public; Owner: -; Tablespace:
474
+ --
475
+
476
+ CREATE TABLE unsynchronizables (
477
+ unsynchronizable_id integer NOT NULL,
478
+ unsynchronizable text NOT NULL
479
+ );
480
+
481
+
482
+ --
483
+ -- Name: unsynchronizables_unsynchronizable_id_seq; Type: SEQUENCE; Schema: public; Owner: -
484
+ --
485
+
486
+ CREATE SEQUENCE unsynchronizables_unsynchronizable_id_seq
487
+ START WITH 1
488
+ INCREMENT BY 1
489
+ NO MINVALUE
490
+ NO MAXVALUE
491
+ CACHE 1;
492
+
493
+
494
+ --
495
+ -- Name: unsynchronizables_unsynchronizable_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: -
496
+ --
497
+
498
+ ALTER SEQUENCE unsynchronizables_unsynchronizable_id_seq OWNED BY unsynchronizables.unsynchronizable_id;
499
+
500
+
472
501
  --
473
502
  -- Name: user_agents; Type: TABLE; Schema: public; Owner: -; Tablespace:
474
503
  --
@@ -610,6 +639,13 @@ ALTER TABLE ONLY uncacheables ALTER COLUMN uncacheable_id SET DEFAULT nextval('u
610
639
  ALTER TABLE ONLY unfindables ALTER COLUMN unfindable_id SET DEFAULT nextval('unfindables_unfindable_id_seq'::regclass);
611
640
 
612
641
 
642
+ --
643
+ -- Name: unsynchronizable_id; Type: DEFAULT; Schema: public; Owner: -
644
+ --
645
+
646
+ ALTER TABLE ONLY unsynchronizables ALTER COLUMN unsynchronizable_id SET DEFAULT nextval('unsynchronizables_unsynchronizable_id_seq'::regclass);
647
+
648
+
613
649
  --
614
650
  -- Name: user_agent_id; Type: DEFAULT; Schema: public; Owner: -
615
651
  --
@@ -729,6 +765,14 @@ ALTER TABLE ONLY unfindables
729
765
  ADD CONSTRAINT unfindables_pkey PRIMARY KEY (unfindable_id);
730
766
 
731
767
 
768
+ --
769
+ -- Name: unsynchronizables_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace:
770
+ --
771
+
772
+ ALTER TABLE ONLY unsynchronizables
773
+ ADD CONSTRAINT unsynchronizables_pkey PRIMARY KEY (unsynchronizable_id);
774
+
775
+
732
776
  --
733
777
  -- Name: user_agents_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace:
734
778
  --
@@ -847,6 +891,13 @@ CREATE UNIQUE INDEX unfindables__u_unfindable ON unfindables USING btree (unfind
847
891
  CREATE UNIQUE INDEX unique_schema_migrations ON schema_migrations USING btree (version);
848
892
 
849
893
 
894
+ --
895
+ -- Name: unsynchronizables__u_unsynchronizable; Type: INDEX; Schema: public; Owner: -; Tablespace:
896
+ --
897
+
898
+ CREATE UNIQUE INDEX unsynchronizables__u_unsynchronizable ON unsynchronizables USING btree (unsynchronizable);
899
+
900
+
850
901
  --
851
902
  -- Name: user_agents__u_user_agent; Type: INDEX; Schema: public; Owner: -; Tablespace:
852
903
  --
@@ -1,6 +1,5 @@
1
- require "spec_helper"
1
+ require "rails_helper"
2
2
  require "lookup_by"
3
- require "pry"
4
3
 
5
4
  describe ::ActiveRecord::Base do
6
5
  describe "macro methods" do
@@ -210,4 +209,21 @@ describe LookupBy::Lookup do
210
209
  }.to raise_error(ArgumentError)
211
210
  end
212
211
  end
212
+
213
+ context "Unsynchronizable.lookup_by :column, cache: 1, find_or_create: true, safe: true" do
214
+ subject { Unsynchronizable }
215
+
216
+ it_behaves_like "a lookup"
217
+ it_behaves_like "a cache"
218
+ it_behaves_like "a read-through cache"
219
+ it_behaves_like "a write-through cache"
220
+
221
+ it "does not deadlock when synchronizing access" do
222
+ expect {
223
+ Unsynchronizable['foo']
224
+ Unsynchronizable['foo']
225
+ Unsynchronizable['bar']
226
+ }.to_not raise_error
227
+ end
228
+ end
213
229
  end
@@ -0,0 +1,53 @@
1
+ # This file is copied to spec/ when you run 'rails generate rspec:install'
2
+ ENV["RAILS_ENV"] ||= 'test'
3
+ require 'spec_helper'
4
+
5
+ if ENV["COVERAGE"]
6
+ require 'simplecov'
7
+ require 'coveralls'
8
+
9
+ SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter[
10
+ Coveralls::SimpleCov::Formatter,
11
+ SimpleCov::Formatter::HTMLFormatter
12
+ ]
13
+
14
+ SimpleCov.start
15
+ end
16
+
17
+ begin
18
+ require File.expand_path("../../config/environment", __FILE__)
19
+ rescue LoadError
20
+ require File.expand_path("../dummy/config/environment", __FILE__)
21
+ end
22
+
23
+ require 'pry'
24
+ require 'rspec/its'
25
+ require 'rspec/rails'
26
+
27
+ # Requires supporting ruby files with custom matchers and macros, etc, in
28
+ # spec/support/ and its subdirectories. Files matching `spec/**/*_spec.rb` are
29
+ # run as spec files by default. This means that files in spec/support that end
30
+ # in _spec.rb will both be required and run as specs, causing the specs to be
31
+ # run twice. It is recommended that you do not name files matching this glob to
32
+ # end with _spec.rb. You can configure this pattern with the --pattern
33
+ # option on the command line or in ~/.rspec, .rspec or `.rspec-local`.
34
+ # require File.expand_path("../support/shared_examples_for_a_lookup.rb", __FILE__)
35
+ Dir[Rails.root.join("spec/support/**/*.rb")].each { |f| require f }
36
+ Dir[Rails.root.join( "../support/**/*.rb")].each { |f| require f }
37
+
38
+ # Checks for pending migrations before tests are run.
39
+ # If you are not using ActiveRecord, you can remove this line.
40
+ ActiveRecord::Migration.maintain_test_schema! if ActiveRecord::Migration.respond_to?(:maintain_test_schema!)
41
+
42
+ # ActiveRecord::Migration.maintain_test_schema! if defined?(ActiveRecord::Migration) && ActiveRecord::Migration.respond_to?(:maintain_test_schema!)
43
+
44
+ RSpec.configure do |config|
45
+ config.use_transactional_fixtures = true
46
+
47
+ config.backtrace_exclusion_patterns << %r{vendor/}
48
+ config.backtrace_exclusion_patterns << %r{lib/rspec/rails}
49
+
50
+ config.infer_spec_type_from_file_location!
51
+ end
52
+
53
+ require 'rubinius_helper' if ENV["DEBUG"] && RUBY_ENGINE == 'rbx'
data/spec/spec_helper.rb CHANGED
@@ -1,60 +1,74 @@
1
- # This file is copied to spec/ when you run 'rails generate rspec:install'
2
- ENV["RAILS_ENV"] ||= 'test'
3
-
4
- if ENV["COVERAGE"]
5
- require "simplecov"
6
- require 'coveralls'
7
-
8
- SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter[
9
- Coveralls::SimpleCov::Formatter,
10
- SimpleCov::Formatter::HTMLFormatter,
11
- ]
12
-
13
- SimpleCov.start
14
- end
15
-
16
- begin
17
- require File.expand_path("../../config/environment", __FILE__)
18
- rescue LoadError
19
- require File.expand_path("../dummy/config/environment", __FILE__)
20
- end
21
-
22
- require 'rspec'
23
- require 'rspec/its'
24
- require 'database_cleaner'
25
- require 'pry'
26
-
27
- ActiveRecord::Migration.maintain_test_schema! if defined?(ActiveRecord::Migration) && ActiveRecord::Migration.respond_to?(:maintain_test_schema!)
28
-
29
- # Requires supporting ruby files with custom matchers and macros, etc,
30
- # in spec/support/ and its subdirectories.
31
- Dir[Rails.root.join("../support/**/*.rb")].each {|f| require f}
32
-
1
+ # This file was generated by the `rails generate rspec:install` command. Conventionally, all
2
+ # specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
3
+ # The generated `.rspec` file contains `--require spec_helper` which will cause this
4
+ # file to always be loaded, without a need to explicitly require it in any files.
5
+ #
6
+ # Given that it is always loaded, you are encouraged to keep this file as
7
+ # light-weight as possible. Requiring heavyweight dependencies from this file
8
+ # will add to the boot time of your test suite on EVERY test run, even for an
9
+ # individual file that may not need all of that loaded. Instead, make a
10
+ # separate helper file that requires this one and then use it only in the specs
11
+ # that actually need it.
12
+ #
13
+ # The `.rspec` file also contains a few flags that are not defaults but that
14
+ # users commonly want.
15
+ #
16
+ # See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
33
17
  RSpec.configure do |config|
34
- config.backtrace_exclusion_patterns << /vendor\//
35
- config.backtrace_exclusion_patterns << /lib\/rspec\/rails/
36
-
37
- # Use `fit`, `fcontext`, etc. to focus on particular examples.
38
- config.filter_run focus: true
18
+ # These two settings work together to allow you to limit a spec run
19
+ # to individual examples or groups you care about by tagging them with
20
+ # `:focus` metadata. When nothing is tagged with `:focus`, all examples
21
+ # get run.
22
+ config.filter_run :focus
39
23
  config.run_all_when_everything_filtered = true
40
24
 
25
+ # Many RSpec users commonly either run the entire suite or an individual
26
+ # file, and it's useful to allow more verbose output when running an
27
+ # individual spec file.
28
+ if config.files_to_run.one?
29
+ # Use the documentation formatter for detailed output,
30
+ # unless a formatter has already been configured
31
+ # (e.g. via a command-line flag).
32
+ config.default_formatter = 'doc'
33
+ end
34
+
35
+ # Print the 10 slowest examples and example groups at the
36
+ # end of the spec run, to help surface which specs are running
37
+ # particularly slow.
38
+ config.profile_examples = 10
39
+
41
40
  # Run specs in random order to surface order dependencies. If you find an
42
41
  # order dependency and want to debug it, you can fix the order by providing
43
42
  # the seed, which is printed after each run.
44
43
  # --seed 1234
45
- config.order = "random"
44
+ config.order = :random
46
45
 
47
- config.before(:suite) do
48
- DatabaseCleaner.strategy = :transaction
49
- end
46
+ # Seed global randomization in this process using the `--seed` CLI option.
47
+ # Setting this allows you to use `--seed` to deterministically reproduce
48
+ # test failures related to randomization by passing the same `--seed` value
49
+ # as the one that triggered the failure.
50
+ Kernel.srand config.seed
50
51
 
51
- config.before(:each) do
52
- DatabaseCleaner.start
52
+ # rspec-expectations config goes here. You can use an alternate
53
+ # assertion/expectation library such as wrong or the stdlib/minitest
54
+ # assertions if you prefer.
55
+ config.expect_with :rspec do |expectations|
56
+ # Enable only the newer, non-monkey-patching expect syntax.
57
+ # For more details, see:
58
+ # - http://myronmars.to/n/dev-blog/2012/06/rspecs-new-expectation-syntax
59
+ expectations.syntax = :expect
53
60
  end
54
61
 
55
- config.after(:each) do
56
- DatabaseCleaner.clean
62
+ # rspec-mocks config goes here. You can use an alternate test double
63
+ # library (such as bogus or mocha) by changing the `mock_with` option here.
64
+ config.mock_with :rspec do |mocks|
65
+ # Enable only the newer, non-monkey-patching expect syntax.
66
+ # For more details, see:
67
+ # - http://teaisaweso.me/blog/2013/05/27/rspecs-new-message-expectation-syntax/
68
+ mocks.syntax = :expect
69
+
70
+ # Prevents you from mocking or stubbing a method that does not exist on
71
+ # a real object. This is generally recommended.
72
+ mocks.verify_partial_doubles = true
57
73
  end
58
74
  end
59
-
60
- require 'rubinius_helper' if ENV["DEBUG"] && RUBY_ENGINE == 'rbx'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lookup_by
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.0
4
+ version: 0.9.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Erik Peterson
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-08-08 00:00:00.000000000 Z
11
+ date: 2014-08-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -71,6 +71,7 @@ files:
71
71
  - gemfiles/rails_3.2.gemfile
72
72
  - gemfiles/rails_4.0.gemfile
73
73
  - gemfiles/rails_4.1.gemfile
74
+ - gemfiles/rails_4.2.gemfile
74
75
  - lib/lookup_by.rb
75
76
  - lib/lookup_by/association.rb
76
77
  - lib/lookup_by/cache.rb
@@ -103,6 +104,7 @@ files:
103
104
  - spec/dummy/app/models/street.rb
104
105
  - spec/dummy/app/models/uncacheable.rb
105
106
  - spec/dummy/app/models/unfindable.rb
107
+ - spec/dummy/app/models/unsynchronizable.rb
106
108
  - spec/dummy/app/models/user_agent.rb
107
109
  - spec/dummy/bin/bundle
108
110
  - spec/dummy/bin/rails
@@ -125,6 +127,7 @@ files:
125
127
  - spec/dummy/log/.gitkeep
126
128
  - spec/dummy/script/rails
127
129
  - spec/lookup_by_spec.rb
130
+ - spec/rails_helper.rb
128
131
  - spec/rubinius_helper.rb
129
132
  - spec/spec_helper.rb
130
133
  - spec/support/shared_examples_for_a_lookup.rb
@@ -148,7 +151,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
148
151
  version: '0'
149
152
  requirements: []
150
153
  rubyforge_project:
151
- rubygems_version: 2.2.2
154
+ rubygems_version: 2.4.1
152
155
  signing_key:
153
156
  specification_version: 4
154
157
  summary: A thread-safe lookup table cache for ActiveRecord
@@ -172,6 +175,7 @@ test_files:
172
175
  - spec/dummy/app/models/street.rb
173
176
  - spec/dummy/app/models/uncacheable.rb
174
177
  - spec/dummy/app/models/unfindable.rb
178
+ - spec/dummy/app/models/unsynchronizable.rb
175
179
  - spec/dummy/app/models/user_agent.rb
176
180
  - spec/dummy/bin/bundle
177
181
  - spec/dummy/bin/rails
@@ -194,6 +198,7 @@ test_files:
194
198
  - spec/dummy/log/.gitkeep
195
199
  - spec/dummy/script/rails
196
200
  - spec/lookup_by_spec.rb
201
+ - spec/rails_helper.rb
197
202
  - spec/rubinius_helper.rb
198
203
  - spec/spec_helper.rb
199
204
  - spec/support/shared_examples_for_a_lookup.rb