appwrite 22.0.0 → 23.0.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 (46) hide show
  1. checksums.yaml +4 -4
  2. data/lib/appwrite/client.rb +9 -2
  3. data/lib/appwrite/enums/build_runtime.rb +2 -0
  4. data/lib/appwrite/enums/o_auth_provider.rb +1 -0
  5. data/lib/appwrite/enums/platform_type.rb +11 -0
  6. data/lib/appwrite/enums/protocol_id.rb +9 -0
  7. data/lib/appwrite/enums/runtime.rb +2 -0
  8. data/lib/appwrite/enums/scopes.rb +4 -0
  9. data/lib/appwrite/enums/service_id.rb +23 -0
  10. data/lib/appwrite/models/auth_provider.rb +47 -0
  11. data/lib/appwrite/models/billing_limits.rb +62 -0
  12. data/lib/appwrite/models/block.rb +47 -0
  13. data/lib/appwrite/models/dev_key.rb +62 -0
  14. data/lib/appwrite/models/key.rb +67 -0
  15. data/lib/appwrite/models/key_list.rb +32 -0
  16. data/lib/appwrite/models/log.rb +5 -0
  17. data/lib/appwrite/models/mock_number.rb +32 -0
  18. data/lib/appwrite/models/platform_android.rb +71 -0
  19. data/lib/appwrite/models/platform_apple.rb +71 -0
  20. data/lib/appwrite/models/platform_linux.rb +71 -0
  21. data/lib/appwrite/models/platform_list.rb +32 -0
  22. data/lib/appwrite/models/platform_web.rb +71 -0
  23. data/lib/appwrite/models/platform_windows.rb +71 -0
  24. data/lib/appwrite/models/project.rb +412 -0
  25. data/lib/appwrite/models/webhook.rb +20 -20
  26. data/lib/appwrite/service.rb +1 -1
  27. data/lib/appwrite/services/account.rb +47 -2
  28. data/lib/appwrite/services/activities.rb +3 -1
  29. data/lib/appwrite/services/avatars.rb +9 -1
  30. data/lib/appwrite/services/backups.rb +13 -1
  31. data/lib/appwrite/services/databases.rb +132 -6
  32. data/lib/appwrite/services/functions.rb +27 -1
  33. data/lib/appwrite/services/graphql.rb +5 -3
  34. data/lib/appwrite/services/health.rb +26 -1
  35. data/lib/appwrite/services/locale.rb +9 -1
  36. data/lib/appwrite/services/messaging.rb +49 -1
  37. data/lib/appwrite/services/project.rb +840 -1
  38. data/lib/appwrite/services/sites.rb +26 -1
  39. data/lib/appwrite/services/storage.rb +14 -1
  40. data/lib/appwrite/services/tables_db.rb +132 -6
  41. data/lib/appwrite/services/teams.rb +14 -1
  42. data/lib/appwrite/services/tokens.rb +6 -1
  43. data/lib/appwrite/services/users.rb +44 -1
  44. data/lib/appwrite/services/webhooks.rb +31 -21
  45. data/lib/appwrite.rb +17 -0
  46. metadata +19 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 4f4a3d1bf31ce4e73601bc346a1e2d1607cc7660dab949aa3d7cdac1c5072901
4
- data.tar.gz: ce5739e6bdaa5f4a39c0d29153772395ad51dd53fcedea2114eff17f14fe2d67
3
+ metadata.gz: 71453fa364510c42ae244dc43108518fd45bcd5eba4409148f181d544f61907e
4
+ data.tar.gz: '018040e5e8aab6d7ebc649f0754ce43a32cf1a64bebb70c2b5b4c93781c70add'
5
5
  SHA512:
