altertable-lakehouse 0.4.2 → 0.5.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2aa80cb382f3d5785418303b107e30f5e9fbd4a25f5d9e93c96f952a7fc1eb93
4
- data.tar.gz: b774968941cd9af5ce99a24053d6c4f991e0357e90a45c655a7b4717fe9fcf78
3
+ metadata.gz: 18b992ed254a6445172a0b19f560afbb7380da7109a0c15fcc24dd8cccdca195
4
+ data.tar.gz: 25ebe5ea1a4e570ad391af48df2bc5a43d87dd46570f702888aefd12be8f9597
5
5
  SHA512:
6
- metadata.gz: 734bd3df2c06e8c8667ff1a82fef0e4a69ec6ae947f42b29a45bc82c935d3ffcbeea23cd2f491d887da65e347d378b6983ee897ff2cb2433c2efa134d54e15e3
7
- data.tar.gz: 12e9c4abf22319aeda9201c6e96e481ce8fc736b3021c2f9204dec50d1d93d6c3c6fdfa9ef32597d3a78e0aa4fcab2a541117b8a820de8c37c1f122d5c52f30b
6
+ metadata.gz: b08a506dcf3292f1f85400149fb40ea4c9a59183c51157c752039467415bc8fa982c8a298fbef1e7cc7f12e12b1a8a2cbde9736633531495004c8a9b3999a20b
7
+ data.tar.gz: bd4fcde8127c172009aee8d146eed5601156dc8a9d3206ee9c38c317afa9597d68c113183b6f9fdb44296ab0d4202bb99b690cf30bb9c76bb91f9fde498dfe48
@@ -1,3 +1,3 @@
1
1
  {
2
- ".": "0.4.2"
2
+ ".": "0.5.0"
3
3
  }
data/CHANGELOG.md CHANGED
@@ -2,6 +2,13 @@
2
2
 
3
3
  All notable changes to this project will be documented in this file.
4
4
 
