dynamic_finders_plus 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
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,2 @@
1
+ #!/usr/bin/env rake
2
+ require "bundler/gem_tasks"
@@ -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
@@ -0,0 +1,8 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in activemodel_warnings.gemspec
4
+ gemspec
5
+
6
+ group :development do
7
+ gem 'activerecord', :require => "active_record"
8
+ end
data/init.rb ADDED
File without changes
@@ -0,0 +1,6 @@
1
+ require "dynamic_finders_plus/method_missing_hook"
2
+ require "dynamic_finders_plus/version"
3
+ require "dynamic_finders_plus/finder"
4
+ require "dynamic_finders_plus/string_definer"
5
+ require "dynamic_finders_plus/boolean_definer"
6
+
@@ -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,7 @@
1
+ module DynamicFindersPlus
2
+ class StringDefiners < Finder
3
+ finder :string, ->(column){"#{column.name}_contains"} do |k, column, term|
4
+ k.where(k.arel_table[column.name].matches("%#{term}%"))
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,3 @@
1
+ module DynamicFindersPlus
2
+ VERSION = "0.0.4"
3
+ 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
@@ -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