6
- metadata.gz: 0db71f51932537771194fc8595e4093ab39c694c57e3fe8672c785d8160b1899f94d2b253be40b0e808708edb3c460a6ba023f21fee1c94d181836f2502d80f5
7
- data.tar.gz: 22a815abefa4ed7cd85442cf03c01fa5cae995f3e53b91f05bf4f87982bd318f6f18b0b79b24194fd8569858c26bb0455decc79d01121164bd005df0b79cdf4f
6
+ metadata.gz: bbd44f5cf20c90fe3f628a2badb9ed1766960d3605569475ca36b5bcb32931fbbd8a804e8036fbef454c7d73ff7b52c1c301111777eff84d7780661dbbd5a6c7
7
+ data.tar.gz: 68008c910bd8e7350dc6cc7b33c692b25ccdc4d8f45df13453ded2456c2b7cd62100838c157160c25d836a6fa5496cf75cb89bb2f5340e78dc5f14b244a11bee
@@ -15,8 +15,8 @@ module Appwrite
15
15
  'x-sdk-name'=> 'Ruby',
16
16
  'x-sdk-platform'=> 'server',
17
17
  'x-sdk-language'=> 'ruby',
18
- 'x-sdk-version'=> '22.0.0',
19
- 'X-Appwrite-Response-Format' => '1.9.0'
18
+ 'x-sdk-version'=> '23.0.0',
19
+ 'X-Appwrite-Response-Format' => '1.9.1'
20
20
  }
21
21
  @endpoint = 'https://cloud.appwrite.io/v1'
22
22
  end
@@ -174,6 +174,13 @@ module Appwrite
174
174
  self
175
175
  end
176
176
 
177
+ # Get request headers
178
+ #
179
+ # @return [Hash]
180
+ def get_headers
181
+ @headers.dup
182
+ end
183
+
177
184
  # Send the HTTP request.
178
185
  #
179
186
  # @param [String] method The HTTP method for the request
@@ -49,6 +49,7 @@ module Appwrite
49
49
  DART_3_8 = 'dart-3.8'
50
50
  DART_3_9 = 'dart-3.9'
51
51
  DART_3_10 = 'dart-3.10'
52
+ DART_3_11 = 'dart-3.11'
52
53
  DOTNET_6_0 = 'dotnet-6.0'
53
54
  DOTNET_7_0 = 'dotnet-7.0'
54
55
  DOTNET_8_0 = 'dotnet-8.0'
@@ -87,6 +88,7 @@ module Appwrite
87
88
  FLUTTER_3_32 = 'flutter-3.32'
88
89
  FLUTTER_3_35 = 'flutter-3.35'
89
90
  FLUTTER_3_38 = 'flutter-3.38'
91
+ FLUTTER_3_41 = 'flutter-3.41'
90
92
  end
91
93
  end
92
94
  end
@@ -35,6 +35,7 @@ module Appwrite
35
35
  TRADESHIFTBOX = 'tradeshiftBox'
36
36
  TWITCH = 'twitch'
37
37
  WORDPRESS = 'wordpress'
38
+ X = 'x'
38
39
  YAHOO = 'yahoo'
39
40
  YAMMER = 'yammer'
40
41
  YANDEX = 'yandex'
@@ -0,0 +1,11 @@
1
+ module Appwrite
2
+ module Enums
3
+ module PlatformType
4
+ WINDOWS = 'windows'
5
+ APPLE = 'apple'
6
+ ANDROID = 'android'
7
+ LINUX = 'linux'
8
+ WEB = 'web'
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,9 @@
1
+ module Appwrite
2
+ module Enums
3
+ module ProtocolId
4
+ REST = 'rest'
5
+ GRAPHQL = 'graphql'
6
+ WEBSOCKET = 'websocket'
7
+ end
8
+ end
9
+ end
@@ -49,6 +49,7 @@ module Appwrite
49
49
  DART_3_8 = 'dart-3.8'
50
50
  DART_3_9 = 'dart-3.9'
51
51
  DART_3_10 = 'dart-3.10'
52
+ DART_3_11 = 'dart-3.11'
52
53
  DOTNET_6_0 = 'dotnet-6.0'
53
54
  DOTNET_7_0 = 'dotnet-7.0'
54
55
  DOTNET_8_0 = 'dotnet-8.0'
@@ -87,6 +88,7 @@ module Appwrite
87
88
  FLUTTER_3_32 = 'flutter-3.32'
88
89
  FLUTTER_3_35 = 'flutter-3.35'
89
90
  FLUTTER_3_38 = 'flutter-3.38'
91
+ FLUTTER_3_41 = 'flutter-3.41'
90
92
  end
