hearth 1.0.0.pre1

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 (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: []