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

Sign up to get free protection for your applications and to get access to all the features.
Files changed (155) hide show
  1. checksums.yaml +5 -5
  2. data/lib/aws-sdk-code-generator/api.rb +150 -0
  3. data/lib/aws-sdk-code-generator/apply_docs.rb +15 -2
  4. data/lib/aws-sdk-code-generator/client_constructor.rb +39 -0
  5. data/lib/aws-sdk-code-generator/client_operation_documentation.rb +282 -0
  6. data/lib/aws-sdk-code-generator/client_operation_list.rb +148 -0
  7. data/lib/aws-sdk-code-generator/client_response_structure_example.rb +115 -0
  8. data/lib/aws-sdk-code-generator/code_builder.rb +146 -133
  9. data/lib/aws-sdk-code-generator/crosslink.rb +42 -0
  10. data/lib/aws-sdk-code-generator/docstring.rb +199 -0
  11. data/lib/aws-sdk-code-generator/error_list.rb +77 -0
  12. data/lib/aws-sdk-code-generator/errors.rb +2 -0
  13. data/lib/aws-sdk-code-generator/eventstream_example.rb +220 -0
  14. data/lib/aws-sdk-code-generator/gem_builder.rb +42 -25
  15. data/lib/aws-sdk-code-generator/hash_formatter.rb +5 -2
  16. data/lib/aws-sdk-code-generator/helper.rb +86 -119
  17. data/lib/aws-sdk-code-generator/plugin_list.rb +147 -0
  18. data/lib/aws-sdk-code-generator/resource_action.rb +69 -0
  19. data/lib/aws-sdk-code-generator/resource_action_code.rb +57 -0
  20. data/lib/aws-sdk-code-generator/resource_association.rb +37 -0
  21. data/lib/aws-sdk-code-generator/resource_attribute.rb +76 -0
  22. data/lib/aws-sdk-code-generator/resource_batch_action.rb +56 -0
  23. data/lib/aws-sdk-code-generator/resource_batch_action_code.rb +136 -0
  24. data/lib/aws-sdk-code-generator/resource_batch_action_documentation.rb +108 -0
  25. data/lib/aws-sdk-code-generator/resource_batch_builder.rb +212 -0
  26. data/lib/aws-sdk-code-generator/resource_builder.rb +48 -0
  27. data/lib/aws-sdk-code-generator/resource_client_request.rb +62 -0
  28. data/lib/aws-sdk-code-generator/resource_client_request_documentation.rb +81 -0
  29. data/lib/aws-sdk-code-generator/resource_client_request_params.rb +86 -0
  30. data/lib/aws-sdk-code-generator/resource_data_method.rb +60 -0
  31. data/lib/aws-sdk-code-generator/resource_has_association.rb +117 -0
  32. data/lib/aws-sdk-code-generator/resource_has_many_association.rb +52 -0
  33. data/lib/aws-sdk-code-generator/resource_has_many_association_code.rb +76 -0
  34. data/lib/aws-sdk-code-generator/resource_identifier.rb +44 -0
  35. data/lib/aws-sdk-code-generator/resource_identifiers_method.rb +29 -0
  36. data/lib/aws-sdk-code-generator/resource_load_method.rb +68 -0
  37. data/lib/aws-sdk-code-generator/resource_method.rb +22 -0
  38. data/lib/aws-sdk-code-generator/resource_skip_params.rb +36 -0
  39. data/lib/aws-sdk-code-generator/resource_value_source.rb +68 -0
  40. data/lib/aws-sdk-code-generator/resource_waiter.rb +80 -0
  41. data/lib/aws-sdk-code-generator/service.rb +30 -7
  42. data/lib/aws-sdk-code-generator/shared_example.rb +131 -0
  43. data/lib/aws-sdk-code-generator/syntax_example.rb +60 -0
  44. data/lib/aws-sdk-code-generator/syntax_example_hash.rb +174 -0
  45. data/lib/aws-sdk-code-generator/underscore.rb +10 -5
  46. data/lib/aws-sdk-code-generator/view.rb +33 -0
  47. data/lib/aws-sdk-code-generator/views/apig_endpoint_class.rb +25 -0
  48. data/lib/aws-sdk-code-generator/views/apig_readme.rb +32 -0
  49. data/lib/aws-sdk-code-generator/views/async_client_class.rb +68 -0
  50. data/lib/aws-sdk-code-generator/views/authorizer_class.rb +17 -0
  51. data/lib/aws-sdk-code-generator/views/client_api_module.rb +602 -0
  52. data/lib/aws-sdk-code-generator/views/client_class.rb +93 -0
  53. data/lib/aws-sdk-code-generator/views/docstring.rb +27 -0
  54. data/lib/aws-sdk-code-generator/views/errors_module.rb +32 -0
  55. data/lib/aws-sdk-code-generator/views/event_streams_module.rb +149 -0
  56. data/lib/aws-sdk-code-generator/views/features/env.rb +9 -0
  57. data/lib/aws-sdk-code-generator/views/features/smoke.rb +52 -0
  58. data/lib/aws-sdk-code-generator/views/features/smoke_step_definitions.rb +26 -0
  59. data/lib/aws-sdk-code-generator/views/features/step_definitions.rb +6 -2
  60. data/lib/aws-sdk-code-generator/views/gemspec.rb +39 -5
  61. data/lib/aws-sdk-code-generator/views/resource_class.rb +122 -0
  62. data/lib/aws-sdk-code-generator/views/root_resource_class.rb +58 -0
  63. data/lib/aws-sdk-code-generator/views/service_module.rb +38 -14
  64. data/lib/aws-sdk-code-generator/views/spec/spec_helper.rb +9 -0
  65. data/lib/aws-sdk-code-generator/views/types_module.rb +329 -0
  66. data/lib/aws-sdk-code-generator/views/version.rb +2 -0
  67. data/lib/aws-sdk-code-generator/views/waiters_module.rb +37 -0
  68. data/lib/aws-sdk-code-generator/views.rb +2 -0
  69. data/lib/aws-sdk-code-generator/waiter.rb +95 -0
  70. data/lib/aws-sdk-code-generator/yard_option_tag.rb +43 -0
  71. data/lib/aws-sdk-code-generator.rb +68 -75
  72. data/templates/apig_endpoint_class.mustache +16 -0
  73. data/templates/apig_readme.mustache +62 -0
  74. data/templates/async_client_class.mustache +125 -0
  75. data/templates/authorizer_class.mustache +37 -0
  76. data/templates/client_api_module.mustache +106 -0
  77. data/templates/client_class.mustache +295 -0
  78. data/templates/code.mustache +4 -0
  79. data/templates/documentation.mustache +4 -0
  80. data/templates/errors_module.mustache +70 -0
  81. data/templates/event_streams_module.mustache +76 -0
  82. data/templates/features/env.mustache +15 -0
  83. data/templates/features/smoke.mustache +22 -0
  84. data/templates/features/smoke_step_definitions.mustache +31 -0
  85. data/templates/features/step_definitions.mustache +13 -0
  86. data/templates/gemspec.mustache +31 -0
  87. data/templates/license.txt +202 -0
  88. data/templates/method.mustache +7 -0
  89. data/templates/resource_class.mustache +304 -0
  90. data/templates/root_resource_class.mustache +51 -0
  91. data/templates/service_module.mustache +58 -0
  92. data/templates/spec/spec_helper.mustache +15 -0
  93. data/templates/types_module.mustache +53 -0
  94. data/templates/version.mustache +1 -0
  95. data/templates/waiters_module.mustache +112 -0
  96. metadata +115 -70
  97. data/lib/aws-sdk-code-generator/dsl/access_control_statement.rb +0 -23
  98. data/lib/aws-sdk-code-generator/dsl/attribute_accessor.rb +0 -43
  99. data/lib/aws-sdk-code-generator/dsl/attribute_reader.rb +0 -11
  100. data/lib/aws-sdk-code-generator/dsl/attribute_writer.rb +0 -11
  101. data/lib/aws-sdk-code-generator/dsl/autoload_statement.rb +0 -15
  102. data/lib/aws-sdk-code-generator/dsl/block_param.rb +0 -11
  103. data/lib/aws-sdk-code-generator/dsl/class.rb +0 -27
  104. data/lib/aws-sdk-code-generator/dsl/code_literal.rb +0 -66
  105. data/lib/aws-sdk-code-generator/dsl/code_object.rb +0 -33
  106. data/lib/aws-sdk-code-generator/dsl/docstring.rb +0 -36
  107. data/lib/aws-sdk-code-generator/dsl/eigenclass.rb +0 -15
  108. data/lib/aws-sdk-code-generator/dsl/extend_statement.rb +0 -12
  109. data/lib/aws-sdk-code-generator/dsl/formatter.rb +0 -25
  110. data/lib/aws-sdk-code-generator/dsl/include_statement.rb +0 -17
  111. data/lib/aws-sdk-code-generator/dsl/main.rb +0 -105
  112. data/lib/aws-sdk-code-generator/dsl/method.rb +0 -108
  113. data/lib/aws-sdk-code-generator/dsl/module.rb +0 -167
  114. data/lib/aws-sdk-code-generator/dsl/option_tag.rb +0 -36
  115. data/lib/aws-sdk-code-generator/dsl/param.rb +0 -43
  116. data/lib/aws-sdk-code-generator/dsl/param_list.rb +0 -38
  117. data/lib/aws-sdk-code-generator/dsl/return_tag.rb +0 -19
  118. data/lib/aws-sdk-code-generator/dsl/tag_default.rb +0 -20
  119. data/lib/aws-sdk-code-generator/dsl/tag_docstring.rb +0 -27
  120. data/lib/aws-sdk-code-generator/dsl/tag_type.rb +0 -18
  121. data/lib/aws-sdk-code-generator/generators/client_api_module.rb +0 -334
  122. data/lib/aws-sdk-code-generator/generators/client_class.rb +0 -389
  123. data/lib/aws-sdk-code-generator/generators/client_operation_documentation.rb +0 -166
  124. data/lib/aws-sdk-code-generator/generators/errors_module.rb +0 -25
  125. data/lib/aws-sdk-code-generator/generators/resource/action.rb +0 -88
  126. data/lib/aws-sdk-code-generator/generators/resource/batch_builder.rb +0 -211
  127. data/lib/aws-sdk-code-generator/generators/resource/builder.rb +0 -50
  128. data/lib/aws-sdk-code-generator/generators/resource/client_getter.rb +0 -15
  129. data/lib/aws-sdk-code-generator/generators/resource/client_request.rb +0 -49
  130. data/lib/aws-sdk-code-generator/generators/resource/client_request_docs.rb +0 -97
  131. data/lib/aws-sdk-code-generator/generators/resource/client_request_params.rb +0 -88
  132. data/lib/aws-sdk-code-generator/generators/resource/collection_class.rb +0 -180
  133. data/lib/aws-sdk-code-generator/generators/resource/data_attribute_getter.rb +0 -24
  134. data/lib/aws-sdk-code-generator/generators/resource/data_loaded_method.rb +0 -18
  135. data/lib/aws-sdk-code-generator/generators/resource/data_method.rb +0 -49
  136. data/lib/aws-sdk-code-generator/generators/resource/exists_method.rb +0 -29
  137. data/lib/aws-sdk-code-generator/generators/resource/extract_identifier_method.rb +0 -32
  138. data/lib/aws-sdk-code-generator/generators/resource/has_association.rb +0 -101
  139. data/lib/aws-sdk-code-generator/generators/resource/has_many_association.rb +0 -108
  140. data/lib/aws-sdk-code-generator/generators/resource/identifier_getter.rb +0 -26
  141. data/lib/aws-sdk-code-generator/generators/resource/identifiers_method.rb +0 -28
  142. data/lib/aws-sdk-code-generator/generators/resource/initialize_method.rb +0 -67
  143. data/lib/aws-sdk-code-generator/generators/resource/load_method.rb +0 -65
  144. data/lib/aws-sdk-code-generator/generators/resource/value_source.rb +0 -68
  145. data/lib/aws-sdk-code-generator/generators/resource/waiter_method.rb +0 -61
  146. data/lib/aws-sdk-code-generator/generators/resource_class.rb +0 -325
  147. data/lib/aws-sdk-code-generator/generators/response_structure_example.rb +0 -83
  148. data/lib/aws-sdk-code-generator/generators/root_resource_class.rb +0 -42
  149. data/lib/aws-sdk-code-generator/generators/service_documentation.rb +0 -64
  150. data/lib/aws-sdk-code-generator/generators/shared_example.rb +0 -132
  151. data/lib/aws-sdk-code-generator/generators/structure_type_class.rb +0 -95
  152. data/lib/aws-sdk-code-generator/generators/syntax_example.rb +0 -169
  153. data/lib/aws-sdk-code-generator/generators/types_module.rb +0 -52
  154. data/lib/aws-sdk-code-generator/generators/waiter_class.rb +0 -62
  155. data/lib/aws-sdk-code-generator/generators/waiters_module.rb +0 -20
