Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
2a30f41
feat(snowflake): add read-only Snowflake datasource gem
bexchauveto Apr 28, 2026
148a80e
fix(snowflake): raise on SUM/AVG/MIN/MAX without a field
bexchauveto Apr 28, 2026
6785c25
fix(snowflake): close ODBC statements via ensure on introspection paths
bexchauveto Apr 28, 2026
1b9ee85
chore(release): wire forest_admin_datasource_snowflake into release p…
bexchauveto Apr 29, 2026
e5d58f5
fix(snowflake): retry on Snowflake auth token expiry (390114)
bexchauveto Apr 29, 2026
8e9f3b5
feat(snowflake): use SHOW PRIMARY KEYS for PK detection, add operator…
bexchauveto May 4, 2026
07d565c
fix(snowflake): align session schema with the Ruby schema: option
bexchauveto May 4, 2026
43a7fac
refactor(snowflake): trim constructor surface to conn_str, pool, prim…
bexchauveto May 4, 2026
d4519ac
chore(snowflake): drop dead state and unused zeitwerk inflector rule
bexchauveto May 4, 2026
df1a8cd
fix(snowflake): preserve every column of composite primary keys
bexchauveto May 4, 2026
fde669b
fix(snowflake): raise on primary_keys override naming a missing column
bexchauveto May 5, 2026
9da1dee
perf(snowflake): collapse per-table introspection into one bulk query
bexchauveto May 5, 2026
826c5c5
fix(snowflake): don't memoize failed introspection results
bexchauveto May 6, 2026
81da6b4
fix(snowflake): translate EQUAL/NOT_EQUAL with nil to IS [NOT] NULL
bexchauveto May 6, 2026
a97b144
fix(snowflake): cache introspection failures with defined? to avoid r…
bexchauveto May 6, 2026
c3208ca
fix(snowflake): default to SELECT * when projection has no scalar col…
bexchauveto May 6, 2026
07fe2bc
fix(snowflake): split nils out of IN / NOT_IN lists so NULL rows matc…
bexchauveto May 6, 2026
bb2a0ba
chore(snowflake): pin rubocop, rubocop-performance, rubocop-rspec ver…
bexchauveto May 6, 2026
1c4a27f
chore(snowflake): warn on introspection ODBC errors instead of swallo…
bexchauveto May 6, 2026
685b284
fix(snowflake): fall through to COUNT(*) when aggregation field is blank
bexchauveto May 6, 2026
a9db08d
fix(snowflake): scope each datasource to a single schema via CURRENT_…
bexchauveto May 6, 2026
a305194
fix(snowflake): raise a clear error on malformed connection-string op…
bexchauveto May 6, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 11 additions & 1 deletion .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -31,11 +31,16 @@ jobs:
- forest_admin_rpc_agent
- forest_admin_datasource_rpc
- forest_admin_datasource_zendesk
- forest_admin_datasource_snowflake

steps:
- name: Checkout
uses: actions/checkout@v4

- name: Install unixODBC headers for ruby-odbc
if: ${{ matrix.packages == 'forest_admin_datasource_snowflake' }}
run: sudo apt-get update && sudo apt-get install -y unixodbc-dev

- name: Set up Ruby ${{ matrix.ruby-version }}
uses: ruby/setup-ruby@v1
with:
Expand Down Expand Up @@ -68,6 +73,7 @@ jobs:
- forest_admin_rpc_agent
- forest_admin_datasource_rpc
- forest_admin_datasource_zendesk
- forest_admin_datasource_snowflake
services:
mongodb:
image: mongo:latest
Expand All @@ -77,6 +83,10 @@ jobs:
- name: Checkout
uses: actions/checkout@v4

- name: Install unixODBC headers for ruby-odbc
if: ${{ matrix.packages == 'forest_admin_datasource_snowflake' }}
run: sudo apt-get update && sudo apt-get install -y unixodbc-dev

- name: Set up Ruby ${{ matrix.ruby-version }}
uses: ruby/setup-ruby@v1
with:
Expand Down Expand Up @@ -131,7 +141,7 @@ jobs:
with:
verbose: true
oidc: true
files: ${{ github.workspace }}/reports/${{ matrix.ruby-version }}-forest_admin_agent/coverage.json,${{ github.workspace }}/reports/${{ matrix.ruby-version }}-forest_admin_datasource_active_record/coverage.json,${{ github.workspace }}/reports/${{ matrix.ruby-version }}-forest_admin_datasource_customizer/coverage.json,${{ github.workspace }}/reports/${{ matrix.ruby-version }}-forest_admin_datasource_toolkit/coverage.json,${{ github.workspace }}/reports/${{ matrix.ruby-version }}-forest_admin_datasource_mongoid/coverage.json,${{ github.workspace }}/reports/${{ matrix.ruby-version }}-forest_admin_rpc_agent/coverage.json,${{ github.workspace }}/reports/${{ matrix.ruby-version }}-forest_admin_datasource_rpc/coverage.json,${{ github.workspace }}/reports/${{ matrix.ruby-version }}-forest_admin_datasource_zendesk/coverage.json
files: ${{ github.workspace }}/reports/${{ matrix.ruby-version }}-forest_admin_agent/coverage.json,${{ github.workspace }}/reports/${{ matrix.ruby-version }}-forest_admin_datasource_active_record/coverage.json,${{ github.workspace }}/reports/${{ matrix.ruby-version }}-forest_admin_datasource_customizer/coverage.json,${{ github.workspace }}/reports/${{ matrix.ruby-version }}-forest_admin_datasource_toolkit/coverage.json,${{ github.workspace }}/reports/${{ matrix.ruby-version }}-forest_admin_datasource_mongoid/coverage.json,${{ github.workspace }}/reports/${{ matrix.ruby-version }}-forest_admin_rpc_agent/coverage.json,${{ github.workspace }}/reports/${{ matrix.ruby-version }}-forest_admin_datasource_rpc/coverage.json,${{ github.workspace }}/reports/${{ matrix.ruby-version }}-forest_admin_datasource_zendesk/coverage.json,${{ github.workspace }}/reports/${{ matrix.ruby-version }}-forest_admin_datasource_snowflake/coverage.json

deploy:
name: Release package
Expand Down
7 changes: 5 additions & 2 deletions .releaserc.js
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,8 @@ module.exports = {
'sed -i \'s/VERSION = ".*"/VERSION = "${nextRelease.version}"/g\' packages/forest_admin_datasource_mongoid/lib/forest_admin_datasource_mongoid/version.rb; '+
'sed -i \'s/VERSION = ".*"/VERSION = "${nextRelease.version}"/g\' packages/forest_admin_rpc_agent/lib/forest_admin_rpc_agent/version.rb; '+
'sed -i \'s/VERSION = ".*"/VERSION = "${nextRelease.version}"/g\' packages/forest_admin_datasource_rpc/lib/forest_admin_datasource_rpc/version.rb; '+
'sed -i \'s/VERSION = ".*"/VERSION = "${nextRelease.version}"/g\' packages/forest_admin_datasource_zendesk/lib/forest_admin_datasource_zendesk/version.rb; ',
'sed -i \'s/VERSION = ".*"/VERSION = "${nextRelease.version}"/g\' packages/forest_admin_datasource_zendesk/lib/forest_admin_datasource_zendesk/version.rb; '+
'sed -i \'s/VERSION = ".*"/VERSION = "${nextRelease.version}"/g\' packages/forest_admin_datasource_snowflake/lib/forest_admin_datasource_snowflake/version.rb; ',
successCmd:
'( cd packages/forest_admin_agent && gem build && gem push forest_admin_agent-*.gem );' +
'( cd packages/forest_admin_datasource_active_record && gem build && gem push forest_admin_datasource_active_record-*.gem );' +
Expand All @@ -39,7 +40,8 @@ module.exports = {
'( cd packages/forest_admin_datasource_mongoid && gem build && gem push forest_admin_datasource_mongoid-*.gem );' +
'( cd packages/forest_admin_rpc_agent && gem build && gem push forest_admin_rpc_agent-*.gem );' +
'( cd packages/forest_admin_datasource_rpc && gem build && gem push forest_admin_datasource_rpc-*.gem );' +
'( cd packages/forest_admin_datasource_zendesk && gem build && gem push forest_admin_datasource_zendesk-*.gem );' ,
'( cd packages/forest_admin_datasource_zendesk && gem build && gem push forest_admin_datasource_zendesk-*.gem );' +
'( cd packages/forest_admin_datasource_snowflake && gem build && gem push forest_admin_datasource_snowflake-*.gem );' ,
},
],
[
Expand All @@ -59,6 +61,7 @@ module.exports = {
'packages/forest_admin_rpc_agent/lib/forest_admin_rpc_agent/version.rb',
'packages/forest_admin_datasource_rpc/lib/forest_admin_datasource_rpc/version.rb',
'packages/forest_admin_datasource_zendesk/lib/forest_admin_datasource_zendesk/version.rb',
'packages/forest_admin_datasource_snowflake/lib/forest_admin_datasource_snowflake/version.rb',
'package.json'
],
},
Expand Down
21 changes: 21 additions & 0 deletions .rubocop.yml
Original file line number Diff line number Diff line change
Expand Up @@ -127,6 +127,7 @@ Style/MutableConstant:
- 'packages/forest_admin_datasource_customizer/lib/forest_admin_datasource_customizer/version.rb'
- 'packages/forest_admin_datasource_active_record/lib/forest_admin_datasource_active_record/version.rb'
- 'packages/forest_admin_datasource_zendesk/lib/forest_admin_datasource_zendesk/version.rb'
- 'packages/forest_admin_datasource_snowflake/lib/forest_admin_datasource_snowflake/version.rb'

