odata 0.3.1 → 0.3.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: af6506e24673be2abb599e192b33de2a4aa79b4a
4
- data.tar.gz: 38e3d857a460217b8c049ed1ab706d58ddeff55b
3
+ metadata.gz: 899ee301dd62dc8969c8a8d8191adc586b287527
4
+ data.tar.gz: 9d9122c36019cfa78a3e4567b9739e8353b07db3
5
5
  SHA512:
6
- metadata.gz: a699dafcd979c7de7e360435aea0ffb5fc3025e9d006bd7e44e4dff2184eaca5f727281ef38fc3fef7c2cc4c59a4b0c8bab08adea2f5980d2814c1e99aae1861
7
- data.tar.gz: f9df03eaebb7f3ab4177a3a2938e7a1ca23b9dc0de7bf7df3c9d4cc173643b6a83b79c1e0b55eafbe27639590a90bd05c94e7888ead8e759bcb8d9c9b0cd0d98
6
+ metadata.gz: 422c217129c1f82e13d3641d8468cc3ff6bc65224db8da0c17cc1e1c1c012d093e1b5e0f891c48224088f1ae01fa132b89e6bb5edc44b8c4c3b3663e88792023
7
+ data.tar.gz: 262866a54904f052099030cf1393359b2e9ba7dd06fc4bfbd56a18ea004ba6262fcc6994ea2383b175abe0d01225785661556e2dc24ec2c45695b5d91316f7f2
data/.travis.yml CHANGED
@@ -11,9 +11,6 @@ jdk:
11
11
  - openjdk7
12
12
  - oraclejdk7
13
13
  - oraclejdk8
14
- env:
15
- - REAL_HTTP=true
16
- - REAL_HTTP=false
17
14
  branches:
18
15
  only:
19
16
  - master
@@ -25,40 +22,30 @@ matrix:
25
22
  jdk: oraclejdk7
26
23
  - rvm: 1.9.3
27
24
  jdk: oraclejdk8
28
- - rvm: 1.9.3
29
- env: REAL_HTTP=true
30
25
  - rvm: 2.0.0
31
26
  jdk: openjdk6
32
27
  - rvm: 2.0.0
33
28
  jdk: oraclejdk7
34
29
  - rvm: 2.0.0
35
30
  jdk: oraclejdk8
36
- - rvm: 2.0.0
37
- env: REAL_HTTP=true
38
31
  - rvm: 2.1.0
39
32
  jdk: openjdk6
40
33
  - rvm: 2.1.0
41
34
  jdk: oraclejdk7
42
35
  - rvm: 2.1.0
43
36
  jdk: oraclejdk8
44
- - rvm: 2.1.0
45
- env: REAL_HTTP=true
46
37
  - rvm: 2.1.1
47
38
  jdk: openjdk6
48
39
  - rvm: 2.1.1
49
40
  jdk: oraclejdk7
50
41
  - rvm: 2.1.1
51
42
  jdk: oraclejdk8
52
- - rvm: 2.1.1
53
- env: REAL_HTTP=true
54
43
  - rvm: 2.1.2
55
44
  jdk: openjdk6
56
45
  - rvm: 2.1.2
57
46
  jdk: oraclejdk7
58
47
  - rvm: 2.1.2
59
48
  jdk: oraclejdk8
60
- - rvm: jruby
61
- env: REAL_HTTP=true
62
49
  addons:
63
50
  code_climate:
64
51
  repo_token: 56e2763b5bfe138f566c5f2bf23c14deee4f8990324436dbde07ee2a34bb87f8
data/CHANGELOG.md CHANGED
@@ -1,5 +1,9 @@
1
1
  # CHANGELOG
2
2
 
3
+ ## 0.3.2
4
+
5
+ * Refactored internals of the query interface.
6
+
3
7
  ## 0.3.1
4
8
 
5
9
  * Resolved issues causing failure on Ruby 1.9 and JRuby.
data/lib/odata.rb CHANGED
@@ -1,7 +1,6 @@
1
- require 'backports/2.1.0/enumerable/to_h'
2
-
3
1
  require 'uri'
4
2
  require 'date'
3
+ require 'bigdecimal'
5
4
  require 'nokogiri'
6
5
  require 'typhoeus'
7
6
 
@@ -14,6 +13,7 @@ require 'odata/property'
14
13
  require 'odata/properties'
