aws-sdk-code-generator 0.1.0.pre

Sign up to get free protection for your applications and to get access to all the features.
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