forest_admin_agent 1.24.10 → 2.0.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.

Potentially problematic release.


This version of forest_admin_agent might be problematic. Click here for more details.

checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 945940689d1b0e9df1037a46fb887ef57689ce8777f1e4ab501feb2764e9c8c2
4
- data.tar.gz: 62b510fc2325ef81be9a88ab43b964c21738b360416fc7def5f7c2f25e2456ba
3
+ metadata.gz: cc7482432c06c209f581b462b2c90fb3d8dbb7b2d297e7e7305c45884f737b14
4
+ data.tar.gz: 947c66674a785b48451e38b1220fa9c85c5f96d02250c2b2cb82155833bf9147
5
5
  SHA512:
6
- metadata.gz: a358be6cd63ebaebca5b002c61d5ff96e6c7f440c719dcf90bf1a94a72c5427ed48ec758b5f1128f13425166684be906c1907806fdd23e9023be1678d1d67dc1
7
- data.tar.gz: 92e025ef1682312f076022ed03b75301789d2f7466917404935fae762ea4f381058e02a85da5daa8fa011abaa318bf07329bb7c0773b811807ed33f59ee34da7
6
+ metadata.gz: 9987dc80f3f4425733cb8e3dde076bc6fce16a4a1422f0213c50f45f6eeb6e8008028d1ea77a33e91229997f728b337652ba06bc8d2d5d8641a395462915340a
7
+ data.tar.gz: c3b6fb9de748a805bbfe4a02c943ac2919b63fe9f10438b53569d710669fb9b70db81fa8affa210ec5a8a33c69db4f23eb96f6b5b041fe6c7da497366414cfcf
@@ -35,12 +35,9 @@ admin work on any Ruby application."
35
35
 
36
36
  spec.add_dependency "activesupport", ">= 6.1"
37
37
  spec.add_dependency "base64"
38
- spec.add_dependency "benchmark"
39
38
  spec.add_dependency "bigdecimal"
40
- spec.add_dependency "cgi"
41
39
  spec.add_dependency "csv"
42
40
  spec.add_dependency "deepsort", "~> 0.4.5"
43
- spec.add_dependency "logger"
44
41
  spec.add_dependency "mutex_m"
45
42
  spec.add_dependency "ostruct"
46
43
  spec.add_dependency "dry-container", "~> 0.11"
@@ -48,7 +45,7 @@ admin work on any Ruby application."
48
45
  spec.add_dependency "filecache", "~> 1.0"
49
46
  spec.add_dependency "ipaddress", "~> 0.8.3"
50
47
  spec.add_dependency "jsonapi-serializers", "~> 1.0"
51
- spec.add_dependency "jwt", "~> 3.1"
48
+ spec.add_dependency "jwt", "~> 2.7"
52
49
  spec.add_dependency "ld-eventsource", "~> 2.2"
53
50
  spec.add_dependency "mono_logger", "~> 1.1"
54
51
  spec.add_dependency "openid_connect", "~> 2.2"
@@ -1,5 +1,4 @@
1
- require 'active_support'
2
- require 'active_support/core_ext/numeric/time'
1
+ require 'date'
3
2
  require 'jwt'
4
3
 
5
4
  module ForestAdminAgent
@@ -16,21 +15,19 @@ module ForestAdminAgent
16
15
  end
17
16
 
18
17
  def expiration_in_seconds
19
- Time.now.to_i + 1.hour
18
+ (DateTime.now + (1 / 24.0)).to_time.to_i
20
19
  end
21
20
 
22
21
  def make_jwt
23
22
  attributes = @data['attributes']
24
-
25
23
  user = {
26
24
  id: id,
27
25
  email: attributes['email'],
28
26
  first_name: attributes['first_name'],
29
27
  last_name: attributes['last_name'],
30
28
  team: attributes['teams'][0],
31
- role: attributes['role'],
32
29
  tags: attributes['tags'],
33
- rendering_id: @rendering_id.to_s,
30
+ rendering_id: @rendering_id,
34
31
  exp: expiration_in_seconds,
35
32
  permission_level: attributes['permission_level']
36
33
  }
