lookup_by 0.3.2 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +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
|
-
[][rubygems]
|
4
|
+
[][travis]
|
5
|
+
[][gemnasium]
|
6
|
+
[][coveralls]
|
7
|
+
[][codeclimate]
|
8
|
+
[][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
|