brand.dev 0.0.1.pre.alpha.0
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.
- checksums.yaml +7 -0
- data/README.md +229 -0
- data/SECURITY.md +23 -0
- data/lib/brand_dev/client.rb +74 -0
- data/lib/brand_dev/errors.rb +192 -0
- data/lib/brand_dev/file_part.rb +55 -0
- data/lib/brand_dev/internal/transport/base_client.rb +555 -0
- data/lib/brand_dev/internal/transport/pooled_net_requester.rb +209 -0
- data/lib/brand_dev/internal/type/array_of.rb +162 -0
- data/lib/brand_dev/internal/type/base_model.rb +484 -0
- data/lib/brand_dev/internal/type/base_page.rb +55 -0
- data/lib/brand_dev/internal/type/boolean.rb +71 -0
- data/lib/brand_dev/internal/type/converter.rb +292 -0
- data/lib/brand_dev/internal/type/enum.rb +120 -0
- data/lib/brand_dev/internal/type/file_input.rb +103 -0
- data/lib/brand_dev/internal/type/hash_of.rb +182 -0
- data/lib/brand_dev/internal/type/request_parameters.rb +42 -0
- data/lib/brand_dev/internal/type/union.rb +227 -0
- data/lib/brand_dev/internal/type/unknown.rb +75 -0
- data/lib/brand_dev/internal/util.rb +915 -0
- data/lib/brand_dev/internal.rb +20 -0
- data/lib/brand_dev/models/brand_identify_from_transaction_params.rb +22 -0
- data/lib/brand_dev/models/brand_identify_from_transaction_response.rb +435 -0
- data/lib/brand_dev/models/brand_retrieve_by_ticker_params.rb +22 -0
- data/lib/brand_dev/models/brand_retrieve_by_ticker_response.rb +432 -0
- data/lib/brand_dev/models/brand_retrieve_naics_params.rb +27 -0
- data/lib/brand_dev/models/brand_retrieve_naics_response.rb +61 -0
- data/lib/brand_dev/models/brand_retrieve_params.rb +91 -0
- data/lib/brand_dev/models/brand_retrieve_response.rb +432 -0
- data/lib/brand_dev/models/brand_search_params.rb +22 -0
- data/lib/brand_dev/models/brand_search_response.rb +35 -0
- data/lib/brand_dev/models.rb +51 -0
- data/lib/brand_dev/request_options.rb +77 -0
- data/lib/brand_dev/resources/brand.rb +130 -0
- data/lib/brand_dev/version.rb +5 -0
- data/lib/brand_dev.rb +64 -0
- data/manifest.yaml +15 -0
- data/rbi/brand_dev/client.rbi +49 -0
- data/rbi/brand_dev/errors.rbi +162 -0
- data/rbi/brand_dev/file_part.rbi +37 -0
- data/rbi/brand_dev/internal/transport/base_client.rbi +293 -0
- data/rbi/brand_dev/internal/transport/pooled_net_requester.rbi +79 -0
- data/rbi/brand_dev/internal/type/array_of.rbi +104 -0
- data/rbi/brand_dev/internal/type/base_model.rbi +302 -0
- data/rbi/brand_dev/internal/type/base_page.rbi +42 -0
- data/rbi/brand_dev/internal/type/boolean.rbi +56 -0
- data/rbi/brand_dev/internal/type/converter.rbi +162 -0
- data/rbi/brand_dev/internal/type/enum.rbi +82 -0
- data/rbi/brand_dev/internal/type/file_input.rbi +59 -0
- data/rbi/brand_dev/internal/type/hash_of.rbi +104 -0
- data/rbi/brand_dev/internal/type/request_parameters.rbi +29 -0
- data/rbi/brand_dev/internal/type/union.rbi +116 -0
- data/rbi/brand_dev/internal/type/unknown.rbi +56 -0
- data/rbi/brand_dev/internal/util.rbi +485 -0
- data/rbi/brand_dev/internal.rbi +16 -0
- data/rbi/brand_dev/models/brand_identify_from_transaction_params.rbi +46 -0
- data/rbi/brand_dev/models/brand_identify_from_transaction_response.rbi +981 -0
- data/rbi/brand_dev/models/brand_retrieve_by_ticker_params.rbi +43 -0
- data/rbi/brand_dev/models/brand_retrieve_by_ticker_response.rbi +976 -0
- data/rbi/brand_dev/models/brand_retrieve_naics_params.rbi +44 -0
- data/rbi/brand_dev/models/brand_retrieve_naics_response.rbi +127 -0
- data/rbi/brand_dev/models/brand_retrieve_params.rbi +344 -0
- data/rbi/brand_dev/models/brand_retrieve_response.rbi +949 -0
- data/rbi/brand_dev/models/brand_search_params.rbi +40 -0
- data/rbi/brand_dev/models/brand_search_response.rbi +63 -0
- data/rbi/brand_dev/models.rbi +14 -0
- data/rbi/brand_dev/request_options.rbi +59 -0
- data/rbi/brand_dev/resources/brand.rbi +89 -0
- data/rbi/brand_dev/version.rbi +5 -0
- data/sig/brand_dev/client.rbs +26 -0
- data/sig/brand_dev/errors.rbs +101 -0
- data/sig/brand_dev/file_part.rbs +21 -0
- data/sig/brand_dev/internal/transport/base_client.rbs +131 -0
- data/sig/brand_dev/internal/transport/pooled_net_requester.rbs +45 -0
- data/sig/brand_dev/internal/type/array_of.rbs +48 -0
- data/sig/brand_dev/internal/type/base_model.rbs +102 -0
- data/sig/brand_dev/internal/type/base_page.rbs +24 -0
- data/sig/brand_dev/internal/type/boolean.rbs +26 -0
- data/sig/brand_dev/internal/type/converter.rbs +56 -0
- data/sig/brand_dev/internal/type/enum.rbs +32 -0
- data/sig/brand_dev/internal/type/file_input.rbs +25 -0
- data/sig/brand_dev/internal/type/hash_of.rbs +48 -0
- data/sig/brand_dev/internal/type/request_parameters.rbs +17 -0
- data/sig/brand_dev/internal/type/union.rbs +52 -0
- data/sig/brand_dev/internal/type/unknown.rbs +26 -0
- data/sig/brand_dev/internal/util.rbs +185 -0
- data/sig/brand_dev/internal.rbs +9 -0
- data/sig/brand_dev/models/brand_identify_from_transaction_params.rbs +24 -0
- data/sig/brand_dev/models/brand_identify_from_transaction_response.rbs +418 -0
- data/sig/brand_dev/models/brand_retrieve_by_ticker_params.rbs +23 -0
- data/sig/brand_dev/models/brand_retrieve_by_ticker_response.rbs +418 -0
- data/sig/brand_dev/models/brand_retrieve_naics_params.rbs +23 -0
- data/sig/brand_dev/models/brand_retrieve_naics_response.rbs +61 -0
- data/sig/brand_dev/models/brand_retrieve_params.rbs +148 -0
- data/sig/brand_dev/models/brand_retrieve_response.rbs +418 -0
- data/sig/brand_dev/models/brand_search_params.rbs +23 -0
- data/sig/brand_dev/models/brand_search_response.rbs +29 -0
- data/sig/brand_dev/models.rbs +11 -0
- data/sig/brand_dev/request_options.rbs +34 -0
- data/sig/brand_dev/resources/brand.rbs +33 -0
- data/sig/brand_dev/version.rbs +3 -0
- metadata +160 -0
@@ -0,0 +1,209 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module BrandDev
|
4
|
+
module Internal
|
5
|
+
module Transport
|
6
|
+
# @api private
|
7
|
+
class PooledNetRequester
|
8
|
+
extend BrandDev::Internal::Util::SorbetRuntimeSupport
|
9
|
+
|
10
|
+
# from the golang stdlib
|
11
|
+
# https://github.com/golang/go/blob/c8eced8580028328fde7c03cbfcb720ce15b2358/src/net/http/transport.go#L49
|
12
|
+
KEEP_ALIVE_TIMEOUT = 30
|
13
|
+
|
14
|
+
DEFAULT_MAX_CONNECTIONS = [Etc.nprocessors, 99].max
|
15
|
+
|
16
|
+
class << self
|
17
|
+
# @api private
|
18
|
+
#
|
19
|
+
# @param url [URI::Generic]
|
20
|
+
#
|
21
|
+
# @return [Net::HTTP]
|
22
|
+
def connect(url)
|
23
|
+
port =
|
24
|
+
case [url.port, url.scheme]
|
25
|
+
in [Integer, _]
|
26
|
+
url.port
|
27
|
+
in [nil, "http" | "ws"]
|
28
|
+
Net::HTTP.http_default_port
|
29
|
+
in [nil, "https" | "wss"]
|
30
|
+
Net::HTTP.https_default_port
|
31
|
+
end
|
32
|
+
|
33
|
+
Net::HTTP.new(url.host, port).tap do
|
34
|
+
_1.use_ssl = %w[https wss].include?(url.scheme)
|
35
|
+
_1.max_retries = 0
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
# @api private
|
40
|
+
#
|
41
|
+
# @param conn [Net::HTTP]
|
42
|
+
# @param deadline [Float]
|
43
|
+
def calibrate_socket_timeout(conn, deadline)
|
44
|
+
timeout = deadline - BrandDev::Internal::Util.monotonic_secs
|
45
|
+
conn.open_timeout = conn.read_timeout = conn.write_timeout = conn.continue_timeout = timeout
|
46
|
+
end
|
47
|
+
|
48
|
+
# @api private
|
49
|
+
#
|
50
|
+
# @param request [Hash{Symbol=>Object}] .
|
51
|
+
#
|
52
|
+
# @option request [Symbol] :method
|
53
|
+
#
|
54
|
+
# @option request [URI::Generic] :url
|
55
|
+
#
|
56
|
+
# @option request [Hash{String=>String}] :headers
|
57
|
+
#
|
58
|
+
# @param blk [Proc]
|
59
|
+
#
|
60
|
+
# @yieldparam [String]
|
61
|
+
# @return [Array(Net::HTTPGenericRequest, Proc)]
|
62
|
+
def build_request(request, &blk)
|
63
|
+
method, url, headers, body = request.fetch_values(:method, :url, :headers, :body)
|
64
|
+
req = Net::HTTPGenericRequest.new(
|
65
|
+
method.to_s.upcase,
|
66
|
+
!body.nil?,
|
67
|
+
method != :head,
|
68
|
+
URI(url.to_s) # ensure we construct a URI class of the right scheme
|
69
|
+
)
|
70
|
+
|
71
|
+
headers.each { req[_1] = _2 }
|
72
|
+
|
73
|
+
case body
|
74
|
+
in nil
|
75
|
+
nil
|
76
|
+
in String
|
77
|
+
req["content-length"] ||= body.bytesize.to_s unless req["transfer-encoding"]
|
78
|
+
req.body_stream = BrandDev::Internal::Util::ReadIOAdapter.new(body, &blk)
|
79
|
+
in StringIO
|
80
|
+
req["content-length"] ||= body.size.to_s unless req["transfer-encoding"]
|
81
|
+
req.body_stream = BrandDev::Internal::Util::ReadIOAdapter.new(body, &blk)
|
82
|
+
in Pathname | IO | Enumerator
|
83
|
+
req["transfer-encoding"] ||= "chunked" unless req["content-length"]
|
84
|
+
req.body_stream = BrandDev::Internal::Util::ReadIOAdapter.new(body, &blk)
|
85
|
+
end
|
86
|
+
|
87
|
+
[req, req.body_stream&.method(:close)]
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
# @api private
|
92
|
+
#
|
93
|
+
# @param url [URI::Generic]
|
94
|
+
# @param deadline [Float]
|
95
|
+
# @param blk [Proc]
|
96
|
+
#
|
97
|
+
# @raise [Timeout::Error]
|
98
|
+
# @yieldparam [Net::HTTP]
|
99
|
+
private def with_pool(url, deadline:, &blk)
|
100
|
+
origin = BrandDev::Internal::Util.uri_origin(url)
|
101
|
+
timeout = deadline - BrandDev::Internal::Util.monotonic_secs
|
102
|
+
pool =
|
103
|
+
@mutex.synchronize do
|
104
|
+
@pools[origin] ||= ConnectionPool.new(size: @size) do
|
105
|
+
self.class.connect(url)
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
pool.with(timeout: timeout, &blk)
|
110
|
+
end
|
111
|
+
|
112
|
+
# @api private
|
113
|
+
#
|
114
|
+
# @param request [Hash{Symbol=>Object}] .
|
115
|
+
#
|
116
|
+
# @option request [Symbol] :method
|
117
|
+
#
|
118
|
+
# @option request [URI::Generic] :url
|
119
|
+
#
|
120
|
+
# @option request [Hash{String=>String}] :headers
|
121
|
+
#
|
122
|
+
# @option request [Object] :body
|
123
|
+
#
|
124
|
+
# @option request [Float] :deadline
|
125
|
+
#
|
126
|
+
# @return [Array(Integer, Net::HTTPResponse, Enumerable<String>)]
|
127
|
+
def execute(request)
|
128
|
+
url, deadline = request.fetch_values(:url, :deadline)
|
129
|
+
|
130
|
+
req = nil
|
131
|
+
eof = false
|
132
|
+
finished = false
|
133
|
+
closing = nil
|
134
|
+
|
135
|
+
# rubocop:disable Metrics/BlockLength
|
136
|
+
enum = Enumerator.new do |y|
|
137
|
+
with_pool(url, deadline: deadline) do |conn|
|
138
|
+
next if finished
|
139
|
+
|
140
|
+
req, closing = self.class.build_request(request) do
|
141
|
+
self.class.calibrate_socket_timeout(conn, deadline)
|
142
|
+
end
|
143
|
+
|
144
|
+
self.class.calibrate_socket_timeout(conn, deadline)
|
145
|
+
unless conn.started?
|
146
|
+
conn.keep_alive_timeout = self.class::KEEP_ALIVE_TIMEOUT
|
147
|
+
conn.start
|
148
|
+
end
|
149
|
+
|
150
|
+
self.class.calibrate_socket_timeout(conn, deadline)
|
151
|
+
conn.request(req) do |rsp|
|
152
|
+
y << [conn, req, rsp]
|
153
|
+
break if finished
|
154
|
+
|
155
|
+
rsp.read_body do |bytes|
|
156
|
+
y << bytes.force_encoding(Encoding::BINARY)
|
157
|
+
break if finished
|
158
|
+
|
159
|
+
self.class.calibrate_socket_timeout(conn, deadline)
|
160
|
+
end
|
161
|
+
eof = true
|
162
|
+
end
|
163
|
+
end
|
164
|
+
rescue Timeout::Error
|
165
|
+
raise BrandDev::Errors::APITimeoutError.new(url: url, request: req)
|
166
|
+
rescue StandardError
|
167
|
+
raise BrandDev::Errors::APIConnectionError.new(url: url, request: req)
|
168
|
+
end
|
169
|
+
# rubocop:enable Metrics/BlockLength
|
170
|
+
|
171
|
+
conn, _, response = enum.next
|
172
|
+
body = BrandDev::Internal::Util.fused_enum(enum, external: true) do
|
173
|
+
finished = true
|
174
|
+
tap do
|
175
|
+
enum.next
|
176
|
+
rescue StopIteration
|
177
|
+
nil
|
178
|
+
end
|
179
|
+
ensure
|
180
|
+
conn.finish if !eof && conn&.started?
|
181
|
+
closing&.call
|
182
|
+
end
|
183
|
+
[Integer(response.code), response, body]
|
184
|
+
end
|
185
|
+
|
186
|
+
# @api private
|
187
|
+
#
|
188
|
+
# @param size [Integer]
|
189
|
+
def initialize(size: self.class::DEFAULT_MAX_CONNECTIONS)
|
190
|
+
@mutex = Mutex.new
|
191
|
+
@size = size
|
192
|
+
@pools = {}
|
193
|
+
end
|
194
|
+
|
195
|
+
define_sorbet_constant!(:Request) do
|
196
|
+
T.type_alias do
|
197
|
+
{
|
198
|
+
method: Symbol,
|
199
|
+
url: URI::Generic,
|
200
|
+
headers: T::Hash[String, String],
|
201
|
+
body: T.anything,
|
202
|
+
deadline: Float
|
203
|
+
}
|
204
|
+
end
|
205
|
+
end
|
206
|
+
end
|
207
|
+
end
|
208
|
+
end
|
209
|
+
end
|
@@ -0,0 +1,162 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module BrandDev
|
4
|
+
module Internal
|
5
|
+
module Type
|
6
|
+
# @api private
|
7
|
+
#
|
8
|
+
# @abstract
|
9
|
+
#
|
10
|
+
# @generic Elem
|
11
|
+
#
|
12
|
+
# Array of items of a given type.
|
13
|
+
class ArrayOf
|
14
|
+
include BrandDev::Internal::Type::Converter
|
15
|
+
include BrandDev::Internal::Util::SorbetRuntimeSupport
|
16
|
+
|
17
|
+
private_class_method :new
|
18
|
+
|
19
|
+
# @overload [](type_info, spec = {})
|
20
|
+
#
|
21
|
+
# @param type_info [Hash{Symbol=>Object}, Proc, BrandDev::Internal::Type::Converter, Class]
|
22
|
+
#
|
23
|
+
# @param spec [Hash{Symbol=>Object}] .
|
24
|
+
#
|
25
|
+
# @option spec [NilClass, TrueClass, FalseClass, Integer, Float, Symbol] :const
|
26
|
+
#
|
27
|
+
# @option spec [Proc] :enum
|
28
|
+
#
|
29
|
+
# @option spec [Proc] :union
|
30
|
+
#
|
31
|
+
# @option spec [Boolean] :"nil?"
|
32
|
+
#
|
33
|
+
# @return [self]
|
34
|
+
def self.[](...) = new(...)
|
35
|
+
|
36
|
+
# @api public
|
37
|
+
#
|
38
|
+
# @param other [Object]
|
39
|
+
#
|
40
|
+
# @return [Boolean]
|
41
|
+
def ===(other) = other.is_a?(Array) && other.all?(item_type)
|
42
|
+
|
43
|
+
# @api public
|
44
|
+
#
|
45
|
+
# @param other [Object]
|
46
|
+
#
|
47
|
+
# @return [Boolean]
|
48
|
+
def ==(other)
|
49
|
+
# rubocop:disable Layout/LineLength
|
50
|
+
other.is_a?(BrandDev::Internal::Type::ArrayOf) && other.nilable? == nilable? && other.item_type == item_type
|
51
|
+
# rubocop:enable Layout/LineLength
|
52
|
+
end
|
53
|
+
|
54
|
+
# @api public
|
55
|
+
#
|
56
|
+
# @return [Integer]
|
57
|
+
def hash = [self.class, item_type].hash
|
58
|
+
|
59
|
+
# @api private
|
60
|
+
#
|
61
|
+
# @param value [Array<Object>, Object]
|
62
|
+
#
|
63
|
+
# @param state [Hash{Symbol=>Object}] .
|
64
|
+
#
|
65
|
+
# @option state [Boolean, :strong] :strictness
|
66
|
+
#
|
67
|
+
# @option state [Hash{Symbol=>Object}] :exactness
|
68
|
+
#
|
69
|
+
# @option state [Integer] :branched
|
70
|
+
#
|
71
|
+
# @return [Array<Object>, Object]
|
72
|
+
def coerce(value, state:)
|
73
|
+
exactness = state.fetch(:exactness)
|
74
|
+
|
75
|
+
unless value.is_a?(Array)
|
76
|
+
exactness[:no] += 1
|
77
|
+
return value
|
78
|
+
end
|
79
|
+
|
80
|
+
target = item_type
|
81
|
+
exactness[:yes] += 1
|
82
|
+
value
|
83
|
+
.map do |item|
|
84
|
+
case [nilable?, item]
|
85
|
+
in [true, nil]
|
86
|
+
exactness[:yes] += 1
|
87
|
+
nil
|
88
|
+
else
|
89
|
+
BrandDev::Internal::Type::Converter.coerce(target, item, state: state)
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
# @api private
|
95
|
+
#
|
96
|
+
# @param value [Array<Object>, Object]
|
97
|
+
#
|
98
|
+
# @param state [Hash{Symbol=>Object}] .
|
99
|
+
#
|
100
|
+
# @option state [Boolean] :can_retry
|
101
|
+
#
|
102
|
+
# @return [Array<Object>, Object]
|
103
|
+
def dump(value, state:)
|
104
|
+
target = item_type
|
105
|
+
if value.is_a?(Array)
|
106
|
+
value.map do
|
107
|
+
BrandDev::Internal::Type::Converter.dump(target, _1, state: state)
|
108
|
+
end
|
109
|
+
else
|
110
|
+
super
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
# @api private
|
115
|
+
#
|
116
|
+
# @return [Object]
|
117
|
+
def to_sorbet_type
|
118
|
+
T::Array[BrandDev::Internal::Util::SorbetRuntimeSupport.to_sorbet_type(item_type)]
|
119
|
+
end
|
120
|
+
|
121
|
+
# @api private
|
122
|
+
#
|
123
|
+
# @return [generic<Elem>]
|
124
|
+
protected def item_type = @item_type_fn.call
|
125
|
+
|
126
|
+
# @api private
|
127
|
+
#
|
128
|
+
# @return [Boolean]
|
129
|
+
protected def nilable? = @nilable
|
130
|
+
|
131
|
+
# @api private
|
132
|
+
#
|
133
|
+
# @param type_info [Hash{Symbol=>Object}, Proc, BrandDev::Internal::Type::Converter, Class]
|
134
|
+
#
|
135
|
+
# @param spec [Hash{Symbol=>Object}] .
|
136
|
+
#
|
137
|
+
# @option spec [NilClass, TrueClass, FalseClass, Integer, Float, Symbol] :const
|
138
|
+
#
|
139
|
+
# @option spec [Proc] :enum
|
140
|
+
#
|
141
|
+
# @option spec [Proc] :union
|
142
|
+
#
|
143
|
+
# @option spec [Boolean] :"nil?"
|
144
|
+
def initialize(type_info, spec = {})
|
145
|
+
@item_type_fn = BrandDev::Internal::Type::Converter.type_info(type_info || spec)
|
146
|
+
@nilable = spec.fetch(:nil?, false)
|
147
|
+
end
|
148
|
+
|
149
|
+
# @api private
|
150
|
+
#
|
151
|
+
# @param depth [Integer]
|
152
|
+
#
|
153
|
+
# @return [String]
|
154
|
+
def inspect(depth: 0)
|
155
|
+
items = BrandDev::Internal::Type::Converter.inspect(item_type, depth: depth.succ)
|
156
|
+
|
157
|
+
"#{self.class}[#{[items, nilable? ? 'nil' : nil].compact.join(' | ')}]"
|
158
|
+
end
|
159
|
+
end
|
160
|
+
end
|
161
|
+
end
|
162
|
+
end
|