stormpath-sdk 1.0.0.beta.6 → 1.0.0.beta.7

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 (45) hide show
  1. data/.travis.yml +2 -0
  2. data/CHANGES.md +10 -0
  3. data/lib/stormpath-sdk.rb +15 -0
  4. data/lib/stormpath-sdk/data_store.rb +30 -14
  5. data/lib/stormpath-sdk/http/request.rb +5 -25
  6. data/lib/stormpath-sdk/http/response.rb +0 -5
  7. data/lib/stormpath-sdk/provider/account_access.rb +28 -0
  8. data/lib/stormpath-sdk/provider/account_request.rb +30 -0
  9. data/lib/stormpath-sdk/provider/account_resolver.rb +43 -0
  10. data/lib/stormpath-sdk/provider/account_result.rb +27 -0
  11. data/lib/stormpath-sdk/provider/facebook/facebook_provider.rb +18 -0
  12. data/lib/stormpath-sdk/provider/facebook/facebook_provider_data.rb +18 -0
  13. data/lib/stormpath-sdk/provider/google/google_provider.rb +18 -0
  14. data/lib/stormpath-sdk/provider/google/google_provider_data.rb +19 -0
  15. data/lib/stormpath-sdk/provider/provider.rb +18 -0
  16. data/lib/stormpath-sdk/provider/provider_data.rb +18 -0
  17. data/lib/stormpath-sdk/provider/stormpath/stormpath_provider.rb +17 -0
  18. data/lib/stormpath-sdk/provider/stormpath/stormpath_provider_data.rb +17 -0
  19. data/lib/stormpath-sdk/resource/account.rb +15 -0
  20. data/lib/stormpath-sdk/resource/application.rb +5 -2
  21. data/lib/stormpath-sdk/resource/associations.rb +7 -5
  22. data/lib/stormpath-sdk/resource/directory.rb +15 -0
  23. data/lib/stormpath-sdk/version.rb +2 -2
  24. data/spec/auth/basic_authenticator_spec.rb +5 -5
  25. data/spec/cache/cache_entry_spec.rb +3 -3
  26. data/spec/client_spec.rb +27 -20
  27. data/spec/provider/account_resolver_spec.rb +25 -0
  28. data/spec/provider/provider_spec.rb +152 -0
  29. data/spec/resource/account_spec.rb +26 -30
  30. data/spec/resource/account_store_mapping_spec.rb +28 -27
  31. data/spec/resource/account_store_spec.rb +7 -7
  32. data/spec/resource/application_spec.rb +34 -26
  33. data/spec/resource/collection_spec.rb +34 -34
  34. data/spec/resource/custom_data_spec.rb +2 -2
  35. data/spec/resource/directory_spec.rb +25 -23
  36. data/spec/resource/group_membership_spec.rb +3 -3
  37. data/spec/resource/group_spec.rb +16 -17
  38. data/spec/resource/status_spec.rb +16 -16
  39. data/spec/resource/tenant_spec.rb +10 -8
  40. data/spec/spec_helper.rb +37 -18
  41. data/spec/support/custom_data_storage_behavior.rb +19 -19
  42. data/spec/support/mocked_provider_accounts.rb +72 -0
  43. data/stormpath-sdk.gemspec +5 -9
  44. metadata +104 -111
  45. checksums.yaml +0 -7
data/.travis.yml CHANGED
@@ -29,5 +29,7 @@ env:
29
29
  language: ruby
30
30
  rvm:
31
31
  - 1.9.3
32
+ - 2.0.0
33
+ - 2.1.2
32
34
  services:
33
35
  - redis-server
data/CHANGES.md CHANGED
@@ -1,6 +1,16 @@
1
1
  stormpath-sdk-ruby Changelog
2
2
  ============================
3
3
 
4
+ Version 1.0.0.beta.7
5
+ --------------------
6
+
7
+ Released on July 21, 2014
8
+
9
+ - Added provider integration (Google, Facebook and Stormpath).
10
+ - Updated tests to use RSpec3.
11
+ - Updated tests to run in parallel in multiple versions (1.9.3, 2.0.0 and 2.1.2).
12
+
13
+
4
14
  Version 1.0.0.beta.6
