ooor_finders 0.1 → 0.1.2

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/README.md +7 -0
  2. data/lib/open_object_resource.rb +34 -8
  3. metadata +3 -2
data/README.md CHANGED
@@ -9,6 +9,8 @@ find_by_xml_id or alias find_by_oid
9
9
 
10
10
  So we can do
11
11
 
12
+ require "ooor_finders"
13
+
12
14
  ResUsers.find_by_xml_id('module.xml_id').id
13
15
  ResUsers.find_by_id(23).id
14
16
  ResUsers.find_by_name('Administrator').id
@@ -20,6 +22,11 @@ ResUsers.find_last_by_name('Administrator')
20
22
  ResUsers.find_last_by_name_and_login('Administrator', 'admin')
21
23
  ResUsers.find_by_name_and_login('Administrator', 'admin')
22
24
 
25
+ Plus the create mode
26
+
27
+ ResUsers.find_or_create_by_login_and_name_and_oid 'toto', 'toto', 'base.toto'
28
+ ResUsers.find_or_create_by_login_and_name'toto', 'toto'
29
+
23
30
  Other options are supported
24
31
 
25
32
  ResUsers.find_all_by_name('Administrator', :fields=>['id'], :limit=>20)
@@ -1,19 +1,42 @@
1
1
  require 'rubygems'
2
2
  require 'ooor'
3
-
4
3
  module Ooor
5
4
  class OpenObjectResource
6
5
  class << self
7
6
  alias_method :method_missing_original, :method_missing
8
7
 
9
- def _dynamic_find(match, arguments)
8
+ def _instanciate_by_attributes(match, arguments)
9
+ # TODO check relation and send a warning
10
+ res = self.new
11
+ attributes = match.attribute_names
12
+ xml_id = nil
13
+ attributes.length.times do |index|
14
+ if ['xml_id', 'oid'].include? attributes[index]
15
+ xml_id = arguments[index]
16
+ elsif attributes[index] == 'id'
17
+ raise "find_or_create_by_id is not supported"
18
+ else
19
+ eval("res.#{attributes[index]} = arguments[index]")
20
+ end
21
+ end
22
+ res.create
23
+ if xml_id
24
+ res.ir_model_data_id = xml_id
25
+ res.save
26
+ end
27
+ return res
28
+ end
29
+
30
+ def _find_or_instantiator_by_attributes(match, arguments)
31
+ unique_keys = ['xml_id', 'id', 'oid']
10
32
  options = {}
11
33
  if arguments.last.is_a? Hash
12
34
  options = arguments.last
13
35
  end
14
36
  attributes = match.attribute_names
15
- if attributes[0] == 'xml_id' || attributes[0] == 'id' || attributes[0] == 'oid'
16
- return self.find(arguments[0], options)
37
+ unique_index = attributes.index{|x| unique_keys.include? x}
38
+ if unique_index
39
+ res = self.find(arguments[unique_index], options)
17
40
  else
18
41
  domain = []
19
42
  attributes.length.times do | index |
@@ -21,21 +44,24 @@ module Ooor
21
44
  end
22
45
  options.merge!({:domain => domain})
23
46
  res = self.find(match.finder, options)
24
- if match.bang?
47
+ if match.bang? && !match.instantiator?
25
48
  unless res
26
49
  raise "Could not find #{self.class} with for domain #{domain.inspect}"
27
50
  end
28
51
  end
29
- return res
30
52
  end
53
+ if match.instantiator and not res
54
+ return _instanciate_by_attributes(match, arguments)
55
+ end
56
+ return res
31
57
  end
32
58
 
33
59
  def method_missing(method_symbol, *arguments)
34
60
  match = DynamicFinderMatch.match(method_symbol.to_s)
35
61
  if match
36
- return send(:_dynamic_find, match, arguments)
62
+ return send(:_find_or_instantiator_by_attributes, match, arguments)
37
63
  end
38
- return method_missing_original
64
+ return method_missing_original(method_symbol, arguments)
39
65
  end
40
66
  end
41
67
  end
metadata CHANGED
@@ -1,12 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ooor_finders
3
3
  version: !ruby/object:Gem::Version
4
- hash: 9
4
+ hash: 31
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 1
9
- version: "0.1"
9
+ - 2
10
+ version: 0.1.2
10
11
  platform: ruby
11
12
  authors:
12
13
  - Nicolas Bessi - Camptocamp