91
93
  end
92
94
  end
@@ -62,6 +62,10 @@ module Appwrite
62
62
  WEBHOOKS_WRITE = 'webhooks.write'
63
63
  PROJECT_READ = 'project.read'
64
64
  PROJECT_WRITE = 'project.write'
65
+ KEYS_READ = 'keys.read'
66
+ KEYS_WRITE = 'keys.write'
67
+ PLATFORMS_READ = 'platforms.read'
68
+ PLATFORMS_WRITE = 'platforms.write'
65
69
  POLICIES_WRITE = 'policies.write'
66
70
  POLICIES_READ = 'policies.read'
67
71
  ARCHIVES_READ = 'archives.read'
@@ -0,0 +1,23 @@
1
+ module Appwrite
2
+ module Enums
3
+ module ServiceId
4
+ ACCOUNT = 'account'
5
+ AVATARS = 'avatars'
6
+ DATABASES = 'databases'
7
+ TABLESDB = 'tablesdb'
8
+ LOCALE = 'locale'
9
+ HEALTH = 'health'
10
+ PROJECT = 'project'
11
+ STORAGE = 'storage'
12
+ TEAMS = 'teams'
13
+ USERS = 'users'
14
+ VCS = 'vcs'
15
+ SITES = 'sites'
16
+ FUNCTIONS = 'functions'
17
+ PROXY = 'proxy'
18
+ GRAPHQL = 'graphql'
19
+ MIGRATIONS = 'migrations'
20
+ MESSAGING = 'messaging'
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,47 @@
1
+ #frozen_string_literal: true
2
+
3
+ module Appwrite
4
+ module Models
5
+ class AuthProvider
6
+ attr_reader :key
7
+ attr_reader :name
8
+ attr_reader :app_id
9
+ attr_reader :secret
10
+ attr_reader :enabled
11
+
12
+ def initialize(
13
+ key:,
14
+ name:,
15
+ app_id:,
16
+ secret:,
17
+ enabled:
18
+ )
19
+ @key = key
20
+ @name = name
21
+ @app_id = app_id
22
+ @secret = secret
23
+ @enabled = enabled
24
+ end
25
+
26
+ def self.from(map:)
27
+ AuthProvider.new(
28
+ key: map["key"],
29
+ name: map["name"],
30
+ app_id: map["appId"],
31
+ secret: map["secret"],
32
+ enabled: map["enabled"]
33
+ )
34
+ end
35
+
36
+ def to_map
37
+ {
38
+ "key": @key,
39
+ "name": @name,
40
+ "appId": @app_id,
41
+ "secret": @secret,
42
+ "enabled": @enabled
43
+ }
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,62 @@
1
+ #frozen_string_literal: true
2
+
3
+ module Appwrite
4
+ module Models
5
+ class BillingLimits
6
+ attr_reader :bandwidth
7
+ attr_reader :storage
8
+ attr_reader :users
9
+ attr_reader :executions
10
+ attr_reader :gb_hours
11
+ attr_reader :image_transformations
12
+ attr_reader :auth_phone
13
+ attr_reader :budget_limit
14
+
15
+ def initialize(
16
+ bandwidth:,
17
+ storage:,
18
+ users:,
19
+ executions:,
20
+ gb_hours:,
21
+ image_transformations:,
22
+ auth_phone:,
23
+ budget_limit:
24
+ )
25
+ @bandwidth = bandwidth
26
+ @storage = storage
27
+ @users = users
28
+ @executions = executions
29
+ @gb_hours = gb_hours
30
+ @image_transformations = image_transformations
31
+ @auth_phone = auth_phone
32
+ @budget_limit = budget_limit
33
+ end
34
+
35
+ def self.from(map:)
36
+ BillingLimits.new(
37
+ bandwidth: map["bandwidth"],
38
+ storage: map["storage"],
39
+ users: map["users"],
40
+ executions: map["executions"],
41
+ gb_hours: map["GBHours"],
42
+ image_transformations: map["imageTransformations"],
43
+ auth_phone: map["authPhone"],
44
+ budget_limit: map["budgetLimit"]
45
+ )
46
+ end
47
+
48
+ def to_map
49
+ {
50
+ "bandwidth": @bandwidth,
51
+ "storage": @storage,
52
+ "users": @users,
53
+ "executions": @executions,
54
+ "GBHours": @gb_hours,
55
+ "imageTransformations": @image_transformations,
56
+ "authPhone": @auth_phone,
57
+ "budgetLimit": @budget_limit
58
+ }
59
+ end
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,47 @@
1
+ #frozen_string_literal: true
2
+
3
+ module Appwrite
4
+ module Models
5
+ class Block
6
+ attr_reader :created_at
7
+ attr_reader :resource_type
8
+ attr_reader :resource_id
9
+ attr_reader :reason
10
+ attr_reader :expired_at
11
+
12
+ def initialize(
13
+ created_at:,
14
+ resource_type:,
15
+ resource_id:,
16
+ reason: ,
17
+ expired_at:
18
+ )
19
+ @created_at = created_at
20
+ @resource_type = resource_type
21
+ @resource_id = resource_id
22
+ @reason = reason
23
+ @expired_at = expired_at
24
+ end
25
+
26
+ def self.from(map:)
27
+ Block.new(
28
+ created_at: map["$createdAt"],
29
+ resource_type: map["resourceType"],
30
+ resource_id: map["resourceId"],
31
+ reason: map["reason"],
32
+ expired_at: map["expiredAt"]
33
+ )
34
+ end
35
+
36
+ def to_map
37
+ {
38
+ "$createdAt": @created_at,
39
+ "resourceType": @resource_type,
40
+ "resourceId": @resource_id,
41
+ "reason": @reason,
42
+ "expiredAt": @expired_at
43
+ }
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,62 @@
1
+ #frozen_string_literal: true
2
+
3
+ module Appwrite
4
+ module Models
5
+ class DevKey
6
+ attr_reader :id
7
+ attr_reader :created_at
8
+ attr_reader :updated_at
9
+ attr_reader :name
10
+ attr_reader :expire
11
+ attr_reader :secret
12
+ attr_reader :accessed_at
13
+ attr_reader :sdks
14
+
15
+ def initialize(
16
+ id:,
17
+ created_at:,
18
+ updated_at:,
19
+ name:,
20
+ expire:,
21
+ secret:,
22
+ accessed_at:,
23
+ sdks:
24
+ )
25
+ @id = id
26
+ @created_at = created_at
27
+ @updated_at = updated_at
28
+ @name = name
29
+ @expire = expire
30
+ @secret = secret
31
+ @accessed_at = accessed_at
32
+ @sdks = sdks
33
+ end
34
+
35
+ def self.from(map:)
36
+ DevKey.new(
37
+ id: map["$id"],
38
+ created_at: map["$createdAt"],
39
+ updated_at: map["$updatedAt"],
40
+ name: map["name"],
41
+ expire: map["expire"],
42
+ secret: map["secret"],
43
+ accessed_at: map["accessedAt"],
44
+ sdks: map["sdks"]
45
+ )
46
+ end
47
+
48
+ def to_map
49
+ {
50
+ "$id": @id,
51
+ "$createdAt": @created_at,
52
+ "$updatedAt": @updated_at,
53
+ "name": @name,
54
+ "expire": @expire,
55
+ "secret": @secret,
56
+ "accessedAt": @accessed_at,
57
+ "sdks": @sdks
58
+ }
59
+ end
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,67 @@
1
+ #frozen_string_literal: true
2
+
3
+ module Appwrite
4
+ module Models
5
+ class Key
6
+ attr_reader :id
7
+ attr_reader :created_at
8
+ attr_reader :updated_at
9
+ attr_reader :name
10
+ attr_reader :expire
11
+ attr_reader :scopes
12
+ attr_reader :secret
13
+ attr_reader :accessed_at
14
+ attr_reader :sdks
15
+
16
+ def initialize(
17
+ id:,
18
+ created_at:,
19
+ updated_at:,
20
+ name:,
21
+ expire:,
22
+ scopes:,
23
+ secret:,
24
+ accessed_at:,
25
+ sdks:
26
+ )
27
+ @id = id
28
+ @created_at = created_at
29
+ @updated_at = updated_at
30
+ @name = name
31
+ @expire = expire
32
+ @scopes = scopes
33
+ @secret = secret
34
+ @accessed_at = accessed_at
35
+ @sdks = sdks
36
+ end
37
+
38
+ def self.from(map:)
39
+ Key.new(
40
+ id: map["$id"],
41
+ created_at: map["$createdAt"],
42
+ updated_at: map["$updatedAt"],
43
+ name: map["name"],
44
+ expire: map["expire"],
45
+ scopes: map["scopes"],
46
+ secret: map["secret"],
47
+ accessed_at: map["accessedAt"],
48
+ sdks: map["sdks"]
49
+ )
50
+ end
51
+
52
+ def to_map
53
+ {
54
+ "$id": @id,
55
+ "$createdAt": @created_at,
56
+ "$updatedAt": @updated_at,
57
+ "name": @name,
58
+ "expire": @expire,
59
+ "scopes": @scopes,
60
+ "secret": @secret,
61
+ "accessedAt": @accessed_at,
62
+ "sdks": @sdks
63
+ }
64
+ end
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,32 @@
1
+ #frozen_string_literal: true
2
+
3
+ module Appwrite
4
+ module Models
5
+ class KeyList
6
+ attr_reader :total
7
+ attr_reader :keys
8
+
9
+ def initialize(
10
+ total:,
11
+ keys:
12
+ )
13
+ @total = total
14
+ @keys = keys
15
+ end
16
+
17
+ def self.from(map:)
18
+ KeyList.new(
19
+ total: map["total"],
20
+ keys: map["keys"].map { |it| Key.from(map: it) }
21
+ )
22
+ end
23
+
24
+ def to_map
25
+ {
26
+ "total": @total,
27
+ "keys": @keys.map { |it| it.to_map }
28
+ }
29
+ end
30
+ end
31
+ end
32
+ end
@@ -8,6 +8,7 @@ module Appwrite
8
8
  attr_reader :user_email
