cloudability 0.1.1 → 0.2.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 91765810ca59b0ee578b639e8a4e0501eb63e50c
4
- data.tar.gz: aafec5772c39d5c7b3dd65ff19cecac6a9f4f82c
3
+ metadata.gz: ddc770d8cb1f5cdd7e1546ddddc42fae2048ac06
4
+ data.tar.gz: f6226c701edf4e9705c8ccf7970c7b350993c1fb
5
5
  SHA512:
6
- metadata.gz: 2363768fce7a35a567eb39897757ed8b815dda2f41f446c33a4b49cd3a911c8b1e896a7d74ecff5611b799b9cb223f4179b6437b490594ebea448e003e8b4612
7
- data.tar.gz: 2968647530d907f388c1cbc87c2f6686ff2ff80b4a6a44ed27db3fc1cb53c5b56f97088ecec1782810e4eaf705710bb0017ff10cf9af893c0c7fd37c623a2bd1
6
+ metadata.gz: 33f8e41eb9ff120c543a5727037a74ec04c24afc0680b414038b6622b9fc3067bf28ca856eda6053c89e38cb8d168ca9c5f2671e79324b0e090591226a5419a5
7
+ data.tar.gz: 464394c8237dc1f7f6d5aa0903e8d641ea8a9b0bf8daf58bff8f5e76058a5dab997712853d76a35ea8c2ed2a55411776114b9c496013394c98fbd2225495c3f3
@@ -1,5 +1,5 @@
1
1
  language: ruby
2
2
  rvm:
3
- - 1.9.2
4
3
  - 1.9.3
