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.
Files changed (102) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +229 -0
  3. data/SECURITY.md +23 -0
  4. data/lib/brand_dev/client.rb +74 -0
  5. data/lib/brand_dev/errors.rb +192 -0
  6. data/lib/brand_dev/file_part.rb +55 -0
  7. data/lib/brand_dev/internal/transport/base_client.rb +555 -0
  8. data/lib/brand_dev/internal/transport/pooled_net_requester.rb +209 -0
  9. data/lib/brand_dev/internal/type/array_of.rb +162 -0
  10. data/lib/brand_dev/internal/type/base_model.rb +484 -0
  11. data/lib/brand_dev/internal/type/base_page.rb +55 -0
  12. data/lib/brand_dev/internal/type/boolean.rb +71 -0
  13. data/lib/brand_dev/internal/type/converter.rb +292 -0
  14. data/lib/brand_dev/internal/type/enum.rb +120 -0
  15. data/lib/brand_dev/internal/type/file_input.rb +103 -0
  16. data/lib/brand_dev/internal/type/hash_of.rb +182 -0
  17. data/lib/brand_dev/internal/type/request_parameters.rb +42 -0
  18. data/lib/brand_dev/internal/type/union.rb +227 -0
  19. data/lib/brand_dev/internal/type/unknown.rb +75 -0
  20. data/lib/brand_dev/internal/util.rb +915 -0
  21. data/lib/brand_dev/internal.rb +20 -0
  22. data/lib/brand_dev/models/brand_identify_from_transaction_params.rb +22 -0
  23. data/lib/brand_dev/models/brand_identify_from_transaction_response.rb +435 -0
  24. data/lib/brand_dev/models/brand_retrieve_by_ticker_params.rb +22 -0
  25. data/lib/brand_dev/models/brand_retrieve_by_ticker_response.rb +432 -0
  26. data/lib/brand_dev/models/brand_retrieve_naics_params.rb +27 -0
  27. data/lib/brand_dev/models/brand_retrieve_naics_response.rb +61 -0
  28. data/lib/brand_dev/models/brand_retrieve_params.rb +91 -0
  29. data/lib/brand_dev/models/brand_retrieve_response.rb +432 -0
  30. data/lib/brand_dev/models/brand_search_params.rb +22 -0
  31. data/lib/brand_dev/models/brand_search_response.rb +35 -0
  32. data/lib/brand_dev/models.rb +51 -0
  33. data/lib/brand_dev/request_options.rb +77 -0
  34. data/lib/brand_dev/resources/brand.rb +130 -0
  35. data/lib/brand_dev/version.rb +5 -0
  36. data/lib/brand_dev.rb +64 -0
  37. data/manifest.yaml +15 -0
  38. data/rbi/brand_dev/client.rbi +49 -0
  39. data/rbi/brand_dev/errors.rbi +162 -0
  40. data/rbi/brand_dev/file_part.rbi +37 -0
  41. data/rbi/brand_dev/internal/transport/base_client.rbi +293 -0
  42. data/rbi/brand_dev/internal/transport/pooled_net_requester.rbi +79 -0
  43. data/rbi/brand_dev/internal/type/array_of.rbi +104 -0
  44. data/rbi/brand_dev/internal/type/base_model.rbi +302 -0
  45. data/rbi/brand_dev/internal/type/base_page.rbi +42 -0
  46. data/rbi/brand_dev/internal/type/boolean.rbi +56 -0
  47. data/rbi/brand_dev/internal/type/converter.rbi +162 -0
  48. data/rbi/brand_dev/internal/type/enum.rbi +82 -0
  49. data/rbi/brand_dev/internal/type/file_input.rbi +59 -0
  50. data/rbi/brand_dev/internal/type/hash_of.rbi +104 -0
  51. data/rbi/brand_dev/internal/type/request_parameters.rbi +29 -0
  52. data/rbi/brand_dev/internal/type/union.rbi +116 -0
  53. data/rbi/brand_dev/internal/type/unknown.rbi +56 -0
  54. data/rbi/brand_dev/internal/util.rbi +485 -0
  55. data/rbi/brand_dev/internal.rbi +16 -0
  56. data/rbi/brand_dev/models/brand_identify_from_transaction_params.rbi +46 -0
  57. data/rbi/brand_dev/models/brand_identify_from_transaction_response.rbi +981 -0
  58. data/rbi/brand_dev/models/brand_retrieve_by_ticker_params.rbi +43 -0
  59. data/rbi/brand_dev/models/brand_retrieve_by_ticker_response.rbi +976 -0
  60. data/rbi/brand_dev/models/brand_retrieve_naics_params.rbi +44 -0
  61. data/rbi/brand_dev/models/brand_retrieve_naics_response.rbi +127 -0
  62. data/rbi/brand_dev/models/brand_retrieve_params.rbi +344 -0
  63. data/rbi/brand_dev/models/brand_retrieve_response.rbi +949 -0
  64. data/rbi/brand_dev/models/brand_search_params.rbi +40 -0
  65. data/rbi/brand_dev/models/brand_search_response.rbi +63 -0
  66. data/rbi/brand_dev/models.rbi +14 -0
  67. data/rbi/brand_dev/request_options.rbi +59 -0
  68. data/rbi/brand_dev/resources/brand.rbi +89 -0
  69. data/rbi/brand_dev/version.rbi +5 -0
  70. data/sig/brand_dev/client.rbs +26 -0
  71. data/sig/brand_dev/errors.rbs +101 -0
  72. data/sig/brand_dev/file_part.rbs +21 -0
  73. data/sig/brand_dev/internal/transport/base_client.rbs +131 -0
  74. data/sig/brand_dev/internal/transport/pooled_net_requester.rbs +45 -0
  75. data/sig/brand_dev/internal/type/array_of.rbs +48 -0
  76. data/sig/brand_dev/internal/type/base_model.rbs +102 -0
  77. data/sig/brand_dev/internal/type/base_page.rbs +24 -0
  78. data/sig/brand_dev/internal/type/boolean.rbs +26 -0
  79. data/sig/brand_dev/internal/type/converter.rbs +56 -0
  80. data/sig/brand_dev/internal/type/enum.rbs +32 -0
  81. data/sig/brand_dev/internal/type/file_input.rbs +25 -0
  82. data/sig/brand_dev/internal/type/hash_of.rbs +48 -0
  83. data/sig/brand_dev/internal/type/request_parameters.rbs +17 -0
  84. data/sig/brand_dev/internal/type/union.rbs +52 -0
  85. data/sig/brand_dev/internal/type/unknown.rbs +26 -0
  86. data/sig/brand_dev/internal/util.rbs +185 -0
  87. data/sig/brand_dev/internal.rbs +9 -0
  88. data/sig/brand_dev/models/brand_identify_from_transaction_params.rbs +24 -0
  89. data/sig/brand_dev/models/brand_identify_from_transaction_response.rbs +418 -0
  90. data/sig/brand_dev/models/brand_retrieve_by_ticker_params.rbs +23 -0
  91. data/sig/brand_dev/models/brand_retrieve_by_ticker_response.rbs +418 -0
  92. data/sig/brand_dev/models/brand_retrieve_naics_params.rbs +23 -0
  93. data/sig/brand_dev/models/brand_retrieve_naics_response.rbs +61 -0
  94. data/sig/brand_dev/models/brand_retrieve_params.rbs +148 -0
  95. data/sig/brand_dev/models/brand_retrieve_response.rbs +418 -0
  96. data/sig/brand_dev/models/brand_search_params.rbs +23 -0
  97. data/sig/brand_dev/models/brand_search_response.rbs +29 -0
  98. data/sig/brand_dev/models.rbs +11 -0
  99. data/sig/brand_dev/request_options.rbs +34 -0
  100. data/sig/brand_dev/resources/brand.rbs +33 -0
  101. data/sig/brand_dev/version.rbs +3 -0
  102. 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