Skip to content

Commit 4eb40c0

Browse files
committed
merge: merge origin/main into feat/gapic-centralization-api-core
2 parents 5889da8 + 7823422 commit 4eb40c0

334 files changed

Lines changed: 117485 additions & 14828 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.release-please-individual-manifest.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
{
2-
"packages/bigframes": "2.45.0",
2+
"packages/bigframes": "2.46.0",
33
"packages/google-crc32c": "1.8.0",
44
"packages/pandas-gbq": "0.35.0",
55
"packages/sqlalchemy-bigquery": "1.17.0"

librarian.yaml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,8 @@ version: v0.26.0
1616
repo: googleapis/google-cloud-python
1717
sources:
1818
googleapis:
19-
commit: 99f54e6513f09d8df1707a6c553b0a3c6ef9b5fb
20-
sha256: 7cee15fe1ae76a16aaf70425c4380a3a0fcbfeb4ea8e30c934c43f5cd54b9657
19+
commit: fe04226e3d76435acbfd3ffb51f6771740e1fb5b
20+
sha256: e99c641a9c5525394de43c762b9db50c3ada1f219d6dbdba594ae992fbe1d838
2121
default:
2222
output: packages
2323
tag_format: '{name}-v{version}'
@@ -58,7 +58,7 @@ default:
5858
library_type: GAPIC_AUTO
5959
libraries:
6060
- name: bigframes
61-
version: 2.45.0
61+
version: 2.46.0
6262
python:
6363
library_type: INTEGRATION
6464
- name: bigquery-magics

packages/bigframes/CHANGELOG.md

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,30 @@
44

55
[1]: https://pypi.org/project/bigframes/#history
66

7+
## [2.46.0](https://github.com/googleapis/google-cloud-python/compare/bigframes-v2.45.0...bigframes-v2.46.0) (2026-07-16)
8+
9+
10+
### Features
11+
12+
* **bigframes:** Support groupby.agg/transform with udf transpiler ([#17613](https://github.com/googleapis/google-cloud-python/issues/17613)) ([cae94f9](https://github.com/googleapis/google-cloud-python/commit/cae94f99121d7708671a35acf82616cfe378cccb))
13+
* **bigframes:** support offset-based column access via iloc ([#17367](https://github.com/googleapis/google-cloud-python/issues/17367)) ([4253fab](https://github.com/googleapis/google-cloud-python/commit/4253fab07ccdb2b94e247f8dade793828754b88b))
14+
15+
16+
### Bug Fixes
17+
18+
* **bigframes:** Fix sqlglot backend regressions ([#17655](https://github.com/googleapis/google-cloud-python/issues/17655)) ([91f93bc](https://github.com/googleapis/google-cloud-python/commit/91f93bcd7b71b6cea62f506ed684500cec1eb6bb))
19+
* bump gradio from 6.15.0 to 6.15.1 in /packages/bigframes ([#17712](https://github.com/googleapis/google-cloud-python/issues/17712)) ([a85d59f](https://github.com/googleapis/google-cloud-python/commit/a85d59f39998d94cbac8d5e98547f18b3cc5e5be))
20+
* bump mistune from 3.2.1 to 3.3.0 in /packages/bigframes ([#17694](https://github.com/googleapis/google-cloud-python/issues/17694)) ([e5f7fef](https://github.com/googleapis/google-cloud-python/commit/e5f7fef31c2bbe5f559f4c79fdaf4ebcf6e1bd3f))
21+
* bump soupsieve from 2.7 to 2.8.4 in /packages/bigframes ([#17695](https://github.com/googleapis/google-cloud-python/issues/17695)) ([635da34](https://github.com/googleapis/google-cloud-python/commit/635da3453b2ba78b8abea43c554a055257f33aa1))
22+
* bump transformers from 5.3.0 to 5.5.0 in /packages/bigframes ([#17700](https://github.com/googleapis/google-cloud-python/issues/17700)) ([4b049c4](https://github.com/googleapis/google-cloud-python/commit/4b049c4eb8dc1ec91320b55fe515c339cd448af3))
23+
* emit bracketed inline array syntax for scalar subquery expressions ([#17716](https://github.com/googleapis/google-cloud-python/issues/17716)) ([ce5fd50](https://github.com/googleapis/google-cloud-python/commit/ce5fd500b68c16f56ea8066d8a6fa4b0b8d92081))
24+
25+
26+
### Documentation
27+
28+
* make landing page quickstart runnable ([fc423c8](https://github.com/googleapis/google-cloud-python/commit/fc423c809cc80168f45fee795d5db5dc7a571fb1))
29+
* make landing page quickstart runnable ([#17687](https://github.com/googleapis/google-cloud-python/issues/17687)) ([fc423c8](https://github.com/googleapis/google-cloud-python/commit/fc423c809cc80168f45fee795d5db5dc7a571fb1))
30+
731
## [2.45.0](https://github.com/googleapis/google-cloud-python/compare/bigframes-v2.44.0...bigframes-v2.45.0) (2026-07-08)
832

933

packages/bigframes/bigframes/display/table_widget_angular/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
"@angular/build": "^21.2.16",
2626
"@angular/cli": "^21.2.16",
2727
"@angular/compiler-cli": "^21.2.0",
28-
"esbuild": "^0.20.0",
28+
"esbuild": "^0.28.0",
2929
"jsdom": "^28.0.0",
3030
"prettier": "^3.8.1",
3131
"typescript": "~5.9.2",

packages/bigframes/bigframes/version.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
# See the License for the specific language governing permissions and
1313
# limitations under the License.
1414

15-
__version__ = "2.45.0"
15+
__version__ = "2.46.0"
1616

1717
# {x-release-please-start-date}
1818
__release_date__ = "2026-06-12"
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
SELECT
2+
[
3+
COALESCE(
4+
(
5+
SELECT
6+
COALESCE(SUM(bf_arr_reduce_uid), 0)
7+
FROM UNNEST(`float_list_col`) AS bf_arr_reduce_uid
8+
),
9+
0.0
10+
)
11+
] AS `arr_subquery_coalesce`
12+
FROM `bigframes-dev`.`sqlglot_test`.`repeated_types` AS `bft_0`

packages/bigframes/tests/unit/core/compile/sqlglot/expressions/test_array_ops.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,3 +104,14 @@ def test_to_array_op(scalar_types_df: bpd.DataFrame, snapshot):
104104

105105
sql = utils._apply_ops_to_sql(bf_df, list(ops_map.values()), list(ops_map.keys()))
106106
snapshot.assert_match(sql, "out.sql")
107+
108+
109+
def test_to_array_with_subquery_expression(repeated_types_df: bpd.DataFrame, snapshot):
110+
reduced = ops.ArrayReduceOp(agg_ops.SumOp()).as_expr("float_list_col")
111+
coalesced_reduced = ops.coalesce_op.as_expr(reduced, expression.const(0.0))
112+
array_expr = ops.ToArrayOp().as_expr(coalesced_reduced)
113+
114+
sql = utils._apply_ops_to_sql(
115+
repeated_types_df, [array_expr], ["arr_subquery_coalesce"]
116+
)
117+
snapshot.assert_match(sql, "out.sql")

packages/bigframes/tests/unit/display/test_anywidget.py

Lines changed: 57 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -45,11 +45,13 @@ def test_navigation_to_invalid_page_resets_to_valid_page_without_deadlock():
4545
mock_df._block = mock_block
4646

4747
# We mock _initial_load to avoid complex setup
48-
with mock.patch.object(TableWidget, "_initial_load"):
49-
with bigframes.option_context(
48+
with (
49+
mock.patch.object(TableWidget, "_initial_load"),
50+
bigframes.option_context(
5051
"display.render_mode", "anywidget", "display.max_rows", 10
51-
):
52-
widget = TableWidget(mock_df)
52+
),
53+
):
54+
widget = TableWidget(mock_df)
5355

5456
# Simulate "loaded data but unknown total rows" state
5557
widget.page_size = 10
@@ -179,11 +181,11 @@ def test_page_size_change_resets_sort(mock_df):
179181

180182
def test_cell_execution_count_propagation(mock_df):
181183
"""Test that the captured cell_execution_count is propagated to to_pandas_batches."""
182-
with mock.patch(
183-
"bigframes.core.utils.get_ipython_execution_count", return_value=42
184+
with (
185+
mock.patch("bigframes.core.utils.get_ipython_execution_count", return_value=42),
186+
bigframes.option_context("display.render_mode", "anywidget"),
184187
):
185-
with bigframes.option_context("display.render_mode", "anywidget"):
186-
widget = TableWidget(mock_df)
188+
widget = TableWidget(mock_df)
187189

188190
assert widget._cell_execution_count == 42
189191

@@ -274,19 +276,23 @@ def __init__(self):
274276

275277

276278
def test_init_raises_if_anywidget_not_installed():
277-
with mock.patch("bigframes.display.anywidget._ANYWIDGET_INSTALLED", False):
278-
with pytest.raises(ImportError):
279-
from bigframes.display.anywidget import TableWidget
279+
with (
280+
mock.patch("bigframes.display.anywidget._ANYWIDGET_INSTALLED", False),
281+
pytest.raises(ImportError),
282+
):
283+
from bigframes.display.anywidget import TableWidget
280284

281-
TableWidget(mock.Mock())
285+
TableWidget(mock.Mock())
282286

283287

284288
def test_init_initializes_attributes(mock_df_deferred):
285289
from bigframes.display.anywidget import TableWidget
286290

287-
with bigframes.option_context("display.render_mode", "anywidget"):
288-
with mock.patch.object(TableWidget, "_initial_load"):
289-
widget = TableWidget(mock_df_deferred)
291+
with (
292+
bigframes.option_context("display.render_mode", "anywidget"),
293+
mock.patch.object(TableWidget, "_initial_load"),
294+
):
295+
widget = TableWidget(mock_df_deferred)
290296

291297
assert widget._dataframe is mock_df_deferred
292298
assert widget.page == 0
@@ -328,19 +334,21 @@ def test_validate_page_clamping(mock_df_deferred):
328334
def test_validate_page_size(mock_df_deferred):
329335
from bigframes.display.anywidget import TableWidget
330336

331-
with bigframes.option_context("display.render_mode", "anywidget"):
332-
with mock.patch.object(TableWidget, "_initial_load"):
333-
widget = TableWidget(mock_df_deferred)
337+
with (
338+
bigframes.option_context("display.render_mode", "anywidget"),
339+
mock.patch.object(TableWidget, "_initial_load"),
340+
):
341+
widget = TableWidget(mock_df_deferred)
334342

335-
widget.page_size = 50
336-
assert widget.page_size == 50
343+
widget.page_size = 50
344+
assert widget.page_size == 50
337345

338-
original_size = widget.page_size
339-
widget.page_size = -5
340-
assert widget.page_size == original_size
346+
original_size = widget.page_size
347+
widget.page_size = -5
348+
assert widget.page_size == original_size
341349

342-
widget.page_size = 10000
343-
assert widget.page_size == 1000
350+
widget.page_size = 10000
351+
assert widget.page_size == 1000
344352

345353

346354
def test_page_size_change_resets_page_and_sort(mock_df_deferred):
@@ -373,14 +381,16 @@ def test_page_size_change_resets_batches(mock_df_deferred):
373381
def test_sort_change_resets_batches(mock_df_deferred):
374382
from bigframes.display.anywidget import TableWidget
375383

376-
with bigframes.option_context("display.render_mode", "anywidget"):
377-
with mock.patch.object(TableWidget, "_initial_load"):
378-
widget = TableWidget(mock_df_deferred)
379-
widget._initial_load_complete = True
384+
with (
385+
bigframes.option_context("display.render_mode", "anywidget"),
386+
mock.patch.object(TableWidget, "_initial_load"),
387+
):
388+
widget = TableWidget(mock_df_deferred)
389+
widget._initial_load_complete = True
380390

381-
mock_df_deferred.to_pandas_batches.reset_mock()
391+
mock_df_deferred.to_pandas_batches.reset_mock()
382392

383-
widget.sort_context = [{"column": "B", "ascending": False}]
393+
widget.sort_context = [{"column": "B", "ascending": False}]
384394

385395
assert mock_df_deferred.to_pandas_batches.call_count >= 1
386396

@@ -510,22 +520,24 @@ def test_deferred_mode_execution_in_colab(mock_deferred_df, mock_df_deferred):
510520
batches.total_rows = 1
511521
mock_df_deferred.to_pandas_batches.return_value = batches
512522

513-
with mock.patch.dict(sys.modules, {"google.colab": mock.MagicMock()}):
514-
with bigframes.option_context("display.render_mode", "anywidget"):
515-
widget = TableWidget(mock_deferred_df)
516-
widget.is_deferred_mode = True
523+
with (
524+
mock.patch.dict(sys.modules, {"google.colab": mock.MagicMock()}),
525+
bigframes.option_context("display.render_mode", "anywidget"),
526+
):
527+
widget = TableWidget(mock_deferred_df)
528+
widget.is_deferred_mode = True
517529

518-
widget.start_execution = True
530+
widget.start_execution = True
519531

520-
thread = getattr(widget, "_execution_thread", None)
521-
if thread is not None:
522-
thread.join(timeout=5)
532+
thread = getattr(widget, "_execution_thread", None)
533+
if thread is not None:
534+
thread.join(timeout=5)
523535

524-
assert widget.is_deferred_mode is True
525-
assert widget.table_html == ""
536+
assert widget.is_deferred_mode is True
537+
assert widget.table_html == ""
526538

527-
# Simulate frontend ping callback
528-
widget.ping = 1
539+
# Simulate frontend ping callback
540+
widget.ping = 1
529541

530-
assert widget.is_deferred_mode is False
531-
assert widget.table_html != ""
542+
assert widget.is_deferred_mode is False
543+
assert widget.table_html != ""

packages/bigframes/tests/unit/display/test_html.py

Lines changed: 16 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -203,19 +203,20 @@ def test_repr_mimebundle_head():
203203
)
204204

205205
# Mock _get_obj_metadata
206-
with patch("bigframes.display.html._get_obj_metadata", return_value=(False, False)):
207-
# Mock create_html_representation and create_text_representation
208-
with patch(
206+
with (
207+
patch("bigframes.display.html._get_obj_metadata", return_value=(False, False)),
208+
patch(
209209
"bigframes.display.html.create_html_representation", return_value="<html>"
210-
) as mock_create_html:
211-
with patch(
212-
"bigframes.display.plaintext.create_text_representation",
213-
return_value="text",
214-
) as mock_create_text:
215-
bundle = bf_html.repr_mimebundle_head(mock_df)
216-
217-
assert bundle == {"text/html": "<html>", "text/plain": "text"}
218-
mock_df._prepare_display_df.assert_called_once()
219-
mock_df._block.retrieve_repr_request_results.assert_called_once()
220-
mock_create_html.assert_called_once()
221-
mock_create_text.assert_called_once()
210+
) as mock_create_html,
211+
patch(
212+
"bigframes.display.plaintext.create_text_representation",
213+
return_value="text",
214+
) as mock_create_text,
215+
):
216+
bundle = bf_html.repr_mimebundle_head(mock_df)
217+
218+
assert bundle == {"text/html": "<html>", "text/plain": "text"}
219+
mock_df._prepare_display_df.assert_called_once()
220+
mock_df._block.retrieve_repr_request_results.assert_called_once()
221+
mock_create_html.assert_called_once()
222+
mock_create_text.assert_called_once()

packages/bigframes/tests/unit/display/test_render_mode.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@
1414

1515
import unittest.mock as mock
1616

17+
import pytest
18+
1719
import bigframes.display.html as bf_html
1820
import bigframes.pandas as bpd
1921

@@ -62,7 +64,10 @@ def test_repr_mimebundle_selection_logic():
6264

6365
# Test fallback to static deferred repr when anywidget fails
6466
mock_anywidget.side_effect = Exception("Anywidget failed")
65-
with bpd.option_context("display.repr_mode", "deferred"):
67+
with (
68+
bpd.option_context("display.repr_mode", "deferred"),
69+
pytest.warns(UserWarning, match="Anywidget mode is not available"),
70+
):
6671
bundle = bf_html.repr_mimebundle(mock_obj)
6772
assert bundle == {"text/plain": "deferred"}
6873
mock_deferred.assert_called_once()

0 commit comments

Comments
 (0)