aws-sdk-code-generator 0.1.0.pre → 0.2.0.pre

Sign up to get free protection for your applications and to get access to all the features.
Files changed (131) hide show
  1. checksums.yaml +5 -5
  2. data/lib/aws-sdk-code-generator.rb +68 -75
  3. data/lib/aws-sdk-code-generator/api.rb +130 -0
  4. data/lib/aws-sdk-code-generator/apply_docs.rb +15 -2
  5. data/lib/aws-sdk-code-generator/client_constructor.rb +39 -0
  6. data/lib/aws-sdk-code-generator/client_operation_documentation.rb +268 -0
  7. data/lib/aws-sdk-code-generator/client_operation_list.rb +148 -0
  8. data/lib/aws-sdk-code-generator/client_response_structure_example.rb +108 -0
  9. data/lib/aws-sdk-code-generator/code_builder.rb +146 -133
  10. data/lib/aws-sdk-code-generator/crosslink.rb +42 -0
  11. data/lib/aws-sdk-code-generator/docstring.rb +199 -0
  12. data/lib/aws-sdk-code-generator/error_list.rb +77 -0
  13. data/lib/aws-sdk-code-generator/errors.rb +2 -0
  14. data/lib/aws-sdk-code-generator/eventstream_example.rb +220 -0
  15. data/lib/aws-sdk-code-generator/gem_builder.rb +19 -25
  16. data/lib/aws-sdk-code-generator/hash_formatter.rb +5 -2
  17. data/lib/aws-sdk-code-generator/helper.rb +77 -61
  18. data/lib/aws-sdk-code-generator/plugin_list.rb +146 -0
  19. data/lib/aws-sdk-code-generator/resource_action.rb +69 -0
  20. data/lib/aws-sdk-code-generator/resource_action_code.rb +57 -0
  21. data/lib/aws-sdk-code-generator/resource_association.rb +37 -0
  22. data/lib/aws-sdk-code-generator/resource_attribute.rb +76 -0
  23. data/lib/aws-sdk-code-generator/resource_batch_action.rb +56 -0
  24. data/lib/aws-sdk-code-generator/resource_batch_action_code.rb +136 -0
  25. data/lib/aws-sdk-code-generator/resource_batch_action_documentation.rb +108 -0
  26. data/lib/aws-sdk-code-generator/resource_batch_builder.rb +212 -0
  27. data/lib/aws-sdk-code-generator/resource_builder.rb +48 -0
  28. data/lib/aws-sdk-code-generator/resource_client_request.rb +62 -0
  29. data/lib/aws-sdk-code-generator/resource_client_request_documentation.rb +81 -0
  30. data/lib/aws-sdk-code-generator/resource_client_request_params.rb +86 -0
  31. data/lib/aws-sdk-code-generator/resource_data_method.rb +60 -0
  32. data/lib/aws-sdk-code-generator/resource_has_association.rb +117 -0
  33. data/lib/aws-sdk-code-generator/resource_has_many_association.rb +52 -0
  34. data/lib/aws-sdk-code-generator/resource_has_many_association_code.rb +76 -0
  35. data/lib/aws-sdk-code-generator/resource_identifier.rb +44 -0
  36. data/lib/aws-sdk-code-generator/resource_identifiers_method.rb +29 -0
  37. data/lib/aws-sdk-code-generator/resource_load_method.rb +68 -0
  38. data/lib/aws-sdk-code-generator/resource_method.rb +22 -0
  39. data/lib/aws-sdk-code-generator/resource_skip_params.rb +36 -0
  40. data/lib/aws-sdk-code-generator/resource_value_source.rb +68 -0
  41. data/lib/aws-sdk-code-generator/resource_waiter.rb +80 -0
  42. data/lib/aws-sdk-code-generator/service.rb +30 -7
  43. data/lib/aws-sdk-code-generator/shared_example.rb +131 -0
  44. data/lib/aws-sdk-code-generator/syntax_example.rb +60 -0
  45. data/lib/aws-sdk-code-generator/syntax_example_hash.rb +174 -0
  46. data/lib/aws-sdk-code-generator/underscore.rb +10 -5
  47. data/lib/aws-sdk-code-generator/view.rb +33 -0
  48. data/lib/aws-sdk-code-generator/views.rb +2 -0
  49. data/lib/aws-sdk-code-generator/views/apig_endpoint_class.rb +25 -0
  50. data/lib/aws-sdk-code-generator/views/apig_readme.rb +32 -0
  51. data/lib/aws-sdk-code-generator/views/async_client_class.rb +68 -0
  52. data/lib/aws-sdk-code-generator/views/authorizer_class.rb +17 -0
  53. data/lib/aws-sdk-code-generator/views/client_api_module.rb +583 -0
  54. data/lib/aws-sdk-code-generator/views/client_class.rb +93 -0
  55. data/lib/aws-sdk-code-generator/views/docstring.rb +27 -0
  56. data/lib/aws-sdk-code-generator/views/errors_module.rb +32 -0
  57. data/lib/aws-sdk-code-generator/views/event_streams_module.rb +149 -0
  58. data/lib/aws-sdk-code-generator/views/features/env.rb +9 -0
  59. data/lib/aws-sdk-code-generator/views/features/smoke.rb +51 -0
  60. data/lib/aws-sdk-code-generator/views/features/smoke_step_definitions.rb +26 -0
  61. data/lib/aws-sdk-code-generator/views/features/step_definitions.rb +2 -0
  62. data/lib/aws-sdk-code-generator/views/gemspec.rb +39 -5
  63. data/lib/aws-sdk-code-generator/views/resource_class.rb +122 -0
  64. data/lib/aws-sdk-code-generator/views/root_resource_class.rb +58 -0
  65. data/lib/aws-sdk-code-generator/views/service_module.rb +30 -14
  66. data/lib/aws-sdk-code-generator/views/spec/spec_helper.rb +9 -0
  67. data/lib/aws-sdk-code-generator/views/types_module.rb +294 -0
  68. data/lib/aws-sdk-code-generator/views/version.rb +2 -0
  69. data/lib/aws-sdk-code-generator/views/waiters_module.rb +37 -0
  70. data/lib/aws-sdk-code-generator/waiter.rb +95 -0
  71. data/lib/aws-sdk-code-generator/yard_option_tag.rb +43 -0
  72. metadata +61 -68
  73. data/lib/aws-sdk-code-generator/dsl/access_control_statement.rb +0 -23
  74. data/lib/aws-sdk-code-generator/dsl/attribute_accessor.rb +0 -43
  75. data/lib/aws-sdk-code-generator/dsl/attribute_reader.rb +0 -11
  76. data/lib/aws-sdk-code-generator/dsl/attribute_writer.rb +0 -11
  77. data/lib/aws-sdk-code-generator/dsl/autoload_statement.rb +0 -15
  78. data/lib/aws-sdk-code-generator/dsl/block_param.rb +0 -11
  79. data/lib/aws-sdk-code-generator/dsl/class.rb +0 -27
  80. data/lib/aws-sdk-code-generator/dsl/code_literal.rb +0 -66
  81. data/lib/aws-sdk-code-generator/dsl/code_object.rb +0 -33
  82. data/lib/aws-sdk-code-generator/dsl/docstring.rb +0 -36
  83. data/lib/aws-sdk-code-generator/dsl/eigenclass.rb +0 -15
  84. data/lib/aws-sdk-code-generator/dsl/extend_statement.rb +0 -12
  85. data/lib/aws-sdk-code-generator/dsl/formatter.rb +0 -25
  86. data/lib/aws-sdk-code-generator/dsl/include_statement.rb +0 -17
  87. data/lib/aws-sdk-code-generator/dsl/main.rb +0 -105
  88. data/lib/aws-sdk-code-generator/dsl/method.rb +0 -108
  89. data/lib/aws-sdk-code-generator/dsl/module.rb +0 -167
  90. data/lib/aws-sdk-code-generator/dsl/option_tag.rb +0 -36
  91. data/lib/aws-sdk-code-generator/dsl/param.rb +0 -43
  92. data/lib/aws-sdk-code-generator/dsl/param_list.rb +0 -38
  93. data/lib/aws-sdk-code-generator/dsl/return_tag.rb +0 -19
  94. data/lib/aws-sdk-code-generator/dsl/tag_default.rb +0 -20
  95. data/lib/aws-sdk-code-generator/dsl/tag_docstring.rb +0 -27
  96. data/lib/aws-sdk-code-generator/dsl/tag_type.rb +0 -18
  97. data/lib/aws-sdk-code-generator/generators/client_api_module.rb +0 -334
  98. data/lib/aws-sdk-code-generator/generators/client_class.rb +0 -389
  99. data/lib/aws-sdk-code-generator/generators/client_operation_documentation.rb +0 -166
  100. data/lib/aws-sdk-code-generator/generators/errors_module.rb +0 -25
  101. data/lib/aws-sdk-code-generator/generators/resource/action.rb +0 -88
  102. data/lib/aws-sdk-code-generator/generators/resource/batch_builder.rb +0 -211
  103. data/lib/aws-sdk-code-generator/generators/resource/builder.rb +0 -50
  104. data/lib/aws-sdk-code-generator/generators/resource/client_getter.rb +0 -15
  105. data/lib/aws-sdk-code-generator/generators/resource/client_request.rb +0 -49
  106. data/lib/aws-sdk-code-generator/generators/resource/client_request_docs.rb +0 -97
  107. data/lib/aws-sdk-code-generator/generators/resource/client_request_params.rb +0 -88
  108. data/lib/aws-sdk-code-generator/generators/resource/collection_class.rb +0 -180
  109. data/lib/aws-sdk-code-generator/generators/resource/data_attribute_getter.rb +0 -24
  110. data/lib/aws-sdk-code-generator/generators/resource/data_loaded_method.rb +0 -18
  111. data/lib/aws-sdk-code-generator/generators/resource/data_method.rb +0 -49
  112. data/lib/aws-sdk-code-generator/generators/resource/exists_method.rb +0 -29
  113. data/lib/aws-sdk-code-generator/generators/resource/extract_identifier_method.rb +0 -32
  114. data/lib/aws-sdk-code-generator/generators/resource/has_association.rb +0 -101
  115. data/lib/aws-sdk-code-generator/generators/resource/has_many_association.rb +0 -108
  116. data/lib/aws-sdk-code-generator/generators/resource/identifier_getter.rb +0 -26
  117. data/lib/aws-sdk-code-generator/generators/resource/identifiers_method.rb +0 -28
  118. data/lib/aws-sdk-code-generator/generators/resource/initialize_method.rb +0 -67
  119. data/lib/aws-sdk-code-generator/generators/resource/load_method.rb +0 -65
  120. data/lib/aws-sdk-code-generator/generators/resource/value_source.rb +0 -68
  121. data/lib/aws-sdk-code-generator/generators/resource/waiter_method.rb +0 -61
  122. data/lib/aws-sdk-code-generator/generators/resource_class.rb +0 -325
  123. data/lib/aws-sdk-code-generator/generators/response_structure_example.rb +0 -83
  124. data/lib/aws-sdk-code-generator/generators/root_resource_class.rb +0 -42
  125. data/lib/aws-sdk-code-generator/generators/service_documentation.rb +0 -64
  126. data/lib/aws-sdk-code-generator/generators/shared_example.rb +0 -132
  127. data/lib/aws-sdk-code-generator/generators/structure_type_class.rb +0 -95
  128. data/lib/aws-sdk-code-generator/generators/syntax_example.rb +0 -169
  129. data/lib/aws-sdk-code-generator/generators/types_module.rb +0 -52
  130. data/lib/aws-sdk-code-generator/generators/waiter_class.rb +0 -62
  131. data/lib/aws-sdk-code-generator/generators/waiters_module.rb +0 -20
