dynamic_finders_plus 0.0.4
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.
- data/.gitignore +1 -0
- data/Gemfile.lock +45 -0
- data/Rakefile +2 -0
- data/dynamic_finders_plus.gemspec +24 -0
- data/gemfile +8 -0
- data/init.rb +0 -0
- data/lib/dynamic_finders_plus.rb +6 -0
- data/lib/dynamic_finders_plus/Finder.rb +51 -0
- data/lib/dynamic_finders_plus/boolean_definer.rb +12 -0
- data/lib/dynamic_finders_plus/method_missing_hook.rb +31 -0
- data/lib/dynamic_finders_plus/string_definer.rb +7 -0
- data/lib/dynamic_finders_plus/version.rb +3 -0
- data/spec/definer_spec.rb +17 -0
- data/spec/spec_helper.rb +34 -0
- metadata +141 -0
data/.gitignore
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
*.gem
|
data/Gemfile.lock
ADDED
@@ -0,0 +1,45 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
dynamic_finders_plus (0.0.4)
|
5
|
+
activemodel (~> 3.2.0)
|
6
|
+
activesupport
|
7
|
+
|
8
|
+
GEM
|
9
|
+
remote: https://rubygems.org/
|
10
|
+
specs:
|
11
|
+
activemodel (3.2.7)
|
12
|
+
activesupport (= 3.2.7)
|
13
|
+
builder (~> 3.0.0)
|
14
|
+
activerecord (3.2.7)
|
15
|
+
activemodel (= 3.2.7)
|
16
|
+
activesupport (= 3.2.7)
|
17
|
+
arel (~> 3.0.2)
|
18
|
+
tzinfo (~> 0.3.29)
|
19
|
+
activesupport (3.2.7)
|
20
|
+
i18n (~> 0.6)
|
21
|
+
multi_json (~> 1.0)
|
22
|
+
arel (3.0.2)
|
23
|
+
builder (3.0.0)
|
24
|
+
diff-lcs (1.1.3)
|
25
|
+
i18n (0.6.0)
|
26
|
+
multi_json (1.3.6)
|
27
|
+
rspec (2.11.0)
|
28
|
+
rspec-core (~> 2.11.0)
|
29
|
+
rspec-expectations (~> 2.11.0)
|
30
|
+
rspec-mocks (~> 2.11.0)
|
31
|
+
rspec-core (2.11.1)
|
32
|
+
rspec-expectations (2.11.2)
|
33
|
+
diff-lcs (~> 1.1.3)
|
34
|
+
rspec-mocks (2.11.1)
|
35
|
+
sqlite3 (1.3.6)
|
36
|
+
tzinfo (0.3.33)
|
37
|
+
|
38
|
+
PLATFORMS
|
39
|
+
ruby
|
40
|
+
|
41
|
+
DEPENDENCIES
|
42
|
+
activerecord
|
43
|
+
dynamic_finders_plus!
|
44
|
+
rspec
|
45
|
+
sqlite3
|
data/Rakefile
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
#-*- encoding: utf-8 -*-
|
2
|
+
require File.expand_path('../lib/dynamic_finders_plus/version', __FILE__)
|
3
|
+
|
4
|
+
Gem::Specification.new do |gem|
|
5
|
+
gem.authors = ["Courtney de Lautour"]
|
6
|
+
gem.email = ["clautour@thefrontiergroup.com.au"]
|
7
|
+
gem.description = %q{Adds a number of extra dynamic finders to active record models}
|
8
|
+
gem.summary = %q{Adds a number of extra dynamic finders to active record models}
|
9
|
+
gem.homepage = "https://github.com/Amerdrix/dynamic_finders_plus"
|
10
|
+
|
11
|
+
gem.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
12
|
+
gem.files = `git ls-files`.split("\n")
|
13
|
+
gem.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
14
|
+
gem.name = "dynamic_finders_plus"
|
15
|
+
gem.require_paths = ["lib"]
|
16
|
+
gem.version = DynamicFindersPlus::VERSION
|
17
|
+
|
18
|
+
gem.add_dependency "activemodel", "~>3.2.0"
|
19
|
+
gem.add_dependency 'activesupport'
|
20
|
+
|
21
|
+
gem.add_development_dependency "rspec"
|
22
|
+
gem.add_development_dependency "activerecord"
|
23
|
+
gem.add_development_dependency 'sqlite3'
|
24
|
+
end
|
data/gemfile
ADDED
data/init.rb
ADDED
File without changes
|
@@ -0,0 +1,51 @@
|
|
1
|
+
module DynamicFindersPlus
|
2
|
+
class Finder
|
3
|
+
|
4
|
+
def self.wrap object
|
5
|
+
if object.nil?
|
6
|
+
[]
|
7
|
+
elsif object.respond_to?(:to_ary)
|
8
|
+
object.to_ary || [object]
|
9
|
+
else
|
10
|
+
[object]
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.finder (types, name_lambda, body_lambda=nil, &body_block)
|
15
|
+
body_lambda ||= body_block.to_proc
|
16
|
+
wrap(types).each do |type|
|
17
|
+
type= type.to_sym
|
18
|
+
finders[type] ||= Set.new
|
19
|
+
finders[type] << [name_lambda, body_lambda]
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def self.define_for klass
|
24
|
+
return nil unless defined.add? klass
|
25
|
+
return if klass.abstract_class
|
26
|
+
|
27
|
+
results = {}
|
28
|
+
klass.columns.each do |column|
|
29
|
+
(finders[column.type] || []).each do |name_l, body|
|
30
|
+
wrapped= ->(*args) do
|
31
|
+
args.insert(0, klass, column);
|
32
|
+
body.call *args
|
33
|
+
end
|
34
|
+
|
35
|
+
name = name_l.(column)
|
36
|
+
method = klass.define_singleton_method name, &wrapped
|
37
|
+
results[name.to_sym] = method
|
38
|
+
end
|
39
|
+
end
|
40
|
+
results
|
41
|
+
end
|
42
|
+
|
43
|
+
def self.defined
|
44
|
+
@@defined ||= Set.new
|
45
|
+
end
|
46
|
+
|
47
|
+
def self.finders
|
48
|
+
@@finders ||= {}
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
module DynamicFindersPlus
|
2
|
+
class BooleanDefiners < Finder
|
3
|
+
|
4
|
+
finder :boolean, ->(column){"is_#{column.name}"} do |k, column|
|
5
|
+
k.where column.name => true
|
6
|
+
end
|
7
|
+
|
8
|
+
finder :boolean, ->(column){"is_not_#{column.name}"} do |k, column|
|
9
|
+
k.where column.name => false
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'active_record/base'
|
2
|
+
require 'active_record/relation'
|
3
|
+
require 'active_record/attribute_methods'
|
4
|
+
module ActiveRecord
|
5
|
+
class Base
|
6
|
+
class << self
|
7
|
+
alias b1862897f5d04bd5be5e76e0ba0812bcV method_missing
|
8
|
+
def method_missing name, *args, &block
|
9
|
+
|
10
|
+
self.define_singleton_method :method_missing, method(:b1862897f5d04bd5be5e76e0ba0812bcV)
|
11
|
+
if (new_methods = DynamicFindersPlus::Finder.define_for self) && (method = new_methods[name])
|
12
|
+
method.call *args, &block
|
13
|
+
else
|
14
|
+
b1862897f5d04bd5be5e76e0ba0812bcV name, *args, &block
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
class Relation
|
21
|
+
alias a39c8f8aecf84ae4a83e86415d111cc8 method_missing
|
22
|
+
def method_missing name, *args, &block
|
23
|
+
if (new_methods = DynamicFindersPlus::Finder.define_for @klass) && (method = new_methods[name])
|
24
|
+
method.call *args, &block
|
25
|
+
else
|
26
|
+
a39c8f8aecf84ae4a83e86415d111cc8 name, *args, &block
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe SimpleModel do
|
4
|
+
|
5
|
+
subject { SimpleModel }
|
6
|
+
|
7
|
+
before(:all) do
|
8
|
+
begin SimpleModel.foo
|
9
|
+
rescue
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
it { should respond_to :name_contains }
|
14
|
+
it { should respond_to :is_active }
|
15
|
+
it { should respond_to :is_not_active }
|
16
|
+
|
17
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
require 'active_record'
|
2
|
+
require 'dynamic_finders_plus'
|
3
|
+
|
4
|
+
|
5
|
+
# Connect to a temporary database and create the appropriate model tables
|
6
|
+
ActiveRecord::Base.establish_connection(
|
7
|
+
:adapter => 'sqlite3',
|
8
|
+
:database => ':memory:',
|
9
|
+
:verbosity => 'quiet'
|
10
|
+
)
|
11
|
+
ActiveRecord::Base.connection.execute(%Q{
|
12
|
+
CREATE TABLE IF NOT EXISTS simple_models(
|
13
|
+
id INTEGER PRIMARY KEY,
|
14
|
+
name VARCHAR(255),
|
15
|
+
age INTEGER,
|
16
|
+
active BOOLEAN,
|
17
|
+
date_of_birth DATETIME
|
18
|
+
)
|
19
|
+
})
|
20
|
+
|
21
|
+
class SimpleModel < ActiveRecord::Base
|
22
|
+
end
|
23
|
+
|
24
|
+
|
25
|
+
|
26
|
+
RSpec.configure do |config|
|
27
|
+
config.before(:all) do
|
28
|
+
|
29
|
+
end
|
30
|
+
|
31
|
+
config.before(:each) do
|
32
|
+
SimpleModel.destroy_all
|
33
|
+
end
|
34
|
+
end
|
metadata
ADDED
@@ -0,0 +1,141 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: dynamic_finders_plus
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.4
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Courtney de Lautour
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2012-07-30 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: activemodel
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ~>
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: 3.2.0
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ~>
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: 3.2.0
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: activesupport
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ! '>='
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '0'
|
38
|
+
type: :runtime
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '0'
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
name: rspec
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
50
|
+
requirements:
|
51
|
+
- - ! '>='
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '0'
|
54
|
+
type: :development
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ! '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
- !ruby/object:Gem::Dependency
|
63
|
+
name: activerecord
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
65
|
+
none: false
|
66
|
+
requirements:
|
67
|
+
- - ! '>='
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '0'
|
70
|
+
type: :development
|
71
|
+
prerelease: false
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ! '>='
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: '0'
|
78
|
+
- !ruby/object:Gem::Dependency
|
79
|
+
name: sqlite3
|
80
|
+
requirement: !ruby/object:Gem::Requirement
|
81
|
+
none: false
|
82
|
+
requirements:
|
83
|
+
- - ! '>='
|
84
|
+
- !ruby/object:Gem::Version
|
85
|
+
version: '0'
|
86
|
+
type: :development
|
87
|
+
prerelease: false
|
88
|
+
version_requirements: !ruby/object:Gem::Requirement
|
89
|
+
none: false
|
90
|
+
requirements:
|
91
|
+
- - ! '>='
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: '0'
|
94
|
+
description: Adds a number of extra dynamic finders to active record models
|
95
|
+
email:
|
96
|
+
- clautour@thefrontiergroup.com.au
|
97
|
+
executables: []
|
98
|
+
extensions: []
|
99
|
+
extra_rdoc_files: []
|
100
|
+
files:
|
101
|
+
- .gitignore
|
102
|
+
- Gemfile.lock
|
103
|
+
- Rakefile
|
104
|
+
- dynamic_finders_plus.gemspec
|
105
|
+
- gemfile
|
106
|
+
- init.rb
|
107
|
+
- lib/dynamic_finders_plus.rb
|
108
|
+
- lib/dynamic_finders_plus/Finder.rb
|
109
|
+
- lib/dynamic_finders_plus/boolean_definer.rb
|
110
|
+
- lib/dynamic_finders_plus/method_missing_hook.rb
|
111
|
+
- lib/dynamic_finders_plus/string_definer.rb
|
112
|
+
- lib/dynamic_finders_plus/version.rb
|
113
|
+
- spec/definer_spec.rb
|
114
|
+
- spec/spec_helper.rb
|
115
|
+
homepage: https://github.com/Amerdrix/dynamic_finders_plus
|
116
|
+
licenses: []
|
117
|
+
post_install_message:
|
118
|
+
rdoc_options: []
|
119
|
+
require_paths:
|
120
|
+
- lib
|
121
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
122
|
+
none: false
|
123
|
+
requirements:
|
124
|
+
- - ! '>='
|
125
|
+
- !ruby/object:Gem::Version
|
126
|
+
version: '0'
|
127
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
128
|
+
none: false
|
129
|
+
requirements:
|
130
|
+
- - ! '>='
|
131
|
+
- !ruby/object:Gem::Version
|
132
|
+
version: '0'
|
133
|
+
requirements: []
|
134
|
+
rubyforge_project:
|
135
|
+
rubygems_version: 1.8.24
|
136
|
+
signing_key:
|
137
|
+
specification_version: 3
|
138
|
+
summary: Adds a number of extra dynamic finders to active record models
|
139
|
+
test_files:
|
140
|
+
- spec/definer_spec.rb
|
141
|
+
- spec/spec_helper.rb
|