5
+ ## [0.5.0](https://github.com/altertable-ai/altertable-lakehouse-ruby/compare/altertable-lakehouse/v0.4.2...altertable-lakehouse/v0.5.0) (2026-05-28)
6
+
7
+
8
+ ### Features
9
+
10
+ * add optional headers to all methods ([#37](https://github.com/altertable-ai/altertable-lakehouse-ruby/issues/37)) ([34e3c2d](https://github.com/altertable-ai/altertable-lakehouse-ruby/commit/34e3c2d943742a5f2a3f6a309154a8ee9aa84dc7))
11
+
5
12
  ## [0.4.2](https://github.com/altertable-ai/altertable-lakehouse-ruby/compare/altertable-lakehouse/v0.4.1...altertable-lakehouse/v0.4.2) (2026-05-27)
6
13
 
7
14
 
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- altertable-lakehouse (0.4.2)
4
+ altertable-lakehouse (0.5.0)
5
5
  base64
6
6
 
7
7
  GEM
@@ -96,6 +96,7 @@ GEM
96
96
  sorbet-static (= 0.6.12997)
97
97
  sorbet-runtime (0.6.12997)
98
98
  sorbet-static (0.6.12997-universal-darwin)
99
+ sorbet-static (0.6.12997-x86_64-linux)
99
100
  sorbet-static-and-runtime (0.6.12997)
100
101
  sorbet (= 0.6.12997)
101
102
  sorbet-runtime (= 0.6.12997)
@@ -11,7 +11,7 @@ module Altertable
11
11
  DEFAULT_BASE_URL = "https://api.altertable.ai"
12
12
  DEFAULT_TIMEOUT = 10
13
13
 
14
- def initialize(username: nil, password: nil, basic_auth_token: nil, base_url: nil, timeout: nil, user_agent: nil, adapter: nil)
14
+ def initialize(username: nil, password: nil, basic_auth_token: nil, base_url: nil, timeout: nil, user_agent: nil, adapter: nil, headers: {})
15
15
  # 1. Try passed basic_auth_token
16
16
  # 2. Try passed username/password
17
17
  # 3. Try ENV["ALTERTABLE_BASIC_AUTH_TOKEN"]
@@ -33,39 +33,39 @@ module Altertable
33
33
  @timeout = timeout || DEFAULT_TIMEOUT
34
34
  @user_agent = user_agent ? "AltertableRuby/#{VERSION} #{user_agent}" : "AltertableRuby/#{VERSION}"
35
35
 
36
- headers = {
36
+ default_headers = {
37
37
  "Authorization" => @auth_header,
38
38
  "User-Agent" => @user_agent,
39
39
  "Content-Type" => "application/json"
40
40
  }
41
41
 
42
- @adapter = select_adapter(adapter, base_url: @base_url, timeout: @timeout, headers: headers)
42
+ @adapter = select_adapter(adapter, base_url: @base_url, timeout: @timeout, headers: default_headers.merge(headers))
43
43
  end
44
44
 
45
45
  # POST /append
46
- def append(catalog:, schema:, table:, payload:, sync: nil)
46
+ def append(catalog:, schema:, table:, payload:, sync: nil, headers: {})
47
47
  params = { catalog: catalog, schema: schema, table: table }
48
48
  params[:sync] = sync unless sync.nil?
49
49
  req = Models::AppendRequest.new(payload)
50
- resp = request(:post, "/append", body: req.to_h, query: params)
50
+ resp = request(:post, "/append", body: req.to_h, query: params, headers: headers)
51
51
  Models::AppendResponse.from_h(resp)
52
52
  end
53
53
 
54
54
  # GET /tasks/:task_id
55
- def get_task(task_id)
56
- resp = request(:get, "/tasks/#{task_id}")
55
+ def get_task(task_id, headers: {})
56
+ resp = request(:get, "/tasks/#{task_id}", headers: headers)
57
57
  Models::TaskResponse.from_h(resp)
58
58
  end
59
59
 
60
60
  # POST /query (streamed)
61
- def query(statement:, **options)
61
+ def query(statement:, headers: {}, **options)
62
62
  req_body = Models::QueryRequest.new(statement: statement, **options).to_h.to_json
63
63
 
64
64
  enum = Enumerator.new do |yielder|
65
65
  buffer = ""
66
66
 
67
67
  # Use adapter's stream capability
68
- resp = @adapter.post("/query", body: req_body) do |chunk, _|
68
+ resp = @adapter.post("/query", body: req_body, headers: headers) do |chunk, _|
69
69
  buffer << chunk
70
70
  end
71
71
 
@@ -76,8 +76,8 @@ module Altertable
76
76
  end
77
77
 
78
78
  # POST /query (accumulated)
79
- def query_all(statement:, **options)
80
- result = query(statement: statement, **options)
79
+ def query_all(statement:, headers: {}, **options)
80
+ result = query(statement: statement, headers: headers, **options)
81
81
  rows = result.to_a # Accumulate
82
82
  {
83
83
  metadata: result.metadata,
@@ -87,7 +87,7 @@ module Altertable
87
87
  end
88
88
 
89
89
  # POST /upload
90
- def upload(catalog:, schema:, table:, format:, mode:, file_io:, primary_key: nil)
90
+ def upload(catalog:, schema:, table:, format:, mode:, file_io:, primary_key: nil, headers: {})
91
91
  params = {
92
92
  catalog: catalog,
93
93
  schema: schema,
@@ -99,36 +99,36 @@ module Altertable
99
99
 
100
100
  body = file_io.respond_to?(:read) ? file_io.read : file_io
101
101
 
102
- resp = @adapter.post("/upload", body: body, params: params, headers: { "Content-Type" => "application/octet-stream" })
102
+ resp = @adapter.post("/upload", body: body, params: params, headers: headers.merge("Content-Type" => "application/octet-stream"))
103
103
  handle_response(resp)
104
104
  end
105
105
 
106
106
  # GET /query/:query_id
107
- def get_query(query_id)
108
- resp = request(:get, "/query/#{query_id}")
107
+ def get_query(query_id, headers: {})
108
+ resp = request(:get, "/query/#{query_id}", headers: headers)
109
109
  Models::QueryLogResponse.from_h(resp)
110
110
  end
111
111
 
112
112
  # DELETE /query/:query_id
113
- def cancel_query(query_id, session_id:)
114
- resp = request(:delete, "/query/#{query_id}", query: { session_id: session_id })
113
+ def cancel_query(query_id, session_id:, headers: {})
114
+ resp = request(:delete, "/query/#{query_id}", query: { session_id: session_id }, headers: headers)
115
115
  Models::CancelQueryResponse.from_h(resp)
116
116
  end
117
117
 
118
118
  # POST /validate
119
- def validate(statement:, catalog: nil, schema: nil, session_id: nil)
119
+ def validate(statement:, catalog: nil, schema: nil, session_id: nil, headers: {})
120
120
  req = Models::ValidateRequest.new(
121
121
  statement: statement,
122
122
  catalog: catalog,
123
123
  schema: schema,
124
124
  session_id: session_id
125
125
  )
126
- resp = request(:post, "/validate", body: req.to_h)
126
+ resp = request(:post, "/validate", body: req.to_h, headers: headers)
127
127
  Models::ValidateResponse.from_h(resp)
128
128
  end
129
129
 
130
130
  # POST /autocomplete
131
- def autocomplete(statement:, catalog: nil, schema: nil, session_id: nil, max_suggestions: nil)
131
+ def autocomplete(statement:, catalog: nil, schema: nil, session_id: nil, max_suggestions: nil, headers: {})
132
132
  req = Models::AutocompleteRequest.new(
133
133
  statement: statement,
134
134
  catalog: catalog,
@@ -136,12 +136,12 @@ module Altertable
136
136
  session_id: session_id,
137
137
  max_suggestions: max_suggestions
138
138
  )
139
- resp = request(:post, "/autocomplete", body: req.to_h)
139
+ resp = request(:post, "/autocomplete", body: req.to_h, headers: headers)
140
140
  Models::AutocompleteResponse.from_h(resp)
141
141
  end
142
142
 
143
143
  # POST /explain
144
- def explain(statement:, catalog: nil, schema: nil, session_id: nil, include_plan: nil)
144
+ def explain(statement:, catalog: nil, schema: nil, session_id: nil, include_plan: nil, headers: {})
145
145
  req = Models::ExplainRequest.new(
146
146
  statement: statement,
147
147
  catalog: catalog,
@@ -149,7 +149,7 @@ module Altertable
149
149
  session_id: session_id,
150
150
  include_plan: include_plan
151
151
  )
152
- resp = request(:post, "/explain", body: req.to_h)
152
+ resp = request(:post, "/explain", body: req.to_h, headers: headers)
153
153
  Models::ExplainResponse.from_h(resp)
154
154
  end
155
155
 
@@ -182,8 +182,13 @@ module Altertable
182
182
  false
183
183
  end
184
184
 
185
- def request(method, path, body: nil, query: nil)
186
- resp = @adapter.send(method, path, body: body.is_a?(Hash) ? body.to_json : body, params: query || {})
185
+ def request(method, path, body: nil, query: nil, headers: {})
186
+ resp = @adapter.send(
187
+ method, path,
188
+ body: body.is_a?(Hash) ? body.to_json : body,
189
+ params: query || {},
190
+ headers: headers
191
+ )
187
192
  handle_response(resp)
188
193
  end
189
194
 
@@ -1,5 +1,5 @@
1
1
  module Altertable
2
2
  module Lakehouse
3
- VERSION = "0.4.2"
3
+ VERSION = "0.5.0"
4
4
  end
5
5
  end
@@ -62,10 +62,11 @@ module Altertable
62
62
  base_url: T.nilable(String),
63
63
  timeout: T.nilable(T.any(Integer, Float)),
64
64
  user_agent: T.nilable(String),
65
- adapter: T.nilable(Symbol)
65
+ adapter: T.nilable(Symbol),
66
+ headers: T::Hash[String, String]
66
67
  ).void
67
68
  end
68
- def initialize(username: nil, password: nil, basic_auth_token: nil, base_url: nil, timeout: nil, user_agent: nil, adapter: nil); end
69
+ def initialize(username: nil, password: nil, basic_auth_token: nil, base_url: nil, timeout: nil, user_agent: nil, adapter: nil, headers: {}); end
69
70
 
70
71
  sig do
71
72
  params(
@@ -73,19 +74,20 @@ module Altertable
73
74
  schema: String,
74
75
  table: String,
75
76
  payload: T.any(T::Hash[T.untyped, T.untyped], T::Array[T::Hash[T.untyped, T.untyped]]),
76
- sync: T.nilable(T::Boolean)
77
+ sync: T.nilable(T::Boolean),
78
+ headers: T::Hash[String, String]
77
79
  ).returns(::Altertable::Lakehouse::Models::AppendResponse)
78
80
  end
79
- def append(catalog:, schema:, table:, payload:, sync: nil); end
81
+ def append(catalog:, schema:, table:, payload:, sync: nil, headers: {}); end
80
82
 
81
- sig { params(task_id: String).returns(::Altertable::Lakehouse::Models::TaskResponse) }
82
- def get_task(task_id); end
83
+ sig { params(task_id: String, headers: T::Hash[String, String]).returns(::Altertable::Lakehouse::Models::TaskResponse) }
84
+ def get_task(task_id, headers: {}); end
83
85
 
84
- sig { params(statement: String, options: T.untyped).returns(::Altertable::Lakehouse::QueryResult) }
85
- def query(statement:, **options); end
86
+ sig { params(statement: String, headers: T::Hash[String, String], options: T.untyped).returns(::Altertable::Lakehouse::QueryResult) }
87
+ def query(statement:, headers: {}, **options); end
86
88
 
87
- sig { params(statement: String, options: T.untyped).returns(T::Hash[Symbol, T.untyped]).returns(T::Hash[Symbol, T.untyped]) }
88
- def query_all(statement:, **options); end
89
+ sig { params(statement: String, headers: T::Hash[String, String], options: T.untyped).returns(T::Hash[Symbol, T.untyped]).returns(T::Hash[Symbol, T.untyped]) }
90
+ def query_all(statement:, headers: {}, **options); end
89
91
 
90
92
  sig do
91
93
  params(
@@ -95,26 +97,28 @@ module Altertable
95
97
  format: String,
96
98
  mode: String,
97
99
  file_io: T.untyped,
98
- primary_key: T.nilable(String)
100
+ primary_key: T.nilable(String),
101
+ headers: T::Hash[String, String]
99
102
  ).returns(T.untyped)
100
103
  end
101
- def upload(catalog:, schema:, table:, format:, mode:, file_io:, primary_key: nil); end
104
+ def upload(catalog:, schema:, table:, format:, mode:, file_io:, primary_key: nil, headers: {}); end
102
105
 
103
- sig { params(query_id: String).returns(::Altertable::Lakehouse::Models::QueryLogResponse) }
104
- def get_query(query_id); end
106
+ sig { params(query_id: String, headers: T::Hash[String, String]).returns(::Altertable::Lakehouse::Models::QueryLogResponse) }
107
+ def get_query(query_id, headers: {}); end
105
108
 
106
- sig { params(query_id: String, session_id: String).returns(::Altertable::Lakehouse::Models::CancelQueryResponse) }
107
- def cancel_query(query_id, session_id:); end
109
+ sig { params(query_id: String, session_id: String, headers: T::Hash[String, String]).returns(::Altertable::Lakehouse::Models::CancelQueryResponse) }
110
+ def cancel_query(query_id, session_id:, headers: {}); end
108
111
 
109
112
  sig do
110
113
  params(
111
114
  statement: String,
112
115
  catalog: T.nilable(String),
113
116
  schema: T.nilable(String),
114
- session_id: T.nilable(String)
117
+ session_id: T.nilable(String),
118
+ headers: T::Hash[String, String]
115
119
  ).returns(::Altertable::Lakehouse::Models::ValidateResponse)
116
120
  end
117
- def validate(statement:, catalog: nil, schema: nil, session_id: nil); end
121
+ def validate(statement:, catalog: nil, schema: nil, session_id: nil, headers: {}); end
118
122
 
119
123
  sig do
120
124
  params(
@@ -122,10 +126,11 @@ module Altertable
122
126
  catalog: T.nilable(String),
123
127
  schema: T.nilable(String),
124
128
  session_id: T.nilable(String),
125
- max_suggestions: T.nilable(Integer)
129
+ max_suggestions: T.nilable(Integer),
130
+ headers: T::Hash[String, String]
126
131
  ).returns(::Altertable::Lakehouse::Models::AutocompleteResponse)
127
132
  end
128
- def autocomplete(statement:, catalog: nil, schema: nil, session_id: nil, max_suggestions: nil); end
133
+ def autocomplete(statement:, catalog: nil, schema: nil, session_id: nil, max_suggestions: nil, headers: {}); end
129
134
 
130
135
  sig do
131
136
  params(
@@ -133,10 +138,11 @@ module Altertable
133
138
  catalog: T.nilable(String),
134
139
  schema: T.nilable(String),
135
140
  session_id: T.nilable(String),
136
- include_plan: T.nilable(T::Boolean)
141
+ include_plan: T.nilable(T::Boolean),
142
+ headers: T::Hash[String, String]
137
143
  ).returns(::Altertable::Lakehouse::Models::ExplainResponse)
138
144
  end
139
- def explain(statement:, catalog: nil, schema: nil, session_id: nil, include_plan: nil); end
145
+ def explain(statement:, catalog: nil, schema: nil, session_id: nil, include_plan: nil, headers: {}); end
140
146
 
141
147
  private
142
148
 
@@ -151,10 +157,11 @@ module Altertable
151
157
  method: Symbol,
152
158
  path: String,
153
159
  body: T.untyped,
154
- query: T.nilable(T::Hash[T.any(Symbol, String), T.untyped])
160
+ query: T.nilable(T::Hash[T.any(Symbol, String), T.untyped]),
161
+ headers: T::Hash[String, String]
155
162
  ).returns(T.untyped)
156
163
  end
157
- def request(method, path, body: nil, query: nil); end
164
+ def request(method, path, body: nil, query: nil, headers: {}); end
158
165
 
159
166
  sig { params(resp: ::Altertable::Lakehouse::Adapters::Response, buffer: String, yielder: Enumerator::Yielder).void }
160
167
  def handle_stream_response(resp, buffer, yielder); end
@@ -17,7 +17,8 @@ module Altertable
17
17
  ?base_url: String?,
18
18
  ?timeout: Integer | Float?,
19
19
  ?user_agent: String?,
20
- ?adapter: Symbol?
20
+ ?adapter: Symbol?,
21
+ ?headers: ::Hash[String, String]
21
22
  ) -> void
22
23
 
23
24
  def append: (
@@ -25,14 +26,15 @@ module Altertable
25
26
  schema: String,
26
27
  table: String,
27
28
  payload: ::Hash[untyped, untyped] | ::Array[::Hash[untyped, untyped]],
28
- ?sync: bool?
29
+ ?sync: bool?,
30
+ ?headers: ::Hash[String, String]
29
31
  ) -> Models::AppendResponse
30
32
 
31
- def get_task: (String task_id) -> Models::TaskResponse
33
+ def get_task: (String task_id, ?headers: ::Hash[String, String]) -> Models::TaskResponse
32
34
 
33
- def query: (statement: String, **untyped options) -> QueryResult
35
+ def query: (statement: String, ?headers: ::Hash[String, String], **untyped options) -> QueryResult
34
36
 
35
- def query_all: (statement: String, **untyped options) -> ::Hash[Symbol, untyped]
37
+ def query_all: (statement: String, ?headers: ::Hash[String, String], **untyped options) -> ::Hash[Symbol, untyped]
36
38
 
37
39
  def upload: (
38
40
  catalog: String,
@@ -41,18 +43,20 @@ module Altertable
41
43
  format: String,
42
44
  mode: String,
43
45
  file_io: untyped,
44
- ?primary_key: String?
46
+ ?primary_key: String?,
47
+ ?headers: ::Hash[String, String]
45
48
  ) -> untyped
46
49
 
47
- def get_query: (String query_id) -> Models::QueryLogResponse
50
+ def get_query: (String query_id, ?headers: ::Hash[String, String]) -> Models::QueryLogResponse
48
51
 
49
- def cancel_query: (String query_id, session_id: String) -> Models::CancelQueryResponse
52
+ def cancel_query: (String query_id, session_id: String, ?headers: ::Hash[String, String]) -> Models::CancelQueryResponse
50
53
 
51
54
  def validate: (
52
55
  statement: String,
53
56
  ?catalog: String?,
54
57
  ?schema: String?,
55
- ?session_id: String?
58
+ ?session_id: String?,
59
+ ?headers: ::Hash[String, String]
56
60
  ) -> Models::ValidateResponse
57
61
 
58
62
  def autocomplete: (
@@ -60,7 +64,8 @@ module Altertable
60
64
  ?catalog: String?,
61
65
  ?schema: String?,
62
66
  ?session_id: String?,
63
- ?max_suggestions: Integer?
67
+ ?max_suggestions: Integer?,
68
+ ?headers: ::Hash[String, String]
64
69
  ) -> Models::AutocompleteResponse
65
70
 
66
71
  def explain: (
@@ -68,14 +73,21 @@ module Altertable
68
73
  ?catalog: String?,
69
74
  ?schema: String?,
70
75
  ?session_id: String?,
71
- ?include_plan: bool?
76
+ ?include_plan: bool?,
77
+ ?headers: ::Hash[String, String]
72
78
  ) -> Models::ExplainResponse
73
79
 
74
80
  private
75
81
 
76
82
  def select_adapter: (Symbol? name, untyped options) -> untyped
77
83
  def try_require: (String gem_name) -> bool
78
- def request: (Symbol method, String path, ?body: untyped, ?query: ::Hash[Symbol | String, untyped]?) -> untyped
84
+ def request: (
85
+ Symbol method,
86
+ String path,
87
+ ?body: untyped,
88
+ ?query: ::Hash[Symbol | String, untyped]?,
89
+ ?headers: ::Hash[String, String]
90
+ ) -> untyped
79
91
  def handle_stream_response: (Adapters::Response resp, String buffer, Enumerator::Yielder yielder) -> void
80
92
  def handle_response: (Adapters::Response resp) -> untyped
81
93
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: altertable-lakehouse
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.2
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Altertable AI