@@ -1,108 +0,0 @@
1
- module AwsSdkCodeGenerator
2
- module Generators
3
- module Resource
4
-
5
- # TODO : build and return collection
6
- # TODO : filter @option tags related to pagination
7
- # TODO : don't filter @option tags that can be merged, e.g. EC2 Filters
8
- class HasManyAssociation < Dsl::Method
9
-
10
- # @option options [required, String] :name
11
- # @option options [required, Hash] :has_many
12
- # @option options [required, Hash] :api
13
- # @option options [required, Hash] :paginators
14
- # @option options [String] :var_name ('')
15
- def initialize(options = {})
16
-
17
- name = options.fetch(:name)
18
- @has_many = options.fetch(:has_many)
19
- @paginators = options.fetch(:paginators)
20
- @var_name = options.fetch(:var_name, '')
21
-
22
- super(underscore(name))
23
-
24
- param('options', type:Hash, default:{})
25
-
26
- ClientRequestDocs.new(
27
- request: @has_many['request'],
28
- api: options.fetch(:api),
29
- skip: paging_options,
30
- var_name: @var_name,
31
- returns: name.downcase,
32
- ).apply(self)
33
-
34
- paginated? ? paginated_reqeust : non_paginated_request
35
-
36
- returns(collection_class)
37
- end
38
-
39
- private
40
-
41
- def paginated_reqeust
42
- code do |c1|
43
- c1 << 'batches = Enumerator.new do |y|'
44
- c1.indent do |c2|
45
- c2 << client_request(true)
46
- c2 << "resp.each_page do |page|"
47
- c2.indent do |c3|
48
- c3 << 'batch = []'
49
- c3 << BatchBuilder.new(resource: @has_many['resource'], resp_var_name:'page')
50
- c3 << 'y.yield(batch)'
51
- end
52
- c2 << 'end'
53
- end
54
- c1 << 'end'
55
- c1 << "#{collection_class}.new(batches)"
56
- end
57
- end
58
-
59
- def non_paginated_request
60
- code do |code|
61
- code << 'batches = Enumerator.new do |y|'
62
- code.indent do |c|
63
- c << 'batch = []'
64
- c << client_request(true)
65
- c << BatchBuilder.new(resource: @has_many['resource'])
66
- c << 'y.yield(batch)'
67
- end
68
- code << 'end'
69
- code << "#{collection_class}.new(batches)"
70
- end
71
- end
72
-
73
- def client_request(resp)
74
- ClientRequest.new(
75
- request: @has_many['request'],
76
- resp: resp
77
- )
78
- end
79
-
80
- def collection_class
81
- "#{@has_many['resource']['type']}::Collection"
82
- end
83
-
84
- def paginated?
85
- @paginators &&
86
- @paginators['pagination'][operation_name] &&
87
- @paginators['pagination'][operation_name]['input_token']
88
- end
89
-
90
- def paging_options
91
- if paginated?
92
- skip = []
93
- skip << @paginators['pagination'][operation_name]['input_token']
94
- skip << @paginators['pagination'][operation_name]['limit_key']
95
- skip.compact
96
- else
97
- []
98
- end
99
- end
100
-
101
- def operation_name
102
- @has_many['request']['operation']
103
- end
104
-
105
- end
106
- end
107
- end
108
- end
@@ -1,26 +0,0 @@
1
- module AwsSdkCodeGenerator
2
- module Generators
3
- module Resource
4
- class IdentifierGetter < Dsl::Method
5
-
6
- include Helper
7
-
8
- # @option options [required, Hash] :identifier
9
- def initialize(options)
10
- identifier = options.fetch(:identifier)
11
- name = underscore(identifier.fetch('name'))
12
- super(name)
13
- returns(identifier_type(identifier))
14
- code("@#{name}")
15
- if
16
- identifier['memberName'] &&
17
- identifier['memberName'] != identifier['name']
18
- then
19
- alias_as(underscore(identifier['memberName']))
20
- end
21
- end
22
-
23
- end
24
- end
25
- end
26
- end
@@ -1,28 +0,0 @@
1
- module AwsSdkCodeGenerator
2
- module Generators
3
- module Resource
4
- class IdentifiersMethod < Dsl::Method
5
-
6
- # @option options [required, Array<Hash>] :identifiers
7
- def initialize(options = {})
8
- identifiers = options.fetch(:identifiers)
9
- super('identifiers')
10
- docstring('@deprecated')
11
- docstring('@api private')
12
- identifiers ||= []
13
- identifiers = (identifiers || []).inject({}) do |hash, identifier|
14
- name = underscore(identifier['name'])
15
- hash[name.to_sym] = "@#{name}"
16
- hash
17
- end
18
- code(HashFormatter.new(inline: true).format(identifiers))
19
- end
20
-
21
- def lines
22
- super + ["deprecated(:#{name})"]
23
- end
24
-
25
- end
26
- end
27
- end
28
- end
@@ -1,67 +0,0 @@
1
- module AwsSdkCodeGenerator
2
- module Generators
3
- module Resource
4
- class InitializeMethod < Dsl::Method
5
-
6
- include Helper
7
-
8
- # @option options [required, Hash] :resource]
9
- def initialize(options = {})
10
- resource = options.fetch(:resource)
11
- @identifiers = resource["identifiers"] || []
12
- @shape_name = resource["shape"]
13
- super('initialize')
14
- param('*args')
15
- positional_docstring unless @identifiers.empty?
16
- options_docstring
17
- code('options = Hash === args.last ? args.pop.dup : {}')
18
- extract_identifiers
19
- if @shape_name
20
- code('@data = options.delete(:data)')
21
- else
22
- code('@data = Aws::EmptyStructure.new')
23
- end
24
- code('@client = options.delete(:client) || Client.new(options)')
25
- end
26
-
27
- private
28
-
29
- def positional_docstring
30
- names = @identifiers.map { |i| underscore(i['name']) }.join(', ')
31
- docstring("@overload def initialize(#{names}, options = {})")
32
- identifiers.each do |name, type, n|
33
- docstring(" @param [#{type}] #{name}")
34
- end
35
- apply_client_option
36
- end
37
-
38
- def options_docstring
39
- docstring("@overload def initialize(options = {})")
40
- identifiers.each do |name, type, n|
41
- docstring(" @option options [required, #{type}] :#{name}")
42
- end
43
- apply_client_option
44
- end
45
-
46
- def apply_client_option
47
- docstring(" @option options [Client] :client")
48
- end
49
-
50
- def extract_identifiers
51
- identifiers.each do |name, type, n|
52
- code("@#{name} = extract_#{name}(args, options)")
53
- end
54
- end
55
-
56
- def identifiers
57
- Enumerator.new do |y|
58
- @identifiers.each.with_index do |i, n|
59
- y.yield(underscore(i['name']), identifier_type(i), n)
60
- end
61
- end
62
- end
63
-
64
- end
65
- end
66
- end
67
- end
@@ -1,65 +0,0 @@
1
- module AwsSdkCodeGenerator
2
- module Generators
3
- module Resource
4
- class LoadMethod < Dsl::Method
5
-
6
- LOAD_NOT_IMPLEMENTED =
7
- "#load is not implemented, data only available via enumeration"
8
-
9
- # @option options [required, String] :resource_name
10
- # @option options [required, Hash] :definition
11
- def initialize(options = {})
12
- @resource_name = options.fetch(:resource_name)
13
- @load = options.fetch(:definition)
14
- super('load')
15
- alias_as('reload')
16
- if @load
17
- docstring(load_docstring)
18
- code do |c|
19
- c << client_request
20
- c << "@data = resp.#{load_path}"
21
- c << "self"
22
- end
23
- else
24
- docstring('@raise [Errors::ResourceNotLoadable]')
25
- docstring('@api private')
26
- code do |c|
27
- c << "msg = #{LOAD_NOT_IMPLEMENTED.inspect}"
28
- c << "raise Errors::ResourceNotLoadable, msg"
29
- end
30
- end
31
- end
32
-
33
- private
34
-
35
- def client_request
36
- ClientRequest.new(request: @load['request'], resp: true, merge: false)
37
- end
38
-
39
- def load_path
40
- if @load['path'] == '@'
41
- 'data'
42
- else
43
- @load['path'].downcase
44
- end
45
- end
46
-
47
- def operation_name
48
- underscore(@load['request']['operation'])
49
- end
50
-
51
- def load_docstring
52
- <<-MARKDOWN
53
- Loads, or reloads {#data} for the current {#{@resource_name}}.
54
- Returns `self` making it possible to chain methods.
55
-
56
- #{underscore(@resource_name)}.reload.data
57
-
58
- @return [self]
59
- MARKDOWN
60
- end
61
-
62
- end
63
- end
64
- end
65
- end
@@ -1,68 +0,0 @@
1
- module AwsSdkCodeGenerator
2
- module Generators
3
- module Resource
4
- class ValueSource < String
5
-
6
- def initialize(value)
7
- super(send("param_#{underscore(value['source'])}", value))
8
- end
9
-
10
- private
11
-
12
- def param_identifier(param)
13
- "@" + underscore(param['name'])
14
- end
15
-
16
- def param_data(param)
17
- path = param['path']
18
- if path == '@'
19
- 'data'
20
- elsif path.match(/^(\w(\[0\])?)+(\.\w+)*$/)
21
- 'data.' + underscore_path(path)
22
- else
23
- raise "unsupported path: #{path.inspect}"
24
- end
25
- end
26
-
27
- def param_response(param)
28
- if param['path'] == '@'
29
- 'resp.data'
30
- else
31
- 'resp.data.' + underscore_path(param['path'])
32
- end
33
- end
34
-
35
- def param_request_parameter(param)
36
- if param['path'].match(/^\w+(\.\w+)*$/)
37
- "options" + path_parts(param['path']).map { |part| "[:#{part}]" }.join
38
- else
39
- raise "unsupported path expression: #{param['path']}"
40
- end
41
- end
42
-
43
- def param_string(param)
44
- param['value'].inspect
45
- end
46
- alias param_integer param_string
47
- alias param_boolean param_string
48
-
49
- def param_input(param)
50
- underscore(param['target'])
51
- end
52
-
53
- def underscore(str)
54
- Underscore.underscore(str)
55
- end
56
-
57
- def underscore_path(path)
58
- path.gsub(/\w+/) { |part| underscore(part) }
59
- end
60
-
61
- def path_parts(path)
62
- path.split('.').map { |part| underscore(part) }
63
- end
64
-
65
- end
66
- end
67
- end
68
- end
@@ -1,61 +0,0 @@
1
- module AwsSdkCodeGenerator
2
- module Generators
3
- module Resource
4
- class WaiterMethod < Dsl::Method
5
-
6
- # @option options [required, String] :resource_name
7
- # @option options [required, Hash] :resource
8
- # @option options [required, String] :resource_waiter_name
9
- # @option options [required, Hash] :resource_waiter
10
- # @option options [required, Hash] :waiter
11
- def initialize(options)
12
- resource_name = options.fetch(:resource_name)
13
- @resource = options.fetch(:resource)
14
- @resource_waiter = options.fetch(:resource_waiter)
15
- @waiter_name = @resource_waiter['waiterName']
16
- waiter = options.fetch(:waiter)
17
- super("wait_until_#{underscore(options.fetch(:resource_waiter_name))}")
18
- param('options', type: 'Hash', default:{})
19
- option(name: 'max_attempts', type:Integer, default: waiter['maxAttempts'])
20
- option(name: 'delay', type:Float, default: waiter['delay'])
21
- option(name: 'before_attempt', type:Proc)
22
- option(name: 'before_wait', type:Proc)
23
-
24
- returns(resource_name)
25
-
26
- resp = @resource_waiter['path'] ? 'resp = ' : ''
27
- code(<<-CODE)
28
- options, params = separate_params_and_options(options)
29
- waiter = Waiters::#{@waiter_name}.new(options)
30
- yield_waiter_and_warn(waiter, &Proc.new) if block_given?
31
- #{resp}waiter.wait(params.merge(#{args}))
32
- #{resource_name}.new(#{constructor_args})
33
- CODE
34
- end
35
-
36
- private
37
-
38
- def args
39
- ClientRequestParams.new(params: @resource_waiter['params']).to_s.strip
40
- end
41
-
42
- def constructor_args
43
- args = {}
44
- (@resource['identifiers'] || []).each do |i|
45
- name = underscore(i['name']).to_sym
46
- args[name] = "@#{name}"
47
- end
48
- if @resource_waiter['path']
49
- args[:data] = ValueSource.new(
50
- 'source' => 'response',
51
- 'path' => @resource_waiter['path']
52
- )
53
- end
54
- args[:client] = '@client'
55
- HashFormatter.new.format(args)
56
- end
57
-
58
- end
59
- end
60
- end
61
- end
@@ -1,325 +0,0 @@
1
- require 'set'
2
-
3
- module AwsSdkCodeGenerator
4
- module Generators
5
- class ResourceClass < Dsl::Class
6
-
7
- extend Helper
8
-
9
- # @option options [required, String] :name
10
- # @option options [required, Hash] :resource
11
- # @option options [required, Hash] :api
12
- # @option options [Hash] :paginators
13
- # @option options [Hash] :waiters
14
- # @option options [String] :var_name (underscore(name))
15
- def initialize(options)
16
- @api = options.fetch(:api)
17
- @name = options.fetch(:name)
18
- @resource = options.fetch(:resource)
19
- @paginators = options.fetch(:paginators, nil)
20
- @waiters = options.fetch(:waiters, nil)
21
- @var_name = options.fetch(:var_name, underscore(@name))
22
- super(@name)
23
- build
24
- check_for_method_name_conflicts!
25
- end
26
-
27
- private
28
-
29
- def build
30
- extend_module('Aws::Deprecations')
31
- add(initialize_method)
32
- code('# @!group Read-Only Attributes')
33
- add(*identifier_getters)
34
- add(*data_attribute_getters)
35
- code('# @!endgroup')
36
- add(client_getter)
37
- add(load_method)
38
- add(data_method)
39
- add(data_loaded_method)
40
- add(exists_method)
41
- add(*waiters)
42
- apply_actions
43
- apply_associations
44
- add(identifiers_method)
45
- add(*private_methods)
46
- add(batch_action)
47
- end
48
-
49
- def initialize_method
50
- Generators::Resource::InitializeMethod.new(resource: @resource)
51
- end
52
-
53
- def identifier_getters
54
- identifiers.map do |i|
55
- Generators::Resource::IdentifierGetter.new(identifier: i)
56
- end
57
- end
58
-
59
- def data_attribute_getters
60
- data_attribute_names.map do |member_name, member_ref|
61
- Generators::Resource::DataAttributeGetter.new(
62
- api: @api,
63
- member_name: member_name,
64
- member_ref: member_ref
65
- )
66
- end
67
- end
68
-
69
- def client_getter
70
- Generators::Resource::ClientGetter.new
71
- end
72
-
73
- def load_method
74
- Generators::Resource::LoadMethod.new(
75
- resource_name: @name,
76
- definition: @resource['load']
77
- )
78
- end
79
-
80
- def data_method
81
- Generators::Resource::DataMethod.new(
82
- resource_name: @name,
83
- resource: @resource
84
- )
85
- end
86
-
87
- def data_loaded_method
88
- Generators::Resource::DataLoadedMethod.new
89
- end
90
-
91
- def exists_method
92
- if @resource['waiters'] && @resource['waiters']['Exists']
93
- Generators::Resource::ExistsMethod.new(
94
- resource_name: @name,
95
- resource: @resource,
96
- waiters: @waiters,
97
- )
98
- end
99
- end
100
-
101
- def waiters
102
- (@resource['waiters'] || {}).map do |waiter_name, waiter|
103
- Generators::Resource::WaiterMethod.new(
104
- resource_name: @name,
105
- resource: @resource,
106
- resource_waiter_name: waiter_name,
107
- resource_waiter: waiter,
108
- waiter: @waiters['waiters'][waiter['waiterName']]
109
- )
110
- end
111
- end
112
-
113
- def apply_actions
114
- actions = @resource['actions'] || {}
115
- return if actions.empty?
116
- code('# @!group Actions')
117
- actions.each do |name, action|
118
- add(Resource::Action.new(
119
- api: @api,
120
- name: name,
121
- action: action,
122
- var_name: @var_name,
123
- ))
124
- end
125
- end
126
-
127
- def apply_associations
128
- associations = []
129
- associations += has_associations
130
- associations += has_many_associations
131
-
132
- return if associations.empty?
133
-
134
- code('# @!group Associations')
135
- associations.sort_by(&:name).each do |association_method|
136
- add(association_method)
137
- end
138
- end
139
-
140
- def has_associations
141
- (@resource['has'] || {}).map do |name, has|
142
- Resource::HasAssociation.new(
143
- api: @api,
144
- name: name,
145
- has: has
146
- )
147
- end
148
- end
149
-
150
- def has_many_associations
151
- (@resource['hasMany'] || {}).map do |name, has_many|
152
- Resource::HasManyAssociation.new(
153
- name: name,
154
- has_many: has_many,
155
- api: @api,
156
- paginators: @paginators,
157
- var_name: @var_name,
158
- )
159
- end
160
- end
161
-
162
- def batch_action
163
- Generators::Resource::CollectionClass.new(
164
- resource_name: @name,
165
- resource: @resource,
166
- api: @api,
167
- )
168
- end
169
-
170
- def identifiers_method
171
- Generators::Resource::IdentifiersMethod.new(
172
- identifiers: identifiers
173
- )
174
- end
175
-
176
- def private_methods
177
- methods = []
178
- methods.concat(extract_identifier_methods)
179
- methods << yield_waiter_and_warn_method
180
- methods << separate_params_and_options
181
- methods.compact
182
- end
183
-
184
- def extract_identifier_methods
185
- identifiers.map.with_index do |identifier, n|
186
- Generators::Resource::ExtractIdentifierMethod.new(
187
- identifier: identifier,
188
- index: n
189
- )
190
- end
191
- end
192
-
193
- def identifiers
194
- @resource['identifiers'] || []
195
- end
196
-
197
- def data_attribute_names
198
-
199
- skip = Set.new
200
-
201
- # do no duplicate identifiers
202
- identifiers.each do |i|
203
- skip << i['name']
204
- skip << i['memberName'] if i.key?('memberName')
205
- end
206
-
207
- # do no duplicate action names
208
- (@resource['actions'] || {}).keys.each do |action_name|
209
- skip << action_name
210
- end
211
-
212
- # do no duplicate has association names
213
- (@resource['has'] || {}).keys.each do |association_name|
214
- skip << association_name
215
- end
216
-
217
- # do no duplicate hasMany association names
218
- (@resource['hasMany'] || {}).keys.each do |association_name|
219
- skip << association_name
220
- end
221
-
222
- shape = (@api['shapes'] || {})[@resource['shape']] || {}
223
- members = shape['members'] || {}
224
- Enumerator.new do |y|
225
- members.each do |member_name, member_ref|
226
- unless skip.include?(member_name)
227
- y.yield(member_name, member_ref)
228
- end
229
- end
230
- end
231
- end
232
-
233
- def check_for_method_name_conflicts!
234
-
235
- names = Set.new
236
-
237
- # Ensure the resource does not have duplicate names. This
238
- # includes comparing identifier names, action names, association
239
- # names, e.g. anything that is exposed as a method.
240
- @code_objects.each do |code_obj|
241
- if Dsl::Method === code_obj || Dsl::AttributeAccessor === code_obj
242
- check_for_duplicate_method!(code_obj.name, names)
243
- end
244
- end
245
-
246
- # It is possible for Dsl::Method#aliases to collide with
247
- # code object names. Remove aliases that collide.
248
- @code_objects.each do |code_obj|
249
- if Dsl::Method === code_obj
250
- code_obj.aliases.each do |alias_name|
251
- if names.include?(alias_name.to_s)
252
- code_obj.aliases.delete(alias_name.to_s)
253
- end
254
- end
255
- end
256
- end
257
-
258
- # Compare all resource methods against methods defined
259
- # on Ruby's Object class as an instance method. We need to
260
- # ensure we do not clobber built in Ruby functionality.
261
- Object.instance_methods.each do |obj_method_name|
262
- if names.include?(obj_method_name.to_s)
263
- raise Errors::ResourceMethodConflict.new(
264
- resource_name: @name,
265
- method_name: obj_method_name
266
- )
267
- end
268
- end
269
- end
270
-
271
- def check_for_duplicate_method!(method_name, names)
272
- method_name = method_name.to_s
273
- if names.include?(method_name)
274
- raise Errors::ResourceMethodConflict.new(
275
- resource_name: @name,
276
- method_name: method_name
277
- )
278
- else
279
- names << method_name
280
- end
281
- end
282
-
283
- def yield_waiter_and_warn_method
284
- if @resource['waiters'] && @resource['waiters'].size > 0
285
- Dsl::Method.new(:yield_waiter_and_warn, access: :private) do |m|
286
- m.param(:waiter)
287
- m.block_param
288
- m.code(<<-CODE)
289
- if !@waiter_block_warned
290
- msg = "pass options to configure the waiter; "
291
- msg << "yielding the waiter is deprecated"
292
- warn(msg)
293
- @waiter_block_warned = true
294
- end
295
- yield(waiter.waiter)
296
- CODE
297
- end
298
- end
299
- end
300
-
301
- def separate_params_and_options
302
- if @resource['waiters'] && @resource['waiters'].size > 0
303
- Dsl::Method.new(:separate_params_and_options, access: :private) do |m|
304
- m.param(:options)
305
- m.code(<<-CODE)
306
- opts = Set.new([:client, :max_attempts, :delay, :before_attempt, :before_wait])
307
- waiter_opts = {}
308
- waiter_params = {}
309
- options.each_pair do |key, value|
310
- if opts.include?(key)
311
- waiter_opts[key] = value
312
- else
313
- waiter_params[key] = value
314
- end
315
- end
316
- waiter_opts[:client] ||= @client
317
- [waiter_opts, waiter_params]
318
- CODE
319
- end
320
- end
321
- end
322
-
323
- end
324
- end
325
- end