15
14
  require 'odata/entity'
16
15
  require 'odata/entity_set'
16
+ require 'odata/query/criteria'
17
17
  require 'odata/query'
18
18
  require 'odata/service'
19
19
  require 'odata/service_registry'
data/lib/odata/entity.rb CHANGED
@@ -1,16 +1,31 @@
1
1
  module OData
2
+ # An OData::Entity represents a single record returned by the service. All
3
+ # Entities have a type and belong to a specific namespace. They are written
4
+ # back to the service via the EntitySet they came from. OData::Entity
5
+ # instances should not be instantiated directly; instead, they should either
6
+ # be read or instantiated from their respective OData::EntitySet.
2
7
  class Entity
3
- attr_reader :type, :namespace
8
+ # The Entity type name
9
+ attr_reader :type
10
+ # The OData::Service namespace
11
+ attr_reader :namespace
4
12
 
13
+ # Initializes a bare Entity
14
+ # @param options [Hash]
5
15
  def initialize(options = {})
6
16
  @type = options[:type]
7
17
  @namespace = options[:namespace]
8
18
  end
9
19
 
20
+ # Returns name of Entity from Service specified type.
21
+ # @return [String]
10
22
  def name
11
23
  @name ||= type.gsub(/#{namespace}\./, '')
12
24
  end
13
25
 
26
+ # Get property value
27
+ # @param property_name [to_s]
28
+ # @return [*]
14
29
  def [](property_name)
15
30
  begin
16
31
  properties[property_name.to_s].value
@@ -19,6 +34,9 @@ module OData
19
34
  end
20
35
  end
21
36
 
37
+ # Set property value
38
+ # @param property_name [to_s]
39
+ # @param value [*]
22
40
  def []=(property_name, value)
23
41
  begin
24
42
  properties[property_name.to_s].value = value
@@ -27,6 +45,10 @@ module OData
27
45
  end
28
46
  end
29
47
 
48
+ # Create Entity with provided properties and options.
49
+ # @param new_properties [Hash]
50
+ # @param options [Hash]
51
+ # @param [OData::Entity]
30
52
  def self.with_properties(new_properties = {}, options = {})
31
53
  entity = OData::Entity.new(options)
32
54
  entity.instance_eval do
@@ -35,52 +57,27 @@ module OData
35
57
  end
36
58
 
37
59
  new_properties.each do |property_name, property_value|
38
- self[property_name] = property_value
60
+ self[property_name.to_s] = property_value
39
61
  end
40
62
  end
41
63
  entity
42
64
  end
43
65
 
66
+ # Create Entity from XML document with provided options.
67
+ # @param xml_doc [Nokogiri::XML]
68
+ # @param options [Hash]
69
+ # @return [OData::Entity]
44
70
  def self.from_xml(xml_doc, options = {})
45
71
  return nil if xml_doc.nil?
46
72
  entity = OData::Entity.new(options)
47
- entity.instance_eval do
48
- xml_doc.xpath('//content/properties/*').each do |property_xml|
49
- property_name = property_xml.name
50
- if property_xml.attributes['null'] &&
51
- property_xml.attributes['null'].value == 'true'
52
- value = nil
53
- value_type = service.get_property_type(name, property_name)
54
- else
55
- value_type = property_xml.attributes['type'].value
56
- value = property_xml.content
57
- end
58
- klass_name = value_type.gsub(/^Edm\./, '')
59
- property = get_property_class(klass_name).new(property_name, value)
60
- set_property(property_name, property)
61
- end
62
-
63
- begin
64
- title_value = xml_doc.xpath('//title').first.content
65
- property_name = service.get_title_property_name(name)
66
- value_type = service.get_property_type(name, property_name)
67
- klass_name = value_type.gsub(/^Edm\./, '')
68
- property = get_property_class(klass_name).new(property_name, title_value)
69
- set_property(property_name, property)
70
- end
71
-
72
- begin
73
- summary_value = xml_doc.xpath('//summary').first.content
74
- property_name = service.get_summary_property_name(name)
75
- value_type = service.get_property_type(name, property_name)
76
- klass_name = value_type.gsub(/^Edm\./, '')
77
- property = get_property_class(klass_name).new(property_name, summary_value)
78
- set_property(property_name, property)
79
- end
80
- end
73
+ process_properties(entity, xml_doc)
74
+ process_feed_property(entity, xml_doc, 'title')
75
+ process_feed_property(entity, xml_doc, 'summary')
81
76
  entity
82
77
  end
83
78
 
79
+ # Converts Entity to its XML representation.
80
+ # @return [String]
84
81
  def to_xml
85
82
  builder = Nokogiri::XML::Builder.new do |xml|
86
83
  xml.entry('xmlns' => 'http://www.w3.org/2005/Atom',
@@ -97,16 +94,7 @@ module OData
97
94
  xml['metadata'].properties do
98
95
  properties.each do |name, property|
99
96
  next if name == primary_key
100
- attributes = {
101
- 'metadata:type' => property.type,
102
- }
103
-
104
- if property.value.nil?
105
- attributes['metadata:null'] = 'true'
106
- xml['data'].send(name.to_sym, attributes)
107
- else
108
- xml['data'].send(name.to_sym, attributes, property.xml_value)
109
- end
97
+ property.to_xml(xml)
110
98
  end
111
99
  end
112
100
  end
@@ -115,13 +103,17 @@ module OData
115
103
  builder.to_xml
116
104
  end
117
105
 
106
+ # Returns the primary key for the Entity.
107
+ # @return [String]
118
108
  def primary_key
119
109
  service.primary_key_for(name)
120
110
  end
121
111
 
122
112
  private
123
113
 
124
- def get_property_class(klass_name)
114
+ def get_property_class(property_name)
115
+ value_type = service.get_property_type(name, property_name)
116
+ klass_name = value_type.gsub(/^Edm\./, '')
125
117
  ::OData::Properties.const_get(klass_name)
126
118
  end
127
119
 
@@ -136,5 +128,30 @@ module OData
136
128
  def set_property(name, odata_property)
137
129
  properties[name.to_s] = odata_property.dup
138
130
  end
131
+
132
+ def self.process_properties(entity, xml_doc)
133
+ entity.instance_eval do
134
+ xml_doc.xpath('//content/properties/*').each do |property_xml|
135
+ property_name = property_xml.name
136
+ if property_xml.attributes['null'] &&
137
+ property_xml.attributes['null'].value == 'true'
138
+ value = nil
139
+ else
140
+ value = property_xml.content
141
+ end
142
+ property = get_property_class(property_name).new(property_name, value)
143
+ set_property(property_name, property)
144
+ end
145
+ end
146
+ end
147
+
148
+ def self.process_feed_property(entity, xml_doc, property_name)
149
+ entity.instance_eval do
150
+ property_value = xml_doc.xpath("//#{property_name}").first.content
151
+ property_name = service.send("get_#{property_name}_property_name", name)
152
+ property = get_property_class(property_name).new(property_name, property_value)
153
+ set_property(property_name, property)
154
+ end
155
+ end
139
156
  end
140
157
  end
@@ -10,7 +10,14 @@ module OData
10
10
  class EntitySet
11
11
  include Enumerable
12
12
 
13
- attr_reader :name, :type, :namespace, :container
13
+ # The name of the EntitySet
14
+ attr_reader :name
15
+ # The Entity type for the EntitySet
16
+ attr_reader :type
17
+ # The OData::Service namespace
18
+ attr_reader :namespace
19
+ # The EntitySet's container name
20
+ attr_reader :container
14
21
 
15
22
  # Sets up the EntitySet to permit querying for the resources in the set.
16
23
  #
@@ -50,9 +57,7 @@ module OData
50
57
  # Return the first Entity for the set.
51
58
  # @return [OData::EntitySet]
52
59
  def first
53
- query = OData::Query.new(name)
54
- query << OData::Query::Criteria.new(operation: 'skip', argument: 0)
55
- query << OData::Query::Criteria.new(operation: 'top', argument: 1)
60
+ query = OData::Query.new(self).limit(1)
56
61
  result = service.execute(query)
57
62
  entities = service.find_entities(result)
58
63
  OData::Entity.from_xml(entities[0], entity_options)
@@ -71,19 +76,13 @@ module OData
71
76
  OData::Entity.with_properties(properties, entity_options)
72
77
  end
73
78
 
74
- # Find Entities with the supplied filter applied.
75
- # @param filter [to_s] filter to apply
76
- # @return [Array<OData::Entity>]
77
- def filter(filter)
78
- entities = []
79
- result = service.execute("#{name}?$filter=#{filter}")
79
+ # Returns a query targetted at the current EntitySet.
80
+ # @return [OData::Query]
81
+ def query
82
+ OData::Query.new(self)
83
+ end
80
84
 
81
- service.find_entities(result).each do |entity_xml|
82
- entities << OData::Entity.from_xml(entity_xml, entity_options)
83
- end
84
85
 
85
- entities
86
- end
87
86
 
88
87
  # Find the Entity with the supplied key value.
89
88
  # @param key [to_s] primary key to lookup
@@ -107,7 +106,7 @@ module OData
107
106
  method: :post,
108
107
  body: entity.to_xml.gsub(/\n\s+/, ''),
109
108
  headers: {
110
- Accept: 'application/atom+xml',
109
+ 'Accept' => 'application/atom+xml',
111
110
  'Content-Type' => 'application/atom+xml'
112
111
  }
113
112
  }
@@ -138,10 +137,8 @@ module OData
138
137
  end
139
138
 
140
139
  def get_paginated_entities(per_page, page)
141
- query = OData::Query.new(name)
142
- query << OData::Query::Criteria.new(operation: 'inline_count', argument: 'allpages')
143
- query << OData::Query::Criteria.new(operation: 'skip', argument: (per_page * page))
144
- query << OData::Query::Criteria.new(operation: 'top', argument: per_page)
140
+ query = OData::Query.new(self)
141
+ query.include_count.skip(per_page * page).limit(per_page)
145
142
  result = service.execute(query)
146
143
  entities = service.find_entities(result)
147
144
  total = service.find_node(result, 'count').content.to_i
@@ -2,6 +2,8 @@ module OData
2
2
  module Properties
3
3
  # Defines the Boolean OData type.
4
4
  class Boolean < OData::Property
5
+ # Returns the property value, properly typecast
6
+ # @return [Boolean, nil]
5
7
  def value
6
8
  if @value.nil? && allows_nil?
7
9
  nil
@@ -10,11 +12,14 @@ module OData
10
12
  end
11
13
  end
12
14
 
15
+ # Sets the property value
16
+ # @params new_value [Boolean]
13
17
  def value=(new_value)
14
18
  validate(new_value)
15
19
  @value = new_value.to_s
16
20
  end
17
21
 
22
+ # The OData type name
18
23
  def type
19
24
  'Edm.Boolean'
20
25
  end
@@ -28,12 +28,16 @@ module OData
28
28
 
29
29
  private
30
30
 
31
+ def exponent_size
32
+ 63
33
+ end
34
+
31
35
  def min_value
32
- @min ||= -(2**63)
36
+ @min ||= -(2**exponent_size)
33
37
  end
34
38
 
35
39
  def max_value
36
- @max ||= (2**63)-1
40
+ @max ||= (2**exponent_size)-1
37
41
  end
38
42
  end
39
43
 
@@ -46,12 +50,8 @@ module OData
46
50
 
47
51
  private
48
52
 
49
- def min_value
50
- @min ||= -(2**15)
51
- end
52
-
53
- def max_value
54
- @max ||= (2**15)-1
53
+ def exponent_size
54
+ 15
55
55
  end
56
56
  end
57
57
 
@@ -64,12 +64,8 @@ module OData
64
64
 
65
65
  private
66
66
 
67
- def min_value
68
- @min ||= -(2**31)
69
- end
70
-
71
- def max_value
72
- @max ||= (2**31)-1
67
+ def exponent_size
68
+ 31
73
69
  end
74
70
  end
75
71
 
@@ -85,12 +81,12 @@ module OData
85
81
 
86
82
  private
87
83
 
88
- def min_value
89
- 0
84
+ def exponent_size
85
+ 8
90
86
  end
91
87
 
92
- def max_value
93
- @max ||= (2**8)-1
88
+ def min_value
89
+ 0
94
90
  end
95
91
  end
96
92
 
@@ -103,12 +99,8 @@ module OData
103
99
 
104
100
  private
105
101
 
106
- def min_value
107
- @min ||= -(2**7)
108
- end
109
-
110
- def max_value
111
- @max ||= (2**7)-1
102
+ def exponent_size
103
+ 7
112
104
  end
113
105
  end
114
106
  end