@@ -0,0 +1,80 @@
1
+ # frozen_string_literal: true
2
+
3
+ module AwsSdkCodeGenerator
4
+ class ResourceWaiter
5
+
6
+ # @return [String]
7
+ attr_accessor :name
8
+
9
+ attr_accessor :client_waiter_name
10
+
11
+ # @return [String]
12
+ attr_accessor :waiter_class_name
13
+
14
+ # @return [Integer]
15
+ attr_accessor :delay
16
+
17
+ # @return [Integer]
18
+ attr_accessor :max_attempts
19
+
20
+ # @return [String<Ruby>]
21
+ attr_accessor :wait_call
22
+
23
+ # @return [String<Ruby>]
24
+ attr_accessor :constructor_args
25
+
26
+ class << self
27
+
28
+ # @param [Hash] resource
29
+ # @param [Hash, nil] client_waiters
30
+ # @return [Array<ResourceWaiter>]
31
+ def build_list(resource, client_waiters)
32
+ client_waiters = Waiter.build_list(client_waiters)
33
+ (resource['waiters'] || {}).map do |name, waiter|
34
+ client_waiter = client_waiters.find do |w|
35
+ w.name == Underscore.underscore(waiter['waiterName'])
36
+ end
37
+ ResourceWaiter.new.tap do |w|
38
+ w.name = Underscore.underscore(name)
39
+ w.client_waiter_name = client_waiter.name
40
+ w.waiter_class_name = client_waiter.class_name
41
+ w.delay = client_waiter.delay
42
+ w.max_attempts = client_waiter.max_attempts
43
+ w.wait_call = wait_call(waiter)
44
+ w.constructor_args = constructor_args(resource, waiter)
45
+ end
46
+ end
47
+ end
48
+
49
+ private
50
+
51
+ def wait_call(waiter)
52
+ args = ResourceClientRequestParams.new(
53
+ params: waiter['params']
54
+ ).to_s.strip
55
+ if waiter['path']
56
+ "resp = waiter.wait(params.merge(#{args}))"
57
+ else
58
+ "waiter.wait(params.merge(#{args}))"
59
+ end
60
+ end
61
+
62
+ def constructor_args(resource, waiter)
63
+ args = {}
64
+ (resource['identifiers'] || []).each do |i|
65
+ name = Underscore.underscore(i['name']).to_sym
66
+ args[name] = "@#{name}"
67
+ end
68
+ if waiter['path']
69
+ args[:data] = ResourceValueSource.new(
70
+ 'source' => 'response',
71
+ 'path' => waiter['path']
72
+ )
73
+ end
74
+ args[:client] = '@client'
75
+ HashFormatter.new(wrap: false).format(args)[1..-2]
76
+ end
77
+
78
+ end
79
+ end
80
+ end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module AwsSdkCodeGenerator
2
4
  class Service
