odata 0.0.8 → 0.0.9

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 4f93b8a7046cdffd27d35aa5bd2e2ca565adb8e6
4
- data.tar.gz: e0e75126d52b80bef3bffc5b8a0a76d934631807
3
+ metadata.gz: c0999c3b85269d2ad6c9855aa813ed5e6e10a24e
4
+ data.tar.gz: ee7cf848b1c47f15375c2e9cbd6e7cb5a2cbc89f
5
5
  SHA512:
6
- metadata.gz: 547f5aa48bc1b31c67ccd009dbf7b43ad32b6dbd6c4a38fdd3a0cc8c55ce97608779adc048bb44cb0d52064d70452a4e25f2471e873e7f12556911ed3fe8ef48
7
- data.tar.gz: b77801487b5f05c0982a04ebffa103b47434eba6a6adce9a578166e4e69a3992b91e9f4c021b9cccf80f62ef7b16b013dd0a5cda66bbbb974c1b63d5d45d7dda
6
+ metadata.gz: 516fa042cb00120bd214aeb52e9c12dbede85614562ccd760cbf4b41d1b6aed5571c82589949f795b42a3e9d4d61c687fb485db4f4bafc36d83c3666dfeb5921
7
+ data.tar.gz: 0654fbc52376a5446c86fb8303f6b5ca267b7eae694d87f3bcac4644cf824a953b3ed347a0f40864c022039947d312de4b9038a2775679a32140d4a1e1024186
@@ -11,6 +11,9 @@ jdk:
11
11
  - openjdk7
12
12
  - oraclejdk7
13
13
  - oraclejdk8
14
+ env:
15
+ - REAL_HTTP=true
16
+ - REAL_HTTP=false
14
17
  branches:
15
18
  only:
16
19
  - master
@@ -22,30 +25,40 @@ matrix:
22
25
  jdk: oraclejdk7
23
26
  - rvm: 1.9.3
24
27
  jdk: oraclejdk8
28
+ - rvm: 1.9.3
29
+ env: REAL_HTTP=true
25
30
  - rvm: 2.0.0
26
31
  jdk: openjdk6
27
32
  - rvm: 2.0.0
28
33
  jdk: oraclejdk7
29
34
  - rvm: 2.0.0
30
35
  jdk: oraclejdk8
36
+ - rvm: 2.0.0
37
+ env: REAL_HTTP=true
31
38
  - rvm: 2.1.0
32
39
  jdk: openjdk6
33
40
  - rvm: 2.1.0
34
41
  jdk: oraclejdk7
35
42
  - rvm: 2.1.0
36
43
  jdk: oraclejdk8
44
+ - rvm: 2.1.0
45
+ env: REAL_HTTP=true
37
46
  - rvm: 2.1.1
38
47
  jdk: openjdk6
39
48
  - rvm: 2.1.1
40
49
  jdk: oraclejdk7
41
50
  - rvm: 2.1.1
42
51
  jdk: oraclejdk8
52
+ - rvm: 2.1.1
53
+ env: REAL_HTTP=true
43
54
  - rvm: 2.1.2
44
55
  jdk: openjdk6
45
56
  - rvm: 2.1.2
46
57
  jdk: oraclejdk7
47
58
  - rvm: 2.1.2
48
59
  jdk: oraclejdk8
60
+ - rvm: jruby
61
+ env: REAL_HTTP=true
49
62
  addons:
50
63
  code_climate:
51
64
  repo_token: 323644d852f6ba54213f25446d6f4276dbec0adb74fefce770b083cd3e83ea1e
@@ -1,3 +1,5 @@
1
+ require 'backports/2.1.0/enumerable/to_h'
2
+
1
3
  require 'date'
2
4
  require 'nokogiri'
3
5
  require 'typhoeus'
@@ -7,6 +9,8 @@ require 'active_support/core_ext'
7
9
  require 'active_support/concern'
8
10
 
9
11
  require 'odata/version'
12
+ require 'odata/entity'
13
+ require 'odata/entity_set'
10
14
  require 'odata/service'
11
15
  require 'odata/service_registry'
