datadog-ci 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (103) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +30 -0
  3. data/LICENSE +6 -0
  4. data/LICENSE-3rdparty.csv +2 -0
  5. data/LICENSE.Apache +200 -0
  6. data/LICENSE.BSD3 +24 -0
  7. data/NOTICE +4 -0
  8. data/README.md +125 -0
  9. data/lib/datadog/ci/configuration/components.rb +32 -0
  10. data/lib/datadog/ci/configuration/settings.rb +51 -0
  11. data/lib/datadog/ci/contrib/cucumber/configuration/settings.rb +36 -0
  12. data/lib/datadog/ci/contrib/cucumber/ext.rb +22 -0
  13. data/lib/datadog/ci/contrib/cucumber/formatter.rb +94 -0
  14. data/lib/datadog/ci/contrib/cucumber/instrumentation.rb +28 -0
  15. data/lib/datadog/ci/contrib/cucumber/integration.rb +47 -0
  16. data/lib/datadog/ci/contrib/cucumber/patcher.rb +27 -0
  17. data/lib/datadog/ci/contrib/minitest/configuration/settings.rb +36 -0
  18. data/lib/datadog/ci/contrib/minitest/ext.rb +21 -0
  19. data/lib/datadog/ci/contrib/minitest/hooks.rb +66 -0
  20. data/lib/datadog/ci/contrib/minitest/integration.rb +46 -0
  21. data/lib/datadog/ci/contrib/minitest/patcher.rb +26 -0
  22. data/lib/datadog/ci/contrib/rspec/configuration/settings.rb +36 -0
  23. data/lib/datadog/ci/contrib/rspec/example.rb +70 -0
  24. data/lib/datadog/ci/contrib/rspec/ext.rb +21 -0
  25. data/lib/datadog/ci/contrib/rspec/integration.rb +50 -0
  26. data/lib/datadog/ci/contrib/rspec/patcher.rb +27 -0
  27. data/lib/datadog/ci/ext/app_types.rb +11 -0
  28. data/lib/datadog/ci/ext/environment/extractor.rb +101 -0
  29. data/lib/datadog/ci/ext/environment/providers/appveyor.rb +98 -0
  30. data/lib/datadog/ci/ext/environment/providers/azure.rb +109 -0
  31. data/lib/datadog/ci/ext/environment/providers/base.rb +115 -0
  32. data/lib/datadog/ci/ext/environment/providers/bitbucket.rb +69 -0
  33. data/lib/datadog/ci/ext/environment/providers/bitrise.rb +77 -0
  34. data/lib/datadog/ci/ext/environment/providers/buddy.rb +69 -0
  35. data/lib/datadog/ci/ext/environment/providers/buildkite.rb +95 -0
  36. data/lib/datadog/ci/ext/environment/providers/circleci.rb +82 -0
  37. data/lib/datadog/ci/ext/environment/providers/codefresh.rb +49 -0
  38. data/lib/datadog/ci/ext/environment/providers/github_actions.rb +76 -0
  39. data/lib/datadog/ci/ext/environment/providers/gitlab.rb +119 -0
  40. data/lib/datadog/ci/ext/environment/providers/jenkins.rb +74 -0
  41. data/lib/datadog/ci/ext/environment/providers/local_git.rb +170 -0
  42. data/lib/datadog/ci/ext/environment/providers/teamcity.rb +29 -0
  43. data/lib/datadog/ci/ext/environment/providers/travis.rb +65 -0
  44. data/lib/datadog/ci/ext/environment/providers/user_defined_tags.rb +62 -0
  45. data/lib/datadog/ci/ext/environment/providers.rb +52 -0
  46. data/lib/datadog/ci/ext/environment.rb +82 -0
  47. data/lib/datadog/ci/ext/git.rb +37 -0
  48. data/lib/datadog/ci/ext/settings.rb +12 -0
  49. data/lib/datadog/ci/ext/test.rb +37 -0
  50. data/lib/datadog/ci/extensions.rb +19 -0
  51. data/lib/datadog/ci/flush.rb +38 -0
  52. data/lib/datadog/ci/test.rb +82 -0
  53. data/lib/datadog/ci/utils/git.rb +22 -0
  54. data/lib/datadog/ci/version.rb +28 -0
  55. data/lib/datadog/ci.rb +24 -0
  56. data/sig/datadog/ci/configuration/components.rbs +11 -0
  57. data/sig/datadog/ci/configuration/settings.rbs +14 -0
  58. data/sig/datadog/ci/contrib/cucumber/configuration/settings.rbs +12 -0
  59. data/sig/datadog/ci/contrib/cucumber/ext.rbs +25 -0
  60. data/sig/datadog/ci/contrib/cucumber/formatter.rbs +35 -0
  61. data/sig/datadog/ci/contrib/cucumber/instrumentation.rbs +16 -0
  62. data/sig/datadog/ci/contrib/cucumber/integration.rbs +25 -0
  63. data/sig/datadog/ci/contrib/cucumber/patcher.rbs +15 -0
  64. data/sig/datadog/ci/contrib/minitest/configuration/settings.rbs +12 -0
  65. data/sig/datadog/ci/contrib/minitest/ext.rbs +23 -0
  66. data/sig/datadog/ci/contrib/minitest/hooks.rbs +19 -0
  67. data/sig/datadog/ci/contrib/minitest/integration.rbs +25 -0
  68. data/sig/datadog/ci/contrib/minitest/patcher.rbs +15 -0
  69. data/sig/datadog/ci/contrib/rspec/configuration/settings.rbs +12 -0
  70. data/sig/datadog/ci/contrib/rspec/example.rbs +20 -0
  71. data/sig/datadog/ci/contrib/rspec/ext.rbs +23 -0
  72. data/sig/datadog/ci/contrib/rspec/integration.rbs +25 -0
  73. data/sig/datadog/ci/contrib/rspec/patcher.rbs +15 -0
  74. data/sig/datadog/ci/ext/app_types.rbs +9 -0
  75. data/sig/datadog/ci/ext/environment/extractor.rbs +27 -0
  76. data/sig/datadog/ci/ext/environment/providers/appveyor.rbs +48 -0
  77. data/sig/datadog/ci/ext/environment/providers/azure.rbs +56 -0
  78. data/sig/datadog/ci/ext/environment/providers/base.rbs +69 -0
  79. data/sig/datadog/ci/ext/environment/providers/bitbucket.rbs +37 -0
  80. data/sig/datadog/ci/ext/environment/providers/bitrise.rbs +41 -0
  81. data/sig/datadog/ci/ext/environment/providers/buddy.rbs +37 -0
  82. data/sig/datadog/ci/ext/environment/providers/buildkite.rbs +45 -0
  83. data/sig/datadog/ci/ext/environment/providers/circleci.rbs +41 -0
  84. data/sig/datadog/ci/ext/environment/providers/codefresh.rbs +25 -0
  85. data/sig/datadog/ci/ext/environment/providers/github_actions.rbs +37 -0
  86. data/sig/datadog/ci/ext/environment/providers/gitlab.rbs +57 -0
  87. data/sig/datadog/ci/ext/environment/providers/jenkins.rbs +35 -0
  88. data/sig/datadog/ci/ext/environment/providers/local_git.rbs +66 -0
  89. data/sig/datadog/ci/ext/environment/providers/teamcity.rbs +17 -0
  90. data/sig/datadog/ci/ext/environment/providers/travis.rbs +35 -0
  91. data/sig/datadog/ci/ext/environment/providers/user_defined_tags.rbs +33 -0
  92. data/sig/datadog/ci/ext/environment/providers.rbs +13 -0
  93. data/sig/datadog/ci/ext/environment.rbs +44 -0
  94. data/sig/datadog/ci/ext/git.rbs +53 -0
  95. data/sig/datadog/ci/ext/settings.rbs +9 -0
  96. data/sig/datadog/ci/ext/test.rbs +43 -0
  97. data/sig/datadog/ci/extensions.rbs +7 -0
  98. data/sig/datadog/ci/flush.rbs +15 -0
  99. data/sig/datadog/ci/test.rbs +18 -0
  100. data/sig/datadog/ci/utils/git.rbs +11 -0
  101. data/sig/datadog/ci/version.rbs +16 -0
  102. data/sig/datadog/ci.rbs +7 -0
  103. metadata +154 -0
