orchestrate 0.5

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,53 @@
1
+ require "logger"
2
+
3
+ module Orchestrate
4
+
5
+ #
6
+ # Represents the configuration for the Orchestrate library, including
7
+ # values for the api key, base url and other settings.
8
+ #
9
+ # An instance of this class is always available at Orchestrate.config.
10
+ # You should not
11
+ # instantiate instances of this class, instead, you should configure the
12
+ # library with the Orchestrate.configure method.
13
+ #
14
+ # === Example
15
+ #
16
+ # Orchestrate.configure do |config|
17
+ # config.api_key = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
18
+ # end
19
+ #
20
+ class Configuration
21
+
22
+ #
23
+ # The api key for your app, from the Orchestrate Dashboard.
24
+ #
25
+ attr_accessor :api_key
26
+
27
+ #
28
+ # The url to the Orchestrate API. Defaults to \https://api.orchestrate.io/v0.
29
+ #
30
+ attr_accessor :base_url
31
+
32
+ #
33
+ # The logger instances to send messages to. Defaults to +STDOUT+.
34
+ #
35
+ attr_accessor :logger
36
+
37
+ # for faraday, here temporarily
38
+ #
39
+ attr_accessor :faraday
40
+
41
+ #
42
+ # Initialize and return a new instance of Configuration.
43
+ #
44
+ def initialize(options = {}) # :nodoc:
45
+ @api_key = options[:api_key]
46
+ @base_url = options[:base_url] || "https://api.orchestrate.io"
47
+ @logger = options[:logger] || Logger.new(STDOUT)
48
+ @faraday = options[:faraday]
49
+ end
50
+
51
+ end
52
+
53
+ end
@@ -0,0 +1,22 @@
1
+ module Orchestrate
2
+ module Helpers
3
+
4
+ extend self
5
+
6
+ # * required: type, params={}
7
+ #
8
+ # Given a params object such as { start: ..., end: ... } and a type such as 'event',
9
+ # will return a hash with those parameters formatted for the Orchestrate API, f.e.:
10
+ # { 'startEvent' => ..., 'endEvent' => ... }
11
+ def range_keys!(type, params)
12
+ type = type.capitalize
13
+ [:start, :end, :before, :after].each do |key|
14
+ if params[key]
15
+ params["#{key}#{type}"] = params[key]
16
+ params.delete(key)
17
+ end
18
+ end
19
+ end
20
+
21
+ end
22
+ end
@@ -0,0 +1,3 @@
1
+ module Orchestrate
2
+ VERSION = "0.5"
3
+ end
@@ -0,0 +1,27 @@
1
+ lib = File.expand_path('../lib', __FILE__)
2
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
+ require 'orchestrate/version'
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = 'orchestrate'
7
+ s.version = Orchestrate::VERSION
8
+ s.authors = ['Matthew Lyon', 'Justin Mecham', 'James Carrasquer']
9
+ s.email = ['matthew@lyonheart.us', 'justin@mecham.me', 'jimcar@aracnet.com']
10
+ s.summary = 'Ruby client for Orchestrate.io'
11
+ s.description = 'Client for the Orchestrate REST API'
12
+ s.homepage = 'https://github.com/orchestrate-io/orchestrate-ruby'
13
+ s.license = 'MIT'
14
+
15
+ s.files = `git ls-files -z`.split("\x0")
16
+ s.executables = s.files.grep(%r{^bin/}) { |f| File.basename(f) }
17
+ s.test_files = s.files.grep(%r{^(test|spec|features)/})
18
+ s.require_paths = ["lib"]
19
+
20
+ s.add_dependency "faraday", "~> 0.9"
21
+ s.add_dependency "faraday_middleware", "~> 0.9", ">= 0.9.1"
22
+ s.add_development_dependency "bundler", "~> 1.6"
23
+ s.add_development_dependency "rake"
24
+ s.add_development_dependency "typhoeus"
25
+ s.add_development_dependency "em-http-request"
26
+ s.add_development_dependency "em-synchrony"
27
+ end
@@ -0,0 +1,87 @@
1
+ require_relative '../../test_helper'
2
+
3
+ class CollectionTest < MiniTest::Unit::TestCase
4
+ def setup
5
+ @collection = 'test'
6
+ @client, @stubs, @basic_auth = make_client_and_artifacts
7
+ end
8
+
9
+ def test_deletes_collection
10
+ @stubs.delete("/v0/#{@collection}") do |env|
11
+ assert_authorization @basic_auth, env
12
+ assert_equal "true", env.params["force"]
13
+ headers = response_headers
14
+ headers.delete('Content-Type')
15
+ [204, headers, '']
16
+ end
17
+
18
+ response = @client.delete_collection(@collection)
19
+ assert_equal 204, response.status
20
+ assert_equal '', response.body
21
+ end
22
+
23
+ def test_lists_collection_without_params
24
+ body = {"count" => 0, "results" => [], "next" => ""}
25
+
26
+ @stubs.get("/v0/#{@collection}") do |env|
27
+ assert_authorization @basic_auth, env
28
+ assert_accepts_json env
29
+ [200, response_headers, body.to_json]
30
+ end
31
+
32
+ response = @client.list(@collection)
33
+ assert_equal 200, response.status
34
+ assert_equal body, response.body
35
+ end
36
+
37
+ def test_lists_collections_with_params_passes_them
38
+ body = {"count" => 0, "results" => [], "next" => ""}
39
+ @stubs.get("/v0/#{@collection}") do |env|
40
+ assert_authorization @basic_auth, env
41
+ assert_accepts_json env
42
+ assert_equal "1", env.params['limit']
43
+ assert_equal "foo", env.params['startKey']
44
+ assert_equal ['limit', 'startKey'], env.params.keys
45
+ [ 200, response_headers, body.to_json]
46
+ end
47
+
48
+ response = @client.list(@collection, {limit:1, start: 'foo'})
49
+ assert_equal 200, response.status
50
+ assert_equal body, response.body
51
+ end
52
+
53
+ def test_search_with_simple_query
54
+ query = 'text:"The Right Way" and go'
55
+ body = { "results" => [], "count" => 0, "total_count" => 10, "next" => "", "prev" => "" }
56
+
57
+ @stubs.get("/v0/#{@collection}") do |env|
58
+ assert_authorization @basic_auth, env
59
+ assert_accepts_json env
60
+ assert_equal query, env.params['query']
61
+ [ 200, response_headers, body.to_json]
62
+ end
63
+
64
+ response = @client.search(@collection, query)
65
+ assert_equal 200, response.status
66
+ assert_equal body, response.body
67
+ end
68
+
69
+ def test_search_with_extra_params
70
+ query = 'text:"The Right Way" and go'
71
+ body = { "results" => [], "count" => 0, "total_count" => 10, "next" => "", "prev" => "" }
72
+
73
+ @stubs.get("/v0/#{@collection}") do |env|
74
+ assert_authorization @basic_auth, env
75
+ assert_accepts_json env
76
+ assert_equal query, env.params['query']
77
+ assert_equal '3', env.params['offset']
78
+ assert_equal '10', env.params['limit']
79
+ [ 200, response_headers, body.to_json]
80
+ end
81
+
82
+ response = @client.search(@collection, query, {offset: 3, limit: 10})
83
+ assert_equal 200, response.status
84
+ assert_equal body, response.body
85
+ end
86
+
87
+ end
@@ -0,0 +1,133 @@
1
+ require_relative '../../test_helper'
2
+
3
+ class EventTest < MiniTest::Unit::TestCase
4
+
5
+ def setup
6
+ @collection = 'tests'
7
+ @key = 'instance'
8
+ @client, @stubs, @basic_auth = make_client_and_artifacts
9
+ @event_type = "commits"
10
+ @timestamp = (Time.now.to_f * 1000).to_i
11
+ @ordinal = 5
12
+ end
13
+
14
+ def test_get_event
15
+ body = { "path" => {}, "value" => {"msg" => "hello"}, "timestamp" => @timestamp, "ordinal" => @ordinal }
16
+ @stubs.get("/v0/#{@collection}/#{@key}/events/#{@event_type}/#{@timestamp}/#{@ordinal}") do |env|
17
+ assert_authorization @basic_auth, env
18
+ assert_accepts_json env
19
+ [200, response_headers, body.to_json]
20
+ end
21
+
22
+ response = @client.get_event(@collection, @key, @event_type, @timestamp, @ordinal)
23
+ assert_equal 200, response.status
24
+ assert_equal body, response.body
25
+ end
26
+
27
+ def test_post_event_without_timestamp
28
+ event = {"msg" => "hello"}
29
+ @stubs.post("/v0/#{@collection}/#{@key}/events/#{@event_type}") do |env|
30
+ assert_authorization @basic_auth, env
31
+ assert_equal event.to_json, env.body
32
+ [204, response_headers, '']
33
+ end
34
+
35
+ response = @client.post_event(@collection, @key, @event_type, event)
36
+ assert_equal 204, response.status
37
+ end
38
+
39
+ def test_post_event_with_timestamp
40
+ event = {"msg" => "hello"}
41
+ @stubs.post("/v0/#{@collection}/#{@key}/events/#{@event_type}/#{@timestamp}") do |env|
42
+ assert_authorization @basic_auth, env
43
+ assert_equal event.to_json, env.body
44
+ [204, response_headers, '']
45
+ end
46
+
47
+ response = @client.post_event(@collection, @key, @event_type, event, @timestamp)
48
+ assert_equal 204, response.status
49
+ end
50
+
51
+ def test_put_event_without_ref
52
+ event = {"msg" => "hello"}
53
+ @stubs.put("/v0/#{@collection}/#{@key}/events/#{@event_type}/#{@timestamp}/#{@ordinal}") do |env|
54
+ assert_authorization @basic_auth, env
55
+ assert_equal event.to_json, env.body
56
+ [204, response_headers, '']
57
+ end
58
+ response = @client.put_event(@collection, @key, @event_type, @timestamp, @ordinal, event)
59
+ assert_equal 204, response.status
60
+ end
61
+
62
+ def test_put_event_with_ref
63
+ event = {"msg" => "hello"}
64
+ ref = "12345"
65
+ path = ['v0', @collection, @key, 'events', @event_type, @timestamp, @ordinal]
66
+ @stubs.put(path.join("/")) do |env|
67
+ assert_authorization @basic_auth, env
68
+ assert_header 'If-Match', "\"#{ref}\"", env
69
+ assert_equal event.to_json, env.body
70
+ [204, response_headers, '']
71
+ end
72
+ response = @client.put_event(@collection, @key, @event_type, @timestamp, @ordinal, event, ref)
73
+ assert_equal 204, response.status
74
+ end
75
+
76
+ def test_purge_event_without_ref
77
+ path = ['v0', @collection, @key, 'events', @event_type, @timestamp, @ordinal]
78
+ @stubs.delete(path.join("/")) do |env|
79
+ assert_authorization @basic_auth, env
80
+ assert_equal 'true', env.params['purge']
81
+ [204, response_headers, '']
82
+ end
83
+ response = @client.purge_event(@collection, @key, @event_type, @timestamp, @ordinal)
84
+ assert_equal 204, response.status
85
+ end
86
+
87
+ def test_purge_event_with_ref
88
+ path = ['v0', @collection, @key, 'events', @event_type, @timestamp, @ordinal]
89
+ ref = "12345"
90
+ @stubs.delete(path.join("/")) do |env|
91
+ assert_authorization @basic_auth, env
92
+ assert_header 'If-Match', "\"#{ref}\"", env
93
+ assert_equal 'true', env.params['purge']
94
+ [204, response_headers, '']
95
+ end
96
+ response = @client.purge_event(@collection, @key, @event_type, @timestamp, @ordinal, ref)
97
+ assert_equal 204, response.status
98
+ end
99
+
100
+ def test_list_events_without_timestamp
101
+ body = { "results" => [], "count" => 0, "next" => "" }
102
+ @stubs.get("/v0/#{@collection}/#{@key}/events/#{@event_type}") do |env|
103
+ assert_authorization @basic_auth, env
104
+ assert_accepts_json env
105
+ [200, response_headers, body.to_json]
106
+ end
107
+
108
+ response = @client.list_events(@collection, @key, @event_type)
109
+ assert_equal 200, response.status
110
+ assert_equal body, response.body
111
+ end
112
+
113
+ def test_list_events_with_timestamp
114
+ end_time = Time.now
115
+ start_time = end_time - (24 * 3600)
116
+ body = { "results" => [], "count" => 0, "next" => "" }
117
+
118
+ @stubs.get("/v0/#{@collection}/#{@key}/events/#{@event_type}") do |env|
119
+ assert_authorization @basic_auth, env
120
+ assert_accepts_json env
121
+ assert_equal start_time.to_i.to_s, env.params['startEvent']
122
+ assert_equal end_time.to_i.to_s, env.params['endEvent']
123
+ assert_equal ['startEvent', 'endEvent'].sort, env.params.keys.sort
124
+ [200, response_headers, body.to_json]
125
+ end
126
+ response = @client.list_events(@collection, @key, @event_type,
127
+ { start: start_time.to_i, end: end_time.to_i }
128
+ )
129
+ assert_equal 200, response.status
130
+ assert_equal body, response.body
131
+ end
132
+
133
+ end
@@ -0,0 +1,44 @@
1
+ require_relative '../../test_helper'
2
+
3
+ class GraphTest < MiniTest::Unit::TestCase
4
+ def setup
5
+ @collection = 'tests'
6
+ @key = 'instance'
7
+ @kind = 'link'
8
+ @client, @stubs, @basic_auth = make_client_and_artifacts
9
+ @target_collection = 'bucket'
10
+ @target_key = 'vez'
11
+ end
12
+
13
+ def test_get_graph
14
+ body = { "count" => 0, "results" => [] }
15
+ @stubs.get("/v0/#{@collection}/#{@key}/relations/#{@kind}/#{@kind}") do |env|
16
+ assert_authorization @basic_auth, env
17
+ assert_accepts_json env
18
+ [200, response_headers, body.to_json]
19
+ end
20
+
21
+ response = @client.get_relations(@collection, @key, @kind, @kind)
22
+ assert_equal 200, response.status
23
+ assert_equal body, response.body
24
+ end
25
+
26
+ def test_put_graph
27
+ @stubs.put("/v0/#{@collection}/#{@key}/relation/#{@kind}/#{@target_collection}/#{@target_key}") do |env|
28
+ assert_authorization @basic_auth, env
29
+ [ 204, response_headers, '' ]
30
+ end
31
+ response = @client.put_relation(@collection, @key, @kind, @target_collection, @target_key)
32
+ assert_equal 204, response.status
33
+ end
34
+
35
+ def test_delete_graph
36
+ @stubs.delete("/v0/#{@collection}/#{@key}/relation/#{@kind}/#{@target_collection}/#{@target_key}") do |env|
37
+ assert_authorization @basic_auth, env
38
+ assert_equal 'true', env.params['purge']
39
+ [ 204, response_headers, '' ]
40
+ end
41
+ response = @client.delete_relation(@collection, @key, @kind, @target_collection, @target_key)
42
+ assert_equal 204, response.status
43
+ end
44
+ end
@@ -0,0 +1,173 @@
1
+ require_relative "../../test_helper"
2
+
3
+ class KeyValueTest < MiniTest::Unit::TestCase
4
+ def setup
5
+ @collection = 'test'
6
+ @key = 'keyname'
7
+ @client, @stubs, @basic_auth = make_client_and_artifacts
8
+ end
9
+
10
+ def test_gets_current_value_for_key_when_exists
11
+ ref = SecureRandom.hex(16)
12
+ ref_url = "/v0/#{@collection}/#{@key}/refs/#{ref}"
13
+ body = { "key" => "value" }
14
+ @stubs.get("/v0/#{@collection}/#{@key}") do |env|
15
+ assert_authorization @basic_auth, env
16
+ assert_accepts_json env
17
+ headers = {
18
+ 'Content-Location' => ref_url,
19
+ 'ETag' => "\"#{ref}\"",
20
+ }.merge(chunked_encoding_header)
21
+ [ 200, response_headers(headers), body.to_json]
22
+ end
23
+
24
+ response = @client.get(@collection, @key)
25
+ assert_equal 200, response.status
26
+ assert_equal body, response.body
27
+
28
+ assert_equal "\"#{ref}\"", response.headers['Etag']
29
+ assert_equal ref_url, response.headers['Content-Location']
30
+ end
31
+
32
+ def test_gets_key_value_is_404_when_does_not_exist
33
+ @stubs.get("/v0/#{@collection}/#{@key}") do |env|
34
+ assert_authorization @basic_auth, env
35
+ assert_accepts_json env
36
+ [ 404, response_headers(), response_not_found({collection:@collection, key:@key}) ]
37
+ end
38
+
39
+ response = @client.get(@collection, @key)
40
+ assert_equal 404, response.status
41
+ assert_equal 'items_not_found', response.body['code']
42
+ end
43
+
44
+ def test_puts_key_value_without_ref
45
+ body={"foo" => "bar"}
46
+ @stubs.put("/v0/#{@collection}/#{@key}") do |env|
47
+ assert_authorization @basic_auth, env
48
+ assert_header 'Content-Type', 'application/json', env
49
+ assert_equal body.to_json, env.body
50
+ [ 201, response_headers, '' ]
51
+ end
52
+
53
+ response = @client.put(@collection, @key, body)
54
+ assert_equal 201, response.status
55
+ end
56
+
57
+ def test_puts_key_value_with_specific_ref
58
+ body = {"foo" => "bar"}
59
+ ref = '123456'
60
+
61
+ @stubs.put("/v0/#{@collection}/#{@key}") do |env|
62
+ assert_authorization @basic_auth, env
63
+ assert_header 'If-Match', "\"#{ref}\"", env
64
+ assert_header 'Content-Type', 'application/json', env
65
+ assert_equal body.to_json, env.body
66
+ [ 200, response_headers, '' ]
67
+ end
68
+
69
+ response = @client.put(@collection, @key, body, ref)
70
+ assert_equal 200, response.status
71
+ end
72
+
73
+ def test_puts_key_value_if_unmodified
74
+ body = {"foo" => "bar"}
75
+ ref = '123456'
76
+
77
+ @stubs.put("/v0/#{@collection}/#{@key}") do |env|
78
+ assert_authorization @basic_auth, env
79
+ assert_header 'If-Match', "\"#{ref}\"", env
80
+ assert_header 'Content-Type', 'application/json', env
81
+ assert_equal body.to_json, env.body
82
+ [ 200, response_headers, '' ]
83
+ end
84
+
85
+ response = @client.put_if_unmodified(@collection, @key, body, ref)
86
+ assert_equal 200, response.status
87
+ end
88
+
89
+ def test_puts_key_value_with_inspecific_ref
90
+ body = {"foo" => "bar"}
91
+
92
+ @stubs.put("/v0/#{@collection}/#{@key}") do |env|
93
+ assert_authorization @basic_auth, env
94
+ assert_header 'If-None-Match', '*', env
95
+ assert_header 'Content-Type', 'application/json', env
96
+ assert_equal body.to_json, env.body
97
+ [ 200, response_headers, '' ]
98
+ end
99
+
100
+ response = @client.put(@collection, @key, body, false)
101
+ assert_equal 200, response.status
102
+ end
103
+
104
+ def test_puts_key_value_if_absent
105
+ body = {"foo" => "bar"}
106
+ @stubs.put("/v0/#{@collection}/#{@key}") do |env|
107
+ assert_authorization @basic_auth, env
108
+ assert_header 'If-None-Match', '*', env
109
+ assert_header 'Content-Type', 'application/json', env
110
+ assert_equal body.to_json, env.body
111
+ [ 200, response_headers, '' ]
112
+ end
113
+
114
+ response = @client.put_if_absent(@collection, @key, body)
115
+ assert_equal 200, response.status
116
+ end
117
+
118
+ def test_delete_key_value
119
+ @stubs.delete("/v0/#{@collection}/#{@key}") do |env|
120
+ assert_authorization @basic_auth, env
121
+ [ 204, response_headers, '' ]
122
+ end
123
+ response = @client.delete(@collection, @key)
124
+ assert_equal 204, response.status
125
+ end
126
+
127
+ def test_delete_key_value_with_condition
128
+ ref="12345"
129
+ @stubs.delete("/v0/#{@collection}/#{@key}") do |env|
130
+ assert_authorization @basic_auth, env
131
+ assert_header 'If-Match', "\"#{ref}\"", env
132
+ [ 204, response_headers, '' ]
133
+ end
134
+ response = @client.delete(@collection, @key, ref)
135
+ assert_equal 204, response.status
136
+ end
137
+
138
+ def test_delete_key_value_with_quoted_condition
139
+ ref='"12345"'
140
+ @stubs.delete("/v0/#{@collection}/#{@key}") do |env|
141
+ assert_authorization @basic_auth, env
142
+ assert_header 'If-Match', ref, env
143
+ [ 204, response_headers, '' ]
144
+ end
145
+ response = @client.delete(@collection, @key, ref)
146
+ assert_equal 204, response.status
147
+ end
148
+
149
+ def test_delete_key_value_with_purge
150
+ @stubs.delete("/v0/#{@collection}/#{@key}") do |env|
151
+ assert_authorization @basic_auth, env
152
+ assert_equal "true", env.params["purge"]
153
+ [ 204, response_headers, '' ]
154
+ end
155
+ response = @client.purge(@collection, @key)
156
+ assert_equal 204, response.status
157
+ end
158
+
159
+ def test_gets_ref
160
+ body = {"key" => "value"}
161
+ ref = '123456'
162
+ @stubs.get("/v0/#{@collection}/#{@key}/refs/#{ref}") do |env|
163
+ assert_authorization @basic_auth, env
164
+ assert_accepts_json env
165
+ [ 200, response_headers, body.to_json ]
166
+ end
167
+
168
+ response = @client.get(@collection, @key, ref)
169
+ assert_equal 200, response.status
170
+ assert_equal body, response.body
171
+ end
172
+
173
+ end