vault_ruby_client 0.18.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (47) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +287 -0
  3. data/LICENSE +364 -0
  4. data/README.md +223 -0
  5. data/lib/vault/api/approle.rb +221 -0
  6. data/lib/vault/api/auth.rb +324 -0
  7. data/lib/vault/api/auth_tls.rb +95 -0
  8. data/lib/vault/api/auth_token.rb +245 -0
  9. data/lib/vault/api/help.rb +36 -0
  10. data/lib/vault/api/kv.rb +230 -0
  11. data/lib/vault/api/logical.rb +153 -0
  12. data/lib/vault/api/secret.rb +171 -0
  13. data/lib/vault/api/sys/audit.rb +94 -0
  14. data/lib/vault/api/sys/auth.rb +119 -0
  15. data/lib/vault/api/sys/health.rb +66 -0
  16. data/lib/vault/api/sys/init.rb +86 -0
  17. data/lib/vault/api/sys/leader.rb +51 -0
  18. data/lib/vault/api/sys/lease.rb +52 -0
  19. data/lib/vault/api/sys/mount.rb +165 -0
  20. data/lib/vault/api/sys/namespace.rb +86 -0
  21. data/lib/vault/api/sys/policy.rb +95 -0
  22. data/lib/vault/api/sys/quota.rb +110 -0
  23. data/lib/vault/api/sys/seal.rb +84 -0
  24. data/lib/vault/api/sys.rb +30 -0
  25. data/lib/vault/api/transform/alphabet.rb +46 -0
  26. data/lib/vault/api/transform/role.rb +45 -0
  27. data/lib/vault/api/transform/template.rb +57 -0
  28. data/lib/vault/api/transform/transformation.rb +64 -0
  29. data/lib/vault/api/transform.rb +32 -0
  30. data/lib/vault/api.rb +17 -0
  31. data/lib/vault/client.rb +460 -0
  32. data/lib/vault/configurable.rb +53 -0
  33. data/lib/vault/defaults.rb +218 -0
  34. data/lib/vault/encode.rb +22 -0
  35. data/lib/vault/errors.rb +87 -0
  36. data/lib/vault/persistent/connection.rb +45 -0
  37. data/lib/vault/persistent/pool.rb +51 -0
  38. data/lib/vault/persistent/timed_stack_multi.rb +73 -0
  39. data/lib/vault/persistent.rb +1161 -0
  40. data/lib/vault/request.rb +47 -0
  41. data/lib/vault/response.rb +92 -0
  42. data/lib/vault/vendor/connection_pool/timed_stack.rb +181 -0
  43. data/lib/vault/vendor/connection_pool/version.rb +8 -0
  44. data/lib/vault/vendor/connection_pool.rb +153 -0
  45. data/lib/vault/version.rb +6 -0
  46. data/lib/vault_ruby_client.rb +53 -0
  47. metadata +158 -0