9
9
  attr_reader :user_name
10
10
  attr_reader :mode
11
+ attr_reader :user_type
11
12
  attr_reader :ip
12
13
  attr_reader :time
13
14
  attr_reader :os_code
@@ -31,6 +32,7 @@ module Appwrite
31
32
  user_email:,
32
33
  user_name:,
33
34
  mode:,
35
+ user_type:,
34
36
  ip:,
35
37
  time:,
36
38
  os_code:,
@@ -53,6 +55,7 @@ module Appwrite
53
55
  @user_email = user_email
54
56
  @user_name = user_name
55
57
  @mode = mode
58
+ @user_type = user_type
56
59
  @ip = ip
57
60
  @time = time
58
61
  @os_code = os_code
@@ -78,6 +81,7 @@ module Appwrite
78
81
  user_email: map["userEmail"],
79
82
  user_name: map["userName"],
80
83
  mode: map["mode"],
84
+ user_type: map["userType"],
81
85
  ip: map["ip"],
82
86
  time: map["time"],
83
87
  os_code: map["osCode"],
@@ -104,6 +108,7 @@ module Appwrite
104
108
  "userEmail": @user_email,
105
109
  "userName": @user_name,
106
110
  "mode": @mode,
111
+ "userType": @user_type,
107
112
  "ip": @ip,
