moonrope-client 1.0.0
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 +7 -0
- data/lib/moonrope_client/connection.rb +101 -0
- data/lib/moonrope_client/controller.rb +20 -0
- data/lib/moonrope_client/error.rb +4 -0
- data/lib/moonrope_client/request.rb +53 -0
- data/lib/moonrope_client/response.rb +52 -0
- data/lib/moonrope_client/responses/access_denied.rb +11 -0
- data/lib/moonrope_client/responses/paginated_collection.rb +71 -0
- data/lib/moonrope_client/responses/parameter_error.rb +11 -0
- data/lib/moonrope_client/responses/success.rb +32 -0
- data/lib/moonrope_client/responses/validation_error.rb +11 -0
- data/lib/moonrope_client/version.rb +3 -0
- data/lib/moonrope_client.rb +17 -0
- metadata +98 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 2dd9355b29944c25be8b737ed5e21048753719c4
|
4
|
+
data.tar.gz: f22c89a8a92620a2d4eee4b7fb93976c0513d00c
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: b4007cd0fedfe8342830b7a7a0cb02dcc188c2955f3aa62e7cad9f93dc6d6b49474fb536d59f07c7a981b4b1d13207545547909a6182725a32d8fd3145b73572
|
7
|
+
data.tar.gz: 2796cd53024fc5766417ab1a74c2bad370feb2adbf71606a30b81e7e05fd12772535f28fd22004124dd2b91b0bc1bb35ddb378a899ab1e6cdfbf3541625cb4c6
|
@@ -0,0 +1,101 @@
|
|
1
|
+
module MoonropeClient
|
2
|
+
class Connection
|
3
|
+
|
4
|
+
#
|
5
|
+
# Initialize a new connection object to an API
|
6
|
+
#
|
7
|
+
# moonrope = MoonropeClient::Connection.new('myapp.com', :ssl => true, :path_prefix => 'api')
|
8
|
+
#
|
9
|
+
# @param host [String] the hostname to connect to
|
10
|
+
# @param options [Hash] A hash of options for this connectin
|
11
|
+
#
|
12
|
+
def initialize(host, options = {})
|
13
|
+
@host, @options = host, options
|
14
|
+
end
|
15
|
+
|
16
|
+
#
|
17
|
+
# @return [String] the endpoint hostname
|
18
|
+
#
|
19
|
+
attr_reader :host
|
20
|
+
|
21
|
+
#
|
22
|
+
# @return [String] the path prefix
|
23
|
+
#
|
24
|
+
def path_prefix
|
25
|
+
@options[:path_prefix] || 'api'
|
26
|
+
end
|
27
|
+
|
28
|
+
#
|
29
|
+
# @return [Boolean] whether or not SSL is enabled for requests or not
|
30
|
+
#
|
31
|
+
def ssl
|
32
|
+
@options[:ssl] || false
|
33
|
+
end
|
34
|
+
|
35
|
+
#
|
36
|
+
# @return [Integer] the port to conncet to
|
37
|
+
#
|
38
|
+
def port
|
39
|
+
@options[:port] || (ssl ? 443 : 80)
|
40
|
+
end
|
41
|
+
|
42
|
+
#
|
43
|
+
# @return [Hash] return headers to be set on all requests to the API
|
44
|
+
#
|
45
|
+
def headers
|
46
|
+
@options[:headers] || {}
|
47
|
+
end
|
48
|
+
|
49
|
+
#
|
50
|
+
# @return [Integer] the version of the API to use
|
51
|
+
#
|
52
|
+
def version
|
53
|
+
@options[:version] || 1
|
54
|
+
end
|
55
|
+
|
56
|
+
#
|
57
|
+
# Make a request and return an appropriate request object.
|
58
|
+
#
|
59
|
+
# @param controller [Symbol] the controller
|
60
|
+
# @param action [Symbol] the action
|
61
|
+
# @param params [Hash] parameters
|
62
|
+
#
|
63
|
+
def request(controller, action, params = {})
|
64
|
+
MoonropeClient::Request.new(self, controller, action, params).make
|
65
|
+
end
|
66
|
+
|
67
|
+
def controller(name)
|
68
|
+
MoonropeClient::Controller.new(self, name)
|
69
|
+
end
|
70
|
+
|
71
|
+
def method_missing(name, value = nil)
|
72
|
+
value.nil? ? self.controller(name) : super
|
73
|
+
end
|
74
|
+
|
75
|
+
#
|
76
|
+
# Make a request to the remote API server and return the raw output from
|
77
|
+
# the request.
|
78
|
+
#
|
79
|
+
# @param path [String] the full path to request
|
80
|
+
# @param params [Hash] a hash of parameters to send with the request
|
81
|
+
#
|
82
|
+
def raw_request(path, params = {})
|
83
|
+
request = Net::HTTP::Post.new(path)
|
84
|
+
request.set_form_data(params)
|
85
|
+
request.add_field 'User-Agent', "Moonrope Ruby Library/#{MoonropeClient::VERSION}"
|
86
|
+
headers.each { |k,v| request.add_field k, v }
|
87
|
+
connection = Net::HTTP.new(self.host, self.port)
|
88
|
+
if ssl
|
89
|
+
connection.use_ssl = true
|
90
|
+
connection.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
91
|
+
end
|
92
|
+
result = connection.request(request)
|
93
|
+
case result.code.to_i
|
94
|
+
when 200 then result.body
|
95
|
+
when 400 then raise Error, "Bad request"
|
96
|
+
else raise Error, "Internal server error occurred"
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
end
|
101
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module MoonropeClient
|
2
|
+
class Controller
|
3
|
+
|
4
|
+
def initialize(connection, controller_name)
|
5
|
+
@connection = connection
|
6
|
+
@controller_name = controller_name
|
7
|
+
end
|
8
|
+
|
9
|
+
attr_reader :name
|
10
|
+
|
11
|
+
def method_missing(name, params = {})
|
12
|
+
request(name, params)
|
13
|
+
end
|
14
|
+
|
15
|
+
def request(action_name, params = {})
|
16
|
+
@connection.request(@controller_name, action_name, params)
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
module MoonropeClient
|
2
|
+
class Request
|
3
|
+
|
4
|
+
#
|
5
|
+
# Initialize a new request
|
6
|
+
#
|
7
|
+
# @param connection [MoonropeClient::Connection]
|
8
|
+
# @param controller [Symbol]
|
9
|
+
# @param action [Symbol]
|
10
|
+
# @param params [Hash]
|
11
|
+
#
|
12
|
+
def initialize(connection, controller, action, params = {})
|
13
|
+
@connection = connection
|
14
|
+
@controller = controller.to_sym
|
15
|
+
@action = action.to_sym
|
16
|
+
@params = params
|
17
|
+
end
|
18
|
+
|
19
|
+
attr_reader :params
|
20
|
+
|
21
|
+
def make
|
22
|
+
raw_data_to_response_object(make_request)
|
23
|
+
end
|
24
|
+
|
25
|
+
private
|
26
|
+
|
27
|
+
def make_request
|
28
|
+
params = {:params => @params.to_json}
|
29
|
+
path = "/#{@connection.path_prefix}/v#{@connection.version}/#{@controller}/#{@action}"
|
30
|
+
JSON.parse(@connection.raw_request(path, params))
|
31
|
+
end
|
32
|
+
|
33
|
+
#
|
34
|
+
# Convert rhe result of a request into an appropriate response object
|
35
|
+
#
|
36
|
+
def raw_data_to_response_object(data)
|
37
|
+
case data['status']
|
38
|
+
when 'success'
|
39
|
+
if data['flags']['paginated'] && data['data'].is_a?(Array)
|
40
|
+
MoonropeClient::Responses::PaginatedCollection.new(self, data)
|
41
|
+
else
|
42
|
+
MoonropeClient::Responses::Success.new(self, data)
|
43
|
+
end
|
44
|
+
when 'parameter-error' then MoonropeClient::Responses::ParameterError.new(self, data)
|
45
|
+
when 'access-denied' then MoonropeClient::Responses::AccessDenied.new(self, data)
|
46
|
+
when 'validation-error' then MoonropeClient::Responses::ValidationError.new(self, data)
|
47
|
+
else
|
48
|
+
MoonropeClient::Response.new(self, data)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
module MoonropeClient
|
2
|
+
class Response
|
3
|
+
|
4
|
+
#
|
5
|
+
# Initialize a new response object
|
6
|
+
#
|
7
|
+
# @param request [MoonropeClient::Request]
|
8
|
+
# @param data [Hash]
|
9
|
+
#
|
10
|
+
def initialize(request, data)
|
11
|
+
@request = request
|
12
|
+
@data = data
|
13
|
+
end
|
14
|
+
|
15
|
+
#
|
16
|
+
# Is this a successful response?
|
17
|
+
#
|
18
|
+
# @return [Boolean]
|
19
|
+
#
|
20
|
+
def success?
|
21
|
+
false
|
22
|
+
end
|
23
|
+
|
24
|
+
#
|
25
|
+
# @return [String] the status of the request returned by the server
|
26
|
+
#
|
27
|
+
def status
|
28
|
+
@data['status']
|
29
|
+
end
|
30
|
+
|
31
|
+
#
|
32
|
+
# @return [Hash] any flags returned by the server
|
33
|
+
def flags
|
34
|
+
@data['flags']
|
35
|
+
end
|
36
|
+
|
37
|
+
#
|
38
|
+
# @return [Object] the data returned by the server
|
39
|
+
#
|
40
|
+
def data
|
41
|
+
@data['data']
|
42
|
+
end
|
43
|
+
|
44
|
+
#
|
45
|
+
# @return [Float] the time the request took at the server
|
46
|
+
#
|
47
|
+
def time
|
48
|
+
@data['time']
|
49
|
+
end
|
50
|
+
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
module MoonropeClient
|
2
|
+
module Responses
|
3
|
+
class PaginatedCollection < Success
|
4
|
+
|
5
|
+
#
|
6
|
+
# @return [Hash] all properties regarding pagination
|
7
|
+
#
|
8
|
+
def pagination_properties
|
9
|
+
flags['paginated']
|
10
|
+
end
|
11
|
+
|
12
|
+
#
|
13
|
+
# @return [Integer] the current page
|
14
|
+
#
|
15
|
+
def page
|
16
|
+
pagination_properties['page']
|
17
|
+
end
|
18
|
+
|
19
|
+
#
|
20
|
+
# @return [Integer] the total records per page
|
21
|
+
#
|
22
|
+
def per_page
|
23
|
+
pagination_properties['per_page']
|
24
|
+
end
|
25
|
+
|
26
|
+
#
|
27
|
+
# @return [Integer] the total number of pages
|
28
|
+
#
|
29
|
+
def total_pages
|
30
|
+
pagination_properties['total_pages']
|
31
|
+
end
|
32
|
+
|
33
|
+
#
|
34
|
+
# @return [Integer] the total number of records
|
35
|
+
#
|
36
|
+
def total_records
|
37
|
+
pagination_properties['total_records']
|
38
|
+
end
|
39
|
+
|
40
|
+
#
|
41
|
+
# @return [Array] all the items
|
42
|
+
#
|
43
|
+
def records
|
44
|
+
data
|
45
|
+
end
|
46
|
+
|
47
|
+
#
|
48
|
+
# @return [MoonropeClient::Responses::PaginatedCollection] the collection for the next page
|
49
|
+
#
|
50
|
+
def next_page
|
51
|
+
request = @request.dup
|
52
|
+
request.params[:page] = page + 1
|
53
|
+
request.make
|
54
|
+
end
|
55
|
+
|
56
|
+
#
|
57
|
+
# @return [MoonropeClient::Responses::PaginatedCollection] the collection for the previous page
|
58
|
+
#
|
59
|
+
def previous_page
|
60
|
+
if page > 1
|
61
|
+
request = @request.dup
|
62
|
+
request.params[:page] = page - 1
|
63
|
+
request.make
|
64
|
+
else
|
65
|
+
raise Error, "Cannot return the previous page as there is no page before page #{page}"
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
module MoonropeClient
|
2
|
+
module Responses
|
3
|
+
class Success < Response
|
4
|
+
|
5
|
+
def success?
|
6
|
+
true
|
7
|
+
end
|
8
|
+
|
9
|
+
#
|
10
|
+
# @return [Boolean] whether this is a creation or not
|
11
|
+
#
|
12
|
+
def creation?
|
13
|
+
flags['creation']
|
14
|
+
end
|
15
|
+
|
16
|
+
#
|
17
|
+
# @return [Boolean] whether this is a modification or not
|
18
|
+
#
|
19
|
+
def modification?
|
20
|
+
flags['modification']
|
21
|
+
end
|
22
|
+
|
23
|
+
#
|
24
|
+
# @return [Boolean] whether this is a deletion or not
|
25
|
+
#
|
26
|
+
def deletion?
|
27
|
+
flags['deletion']
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'net/https'
|
2
|
+
require 'json'
|
3
|
+
|
4
|
+
require 'moonrope_client/version'
|
5
|
+
require 'moonrope_client/connection'
|
6
|
+
require 'moonrope_client/error'
|
7
|
+
require 'moonrope_client/controller'
|
8
|
+
require 'moonrope_client/request'
|
9
|
+
require 'moonrope_client/response'
|
10
|
+
require 'moonrope_client/responses/success'
|
11
|
+
require 'moonrope_client/responses/parameter_error'
|
12
|
+
require 'moonrope_client/responses/access_denied'
|
13
|
+
require 'moonrope_client/responses/validation_error'
|
14
|
+
require 'moonrope_client/responses/paginated_collection'
|
15
|
+
|
16
|
+
module MoonropeClient
|
17
|
+
end
|
metadata
ADDED
@@ -0,0 +1,98 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: moonrope-client
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Adam Cooke
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2014-05-09 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: json
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.8'
|
20
|
+
- - ">="
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: 1.8.0
|
23
|
+
type: :runtime
|
24
|
+
prerelease: false
|
25
|
+
version_requirements: !ruby/object:Gem::Requirement
|
26
|
+
requirements:
|
27
|
+
- - "~>"
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '1.8'
|
30
|
+
- - ">="
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: 1.8.0
|
33
|
+
- !ruby/object:Gem::Dependency
|
34
|
+
name: yard
|
35
|
+
requirement: !ruby/object:Gem::Requirement
|
36
|
+
requirements:
|
37
|
+
- - "~>"
|
38
|
+
- !ruby/object:Gem::Version
|
39
|
+
version: '0.8'
|
40
|
+
- - ">="
|
41
|
+
- !ruby/object:Gem::Version
|
42
|
+
version: 0.8.0
|
43
|
+
type: :development
|
44
|
+
prerelease: false
|
45
|
+
version_requirements: !ruby/object:Gem::Requirement
|
46
|
+
requirements:
|
47
|
+
- - "~>"
|
48
|
+
- !ruby/object:Gem::Version
|
49
|
+
version: '0.8'
|
50
|
+
- - ">="
|
51
|
+
- !ruby/object:Gem::Version
|
52
|
+
version: 0.8.0
|
53
|
+
description: A full client library allows requests to made to Moonrope-enabled API
|
54
|
+
endpoints.
|
55
|
+
email:
|
56
|
+
- adam@atechmedia.com
|
57
|
+
executables: []
|
58
|
+
extensions: []
|
59
|
+
extra_rdoc_files: []
|
60
|
+
files:
|
61
|
+
- lib/moonrope_client.rb
|
62
|
+
- lib/moonrope_client/connection.rb
|
63
|
+
- lib/moonrope_client/controller.rb
|
64
|
+
- lib/moonrope_client/error.rb
|
65
|
+
- lib/moonrope_client/request.rb
|
66
|
+
- lib/moonrope_client/response.rb
|
67
|
+
- lib/moonrope_client/responses/access_denied.rb
|
68
|
+
- lib/moonrope_client/responses/paginated_collection.rb
|
69
|
+
- lib/moonrope_client/responses/parameter_error.rb
|
70
|
+
- lib/moonrope_client/responses/success.rb
|
71
|
+
- lib/moonrope_client/responses/validation_error.rb
|
72
|
+
- lib/moonrope_client/version.rb
|
73
|
+
homepage: http://adamcooke.io
|
74
|
+
licenses:
|
75
|
+
- MIT
|
76
|
+
metadata: {}
|
77
|
+
post_install_message:
|
78
|
+
rdoc_options: []
|
79
|
+
require_paths:
|
80
|
+
- lib
|
81
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
82
|
+
requirements:
|
83
|
+
- - ">="
|
84
|
+
- !ruby/object:Gem::Version
|
85
|
+
version: '0'
|
86
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
87
|
+
requirements:
|
88
|
+
- - ">="
|
89
|
+
- !ruby/object:Gem::Version
|
90
|
+
version: '0'
|
91
|
+
requirements: []
|
92
|
+
rubyforge_project:
|
93
|
+
rubygems_version: 2.2.0
|
94
|
+
signing_key:
|
95
|
+
specification_version: 4
|
96
|
+
summary: A client library for the the Moonrope API server.
|
97
|
+
test_files: []
|
98
|
+
has_rdoc:
|