cloudpassage 0.0.2

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: 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