stormpath-sdk 0.1.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 (47) hide show
  1. data/Gemfile +4 -0
  2. data/README.md +24 -0
  3. data/Rakefile +16 -0
  4. data/lib/stormpath-sdk.rb +49 -0
  5. data/lib/stormpath-sdk/auth/authentication_result.rb +17 -0
  6. data/lib/stormpath-sdk/auth/basic_authenticator.rb +42 -0
  7. data/lib/stormpath-sdk/auth/basic_login_attempt.rb +30 -0
  8. data/lib/stormpath-sdk/auth/username_password_request.rb +43 -0
  9. data/lib/stormpath-sdk/client/api_key.rb +18 -0
  10. data/lib/stormpath-sdk/client/client.rb +23 -0
  11. data/lib/stormpath-sdk/client/client_builder.rb +291 -0
  12. data/lib/stormpath-sdk/ds/data_store.rb +150 -0
  13. data/lib/stormpath-sdk/ds/resource_factory.rb +22 -0
  14. data/lib/stormpath-sdk/http/authc/sauthc1_signer.rb +216 -0
  15. data/lib/stormpath-sdk/http/http_client_request_executor.rb +69 -0
  16. data/lib/stormpath-sdk/http/request.rb +83 -0
  17. data/lib/stormpath-sdk/http/response.rb +35 -0
  18. data/lib/stormpath-sdk/resource/account.rb +110 -0
  19. data/lib/stormpath-sdk/resource/account_list.rb +17 -0
  20. data/lib/stormpath-sdk/resource/application.rb +95 -0
  21. data/lib/stormpath-sdk/resource/application_list.rb +17 -0
  22. data/lib/stormpath-sdk/resource/collection_resource.rb +76 -0
  23. data/lib/stormpath-sdk/resource/directory.rb +76 -0
  24. data/lib/stormpath-sdk/resource/directory_list.rb +15 -0
  25. data/lib/stormpath-sdk/resource/email_verification_token.rb +11 -0
  26. data/lib/stormpath-sdk/resource/error.rb +42 -0
  27. data/lib/stormpath-sdk/resource/group.rb +73 -0
  28. data/lib/stormpath-sdk/resource/group_list.rb +18 -0
  29. data/lib/stormpath-sdk/resource/group_membership.rb +55 -0
  30. data/lib/stormpath-sdk/resource/group_membership_list.rb +17 -0
  31. data/lib/stormpath-sdk/resource/instance_resource.rb +13 -0
  32. data/lib/stormpath-sdk/resource/password_reset_token.rb +27 -0
  33. data/lib/stormpath-sdk/resource/resource.rb +173 -0
  34. data/lib/stormpath-sdk/resource/resource_error.rb +32 -0
  35. data/lib/stormpath-sdk/resource/status.rb +19 -0
  36. data/lib/stormpath-sdk/resource/tenant.rb +55 -0
  37. data/lib/stormpath-sdk/resource/utils.rb +16 -0
  38. data/lib/stormpath-sdk/util/assert.rb +26 -0
  39. data/lib/stormpath-sdk/util/hash.rb +17 -0
  40. data/lib/stormpath-sdk/util/request_utils.rb +57 -0
  41. data/lib/stormpath-sdk/version.rb +4 -0
  42. data/stormpath-sdk.gemspec +29 -0
  43. data/test/client/client.yml +16 -0
  44. data/test/client/clientbuilder_spec.rb +176 -0
  45. data/test/client/read_spec.rb +243 -0
  46. data/test/client/write_spec.rb +315 -0
  47. metadata +226 -0