3
5
 
@@ -12,6 +14,7 @@ module AwsSdkCodeGenerator
12
14
  # @option options [Hash, String] :waiters
13
15
  # @option options [Hash, String] :resources
14
16
  # @option options [Hash, String] :examples
17
+ # @option options [Hash, String] :smoke_tests
15
18
  # @option options [Hash<gem,version>] :gem_dependencies ({})
16
19
  # @option options [Hash] :add_plugins ({})
17
20
  # @option options [Hash] :remove_plugins ([])
@@ -22,24 +25,32 @@ module AwsSdkCodeGenerator
22
25
  @gem_name = options[:gem_name] || "aws-sdk-#{identifier}"
23
26
  @gem_version = options.fetch(:gem_version)
24
27
  @api = load_json(options.fetch(:api))
25
- ApplyDocs.new(@api).apply(load_json(options[:docs]))
28
+ unless @api['metadata']['protocol'] == 'api-gateway'
29
+ # Dont reply on API Gateway doc.json
30
+ ApplyDocs.new(@api).apply(load_json(options[:docs]))
31
+ end
26
32
  @paginators = load_json(options[:paginators])
27
33
  @waiters = load_json(options[:waiters])
28
34
  @resources = load_json(options[:resources])
29
35
  @examples = load_json(options[:examples])
