hearth 1.0.0.pre1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (57) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +12 -0
  3. data/VERSION +1 -0
  4. data/lib/hearth/api_error.rb +15 -0
  5. data/lib/hearth/block_io.rb +24 -0
  6. data/lib/hearth/context.rb +34 -0
  7. data/lib/hearth/http/api_error.rb +29 -0
  8. data/lib/hearth/http/client.rb +152 -0
  9. data/lib/hearth/http/error_parser.rb +105 -0
  10. data/lib/hearth/http/headers.rb +70 -0
  11. data/lib/hearth/http/middleware/content_length.rb +29 -0
  12. data/lib/hearth/http/networking_error.rb +20 -0
  13. data/lib/hearth/http/request.rb +132 -0
  14. data/lib/hearth/http/response.rb +29 -0
  15. data/lib/hearth/http.rb +36 -0
  16. data/lib/hearth/json/parse_error.rb +18 -0
  17. data/lib/hearth/json.rb +30 -0
  18. data/lib/hearth/middleware/around_handler.rb +24 -0
  19. data/lib/hearth/middleware/build.rb +26 -0
  20. data/lib/hearth/middleware/host_prefix.rb +48 -0
  21. data/lib/hearth/middleware/parse.rb +42 -0
  22. data/lib/hearth/middleware/request_handler.rb +24 -0
  23. data/lib/hearth/middleware/response_handler.rb +25 -0
  24. data/lib/hearth/middleware/retry.rb +43 -0
  25. data/lib/hearth/middleware/send.rb +62 -0
  26. data/lib/hearth/middleware/validate.rb +29 -0
  27. data/lib/hearth/middleware.rb +16 -0
  28. data/lib/hearth/middleware_builder.rb +246 -0
  29. data/lib/hearth/middleware_stack.rb +73 -0
  30. data/lib/hearth/number_helper.rb +33 -0
  31. data/lib/hearth/output.rb +20 -0
  32. data/lib/hearth/structure.rb +40 -0
  33. data/lib/hearth/stubbing/client_stubs.rb +115 -0
  34. data/lib/hearth/stubbing/stubs.rb +32 -0
  35. data/lib/hearth/time_helper.rb +35 -0
  36. data/lib/hearth/union.rb +10 -0
  37. data/lib/hearth/validator.rb +20 -0
  38. data/lib/hearth/waiters/errors.rb +15 -0
  39. data/lib/hearth/waiters/poller.rb +132 -0
  40. data/lib/hearth/waiters/waiter.rb +79 -0
  41. data/lib/hearth/xml/formatter.rb +68 -0
  42. data/lib/hearth/xml/node.rb +123 -0
  43. data/lib/hearth/xml/node_matcher.rb +24 -0
  44. data/lib/hearth/xml/parse_error.rb +18 -0
  45. data/lib/hearth/xml.rb +58 -0
  46. data/lib/hearth.rb +26 -0
  47. data/sig/lib/seahorse/api_error.rbs +10 -0
  48. data/sig/lib/seahorse/document.rbs +2 -0
  49. data/sig/lib/seahorse/http/api_error.rbs +21 -0
  50. data/sig/lib/seahorse/http/headers.rbs +47 -0
  51. data/sig/lib/seahorse/http/response.rbs +21 -0
  52. data/sig/lib/seahorse/simple_delegator.rbs +3 -0
  53. data/sig/lib/seahorse/structure.rbs +18 -0
  54. data/sig/lib/seahorse/stubbing/client_stubs.rbs +103 -0
  55. data/sig/lib/seahorse/stubbing/stubs.rbs +14 -0
  56. data/sig/lib/seahorse/union.rbs +6 -0
  57. metadata +111 -0
