mind_reader 0.0.1

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