stormpath-sdk 1.1.2 → 1.1.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (142) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +0 -0
  3. data/.ruby-gemset +0 -0
  4. data/.travis.yml +0 -0
  5. data/CHANGES.md +10 -0
  6. data/Gemfile +0 -0
  7. data/README.md +0 -0
  8. data/Rakefile +0 -0
  9. data/lib/stormpath-sdk.rb +7 -2
  10. data/lib/stormpath-sdk/api_key.rb +0 -0
  11. data/lib/stormpath-sdk/auth/authentication_result.rb +0 -0
  12. data/lib/stormpath-sdk/auth/basic_authenticator.rb +0 -0
  13. data/lib/stormpath-sdk/auth/basic_login_attempt.rb +0 -0
  14. data/lib/stormpath-sdk/auth/username_password_request.rb +0 -0
  15. data/lib/stormpath-sdk/cache/cache.rb +0 -0
  16. data/lib/stormpath-sdk/cache/cache_entry.rb +0 -0
  17. data/lib/stormpath-sdk/cache/cache_manager.rb +0 -0
  18. data/lib/stormpath-sdk/cache/cache_stats.rb +0 -0
  19. data/lib/stormpath-sdk/cache/disabled_cache_store.rb +0 -0
  20. data/lib/stormpath-sdk/cache/memory_store.rb +0 -0
  21. data/lib/stormpath-sdk/cache/redis_store.rb +0 -0
  22. data/lib/stormpath-sdk/client.rb +0 -0
  23. data/lib/stormpath-sdk/data_store.rb +0 -0
  24. data/lib/stormpath-sdk/error.rb +0 -0
  25. data/lib/stormpath-sdk/http/authc/sauthc1_signer.rb +0 -0
  26. data/lib/stormpath-sdk/http/http_client_request_executor.rb +0 -0
  27. data/lib/stormpath-sdk/http/request.rb +0 -0
  28. data/lib/stormpath-sdk/http/response.rb +0 -0
  29. data/lib/stormpath-sdk/http/utils.rb +0 -0
  30. data/lib/stormpath-sdk/id_site/id_site_result.rb +0 -0
  31. data/lib/stormpath-sdk/oauth/access_token_authentication_result.rb +0 -0
  32. data/lib/stormpath-sdk/oauth/authenticator.rb +11 -10
  33. data/lib/stormpath-sdk/oauth/error.rb +0 -0
  34. data/lib/stormpath-sdk/oauth/id_site_grant.rb +0 -0
  35. data/lib/stormpath-sdk/oauth/id_site_grant_request.rb +0 -0
  36. data/lib/stormpath-sdk/oauth/password_grant.rb +0 -0
  37. data/lib/stormpath-sdk/oauth/password_grant_request.rb +0 -0
  38. data/lib/stormpath-sdk/oauth/refresh_grant_request.rb +0 -0
  39. data/lib/stormpath-sdk/oauth/refresh_token.rb +0 -0
  40. data/lib/stormpath-sdk/oauth/stormpath_grant_request.rb +33 -0
  41. data/lib/stormpath-sdk/oauth/stormpath_token_grant.rb +16 -0
  42. data/lib/stormpath-sdk/oauth/verify_access_token.rb +0 -0
  43. data/lib/stormpath-sdk/oauth/verify_token.rb +0 -0
  44. data/lib/stormpath-sdk/provider/account_access.rb +0 -0
  45. data/lib/stormpath-sdk/provider/account_request.rb +0 -0
  46. data/lib/stormpath-sdk/provider/account_resolver.rb +0 -0
  47. data/lib/stormpath-sdk/provider/account_result.rb +0 -0
  48. data/lib/stormpath-sdk/provider/facebook/facebook_provider.rb +0 -0
  49. data/lib/stormpath-sdk/provider/facebook/facebook_provider_data.rb +0 -0
  50. data/lib/stormpath-sdk/provider/github/github_provider.rb +0 -0
  51. data/lib/stormpath-sdk/provider/github/github_provider_data.rb +0 -0
  52. data/lib/stormpath-sdk/provider/google/google_provider.rb +0 -0
  53. data/lib/stormpath-sdk/provider/google/google_provider_data.rb +0 -0
  54. data/lib/stormpath-sdk/provider/linkedin/linkedin_provider.rb +0 -0
  55. data/lib/stormpath-sdk/provider/linkedin/linkedin_provider_data.rb +0 -0
  56. data/lib/stormpath-sdk/provider/provider.rb +0 -0
  57. data/lib/stormpath-sdk/provider/provider_data.rb +0 -0
  58. data/lib/stormpath-sdk/provider/saml/saml_mapping_rules.rb +0 -0
  59. data/lib/stormpath-sdk/provider/saml/saml_provider.rb +0 -0
  60. data/lib/stormpath-sdk/provider/saml/saml_provider_data.rb +0 -0
  61. data/lib/stormpath-sdk/provider/saml/saml_provider_metadata.rb +0 -0
  62. data/lib/stormpath-sdk/provider/stormpath/stormpath_provider.rb +0 -0
  63. data/lib/stormpath-sdk/provider/stormpath/stormpath_provider_data.rb +0 -0
  64. data/lib/stormpath-sdk/resource/access_token.rb +0 -0
  65. data/lib/stormpath-sdk/resource/account.rb +3 -2
  66. data/lib/stormpath-sdk/resource/account_creation_policy.rb +15 -0
  67. data/lib/stormpath-sdk/resource/account_membership.rb +0 -0
  68. data/lib/stormpath-sdk/resource/account_overrides.rb +0 -0
  69. data/lib/stormpath-sdk/resource/account_store.rb +0 -0
  70. data/lib/stormpath-sdk/resource/account_store_mapping.rb +0 -0
  71. data/lib/stormpath-sdk/resource/{account_status.rb → api_key.rb} +9 -9
  72. data/lib/stormpath-sdk/resource/application.rb +2 -2
  73. data/lib/stormpath-sdk/resource/associations.rb +2 -1
  74. data/lib/stormpath-sdk/resource/base.rb +0 -0
  75. data/lib/stormpath-sdk/resource/collection.rb +0 -0
  76. data/lib/stormpath-sdk/resource/custom_data.rb +0 -0
  77. data/lib/stormpath-sdk/resource/custom_data_hash_methods.rb +0 -0
  78. data/lib/stormpath-sdk/resource/custom_data_storage.rb +0 -0
  79. data/lib/stormpath-sdk/resource/directory.rb +3 -2
  80. data/lib/stormpath-sdk/resource/email_template.rb +7 -0
  81. data/lib/stormpath-sdk/resource/email_verification_token.rb +0 -0
  82. data/lib/stormpath-sdk/resource/error.rb +0 -0
  83. data/lib/stormpath-sdk/resource/expansion.rb +0 -0
  84. data/lib/stormpath-sdk/resource/group.rb +1 -2
  85. data/lib/stormpath-sdk/resource/group_membership.rb +0 -0
  86. data/lib/stormpath-sdk/resource/instance.rb +0 -0
  87. data/lib/stormpath-sdk/resource/oauth_policy.rb +0 -0
  88. data/lib/stormpath-sdk/resource/organization.rb +0 -0
  89. data/lib/stormpath-sdk/resource/organization_account_store_mapping.rb +0 -0
  90. data/lib/stormpath-sdk/resource/password_policy.rb +10 -0
  91. data/lib/stormpath-sdk/resource/password_reset_token.rb +0 -0
  92. data/lib/stormpath-sdk/resource/password_strength.rb +16 -0
  93. data/lib/stormpath-sdk/resource/refresh_token.rb +0 -0
  94. data/lib/stormpath-sdk/resource/tenant.rb +0 -0
  95. data/lib/stormpath-sdk/resource/utils.rb +0 -0
  96. data/lib/stormpath-sdk/resource/verification_email.rb +0 -0
  97. data/lib/stormpath-sdk/util/assert.rb +0 -0
  98. data/lib/stormpath-sdk/version.rb +1 -1
  99. data/spec/api_key_spec.rb +0 -0
  100. data/spec/auth/basic_authenticator_spec.rb +0 -0
  101. data/spec/auth/sauthc1_signer_spec.rb +0 -0
  102. data/spec/cache/cache_entry_spec.rb +0 -0
  103. data/spec/cache/cache_spec.rb +0 -0
  104. data/spec/cache/cache_stats_spec.rb +0 -0
  105. data/spec/client_spec.rb +1 -1
  106. data/spec/data_store_spec.rb +0 -0
  107. data/spec/fixtures/response/create_saml_directory.json +0 -0
  108. data/spec/fixtures/response/create_saml_directory_mapping_rules.json +0 -0
  109. data/spec/fixtures/response/get_saml_directory_provider.json +0 -0
  110. data/spec/fixtures/response/get_saml_directory_provider_metadata.json +0 -0
  111. data/spec/oauth/access_token_authentication_result_spec.rb +0 -0
  112. data/spec/provider/account_resolver_spec.rb +0 -0
  113. data/spec/provider/provider_spec.rb +0 -0
  114. data/spec/resource/account_creation_policy_spec.rb +61 -0
  115. data/spec/resource/account_store_mapping_spec.rb +0 -0
  116. data/spec/resource/account_store_spec.rb +0 -0
  117. data/spec/resource/api_key_spec.rb +56 -0
  118. data/spec/resource/application_spec.rb +26 -3
  119. data/spec/resource/base_spec.rb +0 -0
  120. data/spec/resource/collection_spec.rb +0 -0
  121. data/spec/resource/custom_data_spec.rb +0 -0
  122. data/spec/resource/directory_spec.rb +13 -4
  123. data/spec/resource/email_template_spec.rb +59 -0
  124. data/spec/resource/expansion_spec.rb +0 -0
  125. data/spec/resource/group_membership_spec.rb +0 -0
  126. data/spec/resource/group_spec.rb +0 -0
  127. data/spec/resource/organization_spec.rb +0 -0
  128. data/spec/resource/password_policy_spec.rb +58 -0
  129. data/spec/resource/password_strength_spec.rb +69 -0
  130. data/spec/resource/status_spec.rb +2 -16
  131. data/spec/resource/tenant_spec.rb +0 -0
  132. data/spec/spec_helper.rb +0 -0
  133. data/spec/support/custom_data_storage_behavior.rb +0 -0
  134. data/spec/support/mocked_provider_accounts.rb +0 -0
  135. data/spec/support/resource_factory.rb +0 -0
  136. data/spec/support/resource_matchers.rb +0 -0
  137. data/spec/support/test_cache_stores.rb +0 -0
  138. data/spec/support/test_request_executor.rb +0 -0
  139. data/stormpath-sdk.gemspec +0 -0
  140. data/support/api.rb +0 -0
  141. metadata +13 -3
  142. data/lib/stormpath-sdk/resource/status.rb +0 -39
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 3bb456ac02d7a55749cc5ba260573ceea9895391
4
- data.tar.gz: 7c33b5d39a0fc8946706d0bf4411a701468189af
3
+ metadata.gz: 5d1de61dbd75dec6b95c21b0caeccebba7c1771c
4
+ data.tar.gz: 5d4abcc09a7c3dfd0092b903a4a6d2b48b2c4766
5
5
  SHA512:
