1 class OrvosBase < ActiveRecord::Base
2 self.abstract_class = true
4 @@orvos_v1_base = Rails.configuration.orvos_v1_base
6 return @columns unless @columns.nil?
8 return @columns if orvos_schema[self.to_s.to_sym].nil?
9 orvos_schema[self.to_s.to_sym].each do |coldef|
10 k = coldef[:name].to_sym
11 if coldef[:type] == coldef[:type].downcase
12 @columns << column(k, coldef[:type].to_sym)
14 @columns << column(k, :text)
15 serialize k, coldef[:type].constantize
23 def self.column(name, sql_type = nil, default = nil, null = true)
24 ActiveRecord::ConnectionAdapters::Column.new(name.to_s, default, sql_type.to_s, null)
27 unpack_api_response(api(''))
34 0 == cond.select do |k,v|
41 self.class.columns.each do |col|
42 obdata[col.name.to_sym] = self.send(col.name.to_sym)
46 postdata = { self.class.to_s.underscore => obdata }
48 postdata['_method'] = 'PUT'
49 resp = self.class.api('/' + uuid, postdata)
51 resp = self.class.api('', postdata)
53 return false if !resp[:etag] || !resp[:uuid]
56 self.uuid ||= resp[:uuid]
60 self.save or raise Exception.new("Save failed")
63 @etag = h.delete :etag
64 @kind = h.delete :kind
69 o.merge!(args.pop) if args[-1].is_a? Hash
70 o[:metadata_class] ||= args.shift
71 o[:name] ||= args.shift
72 o[:head_kind] ||= args.shift
73 o[:tail_kind] = self.kind
76 return all_metadata.select do |m|
81 if (v.respond_to?(:uuid) ? v.uuid : v.to_s) != (test_v.respond_to?(:uuid) ? test_v.uuid : test_v.to_s)
89 @metadata = self.class.api '', { _method: 'GET', where: o, eager: true }, { resource_path: 'metadata' }
90 @metadata = self.class.unpack_api_response(@metadata)
93 return @all_metadata if @all_metadata
94 res = self.class.api '', {
102 resource_path: 'metadata'
104 @all_metadata = self.class.unpack_api_response(res)
107 raise "No such object" if !uuid
108 api('/' + uuid).each do |k,v|
109 self.instance_variable_set('@' + k.to_s, v)
115 def self.api(action, data=nil, o={})
120 if v.is_a? String or v.nil?
121 dataargs << "#{k}=#{v}"
122 elsif v == true or v == false
123 dataargs << "#{k}=#{v ? 1 : 0}"
125 dataargs << "#{k}=#{JSON.generate v}"
134 "#{@@orvos_v1_base}/#{o[:resource_path] || self.to_s.underscore.pluralize}#{action}"],
138 resp = JSON.parse json, :symbolize_names => true
140 raise "API errors:\n#{resp[:errors].join "\n"}\n"
145 def self.orvos_schema
146 $orvos_schema ||= api '', nil, {resource_path: 'schema'}
149 def self.kind_class(kind)
150 kind.match(/^orvos\#(.+?)(_list|List)?$/)[1].pluralize.classify.constantize rescue nil
153 def self.unpack_api_response(j, kind=nil)
154 if j.is_a? Hash and j[:items].is_a? Array and j[:kind].match(/(_list|List)$/)
155 j[:items].collect { |x| unpack_api_response x, j[:kind] }
156 elsif j.is_a? Hash and (kind || j[:kind])
157 oclass = self.kind_class(kind || j[:kind])
160 childkind = j["#{k.to_s}_kind".to_sym]
162 j[k] = self.unpack_api_response(j[k], childkind)