ooor_finders 0.1

Sign up to get free protection for your applications and to get access to all the features.
data/README.md ADDED
@@ -0,0 +1,25 @@
1
+ Following behaviors are added
2
+
3
+ find_by_XX
4
+ find_first_by_XX
5
+ find_all_by_XX
6
+ find_last_by_XX
7
+ +
8
+ find_by_xml_id or alias find_by_oid
9
+
10
+ So we can do
11
+
12
+ ResUsers.find_by_xml_id('module.xml_id').id
13
+ ResUsers.find_by_id(23).id
14
+ ResUsers.find_by_name('Administrator').id
15
+ ResUsers.find_by_name!('Administrator').id Will throw an exception if you put a ! at the end
16
+
17
+ We can also do:
18
+ ResUsers.find_all_by_name('Administrator')
19
+ ResUsers.find_last_by_name('Administrator')
20
+ ResUsers.find_last_by_name_and_login('Administrator', 'admin')
21
+ ResUsers.find_by_name_and_login('Administrator', 'admin')
22
+
23
+ Other options are supported
24
+
25
+ ResUsers.find_all_by_name('Administrator', :fields=>['id'], :limit=>20)
@@ -0,0 +1,54 @@
1
+
2
+ # Active Record Dynamic Finder Match
3
+ #
4
+ # Taken from active record source code
5
+ #
6
+ class DynamicFinderMatch
7
+ def self.match(method)
8
+ finder = :first
9
+ bang = false
10
+ instantiator = nil
11
+
12
+ case method.to_s
13
+ when /^find_(all_|last_)?by_([_a-zA-Z]\w*)$/
14
+ finder = :last if $1 == 'last_'
15
+ finder = :all if $1 == 'all_'
16
+ names = $2
17
+ when /^find_by_([_a-zA-Z]\w*)\!$/
18
+ bang = true
19
+ names = $1
20
+ when /^find_or_(initialize|create)_by_([_a-zA-Z]\w*)$/
21
+ instantiator = $1 == 'initialize' ? :new : :create
22
+ names = $2
23
+ else
24
+ return nil
25
+ end
26
+
27
+ new(finder, instantiator, bang, names.split('_and_'))
28
+ end
29
+
30
+ def initialize(finder, instantiator, bang, attribute_names)
31
+ @finder = finder
32
+ @instantiator = instantiator
33
+ @bang = bang
34
+ @attribute_names = attribute_names
35
+ end
36
+
37
+ attr_reader :finder, :attribute_names, :instantiator
38
+
39
+ def finder?
40
+ @finder && !@instantiator
41
+ end
42
+
43
+ def instantiator?
44
+ @finder == :first && @instantiator
45
+ end
46
+
47
+ def creator?
48
+ @finder == :first && @instantiator == :create
49
+ end
50
+
51
+ def bang?
52
+ @bang
53
+ end
54
+ end
@@ -0,0 +1 @@
1
+ require "open_object_resource"
@@ -0,0 +1,42 @@
1
+ require 'rubygems'
2
+ require 'ooor'
3
+
4
+ module Ooor
5
+ class OpenObjectResource
6
+ class << self
7
+ alias_method :method_missing_original, :method_missing
8
+
9
+ def _dynamic_find(match, arguments)
10
+ options = {}
11
+ if arguments.last.is_a? Hash
12
+ options = arguments.last
13
+ end
14
+ attributes = match.attribute_names
15
+ if attributes[0] == 'xml_id' || attributes[0] == 'id' || attributes[0] == 'oid'
16
+ return self.find(arguments[0], options)
17
+ else
18
+ domain = []
19
+ attributes.length.times do | index |
20
+ domain.push([attributes[index] ,'=', arguments[index]])
21
+ end
22
+ options.merge!({:domain => domain})
23
+ res = self.find(match.finder, options)
24
+ if match.bang?
25
+ unless res
26
+ raise "Could not find #{self.class} with for domain #{domain.inspect}"
27
+ end
28
+ end
29
+ return res
30
+ end
31
+ end
32
+
33
+ def method_missing(method_symbol, *arguments)
34
+ match = DynamicFinderMatch.match(method_symbol.to_s)
35
+ if match
36
+ return send(:_dynamic_find, match, arguments)
37
+ end
38
+ return method_missing_original
39
+ end
40
+ end
41
+ end
42
+ end
metadata ADDED
@@ -0,0 +1,84 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: ooor_finders
3
+ version: !ruby/object:Gem::Version
4
+ hash: 9
5
+ prerelease:
6
+ segments:
7
+ - 0
8
+ - 1
9
+ version: "0.1"
10
+ platform: ruby
11
+ authors:
12
+ - Nicolas Bessi - Camptocamp
13
+ autorequire:
14
+ bindir: bin
15
+ cert_chain: []
16
+
17
+ date: 2013-03-06 00:00:00 +01:00
18
+ default_executable:
19
+ dependencies:
20
+ - !ruby/object:Gem::Dependency
21
+ name: ooor
22
+ prerelease: false
23
+ requirement: &id001 !ruby/object:Gem::Requirement
24
+ none: false
25
+ requirements:
26
+ - - ">="
27
+ - !ruby/object:Gem::Version
28
+ hash: 5
29
+ segments:
30
+ - 1
31
+ - 6
32
+ - 5
33
+ version: 1.6.5
34
+ type: :runtime
35
+ version_requirements: *id001
36
+ description: Add Active Record like dynamic finder pattern
37
+ email:
38
+ executables: []
39
+
40
+ extensions: []
41
+
42
+ extra_rdoc_files: []
43
+
44
+ files:
45
+ - README.md
46
+ - lib/ooor_finders.rb
47
+ - lib/open_object_resource.rb
48
+ - lib/dynamic_finder_match.rb
49
+ has_rdoc: true
50
+ homepage:
51
+ licenses: []
52
+
53
+ post_install_message:
54
+ rdoc_options: []
55
+
56
+ require_paths:
57
+ - lib
58
+ required_ruby_version: !ruby/object:Gem::Requirement
59
+ none: false
60
+ requirements:
61
+ - - ">="
62
+ - !ruby/object:Gem::Version
63
+ hash: 3
64
+ segments:
65
+ - 0
66
+ version: "0"
67
+ required_rubygems_version: !ruby/object:Gem::Requirement
68
+ none: false
69
+ requirements:
70
+ - - ">="
71
+ - !ruby/object:Gem::Version
72
+ hash: 3
73
+ segments:
74
+ - 0
75
+ version: "0"
76
+ requirements: []
77
+
78
+ rubyforge_project:
79
+ rubygems_version: 1.6.2
80
+ signing_key:
81
+ specification_version: 3
82
+ summary: OOOR - OpenObject On Ruby dynamic finder extention
83
+ test_files: []
84
+