5
15
  --------------------
6
16
 
data/lib/stormpath-sdk.rb CHANGED
@@ -66,6 +66,21 @@ module Stormpath
66
66
  autoload :BasicAuthenticator, "stormpath-sdk/auth/basic_authenticator"
67
67
  end
68
68
 
69
+ module Provider
70
+ autoload :AccountResolver, "stormpath-sdk/provider/account_resolver"
71
+ autoload :AccountAccess, "stormpath-sdk/provider/account_access"
72
+ autoload :AccountResult, "stormpath-sdk/provider/account_result"
73
+ autoload :AccountRequest, "stormpath-sdk/provider/account_request"
74
+ autoload :Provider, 'stormpath-sdk/provider/provider'
75
+ autoload :ProviderData, 'stormpath-sdk/provider/provider_data'
76
+ autoload :FacebookProvider, 'stormpath-sdk/provider/facebook/facebook_provider'
77
+ autoload :FacebookProviderData, 'stormpath-sdk/provider/facebook/facebook_provider_data'
78
+ autoload :GoogleProvider, 'stormpath-sdk/provider/google/google_provider'
79
+ autoload :GoogleProviderData, 'stormpath-sdk/provider/google/google_provider_data'
80
+ autoload :StormpathProvider, 'stormpath-sdk/provider/stormpath/stormpath_provider'
81
+ autoload :StormpathProviderData, 'stormpath-sdk/provider/stormpath/stormpath_provider_data'
82
+ end
83
+
69
84
  module Http
70
85
  autoload :Utils, "stormpath-sdk/http/utils"
71
86
  autoload :Request, "stormpath-sdk/http/request"
@@ -22,7 +22,7 @@ class Stormpath::DataStore
22
22
  DEFAULT_BASE_URL = "https://" + DEFAULT_SERVER_HOST + "/v" + DEFAULT_API_VERSION.to_s
23
23
  HREF_PROP_NAME = Stormpath::Resource::Base::HREF_PROP_NAME
24
24
 
25
- CACHE_REGIONS = %w( applications directories accounts groups groupMemberships accountMemberships tenants customData )
25
+ CACHE_REGIONS = %w(applications directories accounts groups groupMemberships accountMemberships tenants customData provider providerData)
26
26
 
27
27
  attr_reader :client, :request_executor, :cache_manager
28
28
 
@@ -53,6 +53,9 @@ class Stormpath::DataStore
53
53
  q_href = qualify href
54
54
 
55
55
  data = execute_request('get', q_href, nil, query)
56
+
57
+ clazz = clazz.call(data) if clazz.respond_to? :call
58
+
56
59
  instantiate clazz, data.to_hash
57
60
  end
58
61
 
@@ -89,29 +92,36 @@ class Stormpath::DataStore
89
92
  href = resource.href
90
93
  href += "/#{property_name}" if property_name
91
94
  href = qualify(href)
92
-
95
+
93
96
  execute_request('delete', href)
97
+ clear_cache_on_delete(href)
98
+ return nil
94
99
  end
95
100
 
96
101
  private
97
102
 
98
- def needs_to_be_fully_qualified(href)
103
+ def needs_to_be_fully_qualified?(href)
99
104
  !href.downcase.start_with? 'http'
100
105
  end
101
106
 
102
107
  def qualify(href)
103
- needs_to_be_fully_qualified(href) ? @base_url + href : href
108
+ needs_to_be_fully_qualified?(href) ? @base_url + href : href
104
109
  end
105
110
 
106
- def execute_request(http_method, href, body=nil, query=nil)
111
+ def execute_request(http_method, href, resource=nil, query=nil)
107
112
  if http_method == 'get' && (cache = cache_for href)
108
113
  cached_result = cache.get href
109
114
  return cached_result if cached_result
110
115
  end
111
116
 
117
+ body = if resource
118
+ MultiJson.dump(to_hash(resource))
119
+ end
120
+
112
121
  request = Request.new(http_method, href, query, Hash.new, body)
113
122
  apply_default_request_headers request
114
123
  response = @request_executor.execute_request request
124
+
115
125
  result = response.body.length > 0 ? MultiJson.load(response.body) : ''
