cloudpassage 0.0.2

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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: e500a02a5462773eaffdaef67734c2bfcd931825
4
+ data.tar.gz: 63f39ab6e7e8b2a0ffc231d42b8ba7c4eeae2d2a
5
+ SHA512:
6
+ metadata.gz: e490cee25a8326b0f3d3770f1f63e07993d97c29b807dc5d41eb6b9c2ac45e84d1185a09a0d9cd91f5e1643ede42dcaaf1f76d61f7e7f2b79d615b200769f2d6
7
+ data.tar.gz: 4747e12dadf7c7969650e8bab6cb59f386386e9aa774fb1d67f1649e679f8bf41e5c8b26493d169c540613a515b519ea1b6b438267872b88d4528d979e8fb406
data/.gitignore ADDED
@@ -0,0 +1,19 @@
1
+ .idea
2
+ *.gem
3
+ *.rbc
4
+ .bundle
5
+ .config
6
+ .yardoc
7
+ Gemfile.lock
8
+ InstalledFiles
9
+ _yardoc
10
+ coverage
11
+ doc/
12
+ lib/bundler/man
13
+ pkg
14
+ rdoc
15
+ spec/reports
16
+ test/tmp
17
+ test/version_tmp
18
+ tmp
19
+ env/
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2013 mshea
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,91 @@
1
+ # Cloudpassage
2
+
3
+ Rubygem for interacting with cloudpassage API.
4
+
5
+ To date, most list/get functions are implemented. Most write-oriented functions are not.
6
+
7
+ ## Installation
8
+
9
+ Add this line to your application's Gemfile:
10
+
11
+ gem 'cloudpassage'
12
+
13
+ And then execute:
14
+
15
+ $ bundle
16
+
17
+ Or install it yourself as:
18
+
19
+ $ gem install cloudpassage
20
+
21
+ ## Usage
22
+ * Objects are all wrappers around RestClient. Data is retrieved when the .data method is invoked.
23
+ * This method returns a hash, parsed from the JSON data.
24
+ * Data will not be retrieved until data is invoked.
25
+ * Objects cache data until their reload method is invoked.
26
+
27
+ ## Examples
28
+
29
+ ### General Usage
30
+ ```ruby
31
+ require 'cloudpassage'
32
+
33
+ # Setup API client
34
+ api = Cloudpassage.api(ENV['CLIENT_ID'], ENV['CLIENT_SECRET'])
35
+
36
+ # List all the things.
37
+ puts api.events.all
38
+ puts api.file_integrity_policies.all
39
+ puts api.firewall_interfaces.all
40
+ puts api.firewall_policies.all
41
+ puts api.firewall_services.all
42
+ puts api.firewall_zones.all
43
+ puts api.server_groups.all
44
+ puts api.users.all
45
+ puts api.servers.all
46
+
47
+ # List things that are related to other things.
48
+ puts api.firewall_policies.all[0].rules
49
+ puts api.servers.all[0].accounts.all
50
+ puts api.servers.all[0].issues.all
51
+ puts api.server_groups.all[0].groups.all
52
+
53
+ # Get specific things.
54
+ puts api.file_integrity_policies.get('file_integrity_policy_id').data.to_json
55
+ ...
56
+
57
+ # Reload an object:
58
+ users = api.users
59
+
60
+ # First load occurs here.
61
+ users.all
62
+
63
+ # Second load occurs here.
64
+ users.reload
65
+
66
+ # You can also reload single objects:
67
+ user = users.all[0]
68
+ user.reload
69
+ ```
70
+
71
+ ### Allocating a user to login with on a server:
72
+ ```ruby
73
+ server = find_server_you_want_use_here
74
+ command_id = server.accounts.create('user', 'group')['command']['id']
75
+
76
+ begin
77
+ command = server.command(command_id)
78
+ end while not(command['id'] == 'completed')
79
+
80
+ # You can use this password to login as the user.
81
+ password = command['password']
82
+ ```
83
+
84
+
85
+ ## Contributing
86
+
87
+ 1. Fork it
88
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
89
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
90
+ 4. Push to the branch (`git push origin my-new-feature`)
91
+ 5. Create new Pull Request
data/Rakefile ADDED
@@ -0,0 +1,4 @@
1
+ require 'rspec/core/rake_task'
2
+ require 'bundler/gem_tasks'
3
+
4
+ RSpec::Core::RakeTask.new('spec')
@@ -0,0 +1,26 @@
1
+ # -*- encoding: utf-8 -*-
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'cloudpassage/version'
5
+
6
+ Gem::Specification.new do |gem|
7
+ gem.name = 'cloudpassage'
8
+ gem.version = Cloudpassage::VERSION
9
+ gem.authors = %w'mshea'
10
+ gem.email = %w'mike.shea@gmail.com'
11
+ gem.description = %q{API client for cloudpassage}
12
+ gem.summary = %q{Cloudpassage}
13
+ gem.homepage = 'https://github.com/sheax0r/ruby-cloudpassage'
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 = %w'lib'
19
+
20
+ gem.add_development_dependency 'rake'
21
+ gem.add_development_dependency 'rspec'
22
+
23
+ gem.add_dependency 'oauth2'
24
+ gem.add_dependency 'rest-client'
25
+ gem.add_dependency 'json'
26
+ end
@@ -0,0 +1,57 @@
1
+ module Cloudpassage
2
+
3
+ BASE_URL='https://api.cloudpassage.com/v1/'
4
+
5
+ def self.api(id, secret)
6
+ Api.new(self.token(id, secret))
7
+ end
8
+
9
+ class Api
10
+ attr_reader :token, :base_resource
11
+
12
+ def initialize(token)
13
+ @token = token
14
+ @base_resource = RestClient::Resource.new(BASE_URL)
15
+ end
16
+
17
+ def configuration_policies
18
+ Policies.new(token, base_resource['policies'])
19
+ end
20
+
21
+ def events
22
+ Events.new(token, base_resource['events'])
23
+ end
24
+
25
+ def file_integrity_policies
26
+ FimPolicies.new(token, base_resource['fim_policies'])
27
+ end
28
+
29
+ def firewall_interfaces
30
+ FirewallInterfaces.new(token, base_resource['firewall_interfaces'])
31
+ end
32
+
33
+ def firewall_policies
34
+ FirewallPolicies.new(token, base_resource['firewall_policies'])
35
+ end
36
+
37
+ def firewall_services
38
+ FirewallServices.new(token, base_resource['firewall_services'])
39
+ end
40
+
41
+ def firewall_zones
42
+ FirewallZones.new(token, base_resource['firewall_zones'])
43
+ end
44
+
45
+ def servers
46
+ Servers.new(token, base_resource['servers'])
47
+ end
48
+
49
+ def server_groups
50
+ Groups.new(token, base_resource['groups'])
51
+ end
52
+
53
+ def users
54
+ Users.new(token, base_resource['users'])
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,42 @@
1
+ module Cloudpassage
2
+ class Base
3
+ def initialize(token, base_resource, data=nil)
4
+ @token = token
5
+ @base_resource = base_resource
6
+ @data = data
7
+ end
8
+
9
+ def data
10
+ if @data.nil?
11
+ @data = JSON.parse(@base_resource.get(headers), :symbolize_names=>true)[object_symbol]
12
+ end
13
+ @data
14
+ end
15
+
16
+ def reload
17
+ @data = JSON.parse(@base_resource.get(headers), :symbolize_names=>true)[object_symbol]
18
+ self
19
+ end
20
+
21
+ def headers
22
+ {'Authorization'=>"Bearer #{@token}"}
23
+ end
24
+
25
+ def method_missing(sym, *args, &block)
26
+ if (@data[sym])
27
+ @data[sym]
28
+ else
29
+ super(sym, *args, &block)
30
+ end
31
+ end
32
+
33
+ # Convert class name to symbol.
34
+ # eg: CloudPassage::Users --> :users
35
+ def object_symbol
36
+ class_name = self.class.name
37
+ index = class_name.rindex(/::/)
38
+ class_name[index+2..-1].underscore.to_sym
39
+ end
40
+
41
+ end
42
+ end
@@ -0,0 +1,26 @@
1
+ require 'oauth2'
2
+ require 'rest-client'
3
+ require 'json'
4
+
5
+ module Cloudpassage
6
+ RestClient.proxy = ENV['HTTPS_PROXY'] if ENV['HTTPS_PROXY'].to_s.length > 0
7
+
8
+ def self.token(client_id, client_secret)
9
+ client = OAuth2::Client.new(client_id, client_secret,
10
+ :connection_opts => { :proxy => ENV['HTTPS_PROXY'] },
11
+ :site => 'https://api.cloudpassage.com',
12
+ :token_url => '/oauth/access_token')
13
+ client.client_credentials.get_token.token
14
+ end
15
+ end
16
+
17
+ # Add camel-to-snake-case conversion
18
+ class String
19
+ def underscore
20
+ self.gsub(/::/, '/').
21
+ gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
22
+ gsub(/([a-z\d])([A-Z])/,'\1_\2').
23
+ tr("-", "_").
24
+ downcase
25
+ end
26
+ end
@@ -0,0 +1,17 @@
1
+ module Cloudpassage
2
+ module Collection
3
+ def all
4
+ data.map{|i|
5
+ get(i[:id], i)
6
+ }
7
+ end
8
+
9
+ def get(id, data=nil)
10
+ singleton_class.new(@token, @base_resource, id, data)
11
+ end
12
+
13
+ def [](id)
14
+ get(id)
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,12 @@
1
+ module Cloudpassage
2
+ class Events < Base
3
+ include Collection
4
+
5
+ def singleton_class
6
+ Event
7
+ end
8
+ end
9
+
10
+ class Event < Single
11
+ end
12
+ end
@@ -0,0 +1,12 @@
1
+ module Cloudpassage
2
+ class FileIntegrityBaselines < Base
3
+ include Collection
4
+
5
+ def singleton_class
6
+ FileIntegrityBaseline
7
+ end
8
+ end
9
+
10
+ class FileIntegrityBaseline < Single
11
+ end
12
+ end
@@ -0,0 +1,15 @@
1
+ module Cloudpassage
2
+ class FimPolicies < Base
3
+ include Collection
4
+
5
+ def singleton_class
6
+ FimPolicy
7
+ end
8
+ end
9
+
10
+ class FimPolicy < Single
11
+ def baselines
12
+ FileIntegrityBaselines.new(token, base_resource['baselines'])
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,11 @@
1
+ module Cloudpassage
2
+ class FirewallInterfaces < Base
3
+ include Collection
4
+ def singleton_class
5
+ FirewallInterface
6
+ end
7
+ end
8
+
9
+ class FirewallInterface < Single
10
+ end
11
+ end
@@ -0,0 +1,15 @@
1
+ module Cloudpassage
2
+ class FirewallPolicies < Base
3
+ include Collection
4
+
5
+ def singleton_class
6
+ FirewallPolicy
7
+ end
8
+ end
9
+
10
+ class FirewallPolicy < Single
11
+ def rules
12
+ FirewallRules.new(token, base_resource['firewall_rules'])
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,12 @@
1
+ module Cloudpassage
2
+ class FirewallRules < Base
3
+ include Collection
4
+
5
+ def singleton_class
6
+ FirewallRule
7
+ end
8
+ end
9
+
10
+ class FirewallRule < Single
11
+ end
12
+ end
@@ -0,0 +1,12 @@
1
+ module Cloudpassage
2
+ class FirewallServices < Base
3
+ include Collection
4
+
5
+ def singleton_class
6
+ FirewallService
7
+ end
8
+ end
9
+
10
+ class FirewallService < Single
11
+ end
12
+ end
@@ -0,0 +1,12 @@
1
+ module Cloudpassage
2
+ class FirewallZones < Base
3
+ include Collection
4
+
5
+ def singleton_class
6
+ FirewallZone
7
+ end
8
+ end
9
+
10
+ class FirewallZone < Single
11
+ end
12
+ end
@@ -0,0 +1,14 @@
1
+ module Cloudpassage
2
+ class Groups < Base
3
+ include Collection
4
+ def singleton_class
5
+ Group
6
+ end
7
+ end
8
+
9
+ class Group < Single
10
+ def servers
11
+ Servers.new(@token, @base_resource['servers'])
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,12 @@
1
+ module Cloudpassage
2
+ class Policies < Base
3
+ include Collection
4
+
5
+ def singleton_class
6
+ Policy
7
+ end
8
+ end
9
+
10
+ class Policy < Single
11
+ end
12
+ end
@@ -0,0 +1,91 @@
1
+ module Cloudpassage
2
+ class Servers < Base
3
+ include Collection
4
+
5
+ def singleton_class
6
+ Server
7
+ end
8
+ end
9
+
10
+ class Server < Single
11
+ def initialize(token, base_resource, id, data=nil)
12
+ @id = id
13
+ super(token, RestClient::Resource.new("#{BASE_URL}/servers/"), @id, data)
14
+ end
15
+
16
+ def issues
17
+ Issues.new(@token, @base_resource['issues'])
18
+ end
19
+
20
+ def accounts
21
+ Accounts.new(@token, @base_resource['accounts'])
22
+ end
23
+
24
+ def command(id)
25
+ Command.new(@token, @base_resource['commands'], id)
26
+ end
27
+ end
28
+
29
+ class Accounts < Base
30
+ include Collection
31
+
32
+ def singleton_class
33
+ Account
34
+ end
35
+
36
+ def all
37
+ data.map{|i| get(i[:username], i)}
38
+ end
39
+
40
+ def create(username, groups = '', opts = {})
41
+ payload = {'account' => {
42
+ :username => username,
43
+ :comment => '',
44
+ :groups => groups,
45
+ :password => password_opts.merge(opts.fetch(:password, {})),
46
+ }}
47
+ JSON.parse(@base_resource.post payload.to_json, headers)
48
+ end
49
+
50
+ def reset(username, opts = {})
51
+ payload = {'password' => password_opts.merge(opts)}
52
+ JSON.parse @base_resource[username]['password'].put(payload.to_json, headers)
53
+ end
54
+
55
+ def remove(username)
56
+ JSON.parse @base_resource[username].delete(headers)
57
+ end
58
+
59
+ def headers
60
+ super.merge({'Content-Type'=>'application/json'})
61
+ end
62
+
63
+ private
64
+ def password_opts
65
+ {
66
+ :length => 25,
67
+ :include_special => true,
68
+ :include_numbers => true,
69
+ :include_uppercase => true
70
+ }
71
+ end
72
+ end
73
+
74
+ class Issues < Base
75
+ include Collection
76
+
77
+ def singleton_class
78
+ Issue
79
+ end
80
+ end
81
+
82
+ class Command < Single
83
+ def done?
84
+ self.reload
85
+ %w'completed failed'.include? self.status
86
+ end
87
+ end
88
+
89
+ class Issue < Single;end
90
+ class Account < Single;end
91
+ end
@@ -0,0 +1,15 @@
1
+ module Cloudpassage
2
+ class Single < Base
3
+
4
+ attr_reader :id
5
+
6
+ def initialize(token, base_resource, id, data=nil)
7
+ @id = id
8
+ super(token, base_resource[@id], data)
9
+ end
10
+
11
+ def get
12
+ @base_resource.get(headers)
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,12 @@
1
+ module Cloudpassage
2
+ class Users < Base
3
+ include Collection
4
+
5
+ def singleton_class
6
+ User
7
+ end
8
+ end
9
+
10
+ class User < Single
11
+ end
12
+ end
@@ -0,0 +1,3 @@
1
+ module Cloudpassage
2
+ VERSION = "0.0.2"
3
+ end
@@ -0,0 +1,19 @@
1
+ require 'cloudpassage/cloudpassage'
2
+ require 'cloudpassage/version'
3
+ require 'cloudpassage/base'
4
+ require 'cloudpassage/collection'
5
+ require 'cloudpassage/single'
6
+ require 'cloudpassage/policies'
7
+ require 'cloudpassage/events'
8
+ require 'cloudpassage/file_integrity_baselines'
9
+ require 'cloudpassage/fim_policies'
10
+ require 'cloudpassage/firewall_interfaces'
11
+ require 'cloudpassage/firewall_policies'
12
+ require 'cloudpassage/firewall_rules'
13
+ require 'cloudpassage/firewall_services'
14
+ require 'cloudpassage/firewall_zones'
15
+ require 'cloudpassage/groups'
16
+ require 'cloudpassage/servers'
17
+ require 'cloudpassage/users'
18
+ require 'cloudpassage/api'
19
+
data/spec/api_spec.rb ADDED
@@ -0,0 +1,41 @@
1
+ require File.join(File.dirname(__FILE__), '..', 'lib', 'cloudpassage')
2
+ require 'rspec'
3
+
4
+ module Cloudpassage
5
+ describe Cloudpassage do
6
+ attr_reader :api
7
+
8
+ before :each do
9
+ token = Cloudpassage.token(ENV.fetch('CLOUDPASSAGE_ID'), ENV.fetch('CLOUDPASSAGE_SECRET'))
10
+ @api = Cloudpassage::Api.new(token)
11
+ end
12
+
13
+ def self.collections
14
+ [
15
+ :configuration_policies,
16
+ :events,
17
+ :file_integrity_policies,
18
+ :firewall_interfaces,
19
+ :firewall_policies,
20
+ :firewall_services,
21
+ :firewall_zones,
22
+ :server_groups,
23
+ :users
24
+ ]
25
+ end
26
+
27
+ collections.each do |type|
28
+ it "should retrieve data for #{type}" do
29
+ api.send(type).data
30
+ end
31
+
32
+ it "should parse data for #{type} as json" do
33
+ # Get the collection
34
+ collection = api.send(type)
35
+
36
+ # Reload a single instance of each object type.
37
+ collection.all[0].reload.data
38
+ end
39
+ end
40
+ end
41
+ end
metadata ADDED
@@ -0,0 +1,140 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: cloudpassage
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.2
5
+ platform: ruby
6
+ authors:
7
+ - mshea
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2013-10-09 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rake
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - '>='
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :development
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: 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: oauth2
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - '>='
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
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: rest-client
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - '>='
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: json
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - '>='
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - '>='
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ description: API client for cloudpassage
84
+ email:
85
+ - mike.shea@gmail.com
86
+ executables: []
87
+ extensions: []
88
+ extra_rdoc_files: []
89
+ files:
90
+ - .gitignore
91
+ - Gemfile
92
+ - LICENSE.txt
93
+ - README.md
94
+ - Rakefile
95
+ - cloudpassage.gemspec
96
+ - lib/cloudpassage.rb
97
+ - lib/cloudpassage/api.rb
98
+ - lib/cloudpassage/base.rb
99
+ - lib/cloudpassage/cloudpassage.rb
100
+ - lib/cloudpassage/collection.rb
101
+ - lib/cloudpassage/events.rb
102
+ - lib/cloudpassage/file_integrity_baselines.rb
103
+ - lib/cloudpassage/fim_policies.rb
104
+ - lib/cloudpassage/firewall_interfaces.rb
105
+ - lib/cloudpassage/firewall_policies.rb
106
+ - lib/cloudpassage/firewall_rules.rb
107
+ - lib/cloudpassage/firewall_services.rb
108
+ - lib/cloudpassage/firewall_zones.rb
109
+ - lib/cloudpassage/groups.rb
110
+ - lib/cloudpassage/policies.rb
111
+ - lib/cloudpassage/servers.rb
112
+ - lib/cloudpassage/single.rb
113
+ - lib/cloudpassage/users.rb
114
+ - lib/cloudpassage/version.rb
115
+ - spec/api_spec.rb
116
+ homepage: https://github.com/sheax0r/ruby-cloudpassage
117
+ licenses: []
118
+ metadata: {}
119
+ post_install_message:
120
+ rdoc_options: []
121
+ require_paths:
122
+ - lib
123
+ required_ruby_version: !ruby/object:Gem::Requirement
124
+ requirements:
125
+ - - '>='
126
+ - !ruby/object:Gem::Version
127
+ version: '0'
128
+ required_rubygems_version: !ruby/object:Gem::Requirement
129
+ requirements:
130
+ - - '>='
131
+ - !ruby/object:Gem::Version
132
+ version: '0'
133
+ requirements: []
134
+ rubyforge_project:
135
+ rubygems_version: 2.0.3
136
+ signing_key:
137
+ specification_version: 4
138
+ summary: Cloudpassage
139
+ test_files:
140
+ - spec/api_spec.rb