aws-sdk-code-generator 0.1.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 (78) hide show
  1. checksums.yaml +7 -0
  2. data/lib/aws-sdk-code-generator.rb +91 -0
  3. data/lib/aws-sdk-code-generator/apply_docs.rb +37 -0
  4. data/lib/aws-sdk-code-generator/code_builder.rb +201 -0
  5. data/lib/aws-sdk-code-generator/dsl/access_control_statement.rb +23 -0
  6. data/lib/aws-sdk-code-generator/dsl/attribute_accessor.rb +43 -0
  7. data/lib/aws-sdk-code-generator/dsl/attribute_reader.rb +11 -0
  8. data/lib/aws-sdk-code-generator/dsl/attribute_writer.rb +11 -0
  9. data/lib/aws-sdk-code-generator/dsl/autoload_statement.rb +15 -0
  10. data/lib/aws-sdk-code-generator/dsl/block_param.rb +11 -0
  11. data/lib/aws-sdk-code-generator/dsl/class.rb +27 -0
  12. data/lib/aws-sdk-code-generator/dsl/code_literal.rb +66 -0
  13. data/lib/aws-sdk-code-generator/dsl/code_object.rb +33 -0
  14. data/lib/aws-sdk-code-generator/dsl/docstring.rb +36 -0
  15. data/lib/aws-sdk-code-generator/dsl/eigenclass.rb +15 -0
  16. data/lib/aws-sdk-code-generator/dsl/extend_statement.rb +12 -0
  17. data/lib/aws-sdk-code-generator/dsl/formatter.rb +25 -0
  18. data/lib/aws-sdk-code-generator/dsl/include_statement.rb +17 -0
  19. data/lib/aws-sdk-code-generator/dsl/main.rb +105 -0
  20. data/lib/aws-sdk-code-generator/dsl/method.rb +108 -0
  21. data/lib/aws-sdk-code-generator/dsl/module.rb +167 -0
  22. data/lib/aws-sdk-code-generator/dsl/option_tag.rb +36 -0
  23. data/lib/aws-sdk-code-generator/dsl/param.rb +43 -0
  24. data/lib/aws-sdk-code-generator/dsl/param_list.rb +38 -0
  25. data/lib/aws-sdk-code-generator/dsl/return_tag.rb +19 -0
  26. data/lib/aws-sdk-code-generator/dsl/tag_default.rb +20 -0
  27. data/lib/aws-sdk-code-generator/dsl/tag_docstring.rb +27 -0
  28. data/lib/aws-sdk-code-generator/dsl/tag_type.rb +18 -0
  29. data/lib/aws-sdk-code-generator/errors.rb +30 -0
  30. data/lib/aws-sdk-code-generator/gem_builder.rb +71 -0
  31. data/lib/aws-sdk-code-generator/generators/client_api_module.rb +334 -0
  32. data/lib/aws-sdk-code-generator/generators/client_class.rb +389 -0
  33. data/lib/aws-sdk-code-generator/generators/client_operation_documentation.rb +166 -0
  34. data/lib/aws-sdk-code-generator/generators/errors_module.rb +25 -0
  35. data/lib/aws-sdk-code-generator/generators/resource/action.rb +88 -0
  36. data/lib/aws-sdk-code-generator/generators/resource/batch_builder.rb +211 -0
  37. data/lib/aws-sdk-code-generator/generators/resource/builder.rb +50 -0
  38. data/lib/aws-sdk-code-generator/generators/resource/client_getter.rb +15 -0
  39. data/lib/aws-sdk-code-generator/generators/resource/client_request.rb +49 -0
  40. data/lib/aws-sdk-code-generator/generators/resource/client_request_docs.rb +97 -0
  41. data/lib/aws-sdk-code-generator/generators/resource/client_request_params.rb +88 -0
  42. data/lib/aws-sdk-code-generator/generators/resource/collection_class.rb +180 -0
  43. data/lib/aws-sdk-code-generator/generators/resource/data_attribute_getter.rb +24 -0
  44. data/lib/aws-sdk-code-generator/generators/resource/data_loaded_method.rb +18 -0
  45. data/lib/aws-sdk-code-generator/generators/resource/data_method.rb +49 -0
  46. data/lib/aws-sdk-code-generator/generators/resource/exists_method.rb +29 -0
  47. data/lib/aws-sdk-code-generator/generators/resource/extract_identifier_method.rb +32 -0
  48. data/lib/aws-sdk-code-generator/generators/resource/has_association.rb +101 -0
  49. data/lib/aws-sdk-code-generator/generators/resource/has_many_association.rb +108 -0
  50. data/lib/aws-sdk-code-generator/generators/resource/identifier_getter.rb +26 -0
  51. data/lib/aws-sdk-code-generator/generators/resource/identifiers_method.rb +28 -0
  52. data/lib/aws-sdk-code-generator/generators/resource/initialize_method.rb +67 -0
  53. data/lib/aws-sdk-code-generator/generators/resource/load_method.rb +65 -0
  54. data/lib/aws-sdk-code-generator/generators/resource/value_source.rb +68 -0
  55. data/lib/aws-sdk-code-generator/generators/resource/waiter_method.rb +61 -0
  56. data/lib/aws-sdk-code-generator/generators/resource_class.rb +325 -0
  57. data/lib/aws-sdk-code-generator/generators/response_structure_example.rb +83 -0
  58. data/lib/aws-sdk-code-generator/generators/root_resource_class.rb +42 -0
  59. data/lib/aws-sdk-code-generator/generators/service_documentation.rb +64 -0
  60. data/lib/aws-sdk-code-generator/generators/shared_example.rb +132 -0
  61. data/lib/aws-sdk-code-generator/generators/structure_type_class.rb +95 -0
  62. data/lib/aws-sdk-code-generator/generators/syntax_example.rb +169 -0
  63. data/lib/aws-sdk-code-generator/generators/types_module.rb +52 -0
  64. data/lib/aws-sdk-code-generator/generators/waiter_class.rb +62 -0
  65. data/lib/aws-sdk-code-generator/generators/waiters_module.rb +20 -0
  66. data/lib/aws-sdk-code-generator/hash_formatter.rb +122 -0
  67. data/lib/aws-sdk-code-generator/helper.rb +215 -0
  68. data/lib/aws-sdk-code-generator/service.rb +126 -0
  69. data/lib/aws-sdk-code-generator/underscore.rb +45 -0
  70. data/lib/aws-sdk-code-generator/view.rb +23 -0
  71. data/lib/aws-sdk-code-generator/views.rb +3 -0
  72. data/lib/aws-sdk-code-generator/views/features/env.rb +24 -0
  73. data/lib/aws-sdk-code-generator/views/features/step_definitions.rb +20 -0
  74. data/lib/aws-sdk-code-generator/views/gemspec.rb +41 -0
  75. data/lib/aws-sdk-code-generator/views/service_module.rb +85 -0
  76. data/lib/aws-sdk-code-generator/views/spec/spec_helper.rb +24 -0
  77. data/lib/aws-sdk-code-generator/views/version.rb +16 -0
  78. metadata +120 -0
