aviator 0.0.1 → 0.0.2
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.
- data/.coveralls.yml +1 -0
- data/.gitignore +6 -1
- data/.ruby-gemset +1 -0
- data/.ruby-version +1 -0
- data/.travis.yml +12 -0
- data/Gemfile +13 -0
- data/Guardfile +6 -0
- data/LICENSE.txt +1 -1
- data/README.md +151 -2
- data/Rakefile +8 -0
- data/aviator.gemspec +14 -1
- data/bin/aviator +110 -0
- data/lib/aviator/core.rb +9 -0
- data/lib/aviator/core/request.rb +229 -0
- data/lib/aviator/core/response.rb +33 -0
- data/lib/aviator/core/service.rb +203 -0
- data/lib/aviator/core/session.rb +187 -0
- data/lib/aviator/openstack/compute/v2/public/list_images.rb +49 -0
- data/lib/aviator/openstack/identity/v2/admin/create_tenant.rb +42 -0
- data/lib/aviator/openstack/identity/v2/admin/list_tenants.rb +43 -0
- data/lib/aviator/openstack/identity/v2/public/create_token.rb +61 -0
- data/lib/aviator/openstack/identity/v2/public/list_tenants.rb +44 -0
- data/lib/aviator/version.rb +1 -1
- data/test/aviator/core/request_test.rb +342 -0
- data/test/aviator/core/service_test.rb +158 -0
- data/test/aviator/core/session_test.rb +201 -0
- data/test/aviator/openstack/compute/v2/public/list_images_test.rb +179 -0
- data/test/aviator/openstack/identity/v2/admin/create_tenant_test.rb +151 -0
- data/test/aviator/openstack/identity/v2/public/create_token_test.rb +159 -0
- data/test/cassettes/core/service/i_default_session_data_/sets_the_service_s_default_session_data.yml +63 -0
- data/test/cassettes/core/service/i_request/accepts_an_endpoint_type_option_for_selecting_a_specific_request.yml +140 -0
- data/test/cassettes/core/service/i_request/can_find_the_correct_request_based_on_bootstrapped_session_data.yml +63 -0
- data/test/cassettes/core/service/i_request/can_find_the_correct_request_based_on_non-bootstrapped_session_data.yml +97 -0
- data/test/cassettes/core/service/i_request/can_find_the_correct_request_if_api_version_is_not_defined_but_can_be_inferred_from_host_uri.yml +63 -0
- data/test/cassettes/core/service/i_request/uses_the_default_session_data_if_session_data_is_not_provided.yml +97 -0
- data/test/cassettes/core/session/c_load/creates_a_new_instance_from_the_given_session_dump.yml +63 -0
- data/test/cassettes/core/session/c_load/uses_the_loaded_auth_info_for_its_services.yml +63 -0
- data/test/cassettes/core/session/c_new/directs_log_entries_to_the_given_log_file.yml +63 -0
- data/test/cassettes/core/session/i_authenticate/authenticates_against_the_auth_service_indicated_in_the_config_file.yml +63 -0
- data/test/cassettes/core/session/i_authenticate/authenticates_against_the_auth_service_using_the_credentials_in_the_given_block.yml +38 -0
- data/test/cassettes/core/session/i_authenticate/raises_an_AuthenticationError_when_authentication_fails.yml +35 -0
- data/test/cassettes/core/session/i_authenticate/updates_the_session_data_of_its_service_objects.yml +123 -0
- data/test/cassettes/core/session/i_dump/serializes_the_session_data_for_caching.yml +63 -0
- data/test/cassettes/core/session/i_validate/returns_false_if_session_is_no_longer_valid.yml +97 -0
- data/test/cassettes/core/session/i_validate/returns_true_if_session_is_still_valid.yml +98 -0
- data/test/cassettes/core/session/i_xxx_service/returns_an_instance_of_the_indicated_service.yml +63 -0
- data/test/cassettes/openstack/compute/v2/public/list_images/leads_to_a_valid_response_when_no_parameters_are_provided.yml +108 -0
- data/test/cassettes/openstack/compute/v2/public/list_images/leads_to_a_valid_response_when_parameters_are_invalid.yml +96 -0
- data/test/cassettes/openstack/compute/v2/public/list_images/leads_to_a_valid_response_when_parameters_are_valid.yml +103 -0
- data/test/cassettes/openstack/compute/v2/public/list_images/returns_the_correct_value_for_body.yml +63 -0
- data/test/cassettes/openstack/compute/v2/public/list_images/returns_the_correct_value_for_body_.yml +63 -0
- data/test/cassettes/openstack/compute/v2/public/list_images/returns_the_correct_value_for_headers.yml +63 -0
- data/test/cassettes/openstack/compute/v2/public/list_images/returns_the_correct_value_for_headers_.yml +63 -0
- data/test/cassettes/openstack/compute/v2/public/list_images/returns_the_correct_value_for_url.yml +63 -0
- data/test/cassettes/openstack/compute/v2/public/list_images/returns_the_correct_value_for_url_.yml +63 -0
- data/test/cassettes/openstack/identity/v2/admin/create_tenant/leads_to_a_valid_response_when_params_are_invalid.yml +97 -0
- data/test/cassettes/openstack/identity/v2/admin/create_tenant/leads_to_a_valid_response_when_params_are_valid.yml +97 -0
- data/test/cassettes/openstack/identity/v2/admin/create_tenant/leads_to_a_valid_response_when_provided_with_invalid_params.yml +97 -0
- data/test/cassettes/openstack/identity/v2/public/create_token/leads_to_a_valid_response_when_parameters_are_invalid.yml +35 -0
- data/test/cassettes/openstack/identity/v2/public/create_token/leads_to_a_valid_response_when_parameters_are_valid.yml +38 -0
- data/test/cassettes/openstack/identity/v2/public/create_token/leads_to_a_valid_response_when_provided_with_a_token.yml +98 -0
- data/test/environment.yml.example +22 -0
- data/test/environment.yml.travis-ci +24 -0
- data/test/support/openstack_request_test_helper.rb +57 -0
- data/test/support/test_base_class.rb +39 -0
- data/test/support/test_environment.rb +37 -0
- data/test/support/test_reporter.rb +45 -0
- data/test/support/vcr_setup.rb +41 -0
- data/test/test_helper.rb +35 -0
- data/tmp/.gitignore +0 -0
- metadata +310 -8
- data/lib/aviator.rb +0 -5
data/.coveralls.yml
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
service_name: travis-ci
|
data/.gitignore
CHANGED
data/.ruby-gemset
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
aviator
|
data/.ruby-version
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
ruby-1.9.3-p448
|
data/.travis.yml
ADDED
data/Gemfile
CHANGED
|
@@ -2,3 +2,16 @@ source 'https://rubygems.org'
|
|
|
2
2
|
|
|
3
3
|
# Specify your gem's dependencies in aviator.gemspec
|
|
4
4
|
gemspec
|
|
5
|
+
|
|
6
|
+
# Putting these gems in the test group so that
|
|
7
|
+
# we can tell travis-ci not to build any of the
|
|
8
|
+
# development gems. Makes the build run faster.
|
|
9
|
+
group :test do
|
|
10
|
+
gem 'rake'
|
|
11
|
+
gem 'simplecov', '~> 0.7.0'
|
|
12
|
+
gem 'coveralls', '~> 0.6.0'
|
|
13
|
+
gem 'json', '~> 1.7.0'
|
|
14
|
+
gem 'minitest', '~> 4.7.0'
|
|
15
|
+
gem 'minitest-reporters', '~> 0.14.20'
|
|
16
|
+
gem 'vcr', '~> 2.5.0'
|
|
17
|
+
end
|
data/Guardfile
ADDED
data/LICENSE.txt
CHANGED
|
@@ -19,4 +19,4 @@ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
|
19
19
|
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
|
20
20
|
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
|
21
21
|
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
|
22
|
-
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
CHANGED
|
@@ -1,6 +1,12 @@
|
|
|
1
1
|
# Aviator
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
[](https://travis-ci.org/relaxdiego/aviator)
|
|
4
|
+
[](https://coveralls.io/r/relaxdiego/aviator?branch=master)
|
|
5
|
+
[](https://codeclimate.com/github/relaxdiego/aviator)
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
A lightweight library for communicating with the OpenStack API.
|
|
9
|
+
|
|
4
10
|
|
|
5
11
|
## Installation
|
|
6
12
|
|
|
@@ -18,8 +24,151 @@ Or install it yourself as:
|
|
|
18
24
|
|
|
19
25
|
## Usage
|
|
20
26
|
|
|
21
|
-
|
|
27
|
+
```ruby
|
|
28
|
+
require 'aviator'
|
|
29
|
+
|
|
30
|
+
# Create a new session. See 'Configuration' below for the config file format.
|
|
31
|
+
session = Aviator::Session.new(
|
|
32
|
+
config_file: 'path/to/aviator.yml',
|
|
33
|
+
environment: :production,
|
|
34
|
+
log_file: 'path/to/aviator.log'
|
|
35
|
+
)
|
|
36
|
+
|
|
37
|
+
# Authenticate against the auth service specified in :config_file. If no
|
|
38
|
+
# credentials are available in the config file, this line will throw an error.
|
|
39
|
+
session.authenticate
|
|
40
|
+
|
|
41
|
+
# You can re-authenticate anytime. Note that this creates a new token in the
|
|
42
|
+
# underlying environment while the old token is discarded by the Session object.
|
|
43
|
+
# Be aware of this fact as it might unnecessarily generate too many tokens.
|
|
44
|
+
#
|
|
45
|
+
# Notice how you can override the credentials in the config file. Also note that
|
|
46
|
+
# the keys used below (:username, :password, :tenantName) match the name as
|
|
47
|
+
# indicated in the official OpenStack documentation.
|
|
48
|
+
session.authenticate do |credentials|
|
|
49
|
+
credentials[:username] = myusername
|
|
50
|
+
credentials[:password] = mypassword
|
|
51
|
+
credentials[:tenantName] = tenantName
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
# Serialize the session information for caching. The output is in plaintext JSON which
|
|
55
|
+
# contains sensitive information and you are responsible for securing this data.
|
|
56
|
+
str = session.dump
|
|
57
|
+
|
|
58
|
+
# Create a new Session object from a session dump. This DOES NOT create a new token.
|
|
59
|
+
# If you employed any form of encryption on the string, make sure to decrypt it first!
|
|
60
|
+
session = Aviator::Session.load(str)
|
|
61
|
+
|
|
62
|
+
# Depending on how old the loaded session dump is, the auth_info may already be expired.
|
|
63
|
+
# Check if it's still current by calling Session#validate and reauthenticate as needed.
|
|
64
|
+
#
|
|
65
|
+
# IMPORTANT: The validator must be defined in the config file and it must refer to the
|
|
66
|
+
# name of a request that is known to Aviator. See 'Configuration' below for examples
|
|
67
|
+
session.authenticate unless session.validate
|
|
68
|
+
|
|
69
|
+
# If you want the newly created session to log its output, make sure to indicate it on load
|
|
70
|
+
session = Aviator::Session.load(str, log_file: 'path/to/aviator.log')
|
|
71
|
+
|
|
72
|
+
# Get a handle to the Identity Service.
|
|
73
|
+
keystone = session.identity_service
|
|
74
|
+
|
|
75
|
+
# Create a new tenant
|
|
76
|
+
response = keystone.request(:create_tenant) do |params|
|
|
77
|
+
params[:name] = 'Project'
|
|
78
|
+
params[:description] = 'My Project'
|
|
79
|
+
params[:enabled] = true
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
# Aviator uses parameter names as defined in the official OpenStack API doc. You can
|
|
83
|
+
# also access the params via dot notation (e.g. params.description) or by using a string
|
|
84
|
+
# for a hash key (e.g. params['description']). However, keep in mind that OpenStack
|
|
85
|
+
# parameters that have dashes and other characters that are not valid for method names
|
|
86
|
+
# and symbols can only be expressed as strings. E.g. params['changes-since']
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
# Be explicit about the endpoint type. Useful in those rare instances when
|
|
90
|
+
# the same request name means differently depending on the endpoint type.
|
|
91
|
+
# For example, in OpenStack, :list_tenants will return only the tenants the
|
|
92
|
+
# user is a member of in the public endpoint whereas the admin endpoint will
|
|
93
|
+
# return all tenants in the system.
|
|
94
|
+
response = keystone.request(:list_tenants, endpoint_type: 'admin')
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
## Configuration
|
|
98
|
+
|
|
99
|
+
The configuration file is a simple YAML file with one or more environment definitions.
|
|
100
|
+
|
|
101
|
+
```
|
|
102
|
+
production:
|
|
103
|
+
provider: openstack
|
|
104
|
+
auth_service:
|
|
105
|
+
name: identity
|
|
106
|
+
host_uri: http://my.openstackenv.org:5000
|
|
107
|
+
request: create_token
|
|
108
|
+
validator: list_tenants # Request to make for validating the session
|
|
109
|
+
api_version: v2 # Optional if version is indicated in host_uri
|
|
110
|
+
auth_credentials:
|
|
111
|
+
username: admin
|
|
112
|
+
password: mypassword
|
|
113
|
+
tenantName: myproject
|
|
114
|
+
|
|
115
|
+
development_1:
|
|
116
|
+
provider: openstack
|
|
117
|
+
auth_service:
|
|
118
|
+
name: identity
|
|
119
|
+
host_uri: http://devstack:5000/v2.0
|
|
120
|
+
request: create_token
|
|
121
|
+
validator: list_tenants
|
|
122
|
+
auth_credentials:
|
|
123
|
+
tokenId: 2c963f5512d067b24fdc312707c80c7a6d3d261b
|
|
124
|
+
tenantName: admin
|
|
125
|
+
|
|
126
|
+
development_2:
|
|
127
|
+
provider: openstack
|
|
128
|
+
auth_service:
|
|
129
|
+
name: identity
|
|
130
|
+
host_uri: http://devstack:5000/v2.0
|
|
131
|
+
request: create_token
|
|
132
|
+
validator: list_tenants
|
|
133
|
+
auth_credentials:
|
|
134
|
+
username: admin
|
|
135
|
+
password: mypassword
|
|
136
|
+
tenantName: myproject
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
A note on the validator: it can be any request as long as
|
|
140
|
+
|
|
141
|
+
1. It is defined in Aviator
|
|
142
|
+
1. Does not require any parameters
|
|
143
|
+
1. It returns an HTTP status 200 or 203 to indicate auth info validity.
|
|
144
|
+
1. It returns any other HTTP status to indicate that the auth info is invalid.
|
|
145
|
+
|
|
146
|
+
## CLI tools
|
|
147
|
+
|
|
148
|
+
List available providers. Includes only OpenStack for now.
|
|
149
|
+
|
|
150
|
+
```bash
|
|
151
|
+
$ aviator describe
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
List available services for OpenStack.
|
|
155
|
+
|
|
156
|
+
```bash
|
|
157
|
+
$ aviator describe openstack
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
List available requests for Keystone
|
|
161
|
+
|
|
162
|
+
```bash
|
|
163
|
+
$ aviator describe openstack identity
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
Describe Keystone's create_tenant request
|
|
22
167
|
|
|
168
|
+
```bash
|
|
169
|
+
$ aviator describe openstack identity v2 admin create_tenant
|
|
170
|
+
```
|
|
171
|
+
|
|
23
172
|
## Contributing
|
|
24
173
|
|
|
25
174
|
1. Fork it
|
data/Rakefile
CHANGED
data/aviator.gemspec
CHANGED
|
@@ -10,7 +10,7 @@ Gem::Specification.new do |spec|
|
|
|
10
10
|
spec.email = ["mmaglana@gmail.com"]
|
|
11
11
|
spec.description = %q{ Lightweight Ruby bindings for the OpenStack API }
|
|
12
12
|
spec.summary = %q{ Lightweight Ruby bindings for the OpenStack API }
|
|
13
|
-
spec.homepage = ""
|
|
13
|
+
spec.homepage = "https://github.com/relaxdiego/aviator"
|
|
14
14
|
spec.license = "MIT"
|
|
15
15
|
|
|
16
16
|
spec.files = `git ls-files`.split($/)
|
|
@@ -18,6 +18,19 @@ Gem::Specification.new do |spec|
|
|
|
18
18
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
|
19
19
|
spec.require_paths = ["lib"]
|
|
20
20
|
|
|
21
|
+
spec.add_dependency 'faraday', '~> 0.8.0'
|
|
22
|
+
spec.add_dependency 'activesupport', '~> 4.0.0'
|
|
23
|
+
spec.add_dependency 'thor', '~> 0.18.1'
|
|
24
|
+
|
|
21
25
|
spec.add_development_dependency "bundler", "~> 1.3"
|
|
22
26
|
spec.add_development_dependency "rake"
|
|
27
|
+
spec.add_development_dependency 'rb-fsevent', '~> 0.9.0'
|
|
28
|
+
spec.add_development_dependency 'guard', '~> 1.8.0'
|
|
29
|
+
spec.add_development_dependency 'guard-rake', '~> 0.0.0'
|
|
30
|
+
spec.add_development_dependency 'guard-minitest', '~> 0.5.0'
|
|
31
|
+
spec.add_development_dependency 'ruby_gntp', '~> 0.3.0'
|
|
32
|
+
spec.add_development_dependency 'debugger', '~> 1.6.0'
|
|
33
|
+
spec.add_development_dependency 'pry', '~> 0.9.0'
|
|
34
|
+
spec.add_development_dependency 'yard', '~> 0.8.0'
|
|
35
|
+
spec.add_development_dependency 'redcarpet', '~> 2.3.0'
|
|
23
36
|
end
|
data/bin/aviator
ADDED
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
|
|
3
|
+
require 'bundler/setup'
|
|
4
|
+
require 'thor'
|
|
5
|
+
require 'aviator/core'
|
|
6
|
+
|
|
7
|
+
module Aviator
|
|
8
|
+
module CLI
|
|
9
|
+
|
|
10
|
+
class Main < Thor
|
|
11
|
+
|
|
12
|
+
desc 'describe [PROVIDER] [SERVICE] [API_VERSION ENDPOINT_TYPE REQUEST_NAME]', 'Describes various parts of Aviator.'
|
|
13
|
+
def describe(provider=nil, service=nil, api_version=nil, endpoint_type=nil, request=nil)
|
|
14
|
+
if request
|
|
15
|
+
describe_request provider, service, api_version, endpoint_type, request
|
|
16
|
+
elsif service
|
|
17
|
+
describe_service provider, service
|
|
18
|
+
elsif provider
|
|
19
|
+
describe_provider provider
|
|
20
|
+
else
|
|
21
|
+
list_providers
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
private
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def describe_provider(provider)
|
|
30
|
+
puts "Available services from #{ provider }"
|
|
31
|
+
|
|
32
|
+
Dir[Pathname.new(__FILE__).join('..', '..', 'lib', 'aviator', provider, '**')].each do |d|
|
|
33
|
+
puts " #{ Pathname.new(d).basename }"
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
def describe_request(provider, service, api_version, endpoint_type, request_name)
|
|
39
|
+
endpoints = Service.new(provider: provider, service: service).requests[api_version.to_sym]
|
|
40
|
+
raise "Invalid API version #{ api_version }" unless endpoints
|
|
41
|
+
|
|
42
|
+
requests = endpoints[endpoint_type.to_sym]
|
|
43
|
+
raise "Invalid endpoint type #{ endpoint_type }" unless requests
|
|
44
|
+
|
|
45
|
+
request = requests[request_name.to_sym]
|
|
46
|
+
raise "Could not find request named #{ request_name }. Try a different api version or endpoint" unless request
|
|
47
|
+
|
|
48
|
+
puts "Request: #{ request_name }"
|
|
49
|
+
|
|
50
|
+
params = []
|
|
51
|
+
|
|
52
|
+
request.optional_params.each do |param|
|
|
53
|
+
params << [param, :optional]
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
request.required_params.each do |param|
|
|
57
|
+
params << [param, :required]
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
params.sort! { |a,b| a[0].to_s <=> b[0].to_s }
|
|
61
|
+
|
|
62
|
+
puts "\nParameters:"
|
|
63
|
+
params.each do |param_desc|
|
|
64
|
+
puts " (#{ param_desc[1] }) #{ param_desc[0] }"
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
puts "\nSample Code:"
|
|
68
|
+
print " session.#{ service }_service.request(:#{ request_name }, endpoint_type: '#{ endpoint_type }')"
|
|
69
|
+
if params
|
|
70
|
+
puts " do |params|"
|
|
71
|
+
params.each do |pair|
|
|
72
|
+
puts " params['#{ pair[0] }'] = val"
|
|
73
|
+
end
|
|
74
|
+
puts " end"
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
puts "\nLinks:"
|
|
78
|
+
request.links.each do |link|
|
|
79
|
+
puts " #{ link[:rel] }:"
|
|
80
|
+
puts " #{ link[:href] }\n"
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
def describe_service(provider, service)
|
|
86
|
+
puts "Available requests for #{ provider } #{ service }:"
|
|
87
|
+
|
|
88
|
+
Service.new(provider: provider, service: service).requests.each do |api_version, endpoints|
|
|
89
|
+
endpoints.each do |endpoint_type, requests|
|
|
90
|
+
requests.each do |request_name, request_obj|
|
|
91
|
+
puts " #{ api_version} #{ endpoint_type } #{ request_name }"
|
|
92
|
+
end
|
|
93
|
+
puts ""
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
def list_providers
|
|
100
|
+
puts "Available providers:"
|
|
101
|
+
puts " openstack"
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
end
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
Aviator::CLI::Main.start(ARGV)
|
data/lib/aviator/core.rb
ADDED
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
module Aviator
|
|
2
|
+
|
|
3
|
+
class Request
|
|
4
|
+
|
|
5
|
+
class ApiVersionNotDefinedError < StandardError
|
|
6
|
+
def initialize
|
|
7
|
+
super "api_version is not defined."
|
|
8
|
+
end
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
class EndpointTypeNotDefinedError < StandardError
|
|
12
|
+
def initialize
|
|
13
|
+
super "endpoint_type is not defined."
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
class PathNotDefinedError < StandardError
|
|
18
|
+
def initialize
|
|
19
|
+
super "path is not defined."
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def initialize(session_data=nil)
|
|
25
|
+
@session_data = session_data
|
|
26
|
+
|
|
27
|
+
params = self.class.params_class.new if self.class.params_class
|
|
28
|
+
|
|
29
|
+
if params
|
|
30
|
+
yield(params) if block_given?
|
|
31
|
+
validate_params(params)
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
@params = params
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
def anonymous?
|
|
39
|
+
self.class.anonymous?
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
def api_version
|
|
44
|
+
self.class.api_version
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
def body?
|
|
49
|
+
self.class.body?
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
def endpoint_type
|
|
54
|
+
self.class.endpoint_type
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
def headers?
|
|
59
|
+
self.class.headers?
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
def http_method
|
|
64
|
+
self.class.http_method
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
def links
|
|
69
|
+
self.class.links
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
def optional_params
|
|
74
|
+
self.class.optional_params
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
def params
|
|
79
|
+
@params.dup
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
def querystring?
|
|
84
|
+
self.class.querystring?
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
def required_params
|
|
89
|
+
self.class.required_params
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
def session_data
|
|
94
|
+
@session_data
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
def session_data?
|
|
99
|
+
!session_data.nil?
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
def url?
|
|
104
|
+
self.class.url?
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
private
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
def validate_params(params)
|
|
112
|
+
required_params = self.class.required_params
|
|
113
|
+
|
|
114
|
+
required_params.each do |name|
|
|
115
|
+
raise ArgumentError.new("Missing parameter #{ name }.") if params.send(name).nil?
|
|
116
|
+
end
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
# NOTE that, because we are defining the following as class methods, when they
|
|
121
|
+
# are called, all 'instance' variables are actually defined in the descendant class,
|
|
122
|
+
# not in the instance/object. This is by design since we want to keep these attributes
|
|
123
|
+
# within the class and because they don't change between instances anyway.
|
|
124
|
+
class << self
|
|
125
|
+
|
|
126
|
+
def anonymous
|
|
127
|
+
@anonymous = true
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
|
|
131
|
+
def anonymous?
|
|
132
|
+
@anonymous == true
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
def api_version(value=nil)
|
|
137
|
+
if value
|
|
138
|
+
@api_version = value
|
|
139
|
+
else
|
|
140
|
+
@api_version
|
|
141
|
+
end
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
|
|
145
|
+
def body?
|
|
146
|
+
instance_methods.include? :body
|
|
147
|
+
end
|
|
148
|
+
|
|
149
|
+
|
|
150
|
+
def endpoint_type(value=nil)
|
|
151
|
+
if value
|
|
152
|
+
@endpoint_type = value
|
|
153
|
+
else
|
|
154
|
+
@endpoint_type
|
|
155
|
+
end
|
|
156
|
+
end
|
|
157
|
+
|
|
158
|
+
|
|
159
|
+
def headers?
|
|
160
|
+
instance_methods.include? :headers
|
|
161
|
+
end
|
|
162
|
+
|
|
163
|
+
|
|
164
|
+
def http_method(value=nil)
|
|
165
|
+
if value
|
|
166
|
+
@http_method = value
|
|
167
|
+
else
|
|
168
|
+
@http_method
|
|
169
|
+
end
|
|
170
|
+
end
|
|
171
|
+
|
|
172
|
+
|
|
173
|
+
def link_to(rel, href)
|
|
174
|
+
links << { rel: rel, href: href }
|
|
175
|
+
end
|
|
176
|
+
|
|
177
|
+
|
|
178
|
+
def links
|
|
179
|
+
@links ||= []
|
|
180
|
+
end
|
|
181
|
+
|
|
182
|
+
|
|
183
|
+
def params_class
|
|
184
|
+
all_params = required_params + optional_params
|
|
185
|
+
|
|
186
|
+
if all_params.length > 0
|
|
187
|
+
@params_class ||= Struct.new(*all_params)
|
|
188
|
+
end
|
|
189
|
+
|
|
190
|
+
@params_class
|
|
191
|
+
end
|
|
192
|
+
|
|
193
|
+
|
|
194
|
+
def optional_params
|
|
195
|
+
@optional_params ||= []
|
|
196
|
+
end
|
|
197
|
+
|
|
198
|
+
|
|
199
|
+
def querystring?
|
|
200
|
+
instance_methods.include? :querystring
|
|
201
|
+
end
|
|
202
|
+
|
|
203
|
+
|
|
204
|
+
def required_params
|
|
205
|
+
@required_params ||= []
|
|
206
|
+
end
|
|
207
|
+
|
|
208
|
+
|
|
209
|
+
def url?
|
|
210
|
+
instance_methods.include? :url
|
|
211
|
+
end
|
|
212
|
+
|
|
213
|
+
|
|
214
|
+
private
|
|
215
|
+
|
|
216
|
+
def required_param(param_name)
|
|
217
|
+
required_params << param_name unless required_params.include?(param_name)
|
|
218
|
+
end
|
|
219
|
+
|
|
220
|
+
|
|
221
|
+
def optional_param(param_name)
|
|
222
|
+
optional_params << param_name unless optional_params.include?(param_name)
|
|
223
|
+
end
|
|
224
|
+
|
|
225
|
+
end
|
|
226
|
+
|
|
227
|
+
end
|
|
228
|
+
|
|
229
|
+
end
|