30
- @gem_dependencies = {
31
- 'aws-sdk-core' => '3.0.0.rc1'
32
- }.merge(options[:gem_dependencies] || {})
36
+ @smoke_tests = load_json(options[:smoke_tests])
37
+ @gem_dependencies = options[:gem_dependencies] || {}
33
38
  @add_plugins = options[:add_plugins] || {}
34
39
  @remove_plugins = options[:remove_plugins] || []
35
40
  @endpoints_key = options.fetch(:endpoints_key, nil)
41
+ # APIG custom service only
42
+ @default_endpoint = options[:default_endpoint]
36
43
 
37
44
  # computed attributes
38
45
  @protocol = api.fetch('metadata').fetch('protocol')
46
+ @protocol_settings = api.fetch('metadata')['protocolSettings'] || {}
39
47
  @api_version = api.fetch('metadata')['apiVersion']
40
48
  @signature_version = api.fetch('metadata')['signatureVersion']
41
49
  @full_name = api.fetch('metadata')['serviceFullName']
42
50
  @short_name = api.fetch('metadata')['serviceAbbreviation'] || @full_name
51
+ @require_endpoint_discovery = api.fetch('operations', []).any? do |_, o|
52
+ o['endpointdiscovery'] && o['endpointdiscovery']['required']
53
+ end
43
54
  end
44
55
 
45
56
  # @return [String] The service name, e.g. "S3"
@@ -63,6 +74,9 @@ module AwsSdkCodeGenerator
63
74
  # @return [Hash, nil] The service shared examples model.
64
75
  attr_reader :examples
65
76
 
77
+ # @return [Hash, nil] The service smoke test model.
78
+ attr_reader :smoke_tests
79
+
66
80
  # @return [Hash<String,String>] A hash of gem dependencies. Hash keys
67
81
  # are gem names, values are versions.
68
82
  attr_reader :gem_dependencies