5
- - 2.0.0
4
+ - 2.0.0
5
+ - 2.2.2
data/README.md CHANGED
@@ -4,8 +4,9 @@ Cloudability
4
4
  [![Build Status](https://travis-ci.org/ColbyAley/cloudability.png?branch=master)](https://travis-ci.org/ColbyAley/cloudability)
5
5
  [![Code Climate](https://codeclimate.com/github/ColbyAley/cloudability.png)](https://codeclimate.com/github/ColbyAley/cloudability)
6
6
  [![Coverage Status](https://coveralls.io/repos/ColbyAley/cloudability/badge.png)](https://coveralls.io/r/ColbyAley/cloudability)
7
+ [![Gem Version](https://badge.fury.io/rb/cloudability.png)](http://badge.fury.io/rb/cloudability)
7
8
 
8
- Ruby wrapper for the [Cloudability API](http://developers.cloudability.com/). Supports most of the public API endpoints, including some legacy ones such as bugets. Converts JSON responses to objects with Hashie::Mash.
9
+ Ruby wrapper for the [Cloudability API](http://developers.cloudability.com/). Supports most public API endpoints, including some legacy ones such as budgets. Converts JSON responses to objects with Hashie::Mash.
9
10
 
10
11
  This is the README for version 0.1.0 of the gem. v0.1.0 introduces a radically different interface. If you're still on v0.0.5, please refer to it's [README](https://github.com/ColbyAley/cloudability/tree/v0.0.5).
11
12
 
@@ -34,10 +35,10 @@ Or install it yourself as:
34
35
  * Cost Reporrts
35
36
  * Usage Reports
36
37
 
37
- You will need to generate an API token to use the API. Read more [here](https://support.cloudability.com/hc/en-us/articles/200311933-API-Setup-and-Documentation).
38
+ You will need to generate an API token to use the API. Read more [here](https://support.cloudability.com/hc/en-us/articles/204308448-API-setup-and-documentation).
39
+
40
+ Feel free to shoot me an email at colby@aley.me if you have any questions or need help.
38
41
 
39
- Feel free to shoot me an email at colby@cloudability.com if you have any questions or need help.
40
-
41
42
  ### Examples
42
43
 
43
44
  @client = Cloudability::Client.new(auth_token: 'auth_token')
@@ -79,11 +80,6 @@ Feel free to shoot me an email at colby@cloudability.com if you have any questio
79
80
  @client.usage_measures # List measures supported by server
80
81
  @client.usage_filters # List filters supported by the server
81
82
 
82
- ## TODO:
83
- * Better tests!
84
- * More endpoints!
85
- * More awesomeness!
86
-
87
83
  ## Contributing
88
84
 
89
85
  1. Fork it
@@ -24,4 +24,5 @@ Gem::Specification.new do |gem|
24
24
  gem.add_development_dependency('fakeweb')
25
25
  gem.add_development_dependency('rake', '~> 0.6')
26
26
  gem.add_development_dependency('coveralls')
27
+ gem.add_development_dependency('pry')
27
28
  end
@@ -7,6 +7,7 @@ require 'cloudability/client/usage_reports'
7
7
  require 'cloudability/client/budgets'
8
8
  require 'cloudability/client/credentials'
9
9
  require 'cloudability/client/organizations'
10
+ require 'cloudability/client/users'
10
11
 
11
12
  require 'cloudability/version'
12
13
 
@@ -16,17 +17,19 @@ module Cloudability
16
17
  class RequestError < StandardError; end
17
18
 
18
19
  class Client
19
- include Cloudability::Client::BillingReports
20
- include Cloudability::Client::UsageReports
21
- include Cloudability::Client::CostReports
22
- include Cloudability::Client::Budgets
23
- include Cloudability::Client::Credentials
24
- include Cloudability::Client::Organizations
20
+ include BillingReports
21
+ include UsageReports
22
+ include CostReports
23
+ include Budgets
24
+ include Credentials
25
+ include Organizations
26
+ include Users
27
+
25
28
  include HTTParty
26
29
 
27
- def initialize(options={})
28
- raise ArgumentError, "You must provide an auth token" if options[:auth_token].nil?
29
- @auth_token = options[:auth_token]
30
+ def initialize(opts={})
31
+ raise ArgumentError, "You must provide an auth token" if opts[:auth_token].nil?
32
+ @auth_token = opts[:auth_token]
30
33
  end
31
34
 
32
35
  base_uri 'https://app.cloudability.com/api'
@@ -61,12 +64,12 @@ module Cloudability
61
64
  array.map { |element| Hashie::Mash.new(element) }
62
65
  end
63
66
 
64
- def options(o={})
65
- o[:query] ||= {}
66
- o[:headers] ||= {}
67
- o[:headers]['User-Agent'] = "Cloudability-Ruby #{Cloudability::VERSION}"
68
- o[:query][:auth_token] = @auth_token
69
- o
67
+ def options(opts={})
68
+ opts[:query] ||= {}
69
+ opts[:headers] ||= {}
70
+ opts[:headers]['User-Agent'] = "Cloudability-Ruby #{Cloudability::VERSION}"
71
+ opts[:query][:auth_token] = @auth_token
72
+ opts
70
73
  end
71
74
 
72
75
  end
@@ -0,0 +1,57 @@
1
+ module Cloudability
2
+ class Client
3
+ module Users
4
+ # Documentation: http://developers.cloudability.com/resources/users/
5
+
6
+ # List users in your organization.
7
+ #
8
+ # @return [Array] array of Hashie::Mashes
9
+ def users
10
+ request = get '/1/users'
11
+ convert_to_mashes(request)
12
+ end
13
+
14
+ # Add a user to your organization
15
+ #
16
+ # @param [String] email of user
17
+ # @param [Hash] options
18
+ # @option [String] full_name
19
+ # @option [String] role
20
+ # @option [Boolean] restricted
21
+ # @option [Array] new_shared_dimension_filter_set_ids
22
+ # @option [Integer] default_dimension_filter_set_id
23
+ # @return [Array] array of Hashie::Mashes
24
+ def add_user(email, options={})
25
+ options[:email] = email
26
+
27
+ payload = {user: options}
28
+ request = post '/1/users', payload
29
+ Hashie::Mash.new request
30
+ end
31
+
32
+ # Update a user in your organization
33
+ #
34
+ # @param [Integer] ID of user
35
+ # @param [Hash] options
36
+ # @option [String] full_name
37
+ # @option [String] role
38
+ # @option [Boolean] restricted
39
+ # @option [Array] new_shared_dimension_filter_set_ids
40
+ # @option [Integer] default_dimension_filter_set_id
41
+ # @return [Array] array of Hashie::Mashes
42
+ def update_user(id, options={})
43
+ payload = {user: options}
44
+ request = put "/1/users/#{id}", payload
45
+ Hashie::Mash.new request
46
+ end
47
+
48
+ # Delete a user in your organization
49
+ #
50
+ # @param [Integer] ID of user
51
+ # @return [Boolean] success
52
+ def delete_user(id)
53
+ delete "/1/users/#{id}"
54
+ end
55
+ end
56
+ end
57
+ end
@@ -1,3 +1,3 @@
1
1
  module Cloudability
2
- VERSION = '0.1.1'
2
+ VERSION = '0.2.0'
3
3
  end
@@ -1,35 +1,32 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Cloudability::Client::BillingReports do
4
-
5
- before do
6
- @client = Cloudability::Client.new(auth_token: 'token')
7
- end
4
+ let(:client) { Cloudability::Client.new(auth_token: 'token') }
8
5
 
9
6
  describe '#billing_reports' do
10
7
  it 'should be an array' do
11
8
  stub_get('/1/billing_reports?auth_token=token', 'billing_reports')
12
- @client.billing_report.should be_kind_of Array
9
+ client.billing_report.should be_kind_of Array
13
10
  end
14
11
 
15
12
  it 'should be an array of Hashie::Mashes' do
16
13
  stub_get('/1/billing_reports?auth_token=token', 'billing_reports')
17
- @client.billing_report.each{|report| report.should be_kind_of Hashie::Mash }
14
+ client.billing_report.each{|report| report.should be_kind_of Hashie::Mash }
18
15
  end
19
16
 
20
17
  it 'should have a currency attrubute on every element' do
21
18
  stub_get('/1/billing_reports?auth_token=token', 'billing_reports')
22
- @client.billing_report.each{|report| report.currency.should_not be_nil }
19
+ client.billing_report.each{|report| report.currency.should_not be_nil }
23
20
  end
24
21
 
25
22
  it 'should return results by service' do
26
23
  stub_get('/1/billing_reports?auth_token=token&by=service', 'billing_reports')
27
- expect { @client.billing_report(by: 'service') }.not_to raise_exception
24
+ expect { client.billing_report(by: 'service') }.not_to raise_exception
28
25
  end
29
26
 
30
27
  it 'should return results given by service, given the vendor and period' do
31
28
  stub_get('/1/billing_reports?auth_token=token&by=service&vendor=Amazon&period=2012-03-01', 'billing_reports')
32
- expect { @client.billing_report(by: 'service', vendor: 'Amazon', period: '2012-03-01') }.not_to raise_exception
29
+ expect { client.billing_report(by: 'service', vendor: 'Amazon', period: '2012-03-01') }.not_to raise_exception
33
30
  end
34
31
  end
35
32
  end
@@ -1,30 +1,27 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Cloudability::Client::Budgets do
4
-
5
- before do
6
- @client = Cloudability::Client.new(auth_token: 'token')
7
- end
4
+ let(:client) { Cloudability::Client.new(auth_token: 'token') }
8
5
 
9
6
  describe '#budgets' do
10
7
  it 'should be an array' do
11
8
  stub_get('/1/budgets/index?auth_token=token', 'budgets')
12
- @client.budgets.should be_kind_of Array
9
+ client.budgets.should be_kind_of Array
13
10
  end
14
11
 
15
12
  it 'should be an array of Hashie::Mashes' do
16
13
  stub_get('/1/budgets/index?auth_token=token', 'budgets')
17
- @client.budgets.each{|budget| budget.should be_kind_of Hashie::Mash }
14
+ client.budgets.each{|budget| budget.should be_kind_of Hashie::Mash }
18
15
  end
19
16
 
20
17
  it 'should be mappable by ID' do
21
18
  stub_get('/1/budgets/index?auth_token=token', 'budgets')
22
- @client.budgets.map(&:id).should be_kind_of Array
19
+ client.budgets.map(&:id).should be_kind_of Array
23
20
  end
24
21
 
25
22
  it 'should be mappable by ID and not be empty' do
26
23
  stub_get('/1/budgets/index?auth_token=token', 'budgets')
27
- @client.budgets.map(&:id).should_not be_empty
24
+ client.budgets.map(&:id).should_not be_empty
28
25
  end
29
26
  end
30
27
  end
@@ -1,79 +1,76 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Cloudability::Client::CostReports do
4
-
5
- before do
6
- @client = Cloudability::Client.new(auth_token: 'token')
7
- end
4
+ let(:client) { Cloudability::Client.new(auth_token: 'token') }
8
5
 
9
6
  describe '#cost_reports' do
10
7
  it 'should be an array' do
11
8
  stub_get('/1/reporting/cost?auth_token=token', 'cost/reports')
12
- @client.cost_reports.should be_kind_of Array
9
+ client.cost_reports.should be_kind_of Array
13
10
  end
14
11
 
15
12
  it 'should be mappable by ID' do
16
13
  stub_get('/1/reporting/cost?auth_token=token', 'cost/reports')
17
- @client.cost_reports.map(&:id).should be_kind_of Array
14
+ client.cost_reports.map(&:id).should be_kind_of Array
18
15
  end
19
16
 
20
17
  it 'should be mappable by ID and not be empty' do
21
18
  stub_get('/1/reporting/cost?auth_token=token', 'cost/reports')
22
- @client.cost_reports.map(&:id).should_not be_empty
19
+ client.cost_reports.map(&:id).should_not be_empty
23
20
  end
24
21
 
25
22
  it 'should be mappable by category and not be empty' do
26
23
  stub_get('/1/reporting/cost?auth_token=token', 'cost/reports')
27
- @client.cost_reports.map(&:category).should_not be_empty
24
+ client.cost_reports.map(&:category).should_not be_empty
28
25
  end
29
26
 
30
27
  it 'should be an array of Hashie::Mashes' do
31
28
  stub_get('/1/reporting/cost?auth_token=token', 'cost/reports')
32
- @client.cost_reports.each{|report| report.should be_kind_of Hashie::Mash }
29
+ client.cost_reports.each{|report| report.should be_kind_of Hashie::Mash }
33
30
  end
34
31
  end
35
32
 
36
33
  describe '#cost_measures' do
37
34
  it 'should be an array' do
38
35
  stub_get('/1/reporting/cost/measures?auth_token=token', 'cost/measures')
39
- @client.cost_measures.should be_kind_of Array
36
+ client.cost_measures.should be_kind_of Array
40
37
  end
41
38
 
42
39
  it 'should be mappable by type' do
43
40
  stub_get('/1/reporting/cost/measures?auth_token=token', 'cost/measures')
44
- @client.cost_measures.map(&:type).should be_kind_of Array
41
+ client.cost_measures.map(&:type).should be_kind_of Array
45
42
  end
46
43
 
47
44
  it 'should be mappable by type and not be empty' do
48
45
  stub_get('/1/reporting/cost/measures?auth_token=token', 'cost/measures')
49
- @client.cost_measures.map(&:type).should_not be_empty
46
+ client.cost_measures.map(&:type).should_not be_empty
50
47
  end
51
48
 
52
49
  it 'should be an array of Hashie::Mashes' do
53
50
  stub_get('/1/reporting/cost/measures?auth_token=token', 'cost/measures')
54
- @client.cost_measures.each{|measure| measure.should be_kind_of Hashie::Mash }
51
+ client.cost_measures.each{|measure| measure.should be_kind_of Hashie::Mash }
55
52
  end
56
53
  end
57
54
 
58
55
  describe '#cost_filters' do
59
56
  it 'should be an array' do
60
57
  stub_get('/1/reporting/cost/filters?auth_token=token', 'cost/filters')
61
- @client.cost_filters.should be_kind_of Array
58
+ client.cost_filters.should be_kind_of Array
62
59
  end
63
60
 
64
61
  it 'should not be an empty array' do
65
62
  stub_get('/1/reporting/cost/filters?auth_token=token', 'cost/filters')
66
- @client.cost_filters.should_not be_empty
63
+ client.cost_filters.should_not be_empty
67
64
  end
68
65
 
69
66
  it 'should not be an empty array' do
70
67
  stub_get('/1/reporting/cost/filters?auth_token=token', 'cost/filters')
71
- @client.cost_filters.should_not be_empty
68
+ client.cost_filters.should_not be_empty
72
69
  end
73
70
 
74
71
  it 'should be an array of strings' do
75
72
  stub_get('/1/reporting/cost/filters?auth_token=token', 'cost/filters')
76
- @client.cost_filters.each{|filter| filter.should be_kind_of String }
73
+ client.cost_filters.each{|filter| filter.should be_kind_of String }
77
74
  end
78
75
  end
79
76
  end
@@ -1,20 +1,17 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Cloudability::Client::Credentials do
4
-
5
- before do
6
- @client = Cloudability::Client.new(auth_token: 'token')
7
- end
4
+ let(:client) { Cloudability::Client.new(auth_token: 'token') }
8
5
 
9
6
  describe '#credentials' do
10
7
  it 'should be an array' do
11
8
  stub_get('/0/credentials/index?auth_token=token', 'credentials')
12
- @client.credentials.should be_kind_of Array
9
+ client.credentials.should be_kind_of Array
13
10
  end
14
11
 
15
12
  it 'should be an array of Hashie::Mashes' do
16
13
  stub_get('/0/credentials/index?auth_token=token', 'credentials')
17
- @client.credentials.each{|report| report.should be_kind_of Hashie::Mash }
14
+ client.credentials.each{|report| report.should be_kind_of Hashie::Mash }
18
15
  end
19
16
  end
20
17
  end
@@ -1,83 +1,80 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Cloudability::Client::Organizations do
4
+ let(:client) { Cloudability::Client.new(auth_token: 'token') }
4
5
 
5
- before do
6
- @client = Cloudability::Client.new(auth_token: 'token')
7
- end
8
-
9
6
  describe '#my_organization' do
10
7
  it 'should be a Hashie::Mashe' do
11
8
  stub_get('/1/organizations?auth_token=token', 'organization')
12
- @client.my_organization.should be_kind_of Hashie::Mash
9
+ client.my_organization.should be_kind_of Hashie::Mash
13
10
  end
14
11
  end
15
12
 
16
13
  describe '#organization_invitations' do
17
14
  it 'should be an Array' do
18
15
  stub_get('/1/organizations/invitations?auth_token=token', 'organization_invitations')
19
- @client.organization_invitations.should be_kind_of Array
16
+ client.organization_invitations.should be_kind_of Array
20
17
  end
21
18
 
22
19
  it 'should be an array of Hashie::Mashes' do
23
20
  stub_get('/1/organizations/invitations?auth_token=token', 'organization_invitations')
24
- @client.organization_invitations.each{|invite| invite.should be_kind_of Hashie::Mash }
21
+ client.organization_invitations.each{|invite| invite.should be_kind_of Hashie::Mash }
25
22
  end
26
23
 
27
24
  it 'should be mappable by ID' do
28
25
  stub_get('/1/organizations/invitations?auth_token=token', 'organization_invitations')
29
- @client.organization_invitations.map(&:id).should be_kind_of Array
26
+ client.organization_invitations.map(&:id).should be_kind_of Array
30
27
  end
31
28
 
32
29
  it 'should be mappable by ID and not be empty' do
33
30
  stub_get('/1/organizations/invitations?auth_token=token', 'organization_invitations')
34
- @client.organization_invitations.map(&:id).should_not be_empty
31
+ client.organization_invitations.map(&:id).should_not be_empty
35
32
  end
36
33
  end
37
34
 
38
35
  describe '#organization_roles' do
39
36
  it 'should be an Array' do
40
37
  stub_get('/1/organizations/roles?auth_token=token', 'organization_roles')
41
- @client.organization_roles.should be_kind_of Array
38
+ client.organization_roles.should be_kind_of Array
42
39
  end
43
40
 
44
41
  it 'should be an array of Hashie::Mashes' do
45
42
  stub_get('/1/organizations/roles?auth_token=token', 'organization_roles')
46
- @client.organization_roles.each{|role| role.should be_kind_of Hashie::Mash }
43
+ client.organization_roles.each{|role| role.should be_kind_of Hashie::Mash }
47
44
  end
48
45
  end
49
46
 
50
47
  describe '#invite_user' do
51
48
  it 'should be a Hashie::Mash' do
52
49
  stub_post('/1/organizations/invitations?auth_token=token&email=colbyaleyrb%40gmail.com', 'organization_invitation')
53
- @client.invite_user('colbyaleyrb@gmail.com').should be_kind_of Hashie::Mash
50
+ client.invite_user('colbyaleyrb@gmail.com').should be_kind_of Hashie::Mash
54
51
  end
55
52
 
56
53
  it 'should accept a hash with email and name' do
57
54
  stub_post('/1/organizations/invitations?auth_token=token&email=colbyaleyrb%40gmail.com&name=colby', 'organization_invitation')
58
- expect { @client.invite_user('colbyaleyrb@gmail.com', name: 'colby') }.not_to raise_exception
55
+ expect { client.invite_user('colbyaleyrb@gmail.com', name: 'colby') }.not_to raise_exception
59
56
  end
60
57
  end
61
58
 
62
59
  describe '#delete_invite' do
63
60
  it 'should should not raise an exception when id is provided' do
64
61
  stub_delete('/1/organizations/invitations/1?auth_token=token', 'organization_invitation')
65
- expect { @client.delete_invite(1) }.not_to raise_exception
62
+ expect { client.delete_invite(1) }.not_to raise_exception
66
63
  end
67
64
 
68
65
  it 'should require id as an argument' do
69
- expect { @client.delete_invite }.to raise_exception(ArgumentError)
66
+ expect { client.delete_invite }.to raise_exception(ArgumentError)
70
67
  end
71
68
  end
72
69
 
73
70
  describe '#update_invite' do
74
71
  it 'should should not raise an exception when id and role_id are provided' do
75
72
  stub_put('/1/organizations/invitations/1?role_id=1&auth_token=token', 'organization_invitation')
76
- expect { @client.update_invite(1,1) }.not_to raise_exception
73
+ expect { client.update_invite(1,1) }.not_to raise_exception
77
74
  end
78
75
 
79
76
  it 'should require id and role_id as arguments' do
80
- expect { @client.update_invite }.to raise_exception(ArgumentError)
77
+ expect { client.update_invite }.to raise_exception(ArgumentError)
81
78
  end
82
79
  end
83
- end
80
+ end
@@ -1,44 +1,41 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Cloudability::Client::UsageReports do
4
-
5
- before do
6
- @client = Cloudability::Client.new(auth_token: 'token')
7
- end
4
+ let(:client) { Cloudability::Client.new(auth_token: 'token') }
8
5
 
9
6
  describe '#usage_reports' do
10
7
  it 'should be an array' do
11
8
  stub_get('/1/reporting?auth_token=token', 'usage/reports')
12
- @client.usage_reports.should be_kind_of Array
9
+ client.usage_reports.should be_kind_of Array
13
10
  end
14
11
 
15
12
  it 'should be an array of Hashie::Mashes' do
16
13
  stub_get('/1/reporting?auth_token=token', 'usage/reports')
17
- @client.usage_reports.each{|report| report.should be_kind_of Hashie::Mash }
14
+ client.usage_reports.each{|report| report.should be_kind_of Hashie::Mash }
18
15
  end
19
16
  end
20
17
 
21
18
  describe '#usage_measures' do
22
19
  it 'should be an array' do
23
20
  stub_get('/1/reporting/measures?auth_token=token', 'usage/measures')
24
- @client.usage_measures.should be_kind_of Array
21
+ client.usage_measures.should be_kind_of Array
25
22
  end
26
23
 
27
24
  it 'should be an array of Hashie::Mashes' do
28
25
  stub_get('/1/reporting/measures?auth_token=token', 'usage/measures')
29
- @client.usage_measures.each{|measure| measure.should be_kind_of Hashie::Mash }
26
+ client.usage_measures.each{|measure| measure.should be_kind_of Hashie::Mash }
30
27
  end
31
28
  end
32
29
 
33
30
  describe '#usage_filters' do
34
31
  it 'should be an array' do
35
32
  stub_get('/1/reporting/filters?auth_token=token', 'usage/filters')
36
- @client.usage_filters.should be_kind_of Array
33
+ client.usage_filters.should be_kind_of Array
37
34
  end
38
35
 
39
36
  it 'should be an array of strings' do
40
37
  stub_get('/1/reporting/filters?auth_token=token', 'usage/filters')
41
- @client.usage_filters.each{|filter| filter.should be_kind_of String }
38
+ client.usage_filters.each{|filter| filter.should be_kind_of String }
42
39
  end
43
40
  end
44
- end
41
+ end
@@ -0,0 +1,38 @@
1
+ require 'spec_helper'
2
+
3
+ describe Cloudability::Client::Users do
4
+ let(:client) { Cloudability::Client.new(auth_token: 'token') }
5
+
6
+ describe '#users' do
7
+ it 'should return an array' do
8
+ stub_get('/1/users?auth_token=token', 'users/users')
9
+ client.users.should be_kind_of Array
10
+ end
11
+
12
+ it 'should return an array of Hashie::Mashes' do
13
+ stub_get('/1/users?auth_token=token', 'users/users')
14
+ client.users.each{|user| user.should be_kind_of Hashie::Mash }
15
+ end
16
+ end
17
+
18
+ describe '#add_user' do
19
+ it 'should return a Hashie::Mash' do
20
+ stub_post('/1/users?user[email]=colbyaley%40gmail.com&auth_token=token', 'users/add_user')
21
+ client.add_user('colbyaley@gmail.com').should be_kind_of Hashie::Mash
22
+ end
23
+ end
24
+
25
+ describe '#update_user' do
26
+ it 'should return a Hashie::Mash' do
27
+ stub_put('/1/users/23052?user[full_name]=Colby%20Aley&auth_token=token', 'users/update_user')
28
+ client.update_user('23052', full_name: 'Colby Aley').should be_kind_of Hashie::Mash
29
+ end
30
+ end
31
+
32
+ describe '#delete_user' do
33
+ it 'should return "true"' do
34
+ stub_delete('/1/users/23052?auth_token=token', 'users/delete_user')
35
+ client.delete_user('23052').body.should eq("true")
36
+ end
37
+ end
38
+ end
@@ -15,4 +15,4 @@ X-Runtime: 0.194231
15
15
  X-Rack-Cache: miss
16
16
  Origin: app.cloudability.com
17
17
 
18
- [{"predicted_monthly_spend":{"cents":1111111,"currency":{"id":111,"key":"usd","priority":1,"iso_code":"USD"}},"subject":"1111-1111-1111","type":"Account","currency":"USD","id":1111,"is_active":true,"threshold":"50000.0"},{"predicted_monthly_spend":{"cents":1111111,"currency":{"id":111,"key":"usd","priority":1,"iso_code":"USD"}},"subject":"colby@cloudability.com","type":"User","currency":"USD","id":1111,"is_active":true,"threshold":"100000.0"}]
18
+ [{"predicted_monthly_spend":{"cents":1111111,"currency":{"id":111,"key":"usd","priority":1,"iso_code":"USD"}},"subject":"1111-1111-1111","type":"Account","currency":"USD","id":1111,"is_active":true,"threshold":"50000.0"},{"predicted_monthly_spend":{"cents":1111111,"currency":{"id":111,"key":"usd","priority":1,"iso_code":"USD"}},"subject":"colby@cloudability.com","type":"User","currency":"USD","id":1111,"is_active":true,"threshold":"100000.0"}]
@@ -0,0 +1,17 @@
1
+ HTTP/1.1 201 Created
2
+ Server: nginx/1.7.4
3
+ Date: Sun, 01 Nov 2015 20:10:30 GMT
4
+ Content-Type: application/json
5
+ Content-Length: 191
6
+ Connection: keep-alive
7
+ Status: 201 Created
8
+ Strict-Transport-Security: max-age=31536000
9
+ X-UA-Compatible: IE=Edge,chrome=1
10
+ ETag: "52d5a5192986be3fea6505d5140bfe45"
11
+ Cache-Control: max-age=0, private, must-revalidate
12
+ X-Request-Id: e4edf6d852b2334add97ea58c9f5e43e
13
+ X-Runtime: 0.596605
14
+ X-Rack-Cache: invalidate, pass
15
+ X-Frame-Options: DENY
16
+
17
+ {"id":23052,"email":"colbyaley@gmail.com","full_name":null,"invitation":"pending","role":"User","restricted":false,"shared_dimension_filter_set_ids":[],"default_dimension_filter_set_id":null}
@@ -0,0 +1,17 @@
1
+ HTTP/1.1 200 OK
2
+ Server: nginx/1.7.5
3
+ Date: Sun, 01 Nov 2015 20:25:23 GMT
4
+ Content-Type: application/json
5
+ Content-Length: 4
6
+ Connection: keep-alive
7
+ Status: 200 OK
8
+ Strict-Transport-Security: max-age=31536000
9
+ X-UA-Compatible: IE=Edge,chrome=1
10
+ ETag: "b326b5062b2f0e69046810717534cb09"
11
+ Cache-Control: max-age=0, private, must-revalidate
12
+ X-Request-Id: 785c003402e2a15e4d0f09c858e46ff6
13
+ X-Runtime: 0.290896
14
+ X-Rack-Cache: invalidate, pass
15
+ X-Frame-Options: DENY
16
+
17
+ true
@@ -0,0 +1,17 @@
1
+ HTTP/1.1 200 OK
2
+ Server: nginx/1.7.7
3
+ Date: Sun, 01 Nov 2015 20:19:18 GMT
4
+ Content-Type: application/json
5
+ Content-Length: 916
6
+ Connection: keep-alive
7
+ Status: 200 OK
8
+ Strict-Transport-Security: max-age=31536000
9
+ X-UA-Compatible: IE=Edge,chrome=1
10
+ ETag: "1c5a29a9175969252b4352d2e56cf740"
11
+ Cache-Control: max-age=0, private, must-revalidate
12
+ X-Request-Id: 9e130fc8db3c2fc363866a16cf380ba2
13
+ X-Runtime: 0.069726
14
+ X-Rack-Cache: invalidate, pass
15
+ X-Frame-Options: DENY
16
+
17
+ {"id":23052,"full_name":"Colby Aley","email":"colbyaley@gmail.com","is_organization_admin":false,"is_billing_contact":false,"currency":{"key":"usd","symbol":"$","symbol_first":true,"thousands_separator":",","decimal_mark":".","subunit_to_unit":100},"invitation":"pending","role":"User","restricted":false,"shared_dimension_filter_set_ids":[],"default_dimension_filter_set_id":null,"is_enterprise":true,"ri_az_transfer_beta":false,"custom_rate_card_beta":false,"advanced_charting_beta":false,"dashboard_beta":true,"cost_cube_estimates_beta":true,"extended_account_groups_beta":false,"cost_per_hour_beta":false,"ri_portfolio_beta":false,"company":"Colby Aley","company_size":"2_3","company_sector":"software_and_web","time_zone":"Pacific Time (US \u0026 Canada)","language":"en-us","summary_period":"daily","summary_hour":6,"show_credentials":false,"exclude_credits":null,"exclude_capex":null,"config_state":"created"}
@@ -0,0 +1,17 @@
1
+ HTTP/1.1 200 OK
2
+ Server: nginx/1.7.8
3
+ Date: Sun, 01 Nov 2015 20:03:37 GMT
4
+ Content-Type: application/json
5
+ Content-Length: 391
6
+ Connection: keep-alive
7
+ Status: 200 OK
8
+ Strict-Transport-Security: max-age=31536000
9
+ X-UA-Compatible: IE=Edge,chrome=1
10
+ ETag: "18cfa380bed0c270c4ed01171c03a1c8"
11
+ Cache-Control: max-age=0, private, must-revalidate
12
+ X-Request-Id: 32e5e4dadaf751516b61af1b124026ec
13
+ X-Runtime: 0.052354
14
+ X-Rack-Cache: miss
15
+ X-Frame-Options: DENY
16
+
17
+ [{"id":23051,"email":"colby@immun.io","full_name":null,"invitation":"pending","role":"User","restricted":false,"shared_dimension_filter_set_ids":[],"default_dimension_filter_set_id":null},{"id":5902,"email":"colby@aley.me","full_name":"Colby Aley","invitation":"accepted","role":"Administrator","restricted":false,"shared_dimension_filter_set_ids":[],"default_dimension_filter_set_id":null}]
@@ -4,6 +4,7 @@ Coveralls.wear!
4
4
  require 'bundler'
5
5
  require 'fakeweb'
6
6
  require 'cloudability'
7
+ require 'pry'
7
8
 
8
9
  # Borrowed this Fixtures/Fakeweb implimentation
9
10
  # fromt the gauges-gem library.
@@ -47,4 +48,4 @@ FakeWeb.allow_net_connect = false
47
48
  FakeWeb.allow_net_connect = %r[^https?://coveralls.io/api/v1/jobs]
48
49
 
49
50
  # Creating fixtures:
50
- # curl -is https://app.cloudability.com/api/0/billing_reports?auth_token=token&by=account > spec/fixtures/billing_report
51
+ # curl -is https://app.cloudability.com/api/0/billing_reports?auth_token=token&by=account > spec/fixtures/billing_report
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cloudability
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Colby Aley
@@ -9,90 +9,104 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2014-01-07 00:00:00.000000000 Z
12
+ date: 2015-11-01 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: httparty
16
16
  requirement: !ruby/object:Gem::Requirement
17
17
  requirements:
18
- - - ~>
18
+ - - "~>"
19
19
  - !ruby/object:Gem::Version
20
20
  version: 0.9.0
21
21
  type: :runtime
22
22
  prerelease: false
23
23
  version_requirements: !ruby/object:Gem::Requirement
24
24
  requirements:
25
- - - ~>
25
+ - - "~>"
26
26
  - !ruby/object:Gem::Version
27
27
  version: 0.9.0
28
28
  - !ruby/object:Gem::Dependency
29
29
  name: hashie
30
30
  requirement: !ruby/object:Gem::Requirement
31
31
  requirements:
32
- - - '>='
32
+ - - ">="
33
33
  - !ruby/object:Gem::Version
34
34
  version: '0'
35
35
  type: :runtime
36
36
  prerelease: false
37
37
  version_requirements: !ruby/object:Gem::Requirement
38
38
  requirements:
39
- - - '>='
39
+ - - ">="
40
40
  - !ruby/object:Gem::Version
41
41
  version: '0'
42
42
  - !ruby/object:Gem::Dependency
43
43
  name: rspec
44
44
  requirement: !ruby/object:Gem::Requirement
45
45
  requirements:
46
- - - '>='
46
+ - - ">="
47
47
  - !ruby/object:Gem::Version
48
48
  version: '0'
49
49
  type: :development
50
50
  prerelease: false
51
51
  version_requirements: !ruby/object:Gem::Requirement
52
52
  requirements:
53
- - - '>='
53
+ - - ">="
54
54
  - !ruby/object:Gem::Version
55
55
  version: '0'
56
56
  - !ruby/object:Gem::Dependency
57
57
  name: fakeweb
58
58
  requirement: !ruby/object:Gem::Requirement
59
59
  requirements:
60
- - - '>='
60
+ - - ">="
61
61
  - !ruby/object:Gem::Version
62
62
  version: '0'
63
63
  type: :development
64
64
  prerelease: false
65
65
  version_requirements: !ruby/object:Gem::Requirement
66
66
  requirements:
67
- - - '>='
67
+ - - ">="
68
68
  - !ruby/object:Gem::Version
69
69
  version: '0'
70
70
  - !ruby/object:Gem::Dependency
71
71
  name: rake
72
72
  requirement: !ruby/object:Gem::Requirement
73
73
  requirements:
74
- - - ~>
74
+ - - "~>"
75
75
  - !ruby/object:Gem::Version
76
76
  version: '0.6'
77
77
  type: :development
78
78
  prerelease: false
79
79
  version_requirements: !ruby/object:Gem::Requirement
80
80
  requirements:
81
- - - ~>
81
+ - - "~>"
82
82
  - !ruby/object:Gem::Version
83
83
  version: '0.6'
84
84
  - !ruby/object:Gem::Dependency
85
85
  name: coveralls
86
86
  requirement: !ruby/object:Gem::Requirement
87
87
  requirements:
88
- - - '>='
88
+ - - ">="
89
89
  - !ruby/object:Gem::Version
90
90
  version: '0'
91
91
  type: :development
92
92
  prerelease: false
93
93
  version_requirements: !ruby/object:Gem::Requirement
94
94
  requirements:
95
- - - '>='
95
+ - - ">="
96
+ - !ruby/object:Gem::Version
97
+ version: '0'
98
+ - !ruby/object:Gem::Dependency
99
+ name: pry
100
+ requirement: !ruby/object:Gem::Requirement
101
+ requirements:
102
+ - - ">="
103
+ - !ruby/object:Gem::Version
104
+ version: '0'
105
+ type: :development
106
+ prerelease: false
107
+ version_requirements: !ruby/object:Gem::Requirement
108
+ requirements:
109
+ - - ">="
96
110
  - !ruby/object:Gem::Version
97
111
  version: '0'
98
112
  description: Ruby wrapper for the Cloudability API
@@ -103,8 +117,8 @@ executables: []
103
117
  extensions: []
104
118
  extra_rdoc_files: []
105
119
  files:
106
- - .gitignore
107
- - .travis.yml
120
+ - ".gitignore"
121
+ - ".travis.yml"
108
122
  - Gemfile
109
123
  - LICENSE.txt
110
124
  - README.md
@@ -117,13 +131,15 @@ files:
117
131
  - lib/cloudability/client/credentials.rb
118
132
  - lib/cloudability/client/organizations.rb
119
133
  - lib/cloudability/client/usage_reports.rb
134
+ - lib/cloudability/client/users.rb
120
135
  - lib/cloudability/version.rb
121
- - spec/cloduability/billing_spec.rb
122
- - spec/cloduability/budgets_spec.rb
123
- - spec/cloduability/cost_spec.rb
124
- - spec/cloduability/credentials_spec.rb
125
- - spec/cloduability/organizations_spec.rb
126
- - spec/cloduability/usage_spec.rb
136
+ - spec/cloudability/billing_spec.rb
137
+ - spec/cloudability/budgets_spec.rb
138
+ - spec/cloudability/cost_spec.rb
139
+ - spec/cloudability/credentials_spec.rb
140
+ - spec/cloudability/organizations_spec.rb
141
+ - spec/cloudability/usage_spec.rb
142
+ - spec/cloudability/users_spec.rb
127
143
  - spec/fixtures/billing_reports
128
144
  - spec/fixtures/budgets
129
145
  - spec/fixtures/cost/filters
@@ -138,6 +154,10 @@ files:
138
154
  - spec/fixtures/usage/filters
139
155
  - spec/fixtures/usage/measures
140
156
  - spec/fixtures/usage/reports
157
+ - spec/fixtures/users/add_user
158
+ - spec/fixtures/users/delete_user
159
+ - spec/fixtures/users/update_user
160
+ - spec/fixtures/users/users
141
161
  - spec/spec_helper.rb
142
162
  homepage: https://github.com/colbyaley/cloudability
143
163
  licenses:
@@ -149,27 +169,28 @@ require_paths:
149
169
  - lib
150
170
  required_ruby_version: !ruby/object:Gem::Requirement
151
171
  requirements:
152
- - - '>='
172
+ - - ">="
153
173
  - !ruby/object:Gem::Version
154
174
  version: '0'
155
175
  required_rubygems_version: !ruby/object:Gem::Requirement
156
176
  requirements:
157
- - - '>='
177
+ - - ">="
158
178
  - !ruby/object:Gem::Version
159
179
  version: '0'
160
180
  requirements: []
161
181
  rubyforge_project:
162
- rubygems_version: 2.0.3
182
+ rubygems_version: 2.4.5
163
183
  signing_key:
164
184
  specification_version: 4
165
185
  summary: Ruby wrapper for the Cloudability API built with HTTParty
166
186
  test_files:
167
- - spec/cloduability/billing_spec.rb
168
- - spec/cloduability/budgets_spec.rb
169
- - spec/cloduability/cost_spec.rb
170
- - spec/cloduability/credentials_spec.rb
171
- - spec/cloduability/organizations_spec.rb
172
- - spec/cloduability/usage_spec.rb
187
+ - spec/cloudability/billing_spec.rb
188
+ - spec/cloudability/budgets_spec.rb
189
+ - spec/cloudability/cost_spec.rb
190
+ - spec/cloudability/credentials_spec.rb
191
+ - spec/cloudability/organizations_spec.rb
192
+ - spec/cloudability/usage_spec.rb
193
+ - spec/cloudability/users_spec.rb
173
194
  - spec/fixtures/billing_reports
174
195
  - spec/fixtures/budgets
175
196
  - spec/fixtures/cost/filters
@@ -184,4 +205,9 @@ test_files:
184
205
  - spec/fixtures/usage/filters
185
206
  - spec/fixtures/usage/measures
186
207
  - spec/fixtures/usage/reports
208
+ - spec/fixtures/users/add_user
209
+ - spec/fixtures/users/delete_user
210
+ - spec/fixtures/users/update_user
211
+ - spec/fixtures/users/users
187
212
  - spec/spec_helper.rb
213
+ has_rdoc: