Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
42 commits
Select commit Hold shift + click to select a range
9cd45e0
feat(datasource-pylon): foundation — gem, config & resilient client (…
christophebrun-forest Aug 7, 2026
8b804dd
feat(datasource-pylon): PylonIssue read-only collection with cursor p…
christophebrun-forest Aug 10, 2026
af03bac
feat(datasource-pylon): filters, search and PK short-circuit hardenin…
christophebrun-forest Aug 12, 2026
28d4da6
fix(pylon): register the gem for release and declare activesupport
christophebrun-forest Aug 18, 2026
4b14086
feat(datasource-pylon): all collections + relations (EXT-8) (#354)
christophebrun-forest Aug 18, 2026
64857f4
feat(datasource-pylon): messages / conversation thread (EXT-9) (#358)
christophebrun-forest Aug 18, 2026
1c92286
ci: bound every job and harden the unixODBC install (#360)
christophebrun-forest Aug 19, 2026
9f80673
feat(datasource-pylon): custom fields introspection (EXT-10) (#359)
christophebrun-forest Aug 19, 2026
46e1e5b
feat(datasource-pylon): write operations (CRUD) (EXT-11) (#362)
christophebrun-forest Aug 21, 2026
0fd0ed7
feat(datasource-pylon): close and create-with-notification action plu…
christophebrun-forest Aug 24, 2026
837988d
refactor(customizer): build the sort schema in one pass and trim its …
christophebrun-forest Aug 24, 2026
8f99395
Merge branch 'main' into feat/datasource-pylon
christophebrun-forest Aug 25, 2026
442e116
feat(datasource-pylon): proactive throttling (EXT-13) (#373)
christophebrun-forest Aug 25, 2026
ab4630a
feat(datasource-pylon): bound the boot-time custom-fields introspecti…
christophebrun-forest Aug 26, 2026
65190b9
chore(pylon): merge main into the integration branch
christophebrun-forest Aug 26, 2026
b9cb7d1
fix(pylon): three defects Macroscope found on the branch
christophebrun-forest Aug 26, 2026
a93474b
fix(pylon): page a lookup naming many issues by id
christophebrun-forest Aug 26, 2026
2495109
fix(pylon): refuse two plugin configurations that misbehave silently
christophebrun-forest Aug 26, 2026
cc01551
fix(pylon): keep no column for a projection naming only relations
christophebrun-forest Aug 26, 2026
373f94d
refactor(pylon): drop the countable flag nothing opts into
christophebrun-forest Aug 26, 2026
7033ba1
fix(pylon): stop the custom-field introspection at its first failure
christophebrun-forest Aug 26, 2026
bd55e8b
docs(pylon): add the package README
christophebrun-forest Aug 26, 2026
2a1b4d6
fix(pylon): serve the whole record for an empty projection
christophebrun-forest Aug 27, 2026
67cd786
fix(pylon): refuse an internal note the form never offered
christophebrun-forest Aug 27, 2026
1fd03cb
fix(pylon): keep a select with no option left read-only
christophebrun-forest Aug 27, 2026
96a0575
docs(pylon): record what bounds CloseIssue and what does not
christophebrun-forest Aug 27, 2026
0a2d4e4
chore(pylon): align version.rb with the other packages
christophebrun-forest Aug 27, 2026
d75bab2
fix(pylon): intersect the id conditions of an and
christophebrun-forest Aug 27, 2026
524cc95
fix(pylon): let a refused selection reach the operator
christophebrun-forest Aug 27, 2026
b6bd085
docs(pylon): correct which scope bounds CloseIssue
christophebrun-forest Aug 27, 2026
89917dc
fix(pylon): honour the projection of an embedded relation
christophebrun-forest Aug 28, 2026
901b5da
fix(pylon): keep the api key out of every inspect
christophebrun-forest Aug 28, 2026
a0cc00d
fix(pylon): refuse a read body Pylon answered without data
christophebrun-forest Aug 28, 2026
6db19e0
fix(pylon): stop a cursor walk on a cursor already followed
christophebrun-forest Aug 28, 2026
1eb6a93
feat(pylon): count the collections Pylon hands back whole
christophebrun-forest Aug 28, 2026
723b90f
fix(toolkit): keep the aggregator of a nested condition tree branch
christophebrun-forest Aug 28, 2026
3e38d09
fix(pylon): bound what one run of the close issue action writes
christophebrun-forest Aug 28, 2026
a08ab42
fix(pylon): bound the 429 wait and refuse two silent wrong answers
christophebrun-forest Sep 1, 2026
219d8bc
chore(pylon): merge main and resolve the build workflow conflict
christophebrun-forest Sep 1, 2026
e1865da
fix(pylon): mask the user-info of a base url in an inspect
christophebrun-forest Sep 1, 2026
e17c432
fix(pylon): stop a walk that left records behind, and four more
christophebrun-forest Sep 1, 2026
cbaa561
fix(pylon): register a close-issue action under a name the schema can…
christophebrun-forest Sep 1, 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
3 changes: 2 additions & 1 deletion .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,7 @@ jobs:
- forest_admin_datasource_snowflake
- forest_admin_datasource_mambu_payments
- forest_admin_datasource_graphql_hasura
- forest_admin_datasource_pylon
services:
mongodb:
image: mongo:latest
Expand Down Expand Up @@ -153,7 +154,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_rails/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,${{ github.workspace }}/reports/${{ matrix.ruby-version }}-forest_admin_datasource_mambu_payments/coverage.json,${{ github.workspace }}/reports/${{ matrix.ruby-version }}-forest_admin_datasource_graphql_hasura/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_rails/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,${{ github.workspace }}/reports/${{ matrix.ruby-version }}-forest_admin_datasource_mambu_payments/coverage.json,${{ github.workspace }}/reports/${{ matrix.ruby-version }}-forest_admin_datasource_graphql_hasura/coverage.json,${{ github.workspace }}/reports/${{ matrix.ruby-version }}-forest_admin_datasource_pylon/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 @@ -31,7 +31,8 @@ module.exports = {
'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; '+
'sed -i \'s/VERSION = ".*"/VERSION = "${nextRelease.version}"/g\' packages/forest_admin_datasource_mambu_payments/lib/forest_admin_datasource_mambu_payments/version.rb; '+
'sed -i \'s/VERSION = ".*"/VERSION = "${nextRelease.version}"/g\' packages/forest_admin_datasource_graphql_hasura/lib/forest_admin_datasource_graphql_hasura/version.rb; ',
'sed -i \'s/VERSION = ".*"/VERSION = "${nextRelease.version}"/g\' packages/forest_admin_datasource_graphql_hasura/lib/forest_admin_datasource_graphql_hasura/version.rb; '+
'sed -i \'s/VERSION = ".*"/VERSION = "${nextRelease.version}"/g\' packages/forest_admin_datasource_pylon/lib/forest_admin_datasource_pylon/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 @@ -45,7 +46,8 @@ module.exports = {
'( 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 );' +
'( cd packages/forest_admin_datasource_mambu_payments && gem build && gem push forest_admin_datasource_mambu_payments-*.gem );' +
Comment thread
christophebrun-forest marked this conversation as resolved.
'( cd packages/forest_admin_datasource_graphql_hasura && gem build && gem push forest_admin_datasource_graphql_hasura-*.gem );' ,
'( cd packages/forest_admin_datasource_graphql_hasura && gem build && gem push forest_admin_datasource_graphql_hasura-*.gem );' +
'( cd packages/forest_admin_datasource_pylon && gem build && gem push forest_admin_datasource_pylon-*.gem );' ,
},
],
[
Expand All @@ -68,6 +70,7 @@ module.exports = {
'packages/forest_admin_datasource_snowflake/lib/forest_admin_datasource_snowflake/version.rb',
'packages/forest_admin_datasource_mambu_payments/lib/forest_admin_datasource_mambu_payments/version.rb',
'packages/forest_admin_datasource_graphql_hasura/lib/forest_admin_datasource_graphql_hasura/version.rb',
'packages/forest_admin_datasource_pylon/lib/forest_admin_datasource_pylon/version.rb',
'package.json'
],
},
Expand Down
7 changes: 7 additions & 0 deletions .rubocop.yml
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ Gemspec/RequireMFA:
- 'packages/forest_admin_datasource_snowflake/forest_admin_datasource_snowflake.gemspec'
- 'packages/forest_admin_datasource_mambu_payments/forest_admin_datasource_mambu_payments.gemspec'
- 'packages/forest_admin_datasource_graphql_hasura/forest_admin_datasource_graphql_hasura.gemspec'
- 'packages/forest_admin_datasource_pylon/forest_admin_datasource_pylon.gemspec'

# Offense count: 1
# This cop supports unsafe autocorrection (--autocorrect-all).
Expand Down Expand Up @@ -133,6 +134,7 @@ Style/MutableConstant:
- 'packages/forest_admin_datasource_zendesk/lib/forest_admin_datasource_zendesk/version.rb'
- 'packages/forest_admin_datasource_snowflake/lib/forest_admin_datasource_snowflake/version.rb'
- 'packages/forest_admin_datasource_mambu_payments/lib/forest_admin_datasource_mambu_payments/version.rb'
- 'packages/forest_admin_datasource_pylon/lib/forest_admin_datasource_pylon/version.rb'

# Offense count: 38
# This cop supports safe autocorrection (--autocorrect).
Expand Down Expand Up @@ -217,6 +219,7 @@ Style/StringLiterals:
- 'packages/forest_admin_datasource_zendesk/lib/forest_admin_datasource_zendesk/version.rb'
- 'packages/forest_admin_datasource_snowflake/lib/forest_admin_datasource_snowflake/version.rb'
- 'packages/forest_admin_datasource_mambu_payments/lib/forest_admin_datasource_mambu_payments/version.rb'
- 'packages/forest_admin_datasource_pylon/lib/forest_admin_datasource_pylon/version.rb'

# Offense count: 1
# This cop supports safe autocorrection (--autocorrect).
Expand Down Expand Up @@ -262,6 +265,8 @@ Metrics/ParameterLists:
- 'packages/forest_admin_agent/lib/forest_admin_agent/audit_trail/store.rb'
- 'packages/forest_admin_datasource_graphql_hasura/lib/forest_admin_datasource_graphql_hasura/configuration.rb'
- 'packages/forest_admin_datasource_zendesk/lib/forest_admin_datasource_zendesk/collections/base_collection.rb'
- 'packages/forest_admin_datasource_pylon/lib/forest_admin_datasource_pylon/collections/base_collection.rb'
- 'packages/forest_admin_datasource_pylon/lib/forest_admin_datasource_pylon/configuration.rb'
- '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'
Expand Down Expand Up @@ -294,6 +299,7 @@ Metrics/ModuleLength:
- 'packages/forest_admin_datasource_customizer/spec/**/*'
- 'packages/forest_admin_datasource_zendesk/spec/**/*'
- 'packages/forest_admin_datasource_mambu_payments/spec/**/*'
- 'packages/forest_admin_datasource_pylon/spec/**/*'
- 'packages/forest_admin_rails/spec/**/*'
- 'packages/forest_admin_rpc_agent/spec/**/*'
- 'packages/forest_admin_datasource_mongoid/lib/forest_admin_datasource_mongoid/utils/helpers.rb'
Expand Down Expand Up @@ -369,6 +375,7 @@ Metrics/ClassLength:
- 'packages/forest_admin_datasource_graphql_hasura/lib/forest_admin_datasource_graphql_hasura/query/query_builder.rb'
- 'packages/forest_admin_datasource_graphql_hasura/lib/forest_admin_datasource_graphql_hasura/query/aggregator.rb'
- 'packages/forest_admin_datasource_zendesk/lib/forest_admin_datasource_zendesk/collections/base_collection.rb'
- 'packages/forest_admin_datasource_pylon/lib/forest_admin_datasource_pylon/collections/base_collection.rb'
- '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'
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -237,7 +237,11 @@ def compute_value(context, filter, args)
field: aggregate_field_name(args))
result = context.collection.aggregate(context.caller, filter, aggregation)

result[0]['value'] || 0
# `Aggregation#apply` groups the records it is given, so a filter
# matching none of them answers with no row at all -- which is what an
# in-memory aggregation hands back for an empty selection. Indexing
# that answered a value chart with a 500 where the figure is zero.
result.first&.[]('value') || 0
end

# The permission root stays the chart's own collection, which the leaderboard call site does
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -182,6 +182,24 @@ module Charts
)
end

# `Aggregation#apply` groups the records it is given, so a filter
# matching none of them answers with no row at all. Indexing that
# answered the chart with a 500 where the figure is zero.
it 'returns zero when the filter matched no record' do
args[:params] = args[:params].merge({
aggregateFieldName: 'price',
aggregator: 'Sum',
sourceCollectionName: 'book',
type: 'Value',
timezone: 'Europe/Paris'
})
allow(@datasource.get_collection('book')).to receive(:aggregate).and_return([])

result = chart.handle_request(args)

expect(result[:content][:data][:attributes][:value]).to eq(countCurrent: 0, countPrevious: nil)
end

it 'return a valueChart with previous filter' do
args[:params] = args[:params].merge({
aggregateFieldName: 'price',
Expand Down
8 changes: 8 additions & 0 deletions packages/forest_admin_datasource_pylon/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
*.gem
.bundle/
Gemfile.lock
Gemfile-test.lock
coverage/
pkg/
tmp/
.rspec_status
3 changes: 3 additions & 0 deletions packages/forest_admin_datasource_pylon/.rspec
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
--format documentation
--color
--require spec_helper
16 changes: 16 additions & 0 deletions packages/forest_admin_datasource_pylon/Gemfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
source 'https://rubygems.org'

gemspec

gem 'forest_admin_datasource_customizer'
gem '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 'rspec', '~> 3.0'
gem 'simplecov', '~> 0.22', require: false
gem 'webmock', '~> 3.0'
end
Comment thread
christophebrun-forest marked this conversation as resolved.
19 changes: 19 additions & 0 deletions packages/forest_admin_datasource_pylon/Gemfile-test
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
source 'https://rubygems.org'

# Specify your gem's dependencies in forest_admin_datasource_pylon.gemspec
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_customizer', path: '../forest_admin_datasource_customizer'
gem 'forest_admin_datasource_toolkit', path: '../forest_admin_datasource_toolkit'
gem 'rspec', '~> 3.0'
gem 'simplecov', '~> 0.22', require: false
gem 'simplecov-html', '~> 0.12.3'
gem 'simplecov_json_formatter', '~> 0.1.4'
gem 'webmock', '~> 3.0'
end
Loading
Loading