@@ -70,9 +84,15 @@ module AwsSdkCodeGenerator
70
84
  # @return [String]
71
85
  attr_reader :gem_version
72
86
 
87
+ # @return [String] The gem name, e.g. "aws-sdk-s3"
88
+ attr_reader :gem_name
89
+
73
90
  # @return [String, nil]
74
91
  attr_reader :endpoints_key
75
92
 
93
+ # @return [String] Required for APIG custom service
94
+ attr_reader :default_endpoint
95
+
76
96
  # @return [Hash<String,String>] A hash of plugins to add.
77
97
  attr_reader :add_plugins
78
98
 
@@ -82,12 +102,12 @@ module AwsSdkCodeGenerator
82
102
  # @return [String] The service identifier, e.g. "s3"
83
103
  attr_reader :identifier
84
104
 
85
- # @return [String] The gem name, e.g. "aws-sdk-s3"
86
- attr_reader :gem_name
87
-
88
105
  # @return [String] The service protocol, e.g. "json", "query", etc.
89
106
  attr_reader :protocol
90
107
 
108
+ # @return [Hash] The service protocol settings
109
+ attr_reader :protocol_settings
110
+
91
111
  # @return [String] The service API version, e.g. "YYYY-MM-DD".
92
112
  attr_reader :api_version
93
113
 
@@ -101,6 +121,9 @@ module AwsSdkCodeGenerator
101
121
  # @return [String] The short product name for the service, e.g. "Amazon S3".
102
122
  attr_reader :short_name
103
123
 
124
+ # @return [Boolean] true if any operation requires endpoint_discovery
125
+ attr_reader :require_endpoint_discovery
126
+
104
127
  # @api private
105
128
  def inspect
106
129
  "#<#{self.class.name}>"
