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 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