6
- metadata.gz: bc430c17fcdbb63e14d13cae91ee3891f747c0cab30d48a68897d621db3ea053b5f6a055a9add76faaebb43ec253c7fe1843252f3152ead070724b9a70a631e0
7
- data.tar.gz: 01cc90dc615a9e0f39e7ffe085acfd4063204d7e22663fcfb49577391053f3cc39e241ce6ab10fa8db294ce3e7ec543e2c39284dc9b9b9999d9e90dad873691a
6
+ metadata.gz: 3dda830ead5d75dcd8dbc7fe97b22c1d94c9b974126e5973288c89358b91160c99167c57ffe65cf8378bf954c284d63a0fc1ad97afa5520a247be78aec91d70d
7
+ data.tar.gz: 9df0ea91dfc37d6b71bc9ca99fdf8dcaf703a020abd5343698eaaed097b44c8ce5c1ded3a998d1213ea542081ebf00ad18ffbb61ef5866b7b1a1ffbf0b5a1f13
data/.gitignore CHANGED
File without changes
File without changes
File without changes
data/CHANGES.md CHANGED
@@ -1,6 +1,16 @@
1
1
  stormpath-sdk-ruby Changelog
2
2
  ============================
3
3
 
4
+ Version 1.1.3
5
+ -------------
6
+
7
+ Released on June 27, 2016
8
+
9
+ - Add Password Policy, PasswordStrength, ResetEmailTemplates and ResetSuccessEmailTemplates
10
+ - Add Account Creation Policy
11
+ - Add Oauth Verification with Stormpath Tokens
12
+ - Add Account Api Keys
13
+
4
14
  Version 1.1.2
