odata 0.1.0 → 0.2.0

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: a62f54f63a4c6c397d711b31eea1d31f41383e80
4
- data.tar.gz: 8a4e945b39e401bfbaaaba43e2e52c884949318a
3
+ metadata.gz: f1ee4f9637afcfe8f3b9e088e14056e3bff1a90a
4
+ data.tar.gz: b1821379f53b957eb494930b0700ddaa99f20004
5
5
  SHA512:
6
- metadata.gz: 591263ed5f45b8f12ef3ebf167bed9fff9e3e61c98de34b58601a5c3db2b89f18c4207feabbdccf08d9970a67c93f0f2d340747b7f767f64a615255c54769735
7
- data.tar.gz: 4bc3b99da624d26e44d77ff8400c1ae5067d77aa56a8f435f739b37de0d50de3dc28967e8aae3fce004491e00808167fdd022133d2d25782347b28296d698cc3
6
+ metadata.gz: 1844be486c58326b07a7415c1e9dd0d98a92eb505459f678ff7adacfa5812331a488885989f6dc30b37aa2552103a4dec39a76091e6be3850d53809addf99f3b
7
+ data.tar.gz: 6a86353c36caf8aeb84aff2711b3967247c8c0d6a91fe2036c42a644b41114a3d8d53cc362a89633dfad31df9580d0395403f563708d0b31ffaee303472cb3dc
data/.travis.yml CHANGED
@@ -61,4 +61,4 @@ matrix:
61
61
  env: REAL_HTTP=true
62
62
  addons:
63
63
  code_climate:
64
- repo_token: 323644d852f6ba54213f25446d6f4276dbec0adb74fefce770b083cd3e83ea1e
64
+ repo_token: 56e2763b5bfe138f566c5f2bf23c14deee4f8990324436dbde07ee2a34bb87f8
data/lib/odata.rb CHANGED
@@ -1,5 +1,6 @@
1
1
  require 'backports/2.1.0/enumerable/to_h'
2
2
 
3
+ require 'uri'
3
4
  require 'date'
4
5
  require 'nokogiri'
5
6
  require 'typhoeus'
@@ -13,6 +14,7 @@ require 'odata/property'
13
14
  require 'odata/properties'
14
15
  require 'odata/entity'
15
16
  require 'odata/entity_set'
17
+ require 'odata/query'
16
18
  require 'odata/service'
17
19
  require 'odata/service_registry'
18
20
 
data/lib/odata/entity.rb CHANGED
@@ -30,7 +30,6 @@ module OData
30
30
  def self.with_properties(new_properties = {}, options = {})
31
31
  entity = OData::Entity.new(options)
32
32
  entity.instance_eval do
33
- # TODO Define the properties
34
33
  service.properties_for(name).each do |name, instance|
35
34
  set_property(name, instance)
36
35
  end
@@ -43,6 +42,7 @@ module OData
43
42
  end
44
43
 
45
44
  def self.from_xml(xml_doc, options = {})
45
+ return nil if xml_doc.nil?
46
46
  entity = OData::Entity.new(options)
47
47
  entity.instance_eval do
48
48
  xml_doc.xpath('//content/properties/*').each do |property_xml|
@@ -47,21 +47,56 @@ module OData
47
47
  end
48
48
  end
49
49
 
50
+ # Return the first Entity for the set.
51
+ # @return [OData::EntitySet]
50
52
  def first
51
- result = service.execute("#{name}?$skip=0&$top=1")
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)
56
+ result = service.execute(query)
52
57
  entities = service.find_entities(result)
53
58
  OData::Entity.from_xml(entities[0], entity_options)
54
59
  end
55
60
 
56
- # Returns the number of entities within the set
61
+ # Returns the number of entities within the set.
62
+ # @return [Integer]
57
63
  def count
58
64
  service.execute("#{name}/$count").body.to_i
59
65
  end
60
66
 
67
+ # Create a new Entity for this set with the given properties.
68
+ # @param properties [Hash] property name as key and it's initial value
69
+ # @return [OData::Entity]
61
70
  def new_entity(properties = {})
62
71
  OData::Entity.with_properties(properties, entity_options)
63
72
  end
64
73
 
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}")
80
+
81
+ service.find_entities(result).each do |entity_xml|
82
+ entities << OData::Entity.from_xml(entity_xml, entity_options)
83
+ end
84
+
85
+ entities
86
+ end
87
+
88
+ # Find the Entity with the supplied key value.
89
+ # @param key [to_s] primary key to lookup
90
+ # @return [OData::Entity,nil]
91
+ def [](key)
92
+ result = service.execute("#{name}(#{key})")
93
+ entities = service.find_entities(result)
94
+ OData::Entity.from_xml(entities[0], entity_options)
95
+ end
96
+
97
+ # Write supplied entity back to the service.
98
+ # @param entity [OData::Entity] entity to save or update in the service
99
+ # @return [OData::Entity]
65
100
  def <<(entity)
66
101
  new_entity = entity[entity.primary_key].nil?
67
102
 
@@ -103,7 +138,11 @@ module OData
103
138
  end
104
139
 
105
140
  def get_paginated_entities(per_page, page)
