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

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 (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