lookup_by 0.3.2 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.ruby-version +1 -1
- data/.rvmrc +1 -1
- data/.travis.yml +8 -3
- data/Gemfile +30 -5
- data/MIT-LICENSE +3 -1
- data/README.md +84 -40
- data/Rakefile +3 -1
- data/TODO.md +10 -12
- data/lib/lookup_by/cache.rb +8 -6
- data/lib/lookup_by/version.rb +1 -1
- data/lib/lookup_by.rb +1 -0
- data/lookup_by.gemspec +19 -13
- data/spec/association_spec.rb +0 -1
- data/spec/dummy/config/application.rb +3 -1
- data/spec/dummy/config/environments/development.rb +0 -9
- data/spec/dummy/config/environments/test.rb +0 -22
- data/spec/lookup_by_spec.rb +25 -0
- data/spec/rubinius_helper.rb +42 -0
- data/spec/spec_helper.rb +13 -17
- metadata +36 -19
- data/spec/dummy/.rspec +0 -1
- data/spec/dummy/config/environments/production.rb +0 -80
- data/spec/dummy/config/initializers/mime_types.rb +0 -5
- data/spec/dummy/config/initializers/secret_token.rb +0 -12
- data/spec/dummy/config/initializers/session_store.rb +0 -3
- data/spec/dummy/config/initializers/wrap_parameters.rb +0 -14
- data/spec/dummy/config/routes.rb +0 -56
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9abc479376127852eaf37e13d6f22beb0f1a999c
|
4
|
+
data.tar.gz: 408f965a099b14d4347e4e73325b523d8f4a5cd6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 42434d1b8fd18acf4ebce529e9dabd6669fed6f7b25bf82b7acdd6239fad9fde4a17d24403c843f16cbf0ace8bc28fa1d72c96ae8f5761cc0a4ef3610c6a38f0
|
7
|
+
data.tar.gz: 25db84500203fb4084b6b518a578f8160ca349320059b1c8513b039629f4ce23f6dbefb97b17aea8b370af503ebb777382849b16407b7a664dfad60b88363749
|
data/.ruby-version
CHANGED
@@ -1 +1 @@
|
|
1
|
-
2.
|
1
|
+
ruby-2.1.0
|
data/.rvmrc
CHANGED
@@ -1 +1 @@
|
|
1
|
-
rvm use 2.0.0-
|
1
|
+
rvm use ruby-2.0.0-p353@lookup_by --create
|
data/.travis.yml
CHANGED
@@ -1,10 +1,15 @@
|
|
1
1
|
language: ruby
|
2
2
|
rvm:
|
3
3
|
- 1.9.3
|
4
|
-
- 2.0.0
|
5
|
-
-
|
4
|
+
- 2.0.0
|
5
|
+
- 2.1.0-preview1
|
6
6
|
- ruby-head
|
7
|
+
- rbx
|
8
|
+
- rbx-2.2.1
|
7
9
|
services:
|
8
10
|
- postgresql
|
9
11
|
before_script:
|
10
|
-
-
|
12
|
+
- psql -c 'create database lookup_by_test' -U postgres
|
13
|
+
script:
|
14
|
+
- bundle exec rake app:db:test:prepare
|
15
|
+
- bundle exec rake
|
data/Gemfile
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
source "
|
1
|
+
source "https://rubygems.org"
|
2
2
|
|
3
3
|
# Declare your gem's dependencies in lookup_by.gemspec.
|
4
4
|
# Bundler will treat runtime dependencies like base dependencies, and
|
@@ -6,12 +6,37 @@ source "http://rubygems.org"
|
|
6
6
|
gemspec
|
7
7
|
|
8
8
|
group :development, :test do
|
9
|
-
gem
|
10
|
-
gem "rake"
|
11
|
-
gem "simplecov", require: false
|
12
|
-
gem "rspec-rails", "~> 2.11.0"
|
9
|
+
gem 'rspec'
|
13
10
|
gem 'database_cleaner'
|
14
11
|
|
15
12
|
gem "pg", platform: :ruby
|
16
13
|
gem "activerecord-jdbcpostgresql-adapter", platform: :jruby
|
14
|
+
|
15
|
+
gem "simplecov", require: false
|
16
|
+
gem 'coveralls', require: false
|
17
|
+
|
18
|
+
gem "pry", require: false
|
19
|
+
gem 'colored', require: false
|
20
|
+
|
21
|
+
platform :rbx do
|
22
|
+
gem 'racc'
|
23
|
+
gem 'json'
|
24
|
+
|
25
|
+
# Simplecov and Coveralls
|
26
|
+
gem 'rubysl-coverage'
|
27
|
+
gem 'rubinius-coverage'
|
28
|
+
|
29
|
+
# Pry
|
30
|
+
gem 'rubysl-readline'
|
31
|
+
|
32
|
+
# Rails
|
33
|
+
gem 'rubysl-base64'
|
34
|
+
gem 'rubysl-benchmark'
|
35
|
+
gem 'rubysl-bigdecimal'
|
36
|
+
gem 'rubysl-digest'
|
37
|
+
gem 'rubysl-ipaddr'
|
38
|
+
gem 'rubysl-logger'
|
39
|
+
gem 'rubysl-mutex_m'
|
40
|
+
gem 'rubysl-singleton'
|
41
|
+
end
|
17
42
|
end
|
data/MIT-LICENSE
CHANGED
data/README.md
CHANGED
@@ -1,59 +1,77 @@
|
|
1
1
|
# LookupBy
|
2
2
|
|
3
|
-
[![
|
4
|
-
[![
|
3
|
+
[![Gem Version](https://badge.fury.io/rb/lookup_by.png)][rubygems]
|
4
|
+
[![Build Status](https://secure.travis-ci.org/companygardener/lookup_by.png?branch=master)][travis]
|
5
|
+
[![Dependency Status](https://gemnasium.com/companygardener/lookup_by.png)][gemnasium]
|
6
|
+
[![Coverage Status](https://coveralls.io/repos/companygardener/lookup_by/badge.png?branch=master)][coveralls]
|
7
|
+
[![Code Climate](https://codeclimate.com/github/companygardener/lookup_by.png)][codeclimate]
|
8
|
+
[![Gittip](http://img.shields.io/gittip/companygardener.png)][gittip]
|
9
|
+
|
10
|
+
[rubygems]: https://rubygems.org/gems/lookup_by
|
11
|
+
[travis]: http://travis-ci.org/companygardener/lookup_by
|
12
|
+
[gemnasium]: https://gemnasium.com/companygardener/lookup_by
|
13
|
+
[coveralls]: https://coveralls.io/r/companygardener/lookup_by?branch=master
|
14
|
+
[codeclimate]: https://codeclimate.com/github/companygardener/lookup_by
|
15
|
+
[gittip]: https://www.gittip.com/companygardener
|
5
16
|
|
6
17
|
### Description
|
7
18
|
|
8
|
-
LookupBy is a thread-safe lookup table cache for ActiveRecord that reduces normalization pains
|
19
|
+
LookupBy is a thread-safe lookup table cache for ActiveRecord that reduces normalization pains which features:
|
9
20
|
|
10
|
-
|
21
|
+
* a configurable lookup column
|
22
|
+
* caching (read-through, write-through, Least Recently Used (LRU))
|
11
23
|
|
12
|
-
|
13
|
-
* Configurable lookup column
|
14
|
-
* Caching (read-through, write-through, Least Recently Used (LRU))
|
15
|
-
|
16
|
-
### Compatibility
|
24
|
+
### Dependencies
|
17
25
|
|
26
|
+
* Rails 3.2+
|
18
27
|
* PostgreSQL
|
19
28
|
|
20
29
|
### Development
|
21
30
|
|
22
|
-
|
31
|
+
[github.com/companygardener/lookup_by][development]
|
23
32
|
|
24
33
|
### Source
|
25
34
|
|
26
|
-
|
35
|
+
git clone git://github.com/companygardener/lookup_by.git
|
36
|
+
|
37
|
+
### Bug reports
|
38
|
+
|
39
|
+
If you discover a problem with LookupBy, please let me know. However, I ask that you'd kindly review these guidelines before creating [Issues][]:
|
40
|
+
|
41
|
+
https://github.com/companygardener/lookup_by/wiki/Bug-Reports
|
42
|
+
|
43
|
+
If you find a security bug, please **_do not_** use the issue tracker. Instead, send an email to: thecompanygardener@gmail.com.
|
27
44
|
|
28
|
-
|
45
|
+
Please create [Issues][issues] to submit bug reports and feature requests.
|
29
46
|
|
30
|
-
|
47
|
+
_Provide a failing rspec test concisely demonstrates the issue._
|
48
|
+
|
49
|
+
### Feature requests
|
31
50
|
|
32
51
|
## Installation
|
33
52
|
|
34
|
-
|
35
|
-
|
36
|
-
gem "lookup_by"
|
53
|
+
# in Gemfile
|
54
|
+
gem "lookup_by"
|
37
55
|
|
38
|
-
$ bundle
|
39
|
-
```
|
56
|
+
$ bundle
|
40
57
|
|
41
58
|
Or install it manually:
|
42
59
|
|
43
60
|
$ gem install lookup_by
|
44
61
|
|
45
|
-
|
62
|
+
## Usage / Configuration
|
46
63
|
|
47
64
|
### ActiveRecord Plugin
|
48
65
|
|
49
|
-
LookupBy adds
|
66
|
+
LookupBy adds two "macro" methods to `ActiveRecord::Base`
|
50
67
|
|
51
68
|
```ruby
|
52
69
|
lookup_by :column_name
|
53
70
|
# Defines .[], .lookup, and .is_a_lookup? class methods.
|
54
71
|
|
55
|
-
lookup_for :
|
56
|
-
# Defines #
|
72
|
+
lookup_for :status
|
73
|
+
# Defines #status and #status= instance methods that transparently reference the lookup table.
|
74
|
+
# Defines .with_status(name) and .with_statuses(*names) scopes on the model.
|
57
75
|
```
|
58
76
|
|
59
77
|
### Define the lookup model
|
@@ -64,12 +82,15 @@ create_table :statuses do |t|
|
|
64
82
|
t.string :status, null: false
|
65
83
|
end
|
66
84
|
|
85
|
+
# Or use the shorthand
|
86
|
+
create_lookup_table :statuses
|
87
|
+
|
67
88
|
# app/models/status.rb
|
68
89
|
class Status < ActiveRecord::Base
|
69
|
-
lookup_by :status
|
90
|
+
lookup_by :status
|
70
91
|
end
|
71
92
|
|
72
|
-
# Aliases the lookup attribute
|
93
|
+
# Aliases :name to the lookup attribute
|
73
94
|
Status.new(name: "paid")
|
74
95
|
```
|
75
96
|
|
@@ -87,7 +108,7 @@ class Order < ActiveRecord::Base
|
|
87
108
|
end
|
88
109
|
```
|
89
110
|
|
90
|
-
|
111
|
+
Provides accessors to use the `status` attribute transparently:
|
91
112
|
|
92
113
|
```ruby
|
93
114
|
order = Order.new(status: "paid")
|
@@ -95,21 +116,27 @@ order = Order.new(status: "paid")
|
|
95
116
|
order.status
|
96
117
|
=> "paid"
|
97
118
|
|
119
|
+
order.status_id
|
120
|
+
=> 1
|
121
|
+
|
98
122
|
# Access the lookup object
|
99
123
|
order.raw_status
|
100
|
-
=>
|
124
|
+
=> #<Status id: 1, status: "paid">
|
101
125
|
|
102
126
|
# Access the lookup value before type casting
|
103
127
|
order.status_before_type_cast
|
104
128
|
=> "paid"
|
129
|
+
|
130
|
+
# Look ma', no strings!
|
131
|
+
Order.column_names
|
132
|
+
=> ["order_id", "status_id"]
|
105
133
|
```
|
106
134
|
|
107
135
|
### Symbolize
|
108
136
|
|
109
137
|
Casts the attribute to a symbol. Enables the setter to take a symbol.
|
110
138
|
|
111
|
-
|
112
|
-
never garbage collected._
|
139
|
+
_Bad idea when the set of lookup values is large. Symbols are never garbage collected._
|
113
140
|
|
114
141
|
```ruby
|
115
142
|
class Order < ActiveRecord::Base
|
@@ -127,7 +154,7 @@ order.status = :shipped
|
|
127
154
|
|
128
155
|
### Strict
|
129
156
|
|
130
|
-
|
157
|
+
By default, missing lookup values will raise an error.
|
131
158
|
|
132
159
|
```ruby
|
133
160
|
# Raise
|
@@ -137,12 +164,16 @@ lookup_for :status
|
|
137
164
|
# this will raise a LookupBy::Error
|
138
165
|
Order.status = "non-existent status"
|
139
166
|
|
140
|
-
# Set to nil
|
167
|
+
# Set to nil instead
|
141
168
|
lookup_for :status, strict: false
|
142
169
|
```
|
143
170
|
|
144
171
|
### Caching
|
145
172
|
|
173
|
+
The default is no caching. You can also cache all records or use an LRU.
|
174
|
+
|
175
|
+
_Note: caching is __per process__, make sure you think through the implications._
|
176
|
+
|
146
177
|
```ruby
|
147
178
|
# No caching - Not very useful
|
148
179
|
# Default
|
@@ -151,13 +182,15 @@ lookup_by :column_name
|
|
151
182
|
# Cache all
|
152
183
|
# Use for a small finite list (e.g. status codes, US states)
|
153
184
|
#
|
154
|
-
#
|
185
|
+
# Defaults to no read-through
|
186
|
+
# options[:find] = false
|
155
187
|
lookup_by :column_name, cache: true
|
156
188
|
|
157
189
|
# Cache N (with LRU eviction)
|
158
|
-
# Use for
|
190
|
+
# Use for large sets with uneven distribution (e.g. email domain, city)
|
159
191
|
#
|
160
|
-
#
|
192
|
+
# Requires read-through
|
193
|
+
# options[:find] = true
|
161
194
|
lookup_by :column_name, cache: 50
|
162
195
|
```
|
163
196
|
|
@@ -187,12 +220,12 @@ lookup_by :column_name
|
|
187
220
|
# Find or create
|
188
221
|
# Useful for user-submitted fields that grow over time
|
189
222
|
# e.g. user_agents, ip_addresses
|
190
|
-
#
|
223
|
+
#
|
191
224
|
# Note: Only works if attributes are nullable
|
192
225
|
lookup_by :column_name, cache: 20, find_or_create: true
|
193
226
|
```
|
194
227
|
|
195
|
-
###
|
228
|
+
### Normalize values
|
196
229
|
|
197
230
|
```ruby
|
198
231
|
# Normalize
|
@@ -200,6 +233,16 @@ lookup_by :column_name, cache: 20, find_or_create: true
|
|
200
233
|
lookup_by :column_name, normalize: true
|
201
234
|
```
|
202
235
|
|
236
|
+
### Allow blank
|
237
|
+
|
238
|
+
Can be useful to handle `params` that are not required.
|
239
|
+
|
240
|
+
```ruby
|
241
|
+
# Allow blank
|
242
|
+
# Treat "" different than nil
|
243
|
+
lookup_by :column_name, allow_blank: true
|
244
|
+
```
|
245
|
+
|
203
246
|
# Integration
|
204
247
|
|
205
248
|
### Cucumber
|
@@ -235,6 +278,7 @@ This plugin uses rspec and pry for testing. Make sure you have them installed:
|
|
235
278
|
|
236
279
|
To run the test suite:
|
237
280
|
|
281
|
+
rake app:db:test:prepare
|
238
282
|
rake
|
239
283
|
|
240
284
|
# Giving Back
|
@@ -249,13 +293,13 @@ To run the test suite:
|
|
249
293
|
|
250
294
|
### Attribution
|
251
295
|
|
252
|
-
A list of authors can be found on the [
|
296
|
+
A list of authors can be found on the [Contributors][] page.
|
253
297
|
|
254
|
-
Copyright ©
|
298
|
+
Copyright © 2014 Erik Peterson
|
255
299
|
|
256
300
|
Released under the MIT License. See [MIT-LICENSE][license] file for more details.
|
257
301
|
|
258
|
-
[development]:
|
259
|
-
[issues]:
|
260
|
-
[license]:
|
302
|
+
[development]: http://github.com/companygardener/lookup_by "LookupBy Development"
|
303
|
+
[issues]: http://github.com/companygardener/lookup_by/issues "LookupBy Issues"
|
304
|
+
[license]: http://github.com/companygardener/lookup_by/blob/master/MIT-LICENSE "LookupBy License"
|
261
305
|
[contributors]: http://github.com/companygardener/lookup_by/graphs/contributors "LookupBy Contributors"
|
data/Rakefile
CHANGED
@@ -1,10 +1,12 @@
|
|
1
|
-
#!/usr/bin/env rake
|
2
1
|
begin
|
3
2
|
require 'bundler/setup'
|
4
3
|
rescue LoadError
|
5
4
|
puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
|
6
5
|
end
|
7
6
|
|
7
|
+
APP_RAKEFILE = File.expand_path("../spec/dummy/Rakefile", __FILE__)
|
8
|
+
load 'rails/tasks/engine.rake'
|
9
|
+
|
8
10
|
Bundler::GemHelper.install_tasks
|
9
11
|
|
10
12
|
require "rspec/core/rake_task"
|
data/TODO.md
CHANGED
@@ -1,16 +1,14 @@
|
|
1
|
-
Roadmap
|
2
|
-
=======
|
1
|
+
# Roadmap
|
3
2
|
|
4
|
-
|
5
|
-
larger LRUs.
|
6
|
-
* Additional database support / tests
|
7
|
-
* Improve LRU algorithm
|
8
|
-
* Lookup by multiple fields, multi-column unique constraint
|
3
|
+
## Soon
|
9
4
|
|
10
|
-
Soon
|
11
|
-
====
|
12
|
-
* Travis CI
|
13
|
-
* Gemnasium
|
14
5
|
* Require validations / constraints on lookup field (presence, uniqueness)
|
15
6
|
* Trap signal to output stats
|
16
|
-
* Populate LRU with
|
7
|
+
* Populate LRU with counts grouped by an association
|
8
|
+
|
9
|
+
## Someday
|
10
|
+
|
11
|
+
* Pluggable backend (memcache, redis, etc.) to reduce memory usage, allow larger LRUs.
|
12
|
+
* Additional database support / tests
|
13
|
+
* Improve LRU algorithm
|
14
|
+
* Lookup by multiple fields, multi-column unique constraint
|
data/lib/lookup_by/cache.rb
CHANGED
@@ -67,13 +67,11 @@ module LookupBy
|
|
67
67
|
value = normalize(value) if @normalize && !primary_key?(value)
|
68
68
|
|
69
69
|
found = cache_read(value) if cache?
|
70
|
-
found ||= db_read(value) if @read
|
71
|
-
found ||= db_read(value) if not @enabled
|
70
|
+
found ||= db_read(value) if @read || !@enabled
|
72
71
|
|
73
72
|
@cache[found.id] = found if found && cache?
|
74
73
|
|
75
74
|
found ||= db_write(value) if @write
|
76
|
-
|
77
75
|
found
|
78
76
|
end
|
79
77
|
|
@@ -144,12 +142,16 @@ module LookupBy
|
|
144
142
|
found
|
145
143
|
end
|
146
144
|
|
147
|
-
# TODO: Handle race condition on create! failure
|
148
145
|
def db_write(value)
|
149
146
|
column = column_for(value)
|
150
147
|
|
151
|
-
|
152
|
-
|
148
|
+
return if column == @primary_key
|
149
|
+
|
150
|
+
@klass.transaction(requires_new: true) do
|
151
|
+
@klass.create!(column => value)
|
152
|
+
end
|
153
|
+
rescue ActiveRecord::RecordNotUnique
|
154
|
+
db_read(value)
|
153
155
|
end
|
154
156
|
|
155
157
|
def column_for(value)
|
data/lib/lookup_by/version.rb
CHANGED
data/lib/lookup_by.rb
CHANGED
data/lookup_by.gemspec
CHANGED
@@ -1,23 +1,29 @@
|
|
1
|
-
#
|
2
|
-
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path("../lib", __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
3
4
|
|
4
5
|
require "lookup_by/version"
|
5
6
|
|
6
7
|
Gem::Specification.new do |gem|
|
7
|
-
gem.name
|
8
|
-
gem.version
|
8
|
+
gem.name = "lookup_by"
|
9
|
+
gem.version = LookupBy::VERSION
|
9
10
|
|
10
|
-
gem.summary
|
11
|
-
gem.description
|
11
|
+
gem.summary = %q(A thread-safe lookup table cache for ActiveRecord)
|
12
|
+
gem.description = %q(Use database lookup tables in AR models.)
|
12
13
|
|
13
|
-
gem.authors
|
14
|
-
gem.email
|
14
|
+
gem.authors = ["Erik Peterson"]
|
15
|
+
gem.email = ["erik@enova.com"]
|
15
16
|
|
16
|
-
gem.homepage
|
17
|
+
gem.homepage = "https://www.github.com/companygardener/lookup_by"
|
18
|
+
gem.license = "MIT"
|
17
19
|
|
18
|
-
gem.
|
19
|
-
gem.
|
20
|
-
gem.test_files
|
20
|
+
gem.files = `git ls-files -z`.split("\x0")
|
21
|
+
gem.executables = gem.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
22
|
+
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
23
|
+
gem.require_paths = ["lib"]
|
21
24
|
|
22
|
-
gem.add_dependency "rails", ">= 3.
|
25
|
+
gem.add_dependency "rails", ">= 3.2.0"
|
26
|
+
|
27
|
+
gem.add_development_dependency "bundler", "~> 1.3"
|
28
|
+
gem.add_development_dependency "rake"
|
23
29
|
end
|
data/spec/association_spec.rb
CHANGED
@@ -11,19 +11,10 @@ Dummy::Application.configure do
|
|
11
11
|
|
12
12
|
# Show full error reports and disable caching.
|
13
13
|
config.consider_all_requests_local = true
|
14
|
-
config.action_controller.perform_caching = false
|
15
|
-
|
16
|
-
# Don't care if the mailer can't send.
|
17
|
-
config.action_mailer.raise_delivery_errors = false
|
18
14
|
|
19
15
|
# Print deprecation notices to the Rails logger.
|
20
16
|
config.active_support.deprecation = :log
|
21
17
|
|
22
18
|
# Raise an error on page load if there are pending migrations
|
23
19
|
config.active_record.migration_error = :page_load
|
24
|
-
|
25
|
-
# Debug mode disables concatenation and preprocessing of assets.
|
26
|
-
# This option may cause significant delays in view rendering with a large
|
27
|
-
# number of complex assets.
|
28
|
-
config.assets.debug = true
|
29
20
|
end
|
@@ -11,26 +11,4 @@ Dummy::Application.configure do
|
|
11
11
|
# just for the purpose of running a single test. If you are using a tool that
|
12
12
|
# preloads Rails for running tests, you may have to set it to true.
|
13
13
|
config.eager_load = false
|
14
|
-
|
15
|
-
# Configure static asset server for tests with Cache-Control for performance.
|
16
|
-
config.serve_static_assets = true
|
17
|
-
config.static_cache_control = "public, max-age=3600"
|
18
|
-
|
19
|
-
# Show full error reports and disable caching.
|
20
|
-
config.consider_all_requests_local = true
|
21
|
-
config.action_controller.perform_caching = false
|
22
|
-
|
23
|
-
# Raise exceptions instead of rendering exception templates.
|
24
|
-
config.action_dispatch.show_exceptions = false
|
25
|
-
|
26
|
-
# Disable request forgery protection in test environment.
|
27
|
-
config.action_controller.allow_forgery_protection = false
|
28
|
-
|
29
|
-
# Tell Action Mailer not to deliver emails to the real world.
|
30
|
-
# The :test delivery method accumulates sent emails in the
|
31
|
-
# ActionMailer::Base.deliveries array.
|
32
|
-
config.action_mailer.delivery_method = :test
|
33
|
-
|
34
|
-
# Print deprecation notices to the stderr.
|
35
|
-
config.active_support.deprecation = :stderr
|
36
14
|
end
|
data/spec/lookup_by_spec.rb
CHANGED
@@ -96,6 +96,31 @@ describe LookupBy::Lookup do
|
|
96
96
|
it "sets testing when RAILS_ENV=test" do
|
97
97
|
subject.lookup.testing.should be_true
|
98
98
|
end
|
99
|
+
|
100
|
+
it "does not write primary keys" do
|
101
|
+
expect { UserAgent[1] }.to_not raise_error
|
102
|
+
end
|
103
|
+
|
104
|
+
# Has begin..ensure to prevent monkey patch from leaking.
|
105
|
+
it "handles the race condition on write-throughs" do
|
106
|
+
begin
|
107
|
+
class ::LookupBy::Cache
|
108
|
+
alias fetch_old fetch
|
109
|
+
|
110
|
+
def fetch(value)
|
111
|
+
db_write(value)
|
112
|
+
db_write(value)
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
expect { UserAgent.transaction { UserAgent["Mozilla"].destroy } }.to_not raise_error
|
117
|
+
ensure
|
118
|
+
class ::LookupBy::Cache
|
119
|
+
alias fetch fetch_old
|
120
|
+
undef fetch_old
|
121
|
+
end
|
122
|
+
end
|
123
|
+
end
|
99
124
|
end
|
100
125
|
|
101
126
|
context "IpAddress.lookup_by :column, cache: N, find_or_create: true" do
|
@@ -0,0 +1,42 @@
|
|
1
|
+
require 'colored'
|
2
|
+
|
3
|
+
at_exit {
|
4
|
+
def gems(files)
|
5
|
+
files.map { |path| path[%r{(rubysl-.*)-\d[^/]+/}, 1] }.compact.uniq.sort
|
6
|
+
end
|
7
|
+
|
8
|
+
def gemlist(list)
|
9
|
+
puts list.map { |gem| "gem '#{gem}'" }.join("\n")
|
10
|
+
end
|
11
|
+
|
12
|
+
def header(label, list)
|
13
|
+
puts
|
14
|
+
puts "# [#{list.size}] #{label}".yellow
|
15
|
+
end
|
16
|
+
|
17
|
+
def section(label, files)
|
18
|
+
list = gems(files)
|
19
|
+
|
20
|
+
header label, list
|
21
|
+
gemlist list
|
22
|
+
end
|
23
|
+
|
24
|
+
files = $".grep /rubysl/
|
25
|
+
|
26
|
+
if ENV["DEBUG"] == "2"
|
27
|
+
header "Files", files
|
28
|
+
puts files.sort.join("\n")
|
29
|
+
end
|
30
|
+
|
31
|
+
runtime = files.grep %r{rubinius-[\d.]+/runtime/gems/}
|
32
|
+
internal = files.grep %r{rubinius-[\d.]+/gems/gems/}
|
33
|
+
external = files - runtime - internal
|
34
|
+
overlap = (gems(external) & gems(runtime)) | (gems(external) & gems(internal))
|
35
|
+
|
36
|
+
section "Rubinius runtime", runtime
|
37
|
+
section "Rubinius internal", internal
|
38
|
+
section "Rubygems", external
|
39
|
+
|
40
|
+
header "Overlapping", overlap
|
41
|
+
gemlist overlap
|
42
|
+
}
|
data/spec/spec_helper.rb
CHANGED
@@ -1,10 +1,15 @@
|
|
1
1
|
# This file is copied to spec/ when you run 'rails generate rspec:install'
|
2
2
|
ENV["RAILS_ENV"] ||= 'test'
|
3
3
|
|
4
|
-
|
5
|
-
|
6
|
-
if ENV["COV"]
|
4
|
+
if ENV["COVERAGE"]
|
7
5
|
require "simplecov"
|
6
|
+
require 'coveralls'
|
7
|
+
|
8
|
+
SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter[
|
9
|
+
Coveralls::SimpleCov::Formatter,
|
10
|
+
SimpleCov::Formatter::HTMLFormatter,
|
11
|
+
]
|
12
|
+
|
8
13
|
SimpleCov.start
|
9
14
|
end
|
10
15
|
|
@@ -14,27 +19,16 @@ rescue LoadError
|
|
14
19
|
require File.expand_path("../dummy/config/environment", __FILE__)
|
15
20
|
end
|
16
21
|
|
22
|
+
require 'rspec'
|
17
23
|
require 'database_cleaner'
|
18
|
-
require 'rspec/rails'
|
19
|
-
require 'rspec/autorun'
|
20
24
|
|
21
25
|
# Requires supporting ruby files with custom matchers and macros, etc,
|
22
26
|
# in spec/support/ and its subdirectories.
|
23
27
|
Dir[Rails.root.join("../support/**/*.rb")].each {|f| require f}
|
24
28
|
|
25
29
|
RSpec.configure do |config|
|
26
|
-
|
27
|
-
|
28
|
-
# If you prefer to use mocha, flexmock or RR, uncomment the appropriate line:
|
29
|
-
#
|
30
|
-
# config.mock_with :mocha
|
31
|
-
# config.mock_with :flexmock
|
32
|
-
# config.mock_with :rr
|
33
|
-
|
34
|
-
# If you're not using ActiveRecord, or you'd prefer not to run each of your
|
35
|
-
# examples within a transaction, remove the following line or assign false
|
36
|
-
# instead of true.
|
37
|
-
config.use_transactional_fixtures = false
|
30
|
+
config.backtrace_exclusion_patterns << /vendor\//
|
31
|
+
config.backtrace_exclusion_patterns << /lib\/rspec\/rails/
|
38
32
|
|
39
33
|
# Run specs in random order to surface order dependencies. If you find an
|
40
34
|
# order dependency and want to debug it, you can fix the order by providing
|
@@ -54,3 +48,5 @@ RSpec.configure do |config|
|
|
54
48
|
DatabaseCleaner.clean
|
55
49
|
end
|
56
50
|
end
|
51
|
+
|
52
|
+
require 'rubinius_helper' if ENV["DEBUG"] && RUBY_ENGINE == 'rbx'
|
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.
|
4
|
+
version: 0.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Erik Peterson
|
@@ -16,14 +16,42 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 3.
|
19
|
+
version: 3.2.0
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: 3.
|
26
|
+
version: 3.2.0
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: bundler
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '1.3'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '1.3'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rake
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
27
55
|
description: Use database lookup tables in AR models.
|
28
56
|
email:
|
29
57
|
- erik@enova.com
|
@@ -55,7 +83,6 @@ files:
|
|
55
83
|
- lookup_by.gemspec
|
56
84
|
- spec/association_spec.rb
|
57
85
|
- spec/caching/lru_spec.rb
|
58
|
-
- spec/dummy/.rspec
|
59
86
|
- spec/dummy/Rakefile
|
60
87
|
- spec/dummy/app/models/.gitkeep
|
61
88
|
- spec/dummy/app/models/account.rb
|
@@ -78,17 +105,11 @@ files:
|
|
78
105
|
- spec/dummy/config/database.yml
|
79
106
|
- spec/dummy/config/environment.rb
|
80
107
|
- spec/dummy/config/environments/development.rb
|
81
|
-
- spec/dummy/config/environments/production.rb
|
82
108
|
- spec/dummy/config/environments/test.rb
|
83
109
|
- spec/dummy/config/initializers/backtrace_silencers.rb
|
84
110
|
- spec/dummy/config/initializers/filter_parameter_logging.rb
|
85
111
|
- spec/dummy/config/initializers/inflections.rb
|
86
|
-
- spec/dummy/config/initializers/mime_types.rb
|
87
|
-
- spec/dummy/config/initializers/secret_token.rb
|
88
|
-
- spec/dummy/config/initializers/session_store.rb
|
89
|
-
- spec/dummy/config/initializers/wrap_parameters.rb
|
90
112
|
- spec/dummy/config/locales/en.yml
|
91
|
-
- spec/dummy/config/routes.rb
|
92
113
|
- spec/dummy/db/migrate/20121019040009_create_tables.rb
|
93
114
|
- spec/dummy/db/seeds.rb
|
94
115
|
- spec/dummy/db/structure.sql
|
@@ -96,10 +117,12 @@ files:
|
|
96
117
|
- spec/dummy/log/.gitkeep
|
97
118
|
- spec/dummy/script/rails
|
98
119
|
- spec/lookup_by_spec.rb
|
120
|
+
- spec/rubinius_helper.rb
|
99
121
|
- spec/spec_helper.rb
|
100
122
|
- spec/support/shared_examples_for_a_lookup.rb
|
101
|
-
homepage:
|
102
|
-
licenses:
|
123
|
+
homepage: https://www.github.com/companygardener/lookup_by
|
124
|
+
licenses:
|
125
|
+
- MIT
|
103
126
|
metadata: {}
|
104
127
|
post_install_message:
|
105
128
|
rdoc_options: []
|
@@ -124,7 +147,6 @@ summary: A thread-safe lookup table cache for ActiveRecord
|
|
124
147
|
test_files:
|
125
148
|
- spec/association_spec.rb
|
126
149
|
- spec/caching/lru_spec.rb
|
127
|
-
- spec/dummy/.rspec
|
128
150
|
- spec/dummy/Rakefile
|
129
151
|
- spec/dummy/app/models/.gitkeep
|
130
152
|
- spec/dummy/app/models/account.rb
|
@@ -147,17 +169,11 @@ test_files:
|
|
147
169
|
- spec/dummy/config/database.yml
|
148
170
|
- spec/dummy/config/environment.rb
|
149
171
|
- spec/dummy/config/environments/development.rb
|
150
|
-
- spec/dummy/config/environments/production.rb
|
151
172
|
- spec/dummy/config/environments/test.rb
|
152
173
|
- spec/dummy/config/initializers/backtrace_silencers.rb
|
153
174
|
- spec/dummy/config/initializers/filter_parameter_logging.rb
|
154
175
|
- spec/dummy/config/initializers/inflections.rb
|
155
|
-
- spec/dummy/config/initializers/mime_types.rb
|
156
|
-
- spec/dummy/config/initializers/secret_token.rb
|
157
|
-
- spec/dummy/config/initializers/session_store.rb
|
158
|
-
- spec/dummy/config/initializers/wrap_parameters.rb
|
159
176
|
- spec/dummy/config/locales/en.yml
|
160
|
-
- spec/dummy/config/routes.rb
|
161
177
|
- spec/dummy/db/migrate/20121019040009_create_tables.rb
|
162
178
|
- spec/dummy/db/seeds.rb
|
163
179
|
- spec/dummy/db/structure.sql
|
@@ -165,5 +181,6 @@ test_files:
|
|
165
181
|
- spec/dummy/log/.gitkeep
|
166
182
|
- spec/dummy/script/rails
|
167
183
|
- spec/lookup_by_spec.rb
|
184
|
+
- spec/rubinius_helper.rb
|
168
185
|
- spec/spec_helper.rb
|
169
186
|
- spec/support/shared_examples_for_a_lookup.rb
|
data/spec/dummy/.rspec
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
--color
|
@@ -1,80 +0,0 @@
|
|
1
|
-
Dummy::Application.configure do
|
2
|
-
# Settings specified here will take precedence over those in config/application.rb.
|
3
|
-
|
4
|
-
# Code is not reloaded between requests.
|
5
|
-
config.cache_classes = true
|
6
|
-
|
7
|
-
# Eager load code on boot. This eager loads most of Rails and
|
8
|
-
# your application in memory, allowing both thread web servers
|
9
|
-
# and those relying on copy on write to perform better.
|
10
|
-
# Rake tasks automatically ignore this option for performance.
|
11
|
-
config.eager_load = true
|
12
|
-
|
13
|
-
# Full error reports are disabled and caching is turned on.
|
14
|
-
config.consider_all_requests_local = false
|
15
|
-
config.action_controller.perform_caching = true
|
16
|
-
|
17
|
-
# Enable Rack::Cache to put a simple HTTP cache in front of your application
|
18
|
-
# Add `rack-cache` to your Gemfile before enabling this.
|
19
|
-
# For large-scale production use, consider using a caching reverse proxy like nginx, varnish or squid.
|
20
|
-
# config.action_dispatch.rack_cache = true
|
21
|
-
|
22
|
-
# Disable Rails's static asset server (Apache or nginx will already do this).
|
23
|
-
config.serve_static_assets = false
|
24
|
-
|
25
|
-
# Compress JavaScripts and CSS.
|
26
|
-
config.assets.js_compressor = :uglifier
|
27
|
-
# config.assets.css_compressor = :sass
|
28
|
-
|
29
|
-
# Do not fallback to assets pipeline if a precompiled asset is missed.
|
30
|
-
config.assets.compile = false
|
31
|
-
|
32
|
-
# Generate digests for assets URLs.
|
33
|
-
config.assets.digest = true
|
34
|
-
|
35
|
-
# Version of your assets, change this if you want to expire all your assets.
|
36
|
-
config.assets.version = '1.0'
|
37
|
-
|
38
|
-
# Specifies the header that your server uses for sending files.
|
39
|
-
# config.action_dispatch.x_sendfile_header = "X-Sendfile" # for apache
|
40
|
-
# config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect' # for nginx
|
41
|
-
|
42
|
-
# Force all access to the app over SSL, use Strict-Transport-Security, and use secure cookies.
|
43
|
-
# config.force_ssl = true
|
44
|
-
|
45
|
-
# Set to :debug to see everything in the log.
|
46
|
-
config.log_level = :info
|
47
|
-
|
48
|
-
# Prepend all log lines with the following tags.
|
49
|
-
# config.log_tags = [ :subdomain, :uuid ]
|
50
|
-
|
51
|
-
# Use a different logger for distributed setups.
|
52
|
-
# config.logger = ActiveSupport::TaggedLogging.new(SyslogLogger.new)
|
53
|
-
|
54
|
-
# Use a different cache store in production.
|
55
|
-
# config.cache_store = :mem_cache_store
|
56
|
-
|
57
|
-
# Enable serving of images, stylesheets, and JavaScripts from an asset server.
|
58
|
-
# config.action_controller.asset_host = "http://assets.example.com"
|
59
|
-
|
60
|
-
# Precompile additional assets.
|
61
|
-
# application.js, application.css, and all non-JS/CSS in app/assets folder are already added.
|
62
|
-
# config.assets.precompile += %w( search.js )
|
63
|
-
|
64
|
-
# Ignore bad email addresses and do not raise email delivery errors.
|
65
|
-
# Set this to true and configure the email server for immediate delivery to raise delivery errors.
|
66
|
-
# config.action_mailer.raise_delivery_errors = false
|
67
|
-
|
68
|
-
# Enable locale fallbacks for I18n (makes lookups for any locale fall back to
|
69
|
-
# the I18n.default_locale when a translation can not be found).
|
70
|
-
config.i18n.fallbacks = true
|
71
|
-
|
72
|
-
# Send deprecation notices to registered listeners.
|
73
|
-
config.active_support.deprecation = :notify
|
74
|
-
|
75
|
-
# Disable automatic flushing of the log to improve performance.
|
76
|
-
# config.autoflush_log = false
|
77
|
-
|
78
|
-
# Use default logging formatter so that PID and timestamp are not suppressed.
|
79
|
-
config.log_formatter = ::Logger::Formatter.new
|
80
|
-
end
|
@@ -1,12 +0,0 @@
|
|
1
|
-
# Be sure to restart your server when you modify this file.
|
2
|
-
|
3
|
-
# Your secret key is used for verifying the integrity of signed cookies.
|
4
|
-
# If you change this key, all old signed cookies will become invalid!
|
5
|
-
|
6
|
-
# Make sure the secret is at least 30 characters and all random,
|
7
|
-
# no regular words or you'll be exposed to dictionary attacks.
|
8
|
-
# You can use `rake secret` to generate a secure secret key.
|
9
|
-
|
10
|
-
# Make sure your secret_key_base is kept private
|
11
|
-
# if you're sharing your code publicly.
|
12
|
-
Dummy::Application.config.secret_key_base = 'dd1f177df9ee969a1650a95ccd09916cd7df6779d28eb863b5ab89f5635e9ee69a1394a79628e3ca005b2333a1419a3e1c17f1086179d48a8a6f6ff6ac3d6bec'
|
@@ -1,14 +0,0 @@
|
|
1
|
-
# Be sure to restart your server when you modify this file.
|
2
|
-
|
3
|
-
# This file contains settings for ActionController::ParamsWrapper which
|
4
|
-
# is enabled by default.
|
5
|
-
|
6
|
-
# Enable parameter wrapping for JSON. You can disable this by setting :format to an empty array.
|
7
|
-
ActiveSupport.on_load(:action_controller) do
|
8
|
-
wrap_parameters format: [:json] if respond_to?(:wrap_parameters)
|
9
|
-
end
|
10
|
-
|
11
|
-
# To enable root element in JSON for ActiveRecord objects.
|
12
|
-
# ActiveSupport.on_load(:active_record) do
|
13
|
-
# self.include_root_in_json = true
|
14
|
-
# end
|
data/spec/dummy/config/routes.rb
DELETED
@@ -1,56 +0,0 @@
|
|
1
|
-
Dummy::Application.routes.draw do
|
2
|
-
# The priority is based upon order of creation: first created -> highest priority.
|
3
|
-
# See how all your routes lay out with "rake routes".
|
4
|
-
|
5
|
-
# You can have the root of your site routed with "root"
|
6
|
-
# root 'welcome#index'
|
7
|
-
|
8
|
-
# Example of regular route:
|
9
|
-
# get 'products/:id' => 'catalog#view'
|
10
|
-
|
11
|
-
# Example of named route that can be invoked with purchase_url(id: product.id)
|
12
|
-
# get 'products/:id/purchase' => 'catalog#purchase', as: :purchase
|
13
|
-
|
14
|
-
# Example resource route (maps HTTP verbs to controller actions automatically):
|
15
|
-
# resources :products
|
16
|
-
|
17
|
-
# Example resource route with options:
|
18
|
-
# resources :products do
|
19
|
-
# member do
|
20
|
-
# get 'short'
|
21
|
-
# post 'toggle'
|
22
|
-
# end
|
23
|
-
#
|
24
|
-
# collection do
|
25
|
-
# get 'sold'
|
26
|
-
# end
|
27
|
-
# end
|
28
|
-
|
29
|
-
# Example resource route with sub-resources:
|
30
|
-
# resources :products do
|
31
|
-
# resources :comments, :sales
|
32
|
-
# resource :seller
|
33
|
-
# end
|
34
|
-
|
35
|
-
# Example resource route with more complex sub-resources:
|
36
|
-
# resources :products do
|
37
|
-
# resources :comments
|
38
|
-
# resources :sales do
|
39
|
-
# get 'recent', on: :collection
|
40
|
-
# end
|
41
|
-
# end
|
42
|
-
|
43
|
-
# Example resource route with concerns:
|
44
|
-
# concern :toggleable do
|
45
|
-
# post 'toggle'
|
46
|
-
# end
|
47
|
-
# resources :posts, concerns: :toggleable
|
48
|
-
# resources :photos, concerns: :toggleable
|
49
|
-
|
50
|
-
# Example resource route within a namespace:
|
51
|
-
# namespace :admin do
|
52
|
-
# # Directs /admin/products/* to Admin::ProductsController
|
53
|
-
# # (app/controllers/admin/products_controller.rb)
|
54
|
-
# resources :products
|
55
|
-
# end
|
56
|
-
end
|