heroics 0.0.16 → 0.0.17
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/lib/heroics/client.rb +7 -2
- data/lib/heroics/client_generator.rb +6 -2
- data/lib/heroics/link.rb +13 -3
- data/lib/heroics/version.rb +1 -1
- data/lib/heroics/views/client.erb +13 -5
- data/test/client_test.rb +38 -0
- data/test/helper.rb +22 -1
- data/test/schema_test.rb +1 -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: db15e29f26b3dba405af8b01a48edcad2d2d7acd
|
4
|
+
data.tar.gz: 3854c7caff8cd64471b6b57b58c2ab807d971a48
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a01a0b5e5f9662efd580ab1f4c869907c017baa43ca5faa0c0179c6593547d58a01fd33b4d285215420ebc01c0819f2ade58153368e0bfb304c9f268de6146f0
|
7
|
+
data.tar.gz: e47f14886442b6739220abb5fccd561db5e73885daab3b595c034ef6540a21e9265bf6837690f49cb6b964b953c27422c2794e8c84dc4ec1471c1cade5006208
|
data/lib/heroics/client.rb
CHANGED
@@ -18,10 +18,15 @@ module Heroics
|
|
18
18
|
# @raise [NoMethodError] Raised if the name doesn't match a known resource.
|
19
19
|
# @return [Resource] The resource matching the name.
|
20
20
|
def method_missing(name)
|
21
|
-
name = name.to_s
|
21
|
+
name = name.to_s
|
22
22
|
resource = @resources[name]
|
23
23
|
if resource.nil?
|
24
|
-
|
24
|
+
# Try substituting underscores for dashes
|
25
|
+
name = name.to_s.gsub('_', '-')
|
26
|
+
resource = @resources[name]
|
27
|
+
if resource.nil?
|
28
|
+
raise NoMethodError.new("undefined method `#{name}' for #{to_s}")
|
29
|
+
end
|
25
30
|
end
|
26
31
|
resource
|
27
32
|
end
|
@@ -80,8 +80,12 @@ module Heroics
|
|
80
80
|
end
|
81
81
|
end
|
82
82
|
|
83
|
-
#
|
84
|
-
|
83
|
+
# list of parameters for method signature, body is optional
|
84
|
+
def method_signature
|
85
|
+
@parameters.map { |info| info.name == 'body' ? "body = {}" : info.name }.join(', ')
|
86
|
+
end
|
87
|
+
|
88
|
+
# list of parameters to pass along from method signature to client calls
|
85
89
|
def parameter_names
|
86
90
|
@parameters.map { |info| info.name }.join(', ')
|
87
91
|
end
|
data/lib/heroics/link.rb
CHANGED
@@ -48,14 +48,24 @@ module Heroics
|
|
48
48
|
path = "#{@path_prefix}#{path}" unless @path_prefix == '/'
|
49
49
|
headers = @default_headers
|
50
50
|
if body
|
51
|
-
|
52
|
-
|
51
|
+
case @link_schema.method
|
52
|
+
when :put, :post, :patch
|
53
|
+
headers = headers.merge({'Content-Type' => @link_schema.content_type})
|
54
|
+
body = @link_schema.encode(body)
|
55
|
+
when :get, :delete
|
56
|
+
if body.is_a?(Hash)
|
57
|
+
query = body
|
58
|
+
else
|
59
|
+
query = MultiJson.load(body)
|
60
|
+
end
|
61
|
+
body = nil
|
62
|
+
end
|
53
63
|
end
|
54
64
|
|
55
65
|
connection = Excon.new(@root_url, thread_safe_sockets: true)
|
56
66
|
response = request_with_cache(connection,
|
57
67
|
method: @link_schema.method, path: path,
|
58
|
-
headers: headers, body: body,
|
68
|
+
headers: headers, body: body, query: query,
|
59
69
|
expects: [200, 201, 202, 204, 206])
|
60
70
|
content_type = response.headers['Content-Type']
|
61
71
|
if content_type && content_type =~ /application\/.*json/
|
data/lib/heroics/version.rb
CHANGED
@@ -11,19 +11,27 @@ require 'heroics'
|
|
11
11
|
require 'uri'
|
12
12
|
|
13
13
|
module <%= @module_name %>
|
14
|
-
# Get a Client configured to use HTTP Basic authentication.
|
14
|
+
# Get a Client configured to use HTTP Basic or header-based authentication.
|
15
15
|
#
|
16
16
|
# @param api_key [String] The API key to use when connecting.
|
17
17
|
# @param options [Hash<Symbol,String>] Optionally, custom settings
|
18
18
|
# to use with the client. Allowed options are `default_headers`,
|
19
19
|
# `cache`, `user` and `url`.
|
20
20
|
# @return [Client] A client configured to use the API with HTTP Basic
|
21
|
-
# authentication.
|
21
|
+
# or header-based authentication.
|
22
22
|
def self.connect(api_key, options=nil)
|
23
23
|
options = custom_options(options)
|
24
24
|
uri = URI.parse(options[:url])
|
25
|
-
|
26
|
-
|
25
|
+
|
26
|
+
if options[:user]
|
27
|
+
uri.user = URI.encode_www_form_component options[:user]
|
28
|
+
end
|
29
|
+
|
30
|
+
if api_key
|
31
|
+
uri.user ||= 'user'
|
32
|
+
uri.password = api_key
|
33
|
+
end
|
34
|
+
|
27
35
|
client = Heroics.client_from_schema(SCHEMA, uri.to_s, options)
|
28
36
|
Client.new(client)
|
29
37
|
end
|
@@ -116,7 +124,7 @@ module <%= @module_name %>
|
|
116
124
|
# @param <%= parameter.name %>: <%= parameter.description %>
|
117
125
|
<% end %>
|
118
126
|
<% end %>
|
119
|
-
def <%= link.name %>(<%= link.
|
127
|
+
def <%= link.name %>(<%= link.method_signature %>)
|
120
128
|
@client.<%= resource.name %>.<%= link.name %>(<%= link.parameter_names %>)
|
121
129
|
end
|
122
130
|
<% end %>
|
data/test/client_test.rb
CHANGED
@@ -45,6 +45,23 @@ class ClientTest < MiniTest::Unit::TestCase
|
|
45
45
|
assert_equal('Hello, world!', client.resource.link)
|
46
46
|
end
|
47
47
|
|
48
|
+
# Client.<resource>.<link> finds the appropriate link and invokes it with
|
49
|
+
# query params, since it is a GET resource
|
50
|
+
def test_resource_with_query_param
|
51
|
+
schema = Heroics::Schema.new(SAMPLE_SCHEMA)
|
52
|
+
link = Heroics::Link.new('https://username:secret@example.com',
|
53
|
+
schema.resource('resource').link('list'))
|
54
|
+
resource = Heroics::Resource.new({'link' => link})
|
55
|
+
client = Heroics::Client.new({'resource' => resource},
|
56
|
+
'http://example.com')
|
57
|
+
Excon.stub(method: :get) do |request|
|
58
|
+
assert_equal({:limit => '50', :page => '25'}, request[:query])
|
59
|
+
Excon.stubs.pop
|
60
|
+
{status: 200, body: 'Hello, world!'}
|
61
|
+
end
|
62
|
+
assert_equal('Hello, world!', client.resource.link(limit: '50', page: '25'))
|
63
|
+
end
|
64
|
+
|
48
65
|
# Client converts underscores in resource method names to dashes to match
|
49
66
|
# names specified in the schema.
|
50
67
|
def test_resource_with_dashed_name
|
@@ -65,6 +82,27 @@ class ClientTest < MiniTest::Unit::TestCase
|
|
65
82
|
end
|
66
83
|
assert_equal('Hello, world!', client.another_resource.link)
|
67
84
|
end
|
85
|
+
|
86
|
+
# Client.<resource>.<link> finds the appropriate link and invokes it, even if
|
87
|
+
# the resource has an underscore in its name
|
88
|
+
def test_resource_with_underscored_name
|
89
|
+
schema = Heroics::Schema.new(SAMPLE_SCHEMA)
|
90
|
+
link = Heroics::Link.new('https://username:secret@example.com',
|
91
|
+
schema.resource('underscored_resource').link('list'))
|
92
|
+
resource = Heroics::Resource.new({'link' => link})
|
93
|
+
client = Heroics::Client.new({'underscored_resource' => resource},
|
94
|
+
'http://example.com')
|
95
|
+
Excon.stub(method: :get) do |request|
|
96
|
+
assert_equal('Basic dXNlcm5hbWU6c2VjcmV0',
|
97
|
+
request[:headers]['Authorization'])
|
98
|
+
assert_equal('example.com', request[:host])
|
99
|
+
assert_equal(443, request[:port])
|
100
|
+
assert_equal('/underscored_resource', request[:path])
|
101
|
+
Excon.stubs.pop
|
102
|
+
{status: 200, body: 'Hello, world!'}
|
103
|
+
end
|
104
|
+
assert_equal('Hello, world!', client.underscored_resource.link)
|
105
|
+
end
|
68
106
|
end
|
69
107
|
|
70
108
|
class ClientFromSchemaTest < MiniTest::Unit::TestCase
|
data/test/helper.rb
CHANGED
@@ -192,9 +192,30 @@ SAMPLE_SCHEMA = {
|
|
192
192
|
'title' => 'List'}
|
193
193
|
]
|
194
194
|
},
|
195
|
+
|
196
|
+
'underscored_resource' => {
|
197
|
+
'description' => 'Underscores the importance of supporting underscored resources',
|
198
|
+
'id' => 'schema/underscored_resource',
|
199
|
+
'$schema' => 'http://json-schema.org/draft-04/hyper-schema',
|
200
|
+
'title' => 'Another underscored resource to use in tests',
|
201
|
+
'type' => ['object'],
|
202
|
+
|
203
|
+
'definitions' => {},
|
204
|
+
|
205
|
+
'properties' => {},
|
206
|
+
|
207
|
+
'links' => [
|
208
|
+
{'description' => 'Show all underscored resources',
|
209
|
+
'href' => '/underscored_resource',
|
210
|
+
'method' => 'GET',
|
211
|
+
'rel' => 'instances',
|
212
|
+
'title' => 'List'}
|
213
|
+
]
|
214
|
+
},
|
195
215
|
},
|
196
216
|
'properties' => {
|
197
217
|
'resource' => { '$ref' => '#/definitions/resource' },
|
198
|
-
'another-resource' => { '$ref' => '#/definitions/another-resource' }
|
218
|
+
'another-resource' => { '$ref' => '#/definitions/another-resource' },
|
219
|
+
'underscored_resource' => { '$ref' => '#/definitions/underscored_resource' }
|
199
220
|
}
|
200
221
|
}
|
data/test/schema_test.rb
CHANGED
@@ -29,7 +29,7 @@ class SchemaTest < MiniTest::Unit::TestCase
|
|
29
29
|
# Schema.resources returns a sequence of ResourceSchema children.
|
30
30
|
def test_resources
|
31
31
|
schema = Heroics::Schema.new(SAMPLE_SCHEMA)
|
32
|
-
assert_equal(['resource', 'another-resource'],
|
32
|
+
assert_equal(['resource', 'another-resource', 'underscored_resource'],
|
33
33
|
schema.resources.map(&:name))
|
34
34
|
end
|
35
35
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: heroics
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.17
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- geemus
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2016-
|
12
|
+
date: 2016-06-10 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: bundler
|