geekier_factory 0.0.1 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +51 -3
- data/lib/geekier_factory/action.rb +5 -3
- data/lib/geekier_factory/api.rb +5 -1
- data/lib/geekier_factory/version.rb +1 -1
- data/test/mock_definition.json +2 -0
- data/test/test_factory.rb +4 -2
- metadata +3 -3
data/README.md
CHANGED
@@ -1,4 +1,52 @@
|
|
1
|
-
|
2
|
-
===================
|
1
|
+
#Synopsis
|
3
2
|
|
4
|
-
Ruby gem for using APIs, based on their Geekier API descriptions.
|
3
|
+
Ruby gem for using APIs, based on their Geekier API descriptions.
|
4
|
+
|
5
|
+
#Installation
|
6
|
+
|
7
|
+
##Gemfile
|
8
|
+
|
9
|
+
`gem "geekier_factory"`
|
10
|
+
|
11
|
+
##Standalone
|
12
|
+
|
13
|
+
`gem install geekier_factory`
|
14
|
+
|
15
|
+
#Usage
|
16
|
+
|
17
|
+
Download the API definition you want to use.
|
18
|
+
|
19
|
+
require 'geekier_factory'
|
20
|
+
|
21
|
+
# instanciate the api
|
22
|
+
api = GeekierFactory.factorize('path/to/definition_file.json')
|
23
|
+
|
24
|
+
# get a list of actions you can perform
|
25
|
+
api.available_actions
|
26
|
+
|
27
|
+
# select the action you want to perform
|
28
|
+
action = api.available_actions[3]
|
29
|
+
|
30
|
+
# check out what parameters are possible/necessary
|
31
|
+
action.params
|
32
|
+
|
33
|
+
# select an action and call it with its parameters
|
34
|
+
action.call(:param1 => 'valueA', :param2 => 'valueB)
|
35
|
+
|
36
|
+
And that's how you do it.
|
37
|
+
|
38
|
+
#Participate
|
39
|
+
|
40
|
+
* fork && commit && send\_pull\_request
|
41
|
+
* add [more API definitions](https://github.com/rulesio/geekier)
|
42
|
+
* join the [Geekier Google group](https://groups.google.com/d/forum/geekier-apis)
|
43
|
+
|
44
|
+
#TODO
|
45
|
+
|
46
|
+
(in no particular order)
|
47
|
+
|
48
|
+
* Implement support for resources
|
49
|
+
* Parameter validations
|
50
|
+
* Support for Authentication/API level configuration
|
51
|
+
* Add more descriptions
|
52
|
+
* Setup with all the cool testing and dependency checking solutions out there
|
@@ -67,13 +67,15 @@ module GeekierFactory
|
|
67
67
|
Retry = Class.new(Exception)
|
68
68
|
ConnectionException = Class.new(Exception)
|
69
69
|
def handle_response!(response)
|
70
|
-
if @structure['errorResponses'].map{ |er| er['code'] }.include? response.status
|
70
|
+
if (@structure['errorResponses'] + @api.error_responses).map{ |er| er['code'] }.include? response.status
|
71
71
|
ex = @structure['errorResponses'].select{ |er| er['code'] == response.status }
|
72
|
-
if ex['retry'] == true && (@retries ||= 0) < ex[
|
72
|
+
if ex['retry'] == true && (@retries ||= 0) < ex['retry']
|
73
73
|
@retries += 1
|
74
74
|
raise Retry.new
|
75
75
|
else
|
76
|
-
|
76
|
+
message = "#{ex[:reason]} (HTTP status code #{ex[:code]})"
|
77
|
+
message = message + "\n\n" + response[:body] if ex['details'] && ex['details'] == 'body'
|
78
|
+
raise ConnectionException.new(message)
|
77
79
|
end
|
78
80
|
elsif !response.success?
|
79
81
|
raise ConnectionException.new
|
data/lib/geekier_factory/api.rb
CHANGED
@@ -6,7 +6,7 @@ module GeekierFactory
|
|
6
6
|
class API
|
7
7
|
def initialize(structure)
|
8
8
|
@structure = structure
|
9
|
-
@actions = @structure['apis'].map{ |api| api['operations'].map{ |op| Action.new(self, op.merge('path' => api['path'])) } }
|
9
|
+
@actions = Hash[@structure['apis'].map{ |api| [api['description'], api['operations'].map{ |op| Action.new(self, op.merge('path' => api['path'])) }] }]
|
10
10
|
end
|
11
11
|
|
12
12
|
def log_body?
|
@@ -34,6 +34,10 @@ module GeekierFactory
|
|
34
34
|
def base_url
|
35
35
|
@structure['basePath'].end_with?('/') ? @structure['basePath'] : (@structure['basePath'] + '/')
|
36
36
|
end
|
37
|
+
|
38
|
+
def error_responses
|
39
|
+
@structure['errorResponses'] || []
|
40
|
+
end
|
37
41
|
|
38
42
|
# def oauth?
|
39
43
|
# true
|
data/test/mock_definition.json
CHANGED
data/test/test_factory.rb
CHANGED
@@ -6,7 +6,7 @@ class TestFactory < Test::Unit::TestCase
|
|
6
6
|
|
7
7
|
setup do
|
8
8
|
@api = GeekierFactory.factorize(File.join(File.dirname(File.expand_path(__FILE__)), 'mock_definition.json'))
|
9
|
-
@action = @api.available_actions.first
|
9
|
+
@action = @api.available_actions["test api"].first
|
10
10
|
end
|
11
11
|
|
12
12
|
test "api should be factorized" do
|
@@ -14,8 +14,10 @@ class TestFactory < Test::Unit::TestCase
|
|
14
14
|
assert @api.is_a? GeekierFactory::API
|
15
15
|
end
|
16
16
|
|
17
|
-
test "api should have one action" do
|
17
|
+
test "api should have one operation with action" do
|
18
18
|
assert_equal 1, @api.available_actions.size
|
19
|
+
assert @api.available_actions.is_a? Hash
|
20
|
+
assert_equal 1, @api.available_actions["test api"].size
|
19
21
|
end
|
20
22
|
|
21
23
|
test "action should have 4 parameters" do
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: geekier_factory
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2013-
|
13
|
+
date: 2013-03-03 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: bundler
|
@@ -180,7 +180,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
180
180
|
version: 1.3.6
|
181
181
|
requirements: []
|
182
182
|
rubyforge_project:
|
183
|
-
rubygems_version: 1.8.
|
183
|
+
rubygems_version: 1.8.25
|
184
184
|
signing_key:
|
185
185
|
specification_version: 3
|
186
186
|
summary: Generate API objects from swagger definition files
|