5
15
  -------------
6
16
 
data/Gemfile CHANGED
File without changes
data/README.md CHANGED
File without changes
data/Rakefile CHANGED
File without changes
@@ -25,8 +25,6 @@ module Stormpath
25
25
 
26
26
  module Resource
27
27
  autoload :Expansion, 'stormpath-sdk/resource/expansion'
28
- autoload :Status, 'stormpath-sdk/resource/status'
29
- autoload :AccountStatus, 'stormpath-sdk/resource/account_status'
30
28
  autoload :Utils, 'stormpath-sdk/resource/utils'
31
29
  autoload :Associations, 'stormpath-sdk/resource/associations'
32
30
  autoload :Base, 'stormpath-sdk/resource/base'
@@ -42,6 +40,8 @@ module Stormpath
42
40
  autoload :Account, 'stormpath-sdk/resource/account'
43
41
  autoload :AccountStore, 'stormpath-sdk/resource/account_store'
44
42
  autoload :AccountStoreMapping, 'stormpath-sdk/resource/account_store_mapping'
43
+ autoload :ApiKey, 'stormpath-sdk/resource/api_key'
44
+ autoload :AccountCreationPolicy, 'stormpath-sdk/resource/account_creation_policy'
45
45
  autoload :Group, 'stormpath-sdk/resource/group'