@@ -11,7 +11,6 @@ module ForestAdminAgent
11
11
  include ForestAdminDatasourceCustomizer::DSL::DatasourceHelpers
12
12
 
13
13
  attr_reader :customizer, :container, :has_env_secret
14
- attr_accessor :schema_only_mode
15
14
 
16
15
  def setup(options)
17
16
  @options = options
@@ -56,22 +55,7 @@ module ForestAdminAgent
56
55
  # Reset route cache to ensure routes are computed with all customizations
57
56
  ForestAdminAgent::Http::Router.reset_cached_routes!
58
57
 
59
- if @schema_only_mode
60
- generate_schema_only
61
- else
62
- send_schema
63
- end
64
- end
65
-
66
- def generate_schema_only
67
- datasource = @container.resolve(:datasource)
68
- schema = build_schema(datasource)
69
- schema_path = Facades::Container.cache(:schema_path)
70
-
71
- write_schema_file(schema_path, schema)
72
- @logger.log('Info', "[ForestAdmin] Schema generated successfully at #{schema_path}")
73
-
74
- schema
58
+ send_schema
75
59
  end
76
60
 
77
61
  def reload!
@@ -99,24 +83,6 @@ module ForestAdminAgent
99
83
 
100
84
  return unless @has_env_secret
101
85
 
102
- schema = generate_schema_file
103
-
104
- if (append_schema_path = Facades::Container.cache(:append_schema_path))
105
- begin
106
- append_schema_file = JSON.parse(File.read(append_schema_path), symbolize_names: true)
107
- schema[:collections] = schema[:collections] + append_schema_file[:collections]
108
- rescue StandardError => e
109
- raise "Can't load additional schema #{append_schema_path}: #{e.message}"
110
- end
111
- end
112
-
113
- post_schema(schema, force)
114
- end
115
-
116
- # Generates or loads the schema and writes it to file (in development mode).
117
- # This method can be overridden by subclasses that need to customize schema handling.
118
- # @return [Hash] The schema hash with :meta and :collections keys
119
- def generate_schema_file
120
86
  schema_path = Facades::Container.cache(:schema_path)
121
87
 
122
88
  if Facades::Container.cache(:is_production)
@@ -127,33 +93,29 @@ module ForestAdminAgent
127
93
  )
128
94
  end
129
95
 
130
- JSON.parse(File.read(schema_path), symbolize_names: true)
96
+ schema = JSON.parse(File.read(schema_path), symbolize_names: true)
131
97
  else
132
- datasource = @container.resolve(:datasource)
133
- schema = build_schema(datasource)
134
- write_schema_file(schema_path, schema)
135
- schema
98
+ generated = SchemaEmitter.generate(@container.resolve(:datasource))
99
+ meta = SchemaEmitter.meta
100
+
101
+ schema = {
102
+ meta: meta,
103
+ collections: generated
104
+ }
105
+
106
+ File.write(schema_path, format_schema_json(schema))
136
107
  end
137
- end
138
108
 
139
- # Builds the schema hash from the datasource
140
- # @param datasource [Object] The datasource to generate schema from
141
- # @return [Hash] The schema hash with :meta and :collections keys
142
- def build_schema(datasource)
143
- generated = SchemaEmitter.generate(datasource)
144
- meta = SchemaEmitter.meta
145
-
146
- {
147
- meta: meta,
148
- collections: generated
149
- }
150
- end
109
+ if (append_schema_path = Facades::Container.cache(:append_schema_path))
110
+ begin
111
+ append_schema_file = JSON.parse(File.read(append_schema_path), symbolize_names: true)
112
+ schema[:collections] = schema[:collections] + append_schema_file[:collections]
113
+ rescue StandardError => e
114
+ raise "Can't load additional schema #{append_schema_path}: #{e.message}"
115
+ end
116
+ end
151
117
 
152
- # Writes the schema to a file
153
- # @param schema_path [String] Path to write the schema file
154
- # @param schema [Hash] The schema to write
155
- def write_schema_file(schema_path, schema)
156
- File.write(schema_path, format_schema_json(schema))
118
+ post_schema(schema, force)
157
119
  end
158
120
 
159
121
  private