@@ -0,0 +1,47 @@
1
+ # Copyright (c) HashiCorp, Inc.
2
+ # SPDX-License-Identifier: MPL-2.0
3
+
4
+ module Vault
5
+ class Request
6
+ attr_reader :client
7
+
8
+ def initialize(client)
9
+ @client = client
10
+ end
11
+
12
+ # @return [String]
13
+ def to_s
14
+ "#<#{self.class.name}>"
15
+ end
16
+
17
+ # @return [String]
18
+ def inspect
19
+ "#<#{self.class.name}:0x#{"%x" % (self.object_id << 1)}>"
20
+ end
21
+
22
+ private
23
+
24
+ include EncodePath
25
+
26
+ # Removes the given header fields from options and returns the result. This
27
+ # modifies the given options in place.
28
+ #
29
+ # @param [Hash] options
30
+ #
31
+ # @return [Hash]
32
+ def extract_headers!(options = {})
33
+ extract = {
34
+ wrap_ttl: Vault::Client::WRAP_TTL_HEADER,
35
+ namespace: Vault::Client::NAMESPACE_HEADER,
36
+ }
37
+
38
+ {}.tap do |h|
39
+ extract.each do |k,v|
40
+ if options[k]
41
+ h[v] = options.delete(k)
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,92 @@
1
+ # Copyright (c) HashiCorp, Inc.
2
+ # SPDX-License-Identifier: MPL-2.0
3
+
4
+ module Vault
5
+ class Response
6
+ # Defines a new field. This is designed to be used by the subclass as a
7
+ # mini-DSL.
8
+ #
9
+ # @example Default
10
+ # field :data
11
+ #
12
+ # @example With a mutator
13
+ # field :present, as: :present?
14
+ #
15
+ # @param n [Symbol] the name of the field
16
+ # @option opts [Symbol] :as alias for method name
17
+ #
18
+ # @!visibility private
19
+ def self.field(n, opts = {})
20
+ self.fields[n] = opts
21
+
22
+ if opts[:as].nil?
23
+ attr_reader n
24
+ else
25
+ define_method(opts[:as]) do
26
+ instance_variable_get(:"@#{n}")
27
+ end
28
+ end
29
+ end
30
+
31
+ # Returns the list of fields defined on this subclass.
32
+ # @!visibility private
33
+ def self.fields
34
+ @fields ||= {}
35
+ end
36
+
37
+ # Decodes the given object (usually a Hash) into an instance of this class.
38
+ #
39
+ # @param object [Hash<Symbol, Object>]
40
+ def self.decode(object)
41
+ self.new(object)
42
+ end
43
+
44
+ def initialize(opts = {})
45
+ # Initialize all fields as nil to start
46
+ self.class.fields.each do |k, _|
47
+ instance_variable_set(:"@#{k}", nil)
48
+ end
49
+
50
+ # For each supplied option, set the instance variable if it was defined
51
+ # as a field.
52
+ opts.each do |k, v|
53
+ if self.class.fields.key?(k)
54
+ opts = self.class.fields[k]
55
+
56
+ if (m = opts[:load]) && !v.nil?
57
+ v = m.call(v)
58
+ end
59
+
60
+ if opts[:freeze]
61
+ v = v.freeze
62
+ end
63
+
64
+ instance_variable_set(:"@#{k}", v)
65
+ end
66
+ end
67
+ end
68
+
69
+ # Create a hash-bashed representation of this response.
70
+ #
71
+ # @return [Hash]
72
+ def to_h
73
+ self.class.fields.inject({}) do |h, (k, opts)|
74
+ if opts[:as].nil?
75
+ h[k] = self.public_send(k)
76
+ else
77
+ h[k] = self.public_send(opts[:as])
78
+ end
79
+
80
+ if !h[k].nil? && !h[k].is_a?(Array) && h[k].respond_to?(:to_h)
81
+ h[k] = h[k].to_h
82
+ end
83
+
84
+ h
85
+ end
86
+ end
87
+
88
+ def ==(other)
89
+ self.to_h == other.to_h
90
+ end
91
+ end
92
+ end
@@ -0,0 +1,181 @@
1
+ # Copyright (c) HashiCorp, Inc.
2
+ # SPDX-License-Identifier: MPL-2.0
3
+
4
+ require 'thread'
5
+ require 'timeout'
6
+
7
+ module Vault; end
8
+
9
+ ##
10
+ # Raised when you attempt to retrieve a connection from a pool that has been
11
+ # shut down.
12
+
13
+ class Vault::ConnectionPool::PoolShuttingDownError < RuntimeError; end
14
+
15
+ ##
16
+ # The TimedStack manages a pool of homogeneous connections (or any resource
17
+ # you wish to manage). Connections are created lazily up to a given maximum
18
+ # number.
19
+
20
+ # Examples:
21
+ #
22
+ # ts = TimedStack.new(1) { MyConnection.new }
23
+ #
24
+ # # fetch a connection
25
+ # conn = ts.pop
26
+ #
27
+ # # return a connection
28
+ # ts.push conn
29
+ #
30
+ # conn = ts.pop
31
+ # ts.pop timeout: 5
32
+ # #=> raises Timeout::Error after 5 seconds
33
+
34
+ module Vault
35
+ class ConnectionPool::TimedStack
36
+
37
+ ##
38
+ # Creates a new pool with +size+ connections that are created from the given
39
+ # +block+.
40
+
41
+ def initialize(size = 0, &block)
42
+ @create_block = block
43
+ @created = 0
44
+ @que = []
45
+ @max = size
46
+ @mutex = Mutex.new
47
+ @resource = ConditionVariable.new
48
+ @shutdown_block = nil
49
+ end
50
+
51
+ ##
52
+ # Returns +obj+ to the stack. +options+ is ignored in TimedStack but may be
53
+ # used by subclasses that extend TimedStack.
54
+
55
+ def push(obj, options = {})
56
+ @mutex.synchronize do
57
+ if @shutdown_block
58
+ @shutdown_block.call(obj)
59
+ else
60
+ store_connection obj, options
61
+ end
62
+
63
+ @resource.broadcast
64
+ end
65
+ end
66
+ alias_method :<<, :push
67
+
68
+ ##
69
+ # Retrieves a connection from the stack. If a connection is available it is
70
+ # immediately returned. If no connection is available within the given
71
+ # timeout a Timeout::Error is raised.
72
+ #
73
+ # +:timeout+ is the only checked entry in +options+ and is preferred over
74
+ # the +timeout+ argument (which will be removed in a future release). Other
75
+ # options may be used by subclasses that extend TimedStack.
76
+
77
+ def pop(timeout = 0.5, options = {})
78
+ options, timeout = timeout, 0.5 if Hash === timeout
79
+ timeout = options.fetch :timeout, timeout
80
+
81
+ deadline = Time.now + timeout
82
+ @mutex.synchronize do
83
+ loop do
84
+ raise ConnectionPool::PoolShuttingDownError if @shutdown_block
85
+ return fetch_connection(options) if connection_stored?(options)
86
+
87
+ connection = try_create(options)
88
+ return connection if connection
89
+
90
+ to_wait = deadline - Time.now
91
+ raise Timeout::Error, "Waited #{timeout} sec" if to_wait <= 0
92
+ @resource.wait(@mutex, to_wait)
93
+ end
94
+ end
95
+ end
96
+
97
+ ##
98
+ # Shuts down the TimedStack which prevents connections from being checked
99
+ # out. The +block+ is called once for each connection on the stack.
100
+
101
+ def shutdown(&block)
102
+ raise ArgumentError, "shutdown must receive a block" unless block_given?
103
+
104
+ @mutex.synchronize do
105
+ @shutdown_block = block
106
+ @resource.broadcast
107
+
108
+ shutdown_connections
109
+ end
110
+ end
111
+
112
+ ##
113
+ # Returns +true+ if there are no available connections.
114
+
115
+ def empty?
116
+ (@created - @que.length) >= @max
117
+ end
118
+
119
+ ##
120
+ # The number of connections available on the stack.
121
+
122
+ def length
123
+ @max - @created + @que.length
124
+ end
125
+
126
+ private
127
+
128
+ ##
129
+ # This is an extension point for TimedStack and is called with a mutex.
130
+ #
131
+ # This method must returns true if a connection is available on the stack.
132
+
133
+ def connection_stored?(options = nil)
134
+ !@que.empty?
135
+ end
136
+
137
+ ##
138
+ # This is an extension point for TimedStack and is called with a mutex.
139
+ #
140
+ # This method must return a connection from the stack.
141
+
142
+ def fetch_connection(options = nil)
143
+ @que.pop
144
+ end
145
+
146
+ ##
147
+ # This is an extension point for TimedStack and is called with a mutex.
148
+ #
149
+ # This method must shut down all connections on the stack.
150
+
151
+ def shutdown_connections(options = nil)
152
+ while connection_stored?(options)
153
+ conn = fetch_connection(options)
154
+ @shutdown_block.call(conn)
155
+ end
156
+ end
157
+
158
+ ##
159
+ # This is an extension point for TimedStack and is called with a mutex.
160
+ #
161
+ # This method must return +obj+ to the stack.
162
+
163
+ def store_connection(obj, options = nil)
164
+ @que.push obj
165
+ end
166
+
167
+ ##
168
+ # This is an extension point for TimedStack and is called with a mutex.
169
+ #
170
+ # This method must create a connection if and only if the total number of
171
+ # connections allowed has not been met.
172
+
173
+ def try_create(options = nil)
174
+ unless @created == @max
175
+ object = @create_block.call
176
+ @created += 1
177
+ object
178
+ end
179
+ end
180
+ end
181
+ end
@@ -0,0 +1,8 @@
1
+ # Copyright (c) HashiCorp, Inc.
2
+ # SPDX-License-Identifier: MPL-2.0
3
+
4
+ module Vault
5
+ class ConnectionPool
6
+ VERSION = "2.2.0"
7
+ end
8
+ end
@@ -0,0 +1,153 @@
1
+ # Copyright (c) HashiCorp, Inc.
2
+ # SPDX-License-Identifier: MPL-2.0
3
+
4
+ require_relative 'connection_pool/version'
5
+ require_relative 'connection_pool/timed_stack'
6
+
7
+
8
+ # Generic connection pool class for e.g. sharing a limited number of network connections
9
+ # among many threads. Note: Connections are lazily created.
10
+ #
11
+ # Example usage with block (faster):
12
+ #
13
+ # @pool = ConnectionPool.new { Redis.new }
14
+ #
15
+ # @pool.with do |redis|
16
+ # redis.lpop('my-list') if redis.llen('my-list') > 0
17
+ # end
18
+ #
19
+ # Using optional timeout override (for that single invocation)
20
+ #
21
+ # @pool.with(:timeout => 2.0) do |redis|
22
+ # redis.lpop('my-list') if redis.llen('my-list') > 0
23
+ # end
24
+ #
25
+ # Example usage replacing an existing connection (slower):
26
+ #
27
+ # $redis = ConnectionPool.wrap { Redis.new }
28
+ #
29
+ # def do_work
30
+ # $redis.lpop('my-list') if $redis.llen('my-list') > 0
31
+ # end
32
+ #
33
+ # Accepts the following options:
34
+ # - :size - number of connections to pool, defaults to 5
35
+ # - :timeout - amount of time to wait for a connection if none currently available, defaults to 5 seconds
36
+ #
37
+ module Vault
38
+ class ConnectionPool
39
+ DEFAULTS = {size: 5, timeout: 5}
40
+
41
+ class Error < RuntimeError
42
+ end
43
+
44
+ def self.wrap(options, &block)
45
+ Wrapper.new(options, &block)
46
+ end
47
+
48
+ def initialize(options = {}, &block)
49
+ raise ArgumentError, 'Connection pool requires a block' unless block
50
+
51
+ options = DEFAULTS.merge(options)
52
+
53
+ @size = options.fetch(:size)
54
+ @timeout = options.fetch(:timeout)
55
+
56
+ @available = TimedStack.new(@size, &block)
57
+ @key = :"current-#{@available.object_id}"
58
+ end
59
+
60
+ if Thread.respond_to?(:handle_interrupt)
61
+
62
+ # MRI
63
+ def with(options = {})
64
+ Thread.handle_interrupt(Exception => :never) do
65
+ conn = checkout(options)
66
+ begin
67
+ Thread.handle_interrupt(Exception => :immediate) do
68
+ yield conn
69
+ end
70
+ ensure
71
+ checkin
72
+ end
73
+ end
74
+ end
75
+
76
+ else
77
+
78
+ # jruby 1.7.x
79
+ def with(options = {})
80
+ conn = checkout(options)
81
+ begin
82
+ yield conn
83
+ ensure
84
+ checkin
85
+ end
86
+ end
87
+
88
+ end
89
+
90
+ def checkout(options = {})
91
+ conn = if stack.empty?
92
+ timeout = options[:timeout] || @timeout
93
+ @available.pop(timeout: timeout)
94
+ else
95
+ stack.last
96
+ end
97
+
98
+ stack.push conn
99
+ conn
100
+ end
101
+
102
+ def checkin
103
+ conn = pop_connection # mutates stack, must be on its own line
104
+ @available.push(conn) if stack.empty?
105
+
106
+ nil
107
+ end
108
+
109
+ def shutdown(&block)
110
+ @available.shutdown(&block)
111
+ end
112
+
113
+ private
114
+
115
+ def pop_connection
116
+ if stack.empty?
117
+ raise ConnectionPool::Error, 'no connections are checked out'
118
+ else
119
+ stack.pop
120
+ end
121
+ end
122
+
123
+ def stack
124
+ ::Thread.current[@key] ||= []
125
+ end
126
+
127
+ class Wrapper < ::BasicObject
128
+ METHODS = [:with, :pool_shutdown]
129
+
130
+ def initialize(options = {}, &block)
131
+ @pool = ::ConnectionPool.new(options, &block)
132
+ end
133
+
134
+ def with(&block)
135
+ @pool.with(&block)
136
+ end
137
+
138
+ def pool_shutdown(&block)
139
+ @pool.shutdown(&block)
140
+ end
141
+
142
+ def respond_to?(id, *args)
143
+ METHODS.include?(id) || with { |c| c.respond_to?(id, *args) }
144
+ end
145
+
146
+ def method_missing(name, *args, &block)
147
+ with do |connection|
148
+ connection.send(name, *args, &block)
149
+ end
150
+ end
151
+ end
152
+ end
153
+ end
@@ -0,0 +1,6 @@
1
+ # Copyright (c) HashiCorp, Inc.
2
+ # SPDX-License-Identifier: MPL-2.0
3
+
4
+ module Vault
5
+ VERSION = "0.18.2"
6
+ end
@@ -0,0 +1,53 @@
1
+ # Copyright (c) HashiCorp, Inc.
2
+ # SPDX-License-Identifier: MPL-2.0
3
+
4
+ module Vault
5
+ require_relative "vault/errors"
6
+ require_relative "vault/client"
7
+ require_relative "vault/configurable"
8
+ require_relative "vault/defaults"
9
+ require_relative "vault/response"
10
+ require_relative "vault/version"
11
+
12
+ require_relative "vault/api"
13
+
14
+ class << self
15
+ # API client object based off the configured options in {Configurable}.
16
+ #
17
+ # @return [Vault::Client]
18
+ attr_reader :client
19
+
20
+ def setup!
21
+ @client = Vault::Client.new
22
+
23
+ # Set secure SSL options
24
+ OpenSSL::SSL::SSLContext::DEFAULT_PARAMS.tap do |opts|
25
+ opts[:options] &= ~OpenSSL::SSL::OP_DONT_INSERT_EMPTY_FRAGMENTS if defined?(OpenSSL::SSL::OP_DONT_INSERT_EMPTY_FRAGMENTS)
26
+ opts[:options] |= OpenSSL::SSL::OP_NO_COMPRESSION if defined?(OpenSSL::SSL::OP_NO_COMPRESSION)
27
+ opts[:options] |= OpenSSL::SSL::OP_NO_SSLv2 if defined?(OpenSSL::SSL::OP_NO_SSLv2)
28
+ opts[:options] |= OpenSSL::SSL::OP_NO_SSLv3 if defined?(OpenSSL::SSL::OP_NO_SSLv3)
29
+ end
30
+
31
+
32
+ self
33
+ end
34
+
35
+ # Delegate all methods to the client object, essentially making the module
36
+ # object behave like a {Client}.
37
+ def method_missing(m, *args, &block)
38
+ if @client.respond_to?(m)
39
+ @client.send(m, *args, &block)
40
+ else
41
+ super
42
+ end
43
+ end
44
+
45
+ # Delegating +respond_to+ to the {Client}.
46
+ def respond_to_missing?(m, include_private = false)
47
+ @client.respond_to?(m, include_private) || super
48
+ end
49
+ end
50
+ end
51
+
52
+ # Load the initial default values
53
+ Vault.setup!
metadata ADDED
@@ -0,0 +1,158 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: vault_ruby_client
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.18.2
5
+ platform: ruby
6
+ authors:
7
+ - khiav reoy
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2024-11-21 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: aws-sigv4
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: bundler
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '2'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '2'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '13.2'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '13.2'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rspec
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '3.13'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '3.13'
69
+ - !ruby/object:Gem::Dependency
70
+ name: webmock
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '3.24'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '3.24'
83
+ description: Vault is a Ruby API client for interacting with a Vault server.
84
+ email:
85
+ - khiav223577@gmail.com
86
+ executables: []
87
+ extensions: []
88
+ extra_rdoc_files: []
89
+ files:
90
+ - CHANGELOG.md
91
+ - LICENSE
92
+ - README.md
93
+ - lib/vault/api.rb
94
+ - lib/vault/api/approle.rb
95
+ - lib/vault/api/auth.rb
96
+ - lib/vault/api/auth_tls.rb
97
+ - lib/vault/api/auth_token.rb
98
+ - lib/vault/api/help.rb
99
+ - lib/vault/api/kv.rb
100
+ - lib/vault/api/logical.rb
101
+ - lib/vault/api/secret.rb
102
+ - lib/vault/api/sys.rb
103
+ - lib/vault/api/sys/audit.rb
104
+ - lib/vault/api/sys/auth.rb
105
+ - lib/vault/api/sys/health.rb
106
+ - lib/vault/api/sys/init.rb
107
+ - lib/vault/api/sys/leader.rb
108
+ - lib/vault/api/sys/lease.rb
109
+ - lib/vault/api/sys/mount.rb
110
+ - lib/vault/api/sys/namespace.rb
111
+ - lib/vault/api/sys/policy.rb
112
+ - lib/vault/api/sys/quota.rb
113
+ - lib/vault/api/sys/seal.rb
114
+ - lib/vault/api/transform.rb
115
+ - lib/vault/api/transform/alphabet.rb
116
+ - lib/vault/api/transform/role.rb
117
+ - lib/vault/api/transform/template.rb
118
+ - lib/vault/api/transform/transformation.rb
119
+ - lib/vault/client.rb
120
+ - lib/vault/configurable.rb
121
+ - lib/vault/defaults.rb
122
+ - lib/vault/encode.rb
123
+ - lib/vault/errors.rb
124
+ - lib/vault/persistent.rb
125
+ - lib/vault/persistent/connection.rb
126
+ - lib/vault/persistent/pool.rb
127
+ - lib/vault/persistent/timed_stack_multi.rb
128
+ - lib/vault/request.rb
129
+ - lib/vault/response.rb
130
+ - lib/vault/vendor/connection_pool.rb
131
+ - lib/vault/vendor/connection_pool/timed_stack.rb
132
+ - lib/vault/vendor/connection_pool/version.rb
133
+ - lib/vault/version.rb
134
+ - lib/vault_ruby_client.rb
135
+ homepage: https://github.com/khiav223577/vault_ruby_client
136
+ licenses:
137
+ - MPL-2.0
138
+ metadata: {}
139
+ post_install_message:
140
+ rdoc_options: []
141
+ require_paths:
142
+ - lib
143
+ required_ruby_version: !ruby/object:Gem::Requirement
144
+ requirements:
145
+ - - ">="
146
+ - !ruby/object:Gem::Version
147
+ version: '2.0'
148
+ required_rubygems_version: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - ">="
151
+ - !ruby/object:Gem::Version
152
+ version: '0'
153
+ requirements: []
154
+ rubygems_version: 3.1.4
155
+ signing_key:
156
+ specification_version: 4
157
+ summary: Vault is a Ruby API client for interacting with a Vault server.
158
+ test_files: []