orchestrate-api 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/lib/orchestrate-api.rb +22 -0
- data/lib/orchestrate_api/procedural.rb +107 -0
- data/lib/orchestrate_api/request.rb +63 -0
- data/lib/orchestrate_api/response.rb +101 -0
- data/lib/orchestrate_api/wrapper.rb +83 -0
- metadata +76 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 4939042aeb2ca40acfdd9733ac806a16790c0573
|
4
|
+
data.tar.gz: 1f301d012d8d27cb0963c32d0c791d400df29af6
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: fc2c245de2d11356de25f1f5bb38f43a55aaf12fa7c33e3eb58d4fe228243741c86e5a45e99dd870124dc62ee6de613375d885f2f23892e5d121106cc7e7dc03
|
7
|
+
data.tar.gz: fc80afd5dad3b27e43aedd09349f4ba4c144cc15a51413a25f17173878b3b2a4ed263b45a573cd0a1487d6ef95c44d1f642518af3eb923a5e887f482805ca5a2
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module Orchestrate
|
2
|
+
|
3
|
+
=begin rdoc
|
4
|
+
==== orchestrate-api
|
5
|
+
|
6
|
+
Ruby gem <tt>orchestrate-api</tt> provides an
|
7
|
+
interface to the <b>Orchestrate.io</b> *API*.
|
8
|
+
|
9
|
+
The <b>Wrapper[API/Wrapper.html]</b> class is used to setup the client and make HTTP requests.
|
10
|
+
=end
|
11
|
+
|
12
|
+
module API
|
13
|
+
|
14
|
+
# require "active_support/core_ext"
|
15
|
+
|
16
|
+
require "orchestrate_api/procedural"
|
17
|
+
require "orchestrate_api/wrapper"
|
18
|
+
require "orchestrate_api/request"
|
19
|
+
require "orchestrate_api/response"
|
20
|
+
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,107 @@
|
|
1
|
+
module Orchestrate::API
|
2
|
+
|
3
|
+
# ==== *Procedural* interface methods (optional).
|
4
|
+
#
|
5
|
+
# This file serves as useful documentation for the <b>Orchestrate.io REST</b> *API*.
|
6
|
+
# Each method illustrates an example for the corresponding HTTP request,
|
7
|
+
# and documents the required keys for the send_request argument hash.
|
8
|
+
#
|
9
|
+
module Procedural
|
10
|
+
|
11
|
+
# -------------------------------------------------------------------------
|
12
|
+
# collection
|
13
|
+
|
14
|
+
# * required: { collection }
|
15
|
+
#
|
16
|
+
def list(args)
|
17
|
+
send_request :get, args
|
18
|
+
end
|
19
|
+
|
20
|
+
# * required: { collection }
|
21
|
+
#
|
22
|
+
def search(args)
|
23
|
+
send_request :get, args.merge(path: "/?query=#{args[:query].gsub(/\s/, '%20')}")
|
24
|
+
end
|
25
|
+
|
26
|
+
# * required: { collection }
|
27
|
+
#
|
28
|
+
def delete_collection(args)
|
29
|
+
send_request :delete, args.merge(path: "?force=true")
|
30
|
+
end
|
31
|
+
|
32
|
+
# -------------------------------------------------------------------------
|
33
|
+
# collection/key
|
34
|
+
|
35
|
+
# * required: { collection, key }
|
36
|
+
#
|
37
|
+
def get_key(args)
|
38
|
+
send_request :get, args
|
39
|
+
end
|
40
|
+
|
41
|
+
# * required: { collection, key, json }
|
42
|
+
#
|
43
|
+
def put_key(args)
|
44
|
+
send_request :put, args
|
45
|
+
end
|
46
|
+
|
47
|
+
# * required: { collection, key }
|
48
|
+
#
|
49
|
+
def delete_key(args)
|
50
|
+
send_request :delete, args
|
51
|
+
end
|
52
|
+
|
53
|
+
# -------------------------------------------------------------------------
|
54
|
+
# collection/key/ref
|
55
|
+
|
56
|
+
# * required: { collection, key, ref }
|
57
|
+
#
|
58
|
+
def get_by_ref(args)
|
59
|
+
send_request :get, args
|
60
|
+
end
|
61
|
+
|
62
|
+
# * required: { collection, key, json, ref }
|
63
|
+
#
|
64
|
+
def put_key_if_match(args)
|
65
|
+
send_request :put, args
|
66
|
+
end
|
67
|
+
|
68
|
+
# * required: { collection, key, json }
|
69
|
+
#
|
70
|
+
def put_key_if_none_match(args)
|
71
|
+
send_request :put, args.merge(ref: '"*"')
|
72
|
+
end
|
73
|
+
|
74
|
+
# -------------------------------------------------------------------------
|
75
|
+
# collection/key/events
|
76
|
+
|
77
|
+
# * required: { collection, key, event_type }
|
78
|
+
# * optional: { timestamp }, where timestamp = { :start => start, :end => end }
|
79
|
+
#
|
80
|
+
def get_events(args)
|
81
|
+
send_request :get, args
|
82
|
+
end
|
83
|
+
|
84
|
+
# * required: { collection, key, event_type, json }
|
85
|
+
# * optional: { timestamp }, where timestamp is a scalar value
|
86
|
+
#
|
87
|
+
def put_event(args)
|
88
|
+
send_request :put, args
|
89
|
+
end
|
90
|
+
|
91
|
+
# -------------------------------------------------------------------------
|
92
|
+
# collection/key/graph
|
93
|
+
|
94
|
+
# * required: { collection, key, kind }
|
95
|
+
#
|
96
|
+
def get_graph(args)
|
97
|
+
send_request :get, args
|
98
|
+
end
|
99
|
+
|
100
|
+
# * required: { collection, key, kind, to_collection, to_key }
|
101
|
+
#
|
102
|
+
def put_graph(args)
|
103
|
+
send_request :put, args
|
104
|
+
end
|
105
|
+
|
106
|
+
end
|
107
|
+
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
module Orchestrate::API
|
2
|
+
|
3
|
+
require 'httparty'
|
4
|
+
|
5
|
+
# Uses HTTParty to make the HTTP calls,
|
6
|
+
# and returns a Response object.
|
7
|
+
#
|
8
|
+
class Request < Object
|
9
|
+
|
10
|
+
# The HTTP method - must be one of: [ :get, :put, :delete ].
|
11
|
+
attr_accessor :method
|
12
|
+
|
13
|
+
# The url for the HTTP request.
|
14
|
+
attr_accessor :url
|
15
|
+
|
16
|
+
# The api key for HTTP Basic Authentication over SSL.
|
17
|
+
attr_accessor :user
|
18
|
+
|
19
|
+
# The json document for creating or updating a key.
|
20
|
+
attr_accessor :data
|
21
|
+
|
22
|
+
# The ref value associated with a key.
|
23
|
+
attr_accessor :ref
|
24
|
+
|
25
|
+
# Boolean
|
26
|
+
attr_accessor :verbose
|
27
|
+
|
28
|
+
# Sets the universal attributes from the params; any additional
|
29
|
+
# attributes are set from the block.
|
30
|
+
#
|
31
|
+
def initialize(method, url, user)
|
32
|
+
@method, @url, @user = method, url, user
|
33
|
+
@data = {}
|
34
|
+
yield self if block_given?
|
35
|
+
end
|
36
|
+
|
37
|
+
# Sends the HTTP request and returns a Response object.
|
38
|
+
def perform
|
39
|
+
puts "\n------- #{method.to_s.upcase} \"#{url}\" ------" if verbose?
|
40
|
+
Response.new HTTParty.send(method, url, options)
|
41
|
+
end
|
42
|
+
|
43
|
+
private
|
44
|
+
|
45
|
+
# Sets up the HTTParty options hash.
|
46
|
+
def options
|
47
|
+
options = { basic_auth: { username: user, password: nil }}
|
48
|
+
if method == :put
|
49
|
+
headers = { 'Content-Type' => 'application/json' }
|
50
|
+
if ref
|
51
|
+
header = ref == '"*"' ? 'If-None-Match' : 'If-Match'
|
52
|
+
headers.merge!(header => ref)
|
53
|
+
end
|
54
|
+
options.merge!(headers: headers, body: data)
|
55
|
+
end
|
56
|
+
options
|
57
|
+
end
|
58
|
+
|
59
|
+
def verbose?
|
60
|
+
verbose == true
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
@@ -0,0 +1,101 @@
|
|
1
|
+
module Orchestrate::API
|
2
|
+
|
3
|
+
# Transforms the HTTParty response into a structure that provides ready
|
4
|
+
# access to relevant orchestrate.io response data.
|
5
|
+
#
|
6
|
+
class Response
|
7
|
+
# Header
|
8
|
+
attr_reader :header
|
9
|
+
|
10
|
+
# ResponseBody
|
11
|
+
attr_reader :body
|
12
|
+
|
13
|
+
# Creates Header and ResponseBody objects from the HTTParty response.
|
14
|
+
# Let's Partay!
|
15
|
+
#
|
16
|
+
def initialize(partay)
|
17
|
+
@success = partay.success?
|
18
|
+
@header = Header.new partay.headers, partay.code, partay.msg
|
19
|
+
@body = ResponseBody.new partay.body
|
20
|
+
end
|
21
|
+
|
22
|
+
# Returns the value of HTTParty.success?
|
23
|
+
def success?
|
24
|
+
@success
|
25
|
+
end
|
26
|
+
|
27
|
+
# Provides methods for ready access to relevant information extracted
|
28
|
+
# from the HTTParty response headers.
|
29
|
+
#
|
30
|
+
class Header
|
31
|
+
|
32
|
+
# Original response headers from HTTParty.
|
33
|
+
attr_reader :content
|
34
|
+
|
35
|
+
# HTTP response code.
|
36
|
+
attr_reader :code
|
37
|
+
|
38
|
+
# HTTP response status.
|
39
|
+
attr_reader :status
|
40
|
+
|
41
|
+
attr_reader :timestamp
|
42
|
+
|
43
|
+
# ETag value, also known as the 'ref' value.
|
44
|
+
attr_reader :etag
|
45
|
+
|
46
|
+
# Link to the next url in a series of list requests.
|
47
|
+
attr_reader :link
|
48
|
+
|
49
|
+
def initialize(headers, code, msg)
|
50
|
+
@content = headers
|
51
|
+
@code, @status = code, msg
|
52
|
+
@timestamp = headers['date']
|
53
|
+
@etag = headers['etag'] if headers['etag']
|
54
|
+
@link = headers['link'] if headers['link']
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
|
60
|
+
# Decodes body from json into a hash; provides the original body content
|
61
|
+
# via the 'content' method.
|
62
|
+
#
|
63
|
+
class ResponseBody
|
64
|
+
|
65
|
+
# Original response body from HTTParty.
|
66
|
+
attr_reader :content
|
67
|
+
|
68
|
+
# The json response body converted to a hash.
|
69
|
+
attr_reader :to_hash
|
70
|
+
|
71
|
+
# Set for all results.
|
72
|
+
attr_reader :results
|
73
|
+
|
74
|
+
# Set for list, search, get_events, and get_graph results.
|
75
|
+
attr_reader :count
|
76
|
+
|
77
|
+
# Set for search results.
|
78
|
+
attr_reader :total_count
|
79
|
+
|
80
|
+
# Set for list results.
|
81
|
+
attr_reader :next
|
82
|
+
|
83
|
+
# Error message from the orchestrate.io api.
|
84
|
+
attr_reader :message
|
85
|
+
|
86
|
+
# Error code from the orchestrate.io api.
|
87
|
+
attr_reader :code
|
88
|
+
|
89
|
+
# Initialize instance variables, based on response body contents.
|
90
|
+
def initialize(body)
|
91
|
+
@content = body
|
92
|
+
@to_hash = body.blank? ? {} : ActiveSupport::JSON.decode(body)
|
93
|
+
to_hash.each { |k,v| instance_variable_set "@#{k}", v }
|
94
|
+
end
|
95
|
+
|
96
|
+
def result_keys
|
97
|
+
results.map { |result| result['path']['key'] } if results
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
end
|
@@ -0,0 +1,83 @@
|
|
1
|
+
module Orchestrate::API
|
2
|
+
|
3
|
+
require "active_support/core_ext"
|
4
|
+
|
5
|
+
# ==== Ruby wrapper for the Orchestrate.io REST *API*.
|
6
|
+
#
|
7
|
+
# The primary entry point is the <b> #send_request</b> method, which
|
8
|
+
# generates a <b> Request</b>, and returns the
|
9
|
+
# <b> Response</b> to the caller.
|
10
|
+
# <b>{Usage examples for each HTTP request}[Procedural.html]</b>
|
11
|
+
# are documented in the <b> Procedural</b> interface module.
|
12
|
+
#
|
13
|
+
class Wrapper < Object
|
14
|
+
include Orchestrate::API::Procedural
|
15
|
+
|
16
|
+
attr_accessor :verbose
|
17
|
+
|
18
|
+
# Loads settings from the configuration file and returns the client
|
19
|
+
# handle to be used for subsequent requests.
|
20
|
+
#
|
21
|
+
# Example config file: "./lib/orch_config.json"
|
22
|
+
#
|
23
|
+
# {
|
24
|
+
# "base_url":"https://api.orchestrate.io/v0",
|
25
|
+
# "user":"<user-key-from-orchestrate.io>",
|
26
|
+
# "verbose":"false"
|
27
|
+
# }
|
28
|
+
#
|
29
|
+
def initialize(config_file)
|
30
|
+
orch_config = ::ActiveSupport::JSON.decode open(config_file).read
|
31
|
+
@base_url = orch_config['base_url']
|
32
|
+
@user = orch_config['user']
|
33
|
+
@verbose = orch_config['verbose'] ? orch_config['verbose'] : false
|
34
|
+
end
|
35
|
+
|
36
|
+
# Creates the Request object and sends it via the perform method,
|
37
|
+
# which generates and returns the Response object.
|
38
|
+
#
|
39
|
+
def send_request(method, args)
|
40
|
+
request = Orchestrate::API::Request.new(method, build_url(method, args), @user) do |r|
|
41
|
+
r.data = args[:json] if args[:json]
|
42
|
+
r.ref = args[:ref] if args[:ref]
|
43
|
+
r.verbose = verbose
|
44
|
+
end
|
45
|
+
request.perform
|
46
|
+
end
|
47
|
+
|
48
|
+
private
|
49
|
+
|
50
|
+
# Builds the URL for each HTTP request to the orchestrate.io api.
|
51
|
+
#
|
52
|
+
def build_url(method, args)
|
53
|
+
uri = "#{@base_url}/#{args[:collection]}"
|
54
|
+
if args[:key]
|
55
|
+
uri << "/#{args[:key]}"
|
56
|
+
if args[:ref]
|
57
|
+
uri << "/refs/#{args[:ref].gsub(/"/, '')}" if method == :get
|
58
|
+
elsif args[:event_type]
|
59
|
+
uri << "/events/#{args[:event_type]}"
|
60
|
+
if args[:timestamp]
|
61
|
+
if method == :put && args[:timestamp][:start]
|
62
|
+
uri << "?start=#{args[:timestamp][:start]}&end=#{args[:timestamp][:end]}"
|
63
|
+
elsif method == :get && !args[:timestamp].blank?
|
64
|
+
uri << "?timestamp=#{timestamp}"
|
65
|
+
end
|
66
|
+
end
|
67
|
+
elsif args[:kind]
|
68
|
+
if method == :put
|
69
|
+
uri << "/relation/#{args[:kind]}/#{args[:to_collection]}/#{args[:to_key]}"
|
70
|
+
else
|
71
|
+
uri << "/relations/#{args[:kind]}"
|
72
|
+
end
|
73
|
+
end
|
74
|
+
elsif args[:path]
|
75
|
+
uri << args[:path]
|
76
|
+
end
|
77
|
+
uri
|
78
|
+
end
|
79
|
+
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
|
metadata
ADDED
@@ -0,0 +1,76 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: orchestrate-api
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- James Carrasquer
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2014-02-18 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: httparty
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: activerecord
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
description: Gem to interface with orchestrate.io api
|
42
|
+
email: jimcar@aracnet.com
|
43
|
+
executables: []
|
44
|
+
extensions: []
|
45
|
+
extra_rdoc_files: []
|
46
|
+
files:
|
47
|
+
- lib/orchestrate-api.rb
|
48
|
+
- lib/orchestrate_api/procedural.rb
|
49
|
+
- lib/orchestrate_api/wrapper.rb
|
50
|
+
- lib/orchestrate_api/request.rb
|
51
|
+
- lib/orchestrate_api/response.rb
|
52
|
+
homepage: https://github.com/jimcar/orchestrate-api
|
53
|
+
licenses:
|
54
|
+
- MIT
|
55
|
+
metadata: {}
|
56
|
+
post_install_message:
|
57
|
+
rdoc_options: []
|
58
|
+
require_paths:
|
59
|
+
- lib
|
60
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
61
|
+
requirements:
|
62
|
+
- - ">="
|
63
|
+
- !ruby/object:Gem::Version
|
64
|
+
version: '0'
|
65
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
66
|
+
requirements:
|
67
|
+
- - ">="
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '0'
|
70
|
+
requirements: []
|
71
|
+
rubyforge_project:
|
72
|
+
rubygems_version: 2.0.3
|
73
|
+
signing_key:
|
74
|
+
specification_version: 4
|
75
|
+
summary: Summary for orchestrate-api
|
76
|
+
test_files: []
|