@@ -177,7 +139,9 @@ module ForestAdminAgent
177
139
  should_send = do_server_want_schema(api_map[:meta][:schemaFileHash])
178
140
 
179
141
  if should_send || force
180
- send_schema_to_server(api_map)
142
+ client = ForestAdminAgent::Http::ForestAdminApiRequester.new
143
+ client.post('/forest/apimaps', api_map.to_json)
144
+ ForestAdminAgent::Facades::Container.logger.log('Info', 'schema was updated, sending new version')
181
145
  else
182
146
  @container.resolve(:logger)
183
147
  ForestAdminAgent::Facades::Container.logger.log('Info', 'Schema was not updated since last run')
@@ -219,17 +183,6 @@ module ForestAdminAgent
219
183
  @options[:logger] = clean_option_value(@options[:logger], 'config.logger =')
220
184
 
221
185
  @container.register(:config, @options.to_h)
222
-
223
- configure_rpc_polling_pool if @options[:rpc_max_polling_threads]
224
- end
225
-
226
- def configure_rpc_polling_pool
227
- max_threads = @options[:rpc_max_polling_threads].to_i
228
- return unless max_threads.positive?
229
-
230
- return unless defined?(ForestAdminDatasourceRpc)
231
-
232
- ForestAdminDatasourceRpc.configure_polling_pool(max_threads: max_threads)
233
186
  end
234
187
 
235
188
  def build_logger
@@ -255,25 +208,6 @@ module ForestAdminAgent
255
208
  @logger.log('Info',
256
209
  "[ForestAdmin] Running in #{environment} mode")
257
210
  end
258
-
259
- def send_schema_to_server(api_map)
260
- ForestAdminAgent::Facades::Container.logger.log('Info', 'schema was updated, sending new version')
261
- client = ForestAdminAgent::Http::ForestAdminApiRequester.new
262
- client.post('/forest/apimaps', api_map.to_json)
263
- rescue Faraday::Error => e
264
- status = e.response[:status] if e.response
265
- if status
266
- ForestAdminAgent::Facades::Container.logger.log(
267
- 'Error',
268
- "Failed to send schema: invalid request (HTTP #{status})"
269
- )
270
- else
271
- ForestAdminAgent::Facades::Container.logger.log(
272
- 'Error',
273
- 'Failed to send schema: cannot reach ForestAdmin server'
274
- )
275
- end
276
- end
277
211
  end
278
212
  end
279
213
  end
@@ -12,7 +12,7 @@ module ForestAdminAgent
12
12
  end
13
13
 
14
14
  def self.logger
15
- instance&.resolve(:logger)
15
+ instance.resolve(:logger)
16
16
  end
17
17
 
18
18
  def self.config_from_cache
@@ -24,13 +24,11 @@ module ForestAdminAgent
24
24
  collection = datasource.get_collection(collection_name)
25
25
  {
26
26
  name: collection.name,
27
- fields: collection.schema[:fields].filter_map do |name, field|
28
- next unless field.is_a?(ColumnSchema)
29
-
27
+ fields: collection.schema[:fields].select { |_, field| field.is_a?(ColumnSchema) }.map do |name, field|
30
28
  {
31
29
  name: name,
32
30
  type: field.column_type,
33
- operators: field.filter_operators.to_a
31
+ operators: field.filter_operators.map { |operator| operator }
34
32
  }
35
33
  end
36
34
  }
@@ -29,7 +29,10 @@ module ForestAdminAgent
29
29
  @options[:class_name].gsub('::', '__')
30
30
  )
31
31
  primary_keys = ForestAdminDatasourceToolkit::Utils::Schema.primary_keys(forest_collection)
32
- primary_keys.map { |key| @object[key] }.join('|')
32
+ id = []
33
+ primary_keys.each { |key| id << @object[key] }
34
+
35
+ id.join('|')
33
36
  end
34
37
 
35
38
  def format_name(attribute_name)
@@ -263,7 +263,7 @@ module ForestAdminAgent
263
263
  def find_action_from_endpoint(collection_name, path, http_method)
264
264
  endpoint = path.partition('/forest/')[1..].join