108
113
  "time": @time,
109
114
  "osCode": @os_code,
@@ -0,0 +1,32 @@
1
+ #frozen_string_literal: true
2
+
3
+ module Appwrite
4
+ module Models
5
+ class MockNumber
6
+ attr_reader :phone
7
+ attr_reader :otp
8
+
9
+ def initialize(
10
+ phone:,
11
+ otp:
12
+ )
13
+ @phone = phone
14
+ @otp = otp
15
+ end
16
+
17
+ def self.from(map:)
18
+ MockNumber.new(
19
+ phone: map["phone"],
20
+ otp: map["otp"]
21
+ )
22
+ end
23
+
24
+ def to_map
25
+ {
26
+ "phone": @phone,
27
+ "otp": @otp
28
+ }
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,71 @@
1
+ #frozen_string_literal: true
2
+
3
+ module Appwrite
4
+ module Models
5
+ class PlatformAndroid
6
+ attr_reader :id
7
+ attr_reader :created_at
8
+ attr_reader :updated_at
9
+ attr_reader :name
10
+ attr_reader :type
11
+ attr_reader :application_id
12
+
13
+ def initialize(
14
+ id:,
15
+ created_at:,
16
+ updated_at:,
17
+ name:,
18
+ type:,
19
+ application_id:
20
+ )
21
+ @id = id
22
+ @created_at = created_at
23
+ @updated_at = updated_at
24
+ @name = name
25
+ @type = validate_type(type)
26
+ @application_id = application_id
27
+ end
28
+
29
+ def self.from(map:)
30
+ PlatformAndroid.new(
31
+ id: map["$id"],
32
+ created_at: map["$createdAt"],
33
+ updated_at: map["$updatedAt"],
34
+ name: map["name"],
35
+ type: map["type"],
36
+ application_id: map["applicationId"]
37
+ )
38
+ end
39
+
40
+ def to_map
41
+ {
42
+ "$id": @id,
43
+ "$createdAt": @created_at,
44
+ "$updatedAt": @updated_at,
45
+ "name": @name,
46
+ "type": @type,
47
+ "applicationId": @application_id
48
+ }
49
+ end
50
+
51
+ private
52
+
53
+ def validate_type(type)
54
+ valid_type = [
55
+ Appwrite::Enums::PlatformType::WINDOWS,
56
+ Appwrite::Enums::PlatformType::APPLE,
57
+ Appwrite::Enums::PlatformType::ANDROID,
58
+ Appwrite::Enums::PlatformType::LINUX,
59
+ Appwrite::Enums::PlatformType::WEB,
60
+ ]
61
+
62
+ unless valid_type.include?(type)
63
+ raise ArgumentError, "Invalid " + type + ". Must be one of: " + valid_type.join(', ')
64
+ end
65
+
66
+ type
67
+ end
68
+
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,71 @@
1
+ #frozen_string_literal: true
2
+
3
+ module Appwrite
4
+ module Models
5
+ class PlatformApple
6
+ attr_reader :id
7
+ attr_reader :created_at
8
+ attr_reader :updated_at
9
+ attr_reader :name
10
+ attr_reader :type
11
+ attr_reader :bundle_identifier
12
+
13
+ def initialize(
14
+ id:,
15
+ created_at:,
16
+ updated_at:,
17
+ name:,
18
+ type:,
19
+ bundle_identifier:
20
+ )
21
+ @id = id
22
+ @created_at = created_at
23
+ @updated_at = updated_at
24
+ @name = name
25
+ @type = validate_type(type)
26
+ @bundle_identifier = bundle_identifier
27
+ end
28
+
29
+ def self.from(map:)
30
+ PlatformApple.new(
31
+ id: map["$id"],
32
+ created_at: map["$createdAt"],
33
+ updated_at: map["$updatedAt"],
34
+ name: map["name"],
35
+ type: map["type"],
36
+ bundle_identifier: map["bundleIdentifier"]
37
+ )
38
+ end
39
+
40
+ def to_map
41
+ {
42
+ "$id": @id,
43
+ "$createdAt": @created_at,
44
+ "$updatedAt": @updated_at,
45
+ "name": @name,
46
+ "type": @type,
47
+ "bundleIdentifier": @bundle_identifier
48
+ }
49
+ end
50
+
51
+ private
52
+
53
+ def validate_type(type)
54
+ valid_type = [
55
+ Appwrite::Enums::PlatformType::WINDOWS,
56
+ Appwrite::Enums::PlatformType::APPLE,
57
+ Appwrite::Enums::PlatformType::ANDROID,
58
+ Appwrite::Enums::PlatformType::LINUX,
59
+ Appwrite::Enums::PlatformType::WEB,
60
+ ]
61
+
62
+ unless valid_type.include?(type)
63
+ raise ArgumentError, "Invalid " + type + ". Must be one of: " + valid_type.join(', ')
64
+ end
65
+
66
+ type
67
+ end
68
+
69
+ end
70
+ end
71
+ end