patchboard 0.4.2 → 0.4.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/patchboard/action.rb +9 -2
- data/lib/patchboard/api.rb +19 -20
- data/lib/patchboard/resource.rb +34 -25
- data/lib/patchboard/schema_manager.rb +0 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 46fe7f3a6e42bd2248df577e00d2bf4ebff0de19
|
4
|
+
data.tar.gz: e5cbc55c390be6754d739326283058c2d120f71c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8d5bd558a0d07e437dab031f50f291eb82ae334492f8c4bf2284b859b66077f7938224bfa661ea82c926b94880fc3ca060c9fad9ee5bf1e58f2131dd72c821af
|
7
|
+
data.tar.gz: 5096c602c6aee31da7d65dffb3efe1fec7d1539efdd47854dd16c833118c3e23ff3f57b1dc442bb4d46f1df7cf8071cbc3b81ce01ef2236f4b92cc986e7666b7
|
data/lib/patchboard/action.rb
CHANGED
@@ -43,8 +43,7 @@ class Patchboard
|
|
43
43
|
raw = self.http.request @method, url, options.merge(:response => :object)
|
44
44
|
response = Response.new(raw)
|
45
45
|
if response.status != @status
|
46
|
-
|
47
|
-
raise "Unexpected response status: #{response.status}"
|
46
|
+
raise ResponseError.new(response.status, response.body), "Unexpected response status: #{response.status} - #{response.body}"
|
48
47
|
end
|
49
48
|
out = @api.decorate(resource.context, @response_schema, response.data)
|
50
49
|
out.response = response
|
@@ -100,7 +99,15 @@ class Patchboard
|
|
100
99
|
end
|
101
100
|
|
102
101
|
|
102
|
+
class ResponseError < StandardError
|
103
|
+
attr_reader :status
|
104
|
+
attr_reader :body
|
103
105
|
|
106
|
+
def initialize(status, body)
|
107
|
+
@status = status
|
108
|
+
@body = body
|
109
|
+
end
|
110
|
+
end
|
104
111
|
|
105
112
|
end
|
106
113
|
|
data/lib/patchboard/api.rb
CHANGED
@@ -47,38 +47,37 @@ class Patchboard
|
|
47
47
|
else
|
48
48
|
# Otherwise traverse the schema in search of subschemas that have
|
49
49
|
# resource classes available.
|
50
|
-
|
51
|
-
|
50
|
+
|
51
|
+
if schema[:items]
|
52
52
|
# TODO: handle the case where schema.items is an array, which
|
53
53
|
# signifies a tuple. schema.additionalItems then becomes important.
|
54
54
|
array = data.map! do |item|
|
55
55
|
self.decorate(context, schema[:items], item)
|
56
56
|
end
|
57
57
|
data = ArrayResource.new(array)
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
58
|
+
end
|
59
|
+
|
60
|
+
if schema[:properties]
|
61
|
+
schema[:properties].each do |key, prop_schema|
|
62
|
+
if value = data[key]
|
63
|
+
data[key] = self.decorate(context, prop_schema, value)
|
64
64
|
end
|
65
65
|
end
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
end
|
66
|
+
end
|
67
|
+
|
68
|
+
if schema[:additionalProperties]
|
69
|
+
data.each do |key, value|
|
70
|
+
next if schema[:properties] && schema[:properties][key]
|
71
|
+
data[key] = self.decorate(context, schema[:additionalProperties], value)
|
73
72
|
end
|
73
|
+
end
|
74
|
+
|
75
|
+
if data.is_a? Hash
|
74
76
|
data = Hashie::Mash.new data
|
75
|
-
else
|
76
|
-
if data.is_a? Hash
|
77
|
-
data = Hashie::Mash.new data
|
78
|
-
end
|
79
77
|
end
|
78
|
+
data
|
80
79
|
end
|
81
|
-
|
80
|
+
|
82
81
|
end
|
83
82
|
|
84
83
|
end
|
data/lib/patchboard/resource.rb
CHANGED
@@ -17,20 +17,45 @@ class Patchboard
|
|
17
17
|
schema
|
18
18
|
end
|
19
19
|
|
20
|
+
# FIXME: break this out into multiple methods.
|
20
21
|
if schema && schema[:properties]
|
21
22
|
schema[:properties].each do |name, definition|
|
22
|
-
|
23
|
-
|
23
|
+
|
24
|
+
if property_mapping = self.api.find_mapping(definition)
|
25
|
+
if property_mapping.query
|
26
|
+
define_method name do |params={}|
|
27
|
+
params[:url] = @attributes[name][:url]
|
28
|
+
url = property_mapping.generate_url(params)
|
29
|
+
property_mapping.klass.new self.context, :url => url
|
30
|
+
end
|
31
|
+
else
|
32
|
+
define_method name do
|
33
|
+
property_mapping.klass.new self.context, @attributes[name]
|
34
|
+
end
|
35
|
+
end
|
36
|
+
else
|
37
|
+
define_method name do
|
38
|
+
@attributes[name]
|
39
|
+
end
|
24
40
|
end
|
41
|
+
|
25
42
|
end
|
26
43
|
end
|
27
44
|
|
45
|
+
|
46
|
+
# When an additionalProperties schema is defined, the resource can
|
47
|
+
# contain top-level attributes that should obey that schema.
|
28
48
|
if schema && schema[:additionalProperties] != false
|
29
|
-
|
30
|
-
|
49
|
+
|
50
|
+
if (add_mapping = self.api.find_mapping(schema)) && (add_mapping.query)
|
51
|
+
define_method :method_missing do |name, params|
|
52
|
+
params[:url] = @attributes[name][:url]
|
53
|
+
url = add_mapping.generate_url(params)
|
54
|
+
add_mapping.klass.new self.context, :url => url
|
55
|
+
end
|
56
|
+
else
|
57
|
+
define_method :method_missing do |name|
|
31
58
|
@attributes[name.to_sym]
|
32
|
-
else
|
33
|
-
super(name, *args, &block)
|
34
59
|
end
|
35
60
|
end
|
36
61
|
end
|
@@ -53,26 +78,10 @@ class Patchboard
|
|
53
78
|
# TODO: add some sort of validation for the input attributes.
|
54
79
|
# Hey, we have a JSON Schema, why not use it?
|
55
80
|
if self.schema && (properties = self.schema[:properties])
|
56
|
-
context = instance.context
|
57
81
|
properties.each do |key, sub_schema|
|
58
|
-
|
59
|
-
|
60
|
-
if mapping = self.api.find_mapping(sub_schema)
|
61
|
-
if mapping.query
|
62
|
-
# TODO: find a way to define this at runtime, not once
|
63
|
-
# for every instance.
|
64
|
-
instance.define_singleton_method key do |params={}|
|
65
|
-
params[:url] = value[:url]
|
66
|
-
url = mapping.generate_url(params)
|
67
|
-
mapping.klass.new context, :url => url
|
68
|
-
end
|
69
|
-
else
|
70
|
-
attributes[key] = mapping.klass.new context, value
|
71
|
-
end
|
72
|
-
else
|
73
|
-
attributes[key] = self.api.decorate(context, sub_schema, value)
|
82
|
+
if (value = attributes[key]) && !self.api.find_mapping(sub_schema)
|
83
|
+
attributes[key] = self.api.decorate(instance.context, sub_schema, value)
|
74
84
|
end
|
75
|
-
|
76
85
|
end
|
77
86
|
end
|
78
87
|
attributes
|
@@ -91,7 +100,7 @@ class Patchboard
|
|
91
100
|
id = "%x" % (self.object_id << 1)
|
92
101
|
%Q{
|
93
102
|
#<#{self.class}:0x#{id}
|
94
|
-
@url="#{@url}"
|
103
|
+
@url="#{@url}">
|
95
104
|
}.strip
|
96
105
|
end
|
97
106
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: patchboard
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Matthew King
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-07-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: json
|