12
16
  require 'odata/model'
@@ -0,0 +1,68 @@
1
+ module OData
2
+ class Entity
3
+ attr_reader :type, :namespace
4
+
5
+ def initialize(options = {})
6
+ @type = options[:type]
7
+ @namespace = options[:namespace]
8
+ @properties = {}
9
+ end
10
+
11
+ def name
12
+ @name ||= type.gsub(/#{namespace}\./, '')
13
+ end
14
+
15
+ def [](property_name)
16
+ @properties[property_name.to_s].value
17
+ end
18
+
19
+ def self.from_xml(xml_doc, options = {})
20
+ entity = OData::Entity.new(options)
21
+ entity.instance_eval do
22
+ xml_doc.xpath('//content/properties/*').each do |property_xml|
23
+ property_name = property_xml.name
24
+ if property_xml.attributes['null'] &&
25
+ property_xml.attributes['null'].value == 'true'
26
+ value = nil
27
+ value_type = service.get_property_type(name, property_name)
28
+ else
29
+ value_type = property_xml.attributes['type'].value
30
+ value = property_xml.content
31
+ end
32
+ klass_name = value_type.gsub(/^Edm\./, '')
33
+ property = "OData::Properties::#{klass_name}".constantize.new(property_name, value)
34
+ set_property(property_name, property)
35
+ end
36
+
37
+ begin
38
+ title_value = xml_doc.xpath('//title').first.content
39
+ property_name = service.get_title_property_name(name)
40
+ value_type = service.get_property_type(name, property_name)
41
+ klass_name = value_type.gsub(/^Edm\./, '')
42
+ property = "OData::Properties::#{klass_name}".constantize.new(property_name, title_value)
43
+ set_property(property_name, property)
44
+ end
45
+
46
+ begin
47
+ summary_value = xml_doc.xpath('//summary').first.content
48
+ property_name = service.get_summary_property_name(name)
49
+ value_type = service.get_property_type(name, property_name)
50
+ klass_name = value_type.gsub(/^Edm\./, '')
51
+ property = "OData::Properties::#{klass_name}".constantize.new(property_name, summary_value)
52
+ set_property(property_name, property)
53
+ end
54
+ end
55
+ entity
56
+ end
57
+
58
+ private
59
+
60
+ def service
61
+ @service ||= OData::ServiceRegistry[namespace]
62
+ end
63
+
64
+ def set_property(name, odata_property)
65
+ @properties[name.to_s] = odata_property.dup
66
+ end
67
+ end
68
+ end
@@ -0,0 +1,68 @@
1
+ module OData
2
+ # This class represents a set of entities within an OData service. It is
3
+ # instantiated whenever an OData::Service is asked for an EntitySet via the
4
+ # OData::Service#[] method call. It also provides Enumerable behavior so that
5
+ # you can interact with the entities within a set in a very comfortable way.
6
+ #
7
+ # This class also implements a query interface for finding certain entities
8
+ # based on query criteria or limiting the result set returned by the set. This
9
+ # functionality is implemented through transparent proxy objects.
10
+ class EntitySet
11
+ include Enumerable
12
+
13
+ attr_reader :name, :type, :namespace, :container
14
+
15
+ # Sets up the EntitySet to permit querying for the resources in the set.
16
+ #
17
+ # @param options [Hash] the options to setup the EntitySet
18
+ # @return [OData::EntitySet] an instance of the EntitySet
19
+ def initialize(options = {})
20
+ @name = options[:name]
21
+ @type = options[:type]
22
+ @namespace = options[:namespace]
23
+ @container = options[:container]
24
+ self
25
+ end
26
+
27
+ # Provided for Enumerable functionality
28
+ #
29
+ # @param block [block] a block to evaluate
30
+ # @return [OData::Entity] each entity in turn from this set
31
+ def each(&block)
32
+ per_page = 5; page = 0; page_position = 0; counter = 0
33
+ total, entities = get_paginated_entities(per_page, page)
34
+
35
+ until counter == total
36
+ if page_position >= per_page
37
+ page += 1
38
+ _, entities = get_paginated_entities(per_page, page)
39
+ page_position = 0
40
+ end
41
+
42
+ entity = OData::Entity.from_xml(entities[page_position], namespace: namespace, type: type)
43
+ block_given? ? block.call(entity) : yield(entity)
44
+
45
+ counter += 1
46
+ page_position += 1
47
+ end
48
+ end
49
+
50
+ # Returns the number of entities within the set
51
+ def count
52
+ service.execute("#{name}/$count").body.to_i
53
+ end
54
+
55
+ private
56
+
57
+ def service
58
+ @service ||= OData::ServiceRegistry[namespace]
59
+ end
60
+
61
+ def get_paginated_entities(per_page, page)
62
+ result = service.execute("#{name}?$inlinecount=allpages&$skip=#{per_page * page}&$top=#{per_page}")
63
+ entities = service.find_entities(result)
64
+ total = service.find_node(result, 'count').content.to_i
65
+ return total, entities
66
+ end
67
+ end
68
+ end
@@ -24,6 +24,11 @@ module OData
24
24
  EOS
25
25
  end
26
26
 
27
+ # Converts supplied value based on its type
28
+ #
29
+ # @param value [*] usually a string representation of the value
30
+ # @param type [String] OData type name as string
31
+ # @return [*]
27
32
  def convert_value_for_type(value, type)
28
33
  return nil if value.nil? || type.nil?
29
34
  if type =~ /Int(16|32|64)$/
@@ -50,6 +55,11 @@ module OData
50
55
  model_name.pluralize
51
56
  end
52
57
 
58
+ # Instantiates an OData::Model instance from a hash of attributes and
59
+ # their details.
60
+ #
61
+ # @param feed_hash [Hash] attribute names as keys, and details as values
62
+ # @return [OData::Model]
53
63
  def load_from_feed(feed_hash)
54
64
  loaded_instance = self.new
55
65
  feed_hash.each do |attribute_name, details|
@@ -1,3 +1,7 @@
1
+ # Modules
2
+ require 'odata/properties/number'
3
+
4
+ # Implementations
1
5
  require 'odata/properties/binary'
2
6
  require 'odata/properties/boolean'
3
7
  require 'odata/properties/date_time'
@@ -2,10 +2,14 @@ module OData
2
2
  module Properties
3
3
  class DateTime < OData::Property
4
4
  def value
5
- if @value.nil? && allow_nil?
5
+ if @value.nil? && allows_nil?
6
6
  nil
7
7
  else
8
- ::DateTime.strptime(@value, '%Y-%m-%dT%H:%M:%S.%L')
8
+ begin
9
+ ::DateTime.strptime(@value, '%Y-%m-%dT%H:%M:%S.%L')
10
+ rescue ArgumentError
11
+ ::DateTime.parse(@value)
12
+ end
9
13
  end
10
14
  end
11
15
 
@@ -21,18 +21,17 @@ module OData
21
21
  private
22
22
 
23
23
  def validate(value)
24
- if (value > max_value || value < min_value) &&
25
- (value.exponent > 29 || value.exponent < -29)
26
- raise ::ArgumentError, "Value is outside accepted range: #{min_value} to #{max_value}, or has more than 29 significant digits"
24
+ if value > max_value || value < min_value || value.precs.first > 29
25
+ raise ArgumentError, "Value is outside accepted range: #{min_value} to #{max_value}, or has more than 29 significant digits"
27
26
  end
28
27
  end
29
28
 
30
29
  def min_value
31
- @min ||= -(7.9 * (10**28))
30
+ @min ||= BigDecimal(-7.9 * (10**28), 2)
32
31
  end
33
32
 
34
33
  def max_value
35
- @max ||= (7.9 * (10**28))
34
+ @max ||= BigDecimal(7.9 * (10**28), 2)
36
35
  end
37
36
  end
38
37
  end
@@ -1,6 +1,8 @@
1
1
  module OData
2
2
  module Properties
3
3
  class Float < OData::Property
4
+ include OData::Properties::Number
5
+
4
6
  def value
5
7
  if @value.nil? && allows_nil?
6
8
  nil
@@ -20,12 +22,6 @@ module OData
20
22
 
21
23
  private
22
24
 
23
- def validate(value)
24
- if value > max_value || value < min_value
25
- raise ::ArgumentError, "Value is outside accepted range: #{min_value} to #{max_value}"
26
- end
27
- end
28
-
29
25
  def min_value
30
26
  @min ||= -(1.7 * (10**308))
31
27
  end
@@ -1,6 +1,8 @@
1
1
  module OData
2
2
  module Properties
3
3
  class Integer < OData::Property
4
+ include OData::Properties::Number
5
+
4
6
  def value
5
7
  if @value.nil? && allows_nil?
6
8
  nil
@@ -20,12 +22,6 @@ module OData
20
22
 
21
23
  private
22
24
 
23
- def validate(value)
24
- if value > max_value || value < min_value
25
- raise ::ArgumentError, "Value is outside accepted range: #{min_value} to #{max_value}"
26
- end
27
- end
28
-
29
25
  def min_value
30
26
  @min ||= -(2**63)
31
27
  end
@@ -59,11 +55,11 @@ module OData
59
55
  private
60
56
 
61
57
  def min_value
62
- @min ||= -(2**15)
58
+ @min ||= -(2**31)
63
59
  end
64
60
 
65
61
  def max_value
66
- @max ||= (2**15)-1
62
+ @max ||= (2**31)-1
67
63
  end
68
64
  end
69
65
 
@@ -0,0 +1,13 @@
1
+ module OData
2
+ module Properties
3
+ module Number
4
+ private
5
+
6
+ def validate(value)
7
+ if value > max_value || value < min_value
8
+ raise ::ArgumentError, "Value is outside accepted range: #{min_value} to #{max_value}"
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -1,9 +1,57 @@
1
1
  module OData
2
2
  module Properties
3
3
  class String < OData::Property
4
+ def value
5
+ if @value.nil? && allows_nil?
6
+ nil
7
+ else
8
+ encode_value(@value)
9
+ end
10
+ end
11
+
12
+ def value=(new_value)
13
+ validate(new_value)
14
+ @value = new_value.nil? ? nil : encode_value(new_value.to_s)
15
+ end
16
+
4
17
  def type
5
18
  'Edm.String'
6
19
  end
20
+
21
+ def is_unicode?
22
+ options[:unicode]
23
+ end
24
+
25
+ def has_default_value?
26
+ not(options[:default_value].nil?)
27
+ end
28
+
29
+ def default_value
30
+ options[:default_value]
31
+ end
32
+
33
+ private
34
+
35
+ def default_options
36
+ super.merge({
37
+ unicode: true,
38
+ default_value: nil
39
+ })
40
+ end
41
+
42
+ def validate(new_value)
43
+ if new_value.nil? && !allows_nil?
44
+ raise ArgumentError, 'This property does not allow for nil values to be set'
45
+ end
46
+ end
47
+
48
+ def encode_value(new_value)
49
+ if options[:unicode]
50
+ new_value.encode(Encoding::UTF_8)
51
+ else
52
+ new_value.encode(Encoding::ASCII)
53
+ end
54
+ end
7
55
  end
8
56
  end
9
57
  end
@@ -21,38 +21,6 @@ module OData
21
21
  @allows_nil ||= options[:allows_nil]
22
22
  end
23
23
 
24
- def max_length
25
- raise NotImplementedError
26
- end
27
-
28
- def fixed_length
29
- raise NotImplementedError
30
- end
31
-
32
- def precision
33
- raise NotImplementedError
34
- end
35
-
36
- def scale
37
- raise NotImplementedError
38
- end
39
-
40
- def is_unicode?
41
- raise NotImplementedError
42
- end
43
-
44
- def collation
45
- raise NotImplementedError
46
- end
47
-
48
- def srid
49
- raise NotImplementedError
50
- end
51
-
52
- def default_value
53
- raise NotImplementedError
54
- end
55
-
56
24
  def concurrency_mode
57
25
  @concurrecy_mode ||= options[:concurrency_mode]
58
26
  end