@@ -0,0 +1,131 @@
1
+ # frozen_string_literal: true
2
+
3
+ module AwsSdkCodeGenerator
4
+ class SharedExample
5
+
6
+ def initialize(params, method_name, operation, api, comments)
7
+ @params = params
8
+ @method_name = method_name
9
+ @operation = operation
10
+ @api = api
11
+ @comments = comments
12
+ @params ||= {}
13
+ end
14
+
15
+ def to_str_input
16
+ lines = structure(@params, Api.shape(@operation['input'], @api), "", [])
17
+ params = lines.join("\n")
18
+ "resp = client.#{@method_name}(#{params})"
19
+ end
20
+
21
+ def to_str_output
22
+ lines = structure(@params, Api.shape(@operation['output'], @api), "", [])
23
+ params = lines.join("\n")
24
+ "#{params}"
25
+ end
26
+
27
+ private
28
+
29
+ def entry(json, ref, indent, path)
30
+ case ref['type']
31
+ when 'structure'
32
+ if is_ddb_simple_attribute?(ref)
33
+ string(json.first[1])
34
+ else
35
+ structure(json, ref, indent, path)
36
+ end
37
+ when 'map' then map(json, ref, indent, path)
38
+ when 'list' then list(json, ref, indent, path)
39
+ when 'timestamp' then "Time.parse(#{json.inspect})"
40
+ when 'string', 'blob' then string(json)
41
+ else json
42
+ end
43
+ end
44
+
45
+ def is_ddb_simple_attribute?(ref)
46
+ ref['members'].keys == ["S", "N", "B", "SS", "NS", "BS", "M", "L", "NULL", "BOOL"] &&
47
+ @api['metadata']['serviceFullName'] == 'Amazon DynamoDB'
48
+ end
49
+
50
+ def string(json)
51
+ # Travis jruby hangs when parsing long string (e.g. policy string)
52
+ # Clean all white spaces in those strings
53
+ if json.length > 2048
54
+ json.gsub(/\s+/, "").inspect
55
+ else
56
+ json.inspect
57
+ end
58
+ end
59
+
60
+ def structure(json, ref, indent, path)
61
+ lines = ["{"]
62
+ json.each do |key, val|
63
+ path << ".#{key}"
64
+ shape_val = entry(val, Api.shape(ref['members'][key], @api), "#{indent} ", path)
65
+ lines << "#{indent} #{Underscore.underscore(key)}: #{format(shape_val)}, #{apply_comments(path)}"
66
+ path.pop
67
+ end
68
+ lines << "#{indent}}"
69
+ lines
70
+ end
71
+
72
+ def map(json, ref, indent, path)
73
+ lines = ["{"]
74
+ json.each do |key, val|
75
+ path << ".#{key}"
76
+ _, ref_value = Api.resolve(ref['value'], @api)
77
+ shape_val = entry(val, ref_value, "#{indent} ", path)
78
+ lines << "#{indent} \"#{key}\" => #{format(shape_val)}, #{apply_comments(path)}"
79
+ path.pop
80
+ end
81
+ lines << "#{indent}}"
82
+ lines
83
+ end
84
+
85
+ def list(json, ref, indent, path)
86
+ lines = ["["]
87
+ json.each_with_index do |member, index|
88
+ path << "[#{index}]"
89
+ _, ref_val = Api.resolve(ref['member']['shape'], @api)
90
+ shape_val = entry(member, ref_val, "#{indent} ", path)
91
+ if shape_val.is_a?(Array)
92
+ shape_val = shape_val.join("\n")
93
+ end
94
+ lines << "#{indent} #{shape_val}, #{apply_comments(path)}"
95
+ path.pop
96
+ end
97
+ lines << "#{indent}]"
98
+ lines
99
+ end
100
+
101
+ def format(shape_val)
102
+ formatted = []
103
+ if shape_val.is_a?(Array)
104
+ hashes = []
105
+ shape_val.each do |v|
106
+ hashes << (v.is_a?(Hash) ? format_hash(v, ' ') : v)
107
+ end
108
+ hashes.join(",")
109
+ formatted << hashes
110
+ elsif shape_val.is_a?(Hash)
111
+ formatted << format_hash(shape_val, ' ')
112
+ else
113
+ formatted << shape_val
114
+ end
115
+ formatted.join("\n")
116
+ end
117
+
118
+ def format_hash(value, indent)
119
+ HashFormatter.new(indent: indent).format(value)
120
+ end
121
+
122
+ def apply_comments(path)
123
+ key = path.join().sub(/^\./, '')
124
+ if @comments && @comments[key]
125
+ "# #{@comments[key]}"
126
+ else
127
+ ""
128
+ end
129
+ end
130
+ end
131
+ end
@@ -0,0 +1,60 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'set'
4
+
5
+ module AwsSdkCodeGenerator
6
+ class SyntaxExample
7
+
8
+ include Helper
9
+
10
+ # @option options [required, Hash] :api
11
+ # @option options [required, Hash] :shape
12
+ def initialize(options = {})
13
+ @api = options.fetch(:api)
14
+ @method_name = options.fetch(:method_name)
15
+ @receiver = options.fetch(:receiver)
16
+ @resp_var = options[:resp_var] ? "#{options[:resp_var]} = " : ''
17
+ @shape = filter_shape(options)
18
+ @async = options[:async] || false
19
+ @hash = SyntaxExampleHash.new(api: @api, shape: @shape, async: @async).format('# ') if @shape
20
+ end
21
+
22
+ def format
23
+ if @shape && @shape['members'] && @shape['members'].length > 0
24
+ <<-EXAMPLE.strip
25
+ # @example Request syntax with placeholder values
26
+ #
27
+ # #{@resp_var}#{@receiver}.#{@method_name}(#{@hash})
28
+ #{async_format}
29
+ EXAMPLE
30
+ else
31
+ nil
32
+ end
33
+ end
34
+
35
+ def async_format
36
+ if @async
37
+ <<-ASYNC.strip
38
+ # # => Seahorse::Client::AsyncResponse
39
+ # async_resp.wait
40
+ # # => Seahorse::Client::Response
41
+ # # Or use async_resp.join!
42
+ ASYNC
43
+ else
44
+ nil
45
+ end
46
+ end
47
+
48
+ private
49
+
50
+ def filter_shape(options)
51
+ skip = Set.new(options.fetch(:skip, []))
52
+ shape = Helper.deep_copy(options.fetch(:shape))
53
+ options.fetch(:skip, []).each do |skip|
54
+ shape['members'].delete(skip)
55
+ end
56
+ shape
57
+ end
58
+
59
+ end
60
+ end
@@ -0,0 +1,174 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'set'
4
+
5
+ module AwsSdkCodeGenerator
6
+ class SyntaxExampleHash
7
+
8
+ include Helper
9
+
10
+ # @option options [required, Hash] :api
11
+ # @option options [required, Hash] :shape_ref
12
+ def initialize(options = {})
13
+ @api = options.fetch(:api)
14
+ @shape = options.fetch(:shape)
15
+ @async = options[:async] || false
16
+ end
17
+
18
+ def format(indent = '')
19
+ struct(@shape, indent, [])
20
+ end
21
+
22
+ private
23
+
24
+ def ref_value(ref, i, visited)
25
+ if visited.include?(ref['shape'])
26
+ return "{\n#{i} # recursive #{ref['shape']}\n#{i}}"
27
+ else
28
+ visited = visited + [ref['shape']]
29
+ end
30
+
31
+ s = shape(ref)
32
+ case s['type']
33
+ when 'structure'
34
+ if ref['shape'] == 'AttributeValue'
35
+ '"value"'
36
+ else
37
+ struct(s, i, visited)
38
+ end
39
+
40
+ when 'blob'
41
+ if ref['streaming']
42
+ 'source_file'
43
+ else
44
+ '"data"'
45
+ end
46
+
47
+ when 'list' then list(s, i, visited)
48
+ when 'map' then map(s, i, visited)
49
+ when 'boolean' then "false"
50
+ when 'integer', 'long' then '1'
51
+ when 'float', 'double' then '1.0'
52
+ when 'byte' then '97'
53
+ when 'character' then '"a"'
54
+ when 'string' then string(ref)
55
+ when 'timestamp' then 'Time.now'
56
+ else raise "unsupported shape #{s['type'].inspect}"
57
+ end
58
+ end
59
+
60
+ def struct(struct_shape, i, visited)
61
+ lines = ['{']
62
+ unless struct_shape['members'].nil?
63
+ struct_shape['members'].each_pair do |member_name, member_ref|
64
+ next if member_ref['documented'] === false
65
+ # input eventstream shouldn't be provided from params
66
+ if @api['shapes'][member_ref['shape']]['eventstream'] === true
67
+ lines << "#{i} input_event_stream_hander: EventStreams::#{member_ref['shape']}.new,"
68
+ else
69
+ lines << struct_member(struct_shape, member_name, member_ref, i, visited)
70
+ end
71
+ end
72
+ end
73
+ lines << "#{i}}"
74
+ lines.join("\n")
75
+ end
76
+
77
+ def struct_member(struct, member_name, member_ref, i, visited)
78
+ entry = "#{i} #{underscore(member_name)}: #{ref_value(member_ref, i + ' ', visited)},"
79
+ required = (struct['required'] || []).include?(member_name)
80
+ apply_comments(member_ref, entry, required: required)
81
+ end
82
+
83
+ def list(list_shape, i, visited)
84
+ member_ref = list_shape['member']
85
+ if complex?(member_ref)
86
+ complex_list(member_ref, i, visited)
87
+ else
88
+ scalar_list(member_ref, i, visited)
89
+ end
90
+ end
91
+
92
+ def scalar_list(member_ref, i, visited)
93
+ "[#{ref_value(member_ref, i, visited)}]"
94
+ end
95
+
96
+ def complex_list(member_ref, i, visited)
97
+ "[\n#{i} #{ref_value(member_ref, i + ' ', visited)},\n#{i}]"
98
+ end
99
+
100
+ def map(map_shape, i, visited)
101
+ key = string(map_shape['key'])
102
+ value = ref_value(map_shape['value'], i + ' ', visited)
103
+ "{\n#{i} #{key} => #{value},#{comments(map_shape['value'], false)}\n#{i}}"
104
+ end
105
+
106
+ def string(ref)
107
+ string_shape = shape(ref)
108
+ if string_shape['enum']
109
+ string_shape['enum'].first.inspect
110
+ else ref['shape']
111
+ ref['shape'].inspect
112
+ end
113
+ end
114
+
115
+ def apply_comments(ref, text, options = {})
116
+ required = options.fetch(:required)
117
+ lines = text.lines.to_a
118
+ if lines[0].match(/\n$/)
119
+ lines[0] = lines[0].sub(/\n$/, comments(ref, required) + "\n")
120
+ else
121
+ lines[0] += comments(ref, required)
122
+ end
123
+ lines.join
124
+ end
125
+
126
+ def comments(ref, required)
127
+ comments = []
128
+ if ref[:response_target]
129
+ comments << 'where to write response data, file path, or IO object'
130
+ end
131
+ if ref[:streaming]
132
+ comments << 'file/IO object, or string data'
133
+ end
134
+ if required
135
+ comments << 'required'
136
+ end
137
+ if enum = enum_values(ref)
138
+ comments << "accepts #{enum.to_a.join(', ')}"
139
+ end
140
+ if ddb_av?(ref)
141
+ comments << 'value <Hash,Array,String,Numeric,Boolean,IO,Set,nil>'
142
+ end
143
+ comments == [] ? '' : " # #{comments.join(', ')}"
144
+ end
145
+
146
+ def enum_values(ref)
147
+ s = shape(ref)
148
+ case s['type']
149
+ when 'list' then enum_values(s['member'])
150
+ when 'string' then s['enum']
151
+ else nil
152
+ end
153
+ end
154
+
155
+ def complex?(ref)
156
+ s = shape(ref)
157
+ if s['type'] == 'structure'
158
+ !ddb_av?(ref)
159
+ else
160
+ s['type'] == 'list' || s['type'] == 'map'
161
+ end
162
+ end
163
+
164
+ def ddb_av?(ref)
165
+ s = shape(ref)
166
+ case s['type']
167
+ when 'list' then ddb_av?(s['member'])
168
+ when 'structure' then ref['shape'] == 'AttributeValue'
169
+ else false
170
+ end
171
+ end
172
+
173
+ end
174
+ end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module AwsSdkCodeGenerator
2
4
  module Underscore
