Class: OData::Entity

Inherits:
Object
  • Object
show all
Defined in:
lib/odata/entity.rb

Overview

An OData::Entity represents a single record returned by the service. All Entities have a type and belong to a specific namespace. They are written back to the service via the EntitySet they came from. OData::Entity instances should not be instantiated directly; instead, they should either be read or instantiated from their respective OData::EntitySet.

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(options = {}) ⇒ Entity

Initializes a bare Entity

Parameters:

  • options (Hash) (defaults to: {})


17
18
19
20
21
# File 'lib/odata/entity.rb', line 17

def initialize(options = {})
  @type = options[:type]
  @namespace = options[:namespace]
  @service_name = options[:service_name]
end

Instance Attribute Details

#namespaceObject (readonly)

The OData::Service’s namespace



11
12
13
# File 'lib/odata/entity.rb', line 11

def namespace
  @namespace
end

#service_nameObject (readonly)

The OData::Service’s identifying name



13
14
15
# File 'lib/odata/entity.rb', line 13

def service_name
  @service_name
end

#typeObject (readonly)

The Entity type name



9
10
11
# File 'lib/odata/entity.rb', line 9

def type
  @type
end

Class Method Details

.from_xml(xml_doc, options = {}) ⇒ OData::Entity

Create Entity from XML document with provided options.

Parameters:

  • xml_doc (Nokogiri::XML)
  • options (Hash) (defaults to: {})

Returns:



73
74
75
76
77
78
79
80
# File 'lib/odata/entity.rb', line 73

def self.from_xml(xml_doc, options = {})
  return nil if xml_doc.nil?
  entity = OData::Entity.new(options)
  process_properties(entity, xml_doc)
  process_feed_property(entity, xml_doc, 'title')
  process_feed_property(entity, xml_doc, 'summary')
  entity
end

.with_properties(new_properties = {}, options = {}) ⇒ Object

Create Entity with provided properties and options.

Parameters:

  • new_properties (Hash) (defaults to: {})
  • options (Hash) (defaults to: {})
  • (OData::Entity)


55
56
57
58
59
60
61
62
63
64
65
66
67
# File 'lib/odata/entity.rb', line 55

def self.with_properties(new_properties = {}, options = {})
  entity = OData::Entity.new(options)
  entity.instance_eval do
    service.properties_for_entity(name).each do |name, instance|
      set_property(name, instance)
    end

    new_properties.each do |property_name, property_value|
      self[property_name.to_s] = property_value
    end
  end
  entity
end

Instance Method Details

#[](property_name) ⇒ *

Get property value

Parameters:

  • property_name (to_s)

Returns:

  • (*)


32
33
34
35
36
37
38
39
40
# File 'lib/odata/entity.rb', line 32

def [](property_name)
  if properties[property_name.to_s].is_a?(::OData::ComplexType)
    properties[property_name.to_s]
  else
    properties[property_name.to_s].value
  end
rescue NoMethodError
  raise ArgumentError, "Unknown property: #{property_name}"
end

#[]=(property_name, value) ⇒ Object

Set property value

Parameters:

  • property_name (to_s)
  • value (*)


45
46
47
48
49
# File 'lib/odata/entity.rb', line 45

def []=(property_name, value)
  properties[property_name.to_s].value = value
rescue NoMethodError
  raise ArgumentError, "Unknown property: #{property_name}"
end

#is_new?Boolean

Returns:

  • (Boolean)


115
116
117
# File 'lib/odata/entity.rb', line 115

def is_new?
  self[primary_key].nil?
end

#nameString

Returns name of Entity from Service specified type.

Returns:

  • (String)


25
26
27
# File 'lib/odata/entity.rb', line 25

def name
  @name ||= type.gsub(/#{namespace}\./, '')
end

#primary_keyString

Returns the primary key for the Entity.

Returns:

  • (String)


111
112
113
# File 'lib/odata/entity.rb', line 111

def primary_key
  service.primary_key_for(name)
end

#to_xmlString

Converts Entity to its XML representation.

Returns:

  • (String)


84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
# File 'lib/odata/entity.rb', line 84

def to_xml
  builder = Nokogiri::XML::Builder.new do |xml|
    xml.entry('xmlns'           => 'http://www.w3.org/2005/Atom',
              'xmlns:data'      => 'http://schemas.microsoft.com/ado/2007/08/dataservices',
              'xmlns:metadata'  => 'http://schemas.microsoft.com/ado/2007/08/dataservices/metadata',
              'xmlns:georss'    => 'http://www.georss.org/georss',
              'xmlns:gml'       => 'http://www.opengis.net/gml',
              'xml:base'        => 'http://services.odata.org/OData/OData.svc/') do
      xml.category(term: "#{namespace}.#{type}",
                   scheme: 'http://schemas.microsoft.com/ado/2007/08/dataservices/scheme')
      xml.author { xml.name }

      xml.content(type: 'application/xml') do
        xml['metadata'].properties do
          properties.each do |name, property|
            next if name == primary_key
            property.to_xml(xml)
          end
        end
      end
    end
  end
  builder.to_xml
end