@@ -0,0 +1,15 @@
1
+ module Stormpath
2
+
3
+ module Resource
4
+
5
+ class DirectoryList < CollectionResource
6
+
7
+ def get_item_type
8
+ Directory
9
+ end
10
+
11
+ end
12
+
13
+ end
14
+ end
15
+
@@ -0,0 +1,11 @@
1
+ module Stormpath
2
+
3
+ module Resource
4
+
5
+ class EmailVerificationToken < InstanceResource
6
+ end
7
+
8
+ end
9
+
10
+ end
11
+
@@ -0,0 +1,42 @@
1
+ module Stormpath
2
+
3
+ module Resource
4
+
5
+ class Error < Resource
6
+
7
+ STATUS = "status"
8
+ CODE = "code"
9
+ MESSAGE = "message"
10
+ DEV_MESSAGE = "developerMessage"
11
+ MORE_INFO = "moreInfo"
12
+
13
+ def initialize body
14
+ super nil, body
15
+ end
16
+
17
+ def get_status
18
+ get_property STATUS
19
+ end
20
+
21
+ def get_code
22
+ get_property CODE
23
+ end
24
+
25
+ def get_message
26
+ get_property MESSAGE
27
+ end
28
+
29
+ def get_developer_message
30
+ get_property DEV_MESSAGE
31
+ end
32
+
33
+ def get_more_info
34
+ get_property MORE_INFO
35
+ end
36
+
37
+ end
38
+
39
+ end
40
+
41
+ end
42
+
@@ -0,0 +1,73 @@
1
+ module Stormpath
2
+
3
+ module Resource
4
+
5
+ class Group < InstanceResource
6
+
7
+ include Status
8
+
9
+ NAME = "name"
10
+ DESCRIPTION = "description"
11
+ STATUS = "status"
12
+ TENANT = "tenant"
13
+ DIRECTORY = "directory"
14
+ ACCOUNTS = "accounts"
15
+
16
+ def get_name
17
+ get_property NAME
18
+ end
19
+
20
+ def set_name name
21
+ set_property NAME, name
22
+ end
23
+
24
+ def get_description
25
+ get_property DESCRIPTION
26
+ end
27
+
28
+ def set_description description
29
+ set_property DESCRIPTION, description
30
+ end
31
+
32
+ def get_status
33
+ value = get_property STATUS
34
+
35
+ if !value.nil?
36
+ value = value.upcase
37
+ end
38
+
39
+ value
40
+ end
41
+
42
+ def set_status status
43
+
44
+ if get_status_hash.has_key? status
45
+ set_property STATUS, get_status_hash[status]
46
+ end
47
+
48
+ end
49
+
50
+ def get_tenant
51
+ get_resource_property TENANT, Tenant
52
+ end
53
+
54
+ def get_directory
55
+ get_resource_property DIRECTORY, Directory
56
+ end
57
+
58
+ def get_accounts
59
+ get_resource_property ACCOUNTS, AccountList
60
+ end
61
+
62
+ def add_account account
63
+
64
+ group_membership = data_store.instantiate GroupMembership, nil
65
+ group_membership.create account, self
66
+
67
+ end
68
+
69
+ end
70
+
71
+ end
72
+
73
+ end
@@ -0,0 +1,18 @@
1
+ module Stormpath
2
+
3
+ module Resource
4
+
5
+ class GroupList < CollectionResource
6
+
7
+ def get_item_type
8
+
9
+ Group
10
+
11
+ end
12
+
13
+ end
14
+
15
+ end
16
+
17
+ end
18
+
@@ -0,0 +1,55 @@
1
+ module Stormpath
2
+
3
+ module Resource
4
+
5
+ class GroupMembership < InstanceResource
6
+
7
+ ACCOUNT = "account"
8
+ GROUP = "group"
9
+
10
+ def get_account
11
+ get_resource_property ACCOUNT, Account
12
+ end
13
+
14
+ def set_account account
15
+ set_property ACCOUNT, account
16
+ end
17
+
18
+ def get_group
19
+ get_resource_property GROUP, Group
20
+ end
21
+
22
+ def set_group group
23
+ set_property GROUP, group
24
+ end
25
+
26
+ def create account, group
27
+
28
+ #TODO: enable auto discovery
29
+ String href = "/groupMemberships"
30
+
31
+ account_props = Hash.new
32
+ account_props.store HREF_PROP_NAME, account.get_href
33
+
34
+ group_props = Hash.new
35
+ group_props.store HREF_PROP_NAME, group.get_href
36
+
37
+ props = Hash.new
38
+ props.store ACCOUNT, account_props
39
+ props.store GROUP, group_props
40
+
41
+ group_membership = data_store.instantiate GroupMembership, props
42
+
43
+ data_store.create href, group_membership, GroupMembership
44
+
45
+ end
46
+
47
+ def delete
48
+ data_store.delete self
49
+ end
50
+
51
+ end
52
+
53
+ end
54
+
55
+ end
@@ -0,0 +1,17 @@
1
+ module Stormpath
2
+
3
+ module Resource
4
+
5
+ class GroupMembershipList < CollectionResource
6
+
7
+ def get_item_type
8
+
9
+ GroupMembership
10
+
11
+ end
12
+
13
+ end
14
+
15
+ end
16
+
17
+ end
@@ -0,0 +1,13 @@
1
+ module Stormpath
2
+
3
+ module Resource
4
+
5
+ class InstanceResource < Resource
6
+
7
+ def save
8
+ data_store.save self
9
+ end
10
+ end
11
+ end
12
+
13
+ end
@@ -0,0 +1,27 @@
1
+ module Stormpath
2
+
3
+ module Resource
4
+
5
+ class PasswordResetToken < Resource
6
+
7
+
8
+ EMAIL = "email"
9
+ ACCOUNT = "account"
10
+
11
+ def get_email
12
+ get_property EMAIL
13
+ end
14
+
15
+ def set_email email
16
+ set_property EMAIL, email
17
+ end
18
+
19
+ def get_account
20
+ get_resource_property ACCOUNT, Account
21
+ end
22
+
23
+ end
24
+
25
+ end
26
+
27
+ end
@@ -0,0 +1,173 @@
1
+ module Stormpath
2
+
3
+ module Resource
4
+
5
+ class Resource
6
+
7
+ include Utils
8
+
9
+ HREF_PROP_NAME = "href"
10
+
11
+ def initialize data_store, properties
12
+
13
+ @data_store = data_store
14
+ @read_lock = Mutex.new
15
+ @write_lock = Mutex.new
16
+ @properties = Hash.new
17
+ set_properties properties
18
+
19
+ end
20
+
21
+ def set_properties properties
22
+
23
+ @write_lock.lock
24
+
25
+ begin
26
+
27
+ @dirty = false
28
+
29
+ if !properties.nil? and properties.is_a? Hash
30
+ @properties.replace properties
31
+ href_only = @properties.size == 1 and @properties.has_key? HREF_PROP_NAME
32
+ @materialized = !href_only
33
+
34
+ else
35
+ @materialized = false
36
+ end
37
+
38
+ ensure
39
+ @write_lock.unlock
40
+ end
41
+ end
42
+
43
+ def get_property name
44
+
45
+ if !HREF_PROP_NAME.eql? name
46
+ #not the href/id, must be a property that requires materialization:
47
+ if !is_new and !materialized
48
+
49
+ materialize
50
+ end
51
+ end
52
+
53
+ read_property name
54
+ end
55
+
56
+ def get_property_names
57
+ @read_lock.lock
58
+
59
+ begin
60
+ @properties.keys
61
+ ensure
62
+ @read_lock.unlock
63
+ end
64
+
65
+ end
66
+
67
+ def get_href
68
+ get_property HREF_PROP_NAME
69
+ end
70
+
71
+ attr_reader :properties
72
+
73
+ protected
74
+
75
+ attr_reader :data_store, :materialized
76
+
77
+ def get_resource_property key, clazz
78
+
79
+ value = get_property key
80
+
81
+ if value.is_a? Hash
82
+ href = get_href_from_hash value
83
+ end
84
+
85
+ if !href.nil?
86
+ @data_store.instantiate clazz, value
87
+ end
88
+ end
89
+
90
+ ##
91
+ # Returns {@code true} if the resource doesn't yet have an assigned 'href' property, {@code false} otherwise.
92
+ #
93
+ # @return {@code true} if the resource doesn't yet have an assigned 'href' property, {@code false} otherwise.
94
+ def is_new
95
+
96
+ #we can't call get_href in here, otherwise we'll have an infinite loop:
97
+
98
+ prop = read_property HREF_PROP_NAME
99
+
100
+ if prop.nil?
101
+ true
102
+
103
+ else
104
+ prop.respond_to? 'empty' and prop.empty?
105
+ end
106
+
107
+ end
108
+
109
+ def set_property name, value
110
+
111
+ @write_lock.lock
112
+
113
+ begin
114
+ if value.nil?
115
+
116
+ removed = @properties.delete name
117
+
118
+ if !removed.nil?
119
+ @dirty = true
120
+ end
121
+
122
+ else
123
+ @properties.store name, value
124
+ @dirty = true
125
+ end
126
+ ensure
127
+ @write_lock.unlock
128
+ end
129
+
130
+ end
131
+
132
+ def materialize
133
+ clazz = to_class_from_instance self
134
+
135
+ @write_lock.lock
136
+
137
+ begin
138
+
139
+ resource = @data_store.get_resource get_href, clazz
140
+ @properties.replace resource.properties
141
+ @materialized = true
142
+
143
+ ensure
144
+
145
+ @write_lock.unlock
146
+ end
147
+ end
148
+
149
+ private
150
+
151
+ def get_href_from_hash(props)
152
+
153
+ if !props.nil? and props.is_a? Hash
154
+ value = props[HREF_PROP_NAME]
155
+ end
156
+
157
+ value
158
+ end
159
+
160
+ def read_property name
161
+ @read_lock.lock
162
+
163
+ begin
164
+ @properties[name]
165
+ ensure
166
+ @read_lock.unlock
167
+ end
168
+
169
+ end
170
+ end
171
+ end
172
+
173
+ end