@@ -0,0 +1,24 @@
1
+ module AwsSdkCodeGenerator
2
+ module Generators
3
+ module Resource
4
+ class DataAttributeGetter < Dsl::Method
5
+
6
+ include Helper
7
+
8
+ # @option options [required, Hash] :api
9
+ # @option options [required, String] :member_name
10
+ # @option options [required, Hash] :member_ref
11
+ def initialize(options = {})
12
+ @api = options.fetch(:api)
13
+ name = underscore(options.fetch(:member_name))
14
+ member_ref = options.fetch(:member_ref)
15
+ super(name)
16
+ docstring(documentation(member_ref))
17
+ returns(ruby_type(member_ref))
18
+ code("data.#{name}")
19
+ end
20
+
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,18 @@
1
+ module AwsSdkCodeGenerator
2
+ module Generators
3
+ module Resource
4
+ class DataLoadedMethod < Dsl::Method
5
+
6
+ def initialize
7
+ super('data_loaded?')
8
+ returns('Boolean', docstring:<<-DOCSTRING)
9
+ Returns `true` if this resource is loaded. Accessing attributes or
10
+ {#data} on an unloaded resource will trigger a call to {#load}.
11
+ DOCSTRING
12
+ code('!!@data')
13
+ end
14
+
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,49 @@
1
+ module AwsSdkCodeGenerator
2
+ module Generators
3
+ module Resource
4
+ class DataMethod < Dsl::Method
5
+
6
+ # @option options [required, String] :resource_name
7
+ # @option options [required, Hash] :resource
8
+ def initialize(options = {})
9
+ @resource_name = options.fetch(:resource_name)
10
+ resource = options.fetch(:resource)
11
+ @shape_name = resource['shape']
12
+ @load = resource['load'] && resource['load']['request']['operation']
13
+ super('data')
14
+ if @shape_name
15
+ returns("Types::#{@shape_name}", docstring:return_docstring)
16
+ code do |c|
17
+ c << 'load unless @data'
18
+ c << '@data'
19
+ end
20
+ if !@load
21
+ docstring(<<-DOCSTRING)
22
+ @raise [Errors::ResourceNotLoadableError] Raises when {#data_loaded?} is `false`.
23
+ DOCSTRING
24
+ end
25
+ else
26
+ docstring('@api private')
27
+ returns('EmptyStructure')
28
+ code('@data')
29
+ end
30
+ end
31
+
32
+ private
33
+
34
+
35
+ def return_docstring
36
+ if @load
37
+ <<-DOCSTRING
38
+ Returns the data for this {#{@resource_name}}. Calls
39
+ {Client##{underscore(@load)}} if {#data_loaded?} is `false`.
40
+ DOCSTRING
41
+ else
42
+ "Returns the data for this {#{@resource_name}}."
43
+ end
44
+ end
45
+
46
+ end
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,29 @@
1
+ module AwsSdkCodeGenerator
2
+ module Generators
3
+ module Resource
4
+ class ExistsMethod < Dsl::Method
5
+
6
+ include Helper
7
+
8
+ # @option options [required, String] :resource_name
9
+ def initialize(options)
10
+ resource_name = options.fetch(:resource_name)
11
+ super('exists?')
12
+ param(:options, type: 'Hash', default: {})
13
+ returns('Boolean', docstring: "Returns `true` if the #{resource_name} exists.")
14
+ code <<-CODE
15
+ begin
16
+ wait_until_exists(options.merge(max_attempts: 1))
17
+ true
18
+ rescue Aws::Waiters::Errors::UnexpectedError => e
19
+ raise e.error
20
+ rescue Aws::Waiters::Errors::WaiterFailed
21
+ false
22
+ end
23
+ CODE
24
+ end
25
+
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,32 @@
1
+ module AwsSdkCodeGenerator
2
+ module Generators
3
+ module Resource
4
+ class ExtractIdentifierMethod < Dsl::Method
5
+
6
+ include Helper
7
+
8
+ # @option options [required, String] :identifier
9
+ # @option options [required, Integer] :index
10
+ def initialize(options = {})
11
+ identifier = options.fetch(:identifier)
12
+ name = underscore(identifier['name'])
13
+ type = identifier_type(identifier)
14
+ super("extract_#{name}", access: :private)
15
+ param('args')
16
+ param('options')
17
+ code(<<-CODE)
18
+ value = args[#{options.fetch(:index)}] || options.delete(:#{name})
19
+ case value
20
+ when #{type} then value
21
+ when nil then raise ArgumentError, "missing required option :#{name}"
22
+ else
23
+ msg = "expected :#{name} to be a #{type}, got \#{value.class}"
24
+ raise ArgumentError, msg
25
+ end
26
+ CODE
27
+ end
28
+
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,101 @@
1
+ module AwsSdkCodeGenerator
2
+ module Generators
3
+ module Resource
4
+ class HasAssociation < Dsl::Method
5
+
6
+ # @option options [required, String] :name
7
+ # @option options [required, Hash] :has
8
+ def initialize(options = {})
9
+ @has = options.fetch(:has)
10
+ @data_identifiers = data_identifiers
11
+ @nullable = !@data_identifiers.empty?
12
+ @plural = plural?
13
+ super(underscore(options.fetch(:name)))
14
+ apply_params
15
+ apply_code
16
+ returns(return_type)
17
+ end
18
+
19
+ private
20
+
21
+ def return_type
22
+ if @plural
23
+ collection_type
24
+ elsif @nullable
25
+ "#{type}, nil"
26
+ else
27
+ type
28
+ end
29
+ end
30
+
31
+ def apply_params
32
+ (@has['resource']['identifiers'] || []).each do |identifier|
33
+ if identifier['source'] == 'input'
34
+ param(underscore(identifier['target']), type:'String')
35
+ end
36
+ end
37
+ end
38
+
39
+ def type
40
+ @has['resource']['type']
41
+ end
42
+
43
+ def collection_type
44
+ "#{type}::Collection"
45
+ end
46
+
47
+ def apply_code
48
+ if @plural
49
+ code("batch = []")
50
+ code(BatchBuilder.new(resource: @has['resource']))
51
+ code("#{collection_type}.new([batch], size: batch.size)")
52
+ elsif @nullable # singular association
53
+ code do |c|
54
+ c << "if #{null_checks}"
55
+ c.indent do |c2|
56
+ c2 << builder
57
+ end
58
+ c << "else"
59
+ c << " nil"
60
+ c << "end"
61
+ end
62
+ else
63
+ code(builder)
64
+ end
65
+ end
66
+
67
+ def builder
68
+ Builder.new(resource: @has['resource'], request_made: false)
69
+ end
70
+
71
+ def plural?
72
+ plural = false
73
+ r = @has['resource']
74
+ (r['identifiers'] || []).each do |i|
75
+ if i['path'] && i['path'].include?('[]')
76
+ plural = true
77
+ break
78
+ end
79
+ end
80
+ plural = true if r['data'] && r['data'].include?('[]')
81
+ plural
82
+ end
83
+
84
+ def data_identifiers
85
+ identifiers = []
86
+ (@has['resource']['identifiers'] || []).each do |i|
87
+ identifiers << i if i['source'] == 'data'
88
+ end
89
+ identifiers
90
+ end
91
+
92
+ def null_checks
93
+ @data_identifiers.map do |i|
94
+ ValueSource.new(i)
95
+ end.join(' && ')
96
+ end
97
+
98
+ end
99
+ end
100
+ end
101
+ end
@@ -0,0 +1,108 @@
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
@@ -0,0 +1,26 @@
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
@@ -0,0 +1,28 @@
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
@@ -0,0 +1,67 @@
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