46
46
  autoload :EmailVerificationToken, 'stormpath-sdk/resource/email_verification_token'
47
47
  autoload :GroupMembership, 'stormpath-sdk/resource/group_membership'
@@ -54,6 +54,9 @@ module Stormpath
54
54
  autoload :Organization, 'stormpath-sdk/resource/organization'
55
55
  autoload :OrganizationAccountStoreMapping, 'stormpath-sdk/resource/organization_account_store_mapping'
56
56
  autoload :AccountOverrides, 'stormpath-sdk/resource/account_overrides'
57
+ autoload :PasswordPolicy, 'stormpath-sdk/resource/password_policy'
58
+ autoload :EmailTemplate, 'stormpath-sdk/resource/email_template'
59
+ autoload :PasswordStrength, 'stormpath-sdk/resource/password_strength'
57
60
  end
58
61
 
59
62
  module Cache
@@ -115,8 +118,10 @@ module Stormpath
115
118
  autoload :Authenticator, "stormpath-sdk/oauth/authenticator"
116
119
  autoload :PasswordGrant, "stormpath-sdk/oauth/password_grant"
117
120
  autoload :RefreshToken, "stormpath-sdk/oauth/refresh_token"
121
+ autoload :StormpathTokenGrant, "stormpath-sdk/oauth/stormpath_token_grant"
118
122
  autoload :PasswordGrantRequest, "stormpath-sdk/oauth/password_grant_request"
119
123
  autoload :RefreshGrantRequest, "stormpath-sdk/oauth/refresh_grant_request"
124
+ autoload :StormpathGrantRequest, "stormpath-sdk/oauth/stormpath_grant_request"
120
125
  autoload :VerifyAccessToken, "stormpath-sdk/oauth/verify_access_token"
121
126
  autoload :VerifyToken, "stormpath-sdk/oauth/verify_token"
122
127
  autoload :AccessTokenAuthenticationResult, "stormpath-sdk/oauth/access_token_authentication_result"
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
@@ -7,22 +7,23 @@ module Stormpath
7
7
  @data_store = data_store
8
8
  end
9
9
 
10
- def authenticate parent_href, request
10
+ def authenticate(parent_href, request)
11
11
  assert_not_nil parent_href, "parent_href must be specified"
12
12
 
13
- if request.grant_type == 'password'
14
- attempt = @data_store.instantiate PasswordGrant
15
- elsif request.grant_type == 'refresh_token'
16
- attempt = @data_store.instantiate RefreshToken
17
- elsif request.grant_type == 'id_site_token'
18
- attempt = @data_store.instantiate IdSiteGrant
19
- end
20
-
13
+ clazz = GRANT_CLASSES_BY_TYPE[request.grant_type.to_sym]
14
+ attempt = @data_store.instantiate(clazz)
21
15
  attempt.set_options(request)
