make resource_class_for_uuid more convenient and robust
[arvados.git] / app / models / orvos_resource_list.rb
1 class OrvosResourceList
2   def initialize(resource_class)
3     @resource_class = resource_class
4   end
5
6   def eager(bool=true)
7     @eager = bool
8     self
9   end
10
11   def limit(max_results)
12     @limit = max_results
13     self
14   end
15
16   def where(cond)
17     cond = cond.dup
18     cond.keys.each do |uuid_key|
19       if cond[uuid_key] and (cond[uuid_key].is_a? Array or
20                              cond[uuid_key].is_a? OrvosBase)
21         # Coerce cond[uuid_key] to an array of uuid strings.  This
22         # allows caller the convenience of passing an array of real
23         # objects and uuids in cond[uuid_key].
24         if !cond[uuid_key].is_a? Array
25           cond[uuid_key] = [cond[uuid_key]]
26         end
27         cond[uuid_key] = cond[uuid_key].collect do |item|
28           if item.is_a? OrvosBase
29             item.uuid
30           else
31             item
32           end
33         end
34       end
35     end
36     cond.keys.select { |x| x.match /_kind$/ }.each do |kind_key|
37       if cond[kind_key].is_a? Class
38         cond = cond.merge({ kind_key => 'orvos#' + $orvos_api_client.class_kind(cond[kind_key]) })
39       end
40     end
41     api_params = {
42       _method: 'GET',
43       where: cond
44     }
45     api_params[:eager] = '1' if @eager
46     api_params[:limit] = @limit if @limit
47     res = $orvos_api_client.api @resource_class, '', api_params
48     @results = $orvos_api_client.unpack_api_response res
49   end
50
51   def results
52     where({})
53   end
54
55   def all
56     where({})
57   end
58
59   def to_ary
60     results
61   end
62
63   def to_hash
64     Hash[results.collect { |x| [x.uuid, x] }]
65   end
66 end