code42 0.1.2 → 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.
Files changed (50) hide show
  1. data/.gitignore +1 -0
  2. data/README.md +82 -64
  3. data/Rakefile +5 -0
  4. data/code42.gemspec +6 -6
  5. data/lib/code42/api/computer.rb +22 -0
  6. data/lib/code42/api/org.rb +60 -0
  7. data/lib/code42/api/role.rb +24 -0
  8. data/lib/code42/api/token.rb +32 -0
  9. data/lib/code42/api/user.rb +72 -0
  10. data/lib/code42/client.rb +7 -178
  11. data/lib/code42/user.rb +8 -0
  12. data/lib/code42/version.rb +1 -1
  13. data/spec/cassettes/Code42_Client/_create_org/returns_created_org.yml +8 -8
  14. data/spec/cassettes/Code42_Client/_create_user/returns_created_user.yml +6 -6
  15. data/spec/cassettes/Code42_Client/_create_user/when_sending_an_invalid_email/raises_an_exception.yml +2 -2
  16. data/spec/cassettes/Code42_Client/_find_org_by_name/returns_the_org_with_the_specified_name.yml +12 -58
  17. data/spec/cassettes/Code42_Client/_get_token/returns_valid_tokens.yml +5 -5
  18. data/spec/cassettes/Code42_Client/_get_token/when_providing_invalid_credentials/should_raise_an_exception.yml +2 -2
  19. data/spec/cassettes/Code42_Client/_org/when_ID_is_not_passed/returns_my_org.yml +11 -11
  20. data/spec/cassettes/Code42_Client/_org/when_ID_is_passed_in/returns_a_specific_org.yml +11 -11
  21. data/spec/cassettes/Code42_Client/_ping/returns_a_ping.yml +5 -5
  22. data/spec/cassettes/Code42_Client/_user/when_ID_is_not_passed/returns_my_user.yml +10 -10
  23. data/spec/cassettes/Code42_Client/_user/when_ID_is_passed_in/returns_a_specific_user.yml +10 -10
  24. data/spec/cassettes/Code42_Client/_user/when_blocked/returns_the_blocked_status.yml +84 -0
  25. data/spec/cassettes/Code42_Client/_user/when_unblocked/returns_the_blocked_status.yml +113 -0
  26. data/spec/cassettes/Code42_Client/_user_roles/returns_an_enumerable.yml +7 -7
  27. data/spec/cassettes/Code42_Client/_validate_token/returns_a_valid_response.yml +10 -10
  28. data/spec/{crashplan → code42}/client_spec.rb +26 -5
  29. data/spec/{crashplan → code42}/connection_spec.rb +0 -0
  30. data/spec/{crashplan → code42}/org_spec.rb +0 -0
  31. data/spec/{crashplan → code42}/ping_spec.rb +0 -0
  32. data/spec/{crashplan → code42}/resource_spec.rb +0 -0
  33. data/spec/{crashplan → code42}/role_spec.rb +0 -0
  34. data/spec/{crashplan → code42}/settings_spec.rb +0 -0
  35. data/spec/{crashplan → code42}/token_spec.rb +0 -0
  36. data/spec/{crashplan → code42}/user_spec.rb +0 -0
  37. metadata +49 -66
  38. data/spec/cassettes/Crashplan_Client/_create_org/returns_created_org.yml +0 -47
  39. data/spec/cassettes/Crashplan_Client/_create_user/returns_created_user.yml +0 -44
  40. data/spec/cassettes/Crashplan_Client/_create_user/when_sending_an_invalid_email/raises_an_exception.yml +0 -37
  41. data/spec/cassettes/Crashplan_Client/_find_org_by_name/returns_the_org_with_the_specified_name.yml +0 -55
  42. data/spec/cassettes/Crashplan_Client/_get_token/returns_valid_tokens.yml +0 -38
  43. data/spec/cassettes/Crashplan_Client/_get_token/when_providing_invalid_credentials/should_raise_an_exception.yml +0 -37
  44. data/spec/cassettes/Crashplan_Client/_org/when_ID_is_not_passed/returns_my_org.yml +0 -54
  45. data/spec/cassettes/Crashplan_Client/_org/when_ID_is_passed_in/returns_a_specific_org.yml +0 -54
  46. data/spec/cassettes/Crashplan_Client/_ping/returns_a_ping.yml +0 -48
  47. data/spec/cassettes/Crashplan_Client/_user/when_ID_is_not_passed/returns_my_user.yml +0 -99
  48. data/spec/cassettes/Crashplan_Client/_user/when_ID_is_passed_in/returns_a_specific_user.yml +0 -53
  49. data/spec/cassettes/Crashplan_Client/_user_roles/returns_an_enumerable.yml +0 -50
  50. data/spec/cassettes/Crashplan_Client/_validate_token/returns_a_valid_response.yml +0 -128