22
-
23
16
  href = parent_href + '/oauth/token'
17
+
24
18
  @data_store.create href, attempt, Stormpath::Oauth::AccessTokenAuthenticationResult
25
19
  end
20
+
21
+ GRANT_CLASSES_BY_TYPE = {
22
+ password: PasswordGrant,
23
+ refresh_token: RefreshToken,
24
+ id_site_token: IdSiteGrant,
25
+ stormpath_token: StormpathTokenGrant
26
+ }.freeze
26
27
  end
27
28
  end
28
29
  end
File without changes
File without changes
File without changes
File without changes
@@ -0,0 +1,33 @@
1
+ module Stormpath
2
+ module Oauth
3
+ class StormpathGrantRequest
4
+ def initialize(account, application, api_key)
5
+ @account = account
6
+ @application = application
7
+ @api_key = api_key
8
+ end
9
+
10
+ def token
11
+ @token ||= JWT.encode(payload, api_key.secret, 'HS256')
12
+ end
13
+
14
+ def grant_type
15
+ 'stormpath_token'
16
+ end
17
+
18
+ private
19
+
20
+ attr_accessor :account, :application, :api_key
21
+
22
+ def payload
23
+ {
24
+ sub: account.href,
25
+ iat: Time.now.to_i,
26
+ iss: application.href,
27
+ status: 'AUTHENTICATED',
28
+ aud: api_key.id
29
+ }
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,16 @@
1
+ module Stormpath
2
+ module Oauth
3
+ class StormpathTokenGrant < Stormpath::Resource::Base
4
+ prop_accessor :grant_type, :refresh_token
5
+
6
+ def set_options(request)
7
+ set_property :token, request.token
8
+ set_property :grant_type, request.grant_type
9
+ end
10
+
11
+ def form_data?
12
+ true
13
+ end
14
+ end
15
+ end
16
+ end
File without changes
File without changes
@@ -14,10 +14,9 @@
14
14
  # limitations under the License.
15
15
  #
16
16
  class Stormpath::Resource::Account < Stormpath::Resource::Instance
17
- include Stormpath::Resource::AccountStatus
18
17
  include Stormpath::Resource::CustomDataStorage
19
18
 
20
- prop_accessor :username, :email, :given_name, :middle_name, :surname
19
+ prop_accessor :username, :email, :given_name, :middle_name, :surname, :status
21
20
  prop_writer :password
22
21
  prop_reader :full_name, :created_at, :modified_at, :password_modified_at
23
22
  prop_non_printable :password
@@ -36,6 +35,8 @@ class Stormpath::Resource::Account < Stormpath::Resource::Instance
36
35
  has_many :access_tokens
37
36
  has_many :refresh_tokens
38
37
 
38
+ has_many :api_keys, can: [:create]
39
+
39
40
  def add_group group
40
41
  client.group_memberships.create group: group, account: self
41
42
  end
@@ -0,0 +1,15 @@
1
+ module Stormpath
2
+ module Resource
3
+ class AccountCreationPolicy < Stormpath::Resource::Instance
4
+ prop_accessor(
5
+ :verification_email_status,
6
+ :verification_success_email_status,
7
+ :welcome_email_status
8
+ )
9
+
10
+ has_many :verification_email_templates, class_name: :emailTemplate
11
+ has_many :verification_success_email_templates, class_name: :emailTemplate
12
+ has_many :welcome_email_templates, class_name: :emailTemplate
13
+ end
14
+ end
15
+ end
@@ -1,5 +1,5 @@
1
1
  #
2
- # Copyright 2014 Stormpath, Inc.
2
+ # Copyright 2016 Stormpath, Inc.
3
3
  #
4
4
  # Licensed under the Apache License, Version 2.0 (the "License");
5
5
  # you may not use this file except in compliance with the License.
@@ -13,14 +13,14 @@
13
13
  # See the License for the specific language governing permissions and
14
14
  # limitations under the License.
15
15
  #