265
265
  schema_file = JSON.parse(File.read(Facades::Container.config_from_cache[:schema_path]))
266
- actions = schema_file['collections']&.find { |collection| collection['name'] == collection_name }&.dig('actions')
266
+ actions = schema_file['collections']&.select { |collection| collection['name'] == collection_name }&.first&.dig('actions')
267
267
 
268
268
  return nil if actions.nil? || actions.empty?
269
269
 
@@ -30,11 +30,9 @@ module ForestAdminAgent
30
30
 
31
31
  if context_variable_key.start_with?(USER_VALUE_TAG_PREFIX)
32
32
  tag_key = context_variable_key[USER_VALUE_TAG_PREFIX.length..]
33
- tags = user[:tags]
34
- return nil if tags.nil?
35
-
36
- value = tags[tag_key] || tags[tag_key.to_sym]
37
- return value
33
+ user[:tags].each do |tag|
34
+ return tag['value'] if tag['key'] == tag_key
35
+ end
38
36
  end
39
37
 
40
38
  user[context_variable_key[USER_VALUE_PREFIX.length..].to_sym]
@@ -40,11 +40,10 @@ module ForestAdminAgent
40
40
  add_polymorphic_type_fields(collection, requested_field_names)
41
41
  projection_fields = build_projection_fields(collection, requested_field_names, args)
42
42
 
43
- ForestAdminDatasourceToolkit::Validations::ProjectionValidator.validate?(collection, projection_fields)
43
+ projection = Projection.new(projection_fields)
44
+ ForestAdminDatasourceToolkit::Validations::ProjectionValidator.validate?(collection, projection)
44
45
 
45
- Projection.new(projection_fields)
46
- rescue ForestAdminDatasourceToolkit::Exceptions::ForestException => e
47
- raise BadRequestError, "Invalid projection: #{e.message}"
46
+ projection
48
47
  end
49
48
 
50
49
  def self.add_polymorphic_type_fields(collection, requested_field_names)
@@ -64,31 +63,17 @@ module ForestAdminAgent
64
63
 
65
64
  def self.build_projection_fields(collection, requested_field_names, args)
66
65
  requested_field_names.map do |field_name|
67
- field = get_field(collection, field_name)
68
-
69
- case field.type
70
- when 'Column'
66
+ column = collection.schema[:fields][field_name]
67
+ if column.type == 'Column'
71
68
  field_name
72
- when 'PolymorphicManyToOne'
69
+ elsif column.type == 'PolymorphicManyToOne'
73
70
  "#{field_name}:*"
74
71
  else
75
- relation_fields = args.dig(:params, :fields, field_name)
76
- "#{field_name}:#{relation_fields}"
72
+ "#{field_name}:#{args[:params][:fields][field_name]}"
77
73
  end
78
74
  end
79
75
  end
80
-
81
- def self.get_field(collection, field_name)
82
- field = collection.schema[:fields][field_name]
83
- return field unless field.nil?
84
-
85
- available_fields = collection.schema[:fields].keys.join(', ')
86
- raise ForestAdminDatasourceToolkit::Exceptions::ValidationError,
87
- "The '#{collection.name}.#{field_name}' field was not found. " \
88
- "Available fields are: [#{available_fields}]. " \
89
- 'Please check if the field name is correct.'
90
- end
91
- private_class_method :add_polymorphic_type_fields, :build_projection_fields, :get_field
76
+ private_class_method :add_polymorphic_type_fields, :build_projection_fields
92
77
 
93
78
  def self.parse_projection_with_pks(collection, args)
94
79
  projection = parse_projection(collection, args)
@@ -5,12 +5,6 @@ module ForestAdminAgent
5
5
  def self.filterable?(operator)
6
6
  operator && !operator.empty?
7
7
  end
8
-
9
- def self.sort_operators(operators)
10
- return operators unless operators.is_a?(Array)
11
-
12
- operators.sort
13
- end
14
8
  end
15
9
  end
16
10
  end
@@ -29,9 +29,8 @@ module ForestAdminAgent
29
29
  action = collection.schema[:actions][name]
30
30
  action_index = collection.schema[:actions].keys.index(name)