3
5
  class << self
@@ -10,11 +12,12 @@ module AwsSdkCodeGenerator
10
12
  # @param [String] string
11
13
  # @return [String] Returns the underscored version of the given string.
12
14
  def underscore(string)
13
- string.
14
- gsub(@irregular_regex) { |word| '_' + @irregular_inflections[word] }.
15
- gsub(/([A-Z0-9]+)([A-Z][a-z])/, '\1_\2').
16
- scan(/[a-z0-9]+|\d+|[A-Z0-9]+[a-z]*/).
17
- join('_').downcase
15
+ new_string = string.dup
16
+ new_string.gsub!(@irregular_regex) { |word| "_#{@irregular_inflections[word]}" }
17
+ new_string.gsub!(/([A-Z0-9]+)([A-Z][a-z])/, '\1_\2'.freeze)
18
+ new_string = new_string.scan(/[a-z0-9]+|\d+|[A-Z0-9]+[a-z]*/).join('_'.freeze)
19
+ new_string.downcase!
20
+ new_string
18
21
  end
19
22
 
20
23
  # @param [String<JMESPath>]
@@ -38,6 +41,8 @@ module AwsSdkCodeGenerator
38
41
  'iSCSI' => 'iscsi',
39
42
  'ACLs' => 'acls',
