mind_reader 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (3) hide show
  1. data/lib/mind_reader.rb +87 -0
  2. data/mind_reader.gemspec +20 -0
  3. metadata +80 -0
@@ -0,0 +1,87 @@
1
+ require 'rubygems'
2
+ require 'active_support/all'
3
+
4
+ class MindReader
5
+ def initialize(klass)
6
+ @klass = klass
7
+ @retrieve_all_when_no_value_is_given = false
8
+ @configuration = ConfigurableObject.new
9
+ yield @configuration if block_given?
10
+ end
11
+
12
+ attr_accessor :retrieve_all_when_no_value_is_given
13
+
14
+ def execute(pairs)
15
+ @pairs = pairs
16
+ process
17
+ if @pairs.present? || @clause.first.present?
18
+ @klass.where(@pairs).where(*@clause.try(:flatten))
19
+ else
20
+ retrieve_all_when_no_value_is_given ? @klass.find(:all) : nil
21
+ end
22
+ end
23
+
24
+ private
25
+
26
+ def configs
27
+ @configuration.configs
28
+ end
29
+
30
+ def process
31
+ remove_blanks
32
+ handle_lookup
33
+ handle_range
34
+ handle_partials
35
+ end
36
+
37
+ def remove_blanks
38
+ @pairs.reject! {|k, v| v.blank?}
39
+ end
40
+
41
+ def handle_partials
42
+ string_keys = @pairs.map {|field, value|
43
+ field if string_field?(field) && value.present?
44
+ }.
45
+ compact
46
+ @clause = [string_keys.map {|k| "#{k} like ?" }.join(" and "),
47
+ string_keys.map {|k| "%#{@pairs[k]}%"}]
48
+ string_keys.each {|field| @pairs.delete(field) }
49
+ end
50
+
51
+ def handle_lookup
52
+ configs.each do |c|
53
+ if c[:args].has_key?(:lookup)
54
+ lookup_value = @pairs.delete(c[:args][:lookup])
55
+ @pairs[c[:field]] = c[:block].call(lookup_value)
56
+ end
57
+ end
58
+ end
59
+
60
+ def handle_range
61
+ configs.each do |c|
62
+ if c[:args].has_key?(:range)
63
+ range = c[:args][:range]
64
+ start_field, end_field = range.begin.to_s, range.end.to_s
65
+ start_value, end_value = @pairs.delete(start_field), @pairs.delete(end_field)
66
+ @pairs.merge! c[:field] => start_value..end_value
67
+ end
68
+ end
69
+ end
70
+
71
+ def string_field?(field)
72
+ @klass.columns_hash[field.to_s].try(:type) == :string
73
+ end
74
+
75
+ class ConfigurableObject
76
+ def initialize
77
+ @configs = []
78
+ end
79
+
80
+ def method_missing(method_name, *args, &block)
81
+ @configs << {:field => method_name, :args => args.first, :block => block}
82
+ end
83
+
84
+ attr_reader :configs
85
+ end
86
+ end
87
+
@@ -0,0 +1,20 @@
1
+ # encoding: utf-8
2
+
3
+ Gem::Specification.new do |s|
4
+ s.name = %q{mind_reader}
5
+ s.version = '0.0.1'
6
+
7
+ s.required_rubygems_version = Gem::Requirement.new('>= 0') if s.respond_to? :required_rubygems_version=
8
+ s.authors = ['Rodrigo Manhães']
9
+ s.date = %{2010-07-08}
10
+ s.description = %{Easy searching for ActiveRecord applications}
11
+ s.email = ['rmanhaes@gmail.com']
12
+ s.files = ['mind_reader.gemspec', 'lib/mind_reader.rb']
13
+ s.require_paths = ['lib']
14
+ s.rubyforge_project = %q{mind_reader}
15
+ s.rubygems_version = %q{1.3.7}
16
+ s.summary = %q{Easy searching for ActiveRecord applications}
17
+ s.add_dependency 'activerecord', '~>3.0.0'
18
+ s.homepage = 'http://github.com/rodrigomanhaes/mind_reader'
19
+ end
20
+
metadata ADDED
@@ -0,0 +1,80 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: mind_reader
3
+ version: !ruby/object:Gem::Version
4
+ prerelease: false
5
+ segments:
6
+ - 0
7
+ - 0
8
+ - 1
9
+ version: 0.0.1
10
+ platform: ruby
11
+ authors:
12
+ - "Rodrigo Manh\xC3\xA3es"
13
+ autorequire:
14
+ bindir: bin
15
+ cert_chain: []
16
+
17
+ date: 2010-07-08 00:00:00 -03:00
18
+ default_executable:
19
+ dependencies:
20
+ - !ruby/object:Gem::Dependency
21
+ name: activerecord
22
+ prerelease: false
23
+ requirement: &id001 !ruby/object:Gem::Requirement
24
+ none: false
25
+ requirements:
26
+ - - ~>
27
+ - !ruby/object:Gem::Version
28
+ segments:
29
+ - 3
30
+ - 0
31
+ - 0
32
+ version: 3.0.0
33
+ type: :runtime
34
+ version_requirements: *id001
35
+ description: Easy searching for ActiveRecord applications
36
+ email:
37
+ - rmanhaes@gmail.com
38
+ executables: []
39
+
40
+ extensions: []
41
+
42
+ extra_rdoc_files: []
43
+
44
+ files:
45
+ - mind_reader.gemspec
46
+ - lib/mind_reader.rb
47
+ has_rdoc: true
48
+ homepage: http://github.com/rodrigomanhaes/mind_reader
49
+ licenses: []
50
+
51
+ post_install_message:
52
+ rdoc_options: []
53
+
54
+ require_paths:
55
+ - lib
56
+ required_ruby_version: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ segments:
62
+ - 0
63
+ version: "0"
64
+ required_rubygems_version: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ">="
68
+ - !ruby/object:Gem::Version
69
+ segments:
70
+ - 0
71
+ version: "0"
72
+ requirements: []
73
+
74
+ rubyforge_project: mind_reader
75
+ rubygems_version: 1.3.7
76
+ signing_key:
77
+ specification_version: 3
78
+ summary: Easy searching for ActiveRecord applications
79
+ test_files: []
80
+