106
- result = service.execute("#{name}?$inlinecount=allpages&$skip=#{per_page * page}&$top=#{per_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)
145
+ result = service.execute(query)
107
146
  entities = service.find_entities(result)
108
147
  total = service.find_node(result, 'count').content.to_i
109
148
  return total, entities
@@ -1,6 +1,9 @@
1
1
  module OData
2
2
  module Properties
3
+ # Defines the Binary OData type.
3
4
  class Binary < OData::Property
5
+ # Returns the property value, properly typecast
6
+ # @return [Integer,nil]
4
7
  def value
5
8
  if @value.nil? && allows_nil?
6
9
  nil
@@ -9,11 +12,14 @@ module OData
9
12
  end
10
13
  end
11
14
 
15
+ # Sets the property value
16
+ # @params new_value [0,1,Boolean]
12
17
  def value=(new_value)
13
18
  validate(new_value)
14
19
  @value = parse_value(new_value)
15
20
  end
16
21
 
22
+ # The OData type name
17
23
  def type
18
24
  'Edm.Binary'
19
25
  end
@@ -1,5 +1,6 @@
1
1
  module OData
2
2
  module Properties
3
+ # Defines the Boolean OData type.
3
4
  class Boolean < OData::Property
4
5
  def value
5
6
  if @value.nil? && allows_nil?
@@ -1,6 +1,9 @@
1
1
  module OData
2
2
  module Properties
3
+ # Defines the DateTime OData type.
3
4
  class DateTime < OData::Property
5
+ # Returns the property value, properly typecast
6
+ # @return [DateTime, nil]
4
7
  def value
5
8
  if @value.nil? && allows_nil?
6
9
  nil
@@ -13,11 +16,14 @@ module OData
13
16
  end
14
17
  end
15
18
 
19
+ # Sets the property value
20
+ # @params new_value [DateTime]
16
21
  def value=(new_value)
17
22
  validate(new_value)
18
23
  @value = parse_value(new_value)
19
24
  end
20
25
 
26
+ # The OData type name
21
27
  def type
22
28
  'Edm.DateTime'
23
29
  end
@@ -1,6 +1,9 @@
1
1
  module OData
2
2
  module Properties
3
+ # Defines the DateTimeOffset OData type.
3
4
  class DateTimeOffset < OData::Property
5
+ # Returns the property value, properly typecast
6
+ # @return [DateTime,nil]
4
7
  def value
5
8
  if @value.nil? && allow_nil?
6
9
  nil
@@ -9,11 +12,14 @@ module OData
9
12
  end
10
13
  end
11
14
 
15
+ # Sets the property value
16
+ # @params new_value [DateTime]
12
17
  def value=(new_value)
13
18
  validate(new_value)
14
19
  @value = parse_value(new_value)
15
20
  end
16
21
 
22
+ # The OData type name
17
23
  def type
18
24
  'Edm.DateTimeOffset'
19
25
  end
@@ -1,6 +1,9 @@
1
1
  module OData
2
2
  module Properties
3
+ # Defines the Decimal OData type.
3
4
  class Decimal < OData::Property
5
+ # Returns the property value, properly typecast
6
+ # @return [BigDecimal,nil]
4
7
  def value
5
8
  if @value.nil? && allows_nil?
6
9
  nil
@@ -9,11 +12,14 @@ module OData
9
12
  end
10
13
  end
11
14
 
15
+ # Sets the property value
16
+ # @params new_value something BigDecimal() can parse
12
17
  def value=(new_value)
13
18
  validate(BigDecimal(new_value))
14
19
  @value = new_value.to_s
15
20
  end
16
21
 
22
+ # The OData type name
17
23
  def type
18
24
  'Edm.Decimal'
19
25
  end
@@ -1,8 +1,11 @@
1
1
  module OData
2
2
  module Properties
3
+ # Defines the Float OData type.
3
4
  class Float < OData::Property
4
5
  include OData::Properties::Number
5
6
 
7
+ # Returns the property value, properly typecast
8
+ # @return [Float,nil]
6
9
  def value
7
10
  if @value.nil? && allows_nil?
8
11
  nil
@@ -11,11 +14,14 @@ module OData
11
14
  end
12
15
  end
13
16
 
17
+ # Sets the property value
18
+ # @params new_value [to_f]
14
19
  def value=(new_value)
15
20
  validate(new_value.to_f)
16
21
  @value = new_value.to_f.to_s
17
22
  end
18
23
 
24
+ # The OData type name
19
25
  def type
20
26
  'Edm.Double'
21
27
  end
@@ -31,9 +37,12 @@ module OData
31
37
  end
32
38
  end
33
39
 
40
+ # Defines the Double (Float) OData type.
34
41
  class Double < OData::Properties::Float; end
35
42
 
43
+ # Defines the Single (Float) OData type.
36
44
  class Single < OData::Properties::Float
45
+ # The OData type name
37
46
  def type
38
47
  'Edm.Single'
39
48
  end
@@ -1,6 +1,8 @@
1
1
  module OData
2
2
  module Properties
3
+ # Defines the GUID OData type.
3
4
  class Guid < OData::Property
5
+ # The OData type name
4
6
  def type
5
7
  'Edm.Guid'
6
8
  end
@@ -1,8 +1,11 @@
1
1
  module OData
2
2
  module Properties
3
+ # Defines the Integer OData type.
3
4
  class Integer < OData::Property
4
5
  include OData::Properties::Number
5
6
 
7
+ # Returns the property value, properly typecast
8
+ # @return [Integer,nil]
6
9
  def value
7
10
  if @value.nil? && allows_nil?
8
11
  nil
@@ -11,11 +14,14 @@ module OData
11
14
  end
12
15
  end
13
16
 
17
+ # Sets the property value
18
+ # @params new_value [to_i]
14
19
  def value=(new_value)
15
20
  validate(new_value.to_i)
16
21
  @value = new_value.to_i.to_s
17
22
  end
18
23
 
24
+ # The OData type name
19
25
  def type
20
26
  'Edm.Int64'
21
27
  end
@@ -31,7 +37,9 @@ module OData
31
37
  end
32
38
  end
33
39
 
40
+ # Defines the Integer (16 bit) OData type.
34
41
  class Int16 < Integer
42
+ # The OData type name
35
43
  def type
36
44
  'Edm.Int16'
37
45
  end
@@ -47,7 +55,9 @@ module OData
47
55
  end
48
56
  end
49
57
 
58
+ # Defines the Integer (32 bit) OData type.
50
59
  class Int32 < Integer
60
+ # The OData type name
51
61
  def type
52
62
  'Edm.Int32'
53
63
  end
@@ -63,9 +73,12 @@ module OData
63
73
  end
64
74
  end
65
75
 
76
+ # Defines the Integer (64 bit) OData type.
66
77
  class Int64 < Integer; end
67
78
 
79
+ # Defines the Byte OData type.
68
80
  class Byte < Integer
81
+ # The OData type name
69
82
  def type
70
83
  'Edm.Byte'
71
84
  end
@@ -81,7 +94,9 @@ module OData
81
94
  end
82
95
  end
83
96
 
97
+ # Defines the Signed Byte OData type.
84
98
  class SByte < Integer
99
+ # The OData type name
85
100
  def type
86
101
  'Edm.SByte'
87
102
  end
@@ -1,5 +1,6 @@
1
1
  module OData
2
2
  module Properties
3
+ # Defines common behavior for OData numeric types.
3
4
  module Number
4
5
  private
5
6
 
@@ -1,6 +1,9 @@
1
1
  module OData
2
2
  module Properties
3
+ # Defines the String OData type.
3
4
  class String < OData::Property
5
+ # Returns the property value, properly typecast
6
+ # @return [String,nil]
4
7
  def value
5
8
  if @value.nil? && allows_nil?
6
9
  nil
@@ -9,23 +12,29 @@ module OData
9
12
  end
10
13
  end
11
14
 
15
+ # Sets the property value
16
+ # @params new_value [to_s,nil]
12
17
  def value=(new_value)
13
18
  validate(new_value)
14
19
  @value = new_value.nil? ? nil : encode_value(new_value.to_s)
15
20
  end
16
21
 
22
+ # The OData type name
17
23
  def type
18
24
  'Edm.String'
19
25
  end
20
26
 
27
+ # Is the property value Unicode encoded
21
28
  def is_unicode?
22
29
  options[:unicode]
23
30
  end
24
31
 
32
+ # Does the property have a default value
25
33
  def has_default_value?
26
34
  not(options[:default_value].nil?)
27
35
  end
28
36
 
37
+ # The default value for the property
29
38
  def default_value
30
39
  options[:default_value]
31
40
  end
@@ -1,6 +1,9 @@
1
1
  module OData
2
2
  module Properties
3
+ # Defines the Time OData type.
3
4
  class Time < OData::Property
5
+ # Returns the property value, properly typecast
6
+ # @return [Time,nil]
4
7
  def value
5
8
  if @value.nil? && allow_nil?
6
9
  nil
@@ -9,11 +12,14 @@ module OData
9
12
  end
10
13
  end
11
14
 
15
+ # Sets the property value
16
+ # @params new_value [Time]
12
17
  def value=(new_value)
13
18
  validate(new_value)
14
19
  @value = parse_value(new_value)
15
20
  end
16
21
 
22
+ # The OData type name
17
23
  def type
18
24
  'Edm.Time'
19
25
  end
@@ -0,0 +1,82 @@
1
+ require 'odata/query/criteria'
2
+
3
+ module OData
4
+ class Query
5
+ # Defines the operations the OData gem knows how to support.
6
+ SUPPORTED_OPERATIONS = [
7
+ :filter, :order_by, :skip, :top, :select, :expand, :inline_count
8
+ ]
9
+
10
+ def initialize(collection)
11
+ @collection = collection.to_s
12
+ setup_empty_criteria_set
13
+ end
14
+
15
+ def <<(criteria)
16
+ criteria_set[criteria.operation] << criteria.argument
17
+ end
18
+
19
+ def to_s
20
+ [collection,assemble_criteria].compact.join('?')
21
+ end
22
+
23
+ private
24
+
25
+ def collection
26
+ @collection
27
+ end
28
+
29
+ def criteria_set
30
+ @criteria_set
31
+ end
32
+
33
+ def setup_empty_criteria_set
34
+ criteria_set = SUPPORTED_OPERATIONS.map do |operation|
35
+ [operation, []]
36
+ end
37
+ @criteria_set = Hash[criteria_set]
38
+ end
39
+
40
+ def assemble_criteria
41
+ criteria = [
42
+ filter_criteria,
43
+ order_by_criteria,
44
+ expand_criteria,
45
+ select_criteria,
46
+ inline_count_criteria,
47
+ skip_criteria,
48
+ top_criteria
49
+ ].compact!
50
+
51
+ criteria.empty? ? nil : criteria.join('&')
52
+ end
53
+
54
+ def filter_criteria
55
+ criteria_set[:filter].empty? ? nil : "$filter=#{criteria_set[:filter].join(' and ')}"
56
+ end
57
+
58
+ def order_by_criteria
59
+ criteria_set[:order_by].empty? ? nil : "$orderby=#{criteria_set[:order_by].join(',')}"
60
+ end
61
+
62
+ def expand_criteria
63
+ criteria_set[:expand].empty? ? nil : "$expand=#{criteria_set[:expand].join(',')}"
64
+ end
65
+
66
+ def select_criteria
67
+ criteria_set[:select].empty? ? nil : "$select=#{criteria_set[:select].join(',')}"
68
+ end
69
+
70
+ def inline_count_criteria
71
+ criteria_set[:inline_count].empty? ? nil : "$inlinecount=#{criteria_set[:inline_count].last}"
72
+ end
73
+
74
+ def skip_criteria
75
+ criteria_set[:skip].empty? ? nil : "$skip=#{criteria_set[:skip].last}"
76
+ end
77
+
78
+ def top_criteria
79
+ criteria_set[:top].empty? ? nil : "$top=#{criteria_set[:top].last}"
80
+ end
81
+ end
82
+ end
@@ -0,0 +1,75 @@
1
+ module OData
2
+ class Query
3
+ # Represents a discreet detail about an OData query. It also validates
4
+ # the criteria based on what the gem knows how to support.
5
+ class Criteria
6
+ # Defines the options required to create a new OData::Query::Criteria.
7
+ REQUIRED_OPTIONS = [:operation, :argument]
8
+
9
+ # Defines the operations the OData gem knows how to support.
10
+ SUPPORTED_OPERATIONS = [
11
+ :filter, :order_by, :skip, :top, :select, :expand, :inline_count
12
+ ]
13
+
14
+ # Creates a new OData::Query::Criteria with the supplied options.
15
+ # @param options [Hash]
16
+ def initialize(options = {})
17
+ @options = process_options(options)
18
+ validate_required_options
19
+ validate_supported_operation
20
+ end
21
+
22
+ # The query operation of a particular criteria.
23
+ # @return [Symbol]
24
+ def operation
25
+ options[:operation]
26
+ end
27
+
28
+ # The query argument of a particular criteria.
29
+ # @return [String]
30
+ def argument
31
+ options[:argument]
32
+ end
33
+
34
+ private
35
+
36
+ def options
37
+ @options
38
+ end
39
+
40
+ def process_options(passed_options)
41
+ new_options = passed_options.map do |key, value|
42
+ if key.to_sym == :operation
43
+ value = value.to_sym
44
+ end
45
+
46
+ [key.to_sym, value]
47
+ end
48
+
49
+ Hash[new_options]
50
+ end
51
+
52
+ def required_options
53
+ REQUIRED_OPTIONS
54
+ end
55
+
56
+ def supported_operations
57
+ SUPPORTED_OPERATIONS
58
+ end
59
+
60
+ def validate_required_options
61
+ required_options.each do |required_option|
62
+ unless options.key?(required_option)
63
+ raise ArgumentError, "Missing required option: #{required_option}"
64
+ end
65
+ end
66
+ end
67
+
68
+ def validate_supported_operation
69
+ unless supported_operations.include?(options[:operation])
70
+ raise ArgumentError, "Operation not supported: #{options[:operation]}"
71
+ end
72
+ end
73
+ end
74
+ end
75
+ end
data/lib/odata/service.rb CHANGED
@@ -84,7 +84,7 @@ module OData
84
84
  # @return [Typhoeus::Response]
85
85
  def execute(url_chunk, additional_options = {})
86
86
  request = ::Typhoeus::Request.new(
87
- "#{service_url}/#{url_chunk}",
87
+ URI.escape("#{service_url}/#{url_chunk}"),
88
88
  options[:typhoeus].merge({
89
89
  method: :get
90
90
  }).merge(additional_options)
@@ -168,7 +168,7 @@ module OData
168
168
  def metadata
169
169
  @metadata ||= lambda {
170
170
  request = ::Typhoeus::Request.new(
171
- "#{service_url}/$metadata",
171
+ URI.escape("#{service_url}/$metadata"),
172
172
  options[:typhoeus].merge({
173
173
  method: :get
174
174
  })
data/lib/odata/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module OData
2
- VERSION = '0.1.0'
2
+ VERSION = '0.2.0'
3
3
  end
@@ -0,0 +1,234 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <feed xml:base="http://services.odata.org/OData/OData.svc/" xmlns="http://www.w3.org/2005/Atom"
3
+ xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices"
4
+ xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata"
5
+ xmlns:georss="http://www.georss.org/georss" xmlns:gml="http://www.opengis.net/gml">
6
+ <id>http://services.odata.org/OData/OData.svc/Products</id>
7
+ <title type="text">Products</title>
8
+ <updated>2014-07-11T19:22:18Z</updated>
9
+ <link rel="self" title="Products" href="Products"/>
10
+ <entry>
11
+ <id>http://services.odata.org/OData/OData.svc/Products(1)</id>
12
+ <category term="ODataDemo.Product" scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme"/>
13
+ <link rel="edit" title="Product" href="Products(1)"/>
14
+ <link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/Categories"
15
+ type="application/atom+xml;type=feed" title="Categories" href="Products(1)/Categories"/>
16
+ <link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/Supplier"
17
+ type="application/atom+xml;type=entry" title="Supplier" href="Products(1)/Supplier"/>
18
+ <link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/ProductDetail"
19
+ type="application/atom+xml;type=entry" title="ProductDetail" href="Products(1)/ProductDetail"/>
20
+ <title type="text">Milk</title>
21
+ <summary type="text">Low fat milk</summary>
22
+ <updated>2014-07-11T19:22:18Z</updated>
23
+ <author>
24
+ <name/>
25
+ </author>
26
+ <link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/relatedlinks/Categories" type="application/xml"
27
+ title="Categories" href="Products(1)/$links/Categories"/>
28
+ <link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/relatedlinks/Supplier" type="application/xml"
29
+ title="Supplier" href="Products(1)/$links/Supplier"/>
30
+ <link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/relatedlinks/ProductDetail" type="application/xml"
31
+ title="ProductDetail" href="Products(1)/$links/ProductDetail"/>
32
+ <content type="application/xml">
33
+ <m:properties>
34
+ <d:ID m:type="Edm.Int32">1</d:ID>
35
+ <d:ReleaseDate m:type="Edm.DateTime">1995-10-01T00:00:00</d:ReleaseDate>
36
+ <d:DiscontinuedDate m:null="true"/>
37
+ <d:Rating m:type="Edm.Int16">3</d:Rating>
38
+ <d:Price m:type="Edm.Double">3.5</d:Price>
39
+ </m:properties>
40
+ </content>
41
+ </entry>
42
+ <entry>
43
+ <id>http://services.odata.org/OData/OData.svc/Products(2)</id>
44
+ <category term="ODataDemo.Product" scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme"/>
45
+ <link rel="edit" title="Product" href="Products(2)"/>
46
+ <link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/Categories"
47
+ type="application/atom+xml;type=feed" title="Categories" href="Products(2)/Categories"/>
48
+ <link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/Supplier"
49
+ type="application/atom+xml;type=entry" title="Supplier" href="Products(2)/Supplier"/>
50
+ <link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/ProductDetail"
51
+ type="application/atom+xml;type=entry" title="ProductDetail" href="Products(2)/ProductDetail"/>
52
+ <title type="text">Vint soda</title>
53
+ <summary type="text">Americana Variety - Mix of 6 flavors</summary>
54
+ <updated>2014-07-11T19:22:18Z</updated>
55
+ <author>
56
+ <name/>
57
+ </author>
58
+ <link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/relatedlinks/Categories" type="application/xml"
59
+ title="Categories" href="Products(2)/$links/Categories"/>
60
+ <link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/relatedlinks/Supplier" type="application/xml"
61
+ title="Supplier" href="Products(2)/$links/Supplier"/>
62
+ <link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/relatedlinks/ProductDetail" type="application/xml"
63
+ title="ProductDetail" href="Products(2)/$links/ProductDetail"/>
64
+ <content type="application/xml">
65
+ <m:properties>
66
+ <d:ID m:type="Edm.Int32">2</d:ID>
67
+ <d:ReleaseDate m:type="Edm.DateTime">2000-10-01T00:00:00</d:ReleaseDate>
68
+ <d:DiscontinuedDate m:null="true"/>
69
+ <d:Rating m:type="Edm.Int16">3</d:Rating>
70
+ <d:Price m:type="Edm.Double">20.9</d:Price>
71
+ </m:properties>
72
+ </content>
73
+ </entry>
74
+ <entry>
75
+ <id>http://services.odata.org/OData/OData.svc/Products(3)</id>
76
+ <category term="ODataDemo.Product" scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme"/>
77
+ <link rel="edit" title="Product" href="Products(3)"/>
78
+ <link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/Categories"
79
+ type="application/atom+xml;type=feed" title="Categories" href="Products(3)/Categories"/>
80
+ <link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/Supplier"
81
+ type="application/atom+xml;type=entry" title="Supplier" href="Products(3)/Supplier"/>
82
+ <link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/ProductDetail"
83
+ type="application/atom+xml;type=entry" title="ProductDetail" href="Products(3)/ProductDetail"/>
84
+ <title type="text">Havina Cola</title>
85
+ <summary type="text">The Original Key Lime Cola</summary>
86
+ <updated>2014-07-11T19:22:18Z</updated>
87
+ <author>
88
+ <name/>
89
+ </author>
90
+ <link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/relatedlinks/Categories" type="application/xml"
91
+ title="Categories" href="Products(3)/$links/Categories"/>
92
+ <link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/relatedlinks/Supplier" type="application/xml"
93
+ title="Supplier" href="Products(3)/$links/Supplier"/>
94
+ <link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/relatedlinks/ProductDetail" type="application/xml"
95
+ title="ProductDetail" href="Products(3)/$links/ProductDetail"/>
96
+ <content type="application/xml">
97
+ <m:properties>
98
+ <d:ID m:type="Edm.Int32">3</d:ID>
99
+ <d:ReleaseDate m:type="Edm.DateTime">2005-10-01T00:00:00</d:ReleaseDate>
100
+ <d:DiscontinuedDate m:type="Edm.DateTime">2006-10-01T00:00:00</d:DiscontinuedDate>
101
+ <d:Rating m:type="Edm.Int16">3</d:Rating>
102
+ <d:Price m:type="Edm.Double">19.9</d:Price>
103
+ </m:properties>
104
+ </content>
105
+ </entry>
106
+ <entry>
107
+ <id>http://services.odata.org/OData/OData.svc/Products(4)</id>
108
+ <category term="ODataDemo.Product" scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme"/>
109
+ <link rel="edit" title="Product" href="Products(4)"/>
110
+ <link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/Categories"
111
+ type="application/atom+xml;type=feed" title="Categories" href="Products(4)/Categories"/>
112
+ <link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/Supplier"
113
+ type="application/atom+xml;type=entry" title="Supplier" href="Products(4)/Supplier"/>
114
+ <link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/ProductDetail"
115
+ type="application/atom+xml;type=entry" title="ProductDetail" href="Products(4)/ProductDetail"/>
116
+ <title type="text">Fruit Punch</title>
117
+ <summary type="text">Mango flavor, 8.3 Ounce Cans (Pack of 24)</summary>
118
+ <updated>2014-07-11T19:22:18Z</updated>
119
+ <author>
120
+ <name/>
121
+ </author>
122
+ <link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/relatedlinks/Categories" type="application/xml"
123
+ title="Categories" href="Products(4)/$links/Categories"/>
124
+ <link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/relatedlinks/Supplier" type="application/xml"
125
+ title="Supplier" href="Products(4)/$links/Supplier"/>
126
+ <link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/relatedlinks/ProductDetail" type="application/xml"
127
+ title="ProductDetail" href="Products(4)/$links/ProductDetail"/>
128
+ <content type="application/xml">
129
+ <m:properties>
130
+ <d:ID m:type="Edm.Int32">4</d:ID>
131
+ <d:ReleaseDate m:type="Edm.DateTime">2003-01-05T00:00:00</d:ReleaseDate>
132
+ <d:DiscontinuedDate m:null="true"/>
133
+ <d:Rating m:type="Edm.Int16">3</d:Rating>
134
+ <d:Price m:type="Edm.Double">22.99</d:Price>
135
+ </m:properties>
136
+ </content>
137
+ </entry>
138
+ <entry>
139
+ <id>http://services.odata.org/OData/OData.svc/Products(5)</id>
140
+ <category term="ODataDemo.Product" scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme"/>
141
+ <link rel="edit" title="Product" href="Products(5)"/>
142
+ <link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/Categories"
143
+ type="application/atom+xml;type=feed" title="Categories" href="Products(5)/Categories"/>
144
+ <link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/Supplier"
145
+ type="application/atom+xml;type=entry" title="Supplier" href="Products(5)/Supplier"/>
146
+ <link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/ProductDetail"
147
+ type="application/atom+xml;type=entry" title="ProductDetail" href="Products(5)/ProductDetail"/>
148
+ <title type="text">Cranberry Juice</title>
149
+ <summary type="text">16-Ounce Plastic Bottles (Pack of 12)</summary>
150
+ <updated>2014-07-11T19:22:18Z</updated>
151
+ <author>
152
+ <name/>
153
+ </author>
154
+ <link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/relatedlinks/Categories" type="application/xml"
155
+ title="Categories" href="Products(5)/$links/Categories"/>
156
+ <link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/relatedlinks/Supplier" type="application/xml"
157
+ title="Supplier" href="Products(5)/$links/Supplier"/>
158
+ <link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/relatedlinks/ProductDetail" type="application/xml"
159
+ title="ProductDetail" href="Products(5)/$links/ProductDetail"/>
160
+ <content type="application/xml">
161
+ <m:properties>
162
+ <d:ID m:type="Edm.Int32">5</d:ID>
163
+ <d:ReleaseDate m:type="Edm.DateTime">2006-08-04T00:00:00</d:ReleaseDate>
164
+ <d:DiscontinuedDate m:null="true"/>
165
+ <d:Rating m:type="Edm.Int16">3</d:Rating>
166
+ <d:Price m:type="Edm.Double">22.8</d:Price>
167
+ </m:properties>
168
+ </content>
169
+ </entry>
170
+ <entry>
171
+ <id>http://services.odata.org/OData/OData.svc/Products(6)</id>
172
+ <category term="ODataDemo.Product" scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme"/>
173
+ <link rel="edit" title="Product" href="Products(6)"/>
174
+ <link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/Categories"
175
+ type="application/atom+xml;type=feed" title="Categories" href="Products(6)/Categories"/>
176
+ <link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/Supplier"
177
+ type="application/atom+xml;type=entry" title="Supplier" href="Products(6)/Supplier"/>
178
+ <link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/ProductDetail"
179
+ type="application/atom+xml;type=entry" title="ProductDetail" href="Products(6)/ProductDetail"/>
180
+ <title type="text">Pink Lemonade</title>
181
+ <summary type="text">36 Ounce Cans (Pack of 3)</summary>
182
+ <updated>2014-07-11T19:22:18Z</updated>
183
+ <author>
184
+ <name/>
185
+ </author>
186
+ <link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/relatedlinks/Categories" type="application/xml"
187
+ title="Categories" href="Products(6)/$links/Categories"/>
188
+ <link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/relatedlinks/Supplier" type="application/xml"
189
+ title="Supplier" href="Products(6)/$links/Supplier"/>
190
+ <link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/relatedlinks/ProductDetail" type="application/xml"
191
+ title="ProductDetail" href="Products(6)/$links/ProductDetail"/>
192
+ <content type="application/xml">
193
+ <m:properties>
194
+ <d:ID m:type="Edm.Int32">6</d:ID>
195
+ <d:ReleaseDate m:type="Edm.DateTime">2006-11-05T00:00:00</d:ReleaseDate>
196
+ <d:DiscontinuedDate m:null="true"/>
197
+ <d:Rating m:type="Edm.Int16">3</d:Rating>
198
+ <d:Price m:type="Edm.Double">18.8</d:Price>
199
+ </m:properties>
200
+ </content>
201
+ </entry>
202
+ <entry>
203
+ <id>http://services.odata.org/OData/OData.svc/Products(8)</id>
204
+ <category term="ODataDemo.Product" scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme"/>
205
+ <link rel="edit" title="Product" href="Products(8)"/>
206
+ <link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/Categories"
207
+ type="application/atom+xml;type=feed" title="Categories" href="Products(8)/Categories"/>
208
+ <link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/Supplier"
209
+ type="application/atom+xml;type=entry" title="Supplier" href="Products(8)/Supplier"/>
210
+ <link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/ProductDetail"
211
+ type="application/atom+xml;type=entry" title="ProductDetail" href="Products(8)/ProductDetail"/>
212
+ <title type="text">LCD HDTV</title>
213
+ <summary type="text">42 inch 1080p LCD with Built-in Blu-ray Disc Player</summary>
214
+ <updated>2014-07-11T19:22:18Z</updated>
215
+ <author>
216
+ <name/>
217
+ </author>
218
+ <link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/relatedlinks/Categories" type="application/xml"
219
+ title="Categories" href="Products(8)/$links/Categories"/>
220
+ <link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/relatedlinks/Supplier" type="application/xml"
221
+ title="Supplier" href="Products(8)/$links/Supplier"/>
222
+ <link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/relatedlinks/ProductDetail" type="application/xml"
223
+ title="ProductDetail" href="Products(8)/$links/ProductDetail"/>
224
+ <content type="application/xml">
225
+ <m:properties>
226
+ <d:ID m:type="Edm.Int32">8</d:ID>
227
+ <d:ReleaseDate m:type="Edm.DateTime">2008-05-08T00:00:00</d:ReleaseDate>
228
+ <d:DiscontinuedDate m:null="true"/>
229
+ <d:Rating m:type="Edm.Int16">3</d:Rating>
230
+ <d:Price m:type="Edm.Double">1088.8</d:Price>
231
+ </m:properties>
232
+ </content>
233
+ </entry>
234
+ </feed>
@@ -0,0 +1,42 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <feed xml:base="http://services.odata.org/OData/OData.svc/" xmlns="http://www.w3.org/2005/Atom"
3
+ xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices"
4
+ xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata"
5
+ xmlns:georss="http://www.georss.org/georss" xmlns:gml="http://www.opengis.net/gml">
6
+ <id>http://services.odata.org/OData/OData.svc/Products</id>
7
+ <title type="text">Products</title>
8
+ <updated>2014-07-11T19:20:06Z</updated>
9
+ <link rel="self" title="Products" href="Products"/>
10
+ <entry>
11
+ <id>http://services.odata.org/OData/OData.svc/Products(0)</id>
12
+ <category term="ODataDemo.Product" scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme"/>
13
+ <link rel="edit" title="Product" href="Products(0)"/>
14
+ <link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/Categories"
15
+ type="application/atom+xml;type=feed" title="Categories" href="Products(0)/Categories"/>
16
+ <link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/Supplier"
17
+ type="application/atom+xml;type=entry" title="Supplier" href="Products(0)/Supplier"/>
18
+ <link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/ProductDetail"
19
+ type="application/atom+xml;type=entry" title="ProductDetail" href="Products(0)/ProductDetail"/>
20
+ <title type="text">Bread</title>
21
+ <summary type="text">Whole grain bread</summary>
22
+ <updated>2014-07-11T19:20:06Z</updated>
23
+ <author>
24
+ <name/>
25
+ </author>
26
+ <link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/relatedlinks/Categories" type="application/xml"
27
+ title="Categories" href="Products(0)/$links/Categories"/>
28
+ <link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/relatedlinks/Supplier" type="application/xml"
29
+ title="Supplier" href="Products(0)/$links/Supplier"/>
30
+ <link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/relatedlinks/ProductDetail" type="application/xml"
31
+ title="ProductDetail" href="Products(0)/$links/ProductDetail"/>
32
+ <content type="application/xml">
33
+ <m:properties>
34
+ <d:ID m:type="Edm.Int32">0</d:ID>
35
+ <d:ReleaseDate m:type="Edm.DateTime">1992-01-01T00:00:00</d:ReleaseDate>
36
+ <d:DiscontinuedDate m:null="true"/>
37
+ <d:Rating m:type="Edm.Int16">4</d:Rating>
38
+ <d:Price m:type="Edm.Double">2.5</d:Price>
39
+ </m:properties>
40
+ </content>
41
+ </entry>
42
+ </feed>
@@ -0,0 +1,5 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <m:error xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata">
3
+ <m:code/>
4
+ <m:message xml:lang="en-US">Resource not found for the segment 'Products'.</m:message>
5
+ </m:error>
@@ -11,7 +11,14 @@ describe OData::EntitySet do
11
11
  OData::Service.open('http://services.odata.org/OData/OData.svc')
12
12
  end
13
13
 
14
- it { expect(subject).to respond_to(:name, :type, :container, :namespace, :new_entity) }
14
+ it { expect(subject).to respond_to(:name) }
15
+ it { expect(subject).to respond_to(:type) }
16
+ it { expect(subject).to respond_to(:container) }
17
+ it { expect(subject).to respond_to(:namespace) }
18
+ it { expect(subject).to respond_to(:new_entity) }
19
+ it { expect(subject).to respond_to(:filter) }
20
+ it { expect(subject).to respond_to(:[]) }
21
+ it { expect(subject).to respond_to(:<<) }
15
22
 
16
23
  it { expect(subject.name).to eq('Products') }
17
24
  it { expect(subject.container).to eq('DemoService') }
@@ -58,6 +65,31 @@ describe OData::EntitySet do
58
65
  it { expect(new_entity['Price']).to eq(3.5) }
59
66
  end
60
67
 
68
+ describe '#filter' do
69
+ let(:one_entity) { "Name eq 'Bread'" }
70
+ let(:many_entities) { 'Rating eq 3' }
71
+
72
+ it { expect(subject.filter(one_entity)).to be_a(Array) }
73
+ it { expect(subject.filter(one_entity).first).to be_a(OData::Entity) }
74
+
75
+ it { expect(subject.filter(many_entities)).to be_a(Array) }
76
+ it do
77
+ subject.filter(one_entity).each do |entity|
78
+ expect(entity).to be_a(OData::Entity)
79
+ end
80
+ end
81
+ end
82
+
83
+ describe '#[]' do
84
+ let(:existing_entity) { subject[0] }
85
+ let(:nonexistant_entity) { subject[99] }
86
+
87
+ it { expect(existing_entity).to be_a(OData::Entity) }
88
+ it { expect(existing_entity['ID']).to eq(0) }
89
+
90
+ it { expect(nonexistant_entity).to be_nil }
91
+ end
92
+
61
93
  describe '#<<' do
62
94
  let(:new_entity) { subject.new_entity(properties) }
63
95
  let(:bad_entity) { subject.new_entity }
@@ -71,8 +103,6 @@ describe OData::EntitySet do
71
103
  Price: 3.5
72
104
  } }
73
105
 
74
- it { expect(subject).to respond_to(:<<) }
75
-
76
106
  it 'with an existing entity' do
77
107
  WebMock.stub_request(:post, 'http://services.odata.org/OData/OData.svc/Products(0)').
78
108
  to_return(status: 200, body: File.open('spec/fixtures/sample_service/product_0.xml'))
@@ -0,0 +1,36 @@
1
+ require 'spec_helper'
2
+
3
+ describe OData::Query::Criteria do
4
+ let(:subject) { OData::Query::Criteria.new(operation: 'filter', argument: "Name eq 'Bread'") }
5
+ let(:valid_operations) { [:filter, :order_by, :skip, :top, :select, :expand, :inline_count] }
6
+
7
+ it { expect(subject).to respond_to(:operation) }
8
+ it { expect(subject).to respond_to(:argument) }
9
+
10
+ it { expect(subject.operation).to eq(:filter) }
11
+ it { expect(subject.argument).to eq("Name eq 'Bread'")}
12
+
13
+ it 'should require operation option' do
14
+ expect {
15
+ OData::Query::Criteria.new(argument: 'test')
16
+ }.to raise_error(ArgumentError, 'Missing required option: operation')
17
+ end
18
+
19
+ it 'should require argument option' do
20
+ expect {
21
+ OData::Query::Criteria.new(operation: 'filter')
22
+ }.to raise_error(ArgumentError, 'Missing required option: argument')
23
+ end
24
+
25
+ it 'should validate operation option' do
26
+ valid_operations.each do |operation|
27
+ expect {
28
+ OData::Query::Criteria.new(operation: operation, argument: 'test')
29
+ }.to_not raise_error
30
+ end
31
+
32
+ expect {
33
+ OData::Query::Criteria.new(operation: 'invalid', argument: 'test')
34
+ }.to raise_error(ArgumentError, 'Operation not supported: invalid')
35
+ end
36
+ end
@@ -0,0 +1,58 @@
1
+ require 'spec_helper'
2
+
3
+ describe OData::Query do
4
+ let(:subject) { OData::Query.new('Products') }
5
+
6
+ it { expect(subject).to respond_to(:<<) }
7
+ it { expect(subject).to respond_to(:to_s) }
8
+
9
+ it { expect(subject.to_s).to eq('Products')}
10
+
11
+ it 'handles pagination operations' do
12
+ skip_criteria = OData::Query::Criteria.new(operation: 'skip', argument: 5)
13
+ top_criteria = OData::Query::Criteria.new(operation: 'top', argument: 5)
14
+ subject << top_criteria
15
+ subject << skip_criteria
16
+ expect(subject.to_s).to eq('Products?$skip=5&$top=5')
17
+ end
18
+
19
+ it 'handles inline_count operations' do
20
+ criteria = OData::Query::Criteria.new(operation: 'inline_count', argument: 'allpages')
21
+ subject << criteria
22
+ expect(subject.to_s).to eq('Products?$inlinecount=allpages')
23
+ end
24
+
25
+ it 'handles select operations' do
26
+ criteria1 = OData::Query::Criteria.new(operation: 'select', argument: 'Name')
27
+ criteria2 = OData::Query::Criteria.new(operation: 'select', argument: 'Rating')
28
+ criteria3 = OData::Query::Criteria.new(operation: 'select', argument: 'Price')
29
+ subject << criteria1
30
+ subject << criteria2
31
+ subject << criteria3
32
+ expect(subject.to_s).to eq('Products?$select=Name,Rating,Price')
33
+ end
34
+
35
+ it 'handles expand operations' do
36
+ criteria1 = OData::Query::Criteria.new(operation: 'expand', argument: 'Supplier')
37
+ criteria2 = OData::Query::Criteria.new(operation: 'expand', argument: 'ProductDetail')
38
+ subject << criteria1
39
+ subject << criteria2
40
+ expect(subject.to_s).to eq('Products?$expand=Supplier,ProductDetail')
41
+ end
42
+
43
+ it 'handles order_by operations' do
44
+ criteria1 = OData::Query::Criteria.new(operation: 'order_by', argument: 'Price')
45
+ criteria2 = OData::Query::Criteria.new(operation: 'order_by', argument: 'Rating desc')
46
+ subject << criteria1
47
+ subject << criteria2
48
+ expect(subject.to_s).to eq('Products?$orderby=Price,Rating desc')
49
+ end
50
+
51
+ it 'handles filter operations' do
52
+ criteria1 = OData::Query::Criteria.new(operation: 'filter', argument: 'Rating gt 2')
53
+ criteria2 = OData::Query::Criteria.new(operation: 'filter', argument: 'Price lt 15')
54
+ subject << criteria1
55
+ subject << criteria2
56
+ expect(subject.to_s).to eq('Products?$filter=Rating gt 2 and Price lt 15')
57
+ end
58
+ end
data/spec/spec_helper.rb CHANGED
@@ -62,6 +62,15 @@ RSpec.configure do |config|
62
62
 
63
63
  WebMock.stub_request(:get, 'http://services.odata.org/OData/OData.svc/Products(0)').
64
64
  to_return(status: 200, body: File.open('spec/fixtures/sample_service/product_0.xml'))
65
+
66
+ WebMock.stub_request(:get, 'http://services.odata.org/OData/OData.svc/Products(99)').
67
+ to_return(status: 404, body: File.open('spec/fixtures/sample_service/product_not_found.xml'))
68
+
69
+ WebMock.stub_request(:get, "http://services.odata.org/OData/OData.svc/Products?$filter=Name eq 'Bread'").
70
+ to_return(status: 200, body: File.open('spec/fixtures/sample_service/product_filter_one.xml'))
71
+
72
+ WebMock.stub_request(:get, 'http://services.odata.org/OData/OData.svc/Products?$filter=Rating%20eq%203').
73
+ to_return(status: 200, body: File.open('spec/fixtures/sample_service/product_filter_many.xml'))
65
74
  end
66
75
  end
67
76
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: odata
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - James Thompson
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-07-07 00:00:00.000000000 Z
11
+ date: 2014-07-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -196,6 +196,8 @@ files:
196
196
  - lib/odata/properties/string.rb
197
197
  - lib/odata/properties/time.rb
198
198
  - lib/odata/property.rb
199
+ - lib/odata/query.rb
200
+ - lib/odata/query/criteria.rb
199
201
  - lib/odata/railtie.rb
200
202
  - lib/odata/service.rb
201
203
  - lib/odata/service_registry.rb
@@ -205,6 +207,9 @@ files:
205
207
  - spec/fixtures/sample_service/metadata.xml
206
208
  - spec/fixtures/sample_service/product_0.xml
207
209
  - spec/fixtures/sample_service/product_9999.xml
210
+ - spec/fixtures/sample_service/product_filter_many.xml
211
+ - spec/fixtures/sample_service/product_filter_one.xml
212
+ - spec/fixtures/sample_service/product_not_found.xml
208
213
  - spec/fixtures/sample_service/products.xml
209
214
  - spec/fixtures/sample_service/products_skip0_top5.xml
210
215
  - spec/fixtures/sample_service/products_skip10_top5.xml
@@ -222,6 +227,8 @@ files:
222
227
  - spec/odata/properties/string_spec.rb
223
228
  - spec/odata/properties/time_spec.rb
224
229
  - spec/odata/property_spec.rb
230
+ - spec/odata/query/criteria_spec.rb
231
+ - spec/odata/query_spec.rb
225
232
  - spec/odata/service_registry_spec.rb
226
233
  - spec/odata/service_spec.rb
227
234
  - spec/spec_helper.rb
@@ -254,6 +261,9 @@ test_files:
254
261
  - spec/fixtures/sample_service/metadata.xml
255
262
  - spec/fixtures/sample_service/product_0.xml
256
263
  - spec/fixtures/sample_service/product_9999.xml
264
+ - spec/fixtures/sample_service/product_filter_many.xml
265
+ - spec/fixtures/sample_service/product_filter_one.xml
266
+ - spec/fixtures/sample_service/product_not_found.xml
257
267
  - spec/fixtures/sample_service/products.xml
258
268
  - spec/fixtures/sample_service/products_skip0_top5.xml
259
269
  - spec/fixtures/sample_service/products_skip10_top5.xml
@@ -271,6 +281,8 @@ test_files:
271
281
  - spec/odata/properties/string_spec.rb
272
282
  - spec/odata/properties/time_spec.rb
273
283
  - spec/odata/property_spec.rb
284
+ - spec/odata/query/criteria_spec.rb
285
+ - spec/odata/query_spec.rb
274
286
  - spec/odata/service_registry_spec.rb
275
287
  - spec/odata/service_spec.rb
276
288
  - spec/spec_helper.rb