odata4 0.8.1 → 0.8.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.
- checksums.yaml +4 -4
- data/.ruby-version +1 -1
- data/CHANGELOG.md +4 -0
- data/lib/odata4.rb +0 -2
- data/lib/odata4/entity.rb +1 -1
- data/lib/odata4/properties.rb +8 -2
- data/lib/odata4/{complex_type/property.rb → properties/complex.rb} +3 -3
- data/lib/odata4/{enum_type/property.rb → properties/enum.rb} +3 -3
- data/lib/odata4/schema.rb +7 -4
- data/lib/odata4/schema/complex_type.rb +79 -0
- data/lib/odata4/schema/enum_type.rb +95 -0
- data/lib/odata4/service.rb +2 -2
- data/lib/odata4/version.rb +1 -1
- data/spec/fixtures/vcr_cassettes/{complex_type_specs.yml → schema/complex_type_specs.yml} +0 -0
- data/spec/odata4/entity/shared_examples.rb +1 -1
- data/spec/odata4/{complex_type_spec.rb → schema/complex_type_spec.rb} +2 -2
- data/spec/odata4/{enum_type_spec.rb → schema/enum_type_spec.rb} +2 -2
- metadata +12 -12
- data/lib/odata4/complex_type.rb +0 -79
- data/lib/odata4/enum_type.rb +0 -95
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a9465568c8c8b575d04c9367e8c51b3c6161a8b9
|
4
|
+
data.tar.gz: 1da130b782964c9ccf410e74a6309c78bd13e050
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c2949929b4b43e3fde0b26d845f630d59dfc7d5936717dca0531c11bba7514487c72e889a372863f8be2c2934ff85dee1cd8df9dc67193d145ca0245f42133cf
|
7
|
+
data.tar.gz: a1de80f33ab0719567cabbc948dc645a31363697ee705ba0654cabb31fbaffeb130cb751ed061b55dccf169f977e62689b96d3b6180a4052d1fdd31a10b7b5ca
|
data/.ruby-version
CHANGED
@@ -1 +1 @@
|
|
1
|
-
2.
|
1
|
+
2.2
|
data/CHANGELOG.md
CHANGED
data/lib/odata4.rb
CHANGED
@@ -16,8 +16,6 @@ require 'odata4/property_registry'
|
|
16
16
|
require 'odata4/property'
|
17
17
|
require 'odata4/properties'
|
18
18
|
require 'odata4/navigation_property'
|
19
|
-
require 'odata4/complex_type'
|
20
|
-
require 'odata4/enum_type'
|
21
19
|
require 'odata4/entity'
|
22
20
|
require 'odata4/entity_container'
|
23
21
|
require 'odata4/entity_set'
|
data/lib/odata4/entity.rb
CHANGED
@@ -56,7 +56,7 @@ module OData4
|
|
56
56
|
# @param property_name [to_s]
|
57
57
|
# @return [*]
|
58
58
|
def [](property_name)
|
59
|
-
if get_property(property_name).is_a?(::OData4::
|
59
|
+
if get_property(property_name).is_a?(::OData4::Properties::Complex)
|
60
60
|
get_property(property_name)
|
61
61
|
else
|
62
62
|
get_property(property_name).value
|
data/lib/odata4/properties.rb
CHANGED
@@ -5,10 +5,12 @@ require 'odata4/properties/number'
|
|
5
5
|
require 'odata4/properties/binary'
|
6
6
|
require 'odata4/properties/boolean'
|
7
7
|
require 'odata4/properties/collection'
|
8
|
+
require 'odata4/properties/complex'
|
8
9
|
require 'odata4/properties/date'
|
9
10
|
require 'odata4/properties/date_time'
|
10
11
|
require 'odata4/properties/date_time_offset'
|
11
12
|
require 'odata4/properties/decimal'
|
13
|
+
require 'odata4/properties/enum'
|
12
14
|
require 'odata4/properties/float'
|
13
15
|
require 'odata4/properties/geography'
|
14
16
|
require 'odata4/properties/guid'
|
@@ -20,7 +22,11 @@ require 'odata4/properties/time_of_day'
|
|
20
22
|
OData4::Properties.constants.each do |property_name|
|
21
23
|
klass = OData4::Properties.const_get(property_name)
|
22
24
|
if klass.is_a?(Class)
|
23
|
-
|
24
|
-
|
25
|
+
begin
|
26
|
+
property = klass.new('test', nil)
|
27
|
+
OData4::PropertyRegistry.add(property.type, property.class)
|
28
|
+
rescue NotImplementedError
|
29
|
+
# Abstract type classes cannot be instantiated, ignore
|
30
|
+
end
|
25
31
|
end
|
26
32
|
end
|
@@ -1,8 +1,8 @@
|
|
1
1
|
module OData4
|
2
|
-
|
2
|
+
module Properties
|
3
3
|
# Abstract base class for OData4 ComplexTypes
|
4
|
-
# @see [OData4::ComplexType]
|
5
|
-
class
|
4
|
+
# @see [OData4::Schema::ComplexType]
|
5
|
+
class Complex < OData4::Property
|
6
6
|
def initialize(name, value, options = {})
|
7
7
|
super(name, value, options)
|
8
8
|
init_properties
|
@@ -1,8 +1,8 @@
|
|
1
1
|
module OData4
|
2
|
-
|
2
|
+
module Properties
|
3
3
|
# Abstract base class for OData4 EnumTypes
|
4
|
-
# @see [OData4::EnumType]
|
5
|
-
class
|
4
|
+
# @see [OData4::Schema::EnumType]
|
5
|
+
class Enum < OData4::Property
|
6
6
|
# Returns the property value, properly typecast
|
7
7
|
# @return [String, nil]
|
8
8
|
def value
|
data/lib/odata4/schema.rb
CHANGED
@@ -1,3 +1,6 @@
|
|
1
|
+
require 'odata4/schema/complex_type'
|
2
|
+
require 'odata4/schema/enum_type'
|
3
|
+
|
1
4
|
module OData4
|
2
5
|
class Schema
|
3
6
|
# The schema's parent service
|
@@ -37,23 +40,23 @@ module OData4
|
|
37
40
|
end
|
38
41
|
|
39
42
|
# Returns a list of `ComplexType`s defined by the schema.
|
40
|
-
# @return [Hash<String, OData4::ComplexType>]
|
43
|
+
# @return [Hash<String, OData4::Schema::ComplexType>]
|
41
44
|
def complex_types
|
42
45
|
@complex_types ||= metadata.xpath('//ComplexType').map do |entity|
|
43
46
|
[
|
44
47
|
entity.attributes['Name'].value,
|
45
|
-
|
48
|
+
ComplexType.new(entity, self)
|
46
49
|
]
|
47
50
|
end.to_h
|
48
51
|
end
|
49
52
|
|
50
53
|
# Returns a list of EnumTypes defined by the schema.
|
51
|
-
# @return [Hash<String, OData4::EnumType>]
|
54
|
+
# @return [Hash<String, OData4::Schema::EnumType>]
|
52
55
|
def enum_types
|
53
56
|
@enum_types ||= metadata.xpath('//EnumType').map do |entity|
|
54
57
|
[
|
55
58
|
entity.attributes['Name'].value,
|
56
|
-
|
59
|
+
EnumType.new(entity, self)
|
57
60
|
]
|
58
61
|
end.to_h
|
59
62
|
end
|
@@ -0,0 +1,79 @@
|
|
1
|
+
module OData4
|
2
|
+
class Schema
|
3
|
+
# ComplexTypes are used in OData4 to either encapsulate richer data types for
|
4
|
+
# use as Entity properties. ComplexTypes are composed of properties the same
|
5
|
+
# way that Entities are and, so, the interface for working with the various
|
6
|
+
# properties of a ComplexType mimics that of Entities.
|
7
|
+
class ComplexType
|
8
|
+
# Creates a new ComplexType based on the supplied options.
|
9
|
+
# @param type_xml [Nokogiri::XML::Element]
|
10
|
+
# @param service [OData4::Service]
|
11
|
+
def initialize(type_definition, schema)
|
12
|
+
@type_definition = type_definition
|
13
|
+
@schema = schema
|
14
|
+
end
|
15
|
+
|
16
|
+
# The name of the ComplexType
|
17
|
+
# @return [String]
|
18
|
+
def name
|
19
|
+
@name ||= type_definition.attributes['Name'].value
|
20
|
+
end
|
21
|
+
|
22
|
+
# Returns the namespaced type for the ComplexType.
|
23
|
+
# @return [String]
|
24
|
+
def type
|
25
|
+
"#{namespace}.#{name}"
|
26
|
+
end
|
27
|
+
|
28
|
+
# Returns the namespace this ComplexType belongs to.
|
29
|
+
# @return [String]
|
30
|
+
def namespace
|
31
|
+
@namespace ||= service.namespace
|
32
|
+
end
|
33
|
+
|
34
|
+
# Returns this ComplexType's properties.
|
35
|
+
# @return [Hash<String, OData4::Property>]
|
36
|
+
def properties
|
37
|
+
@properties ||= collect_properties
|
38
|
+
end
|
39
|
+
|
40
|
+
# Returns a list of this ComplexType's property names.
|
41
|
+
# @return [Array<String>]
|
42
|
+
def property_names
|
43
|
+
@property_names ||= properties.keys
|
44
|
+
end
|
45
|
+
|
46
|
+
# Returns the property class that implements this `ComplexType`.
|
47
|
+
# @return [Class < OData4::Properties::Complex]
|
48
|
+
def property_class
|
49
|
+
@property_class ||= lambda { |type, complex_type|
|
50
|
+
klass = Class.new ::OData4::Properties::Complex
|
51
|
+
klass.send(:define_method, :type) { type }
|
52
|
+
klass.send(:define_method, :complex_type) { complex_type }
|
53
|
+
klass
|
54
|
+
}.call(type, self)
|
55
|
+
end
|
56
|
+
|
57
|
+
private
|
58
|
+
|
59
|
+
def schema
|
60
|
+
@schema
|
61
|
+
end
|
62
|
+
|
63
|
+
def service
|
64
|
+
@schema.service
|
65
|
+
end
|
66
|
+
|
67
|
+
def type_definition
|
68
|
+
@type_definition
|
69
|
+
end
|
70
|
+
|
71
|
+
def collect_properties
|
72
|
+
Hash[type_definition.xpath('./Property').map do |property_xml|
|
73
|
+
property_name, property = schema.send(:process_property_from_xml, property_xml)
|
74
|
+
[property_name, property]
|
75
|
+
end]
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
@@ -0,0 +1,95 @@
|
|
1
|
+
module OData4
|
2
|
+
class Schema
|
3
|
+
# Enumeration types are nominal types that represent a series of related values.
|
4
|
+
# Enumeration types expose these related values as members of the enumeration.
|
5
|
+
class EnumType
|
6
|
+
# Creates a new EnumType based on the supplied options.
|
7
|
+
# @param type_xml [Nokogiri::XML::Element]
|
8
|
+
# @param service [OData4::Service]
|
9
|
+
# @return [self]
|
10
|
+
def initialize(type_definition, schema)
|
11
|
+
@type_definition = type_definition
|
12
|
+
@schema = schema
|
13
|
+
end
|
14
|
+
|
15
|
+
# The name of the EnumType
|
16
|
+
# @return [String]
|
17
|
+
def name
|
18
|
+
options['Name']
|
19
|
+
end
|
20
|
+
|
21
|
+
# Returns the namespaced type for the EnumType.
|
22
|
+
# @return [String]
|
23
|
+
def type
|
24
|
+
"#{namespace}.#{name}"
|
25
|
+
end
|
26
|
+
|
27
|
+
# Whether this EnumType supports setting multiple values.
|
28
|
+
# @return [Boolean]
|
29
|
+
def is_flags?
|
30
|
+
options['IsFlags'] == 'true'
|
31
|
+
end
|
32
|
+
|
33
|
+
# The underlying type of this EnumType.
|
34
|
+
# @return [String]
|
35
|
+
def underlying_type
|
36
|
+
options['UnderlyingType'] || 'Edm.Int32'
|
37
|
+
end
|
38
|
+
|
39
|
+
# Returns the namespace this EnumType belongs to.
|
40
|
+
# @return [String]
|
41
|
+
def namespace
|
42
|
+
@namespace ||= service.namespace
|
43
|
+
end
|
44
|
+
|
45
|
+
# Returns the members of this EnumType and their values.
|
46
|
+
# @return [Hash]
|
47
|
+
def members
|
48
|
+
@members ||= collect_members
|
49
|
+
end
|
50
|
+
|
51
|
+
# Returns the property class that implements this `EnumType`.
|
52
|
+
# @return [Class < OData4::Properties::Enum]
|
53
|
+
def property_class
|
54
|
+
@property_class ||= lambda { |type, members, is_flags|
|
55
|
+
klass = Class.new ::OData4::Properties::Enum
|
56
|
+
klass.send(:define_method, :type) { type }
|
57
|
+
klass.send(:define_method, :members) { members }
|
58
|
+
klass.send(:define_method, :is_flags?) { is_flags }
|
59
|
+
klass
|
60
|
+
}.call(type, members, is_flags?)
|
61
|
+
end
|
62
|
+
|
63
|
+
# Returns the value of the requested member.
|
64
|
+
# @param member_name [to_s]
|
65
|
+
# @return [*]
|
66
|
+
def [](member_name)
|
67
|
+
members.invert[member_name.to_s]
|
68
|
+
end
|
69
|
+
|
70
|
+
private
|
71
|
+
|
72
|
+
def service
|
73
|
+
@schema.service
|
74
|
+
end
|
75
|
+
|
76
|
+
def type_definition
|
77
|
+
@type_definition
|
78
|
+
end
|
79
|
+
|
80
|
+
def options
|
81
|
+
@options = type_definition.attributes.map do |name, attr|
|
82
|
+
[name, attr.value]
|
83
|
+
end.to_h
|
84
|
+
end
|
85
|
+
|
86
|
+
def collect_members
|
87
|
+
Hash[type_definition.xpath('./Member').map.with_index do |member_xml, index|
|
88
|
+
member_name = member_xml.attributes['Name'].value
|
89
|
+
member_value = member_xml.attributes['Value'].andand.value.andand.to_i
|
90
|
+
[member_value || index, member_name]
|
91
|
+
end]
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
data/lib/odata4/service.rb
CHANGED
@@ -111,7 +111,7 @@ module OData4
|
|
111
111
|
end
|
112
112
|
|
113
113
|
# Returns a list of `ComplexType`s used by the service.
|
114
|
-
# @return [Hash<String, OData4::ComplexType>]
|
114
|
+
# @return [Hash<String, OData4::Schema::ComplexType>]
|
115
115
|
def complex_types
|
116
116
|
@complex_types ||= schemas.map do |namespace, schema|
|
117
117
|
schema.complex_types.map do |name, complex_type|
|
@@ -121,7 +121,7 @@ module OData4
|
|
121
121
|
end
|
122
122
|
|
123
123
|
# Returns a list of `EnumType`s used by the service
|
124
|
-
# @return [Hash<String, OData4::EnumType>]
|
124
|
+
# @return [Hash<String, OData4::Schema::EnumType>]
|
125
125
|
def enum_types
|
126
126
|
@enum_types ||= schemas.map do |namespace, schema|
|
127
127
|
schema.enum_types.map do |name, enum_type|
|
data/lib/odata4/version.rb
CHANGED
File without changes
|
@@ -65,7 +65,7 @@ shared_examples 'a valid supplier' do
|
|
65
65
|
# Check property types
|
66
66
|
it { expect(subject.get_property('ID')).to be_a(OData4::Properties::Integer) }
|
67
67
|
it { expect(subject.get_property('Name')).to be_a(OData4::Properties::String) }
|
68
|
-
it { expect(subject.get_property('Address')).to be_a(OData4::
|
68
|
+
it { expect(subject.get_property('Address')).to be_a(OData4::Properties::Complex) }
|
69
69
|
it { expect(subject.get_property('Location')).to be_a(OData4::Properties::Geography::Point) }
|
70
70
|
# it { expect(subject.get_property('Products')).to be_a(OData4::NavigationProperty::Proxy)}
|
71
71
|
|
@@ -1,6 +1,6 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
-
describe OData4::ComplexType, vcr: {cassette_name: 'complex_type_specs'} do
|
3
|
+
describe OData4::Schema::ComplexType, vcr: {cassette_name: 'schema/complex_type_specs'} do
|
4
4
|
before(:example) do
|
5
5
|
OData4::Service.open('http://services.odata.org/V4/OData/OData.svc', name: 'ODataDemo')
|
6
6
|
end
|
@@ -27,7 +27,7 @@ describe OData4::ComplexType, vcr: {cassette_name: 'complex_type_specs'} do
|
|
27
27
|
|
28
28
|
# Check property instance inheritance hierarchy
|
29
29
|
it { expect(subject).to be_a(OData4::Property) }
|
30
|
-
it { expect(subject).to be_a(OData4::
|
30
|
+
it { expect(subject).to be_a(OData4::Properties::Complex) }
|
31
31
|
|
32
32
|
it { expect(subject).to respond_to(:name) }
|
33
33
|
it { expect(subject).to respond_to(:type) }
|
@@ -1,6 +1,6 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
-
describe OData4::EnumType, vcr: {cassette_name: 'enum_type_specs'} do
|
3
|
+
describe OData4::Schema::EnumType, vcr: {cassette_name: 'schema/enum_type_specs'} do
|
4
4
|
before(:example) do
|
5
5
|
OData4::Service.open('http://services.odata.org/V4/OData/OData.svc', name: 'ODataDemo', metadata_file: metadata_file)
|
6
6
|
end
|
@@ -22,7 +22,7 @@ describe OData4::EnumType, vcr: {cassette_name: 'enum_type_specs'} do
|
|
22
22
|
|
23
23
|
# Check property instance inheritance hierarchy
|
24
24
|
it { expect(subject).to be_a(OData4::Property) }
|
25
|
-
it { expect(subject).to be_a(OData4::
|
25
|
+
it { expect(subject).to be_a(OData4::Properties::Enum) }
|
26
26
|
|
27
27
|
it { expect(subject).to respond_to(:name) }
|
28
28
|
it { expect(subject).to respond_to(:type) }
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: odata4
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.8.
|
4
|
+
version: 0.8.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Christoph Wagner
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2018-
|
12
|
+
date: 2018-04-26 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: bundler
|
@@ -200,23 +200,21 @@ files:
|
|
200
200
|
- Rakefile
|
201
201
|
- TODO.md
|
202
202
|
- lib/odata4.rb
|
203
|
-
- lib/odata4/complex_type.rb
|
204
|
-
- lib/odata4/complex_type/property.rb
|
205
203
|
- lib/odata4/entity.rb
|
206
204
|
- lib/odata4/entity_container.rb
|
207
205
|
- lib/odata4/entity_set.rb
|
208
|
-
- lib/odata4/enum_type.rb
|
209
|
-
- lib/odata4/enum_type/property.rb
|
210
206
|
- lib/odata4/navigation_property.rb
|
211
207
|
- lib/odata4/navigation_property/proxy.rb
|
212
208
|
- lib/odata4/properties.rb
|
213
209
|
- lib/odata4/properties/binary.rb
|
214
210
|
- lib/odata4/properties/boolean.rb
|
215
211
|
- lib/odata4/properties/collection.rb
|
212
|
+
- lib/odata4/properties/complex.rb
|
216
213
|
- lib/odata4/properties/date.rb
|
217
214
|
- lib/odata4/properties/date_time.rb
|
218
215
|
- lib/odata4/properties/date_time_offset.rb
|
219
216
|
- lib/odata4/properties/decimal.rb
|
217
|
+
- lib/odata4/properties/enum.rb
|
220
218
|
- lib/odata4/properties/float.rb
|
221
219
|
- lib/odata4/properties/geography.rb
|
222
220
|
- lib/odata4/properties/geography/base.rb
|
@@ -241,6 +239,8 @@ files:
|
|
241
239
|
- lib/odata4/query/in_batches.rb
|
242
240
|
- lib/odata4/railtie.rb
|
243
241
|
- lib/odata4/schema.rb
|
242
|
+
- lib/odata4/schema/complex_type.rb
|
243
|
+
- lib/odata4/schema/enum_type.rb
|
244
244
|
- lib/odata4/service.rb
|
245
245
|
- lib/odata4/service/request.rb
|
246
246
|
- lib/odata4/service/response.rb
|
@@ -260,7 +260,6 @@ files:
|
|
260
260
|
- spec/fixtures/files/products.xml
|
261
261
|
- spec/fixtures/files/supplier_0.json
|
262
262
|
- spec/fixtures/files/supplier_0.xml
|
263
|
-
- spec/fixtures/vcr_cassettes/complex_type_specs.yml
|
264
263
|
- spec/fixtures/vcr_cassettes/entity_set_specs.yml
|
265
264
|
- spec/fixtures/vcr_cassettes/entity_set_specs/bad_entry.yml
|
266
265
|
- spec/fixtures/vcr_cassettes/entity_set_specs/existing_entry.yml
|
@@ -269,16 +268,15 @@ files:
|
|
269
268
|
- spec/fixtures/vcr_cassettes/navigation_property_proxy_specs.yml
|
270
269
|
- spec/fixtures/vcr_cassettes/query/result_specs.yml
|
271
270
|
- spec/fixtures/vcr_cassettes/query_specs.yml
|
271
|
+
- spec/fixtures/vcr_cassettes/schema/complex_type_specs.yml
|
272
272
|
- spec/fixtures/vcr_cassettes/service/request_specs.yml
|
273
273
|
- spec/fixtures/vcr_cassettes/service_registry_specs.yml
|
274
274
|
- spec/fixtures/vcr_cassettes/service_specs.yml
|
275
275
|
- spec/fixtures/vcr_cassettes/usage_example_specs.yml
|
276
|
-
- spec/odata4/complex_type_spec.rb
|
277
276
|
- spec/odata4/entity/shared_examples.rb
|
278
277
|
- spec/odata4/entity_container_spec.rb
|
279
278
|
- spec/odata4/entity_set_spec.rb
|
280
279
|
- spec/odata4/entity_spec.rb
|
281
|
-
- spec/odata4/enum_type_spec.rb
|
282
280
|
- spec/odata4/navigation_property/proxy_spec.rb
|
283
281
|
- spec/odata4/navigation_property_spec.rb
|
284
282
|
- spec/odata4/properties/binary_spec.rb
|
@@ -302,6 +300,8 @@ files:
|
|
302
300
|
- spec/odata4/property_spec.rb
|
303
301
|
- spec/odata4/query/criteria_spec.rb
|
304
302
|
- spec/odata4/query_spec.rb
|
303
|
+
- spec/odata4/schema/complex_type_spec.rb
|
304
|
+
- spec/odata4/schema/enum_type_spec.rb
|
305
305
|
- spec/odata4/schema_spec.rb
|
306
306
|
- spec/odata4/service/request_spec.rb
|
307
307
|
- spec/odata4/service/response_spec.rb
|
@@ -345,7 +345,6 @@ test_files:
|
|
345
345
|
- spec/fixtures/files/products.xml
|
346
346
|
- spec/fixtures/files/supplier_0.json
|
347
347
|
- spec/fixtures/files/supplier_0.xml
|
348
|
-
- spec/fixtures/vcr_cassettes/complex_type_specs.yml
|
349
348
|
- spec/fixtures/vcr_cassettes/entity_set_specs.yml
|
350
349
|
- spec/fixtures/vcr_cassettes/entity_set_specs/bad_entry.yml
|
351
350
|
- spec/fixtures/vcr_cassettes/entity_set_specs/existing_entry.yml
|
@@ -354,16 +353,15 @@ test_files:
|
|
354
353
|
- spec/fixtures/vcr_cassettes/navigation_property_proxy_specs.yml
|
355
354
|
- spec/fixtures/vcr_cassettes/query/result_specs.yml
|
356
355
|
- spec/fixtures/vcr_cassettes/query_specs.yml
|
356
|
+
- spec/fixtures/vcr_cassettes/schema/complex_type_specs.yml
|
357
357
|
- spec/fixtures/vcr_cassettes/service/request_specs.yml
|
358
358
|
- spec/fixtures/vcr_cassettes/service_registry_specs.yml
|
359
359
|
- spec/fixtures/vcr_cassettes/service_specs.yml
|
360
360
|
- spec/fixtures/vcr_cassettes/usage_example_specs.yml
|
361
|
-
- spec/odata4/complex_type_spec.rb
|
362
361
|
- spec/odata4/entity/shared_examples.rb
|
363
362
|
- spec/odata4/entity_container_spec.rb
|
364
363
|
- spec/odata4/entity_set_spec.rb
|
365
364
|
- spec/odata4/entity_spec.rb
|
366
|
-
- spec/odata4/enum_type_spec.rb
|
367
365
|
- spec/odata4/navigation_property/proxy_spec.rb
|
368
366
|
- spec/odata4/navigation_property_spec.rb
|
369
367
|
- spec/odata4/properties/binary_spec.rb
|
@@ -387,6 +385,8 @@ test_files:
|
|
387
385
|
- spec/odata4/property_spec.rb
|
388
386
|
- spec/odata4/query/criteria_spec.rb
|
389
387
|
- spec/odata4/query_spec.rb
|
388
|
+
- spec/odata4/schema/complex_type_spec.rb
|
389
|
+
- spec/odata4/schema/enum_type_spec.rb
|
390
390
|
- spec/odata4/schema_spec.rb
|
391
391
|
- spec/odata4/service/request_spec.rb
|
392
392
|
- spec/odata4/service/response_spec.rb
|
data/lib/odata4/complex_type.rb
DELETED
@@ -1,79 +0,0 @@
|
|
1
|
-
require 'odata4/complex_type/property'
|
2
|
-
|
3
|
-
module OData4
|
4
|
-
# ComplexTypes are used in OData4 to either encapsulate richer data types for
|
5
|
-
# use as Entity properties. ComplexTypes are composed of properties the same
|
6
|
-
# way that Entities are and, so, the interface for working with the various
|
7
|
-
# properties of a ComplexType mimics that of Entities.
|
8
|
-
class ComplexType
|
9
|
-
# Creates a new ComplexType based on the supplied options.
|
10
|
-
# @param type_xml [Nokogiri::XML::Element]
|
11
|
-
# @param service [OData4::Service]
|
12
|
-
def initialize(type_definition, schema)
|
13
|
-
@type_definition = type_definition
|
14
|
-
@schema = schema
|
15
|
-
end
|
16
|
-
|
17
|
-
# The name of the ComplexType
|
18
|
-
# @return [String]
|
19
|
-
def name
|
20
|
-
@name ||= type_definition.attributes['Name'].value
|
21
|
-
end
|
22
|
-
|
23
|
-
# Returns the namespaced type for the ComplexType.
|
24
|
-
# @return [String]
|
25
|
-
def type
|
26
|
-
"#{namespace}.#{name}"
|
27
|
-
end
|
28
|
-
|
29
|
-
# Returns the namespace this ComplexType belongs to.
|
30
|
-
# @return [String]
|
31
|
-
def namespace
|
32
|
-
@namespace ||= service.namespace
|
33
|
-
end
|
34
|
-
|
35
|
-
# Returns this ComplexType's properties.
|
36
|
-
# @return [Hash<String, OData4::Property>]
|
37
|
-
def properties
|
38
|
-
@properties ||= collect_properties
|
39
|
-
end
|
40
|
-
|
41
|
-
# Returns a list of this ComplexType's property names.
|
42
|
-
# @return [Array<String>]
|
43
|
-
def property_names
|
44
|
-
@property_names ||= properties.keys
|
45
|
-
end
|
46
|
-
|
47
|
-
# Returns the property class that implements this `ComplexType`.
|
48
|
-
# @return [Class < OData4::ComplexType::Property]
|
49
|
-
def property_class
|
50
|
-
@property_class ||= lambda { |type, complex_type|
|
51
|
-
klass = Class.new ::OData4::ComplexType::Property
|
52
|
-
klass.send(:define_method, :type) { type }
|
53
|
-
klass.send(:define_method, :complex_type) { complex_type }
|
54
|
-
klass
|
55
|
-
}.call(type, self)
|
56
|
-
end
|
57
|
-
|
58
|
-
private
|
59
|
-
|
60
|
-
def schema
|
61
|
-
@schema
|
62
|
-
end
|
63
|
-
|
64
|
-
def service
|
65
|
-
@schema.service
|
66
|
-
end
|
67
|
-
|
68
|
-
def type_definition
|
69
|
-
@type_definition
|
70
|
-
end
|
71
|
-
|
72
|
-
def collect_properties
|
73
|
-
Hash[type_definition.xpath('./Property').map do |property_xml|
|
74
|
-
property_name, property = schema.send(:process_property_from_xml, property_xml)
|
75
|
-
[property_name, property]
|
76
|
-
end]
|
77
|
-
end
|
78
|
-
end
|
79
|
-
end
|
data/lib/odata4/enum_type.rb
DELETED
@@ -1,95 +0,0 @@
|
|
1
|
-
require 'odata4/enum_type/property'
|
2
|
-
|
3
|
-
module OData4
|
4
|
-
# Enumeration types are nominal types that represent a series of related values.
|
5
|
-
# Enumeration types expose these related values as members of the enumeration.
|
6
|
-
class EnumType
|
7
|
-
# Creates a new EnumType based on the supplied options.
|
8
|
-
# @param type_xml [Nokogiri::XML::Element]
|
9
|
-
# @param service [OData4::Service]
|
10
|
-
# @return [self]
|
11
|
-
def initialize(type_definition, schema)
|
12
|
-
@type_definition = type_definition
|
13
|
-
@schema = schema
|
14
|
-
end
|
15
|
-
|
16
|
-
# The name of the EnumType
|
17
|
-
# @return [String]
|
18
|
-
def name
|
19
|
-
options['Name']
|
20
|
-
end
|
21
|
-
|
22
|
-
# Returns the namespaced type for the EnumType.
|
23
|
-
# @return [String]
|
24
|
-
def type
|
25
|
-
"#{namespace}.#{name}"
|
26
|
-
end
|
27
|
-
|
28
|
-
# Whether this EnumType supports setting multiple values.
|
29
|
-
# @return [Boolean]
|
30
|
-
def is_flags?
|
31
|
-
options['IsFlags'] == 'true'
|
32
|
-
end
|
33
|
-
|
34
|
-
# The underlying type of this EnumType.
|
35
|
-
# @return [String]
|
36
|
-
def underlying_type
|
37
|
-
options['UnderlyingType'] || 'Edm.Int32'
|
38
|
-
end
|
39
|
-
|
40
|
-
# Returns the namespace this EnumType belongs to.
|
41
|
-
# @return [String]
|
42
|
-
def namespace
|
43
|
-
@namespace ||= service.namespace
|
44
|
-
end
|
45
|
-
|
46
|
-
# Returns the members of this EnumType and their values.
|
47
|
-
# @return [Hash]
|
48
|
-
def members
|
49
|
-
@members ||= collect_members
|
50
|
-
end
|
51
|
-
|
52
|
-
# Returns the property class that implements this `EnumType`.
|
53
|
-
# @return [Class < OData4::EnumType::Property]
|
54
|
-
def property_class
|
55
|
-
@property_class ||= lambda { |type, members, is_flags|
|
56
|
-
klass = Class.new ::OData4::EnumType::Property
|
57
|
-
klass.send(:define_method, :type) { type }
|
58
|
-
klass.send(:define_method, :members) { members }
|
59
|
-
klass.send(:define_method, :is_flags?) { is_flags }
|
60
|
-
klass
|
61
|
-
}.call(type, members, is_flags?)
|
62
|
-
end
|
63
|
-
|
64
|
-
# Returns the value of the requested member.
|
65
|
-
# @param member_name [to_s]
|
66
|
-
# @return [*]
|
67
|
-
def [](member_name)
|
68
|
-
members.invert[member_name.to_s]
|
69
|
-
end
|
70
|
-
|
71
|
-
private
|
72
|
-
|
73
|
-
def service
|
74
|
-
@schema.service
|
75
|
-
end
|
76
|
-
|
77
|
-
def type_definition
|
78
|
-
@type_definition
|
79
|
-
end
|
80
|
-
|
81
|
-
def options
|
82
|
-
@options = type_definition.attributes.map do |name, attr|
|
83
|
-
[name, attr.value]
|
84
|
-
end.to_h
|
85
|
-
end
|
86
|
-
|
87
|
-
def collect_members
|
88
|
-
Hash[type_definition.xpath('./Member').map.with_index do |member_xml, index|
|
89
|
-
member_name = member_xml.attributes['Name'].value
|
90
|
-
member_value = member_xml.attributes['Value'].andand.value.andand.to_i
|
91
|
-
[member_value || index, member_name]
|
92
|
-
end]
|
93
|
-
end
|
94
|
-
end
|
95
|
-
end
|