40
43
  'Md5s' => 'md5s',
44
+ 'HIT' => 'hit',
45
+ 'URL' => 'url',
41
46
  #'SSEKMS' => 'sse_kms',
42
47
  })
43
48
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'mustache'
2
4
 
3
5
  module AwsSdkCodeGenerator
@@ -15,9 +17,40 @@ module AwsSdkCodeGenerator
15
17
  subclass.raise_on_context_miss = true
16
18
  end
17
19
 
20
+ # @param (see Underscore.underscore)
21
+ # @option (see Underscore.underscore)
22
+ # @return (see Underscore.underscore)
18
23
  def underscore(string)
19
24
  Underscore.underscore(string)
20
25
  end
21
26
 
27
+ # @param (see Underscore.underscore_jmespath)
28
+ # @option (see Underscore.underscore_jmespath)
29
+ # @return (see Underscore.underscore_jmespath)
30
+ def underscore_jmespath(string)
31
+ Underscore.underscore_jmespath(string)
32
+ end
33
+
34
+ # @param (see Docstring.html_to_markdown)
35
+ # @option (see Docstring.html_to_markdown)
36
+ # @return (see Docstring.html_to_markdown)
37
+ def html_to_markdown(html, options = {})
38
+ Docstring.html_to_markdown(html, options)
39
+ end
40
+
41
+ # @param (see Docstring.block_comment)
42
+ # @option (see Docstring.block_comment)
43
+ # @return (see Docstring.block_comment)
44
+ def block_comment(text, options = {})
45
+ Docstring.block_comment(text, options = {})
46
+ end
47
+
48
+ # @param (see Docstring.join_docstrings)
49
+ # @option (see Docstring.join_docstrings)
50
+ # @return (see Docstring.join_docstrings)
51
+ def join_docstrings(docs, options = {})
52
+ Docstring.join_docstrings(docs, options)
53
+ end
54
+
22
55
  end
23
56
  end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ module AwsSdkCodeGenerator
4
+ module Views
5
+
6
+ class APIGEndpointClass < View
7
+
8
+ # @option options [required, String] :module_name
9
+ # @option options [required, String] :default_endpoint
10
+ def initialize(options)
11
+ @module_name = options.fetch(:module_name)
12
+ endpoint = options.fetch(:default_endpoint)
13
+ unless endpoint.start_with?('http://') || endpoint.start_with?('https://')
14
+ endpoint = "https://#{endpoint}"
15
+ end
16
+ @default_endpoint = endpoint
17
+ end
18
+
19
+ attr_reader :module_name
20
+
21
+ attr_reader :default_endpoint
22
+
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ module AwsSdkCodeGenerator
4
+ module Views
5
+ class APIGReadme < View
6
+
7
+ # @option options [required, String] :service_name
8
+ # @option options [required, String] :module_name
9
+ # @option options [required, String] :gem_name
10
+ # @option options [required, String] :gem_major_version
11
+ def initialize(options)
12
+ @service_name = options.fetch(:service_name)
13
+ @module_name = options.fetch(:module_name)
14
+ @gem_name = options.fetch(:gem_name)
15
+ @gem_major_version = options.fetch(:gem_major_version)
16
+ end
17
+
18
+ # @return [String]
19
+ attr_reader :module_name
20
+
21
+ # @return [String]
22
+ attr_reader :gem_major_version
23
+
24
+ # @return [String]
25
+ attr_reader :gem_name
26
+
27
+ # @return [String]
28
+ attr_reader :service_name
29
+
30
+ end
31
+ end
32
+ end