116
126
 
117
127
  if response.error?
@@ -119,11 +129,13 @@ class Stormpath::DataStore
119
129
  raise Stormpath::Error.new error
120
130
  end
121
131
 
122
- if http_method == 'delete'
123
- clear_cache_on_delete(href)
124
- return nil
132
+ if resource.is_a? Stormpath::Provider::AccountAccess
133
+ is_new_account = response.http_status == 201
134
+ result = {is_new_account: is_new_account, account: result }
125
135
  end
126
136
 
137
+ return if http_method == 'delete'
138
+
127
139
  if result[HREF_PROP_NAME]
128
140
  cache_walk result
129
141
  else
@@ -206,7 +218,7 @@ class Stormpath::DataStore
206
218
 
207
219
  clear_cache_on_save(resource)
208
220
 
209
- response = execute_request 'post', q_href, MultiJson.dump(to_hash(resource))
221
+ response = execute_request 'post', q_href, resource
210
222
 
211
223
  instantiate return_type, response.to_hash
212
224
  end
@@ -242,11 +254,11 @@ class Stormpath::DataStore
242
254
  def to_hash(resource)
243
255
  Hash.new.tap do |properties|
244
256
  resource.get_dirty_property_names.each do |name|
245
- ignore_camelcasing = resource_not_custom_data(resource, name) ? false : true
257
+ ignore_camelcasing = resource_is_custom_data(resource, name)
246
258
  property = resource.get_property name, ignore_camelcasing: ignore_camelcasing
247
259
 
248
- # Special use case is with Custom Data, it's hashes should not be simplified
249
- if property.kind_of?(Hash) and resource_not_custom_data resource, name
260
+ # Special use cases are with Custom Data, Provider and ProviderData, their hashes should not be simplified
261
+ if property.kind_of?(Hash) and !resource_nested_submittable(resource, name)
250
262
  property = to_simple_reference name, property
251
263
  end
252
264
 
@@ -263,8 +275,12 @@ class Stormpath::DataStore
263
275
  {HREF_PROP_NAME => href}
264
276
  end
265
277
 
266
- def resource_not_custom_data resource, name
267
- resource.class != Stormpath::Resource::CustomData and name != "customData"
278
+ def resource_nested_submittable resource, name
279
+ ['provider', 'providerData'].include?(name) or resource_is_custom_data(resource, name)
280
+ end
281
+
282
+ def resource_is_custom_data resource, name
283
+ resource.is_a? Stormpath::Resource::CustomData or name == 'customData'
268
284
  end
269
285
 
270
286
  end
@@ -24,37 +24,25 @@ module Stormpath
24
24
 
25
25
  splitted = href.split '?'
26
26
 
27
- if query_string.nil?
28
- @query_string = Hash.new
29
- else
30
- @query_string = query_string
31
- end
27
+ @query_string = query_string || {}
32
28
 
33
- if !splitted.nil? and splitted.length > 1
29
+ if splitted and splitted.length > 1
34
30
  @href = splitted[0]
35
31
  query_string_str = splitted[1]
36
-
37
32
  query_string_arr = query_string_str.split '&'
38
-
39
33
  query_string_arr.each do |pair|
40
-
41
34
  pair_arr = pair.split '='
42
-
43
35
  @query_string.store pair_arr[0], pair_arr[1]
44
-
45
36
  end
46
-
47
37
  else
48
-
49
38
  @href = href
50
-
51
39
  end
52
40
 
53
41
  @http_method = http_method.upcase
54
42
  @http_headers = http_headers
55
43
  @body = body
56
44
 
57
- if !body.nil?
45
+ if body
58
46
  @http_headers.store 'Content-Length', @body.bytesize
59
47
  end
60
48
 
@@ -65,30 +53,22 @@ module Stormpath
65
53
  end
66
54
 
67
55
  def to_s_query_string canonical
68
-
69
56
  result = ''
70
57
 
71
- if !@query_string.empty?
58
+ unless @query_string.empty?
72
59
  Hash[@query_string.sort].each do |key, value|
73
60
 
74
61
  enc_key = encode_url key, false, canonical