31
31
  slug = get_action_slug(name)
32
-
32
+ form_elements = extract_fields_and_layout(collection.get_form(nil, name))
33
33
  if action.static_form
34
- form_elements = extract_fields_and_layout(collection.get_form(nil, name))
35
34
  fields = build_fields(collection, form_elements[:fields])
36
35
  layout = form_elements[:layout]
37
36
  else
@@ -6,7 +6,7 @@ module ForestAdminAgent
6
6
  module Schema
7
7
  class SchemaEmitter
8
8
  LIANA_NAME = "agent-ruby"
9
- LIANA_VERSION = "1.24.10"
9
+ LIANA_VERSION = "2.0.0"
10
10
 
11
11
  def self.generate(datasource)
12
12
  datasource.collections
@@ -1,3 +1,3 @@
1
1
  module ForestAdminAgent
2
- VERSION = "1.24.10"
2
+ VERSION = "2.0.0"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: forest_admin_agent
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.24.10
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Matthieu
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: exe
11
11
  cert_chain: []
12
- date: 2026-03-02 00:00:00.000000000 Z
12
+ date: 2025-12-11 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activesupport
@@ -39,20 +39,6 @@ dependencies:
39
39
  - - ">="
40
40
  - !ruby/object:Gem::Version
41
41
  version: '0'
42
- - !ruby/object:Gem::Dependency
43
- name: benchmark
44
- requirement: !ruby/object:Gem::Requirement
45
- requirements:
46
- - - ">="
47
- - !ruby/object:Gem::Version
48
- version: '0'
49
- type: :runtime
50
- prerelease: false
51
- version_requirements: !ruby/object:Gem::Requirement
52
- requirements:
53
- - - ">="
54
- - !ruby/object:Gem::Version
55
- version: '0'
56
42
  - !ruby/object:Gem::Dependency
57
43
  name: bigdecimal
58
44
  requirement: !ruby/object:Gem::Requirement
@@ -67,20 +53,6 @@ dependencies:
67
53
  - - ">="
68
54
  - !ruby/object:Gem::Version
69
55
  version: '0'
70
- - !ruby/object:Gem::Dependency
71
- name: cgi
72
- requirement: !ruby/object:Gem::Requirement
73
- requirements:
74
- - - ">="
75
- - !ruby/object:Gem::Version
76
- version: '0'
77
- type: :runtime
78
- prerelease: false
79
- version_requirements: !ruby/object:Gem::Requirement
80
- requirements:
81
- - - ">="
82
- - !ruby/object:Gem::Version
83
- version: '0'
84
56
  - !ruby/object:Gem::Dependency
85
57
  name: csv
86
58
  requirement: !ruby/object:Gem::Requirement
@@ -109,20 +81,6 @@ dependencies:
109
81
  - - "~>"
110
82
  - !ruby/object:Gem::Version
111
83
  version: 0.4.5
112
- - !ruby/object:Gem::Dependency
113
- name: logger
114
- requirement: !ruby/object:Gem::Requirement
115
- requirements:
116
- - - ">="
117
- - !ruby/object:Gem::Version
118
- version: '0'
119
- type: :runtime
120
- prerelease: false
121
- version_requirements: !ruby/object:Gem::Requirement
122
- requirements:
123
- - - ">="
124
- - !ruby/object:Gem::Version
125
- version: '0'
126
84
  - !ruby/object:Gem::Dependency
127
85
  name: mutex_m
128
86
  requirement: !ruby/object:Gem::Requirement
@@ -227,14 +185,14 @@ dependencies:
227
185
  requirements:
228
186
  - - "~>"
229
187
  - !ruby/object:Gem::Version
230
- version: '3.1'
188
+ version: '2.7'
231
189
  type: :runtime
232
190
  prerelease: false
233
191
  version_requirements: !ruby/object:Gem::Requirement
234
192
  requirements:
235
193
  - - "~>"
236
194
  - !ruby/object:Gem::Version
237
- version: '3.1'
195
+ version: '2.7'
238
196
  - !ruby/object:Gem::Dependency
239
197
  name: ld-eventsource
240
198
  requirement: !ruby/object:Gem::Requirement