signalcloud 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 42bd443dc46ac29a9ad55a6dec7f387d623930b1
4
+ data.tar.gz: 00167f4ef5da067225e727f8afb5eaf38047df3c
5
+ SHA512:
6
+ metadata.gz: 6f0c8bf7e9cd3a8d9413edc0bb2c9b4728339dc4eba6a06d4e6521ec8f5fcd4d3e7172e93b0ed633b9b3d119fbaca656cfb00e1f89d3697b20ce4622da027c27
7
+ data.tar.gz: b76fea285c932bf37d5d1572233662cb501f39d44759e1765f9f4bf31ca8962128368f0a122aec853ac89681a14f1324c023bd5613ef8956c6ea89b6611d6941
data/.gitignore ADDED
@@ -0,0 +1,34 @@
1
+ Gemfile.lock
2
+ *.gem
3
+ *.rbc
4
+ .bundle
5
+ .config
6
+ coverage
7
+ InstalledFiles
8
+ lib/bundler/man
9
+ pkg
10
+ rdoc
11
+ spec/reports
12
+ test/tmp
13
+ test/version_tmp
14
+ tmp
15
+ coverage
16
+ .env
17
+
18
+ # YARD artifacts
19
+ .yardoc
20
+ _yardoc
21
+ doc/
22
+
23
+ .DS_Store
24
+ .AppleDouble
25
+ .LSOverride
26
+ Icon
27
+
28
+
29
+ # Thumbnails
30
+ ._*
31
+
32
+ # Files that might appear on external disk
33
+ .Spotlight-V100
34
+ .Trashes
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --format progress
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in signalcloud.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2013 Ian Lloyd
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
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.
data/README.md ADDED
@@ -0,0 +1,29 @@
1
+ # Signalcloud
2
+
3
+ TODO: Write a gem description
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ gem 'signalcloud'
10
+
11
+ And then execute:
12
+
13
+ $ bundle
14
+
15
+ Or install it yourself as:
16
+
17
+ $ gem install signalcloud
18
+
19
+ ## Usage
20
+
21
+ TODO: Write usage instructions here
22
+
23
+ ## Contributing
24
+
25
+ 1. Fork it
26
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
27
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
28
+ 4. Push to the branch (`git push origin my-new-feature`)
29
+ 5. Create new Pull Request
data/Rakefile ADDED
@@ -0,0 +1,9 @@
1
+ require "bundler/gem_tasks"
2
+ require 'rspec/core/rake_task'
3
+
4
+ RSpec::Core::RakeTask.new('spec')
5
+ task :default => :spec
6
+ task :test => :spec
7
+
8
+ Dir.glob('tasks/*.rake').each { |r| import r }
9
+
@@ -0,0 +1,34 @@
1
+ module SignalCloud
2
+
3
+ class Conversation < ::APISmith::Smash
4
+ property :id, transformer: :to_i
5
+ property :stencil_id, transformer: :to_i
6
+ property :customer_number
7
+ property :internal_number
8
+
9
+ property :status
10
+ property :status_text
11
+
12
+ property :challenge_status
13
+ property :challenge_status_text
14
+
15
+ property :reply_status
16
+ property :reply_status_text
17
+
18
+ property :webhook_uri
19
+
20
+ property :question
21
+ property :confirmed_reply
22
+ property :denied_reply
23
+ property :expired_reply
24
+ property :failed_reply
25
+
26
+ property :created_at, transformer: TimeTransformer
27
+ property :updated_at, transformer: TimeTransformer
28
+ property :expires_at, transformer: TimeTransformer
29
+ property :challenge_sent_at, transformer: TimeTransformer
30
+ property :response_received_at, transformer: TimeTransformer
31
+ property :reply_received_at, transformer: TimeTransformer
32
+ end
33
+
34
+ end
File without changes
@@ -0,0 +1,11 @@
1
+ module SignalCloud
2
+
3
+ class Organization < ::APISmith::Smash
4
+ property :id, transformer: :to_i
5
+ property :label
6
+
7
+ property :created_at, transformer: TimeTransformer
8
+ property :updated_at, transformer: TimeTransformer
9
+ end
10
+
11
+ end
@@ -0,0 +1,27 @@
1
+ module SignalCloud
2
+
3
+ class Stencil < ::APISmith::Smash
4
+
5
+ property :id, transformer: :to_i
6
+ property :phone_directory_id, transformer: :to_i
7
+
8
+ property :label
9
+ property :description
10
+ property :primary
11
+
12
+ property :webhook_uri
13
+ property :seconds_to_live
14
+
15
+ property :question
16
+ property :expected_confirmed_answer
17
+ property :expected_denied_answer
18
+ property :confirmed_reply
19
+ property :denied_reply
20
+ property :failed_reply
21
+ property :expired_reply
22
+
23
+ property :created_at, transformer: TimeTransformer
24
+ property :updated_at, transformer: TimeTransformer
25
+ end
26
+
27
+ end
@@ -0,0 +1,16 @@
1
+ module SignalCloud
2
+
3
+ class TimeTransformer
4
+
5
+ def self.call(value)
6
+ return nil if value.nil? || value.to_s.strip == ''
7
+ Time.parse(value)
8
+ end
9
+
10
+ def self.transform(value)
11
+ call(value)
12
+ end
13
+
14
+ end
15
+
16
+ end
@@ -0,0 +1,3 @@
1
+ module SignalCloud
2
+ VERSION = "1.0.0"
3
+ end
@@ -0,0 +1,190 @@
1
+ require "signalcloud/version"
2
+ require 'api_smith'
3
+
4
+ require 'signalcloud/time_transformer'
5
+ require 'signalcloud/organization'
6
+ require 'signalcloud/stencil'
7
+ require 'signalcloud/message'
8
+ require 'signalcloud/conversation'
9
+
10
+ ##
11
+ # A helper library for working with the SignalCloud service.
12
+ module SignalCloud
13
+
14
+ ##
15
+ # US service URI.
16
+ US_BASE_URI = 'https://us.signalcloudapp.com'
17
+
18
+ ##
19
+ # EU service URI.
20
+ EU_BASE_URI = 'https://eu.signalcloudapp.com'
21
+
22
+ ##
23
+ # The default service URI; currently defaults to the EU service.
24
+ DEFAULT_BASE_URI = EU_BASE_URI
25
+
26
+ ##
27
+ # Standard SignalCloud error. All errors produced by the SignalCloud library or service will be raised as this Error class.
28
+ class SignalCloudError < StandardError; end
29
+
30
+ ##
31
+ # A SignalCloudError raised whenever the service cannot authenticate the provided user credentials.
32
+ class InvalidCredentialError < SignalCloudError; end
33
+
34
+ ##
35
+ # A SignalCloudError rasied whenever a requested object could not be found.
36
+ class ObjectNotFoundError < SignalCloudError; end
37
+
38
+ ##
39
+ # The primary Client for using the SignalCloud service. Either sub-class this object to make your own client or use it directly.
40
+ #
41
+ # The Client uses several environment variables to automagically set defaults.
42
+ # [SIGNALCLOUD_URI] The service URI. May be either a fully qualified URI, or US or EU to use the respective region-specific service. Defaults to the EU service URI.
43
+ # [SIGNALCLOUD_USERNAME] A valid SignalCloud username
44
+ # [SIGNALCLOUD_PASSWORD] A valid SignalCloud password
45
+ class Client
46
+ include ::APISmith::Client
47
+
48
+ ##
49
+ # The BASIC AUTH username for the SignalCloud service.
50
+ attr_reader :username
51
+
52
+ ##
53
+ # The BASIC AUTH password for the SignalCloud service.
54
+ attr_reader :password
55
+
56
+ ##
57
+ # Create a new Client
58
+ # [username] A SignalCloud username, or nil to use the SIGNALCLOUD_USERNAME environment variable
59
+ # [password] A SignalCloud password, or nil to use the SIGNALCLOUD_PASSWORD environment variable
60
+ # [options] A Hash of options to pass to the Client. Keys may be any method which the Client understands, while the value must be in a format the method can understand.
61
+ def initialize( username=nil, password=nil, options={} )
62
+ @username = username || ENV['SIGNALCLOUD_USERNAME']
63
+ @password = password || ENV['SIGNALCLOUD_PASSWORD']
64
+
65
+ raise SignalCloudError.new( 'Username or Password was nil. Define your credentials either through parameters or through the SIGNALCLOUD_USERNAME and SIGNALCLOUD_PASSWORD environment variables.' ) if ( @username.nil? or @password.nil? )
66
+
67
+ # Assign base URI by parameters
68
+ self.class.base_uri self.class.pick_base_uri
69
+
70
+ options.each do |key,value|
71
+ self.class.send(key, value) if self.class.respond_to? key
72
+ send(key, value) if respond_to? key
73
+ end
74
+
75
+ #self.basic_auth(username, password)
76
+ add_request_options!( basic_auth: {username: self.username, password: self.password} )
77
+ end
78
+
79
+ ##
80
+ # Request all organizations available to this user account.
81
+ # [options] A Hash of key-value pairs to be submitted with the request as a query (i.e. after a ? in the request URI).
82
+ # Returns an Array of Organization objects.
83
+ def organizations( options={} )
84
+ get "organizations.json", extra_query: options, response_container: %w( organizations ), transform: SignalCloud::Organization
85
+ end
86
+
87
+ ##
88
+ # Request a specific organization by unique ID.
89
+ # [organization_id] The ID of the holding Organization
90
+ # [options] A Hash of key-value pairs to be submitted with the request as a query (i.e. after a ? in the request URI).
91
+ # Returns an Organization object.
92
+ def organization( organization_id, options={} )
93
+ get "organizations/#{organization_id}.json", extra_query: options, response_container: %w( organization ), transform: SignalCloud::Organization
94
+ end
95
+
96
+ ##
97
+ # Request all stencils available to this user account and the specified organization.
98
+ # [organization_id] The ID of the holding Organization
99
+ # [options] A Hash of key-value pairs to be submitted with the request as a query (i.e. after a ? in the request URI).
100
+ # Returns an Array of Stencil objects.
101
+ def stencils( organization_id, options={} )
102
+ get "organizations/#{organization_id}/stencils.json", extra_query: options, response_container: %w( stencils ), transform: SignalCloud::Stencil
103
+ end
104
+
105
+ ##
106
+ # Request a specific Stencil by Organization and Stencil IDs.
107
+ # [organization_id] The ID of the holding Organization
108
+ # [stencil_id] The ID of the requested Stencil
109
+ # [options] A Hash of key-value pairs to be submitted with the request as a query (i.e. after a ? in the request URI).
110
+ # Returns an Organization object.
111
+ def stencil( organization_id, stencil_id, options={} )
112
+ get "organizations/#{organization_id}/stencils/#{stencil_id}.json", extra_query: options, response_container: %w( stencil ), transform: SignalCloud::Stencil
113
+ end
114
+
115
+ ##
116
+ # Request all Stencils available to this user account and the specified organization.
117
+ # [organization_id] The ID of the holding Organization
118
+ # [options] A Hash of key-value pairs to be submitted with the request as a query (i.e. after a ? in the request URI).
119
+ # Returns an Array of Conversation objects.
120
+ def conversations( organization_id, options={} )
121
+ get "organizations/#{organization_id}/conversations.json", extra_query: options, response_container: %w( conversations ), transform: SignalCloud::Conversation
122
+ end
123
+
124
+ ##
125
+ # Request a specific Conversation by Organization and Conversation IDs.
126
+ # [organization_id] The ID of the holding Organization
127
+ # [conversation_id] The ID of the requested Conversation
128
+ # [options] A Hash of key-value pairs to be submitted with the request as a query (i.e. after a ? in the request URI).
129
+ # Returns a Conversation object.
130
+ def conversation( organization_id, conversation_id, options={} )
131
+ get "organizations/#{organization_id}/conversations/#{conversation_id}.json", extra_query: options, response_container: %w( conversation ), transform: SignalCloud::Conversation
132
+ end
133
+
134
+ ##
135
+ # Start a new Conversation for the given Organization.
136
+ # [organization_id] The ID of the holding Organization
137
+ # [options] A Hash of key-value pairs to be submitted with the request. Please see http://www.signalcloudapp.com/dev for details on accepted parameters.
138
+ # Returns a Conversation object.
139
+ def start_conversation( organization_id, params={} )
140
+ conversation_uri = 'conversations.json'
141
+ conversation_uri = "stencils/#{params[:stencil_id]}/#{conversation_uri}" if params.include? :stencil_id
142
+ conversation_uri = "organizations/#{organization_id}/#{conversation_uri}"
143
+ post conversation_uri, extra_query: { conversation: params }, response_container: %w( conversation ), transform: SignalCloud::Conversation
144
+ end
145
+
146
+ ##
147
+ # Pick the appropriate base URI to use based on environment variables.
148
+ # Uses the +SIGNALCLOUD_URI+ environment variable to select the URI.
149
+ # Accepts one either a fully qualified URI, or country short-cuts as follows:
150
+ # * +EU+ for the European version.
151
+ # * +US+ for the United States version.
152
+ # If the parameter is blank or is not one of the country codes, will default to the EU version.
153
+ def self.pick_base_uri(uri = nil)
154
+ uri ||= ENV['SIGNALCLOUD_URI']
155
+ case uri.to_s.strip.downcase
156
+ when 'eu'
157
+ EU_BASE_URI
158
+ when 'us'
159
+ US_BASE_URI
160
+ when nil, ''
161
+ DEFAULT_BASE_URI
162
+ else
163
+ uri
164
+ end
165
+ end
166
+
167
+ private
168
+
169
+ ##
170
+ # Always make requests as JSON.
171
+ def base_query_options
172
+ { :format => 'json' }
173
+ end
174
+
175
+ ##
176
+ # Peform error checking on responses.
177
+ def check_response_errors(response)
178
+ # Raise specific errors
179
+ raise InvalidCredentialError.new(response['error']) if response.code == 401
180
+ raise ObjectNotFoundError if response.code == 404
181
+
182
+ # Raise a general error
183
+ if response.is_a?(Hash) and (error = response['error'] || response['errors'])
184
+ raise SignalCloudError.new(error)
185
+ end
186
+ end
187
+
188
+ end
189
+
190
+ end
@@ -0,0 +1,25 @@
1
+ # -*- encoding: utf-8 -*-
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'signalcloud/version'
5
+
6
+ Gem::Specification.new do |gem|
7
+ gem.name = "signalcloud"
8
+ gem.version = SignalCloud::VERSION
9
+ gem.authors = ["Ian Lloyd"]
10
+ gem.email = ["ian@signalcloudapp.com"]
11
+ gem.description = %q{Access the SignalCloud API to manage tickets.}
12
+ gem.summary = %q{Tap into the SignalCloud API.}
13
+ gem.homepage = "http://www.signalcloudapp.com/api"
14
+
15
+ gem.files = `git ls-files`.split($/)
16
+ gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
17
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
18
+ gem.require_paths = ["lib"]
19
+
20
+ gem.add_dependency 'api_smith', '~> 1.3.0'
21
+
22
+ gem.add_development_dependency 'rspec'
23
+ gem.add_development_dependency 'rspec-its'
24
+ gem.add_development_dependency 'simplecov'
25
+ end
@@ -0,0 +1,34 @@
1
+ require 'spec_helper'
2
+
3
+ describe SignalCloud::Client do
4
+ let(:service_uri) { 'http://localhost:5000' }
5
+ let(:client) { SignalCloud::Client.new( username, password, base_uri: service_uri) }
6
+
7
+ context 'when valid' do
8
+ let(:username) { ENV['SIGNALCLOUD_TEST_USERNAME'] }
9
+ let(:password) { ENV['SIGNALCLOUD_TEST_PASSWORD'] }
10
+ it 'does not raise an error' do
11
+ expect{ client.organizations }.not_to raise_error
12
+ end
13
+ end
14
+
15
+ context 'when invalid' do
16
+ let(:username) { 'bad' }
17
+ let(:password) { 'credential' }
18
+ it 'raises invalid credential error' do
19
+ expect{ client.organizations }.to raise_error(SignalCloud::InvalidCredentialError)
20
+ end
21
+ end
22
+
23
+ context 'when providing bogus organization options' do
24
+ let(:client) { test_client }
25
+ it 'raises not found' do
26
+ expect{ client.organization(-1) }.to raise_error(SignalCloud::ObjectNotFoundError)
27
+ end
28
+ it 'raises misc error' do
29
+ pending('Need to configure server to not redirect when format is JSON.')
30
+ expect{ client.organization(2) }.to raise_error(SignalCloud::SignalCloudError)
31
+ end
32
+ end
33
+
34
+ end
@@ -0,0 +1,44 @@
1
+ require 'spec_helper'
2
+
3
+ describe SignalCloud::Client do
4
+ let(:client) { test_client }
5
+ let!(:organization_id) { client.organizations.first.id }
6
+
7
+ describe '#conversations' do
8
+ it 'returns a list of conversations' do
9
+ expect( client.conversations(organization_id) ).not_to be_empty
10
+ end
11
+ end
12
+
13
+ describe '#conversation' do
14
+ let!(:conversation_id) { client.conversations(organization_id).first.id }
15
+
16
+ it 'returns a conversation object' do
17
+ client.conversation(organization_id, conversation_id).should be_a( SignalCloud::Conversation )
18
+ end
19
+ it 'returns the requested conversation' do
20
+ client.conversation(organization_id, conversation_id).id.should == conversation_id
21
+ end
22
+ end
23
+
24
+ describe '#start_conversation' do
25
+ let(:stencil_id) { 2 }
26
+ # let(:stencil_id) { client.stencils(organization_id).first.id }
27
+ let(:number) { ENV['TEST_NUMBER'] }
28
+ let(:options) do
29
+ {
30
+ stencil_id: stencil_id,
31
+ customer_number: number
32
+ }
33
+ end
34
+
35
+ it 'starts a new conversation from a stencil' do
36
+ conversation = nil
37
+ expect{ conversation = client.start_conversation( organization_id, options ) }.not_to raise_error
38
+ expect( conversation.id).not_to be_nil
39
+ expect( conversation.customer_number ).to eq( number )
40
+ expect( conversation.internal_number ).not_to be_nil
41
+ end
42
+ end
43
+
44
+ end
@@ -0,0 +1,23 @@
1
+ require 'spec_helper'
2
+
3
+ describe SignalCloud::Client do
4
+ let(:client) { test_client }
5
+
6
+ describe '#organizations' do
7
+ it 'returns a list of organizations' do
8
+ expect( client.organizations ).not_to be_empty
9
+ end
10
+ end
11
+
12
+ describe '#organization' do
13
+ let!(:organization_id) { client.organizations.first.id }
14
+
15
+ it 'returns an organization object' do
16
+ client.organization(organization_id).should be_a( SignalCloud::Organization )
17
+ end
18
+ it 'returns the requested organization' do
19
+ client.organization(organization_id).id.should == organization_id
20
+ end
21
+ end
22
+
23
+ end
@@ -0,0 +1,24 @@
1
+ require 'spec_helper'
2
+
3
+ describe SignalCloud::Client do
4
+ let(:client) { test_client }
5
+ let!(:organization_id) { client.organizations.first.id }
6
+
7
+ describe '#stencils' do
8
+ it 'returns a list of stencils' do
9
+ expect( client.stencils(organization_id) ).not_to be_empty
10
+ end
11
+ end
12
+
13
+ describe '#stencil' do
14
+ let(:stencil_id) { client.stencils(organization_id).first.id }
15
+
16
+ it 'returns a stencil object' do
17
+ client.stencil(organization_id, stencil_id).should be_a( SignalCloud::Stencil )
18
+ end
19
+ it 'returns the requested stencil' do
20
+ client.stencil(organization_id, stencil_id).id.should == stencil_id
21
+ end
22
+ end
23
+
24
+ end
@@ -0,0 +1,103 @@
1
+ require 'spec_helper'
2
+
3
+ describe SignalCloud::Client do
4
+
5
+ describe '.new' do
6
+ let(:username) { 'user' }
7
+ let(:password) { 'pass' }
8
+
9
+ context 'when using explicit credentials' do
10
+ subject { SignalCloud::Client.new( username, password ) }
11
+ its(:username) { should == username }
12
+ its(:password) { should == password }
13
+ end
14
+
15
+ context 'when using environment credentials' do
16
+ before(:each) do # Set environment variables
17
+ ENV['SIGNALCLOUD_USERNAME'] = username
18
+ ENV['SIGNALCLOUD_PASSWORD'] = password
19
+ end
20
+ after(:each) do # Purge environment variables
21
+ ENV.delete 'SIGNALCLOUD_USERNAME'
22
+ ENV.delete 'SIGNALCLOUD_PASSWORD'
23
+ end
24
+ subject { SignalCloud::Client.new() }
25
+ its(:username) { should == username }
26
+ its(:password) { should == password }
27
+ end
28
+
29
+ context 'when missing credentials' do
30
+ before(:each) do # Purge environment variables
31
+ ENV.delete 'SIGNALCLOUD_USERNAME'
32
+ ENV.delete 'SIGNALCLOUD_PASSWORD'
33
+ end
34
+ it 'raises error on nil username' do
35
+ expect { SignalCloud::Client.new( nil, password ) }.to raise_error
36
+ end
37
+ it 'raises error on nil password' do
38
+ expect { SignalCloud::Client.new( username, nil ) }.to raise_error
39
+ end
40
+ it 'raises error on missing password' do
41
+ expect { SignalCloud::Client.new( username ) }.to raise_error
42
+ end
43
+ it 'raises error on missing username and password' do
44
+ expect { SignalCloud::Client.new() }.to raise_error
45
+ end
46
+ end
47
+
48
+ context 'when providing options' do
49
+ let(:base_uri) { 'http://localhost:5000' }
50
+ let(:options) {
51
+ { base_uri: base_uri }
52
+ }
53
+ subject { SignalCloud::Client.new( username, password, options ) }
54
+
55
+ its('class.base_uri') { should == base_uri }
56
+ end
57
+
58
+ context 'when using environment URI' do
59
+ before(:each) do # Set environment variables
60
+ ENV['SIGNALCLOUD_USERNAME'] = username
61
+ ENV['SIGNALCLOUD_PASSWORD'] = password
62
+ ENV['SIGNALCLOUD_URI'] = uri_or_region
63
+ end
64
+ after(:each) do # Purge environment variables
65
+ ENV.delete 'SIGNALCLOUD_USERNAME'
66
+ ENV.delete 'SIGNALCLOUD_PASSWORD'
67
+ ENV.delete 'SIGNALCLOUD_URI'
68
+ end
69
+ subject { SignalCloud::Client.new }
70
+
71
+ context 'when using US region' do
72
+ let(:uri_or_region) { 'US' }
73
+ let(:expected_uri) { SignalCloud::US_BASE_URI }
74
+
75
+ its('class.base_uri') { should == expected_uri }
76
+ end
77
+
78
+ context 'when using EU region' do
79
+ let(:uri_or_region) { 'EU' }
80
+ let(:expected_uri) { SignalCloud::EU_BASE_URI }
81
+
82
+ its('class.base_uri') { should == expected_uri }
83
+ end
84
+
85
+ context 'when using default region' do
86
+ let(:uri_or_region) { nil }
87
+ let(:expected_uri) { SignalCloud::DEFAULT_BASE_URI }
88
+
89
+ its('class.base_uri') { should == expected_uri }
90
+ end
91
+
92
+ context 'when using custom URI' do
93
+ let(:uri_or_region) { 'http://localhost:80' }
94
+ let(:expected_uri) { uri_or_region }
95
+
96
+ its('class.base_uri') { should == expected_uri }
97
+ end
98
+
99
+ end
100
+
101
+ end
102
+
103
+ end
@@ -0,0 +1,29 @@
1
+ require 'rspec/its'
2
+ require 'simplecov'
3
+ SimpleCov.start 'rails'
4
+
5
+ require 'signalcloud'
6
+
7
+ # This file was generated by the `rspec --init` command. Conventionally, all
8
+ # specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
9
+ # Require this file using `require "spec_helper"` to ensure that it is only
10
+ # loaded once.
11
+ #
12
+ # See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
13
+ RSpec.configure do |config|
14
+ config.run_all_when_everything_filtered = true
15
+ config.filter_run :focus
16
+
17
+ # Run specs in random order to surface order dependencies. If you find an
18
+ # order dependency and want to debug it, you can fix the order by providing
19
+ # the seed, which is printed after each run.
20
+ # --seed 1234
21
+ config.order = 'random'
22
+ end
23
+
24
+ def test_client
25
+ username = ENV['SIGNALCLOUD_TEST_USERNAME']
26
+ password = ENV['SIGNALCLOUD_TEST_PASSWORD']
27
+ service_uri = 'http://localhost:5000'
28
+ SignalCloud::Client.new( username, password, base_uri: service_uri)
29
+ end
data/tasks/brutes.rb ADDED
@@ -0,0 +1 @@
1
+ # I'm just an empty file to hold open the tasks directory!
metadata ADDED
@@ -0,0 +1,126 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: signalcloud
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Ian Lloyd
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-06-22 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: api_smith
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ~>
18
+ - !ruby/object:Gem::Version
19
+ version: 1.3.0
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ~>
25
+ - !ruby/object:Gem::Version
26
+ version: 1.3.0
27
+ - !ruby/object:Gem::Dependency
28
+ name: rspec
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '>='
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec-its
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - '>='
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: simplecov
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - '>='
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ description: Access the SignalCloud API to manage tickets.
70
+ email:
71
+ - ian@signalcloudapp.com
72
+ executables: []
73
+ extensions: []
74
+ extra_rdoc_files: []
75
+ files:
76
+ - .gitignore
77
+ - .rspec
78
+ - Gemfile
79
+ - LICENSE.txt
80
+ - README.md
81
+ - Rakefile
82
+ - lib/signalcloud.rb
83
+ - lib/signalcloud/conversation.rb
84
+ - lib/signalcloud/message.rb
85
+ - lib/signalcloud/organization.rb
86
+ - lib/signalcloud/stencil.rb
87
+ - lib/signalcloud/time_transformer.rb
88
+ - lib/signalcloud/version.rb
89
+ - signalcloud.gemspec
90
+ - spec/integration/authentication_spec.rb
91
+ - spec/integration/conversation_spec.rb
92
+ - spec/integration/organizations_spec.rb
93
+ - spec/integration/stencils_spec.rb
94
+ - spec/models/client_spec.rb
95
+ - spec/spec_helper.rb
96
+ - tasks/brutes.rb
97
+ homepage: http://www.signalcloudapp.com/api
98
+ licenses: []
99
+ metadata: {}
100
+ post_install_message:
101
+ rdoc_options: []
102
+ require_paths:
103
+ - lib
104
+ required_ruby_version: !ruby/object:Gem::Requirement
105
+ requirements:
106
+ - - '>='
107
+ - !ruby/object:Gem::Version
108
+ version: '0'
109
+ required_rubygems_version: !ruby/object:Gem::Requirement
110
+ requirements:
111
+ - - '>='
112
+ - !ruby/object:Gem::Version
113
+ version: '0'
114
+ requirements: []
115
+ rubyforge_project:
116
+ rubygems_version: 2.0.6
117
+ signing_key:
118
+ specification_version: 4
119
+ summary: Tap into the SignalCloud API.
120
+ test_files:
121
+ - spec/integration/authentication_spec.rb
122
+ - spec/integration/conversation_spec.rb
123
+ - spec/integration/organizations_spec.rb
124
+ - spec/integration/stencils_spec.rb
125
+ - spec/models/client_spec.rb
126
+ - spec/spec_helper.rb