From 104c61bc8ddabca1754eade2629ab1afd198f471 Mon Sep 17 00:00:00 2001 From: Gal Topper Date: Thu, 19 Mar 2026 17:50:18 +0700 Subject: [PATCH 1/6] Raise grpc version to v1.79.3 --- go.mod | 16 +++++++-------- go.sum | 64 +++++++++++++++++++++++++++++++--------------------------- 2 files changed, 42 insertions(+), 38 deletions(-) diff --git a/go.mod b/go.mod index 3a9e28bb..625d49f6 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module github.com/v3io/frames -go 1.24 +go 1.24.0 require ( github.com/ghodss/yaml v1.0.0 @@ -14,9 +14,9 @@ require ( github.com/v3io/v3io-tsdb v0.15.0 github.com/valyala/fasthttp v1.44.0 github.com/xwb1989/sqlparser v0.0.0-20180606152119-120387863bf2 - golang.org/x/text v0.28.0 - google.golang.org/grpc v1.72.0 - google.golang.org/protobuf v1.36.6 + golang.org/x/text v0.32.0 + google.golang.org/grpc v1.79.3 + google.golang.org/protobuf v1.36.10 ) require ( @@ -32,10 +32,10 @@ require ( github.com/valyala/bytebufferpool v1.0.0 // indirect go.uber.org/multierr v1.11.0 // indirect go.uber.org/zap v1.27.0 // indirect - golang.org/x/net v0.43.0 // indirect - golang.org/x/sync v0.16.0 // indirect - golang.org/x/sys v0.35.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20250512202823-5a2f75b736a9 // indirect + golang.org/x/net v0.48.0 // indirect + golang.org/x/sync v0.19.0 // indirect + golang.org/x/sys v0.39.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20251202230838-ff82c1b0f217 // indirect gopkg.in/yaml.v2 v2.2.8 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect zombiezen.com/go/capnproto2 v2.17.0+incompatible // indirect diff --git a/go.sum b/go.sum index feed2dce..8b520a8d 100644 --- a/go.sum +++ b/go.sum @@ -4,20 +4,22 @@ github.com/andybalholm/brotli v1.0.4 h1:V7DdXeJtZscaqfNuAdSRuRFzuiKlHSC/Zh3zl9qY github.com/andybalholm/brotli v1.0.4/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= -github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= +github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/golang/groupcache v0.0.0-20191027212112-611e8accdfc9 h1:uHTyIjqVhYRhLbJ8nIiOJHkEZZ+5YoOsAbD3sk82NiE= github.com/golang/groupcache v0.0.0-20191027212112-611e8accdfc9/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= -github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= -github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/imdario/mergo v0.3.7 h1:Y+UAYTZ7gDEuOfhxKWy+dvb5dRQ6rJjFSdX2HZY1/gI= @@ -63,18 +65,18 @@ github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyC github.com/valyala/fasthttp v1.44.0 h1:R+gLUhldIsfg1HokMuQjdQ5bh9nuXHPIfvkYUu9eR5Q= github.com/valyala/fasthttp v1.44.0/go.mod h1:f6VbjjoI3z1NDOZOv17o6RvtRSWxC77seBFc2uWtgiY= github.com/valyala/tcplisten v1.0.0/go.mod h1:T0xQ8SeCZGxckz9qRXTfG43PvQ/mcWh7FwZEA7Ioqkc= -go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= -go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= -go.opentelemetry.io/otel v1.34.0 h1:zRLXxLCgL1WyKsPVrgbSdMN4c0FMkDAskSTQP+0hdUY= -go.opentelemetry.io/otel v1.34.0/go.mod h1:OWFPOQ+h4G8xpyjgqo4SxJYdDQ/qmRH+wivy7zzx9oI= -go.opentelemetry.io/otel/metric v1.34.0 h1:+eTR3U0MyfWjRDhmFMxe2SsW64QrZ84AOhvqS7Y+PoQ= -go.opentelemetry.io/otel/metric v1.34.0/go.mod h1:CEDrp0fy2D0MvkXE+dPV7cMi8tWZwX3dmaIhwPOaqHE= -go.opentelemetry.io/otel/sdk v1.34.0 h1:95zS4k/2GOy069d321O8jWgYsW3MzVV+KuSPKp7Wr1A= -go.opentelemetry.io/otel/sdk v1.34.0/go.mod h1:0e/pNiaMAqaykJGKbi+tSjWfNNHMTxoC9qANsCzbyxU= -go.opentelemetry.io/otel/sdk/metric v1.34.0 h1:5CeK9ujjbFVL5c1PhLuStg1wxA7vQv7ce1EK0Gyvahk= -go.opentelemetry.io/otel/sdk/metric v1.34.0/go.mod h1:jQ/r8Ze28zRKoNRdkjCZxfs6YvBTG1+YIqyFVFYec5w= -go.opentelemetry.io/otel/trace v1.34.0 h1:+ouXS2V8Rd4hp4580a8q23bg0azF2nI8cqLYnC8mh/k= -go.opentelemetry.io/otel/trace v1.34.0/go.mod h1:Svm7lSjQD7kG7KJ/MUHPVXSDGz2OX4h0M2jHBhmSfRE= +go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64= +go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y= +go.opentelemetry.io/otel v1.39.0 h1:8yPrr/S0ND9QEfTfdP9V+SiwT4E0G7Y5MO7p85nis48= +go.opentelemetry.io/otel v1.39.0/go.mod h1:kLlFTywNWrFyEdH0oj2xK0bFYZtHRYUdv1NklR/tgc8= +go.opentelemetry.io/otel/metric v1.39.0 h1:d1UzonvEZriVfpNKEVmHXbdf909uGTOQjA0HF0Ls5Q0= +go.opentelemetry.io/otel/metric v1.39.0/go.mod h1:jrZSWL33sD7bBxg1xjrqyDjnuzTUB0x1nBERXd7Ftcs= +go.opentelemetry.io/otel/sdk v1.39.0 h1:nMLYcjVsvdui1B/4FRkwjzoRVsMK8uL/cj0OyhKzt18= +go.opentelemetry.io/otel/sdk v1.39.0/go.mod h1:vDojkC4/jsTJsE+kh+LXYQlbL8CgrEcwmt1ENZszdJE= +go.opentelemetry.io/otel/sdk/metric v1.39.0 h1:cXMVVFVgsIf2YL6QkRF4Urbr/aMInf+2WKg+sEJTtB8= +go.opentelemetry.io/otel/sdk/metric v1.39.0/go.mod h1:xq9HEVH7qeX69/JnwEfp6fVq5wosJsY1mt4lLfYdVew= +go.opentelemetry.io/otel/trace v1.39.0 h1:2d2vfpEDmCJ5zVYz7ijaJdOF59xLomrvj7bjt6/qCJI= +go.opentelemetry.io/otel/trace v1.39.0/go.mod h1:88w4/PnZSazkGzz/w84VHpQafiU4EtqqlVdxWy+rNOA= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= @@ -84,29 +86,31 @@ go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= golang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220906165146-f3363e06e74c/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= -golang.org/x/net v0.43.0 h1:lat02VYK2j4aLzMzecihNvTlJNQUq316m2Mr9rnM6YE= -golang.org/x/net v0.43.0/go.mod h1:vhO1fvI4dGsIjh73sWfUVjj3N7CA9WkKJNQm2svM6Jg= -golang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw= -golang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= +golang.org/x/net v0.48.0 h1:zyQRTTrjc33Lhh0fBgT/H3oZq9WuvRR5gPC70xpDiQU= +golang.org/x/net v0.48.0/go.mod h1:+ndRgGjkh8FGtu1w1FGbEC31if4VrNVMuKTgcAAnQRY= +golang.org/x/sync v0.19.0 h1:vV+1eWNmZ5geRlYjzm2adRgW2/mcpevXNg50YZtPCE4= +golang.org/x/sync v0.19.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.35.0 h1:vz1N37gP5bs89s7He8XuIYXpyY0+QlsKmzipCbUtyxI= -golang.org/x/sys v0.35.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +golang.org/x/sys v0.39.0 h1:CvCKL8MeisomCi6qNZ+wbb0DN9E5AATixKsvNtMoMFk= +golang.org/x/sys v0.39.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.28.0 h1:rhazDwis8INMIwQ4tpjLDzUhx6RlXqZNPEM0huQojng= -golang.org/x/text v0.28.0/go.mod h1:U8nCwOR8jO/marOQ0QbDiOngZVEBB7MAiitBuMjXiNU= +golang.org/x/text v0.32.0 h1:ZD01bjUt1FQ9WJ0ClOL5vxgxOI/sVCNgX1YtKwcY0mU= +golang.org/x/text v0.32.0/go.mod h1:o/rUWzghvpD5TXrTIBuJU77MTaN0ljMWE47kxGJQ7jY= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250512202823-5a2f75b736a9 h1:IkAfh6J/yllPtpYFU0zZN1hUPYdT0ogkBT/9hMxHjvg= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250512202823-5a2f75b736a9/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= -google.golang.org/grpc v1.72.0 h1:S7UkcVa60b5AAQTaO6ZKamFp1zMZSU0fGDK2WZLbBnM= -google.golang.org/grpc v1.72.0/go.mod h1:wH5Aktxcg25y1I3w7H69nHfXdOG3UiadoBtjh3izSDM= -google.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY= -google.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= +gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= +gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= +google.golang.org/genproto/googleapis/rpc v0.0.0-20251202230838-ff82c1b0f217 h1:gRkg/vSppuSQoDjxyiGfN4Upv/h/DQmIR10ZU8dh4Ww= +google.golang.org/genproto/googleapis/rpc v0.0.0-20251202230838-ff82c1b0f217/go.mod h1:7i2o+ce6H/6BluujYR+kqX3GKH+dChPTQU19wjRPiGk= +google.golang.org/grpc v1.79.3 h1:sybAEdRIEtvcD68Gx7dmnwjZKlyfuc61Dyo9pGXXkKE= +google.golang.org/grpc v1.79.3/go.mod h1:KmT0Kjez+0dde/v2j9vzwoAScgEPx/Bw1CYChhHLrHQ= +google.golang.org/protobuf v1.36.10 h1:AYd7cD/uASjIL6Q9LiTjz8JLcrh/88q5UObnmY3aOOE= +google.golang.org/protobuf v1.36.10/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= From 916cf57b183e6253e19f1ba89e7efe4c76cdef9a Mon Sep 17 00:00:00 2001 From: Gal Topper Date: Thu, 19 Mar 2026 18:26:30 +0700 Subject: [PATCH 2/6] Remove usage of pytz Which is not in the requirements. --- clients/py/tests/test_http.py | 4 ++-- clients/py/tests/test_integration.py | 4 ++-- clients/py/v3io_frames/pbutils.py | 7 +++---- 3 files changed, 7 insertions(+), 8 deletions(-) diff --git a/clients/py/tests/test_http.py b/clients/py/tests/test_http.py index 884daecb..9f16cfa1 100644 --- a/clients/py/tests/test_http.py +++ b/clients/py/tests/test_http.py @@ -19,7 +19,7 @@ from os.path import abspath, dirname import pandas as pd -import pytz +from zoneinfo import ZoneInfo import v3io_frames as v3f from v3io_frames import frames_pb2 as fpb @@ -138,7 +138,7 @@ def col_name(msg): def test_format_go_time(): - tz = pytz.timezone('Asia/Jerusalem') + tz = ZoneInfo('Asia/Jerusalem') now = datetime.now() dt = now.astimezone(tz) ts = v3f.http.format_go_time(dt) diff --git a/clients/py/tests/test_integration.py b/clients/py/tests/test_integration.py index 4cfe5140..4b96ae3f 100644 --- a/clients/py/tests/test_integration.py +++ b/clients/py/tests/test_integration.py @@ -20,7 +20,7 @@ import pytest import v3io_frames as v3f from datetime import datetime -import pytz +from zoneinfo import ZoneInfo from conftest import has_go, test_backends, protocols, has_session from v3io_frames import DeleteError @@ -238,7 +238,7 @@ def test_datetime(framesd, session, protocol): addr = getattr(framesd, '{}_addr'.format(protocol)) client = v3f.Client(addr, **session) - col = pd.Series([datetime.now(pytz.timezone("Africa/Abidjan")), datetime.now(pytz.timezone("America/Nassau")), None, datetime.now()]) + col = pd.Series([datetime.now(ZoneInfo("Africa/Abidjan")), datetime.now(ZoneInfo("America/Nassau")), None, datetime.now()]) df = pd.DataFrame({'col': col}) client.write(backend, table=tableName, dfs=df) diff --git a/clients/py/v3io_frames/pbutils.py b/clients/py/v3io_frames/pbutils.py index d27663a7..cccc4b6d 100644 --- a/clients/py/v3io_frames/pbutils.py +++ b/clients/py/v3io_frames/pbutils.py @@ -13,13 +13,12 @@ # limitations under the License. import warnings -from datetime import datetime +from datetime import datetime, timezone from google.protobuf.internal import containers from google.protobuf.pyext import cpp_message import numpy as np import pandas as pd -import pytz from google.protobuf.message import Message from pandas.api.types import is_datetime64_any_dtype as is_datetime from pandas.api.types import is_integer_dtype as is_integer @@ -278,7 +277,7 @@ def series2col(s, name): elif is_datetime(s.dtype): if s.dt.tz: try: - s = s.dt.tz_localize(pytz.UTC) + s = s.dt.tz_localize(timezone.utc) except TypeError: s = s.dt.tz_convert('UTC') kw['times'] = s.astype(np.int64) @@ -349,7 +348,7 @@ def get_empty_value_by_type(dtype): elif dtype == fpb.STRING: return '' elif dtype == fpb.TIME: - return datetime.fromtimestamp(0, pytz.UTC) + return datetime.fromtimestamp(0, timezone.utc) elif dtype == fpb.BOOLEAN: return False elif dtype == fpb.NULL: From 43e40a5435d545cd5e863d1b4fa3838e01c22843 Mon Sep 17 00:00:00 2001 From: Gal Topper Date: Thu, 19 Mar 2026 18:35:17 +0700 Subject: [PATCH 3/6] Fix nondeterministic tests --- grpc/end2end_test.go | 35 +++++++++++++++++++++++++++-------- http/end2end_test.go | 35 +++++++++++++++++++++++++++-------- 2 files changed, 54 insertions(+), 16 deletions(-) diff --git a/grpc/end2end_test.go b/grpc/end2end_test.go index 6c580028..1e7db260 100644 --- a/grpc/end2end_test.go +++ b/grpc/end2end_test.go @@ -24,6 +24,7 @@ import ( "fmt" "net" "reflect" + "sort" "testing" "time" @@ -107,7 +108,11 @@ func TestEnd2End(t *testing.T) { for it.Next() { iFrame := it.At() - if !reflect.DeepEqual(iFrame.Names(), frame.Names()) { + got := append([]string{}, iFrame.Names()...) + want := append([]string{}, frame.Names()...) + sort.Strings(got) + sort.Strings(want) + if !reflect.DeepEqual(got, want) { t.Fatalf("columns mismatch: %v != %v", iFrame.Names(), frame.Names()) } nRows += iFrame.Len() @@ -139,14 +144,28 @@ func makeFrame() (frames.Frame, error) { bdata[i] = i%2 == 0 } - columns := map[string]interface{}{ - "ints": idata, - "floats": fdata, - "strings": sdata, - "times": tdata, - "bools": bdata, + icol, err := frames.NewSliceColumn("ints", idata) + if err != nil { + return nil, err + } + fcol, err := frames.NewSliceColumn("floats", fdata) + if err != nil { + return nil, err + } + scol, err := frames.NewSliceColumn("strings", sdata) + if err != nil { + return nil, err } - return frames.NewFrameFromMap(columns, nil) + tcol, err := frames.NewSliceColumn("times", tdata) + if err != nil { + return nil, err + } + bcol, err := frames.NewSliceColumn("bools", bdata) + if err != nil { + return nil, err + } + + return frames.NewFrame([]frames.Column{icol, fcol, scol, tcol, bcol}, nil, nil) } func freePort() (int, error) { diff --git a/http/end2end_test.go b/http/end2end_test.go index 2380bff3..968a0f6b 100644 --- a/http/end2end_test.go +++ b/http/end2end_test.go @@ -26,6 +26,7 @@ import ( "net" nhttp "net/http" "reflect" + "sort" "testing" "time" @@ -110,7 +111,11 @@ func TestEnd2End(t *testing.T) { for it.Next() { iFrame := it.At() - if !reflect.DeepEqual(iFrame.Names(), frame.Names()) { + got := append([]string{}, iFrame.Names()...) + want := append([]string{}, frame.Names()...) + sort.Strings(got) + sort.Strings(want) + if !reflect.DeepEqual(got, want) { t.Fatalf("columns mismatch: %v != %v", iFrame.Names(), frame.Names()) } nRows += iFrame.Len() @@ -175,12 +180,26 @@ func makeFrame() (frames.Frame, error) { bdata[i] = i%2 == 0 } - columns := map[string]interface{}{ - "ints": idata, - "floats": fdata, - "strings": sdata, - "times": tdata, - "bools": bdata, + icol, err := frames.NewSliceColumn("ints", idata) + if err != nil { + return nil, err + } + fcol, err := frames.NewSliceColumn("floats", fdata) + if err != nil { + return nil, err + } + scol, err := frames.NewSliceColumn("strings", sdata) + if err != nil { + return nil, err } - return frames.NewFrameFromMap(columns, nil) + tcol, err := frames.NewSliceColumn("times", tdata) + if err != nil { + return nil, err + } + bcol, err := frames.NewSliceColumn("bools", bdata) + if err != nil { + return nil, err + } + + return frames.NewFrame([]frames.Column{icol, fcol, scol, tcol, bcol}, nil, nil) } From 32d9b3c08777e1019838872aaed99047dd8a666e Mon Sep 17 00:00:00 2001 From: Gal Topper Date: Thu, 19 Mar 2026 18:56:46 +0700 Subject: [PATCH 4/6] Add support for pandas 3 --- clients/py/v3io_frames/pbutils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clients/py/v3io_frames/pbutils.py b/clients/py/v3io_frames/pbutils.py index cccc4b6d..ebdad597 100644 --- a/clients/py/v3io_frames/pbutils.py +++ b/clients/py/v3io_frames/pbutils.py @@ -268,7 +268,7 @@ def series2col(s, name): elif is_float(s.dtype): kw['dtype'] = fpb.FLOAT kw['floats'] = s - elif s.dtype == object: + elif is_string(s.dtype): kw['strings'] = s kw['dtype'] = fpb.STRING elif is_bool(s.dtype): From 3706d290400fa486645b9fc5271145689c4a9346 Mon Sep 17 00:00:00 2001 From: Gal Topper Date: Thu, 19 Mar 2026 19:15:52 +0700 Subject: [PATCH 5/6] Rename test tables to avoid potential collision --- grpc/end2end_test.go | 2 +- http/end2end_test.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/grpc/end2end_test.go b/grpc/end2end_test.go index 1e7db260..f2141cbc 100644 --- a/grpc/end2end_test.go +++ b/grpc/end2end_test.go @@ -73,7 +73,7 @@ func TestEnd2End(t *testing.T) { t.Fatalf("can't create frame - %s", err) } - tableName := "e2e" + tableName := "e2e_grpc" writeReq := &frames.WriteRequest{ Backend: backendName, Table: tableName, diff --git a/http/end2end_test.go b/http/end2end_test.go index 968a0f6b..8d84f5f1 100644 --- a/http/end2end_test.go +++ b/http/end2end_test.go @@ -76,7 +76,7 @@ func TestEnd2End(t *testing.T) { t.Fatalf("can't create frame - %s", err) } - tableName := "e2e" + tableName := "e2e_http" writeReq := &frames.WriteRequest{ Backend: backendName, Table: tableName, From 4fb70a865647352076907bb9a6c0456a670f5bf3 Mon Sep 17 00:00:00 2001 From: Gal Topper Date: Thu, 19 Mar 2026 19:36:15 +0700 Subject: [PATCH 6/6] Don't try to support pandas 3 --- clients/py/requirements.txt | 2 +- clients/py/v3io_frames/pbutils.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/clients/py/requirements.txt b/clients/py/requirements.txt index 838aa292..075bbd09 100644 --- a/clients/py/requirements.txt +++ b/clients/py/requirements.txt @@ -2,5 +2,5 @@ googleapis-common-protos>=1.5.3 grpcio-tools>=1.49 # lower limit of >=4 for compatibility, upper limit of <7 to avoid potential breakage when protobuf 7 is released protobuf>=4,<7 -pandas>=0.23.4 +pandas>=0.23.4,<3 requests>=2.19.1 diff --git a/clients/py/v3io_frames/pbutils.py b/clients/py/v3io_frames/pbutils.py index ebdad597..cccc4b6d 100644 --- a/clients/py/v3io_frames/pbutils.py +++ b/clients/py/v3io_frames/pbutils.py @@ -268,7 +268,7 @@ def series2col(s, name): elif is_float(s.dtype): kw['dtype'] = fpb.FLOAT kw['floats'] = s - elif is_string(s.dtype): + elif s.dtype == object: kw['strings'] = s kw['dtype'] = fpb.STRING elif is_bool(s.dtype):