data/.gitignore CHANGED
@@ -16,3 +16,4 @@ test/tmp
16
16
  test/version_tmp
17
17
  tmp
18
18
  .DS_Store
19
+ bin/*
data/README.md CHANGED
@@ -6,42 +6,52 @@ A Ruby interface to the Code 42 API
6
6
 
7
7
  Add this line to your application's Gemfile:
8
8
 
9
- gem 'code42'
9
+ ```ruby
10
+ gem 'code42'
11
+ ```
10
12
 
11
13
  And then execute:
12
14
 
13
- $ bundle
15
+ ```bash
16
+ $ bundle
17
+ ```
14
18
 
15
19
  Or install it yourself as:
16
20
 
17
- $ gem install code42
21
+ ```bash
22
+ $ gem install code42
23
+ ```
18
24
 
19
25
  ## Configuration
20
26
 
21
- client = Code42::Client.new(
22
- host: 'staging.code42.com',
23
- port: 1234,
24
- https: true,
25
- api_root: '/api/',
26
- username: 'testuser',
27
- password: 'letmein'
28
- )
27
+ ```ruby
28
+ client = Code42::Client.new(
29
+ host: 'staging.code42.com',
30
+ port: 1234,
31
+ https: true,
32
+ api_root: '/api/',
33
+ username: 'testuser',
34
+ password: 'letmein'
35
+ )
36
+ ```
29
37
 
30
38
  ### Authentication
31
39
 
32
- ```
40
+ ```ruby
33
41
  token = client.get_token
34
42
  ```
35
43
 
36
44
  Then you can pass this token for further requests:
37
45
 
38
- client = Code42::Client.new(
39
- host: 'staging.code42.com',
40
- port: 1234,
41
- https: true,
42
- api_root: '/api/',
43
- token: token
44
- )
46
+ ```ruby
47
+ client = Code42::Client.new(
48
+ host: 'staging.code42.com',
49
+ port: 1234,
50
+ https: true,
51
+ api_root: '/api/',
52
+ token: token
53
+ )
54
+ ```
45
55
 
46
56
  ## Resources
47
57
 
@@ -49,85 +59,89 @@ Then you can pass this token for further requests:
49
59
 
50
60
  attributes:
51
61
 
52
- [:id,
53
- :uid,
54
- :status,
55
- :username,
56
- :email,
57
- :first_name,
58
- :last_name,
59
- :quota_in_bytes,
60
- :org_id,
61
- :org_uid,
62
- :org_name,
63
- :active,
64
- :blocked,
65
- :email_promo,
66
- :invited,
67
- :org_type,
68
- :username_is_an_email,
69
- :created_at,
70
- :updated_at]
62
+ ```ruby
63
+ [:id,
64
+ :uid,
65
+ :status,
66
+ :username,
67
+ :email,
68
+ :first_name,
69
+ :last_name,
70
+ :quota_in_bytes,
71
+ :org_id,
72
+ :org_uid,
73
+ :org_name,
74
+ :active,
75
+ :blocked,
76
+ :email_promo,
77
+ :invited,
78
+ :org_type,
79
+ :username_is_an_email,
80
+ :created_at,
81
+ :updated_at]
82
+ ```
71
83
 
72
84
  ### Org
73
85
 
74
86
  attributes:
75
87
 
76
- [:id,
77
- :uid,
78
- :name,
79
- :status,
80
- :active,
81
- :blocked,
82
- :parent_id,
83
- :type,
84
- :external_id,
85
- :hierarchy_counts,
86
- :config_inheritance_counts,
87
- :created_at,
88
- :updated_at,
89
- :registration_key,
90
- :reporting,
91
- :custom_config,
92
- :settings,
93
- :settings_inherited,
94
- :settings_summary]
88
+ ```ruby
89
+ [:id,
90
+ :uid,
91
+ :name,
92
+ :status,
93
+ :active,
94
+ :blocked,
95
+ :parent_id,
96
+ :type,
97
+ :external_id,
98
+ :hierarchy_counts,
99
+ :config_inheritance_counts,
100
+ :created_at,
101
+ :updated_at,
102
+ :registration_key,
103
+ :reporting,
104
+ :custom_config,
105
+ :settings,
106
+ :settings_inherited,
107
+ :settings_summary]
108
+ ```
95
109
 
96
110
  ## Usage
97
111
 
98
112
  ### Ping a host
99
113
 
100
- ```
114
+ ```ruby
101
115
  success = client.ping.success?
102
116
  ```
103
117
 
104
118
  ### Fetch the currently authorized API user
105
119
 
106
- ```
120
+ ```ruby
107
121
  user = client.user
108
122
  ```
109
123
 
110
- ### Get the get a user by ID
124
+ ### Fetch a user by ID
111
125
 
112
- ```
126
+ ```ruby
113
127
  user = client.user(42)
114
128
  ```
115
129
 
116
130
  ### Fetch the Org for the currently authorized API user
117
131
 
118
- ```
132
+ ```ruby
119
133
  org = client.org
120
134
  ```
121
135
 
122
136
  ### Fetch a specific Org by ID
123
137
 
124
- ```
138
+ ```ruby
125
139
  org = client.org(42)
126
140
  ```
127
141
 
128
142
  ### Validate a token
129
143
 
130
- ```
144
+ ```ruby
131
145
  client.validate_token(token).valid?
132
146
  ```
133
147
 
@@ -149,6 +163,10 @@ https://github.com/code42/code42_api_ruby/wiki
149
163
 
150
164
  [@melissavoegeli](http://github.com/melissavoegeli)
151
165
 
166
+ ## Contributors
167
+
168
+ [@jrmehle](http://github.com/jrmehle)
169
+
152
170
  # Code 42 README
153
171
 
154
172
  ## What is this?
data/Rakefile CHANGED
@@ -1 +1,6 @@
1
1
  require "bundler/gem_tasks"
2
+ require 'rspec/core/rake_task'
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task :default => :spec
@@ -12,12 +12,12 @@ Gem::Specification.new do |gem|
12
12
  gem.summary = %q{...}
13
13
  gem.homepage = ""
14
14
 
15
- gem.add_development_dependency 'rspec'
16
- gem.add_development_dependency 'webmock'
17
- gem.add_development_dependency 'vcr'
18
- gem.add_dependency 'faraday'
19
- gem.add_dependency 'activesupport', '~> 3.2.0'
20
- gem.add_dependency 'faraday_middleware'
15
+ gem.add_development_dependency 'rspec', '~> 2.11.0'
16
+ gem.add_development_dependency 'webmock', '~> 1.11.0'
17
+ gem.add_development_dependency 'vcr', '~> 2.4.0'
18
+ gem.add_dependency 'faraday', '~> 0.8.7'
19
+ gem.add_dependency 'activesupport', '~> 3.2.0'
20
+ gem.add_dependency 'faraday_middleware', '~> 0.9.0'
21
21
 
22
22
  gem.files = `git ls-files`.split($/)
23
23
  gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
@@ -0,0 +1,22 @@
1
+ module Code42
2
+ module API
3
+ module Computer
4
+ ### Computers :get, :put ###
5
+
6
+ # Returns one computer or http status 404
7
+ # @return [Code42::Computer] The requested computer
8
+ # @param id [String, Integer] A computer ID
9
+ def computer(id, params = {})
10
+ object_from_response(Code42::Computer, :get, "computer/#{id}", params)
11
+ end
12
+
13
+ # Returns a list of computers
14
+ # @return [Array] The list of computers
15
+ # @param params [Hash] A hash of valid search parameters for computers
16
+ def computers(params = {})
17
+ params.merge!(key: 'computers')
18
+ objects_from_response(Code42::Computer, :get, 'computer', params)
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,60 @@
1
+ module Code42
2
+ module API
3
+ module Org
4
+ ### Orgs :post, :get, :put, :delete ###
5
+
6
+ # Creates blue org as well as user for the org
7
+ # @return [Code42::Org] The created org
8
+ # @param attrs [Hash] A hash of attributes to assign to created org
9
+ # @example
10
+ # client.create_org(:company => "test", :email => "test@test.com", :firstname => "test", :lastname => "test")
11
+ def create_pro_org(attrs = {})
12
+ object_from_response(Code42::Org, :post, "proOrgChannel", attrs)
13
+ end
14
+
15
+ # Creates an org
16
+ # @return [Code42::Org] The created org
17
+ # @param attrs [Hash] A hash of attributes to assign to created org
18
+ # @example
19
+ # client.create_org(:name => 'Acme Org', :parent_id => 2)
20
+ def create_org(attrs = {})
21
+ object_from_response(Code42::Org, :post, "org", attrs)
22
+ end
23
+
24
+ # Returns information for a given org
25
+ # @return [Code42::Org] The requested org
26
+ # @param id [String, Integer] A code42 user ID
27
+ def org(id = "my", params = {})
28
+ object_from_response(Code42::Org, :get, "org/#{id}", params)
29
+ end
30
+
31
+ # Returns an org for a given name
32
+ # @return [Code42::Org] The requested org
33
+ # @param name [String] A Code42 org name
34
+ # FIXME: This needs to change when the API implements a better way.
35
+ def find_org_by_name(name)
36
+ search_orgs(name).select { |o| o.name == name }.first
37
+ end
38
+
39
+ # Searches orgs for a query string
40
+ # @return [Array] An array of matching orgs
41
+ # @param query [String] A string to search for
42
+ def search_orgs(query)
43
+ orgs(q: query)
44
+ end
45
+
46
+ # Returns a list of up to 100 orgs
47
+ # @return [Array] An array of matching orgs
48
+ # @param params [Hash] A hash of parameters to match results against
49
+ def orgs(params = {})
50
+ params.merge!(key: 'orgs')
51
+ objects_from_response(Code42::Org, :get, 'org', params)
52
+ end
53
+
54
+ def update_org(id = 'my', attrs = {})
55
+ object_from_response(Code42::Org, :put, "org/#{id}", attrs)
56
+ end
57
+
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,24 @@
1
+ module Code42
2
+ module API
3
+ module Role
4
+ ### Roles :post, :get ###
5
+
6
+ # Assigns a role to a user
7
+ # @return [Code42::Role] The assigned role
8
+ # @param attrs [Hash] A hash of attributes for assigning a user role
9
+ # @example
10
+ # client.assign_role(:user_id => 2, :role_name => 'Admin')
11
+ def assign_role(attrs = {})
12
+ object_from_response(Code42::Role, :post, 'UserRole', attrs)
13
+ end
14
+
15
+ # Returns a list of roles for a given user
16
+ # @return [Code42::RoleCollection] A collection of matching roles
17
+ # @param id [String, Integer] The id of the user to return roles for
18
+ def user_roles(id = 'my')
19
+ collection_from_response(Code42::RoleCollection, Code42::Role, :get, "userRole/#{id}")
20
+ end
21
+ end
22
+ end
23
+ end
24
+
@@ -0,0 +1,32 @@
1
+ module Code42
2
+ module API
3
+ module Token
4
+ ### Authentication With Tokens :post, :get, :delete ###
5
+
6
+ # Gets a token for the currently authorized user
7
+ def get_token
8
+ object_from_response(Code42::Token, :post, "authToken")
9
+ end
10
+
11
+ # Returns LoginToken and ServerUrl
12
+ # @return [CrashPlan::Token] Token to pass to ServerUrl's AuthToken resource
13
+ def get_login_token
14
+ object_from_response(Code42::Token, :post, "loginToken")
15
+ end
16
+
17
+ # Validates an authorization token
18
+ # @return [Code42::TokenValidation]
19
+ # @param token [Code42::Token, String] The token to validate
20
+ def validate_token(token)
21
+ object_from_response(Code42::TokenValidation, :get, "authToken/#{token.to_s}")
22
+ end
23
+
24
+ # Manually expires a token
25
+ # @param token [Code42::Token, String] A token to expire (leave blank to expire currently used token)
26
+ def delete_token(token = nil)
27
+ token = token || settings.token
28
+ delete "authToken/#{token.to_s}"
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,72 @@
1
+ module Code42
2
+ module API
3
+ module User
4
+ ### Users :post, :get ###
5
+
6
+ # Creates a user
7
+ # @return [Code42::User] The created user
8
+ # @param attrs [Hash] A hash of attributes to assign to created user
9
+ # @example
10
+ # client.create_user(:username => 'testuser', password: 'letmein', email: 'test@example.com', org_id: 3)
11
+ def create_user(attrs = {})
12
+ object_from_response(Code42::User, :post, "user", attrs)
13
+ end
14
+
15
+ # Returns information for a given user
16
+ # @return [Code42::User] The requested user
17
+ # @param id_or_username [String, Integer] A code42 user ID or username
18
+ def user(id_or_username = "my", params = {})
19
+ if id_or_username.is_a?(Fixnum) || id_or_username == 'my'
20
+ find_user_by_id id_or_username, params
21
+ else
22
+ find_user_by_username id_or_username, params
23
+ end
24
+ end
25
+
26
+ # Returns a user for a given id
27
+ def find_user_by_id(id = 'my', params = {})
28
+ object_from_response(Code42::User, :get, "user/#{id}", params)
29
+ end
30
+
31
+ # Returns a user for a given username
32
+ def find_user_by_username(username, params = {})
33
+ params.merge!(username: username)
34
+ users(params).first
35
+ end
36
+
37
+ # Returns a user for a given channel id
38
+ # @return [Code42::User] The requested user
39
+ # @param channel_id [String, Integer] A code42 User
40
+ def find_user_by_channel_id(channel_id = 1)
41
+ object_from_response(Code42::User, :get, "userChannel?channelCustomerId=#{channel_id}")
42
+ end
43
+
44
+ # Returns a list of up to 100 users
45
+ # @return [Array] An array of matching users
46
+ # @param params [Hash] A hash of parameters to match results against
47
+ def users(params = {})
48
+ params.merge!(key: 'users')
49
+ objects_from_response(Code42::User, :get, 'user', params)
50
+ end
51
+
52
+ # Check if user exists with given username.
53
+ def user_exists?(username)
54
+ users(username: username).present?
55
+ end
56
+
57
+ # Block a user from logging in
58
+ # @return true if blocked
59
+ # @params id [Integer, String] The user ID you want to block
60
+ def block_user(id)
61
+ put("UserBlock/#{id}")
62
+ end
63
+
64
+ # Unblock a previously blocked user
65
+ # @return true if unblocked
66
+ # @params id [Integer, String] The user ID you want to unblock
67
+ def unblock_user(id)
68
+ delete("UserBlock/#{id}")
69
+ end
70
+ end
71
+ end
72
+ end