16
- module Stormpath::Resource::AccountStatus
17
- include Stormpath::Resource::Status
16
+ module Stormpath
17
+ module Resource
18
+ class ApiKey < Instance
19
+ prop_accessor :name, :description, :status
20
+ prop_reader :id, :secret
18
21
 
19
- UNVERIFIED = 'UNVERIFIED'
20
- LOCKED = 'LOCKED'
21
-
22
- def status_hash
23
- super.merge UNVERIFIED => UNVERIFIED, LOCKED => LOCKED
22
+ belongs_to :account
23
+ belongs_to :tenant
24
+ end
24
25
  end
25
-
26
26
  end
@@ -14,14 +14,13 @@
14
14
  # limitations under the License.
15
15
  #
16
16
  class Stormpath::Resource::Application < Stormpath::Resource::Instance
17
- include Stormpath::Resource::Status
18
17
  include Stormpath::Resource::CustomDataStorage
19
18
  include Stormpath::Resource::AccountOverrides
20
19
  include UUIDTools
21
20
 
22
21
  class LoadError < Stormpath::Error; end
23
22
 
24
- prop_accessor :name, :description, :authorized_callback_uris
23
+ prop_accessor :name, :description, :authorized_callback_uris, :status
25
24
  prop_reader :created_at, :modified_at
26
25
 
27
26
  belongs_to :tenant
@@ -31,6 +30,7 @@ class Stormpath::Resource::Application < Stormpath::Resource::Instance
31
30
  has_many :account_store_mappings, can: [:get, :create]
32
31
  has_many :groups, can: [:get, :create]
33
32
  has_many :verification_emails, can: :create
33
+ has_many :api_keys
34
34
 
35
35
  has_one :default_account_store_mapping, class_name: :accountStoreMapping
36
36
  has_one :default_group_store_mapping, class_name: :accountStoreMapping
@@ -33,7 +33,8 @@ module Stormpath
33
33
  alias_method :belongs_to, :resource_prop_reader
34
34
 
35
35
  def has_many(name, options={}, &block)
36
- item_class = options[:class] || "Stormpath::Resource::#{name.to_s.singularize.camelize}".constantize
36
+ options[:class_name] ||= name.to_s.singularize
37
+ item_class = "Stormpath::Resource::#{options[:class_name].to_s.camelize}".constantize
37
38
  property_name = name.to_s.camelize :lower
38
39
  can = Array.wrap(options[:can]) || []
39
40
 
File without changes
File without changes
File without changes
@@ -14,11 +14,10 @@
14
14
  # limitations under the License.
15
15
  #
16
16
  class Stormpath::Resource::Directory < Stormpath::Resource::Instance
17
- include Stormpath::Resource::Status
18
17
  include Stormpath::Resource::CustomDataStorage
19
18
  include Stormpath::Resource::AccountOverrides
20
19
 
21
- prop_accessor :name, :description
20
+ prop_accessor :name, :description, :status
22
21
  prop_reader :created_at, :modified_at
23
22
 
24
23
  belongs_to :tenant
@@ -26,6 +25,8 @@ class Stormpath::Resource::Directory < Stormpath::Resource::Instance
26
25
  has_many :accounts, can: [:get, :create]
27
26
  has_many :groups, can: [:get, :create]
28
27
  has_one :custom_data
28
+ has_one :password_policy
29
+ has_one :account_creation_policy
29
30
 
30
31
  def provider
31
32
  internal_instance = instance_variable_get "@_provider"
@@ -0,0 +1,7 @@
1
+ module Stormpath
2
+ module Resource
3
+ class EmailTemplate < Stormpath::Resource::Instance
4
+ prop_accessor :name, :description, :subject, :from_email_address, :text_body, :html_body, :mime_type
5
+ end
6
+ end
7
+ end
File without changes
File without changes
@@ -14,10 +14,9 @@
14
14
  # limitations under the License.
15
15
  #
16
16
  class Stormpath::Resource::Group < Stormpath::Resource::Instance
17
- include Stormpath::Resource::Status
18
17
  include Stormpath::Resource::CustomDataStorage
19
18
 
20
- prop_accessor :name, :description
19
+ prop_accessor :name, :description, :status
21
20
  prop_reader :created_at, :modified_at
22
21
 
23
22
  belongs_to :tenant