# Offense count: 38
# This cop supports safe autocorrection (--autocorrect).
Expand Down Expand Up @@ -208,6 +209,7 @@ Style/StringLiterals:
- 'packages/forest_admin_datasource_active_record/lib/forest_admin_datasource_active_record/version.rb'
- 'packages/forest_admin_datasource_active_record/spec/spec_helper.rb'
- 'packages/forest_admin_datasource_zendesk/lib/forest_admin_datasource_zendesk/version.rb'
- 'packages/forest_admin_datasource_snowflake/lib/forest_admin_datasource_snowflake/version.rb'

# Offense count: 1
# This cop supports safe autocorrection (--autocorrect).
Expand Down Expand Up @@ -240,13 +242,15 @@ Lint/NestedMethodDefinition:
Performance/CollectionLiteralInLoop:
Exclude:
- 'packages/forest_admin_agent/lib/forest_admin_agent/utils/condition_tree_parser.rb'
- 'packages/forest_admin_datasource_snowflake/lib/forest_admin_datasource_snowflake/datasource.rb'

Naming/PredicatePrefix:
Exclude:
- 'packages/forest_admin_datasource_toolkit/lib/forest_admin_datasource_toolkit/collection.rb'

Metrics/ParameterLists:
Exclude:
- 'packages/forest_admin_datasource_snowflake/lib/forest_admin_datasource_snowflake/datasource.rb'
- 'packages/forest_admin_agent/lib/forest_admin_agent/routes/query_handler.rb'
- 'packages/forest_admin_agent/lib/forest_admin_agent/services/smart_action_checker.rb'
- 'packages/forest_admin_agent/spec/lib/forest_admin_agent/routes/resources/related/list_related_spec.rb'
Expand Down Expand Up @@ -285,6 +289,8 @@ Metrics/MethodLength:
CountAsOne: ['array', 'hash', 'method_call']
Max: 20
Exclude:
- 'packages/forest_admin_datasource_snowflake/lib/forest_admin_datasource_snowflake/collection.rb'
- 'packages/forest_admin_datasource_snowflake/lib/forest_admin_datasource_snowflake/utils/query.rb'
- 'packages/forest_admin_agent/lib/forest_admin_agent/auth/oauth2/forest_provider.rb'
- 'packages/forest_admin_agent/lib/forest_admin_agent/builder/agent_factory.rb'
- 'packages/forest_admin_agent/lib/forest_admin_agent/http/error_translator.rb'
Expand Down Expand Up @@ -340,6 +346,9 @@ Metrics/BlockLength:

Metrics/ClassLength:
Exclude:
- 'packages/forest_admin_datasource_snowflake/lib/forest_admin_datasource_snowflake/collection.rb'
- 'packages/forest_admin_datasource_snowflake/lib/forest_admin_datasource_snowflake/datasource.rb'
- 'packages/forest_admin_datasource_snowflake/lib/forest_admin_datasource_snowflake/utils/query.rb'
- 'packages/forest_admin_agent/lib/forest_admin_agent/builder/agent_factory.rb'
- 'packages/forest_admin_agent/lib/forest_admin_agent/utils/schema/generator_field.rb'
- 'packages/forest_admin_agent/lib/forest_admin_agent/routes/charts/charts.rb'
Expand Down Expand Up @@ -428,6 +437,18 @@ RSpec/VerifiedDoubles:
Exclude:
- 'packages/forest_admin_datasource_customizer/spec/lib/forest_admin_datasource_customizer/composite_datasource_spec.rb'

RSpec/VerifiedDoubleReference:
Exclude:
- 'packages/forest_admin_datasource_snowflake/spec/**/*'

RSpec/StubbedMock:
Exclude:
- 'packages/forest_admin_datasource_snowflake/spec/**/*'

RSpec/MessageSpies:
Exclude:
- 'packages/forest_admin_datasource_snowflake/spec/**/*'

RSpec/MultipleMemoizedHelpers:
Max: 15

Expand Down
3 changes: 3 additions & 0 deletions packages/forest_admin_datasource_snowflake/.rspec
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
--format documentation
--color
--require spec_helper
15 changes: 15 additions & 0 deletions packages/forest_admin_datasource_snowflake/Gemfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
source 'https://rubygems.org'

gemspec

gem 'forest_admin_datasource_toolkit', path: '../forest_admin_datasource_toolkit'
gem 'rake', '~> 13.0'
gem 'rubocop', '1.86.1'
gem 'rubocop-performance', '1.26.1'
gem 'rubocop-rspec', '3.9.0'

group :development, :test do
gem 'pry'
gem 'rspec', '~> 3.12'
gem 'simplecov', require: false
end
16 changes: 16 additions & 0 deletions packages/forest_admin_datasource_snowflake/Gemfile-test
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
source 'https://rubygems.org'

gemspec

gem 'rake', '~> 13.0'
gem 'rubocop', '1.86.1'
gem 'rubocop-performance', '1.26.1'
gem 'rubocop-rspec', '3.9.0'

group :development, :test do
gem 'forest_admin_datasource_toolkit', path: '../forest_admin_datasource_toolkit'
gem 'rspec', '~> 3.12'
gem 'simplecov', '~> 0.22', require: false
gem 'simplecov-html', '~> 0.12.3'
gem 'simplecov_json_formatter', '~> 0.1.4'
end
Loading
Loading