@@ -0,0 +1,20 @@
1
+ module Datadog
2
+ module CI
3
+ module Contrib
4
+ module RSpec
5
+ module Example
6
+ def self.included: (untyped base) -> untyped
7
+ module InstanceMethods
8
+ include ::RSpec::Core::Example
9
+
10
+ def run: (untyped example_group_instance, untyped reporter) -> untyped
11
+
12
+ private
13
+
14
+ def configuration: () -> untyped
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,23 @@
1
+ module Datadog
2
+ module CI
3
+ module Contrib
4
+ module RSpec
5
+ module Ext
6
+ APP: String
7
+
8
+ ENV_ENABLED: String
9
+
10
+ ENV_OPERATION_NAME: String
11
+
12
+ FRAMEWORK: String
13
+
14
+ OPERATION_NAME: String
15
+
16
+ SERVICE_NAME: String
17
+
18
+ TEST_TYPE: String
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,25 @@
1
+ module Datadog
2
+ module CI
3
+ module Contrib
4
+ module RSpec
5
+ class Integration
6
+ extend Datadog::Tracing::Contrib::Integration
7
+
8
+ MINIMUM_VERSION: untyped
9
+
10
+ def self.version: () -> untyped
11
+
12
+ def self.loaded?: () -> untyped
13
+
14
+ def compatible?: () -> bool
15
+
16
+ def auto_instrument?: () -> false
17
+
18
+ def new_configuration: () -> untyped
19
+
20
+ def patcher: () -> untyped
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,15 @@
1
+ module Datadog
2
+ module CI
3
+ module Contrib
4
+ module RSpec
5
+ module Patcher
6
+ include Datadog::Tracing::Contrib::Patcher
7
+
8
+ def self?.target_version: () -> untyped
9
+
10
+ def self?.patch: () -> untyped
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,9 @@
1
+ module Datadog
2
+ module CI
3
+ module Ext
4
+ module AppTypes
5
+ TYPE_TEST: String
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,27 @@
1
+ module Datadog
2
+ module CI
3
+ module Ext
4
+ module Environment
5
+ class Extractor
6
+ @env: Hash[String, String?]
7
+ @provider: Providers::Base
8
+ @tags: Hash[String, untyped]
9
+
10
+ def initialize: (Hash[String, String?] env, ?provider_klass: singleton(Providers::Base)?) -> void
11
+
12
+ def tags: () -> Hash[String, untyped]
13
+
14
+ private
15
+
16
+ attr_reader env: untyped
17
+
18
+ def normalize_git!: () -> void
19
+
20
+ def expand_workspace!: () -> void
21
+
22
+ def filter_sensitive_info: (String? url) -> String?
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,48 @@
1
+ module Datadog
2
+ module CI
3
+ module Ext
4
+ module Environment
5
+ module Providers
6
+ class Appveyor < Base
7
+ @github_repo_provider: bool
8
+ @url: String
9
+
10
+ def provider_name: () -> "appveyor"
11
+
12
+ def pipeline_url: () -> String?
13
+
14
+ def job_url: () -> String?
15
+
16
+ def workspace_path: () -> String?
17
+
18
+ def pipeline_id: () -> String?
19
+
20
+ def pipeline_name: () -> String?
21
+
22
+ def pipeline_number: () -> String?
23
+
24
+ def git_repository_url: () -> String?
25
+
26
+ def git_commit_sha: () -> String?
27
+
28
+ def git_branch: () -> String?
29
+
30
+ def git_tag: () -> String?
31
+
32
+ def git_commit_author_name: () -> String?
33
+
34
+ def git_commit_author_email: () -> String?
35
+
36
+ def git_commit_message: () -> String?
37
+
38
+ def github_repo_provider?: () -> bool
39
+
40
+ private
41
+
42
+ def url: () -> String?
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,56 @@
1
+ module Datadog
2
+ module CI
3
+ module Ext
4
+ module Environment
5
+ module Providers
6
+ class Azure < Base
7
+ @pipeline_url: String
8
+ @job_url: String
9
+
10
+ def provider_name: () -> "azurepipelines"
11
+
12
+ def pipeline_url: () -> String?
13
+
14
+ def job_url: () -> String?
15
+
16
+ def workspace_path: () -> String?
17
+
18
+ def pipeline_id: () -> String?
19
+
20
+ def pipeline_number: () -> String?
21
+
22
+ def pipeline_name: () -> String?
23
+
24
+ def stage_name: () -> String?
25
+
26
+ def job_name: () -> String?
27
+
28
+ def git_repository_url: () -> String?
29
+
30
+ def git_commit_sha: () -> String?
31
+
32
+ def git_branch_or_tag: () -> String?
33
+
34
+ def git_commit_author_name: () -> String?
35
+
36
+ def git_commit_author_email: () -> String?
37
+
38
+ def git_commit_message: () -> String?
39
+
40
+ def ci_env_vars: () -> String?
41
+
42
+ private
43
+
44
+ def build_id: () -> String?
45
+
46
+ def team_foundation_server_uri: () -> String?
47
+
48
+ def team_project_id: () -> String?
49
+
50
+ def url_defined?: () -> bool
51
+ end
52
+ end
53
+ end
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,69 @@
1
+ module Datadog
2
+ module CI
3
+ module Ext
4
+ module Environment
5
+ module Providers
6
+ class Base
7
+ attr_reader env: Hash[String, String?]
8
+ @branch: String?
9
+ @tag: String?
10
+
11
+ def initialize: (Hash[String, String?] env) -> void
12
+
13
+ def job_name: () -> nil
14
+
15
+ def job_url: () -> nil
16
+
17
+ def pipeline_id: () -> nil
18
+
19
+ def pipeline_name: () -> nil
20
+
21
+ def pipeline_number: () -> nil
22
+
23
+ def pipeline_url: () -> nil
24
+
25
+ def provider_name: () -> nil
26
+
27
+ def stage_name: () -> nil
28
+
29
+ def workspace_path: () -> nil
30
+
31
+ def node_labels: () -> nil
32
+
33
+ def node_name: () -> nil
34
+
35
+ def ci_env_vars: () -> nil
36
+
37
+ def git_branch: () -> String?
38
+
39
+ def git_repository_url: () -> nil
40
+
41
+ def git_tag: () -> String?
42
+
43
+ def git_branch_or_tag: () -> nil
44
+
45
+ def git_commit_author_date: () -> nil
46
+
47
+ def git_commit_author_email: () -> nil
48
+
49
+ def git_commit_author_name: () -> nil
50
+
51
+ def git_commit_committer_date: () -> nil
52
+
53
+ def git_commit_committer_email: () -> nil
54
+
55
+ def git_commit_committer_name: () -> nil
56
+
57
+ def git_commit_message: () -> nil
58
+
59
+ def git_commit_sha: () -> nil
60
+
61
+ private
62
+
63
+ def set_branch_and_tag: () -> [String?, String?]
64
+ end
65
+ end
66
+ end
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,37 @@
1
+ module Datadog
2
+ module CI
3
+ module Ext
4
+ module Environment
5
+ module Providers
6
+ class Bitbucket < Base
7
+ def provider_name: () -> "bitbucket"
8
+
9
+ def pipeline_id: () -> String?
10
+
11
+ def pipeline_name: () -> String?
12
+
13
+ def pipeline_number: () -> String?
14
+
15
+ def pipeline_url: () -> String?
16
+
17
+ def job_url: () -> String?
18
+
19
+ def workspace_path: () -> String?
20
+
21
+ def git_repository_url: () -> String?
22
+
23
+ def git_commit_sha: () -> String?
24
+
25
+ def git_branch: () -> String?
26
+
27
+ def git_tag: () -> String?
28
+
29
+ private
30
+
31
+ def url: () -> ::String?
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,41 @@
1
+ module Datadog
2
+ module CI
3
+ module Ext
4
+ module Environment
5
+ module Providers
6
+ class Bitrise < Base
7
+ def provider_name: () -> "bitrise"
8
+
9
+ def pipeline_id: () -> String?
10
+
11
+ def pipeline_name: () -> String?
12
+
13
+ def pipeline_number: () -> String?
14
+
15
+ def pipeline_url: () -> String?
16
+
17
+ def workspace_path: () -> String?
18
+
19
+ def git_repository_url: () -> String?
20
+
21
+ def git_commit_sha: () -> String?
22
+
23
+ def git_branch: () -> String?
24
+
25
+ def git_tag: () -> String?
26
+
27
+ def git_commit_message: () -> String?
28
+
29
+ def git_commit_author_name: () -> String?
30
+
31
+ def git_commit_author_email: () -> String?
32
+
33
+ def git_commit_committer_name: () -> String?
34
+
35
+ def git_commit_committer_email: () -> String?
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,37 @@
1
+ module Datadog
2
+ module CI
3
+ module Ext
4
+ module Environment
5
+ module Providers
6
+ class Buddy < Extractor
7
+ def provider_name: () -> "buddy"
8
+
9
+ def pipeline_id: () -> ::String
10
+
11
+ def pipeline_name: () -> String?
12
+
13
+ def pipeline_number: () -> String?
14
+
15
+ def pipeline_url: () -> String?
16
+
17
+ def workspace_path: () -> String?
18
+
19
+ def git_repository_url: () -> String?
20
+
21
+ def git_commit_sha: () -> String?
22
+
23
+ def git_branch: () -> String?
24
+
25
+ def git_tag: () -> String?
26
+
27
+ def git_commit_message: () -> String?
28
+
29
+ def git_commit_committer_name: () -> String?
30
+
31
+ def git_commit_committer_email: () -> String?
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,45 @@
1
+ module Datadog
2
+ module CI
3
+ module Ext
4
+ module Environment
5
+ module Providers
6
+ class Buildkite < Extractor
7
+ def provider_name: () -> "buildkite"
8
+
9
+ def job_url: () -> ::String
10
+
11
+ def pipeline_id: () -> String?
12
+
13
+ def pipeline_name: () -> String?
14
+
15
+ def pipeline_number: () -> String?
16
+
17
+ def pipeline_url: () -> String?
18
+
19
+ def node_name: () -> String?
20
+
21
+ def node_labels: () -> String?
22
+
23
+ def workspace_path: () -> String?
24
+
25
+ def git_repository_url: () -> String?
26
+
27
+ def git_commit_sha: () -> String?
28
+
29
+ def git_branch: () -> String?
30
+
31
+ def git_tag: () -> String?
32
+
33
+ def git_commit_author_name: () -> String?
34
+
35
+ def git_commit_author_email: () -> String?
36
+
37
+ def git_commit_message: () -> String?
38
+
39
+ def ci_env_vars: () -> String?
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,41 @@
1
+ module Datadog
2
+ module CI
3
+ module Ext
4
+ module Environment
5
+ module Providers
6
+ class Circleci < Extractor
7
+ def provider_name: () -> "circleci"
8
+
9
+ def job_url: () -> String?
10
+
11
+ def job_name: () -> String?
12
+
13
+ def pipeline_id: () -> String?
14
+
15
+ def pipeline_name: () -> String?
16
+
17
+ def pipeline_url: () -> ::String
18
+
19
+ def workspace_path: () -> String?
20
+
21
+ def git_repository_url: () -> String?
22
+
23
+ def git_commit_sha: () -> String?
24
+
25
+ def git_branch: () -> String?
26
+
27
+ def git_tag: () -> String?
28
+
29
+ def git_commit_author_name: () -> String?
30
+
31
+ def git_commit_author_email: () -> String?
32
+
33
+ def git_commit_message: () -> String?
34
+
35
+ def ci_env_vars: () -> ::String
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,25 @@
1
+ module Datadog
2
+ module CI
3
+ module Ext
4
+ module Environment
5
+ module Providers
6
+ class Codefresh < Extractor
7
+ def provider_name: () -> "codefresh"
8
+
9
+ def job_name: () -> String?
10
+
11
+ def pipeline_id: () -> String?
12
+
13
+ def pipeline_name: () -> String?
14
+
15
+ def pipeline_url: () -> String?
16
+
17
+ def git_branch_or_tag: () -> String?
18
+
19
+ def ci_env_vars: () -> String
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,37 @@
1
+ module Datadog
2
+ module CI
3
+ module Ext
4
+ module Environment
5
+ module Providers
6
+ class GithubActions < Extractor
7
+ @ref: String
8
+
9
+ def provider_name: () -> "github"
10
+
11
+ def job_name: () -> String?
12
+
13
+ def job_url: () -> ::String
14
+
15
+ def pipeline_id: () -> String?
16
+
17
+ def pipeline_name: () -> String?
18
+
19
+ def pipeline_number: () -> String?
20
+
21
+ def pipeline_url: () -> String?
22
+
23
+ def workspace_path: () -> String?
24
+
25
+ def git_repository_url: () -> ::String
26
+
27
+ def git_commit_sha: () -> String?
28
+
29
+ def git_branch_or_tag: () -> String?
30
+
31
+ def ci_env_vars: () -> String?
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,57 @@
1
+ module Datadog
2
+ module CI
3
+ module Ext
4
+ module Environment
5
+ module Providers
6
+ class Gitlab < Extractor
7
+ @name_email_tuple: [String?, String?]
8
+
9
+ def provider_name: () -> "gitlab"
10
+
11
+ def job_name: () -> String?
12
+
13
+ def job_url: () -> String?
14
+
15
+ def pipeline_id: () -> String?
16
+
17
+ def pipeline_name: () -> String?
18
+
19
+ def pipeline_number: () -> String?
20
+
21
+ def pipeline_url: () -> String?
22
+
23
+ def stage_name: () -> String?
24
+
25
+ def workspace_path: () -> String?
26
+
27
+ def node_name: () -> String?
28
+
29
+ def node_labels: () -> String?
30
+
31
+ def git_repository_url: () -> String?
32
+
33
+ def git_commit_sha: () -> String?
34
+
35
+ def git_branch: () -> String?
36
+
37
+ def git_tag: () -> String?
38
+
39
+ def git_commit_author_name: () -> String?
40
+
41
+ def git_commit_author_email: () -> String?
42
+
43
+ def git_commit_author_date: () -> String?
44
+
45
+ def git_commit_message: () -> String?
46
+
47
+ def ci_env_vars: () -> String?
48
+
49
+ private
50
+
51
+ def extract_name_email: () -> [String?, String?]
52
+ end
53
+ end
54
+ end
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,35 @@
1
+ module Datadog
2
+ module CI
3
+ module Ext
4
+ module Environment
5
+ module Providers
6
+ class Jenkins < Base
7
+ def provider_name: () -> "jenkins"
8
+
9
+ def pipeline_id: () -> String?
10
+
11
+ def pipeline_name: () -> String?
12
+
13
+ def pipeline_number: () -> String?
14
+
15
+ def pipeline_url: () -> String?
16
+
17
+ def workspace_path: () -> String?
18
+
19
+ def node_name: () -> String?
20
+
21
+ def node_labels: () -> String?
22
+
23
+ def git_repository_url: () -> String?
24
+
25
+ def git_commit_sha: () -> String?
26
+
27
+ def git_branch_or_tag: () -> String?
28
+
29
+ def ci_env_vars: () -> String?
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end