@@ -0,0 +1,123 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Hearth
4
+ module XML
5
+ # A class used to represent an XML node.
6
+ # @api private
7
+ class Node
8
+ # @api private
9
+ BOTH_TYPES = 'Nodes may not have both text and child nodes'
10
+
11
+ # @param [String] name
12
+ def initialize(name, *children)
13
+ @name = name
14
+ @attributes = {}
15
+ @child_nodes = []
16
+ @child_node_map = {}
17
+ @text = []
18
+ append(*children)
19
+ end
20
+
21
+ # @return [String]
22
+ attr_reader :name
23
+
24
+ # @return [Hash<String, String>]
25
+ attr_reader :attributes
26
+
27
+ def <<(*children)
28
+ children.flatten.each do |child|
29
+ case child
30
+ when Node
31
+ raise ArgumentError, BOTH_TYPES unless @text.empty?
32
+
33
+ @child_nodes << child
34
+ @child_node_map[child.name] ||= []
35
+ @child_node_map[child.name] << child
36
+ when String
37
+ raise ArgumentError, BOTH_TYPES unless @child_nodes.empty?
38
+
39
+ @text << child
40
+ else
41
+ raise ArgumentError, 'expected Hearth::XML::Node or String, ' \
42
+ "got #{child.class}"
43
+ end
44
+ end
45
+ end
46
+ alias append <<
47
+
48
+ # @return [String, nil]
49
+ def text
50
+ @text.empty? ? nil : @text.join
51
+ end
52
+
53
+ # @param [String] node_name
54
+ # @return [Array<Node>]
55
+ def [](node_name)
56
+ children(node_name)
57
+ end
58
+
59
+ # @overload children()
60
+ # @return [Array<Node>] Returns an array of all child nodes.
61
+ # @overload children(child_name)
62
+ # @param [String] child_name
63
+ # @return [Array<Node>] Returns an array of child nodes with the given
64
+ # name.
65
+ def children(*args)
66
+ nodes =
67
+ case args.count
68
+ when 0 then @child_nodes
69
+ when 1 then @child_node_map.fetch(args.first, [])
70
+ else raise ArgumentError, 'expected 0 or 1 arguments'
71
+ end
72
+ yield(nodes) if block_given? && !nodes.empty?
73
+ nodes
74
+ end
75
+ alias child_nodes children
76
+
77
+ # @return [Boolean]
78
+ def empty?
79
+ @child_nodes.empty? && @text.empty?
80
+ end
81
+
82
+ # @return [Array<String>]
83
+ def child_node_names
84
+ @child_node_map.keys
85
+ end
86
+
87
+ # @return [Boolean]
88
+ def child_node?(name)
89
+ @child_node_map.key?(name)
90
+ end
91
+
92
+ # @yield [child]
93
+ # @yieldparam child [Node]
94
+ # @return [Node, nil]
95
+ def child(child_name)
96
+ child = @child_node_map[child_name]&.first
97
+ yield(child) if block_given? && !child.nil?
98
+ child
99
+ end
100
+ alias at child
101
+
102
+ # @yield [text]
103
+ # @yieldparam text [String]
104
+ # @return [String, nil]
105
+ def text_at(child_name)
106
+ text = @child_node_map[child_name].first&.text
107
+ yield(text) if block_given? && !text.nil?
108
+ text
109
+ end
110
+
111
+ # @option options [String] :indent ('')
112
+ # When `indent` is non-empty whitespace, then the XML will
113
+ # be pretty-formatted with each level of nodes indented by
114
+ # `indent`.
115
+ # @return [String<XML>]
116
+ def to_xml(indent: '')
117
+ Formatter.new(indent: indent).format(self)
118
+ end
119
+ alias to_str to_xml
120
+ alias to_s to_xml
121
+ end
122
+ end
123
+ end
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rspec/expectations'
4
+
5
+ # Provides an rspec matcher for Hearth::XML::Node
6
+ # @api private
7
+ RSpec::Matchers.define :match_xml_node do |expected|
8
+ match do |actual|
9
+ return true if actual == expected
10
+ return false unless actual.instance_of?(expected.class)
11
+
12
+ expect(actual.name).to eq(expected.name)
13
+ expect(actual.text).to eq(expected.text)
14
+ expect(actual.attributes).to eq(expected.attributes)
15
+
16
+ expect(actual.children.length).to eq(expected.children.length)
17
+
18
+ expected.children.zip(actual.children).each do |a, e|
19
+ expect(a).to match_xml_node(e)
20
+ end
21
+ end
22
+
23
+ diffable
24
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Hearth
4
+ module XML
5
+ # An error class encountered when parsing XML.
6
+ class ParseError < StandardError
7
+ MSG = 'Encountered an error while parsing the response: %<message>s'
8
+
9
+ def initialize(original_error)
10
+ @original_error = original_error
11
+ super(format(MSG, message: original_error.message))
12
+ end
13
+
14
+ # @return [StandardError]
15
+ attr_reader :original_error
16
+ end
17
+ end
18
+ end
data/lib/hearth/xml.rb ADDED
@@ -0,0 +1,58 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'xml/formatter'
4
+ require_relative 'xml/node'
5
+ require_relative 'xml/parse_error'
6
+
7
+ require 'rexml'
8
+
9
+ module Hearth
10
+ # Hearth::XML is a purpose-built set of utilities for working with
11
+ # XML. It does not support many/most features of generic XML
12
+ # parsing and serialization.
13
+ # @api private
14
+ module XML
15
+ class << self
16
+ # @param [String] xml
17
+ # @return [Node]
18
+ def parse(xml)
19
+ doc = REXML::Document.new(xml.strip)
20
+ raise "no XML element found: #{xml.inspect}" unless doc.root
21
+
22
+ parse_node(doc.root)
23
+ rescue StandardError => e
24
+ raise ParseError, e
25
+ end
26
+
27
+ private
28
+
29
+ def parse_node(rexml_node)
30
+ node = Node.new(rexml_node.name)
31
+ apply_attributes(node, rexml_node)
32
+ apply_child_nodes(node, rexml_node)
33
+ apply_text(node, rexml_node)
34
+ node
35
+ end
36
+
37
+ def apply_attributes(node, rexml_node)
38
+ rexml_node.attributes.each_attribute do |attr|
39
+ node.attributes[attr.name] = attr.value
40
+ end
41
+ end
42
+
43
+ def apply_text(node, rexml_node)
44
+ text = rexml_node.text
45
+ return if text.nil?
46
+ return if text.strip.empty? && !node.empty?
47
+
48
+ node.append(text)
49
+ end
50
+
51
+ def apply_child_nodes(node, rexml_node)
52
+ rexml_node.each_element do |value|
53
+ node.append(parse_node(value))
54
+ end
55
+ end
56
+ end
57
+ end
58
+ end
data/lib/hearth.rb ADDED
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'hearth/api_error'
4
+ require_relative 'hearth/block_io'
5
+ require_relative 'hearth/context'
6
+ require_relative 'hearth/http'
7
+ require_relative 'hearth/json'
8
+ require_relative 'hearth/middleware'
9
+ require_relative 'hearth/middleware_builder'
10
+ require_relative 'hearth/middleware_stack'
11
+ require_relative 'hearth/number_helper'
12
+ require_relative 'hearth/output'
13
+ require_relative 'hearth/structure'
14
+ require_relative 'hearth/stubbing/client_stubs'
15
+ require_relative 'hearth/stubbing/stubs'
16
+ require_relative 'hearth/time_helper'
17
+ require_relative 'hearth/union'
18
+ require_relative 'hearth/validator'
19
+ require_relative 'hearth/waiters/errors'
20
+ require_relative 'hearth/waiters/poller'
21
+ require_relative 'hearth/waiters/waiter'
22
+ require_relative 'hearth/xml'
23
+
24
+ module Hearth
25
+ VERSION = File.read(File.expand_path('../VERSION', __dir__)).strip
26
+ end
@@ -0,0 +1,10 @@
1
+ module Hearth
2
+ # Base class for errors returned from an API. This excludes networking
3
+ # errors and errors generated on the client-side.
4
+ class ApiError < StandardError
5
+ def initialize: (error_code: String, ?message: String) -> ApiError
6
+
7
+ # @return [String]
8
+ attr_reader error_code: String
9
+ end
10
+ end
@@ -0,0 +1,2 @@
1
+ # Declare an alias for Document shapes
2
+ type document = Hash[Symbol,document] | Array[document] | String | bool | Numeric
@@ -0,0 +1,21 @@
1
+ module Hearth
2
+ module HTTP
3
+ # Base class for HTTP errors returned from an API. Inherits from
4
+ # {Hearth::ApiError}.
5
+ class ApiError < Hearth::ApiError
6
+ def initialize: (http_resp: Response, **untyped kwargs) -> ApiError
7
+
8
+ # @return [Integer]
9
+ attr_reader http_status: Integer
10
+
11
+ # @return [Hash<String, String>]
12
+ attr_reader http_headers: Hash[String, String]
13
+
14
+ # @return [String]
15
+ attr_reader http_body: String
16
+
17
+ # @return [String]
18
+ attr_reader request_id: String
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,47 @@
1
+ module Hearth
2
+ module HTTP
3
+ # Provides Hash like access for Headers with key normalization
4
+ # @api private
5
+ class Headers
6
+ # @param [Hash<String,String>] headers
7
+ def initialize: (?headers: ::Hash[String, String] headers) -> Headers
8
+
9
+ # @param [String] key
10
+ def []: (String key) -> String
11
+
12
+ # @param [String] key
13
+ # @param [String] value
14
+ def []=: (String key, String value) -> String
15
+
16
+ # @param [String] key
17
+ # @return [Boolean] Returns `true` if there is a header with
18
+ # the given key.
19
+ def key?: (String key) -> bool
20
+
21
+ # @return [Array<String>]
22
+ def keys: () -> Array[String]
23
+
24
+ # @param [String] key
25
+ # @return [String, nil] Returns the value for the deleted key.
26
+ def delete: (String key) -> (String | nil)
27
+
28
+ # @return [Enumerable<String,String>]
29
+ def each_pair: () { () -> String } -> Enumerable[Array[String]]
30
+
31
+ alias each each_pair
32
+
33
+ # @return [Hash]
34
+ def to_hash: () -> Hash[String, String]
35
+
36
+ alias to_h to_hash
37
+
38
+ # @return [Integer] Returns the number of entries in the headers
39
+ # hash.
40
+ def size: () -> Integer
41
+
42
+ private
43
+
44
+ def normalize: (String key) -> String
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,21 @@
1
+ module Hearth
2
+ module HTTP
3
+ # Represents an HTTP Response.
4
+ # @api private
5
+ class Response
6
+ # @param [Integer] status
7
+ # @param [Headers] headers
8
+ # @param [IO] body
9
+ def initialize: (?status: ::Integer status, ?headers: Headers headers, ?body: IO body) -> Response
10
+
11
+ # @return [Integer]
12
+ attr_accessor status: Integer
13
+
14
+ # @return [Headers]
15
+ attr_accessor headers: Headers
16
+
17
+ # @return [IO]
18
+ attr_accessor body: IO
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,3 @@
1
+ # Hack - https://github.com/ruby/delegate/issues/8
2
+ class SimpleDelegator
3
+ end
@@ -0,0 +1,18 @@
1
+ module Hearth
2
+ # A module mixed into Structs that provides utility methods.
3
+ module Structure
4
+ # Deeply converts the Struct into a hash. Structure members that
5
+ # are `nil` are omitted from the resultant hash.
6
+ #
7
+ # @return [Hash]
8
+ def to_h: (?untyped obj) -> Hash[Symbol,untyped]
9
+
10
+ alias to_hash to_h
11
+
12
+ private
13
+
14
+ def _to_h_struct: (untyped obj) -> untyped
15
+
16
+ def _to_h_hash: (untyped obj) -> untyped
17
+ end
18
+ end
@@ -0,0 +1,103 @@
1
+ module Hearth
2
+ # This module provides the ability to specify the data and/or errors to
3
+ # return when a client is using stubbed responses.
4
+ # This module should be included in generated service clients.
5
+ #
6
+ # Pass `stub_responses: true` to a client constructor to enable this
7
+ # behavior.
8
+ module ClientStubs
9
+ # Configures what data / errors should be returned from the named operation
10
+ # when response stubbing is enabled.
11
+ #
12
+ # ## Basic usage
13
+ #
14
+ # When you enable response stubbing, the client will generate fake
15
+ # responses and will not make any HTTP requests.
16
+ #
17
+ # client = Service::Client.new(stub_responses: true)
18
+ # client.operation
19
+ # #=> #<struct Service:Types::Operation param1=[], param2=nil>
20
+ #
21
+ # You can specify the stub data using {#stub_responses}
22
+ #
23
+ # client = Service::Client.new(stub_responses: true)
24
+ # client.stub_responses(:operation, {
25
+ # param1: [{ name: 'value1' }]
26
+ # })
27
+ #
28
+ # client.operation.param1.map(&:name)
29
+ # #=> ['value1']
30
+ #
31
+ # ## Stubbing Errors
32
+ #
33
+ # When stubbing is enabled, the SDK will default to generate
34
+ # fake responses with placeholder values. You can override the data
35
+ # returned. You can also specify errors it should raise.
36
+ #
37
+ # # to simulate errors, give the error class, you must
38
+ # # be able to construct an instance with `.new`
39
+ # client.stub_responses(:operation, Timeout::Error)
40
+ # client.operation(param1: 'value')
41
+ # #=> raises new Timeout::Error
42
+ #
43
+ # # or you can give an instance of an error class
44
+ # client.stub_responses(:operation, RuntimeError.new('custom message'))
45
+ # client.operation(param1: 'value')
46
+ # #=> raises the given runtime error object
47
+ #
48
+ # ## Dynamic Stubbing
49
+ #
50
+ # In addition to creating static stubs, it's also possible to generate
51
+ # stubs dynamically based on the parameters with which operations were
52
+ # called, by passing a `Proc` object:
53
+ #
54
+ # client.stub_responses(:operation, -> (context) {
55
+ # if context.params[:param] == 'foo'
56
+ # # return a stub
57
+ # { param1: [{ name: 'value1'}]}
58
+ # else
59
+ # # return an error
60
+ # Services::Errors::NotFound
61
+ # end
62
+ # })
63
+ #
64
+ # ## Stubbing Raw Protocol Responses
65
+ #
66
+ # As an alternative to providing the response data, you can modify the
67
+ # response object provided by the `Proc` object and then
68
+ # return nil.
69
+ #
70
+ # client.stub_responses(:operation, -> (context) {
71
+ # context.response.status = 404 # simulate an error
72
+ # nil
73
+ # })
74
+ #
75
+ # ## Stubbing Multiple Responses
76
+ #
77
+ # Calling an operation multiple times will return similar responses.
78
+ # You can configure multiple stubs and they will be returned in sequence.
79
+ #
80
+ # client.stub_responses(:operation, [
81
+ # Errors::NotFound,
82
+ # { content_length: 150 },
83
+ # ])
84
+ #
85
+ # client.operation(param1: 'value1')
86
+ # #=> raises Errors::NotFound
87
+ #
88
+ # resp = client.operation(param1: 'value2')
89
+ # resp.content_length #=> 150
90
+ #
91
+ # @param [Symbol] operation_name
92
+ #
93
+ # @param [Mixed] stubs One or more responses to return from the named
94
+ # operation.
95
+ #
96
+ # @return [void]
97
+ #
98
+ # @raise [RuntimeError] Raises a runtime error when called
99
+ # on a client that has not enabled response stubbing via
100
+ # `:stub_responses => true`.
101
+ def stub_responses: (Symbol operation_name, *Hearth::Stubbing::Stubs stubs) -> void
102
+ end
103
+ end
@@ -0,0 +1,14 @@
1
+ module Hearth
2
+ # @api private
3
+ module Stubbing
4
+ # Provides a thread safe data structure for adding and getting stubs
5
+ # per operation.
6
+ class Stubs
7
+ def initialize: () -> Stubs
8
+
9
+ def add_stubs: (Symbol operation_name, Array[Hash[Symbol, untyped]] | Proc | StandardError stubs) -> void
10
+
11
+ def next: (Symbol operation_name) -> Hash[Symbol, untyped]
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,6 @@
1
+ module Hearth
2
+ # Top level class for all Union types
3
+ class Union < ::SimpleDelegator
4
+ include Hearth::Structure
5
+ end
6
+ end
metadata ADDED
@@ -0,0 +1,111 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: hearth
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0.pre1
5
+ platform: ruby
6
+ authors:
7
+ - Amazon Web Services
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2022-02-16 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: jmespath
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.4'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.4'
27
+ description:
28
+ email:
29
+ executables: []
30
+ extensions: []
31
+ extra_rdoc_files: []
32
+ files:
33
+ - CHANGELOG.md
34
+ - VERSION
35
+ - lib/hearth.rb
36
+ - lib/hearth/api_error.rb
37
+ - lib/hearth/block_io.rb
38
+ - lib/hearth/context.rb
39
+ - lib/hearth/http.rb
40
+ - lib/hearth/http/api_error.rb
41
+ - lib/hearth/http/client.rb
42
+ - lib/hearth/http/error_parser.rb
43
+ - lib/hearth/http/headers.rb
44
+ - lib/hearth/http/middleware/content_length.rb
45
+ - lib/hearth/http/networking_error.rb
46
+ - lib/hearth/http/request.rb
47
+ - lib/hearth/http/response.rb
48
+ - lib/hearth/json.rb
49
+ - lib/hearth/json/parse_error.rb
50
+ - lib/hearth/middleware.rb
51
+ - lib/hearth/middleware/around_handler.rb
52
+ - lib/hearth/middleware/build.rb
53
+ - lib/hearth/middleware/host_prefix.rb
54
+ - lib/hearth/middleware/parse.rb
55
+ - lib/hearth/middleware/request_handler.rb
56
+ - lib/hearth/middleware/response_handler.rb
57
+ - lib/hearth/middleware/retry.rb
58
+ - lib/hearth/middleware/send.rb
59
+ - lib/hearth/middleware/validate.rb
60
+ - lib/hearth/middleware_builder.rb
61
+ - lib/hearth/middleware_stack.rb
62
+ - lib/hearth/number_helper.rb
63
+ - lib/hearth/output.rb
64
+ - lib/hearth/structure.rb
65
+ - lib/hearth/stubbing/client_stubs.rb
66
+ - lib/hearth/stubbing/stubs.rb
67
+ - lib/hearth/time_helper.rb
68
+ - lib/hearth/union.rb
69
+ - lib/hearth/validator.rb
70
+ - lib/hearth/waiters/errors.rb
71
+ - lib/hearth/waiters/poller.rb
72
+ - lib/hearth/waiters/waiter.rb
73
+ - lib/hearth/xml.rb
74
+ - lib/hearth/xml/formatter.rb
75
+ - lib/hearth/xml/node.rb
76
+ - lib/hearth/xml/node_matcher.rb
77
+ - lib/hearth/xml/parse_error.rb
78
+ - sig/lib/seahorse/api_error.rbs
79
+ - sig/lib/seahorse/document.rbs
80
+ - sig/lib/seahorse/http/api_error.rbs
81
+ - sig/lib/seahorse/http/headers.rbs
82
+ - sig/lib/seahorse/http/response.rbs
83
+ - sig/lib/seahorse/simple_delegator.rbs
84
+ - sig/lib/seahorse/structure.rbs
85
+ - sig/lib/seahorse/stubbing/client_stubs.rbs
86
+ - sig/lib/seahorse/stubbing/stubs.rbs
87
+ - sig/lib/seahorse/union.rbs
88
+ homepage:
89
+ licenses:
90
+ - Apache-2.0
91
+ metadata: {}
92
+ post_install_message:
93
+ rdoc_options: []
94
+ require_paths:
95
+ - lib
96
+ required_ruby_version: !ruby/object:Gem::Requirement
97
+ requirements:
98
+ - - ">="
99
+ - !ruby/object:Gem::Version
100
+ version: '2.5'
101
+ required_rubygems_version: !ruby/object:Gem::Requirement
102
+ requirements:
103
+ - - ">"
104
+ - !ruby/object:Gem::Version
105
+ version: 1.3.1
106
+ requirements: []
107
+ rubygems_version: 3.2.22
108
+ signing_key:
109
+ specification_version: 4
110
+ summary: A base library for Smithy generated SDKs
111
+ test_files: []