service_contract 0.0.6 → 0.0.7
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/Rakefile +2 -1
- data/lib/service_contract/abstract_parameter.rb +4 -0
- data/lib/service_contract/assertions.rb +16 -3
- data/lib/service_contract/avro/parameter.rb +11 -0
- data/lib/service_contract/version.rb +1 -1
- data/test/assertions_test.rb +40 -0
- data/test/sample/1/compiled/location.avpr +6 -12
- data/test/sample/1/source/location.avdl +1 -4
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ee4858e3b13b2a6f81dcec74ed7fe5bf0844bd1e
|
4
|
+
data.tar.gz: f96f3c732a2fb5ecab8268cfda2a2e86048d7431
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 823d6d06c37ad5dbb1c876e537f874910ffa0a8f98bfa5eb8a9090d9bcb4e94b9618158b51a21dfb2205e61317bd9caced1a7203ee74ee864443d504f72dedc7
|
7
|
+
data.tar.gz: 3f5e6cca2da6c3fefa541290d17a7877468b52fb9b28bcb51ce6300c9c4ed23aa3a2d745b0b0c7856c34ac097fa2aaa5bce58e7329ce24b89310eb18709e05d3
|
data/Rakefile
CHANGED
@@ -13,11 +13,20 @@ module ServiceContract
|
|
13
13
|
end
|
14
14
|
else
|
15
15
|
type.fields.each do |field|
|
16
|
-
|
17
|
-
|
16
|
+
value = data.fetch(field.name) do
|
17
|
+
data.fetch(field.name.to_sym) do
|
18
|
+
assert false, "expected #{type.name} to have attribute: #{field.name}"
|
19
|
+
end
|
20
|
+
end
|
18
21
|
|
19
22
|
expected_classes = classes_for_parameter(field)
|
20
23
|
assert (allow_nil && value.nil?) || expected_classes.any?{|klass| value.is_a?(klass)}, "expected #{type.name}.#{field.name} to be a #{expected_classes.join(", ")}"
|
24
|
+
|
25
|
+
if field.type == "array"
|
26
|
+
value.each do |val|
|
27
|
+
assert_data_matches_type(val, field.subtype)
|
28
|
+
end
|
29
|
+
end
|
21
30
|
end
|
22
31
|
end
|
23
32
|
end
|
@@ -25,7 +34,11 @@ module ServiceContract
|
|
25
34
|
protected
|
26
35
|
|
27
36
|
def classes_for_parameter(field)
|
28
|
-
|
37
|
+
type = field.type
|
38
|
+
type = type.type_sym.to_s if type.respond_to?(:type_sym)
|
39
|
+
classes = case type
|
40
|
+
when "array"
|
41
|
+
Array
|
29
42
|
when "int"
|
30
43
|
Fixnum
|
31
44
|
when "string"
|
@@ -11,6 +11,17 @@ module ServiceContract
|
|
11
11
|
definition.type.type_sym.to_s
|
12
12
|
end
|
13
13
|
|
14
|
+
def subtype
|
15
|
+
item = definition.type.is_a?(::Avro::Schema::ArraySchema) ?
|
16
|
+
definition.type.items :
|
17
|
+
nil
|
18
|
+
return nil unless item
|
19
|
+
|
20
|
+
item.is_a?(::Avro::Schema::PrimitiveSchema) ?
|
21
|
+
item.type_sym.to_s :
|
22
|
+
item
|
23
|
+
end
|
24
|
+
|
14
25
|
def default
|
15
26
|
definition.default
|
16
27
|
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class AssertionsTest < Minitest::Test
|
4
|
+
include ServiceContract::Assertions
|
5
|
+
|
6
|
+
def test_data_matching
|
7
|
+
service = SampleService.find(1)
|
8
|
+
assert service, "expect to find a service by version"
|
9
|
+
assert_equal "1", service.version
|
10
|
+
|
11
|
+
assert_equal 2, service.protocols.length
|
12
|
+
protocol = service.protocol("location")
|
13
|
+
endpoint = protocol.endpoint("index")
|
14
|
+
|
15
|
+
data = [{
|
16
|
+
id: 1,
|
17
|
+
type: 'state',
|
18
|
+
county_name: nil,
|
19
|
+
state_name: 'Washington',
|
20
|
+
country_name: 'United States',
|
21
|
+
city_name: nil,
|
22
|
+
neighborhood_name: nil,
|
23
|
+
postal_code_name: nil,
|
24
|
+
latitude: 47.6097,
|
25
|
+
longitude: 122.3331,
|
26
|
+
population: 634_535,
|
27
|
+
foo: [
|
28
|
+
{
|
29
|
+
timestamp: 1410278741
|
30
|
+
}
|
31
|
+
],
|
32
|
+
updated_at: {
|
33
|
+
timestamp: 1410278741
|
34
|
+
}
|
35
|
+
}]
|
36
|
+
|
37
|
+
assert_endpoint_response(data, endpoint)
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
@@ -37,18 +37,6 @@
|
|
37
37
|
}, {
|
38
38
|
"name" : "postal_code_name",
|
39
39
|
"type" : "string"
|
40
|
-
}, {
|
41
|
-
"name" : "to_location",
|
42
|
-
"type" : "string"
|
43
|
-
}, {
|
44
|
-
"name" : "to_short_location",
|
45
|
-
"type" : "string"
|
46
|
-
}, {
|
47
|
-
"name" : "to_long_location",
|
48
|
-
"type" : "string"
|
49
|
-
}, {
|
50
|
-
"name" : "to_location_with_region",
|
51
|
-
"type" : "string"
|
52
40
|
}, {
|
53
41
|
"name" : "latitude",
|
54
42
|
"type" : "float"
|
@@ -58,6 +46,12 @@
|
|
58
46
|
}, {
|
59
47
|
"name" : "population",
|
60
48
|
"type" : "int"
|
49
|
+
}, {
|
50
|
+
"name" : "foo",
|
51
|
+
"type" : {
|
52
|
+
"type" : "array",
|
53
|
+
"items" : "Timestamp"
|
54
|
+
}
|
61
55
|
}, {
|
62
56
|
"name" : "updated_at",
|
63
57
|
"type" : "Timestamp"
|
@@ -17,13 +17,10 @@ protocol Location {
|
|
17
17
|
string city_name;
|
18
18
|
string neighborhood_name;
|
19
19
|
string postal_code_name;
|
20
|
-
string to_location;
|
21
|
-
string to_short_location;
|
22
|
-
string to_long_location;
|
23
|
-
string to_location_with_region;
|
24
20
|
float latitude;
|
25
21
|
float longitude;
|
26
22
|
int population;
|
23
|
+
array<Timestamp> foo;
|
27
24
|
Timestamp updated_at;
|
28
25
|
}
|
29
26
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: service_contract
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jeff Ching
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-09-
|
11
|
+
date: 2014-09-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: avro
|
@@ -104,6 +104,7 @@ files:
|
|
104
104
|
- lib/service_contract/version.rb
|
105
105
|
- service_contract.gemspec
|
106
106
|
- src/avro-tools-1.7.7.jar
|
107
|
+
- test/assertions_test.rb
|
107
108
|
- test/sample/1/compiled/location.avpr
|
108
109
|
- test/sample/1/compiled/sales_region.avpr
|
109
110
|
- test/sample/1/source/location.avdl
|
@@ -135,6 +136,7 @@ signing_key:
|
|
135
136
|
specification_version: 4
|
136
137
|
summary: Abstract the definition of a service's interface contract
|
137
138
|
test_files:
|
139
|
+
- test/assertions_test.rb
|
138
140
|
- test/sample/1/compiled/location.avpr
|
139
141
|
- test/sample/1/compiled/sales_region.avpr
|
140
142
|
- test/sample/1/source/location.avdl
|