stormpath-sdk 0.4.0 → 1.0.0.beta
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.
- data/.gitignore +6 -0
- data/.ruby-gemset +1 -0
- data/.ruby-version +1 -0
- data/.travis.yml +27 -0
- data/CHANGES.md +21 -1
- data/Gemfile +1 -2
- data/README.md +457 -11
- data/Rakefile +15 -1
- data/lib/stormpath-sdk.rb +52 -33
- data/lib/stormpath-sdk/{resource/group_list.rb → api_key.rb} +5 -9
- data/lib/stormpath-sdk/auth/authentication_result.rb +3 -13
- data/lib/stormpath-sdk/auth/basic_authenticator.rb +5 -11
- data/lib/stormpath-sdk/auth/basic_login_attempt.rb +6 -8
- data/lib/stormpath-sdk/auth/username_password_request.rb +2 -5
- data/lib/stormpath-sdk/cache/cache.rb +54 -0
- data/lib/stormpath-sdk/cache/cache_entry.rb +33 -0
- data/lib/stormpath-sdk/cache/cache_manager.rb +22 -0
- data/lib/stormpath-sdk/cache/cache_stats.rb +35 -0
- data/lib/stormpath-sdk/cache/memory_store.rb +29 -0
- data/lib/stormpath-sdk/cache/redis_store.rb +32 -0
- data/lib/stormpath-sdk/client.rb +111 -0
- data/lib/stormpath-sdk/data_store.rb +241 -0
- data/lib/stormpath-sdk/{client/api_key.rb → error.rb} +16 -10
- data/lib/stormpath-sdk/{util → ext}/hash.rb +1 -2
- data/lib/stormpath-sdk/http/authc/sauthc1_signer.rb +8 -4
- data/lib/stormpath-sdk/http/http_client_request_executor.rb +8 -7
- data/lib/stormpath-sdk/http/request.rb +4 -8
- data/lib/stormpath-sdk/{util/request_utils.rb → http/utils.rb} +17 -38
- data/lib/stormpath-sdk/resource/account.rb +12 -108
- data/lib/stormpath-sdk/resource/application.rb +35 -171
- data/lib/stormpath-sdk/resource/associations.rb +97 -0
- data/lib/stormpath-sdk/resource/base.rb +256 -0
- data/lib/stormpath-sdk/resource/collection.rb +94 -0
- data/lib/stormpath-sdk/resource/directory.rb +11 -68
- data/lib/stormpath-sdk/resource/email_verification_token.rb +3 -9
- data/lib/stormpath-sdk/resource/error.rb +4 -38
- data/lib/stormpath-sdk/resource/expansion.rb +28 -0
- data/lib/stormpath-sdk/resource/group.rb +8 -66
- data/lib/stormpath-sdk/resource/group_membership.rb +4 -55
- data/lib/stormpath-sdk/resource/{application_list.rb → instance.rb} +7 -13
- data/lib/stormpath-sdk/resource/password_reset_token.rb +5 -23
- data/lib/stormpath-sdk/resource/status.rb +22 -28
- data/lib/stormpath-sdk/resource/tenant.rb +5 -52
- data/lib/stormpath-sdk/resource/utils.rb +43 -13
- data/lib/stormpath-sdk/util/assert.rb +5 -15
- data/lib/stormpath-sdk/version.rb +3 -3
- data/spec/api_key_spec.rb +19 -0
- data/spec/auth/basic_authenticator_spec.rb +25 -0
- data/spec/auth/sauthc1_signer_spec.rb +42 -0
- data/spec/cache/cache_entry_spec.rb +157 -0
- data/spec/cache/cache_spec.rb +89 -0
- data/spec/cache/cache_stats_spec.rb +106 -0
- data/spec/client_spec.rb +538 -0
- data/spec/data_store_spec.rb +130 -0
- data/spec/resource/account_spec.rb +74 -0
- data/spec/resource/application_spec.rb +148 -0
- data/spec/resource/base_spec.rb +114 -0
- data/spec/resource/collection_spec.rb +169 -0
- data/spec/resource/directory_spec.rb +30 -0
- data/spec/resource/expansion_spec.rb +100 -0
- data/spec/resource/group_spec.rb +49 -0
- data/spec/spec_helper.rb +135 -0
- data/spec/support/resource_factory.rb +48 -0
- data/spec/support/resource_matchers.rb +27 -0
- data/spec/support/test_cache_stores.rb +9 -0
- data/spec/support/test_request_executor.rb +11 -0
- data/stormpath-sdk.gemspec +14 -4
- data/support/api.rb +55 -0
- metadata +214 -44
- data/lib/stormpath-sdk/client/client.rb +0 -38
- data/lib/stormpath-sdk/client/client_application.rb +0 -38
- data/lib/stormpath-sdk/client/client_application_builder.rb +0 -351
- data/lib/stormpath-sdk/client/client_builder.rb +0 -305
- data/lib/stormpath-sdk/ds/data_store.rb +0 -210
- data/lib/stormpath-sdk/ds/resource_factory.rb +0 -37
- data/lib/stormpath-sdk/resource/account_list.rb +0 -32
- data/lib/stormpath-sdk/resource/collection_resource.rb +0 -91
- data/lib/stormpath-sdk/resource/directory_list.rb +0 -30
- data/lib/stormpath-sdk/resource/group_membership_list.rb +0 -32
- data/lib/stormpath-sdk/resource/instance_resource.rb +0 -28
- data/lib/stormpath-sdk/resource/resource.rb +0 -327
- data/lib/stormpath-sdk/resource/resource_error.rb +0 -47
- data/test/client/client.yml +0 -16
- data/test/client/client_application_builder_spec.rb +0 -114
- data/test/client/client_builder_spec.rb +0 -176
- data/test/client/read_spec.rb +0 -254
- data/test/client/write_spec.rb +0 -420
- data/test/resource/resource_spec.rb +0 -41
- data/test/resource/test_resource.rb +0 -28
@@ -13,14 +13,8 @@
|
|
13
13
|
# See the License for the specific language governing permissions and
|
14
14
|
# limitations under the License.
|
15
15
|
#
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
class EmailVerificationToken < InstanceResource
|
21
|
-
end
|
22
|
-
|
16
|
+
class Stormpath::Resource::EmailVerificationToken < Stormpath::Resource::Instance
|
17
|
+
def token
|
18
|
+
href.split('/').last
|
23
19
|
end
|
24
|
-
|
25
20
|
end
|
26
|
-
|
@@ -13,45 +13,11 @@
|
|
13
13
|
# See the License for the specific language governing permissions and
|
14
14
|
# limitations under the License.
|
15
15
|
#
|
16
|
-
|
16
|
+
class Stormpath::Resource::Error < Stormpath::Resource::Base
|
17
17
|
|
18
|
-
|
19
|
-
|
20
|
-
class Error < Resource
|
21
|
-
|
22
|
-
STATUS = "status"
|
23
|
-
CODE = "code"
|
24
|
-
MESSAGE = "message"
|
25
|
-
DEV_MESSAGE = "developerMessage"
|
26
|
-
MORE_INFO = "moreInfo"
|
27
|
-
|
28
|
-
def initialize body
|
29
|
-
super nil, body
|
30
|
-
end
|
31
|
-
|
32
|
-
def get_status
|
33
|
-
get_property STATUS
|
34
|
-
end
|
35
|
-
|
36
|
-
def get_code
|
37
|
-
get_property CODE
|
38
|
-
end
|
39
|
-
|
40
|
-
def get_message
|
41
|
-
get_property MESSAGE
|
42
|
-
end
|
43
|
-
|
44
|
-
def get_developer_message
|
45
|
-
get_property DEV_MESSAGE
|
46
|
-
end
|
47
|
-
|
48
|
-
def get_more_info
|
49
|
-
get_property MORE_INFO
|
50
|
-
end
|
51
|
-
|
52
|
-
end
|
18
|
+
prop_reader :status, :code, :message, :developer_message, :more_info
|
53
19
|
|
20
|
+
def initialize body
|
21
|
+
super body, nil
|
54
22
|
end
|
55
|
-
|
56
23
|
end
|
57
|
-
|
@@ -0,0 +1,28 @@
|
|
1
|
+
class Stormpath::Resource::Expansion
|
2
|
+
attr_reader :query
|
3
|
+
|
4
|
+
def initialize *names
|
5
|
+
@query = {}
|
6
|
+
@properties = {}
|
7
|
+
|
8
|
+
names.each { |name| add_property name }
|
9
|
+
end
|
10
|
+
|
11
|
+
def add_property name, options = {}
|
12
|
+
@properties[name] = if options[:offset] || options[:limit]
|
13
|
+
pagination = []
|
14
|
+
pagination.push("offset:#{options[:offset]}") if options[:offset]
|
15
|
+
pagination.push("limit:#{options[:limit]}") if options[:limit]
|
16
|
+
|
17
|
+
"#{name}(#{pagination.join(',')})"
|
18
|
+
else
|
19
|
+
name
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def to_query
|
24
|
+
if @properties.any?
|
25
|
+
{ expand: @properties.values.join(',') }
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -13,75 +13,17 @@
|
|
13
13
|
# See the License for the specific language governing permissions and
|
14
14
|
# limitations under the License.
|
15
15
|
#
|
16
|
-
|
16
|
+
class Stormpath::Resource::Group < Stormpath::Resource::Instance
|
17
|
+
include Stormpath::Resource::Status
|
17
18
|
|
18
|
-
|
19
|
+
prop_accessor :name, :description
|
19
20
|
|
20
|
-
|
21
|
+
belongs_to :tenant
|
22
|
+
belongs_to :directory
|
21
23
|
|
22
|
-
|
23
|
-
|
24
|
-
NAME = "name"
|
25
|
-
DESCRIPTION = "description"
|
26
|
-
STATUS = "status"
|
27
|
-
TENANT = "tenant"
|
28
|
-
DIRECTORY = "directory"
|
29
|
-
ACCOUNTS = "accounts"
|
30
|
-
|
31
|
-
def get_name
|
32
|
-
get_property NAME
|
33
|
-
end
|
34
|
-
|
35
|
-
def set_name name
|
36
|
-
set_property NAME, name
|
37
|
-
end
|
38
|
-
|
39
|
-
def get_description
|
40
|
-
get_property DESCRIPTION
|
41
|
-
end
|
42
|
-
|
43
|
-
def set_description description
|
44
|
-
set_property DESCRIPTION, description
|
45
|
-
end
|
46
|
-
|
47
|
-
def get_status
|
48
|
-
value = get_property STATUS
|
49
|
-
|
50
|
-
if !value.nil?
|
51
|
-
value = value.upcase
|
52
|
-
end
|
53
|
-
|
54
|
-
value
|
55
|
-
end
|
56
|
-
|
57
|
-
def set_status status
|
58
|
-
|
59
|
-
if get_status_hash.has_key? status
|
60
|
-
set_property STATUS, get_status_hash[status]
|
61
|
-
end
|
62
|
-
|
63
|
-
end
|
64
|
-
|
65
|
-
def get_tenant
|
66
|
-
get_resource_property TENANT, Tenant
|
67
|
-
end
|
68
|
-
|
69
|
-
def get_directory
|
70
|
-
get_resource_property DIRECTORY, Directory
|
71
|
-
end
|
72
|
-
|
73
|
-
def get_accounts
|
74
|
-
get_resource_property ACCOUNTS, AccountList
|
75
|
-
end
|
76
|
-
|
77
|
-
def add_account account
|
78
|
-
|
79
|
-
GroupMembership::_create account, self, data_store
|
80
|
-
|
81
|
-
end
|
82
|
-
|
83
|
-
end
|
24
|
+
has_many :accounts
|
84
25
|
|
26
|
+
def add_account account
|
27
|
+
client.group_memberships.create group: self, account: account
|
85
28
|
end
|
86
|
-
|
87
29
|
end
|
@@ -13,60 +13,9 @@
|
|
13
13
|
# See the License for the specific language governing permissions and
|
14
14
|
# limitations under the License.
|
15
15
|
#
|
16
|
-
|
16
|
+
class Stormpath::Resource::GroupMembership < Stormpath::Resource::Instance
|
17
17
|
|
18
|
-
|
18
|
+
has_one :account
|
19
|
+
has_one :group
|
19
20
|
|
20
|
-
|
21
|
-
|
22
|
-
ACCOUNT = "account"
|
23
|
-
GROUP = "group"
|
24
|
-
|
25
|
-
def get_account
|
26
|
-
get_resource_property ACCOUNT, Account
|
27
|
-
end
|
28
|
-
|
29
|
-
def get_group
|
30
|
-
get_resource_property GROUP, Group
|
31
|
-
end
|
32
|
-
|
33
|
-
def delete
|
34
|
-
data_store.delete self
|
35
|
-
end
|
36
|
-
|
37
|
-
#
|
38
|
-
# THIS IS NOT PART OF THE STORMPATH PUBLIC API. SDK end-users should not call it - it could be removed or
|
39
|
-
# changed at any time. It is publicly accessible only as an implementation technique to be used by other
|
40
|
-
# resource classes.
|
41
|
-
#
|
42
|
-
# @param account the account to associate with the group.
|
43
|
-
# @param group the group which will contain the account.
|
44
|
-
# @param data_store the datastore used to create the membership
|
45
|
-
# @return the created GroupMembership instance.
|
46
|
-
#
|
47
|
-
def self._create account, group, data_store
|
48
|
-
|
49
|
-
#TODO: enable auto discovery
|
50
|
-
href = "/groupMemberships"
|
51
|
-
|
52
|
-
account_props = Hash.new
|
53
|
-
account_props.store HREF_PROP_NAME, account.get_href
|
54
|
-
|
55
|
-
group_props = Hash.new
|
56
|
-
group_props.store HREF_PROP_NAME, group.get_href
|
57
|
-
|
58
|
-
props = Hash.new
|
59
|
-
props.store ACCOUNT, account_props
|
60
|
-
props.store GROUP, group_props
|
61
|
-
|
62
|
-
group_membership = data_store.instantiate GroupMembership, props
|
63
|
-
|
64
|
-
data_store.create href, group_membership, GroupMembership
|
65
|
-
|
66
|
-
end
|
67
|
-
|
68
|
-
end
|
69
|
-
|
70
|
-
end
|
71
|
-
|
72
|
-
end
|
21
|
+
end
|
@@ -13,20 +13,14 @@
|
|
13
13
|
# See the License for the specific language governing permissions and
|
14
14
|
# limitations under the License.
|
15
15
|
#
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
class ApplicationList < CollectionResource
|
21
|
-
|
22
|
-
def get_item_type
|
23
|
-
|
24
|
-
Application
|
25
|
-
|
26
|
-
end
|
16
|
+
class Stormpath::Resource::Instance < Stormpath::Resource::Base
|
17
|
+
def save
|
18
|
+
data_store.save self
|
19
|
+
end
|
27
20
|
|
21
|
+
def delete
|
22
|
+
unless new?
|
23
|
+
data_store.delete self
|
28
24
|
end
|
29
|
-
|
30
25
|
end
|
31
26
|
end
|
32
|
-
|
@@ -13,30 +13,12 @@
|
|
13
13
|
# See the License for the specific language governing permissions and
|
14
14
|
# limitations under the License.
|
15
15
|
#
|
16
|
-
|
16
|
+
class Stormpath::Resource::PasswordResetToken < Stormpath::Resource::Base
|
17
|
+
prop_reader :email, :account
|
17
18
|
|
18
|
-
|
19
|
-
|
20
|
-
class PasswordResetToken < Resource
|
21
|
-
|
22
|
-
|
23
|
-
EMAIL = "email"
|
24
|
-
ACCOUNT = "account"
|
25
|
-
|
26
|
-
def get_email
|
27
|
-
get_property EMAIL
|
28
|
-
end
|
29
|
-
|
30
|
-
def set_email email
|
31
|
-
set_property EMAIL, email
|
32
|
-
end
|
33
|
-
|
34
|
-
def get_account
|
35
|
-
get_resource_property ACCOUNT, Account
|
36
|
-
end
|
37
|
-
|
38
|
-
end
|
19
|
+
belongs_to :account
|
39
20
|
|
21
|
+
def token
|
22
|
+
href.split('/').last
|
40
23
|
end
|
41
|
-
|
42
24
|
end
|
@@ -1,34 +1,28 @@
|
|
1
|
-
|
2
|
-
# Copyright 2012 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
|
-
|
18
|
-
module Resource
|
19
|
-
|
20
|
-
module Status
|
21
|
-
|
22
|
-
ENABLED = 'ENABLED'
|
23
|
-
DISABLED = 'DISABLED'
|
24
|
-
|
25
|
-
def get_status_hash
|
26
|
-
{ENABLED => ENABLED, DISABLED => DISABLED}
|
27
|
-
end
|
1
|
+
module Stormpath::Resource::Status
|
28
2
|
|
3
|
+
ENABLED = 'ENABLED'
|
4
|
+
DISABLED = 'DISABLED'
|
5
|
+
|
6
|
+
def status_hash
|
7
|
+
{ENABLED => ENABLED, DISABLED => DISABLED}
|
8
|
+
end
|
9
|
+
|
10
|
+
STATUS = "status"
|
11
|
+
|
12
|
+
def status
|
13
|
+
value = get_property STATUS
|
14
|
+
|
15
|
+
if !value.nil?
|
16
|
+
value = value.upcase
|
29
17
|
end
|
30
18
|
|
19
|
+
value
|
31
20
|
end
|
32
21
|
|
33
|
-
|
22
|
+
def status=(status)
|
23
|
+
if status_hash.has_key? status
|
24
|
+
set_property STATUS, status_hash[status]
|
25
|
+
end
|
26
|
+
end
|
34
27
|
|
28
|
+
end
|
@@ -13,58 +13,11 @@
|
|
13
13
|
# See the License for the specific language governing permissions and
|
14
14
|
# limitations under the License.
|
15
15
|
#
|
16
|
-
|
16
|
+
class Stormpath::Resource::Tenant < Stormpath::Resource::Instance
|
17
17
|
|
18
|
-
|
18
|
+
prop_reader :name, :key
|
19
19
|
|
20
|
-
|
20
|
+
has_many :applications
|
21
|
+
has_many :directories
|
21
22
|
|
22
|
-
|
23
|
-
KEY = "key"
|
24
|
-
APPLICATIONS = "applications"
|
25
|
-
DIRECTORIES = "directories"
|
26
|
-
|
27
|
-
def get_name
|
28
|
-
get_property NAME
|
29
|
-
end
|
30
|
-
|
31
|
-
def get_key
|
32
|
-
get_property KEY
|
33
|
-
end
|
34
|
-
|
35
|
-
def create_application application
|
36
|
-
|
37
|
-
href = "/applications"; #TODO: enable auto discovery
|
38
|
-
data_store.create href, application, Application
|
39
|
-
|
40
|
-
end
|
41
|
-
|
42
|
-
def get_applications
|
43
|
-
|
44
|
-
get_resource_property APPLICATIONS, ApplicationList
|
45
|
-
|
46
|
-
end
|
47
|
-
|
48
|
-
def get_directories
|
49
|
-
|
50
|
-
get_resource_property DIRECTORIES, DirectoryList
|
51
|
-
|
52
|
-
end
|
53
|
-
|
54
|
-
def verify_account_email token
|
55
|
-
|
56
|
-
#TODO: enable auto discovery via Tenant resource (should be just /emailVerificationTokens)
|
57
|
-
href = "/accounts/emailVerificationTokens/" + token
|
58
|
-
|
59
|
-
token_hash = Hash.new
|
60
|
-
token_hash.store HREF_PROP_NAME, href
|
61
|
-
|
62
|
-
ev_token = data_store.instantiate EmailVerificationToken, token_hash
|
63
|
-
|
64
|
-
#execute a POST (should clean this up / make it more obvious)
|
65
|
-
data_store.save ev_token, Account
|
66
|
-
end
|
67
|
-
|
68
|
-
end
|
69
|
-
end
|
70
|
-
end
|
23
|
+
end
|
@@ -14,29 +14,59 @@
|
|
14
14
|
# limitations under the License.
|
15
15
|
#
|
16
16
|
module Stormpath
|
17
|
-
|
18
17
|
module Resource
|
19
|
-
|
20
18
|
module Utils
|
21
|
-
|
22
19
|
include ActiveSupport::Inflector
|
23
20
|
include Stormpath::Util::Assert
|
24
21
|
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
22
|
+
def inspect
|
23
|
+
''.tap do |str|
|
24
|
+
str << %Q[#<#{class_name_with_id} @properties={]
|
25
|
+
@read_lock.lock
|
26
|
+
begin
|
27
|
+
str << properties.map do |key, value|
|
28
|
+
if printable_property? key
|
29
|
+
if value.kind_of? Hash and value.has_key? Stormpath::Resource::Base::HREF_PROP_NAME
|
30
|
+
value = %Q[{ "#{Stormpath::Resource::Base::HREF_PROP_NAME}" => "#{value[Stormpath::Resource::Base::HREF_PROP_NAME]}" }]
|
31
|
+
end
|
32
|
+
%Q["#{key} => #{value}"]
|
33
|
+
end
|
34
|
+
end.compact.join(',')
|
35
|
+
ensure
|
36
|
+
@read_lock.unlock
|
37
|
+
end
|
38
|
+
str << '}>'
|
39
|
+
end
|
40
|
+
end
|
30
41
|
|
31
|
-
|
42
|
+
def to_s
|
43
|
+
"#<#{class_name_with_id}>"
|
44
|
+
end
|
32
45
|
|
33
|
-
|
46
|
+
def to_yaml
|
47
|
+
"--- !ruby/object: #{self.class.name}\n".tap do |yaml|
|
48
|
+
@read_lock.lock
|
34
49
|
|
50
|
+
begin
|
51
|
+
properties_yaml = properties.each do |key, value|
|
52
|
+
if printable_property? key
|
53
|
+
" #{key}: #{value} \n"
|
54
|
+
end
|
55
|
+
end.compact.join("\n")
|
56
|
+
unless properties_yaml.empty?
|
57
|
+
yaml << " properties\n "
|
58
|
+
yaml << properties_yaml
|
59
|
+
end
|
60
|
+
ensure
|
61
|
+
@read_lock.unlock
|
62
|
+
end
|
35
63
|
end
|
64
|
+
end
|
36
65
|
|
37
|
-
|
38
|
-
|
66
|
+
def class_name_with_id
|
67
|
+
object_id_hex = '%x' % (self.object_id << 1)
|
68
|
+
"#{self.class.name}:0x#{object_id_hex}"
|
39
69
|
end
|
40
70
|
end
|
41
71
|
end
|
42
|
-
end
|
72
|
+
end
|