75
62
  enc_value = encode_url value, false, canonical
76
63
 
77
- if !result.empty?
78
- result << '&'
79
- end
80
-
64
+ result << '&' unless result.empty?
81
65
  result << enc_key << '='<< enc_value
82
-
83
66
  end
84
-
85
67
  end
86
68
 
87
69
  result
88
70
  end
89
71
 
90
72
  end
91
-
92
73
  end
93
-
94
74
  end
@@ -14,9 +14,7 @@
14
14
  # limitations under the License.
15
15
  #
16
16
  module Stormpath
17
-
18
17
  module Http
19
-
20
18
  class Response
21
19
 
22
20
  attr_reader :http_status, :headers, :body
@@ -30,7 +28,6 @@ module Stormpath
30
28
  @headers.body_size = content_length
31
29
  end
32
30
 
33
-
34
31
  def client_error?
35
32
  http_status >= 400 and http_status < 500
36
33
  end
@@ -44,7 +41,5 @@ module Stormpath
44
41
  end
45
42
 
46
43
  end
47
-
48
44
  end
49
-
50
45
  end
@@ -0,0 +1,28 @@
1
+ #
2
+ # Copyright 2014 Stormpath, Inc.
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+ #
16
+ module Stormpath
17
+ module Provider
18
+ class AccountAccess < Stormpath::Resource::Base
19
+
20
+ PROVIDER_DATA = :provider_data
21
+
22
+ def provider_data=(provider_data)
23
+ set_property PROVIDER_DATA, provider_data
24
+ end
25
+
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,30 @@
1
+ #
2
+ # Copyright 2014 Stormpath, Inc.
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+ #
16
+ module Stormpath
17
+ module Provider
18
+ class AccountRequest
19
+
20
+ attr_accessor :provider, :token_type, :token_value
21
+
22
+ def initialize(provider, token_type, token_value)
23
+ @provider = provider
24
+ @token_type = token_type
25
+ @token_value = token_value
26
+ end
27
+
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,43 @@
1
+ #
2
+ # Copyright 2014 Stormpath, Inc.
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+ #
16
+ module Stormpath
17
+ module Provider
18
+ class AccountResolver
19
+ include Stormpath::Util::Assert
20
+
21
+ def initialize data_store
22
+ @data_store = data_store
23
+ end
24
+
25
+ def resolve_provider_account parent_href, request
26
+ assert_not_nil parent_href, "parent_href argument must be specified"
27
+ assert_kind_of AccountRequest, request, "Only #{AccountRequest} instances are supported."
28
+
29
+ attempt = @data_store.instantiate AccountAccess
30
+
31
+ attempt.provider_data = {
32
+ request.token_type.to_s.camelize(:lower) => request.token_value,
33
+ "providerId" => request.provider
34
+ }
35
+
36
+ href = parent_href + '/accounts'
37
+
38
+ @data_store.create href, attempt, Stormpath::Provider::AccountResult
39
+ end
40
+
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,27 @@
1
+ #
2
+ # Copyright 2014 Stormpath, Inc.
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+ #
16
+ module Stormpath
17
+ module Provider
18
+ class AccountResult < Stormpath::Resource::Base
19
+
20
+ prop_reader :is_new_account
21
+
22
+ alias_method :is_new_account?, :is_new_account
23
+
24
+ has_one :account
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,18 @@
1
+ #
2
+ # Copyright 2014 Stormpath, Inc.
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+ #
16
+ class Stormpath::Provider::FacebookProvider < Stormpath::Provider::Provider
17
+ prop_reader :client_id, :client_secret
18
+ end
@@ -0,0 +1,18 @@
1
+ #
2
+ # Copyright 2014 Stormpath, Inc.
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+ #
16
+ class Stormpath::Provider::FacebookProviderData < Stormpath::Provider::ProviderData
17
+ prop_reader :access_token
18
+ end
@@ -0,0 +1,18 @@
1
+ #
2
+ # Copyright 2014 Stormpath, Inc.
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+ #
16
+ class Stormpath::Provider::GoogleProvider < Stormpath::Provider::Provider
17
+ prop_reader :client_id, :client_secret, :redirect_uri
18
+ end