forest_liana 9.16.1 → 9.17.1

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f5def4c0d7226797a8b932f16749a655b526c6278689417b712866c1eb223a78
4
- data.tar.gz: c08d1acf4f8f36a67590b334cd175c76e87deabc47507dd7a57619a7f94302ec
3
+ metadata.gz: 16bdb91facdb11410af87209603b89aee45670322979b84bcb586a753fe47179
4
+ data.tar.gz: 0c748d62bc3081e48a2ad46f1c7a27ce133b7e5c2b2eb9e9fa1f5c64c2a6491e
5
5
  SHA512:
6
- metadata.gz: 63b2d98871047ed88390ba98905430e201c7bf43b94d86d13fa1dd7a3c77ccbc8f0711e6d0f878f93ac48c09d6d3a35db630979690764038e4b85ad6e51b976a
7
- data.tar.gz: 134d72f9a8b49d5f3fdf3889eb72fb08f4308ff2645fc97933c7122cffcaf35891b5bff8e3e3fa5de9725381cf9a7142bf5188146db6035048efccab6e7c33dc
6
+ metadata.gz: 426d29525742b6b53c939838a6db17ccfc40f781fa3ae9bc1e9d085170468944d9487c52c653c5d5ff45ea991303ceb809916c1b6e49389153baf3476026a448
7
+ data.tar.gz: 1f7db109fff86b8d6ac6bfb53e31aa0a6e2a449a8074243359ece98c69058a4f361aa0ce92f4d632dfd08a0e758e316e70e2b09d446fcfa646d029fe394969c5
@@ -454,7 +454,31 @@ module ForestLiana
454
454
  def add_default_value(column_schema, column)
455
455
  # TODO: detect/introspect the attribute default value with Rails 5
456
456
  # ex: attribute :email, :string, default: 'arnaud@forestadmin.com'
457
- column_schema[:default_value] = column.default if column.default
457
+
458
+ unless column.default.nil?
459
+ column_schema[:default_value] = normalize_default_value(column)
460
+ end
461
+ end
462
+
463
+ def normalize_default_value(column)
464
+ # In Ruby 4.0+ and Rails 8+, ActiveRecord returns default values as strings
465
+ case column.type
466
+ when :boolean
467
+ case column.default.to_s
468
+ when '0', 'f', 'false'
469
+ false
470
+ when '1', 't', 'true'
471
+ true
472
+ else
473
+ column.default
474
+ end
475
+ when :integer
476
+ column.default.to_i
477
+ when :float, :decimal
478
+ column.default.to_f
479
+ else
480
+ column.default
481
+ end
458
482
  end
459
483
 
460
484
  def add_validations(column_schema, column)
@@ -1,3 +1,3 @@
1
1
  module ForestLiana
2
- VERSION = "9.16.1"
2
+ VERSION = "9.17.1"
3
3
  end
@@ -0,0 +1,157 @@
1
+ module ForestLiana
2
+ describe SchemaAdapter do
3
+ describe 'normalize_default_value' do
4
+ context 'with boolean fields' do
5
+ before(:each) do
6
+ @original_apimap = ForestLiana.apimap.dup
7
+ @original_models = ForestLiana.models.dup
8
+
9
+ Object.const_set(:BooleanFieldWithDefault, Class.new(ActiveRecord::Base) do
10
+ self.table_name = 'boolean_fields_with_defaults'
11
+ end)
12
+
13
+ ActiveRecord::Migration.suppress_messages do
14
+ if ActiveRecord::Base.connection.table_exists?('boolean_fields_with_defaults')
15
+ ActiveRecord::Base.connection.drop_table('boolean_fields_with_defaults')
16
+ end
17
+ ActiveRecord::Base.connection.create_table('boolean_fields_with_defaults') do |t|
18
+ t.boolean :active, default: false
19
+ t.boolean :verified, default: true
20
+ t.boolean :nullable
21
+ end
22
+ end
23
+ end
24
+
25
+ after(:each) do
26
+ ForestLiana.apimap = @original_apimap
27
+ ForestLiana.models = @original_models
28
+
29
+ ActiveRecord::Migration.suppress_messages do
30
+ ActiveRecord::Base.connection.drop_table('boolean_fields_with_defaults') if ActiveRecord::Base.connection.table_exists?('boolean_fields_with_defaults')
31
+ end
32
+ Object.send(:remove_const, :BooleanFieldWithDefault) if Object.const_defined?(:BooleanFieldWithDefault)
33
+ end
34
+
35
+ it 'should convert boolean default values to proper booleans' do
36
+ ForestLiana.models = [BooleanFieldWithDefault]
37
+ ForestLiana.apimap = []
38
+
39
+ adapter = SchemaAdapter.new(BooleanFieldWithDefault)
40
+ collection = adapter.perform
41
+
42
+ active_field = collection.fields.find { |f| f[:field] == 'active' }
43
+ verified_field = collection.fields.find { |f| f[:field] == 'verified' }
44
+ nullable_field = collection.fields.find { |f| f[:field] == 'nullable' }
45
+
46
+ expect(active_field[:default_value]).to eq(false)
47
+ expect(active_field[:default_value].class).to eq(FalseClass)
48
+
49
+ expect(verified_field[:default_value]).to eq(true)
50
+ expect(verified_field[:default_value].class).to eq(TrueClass)
51
+
52
+ expect(nullable_field[:default_value]).to be_nil
53
+ end
54
+ end
55
+
56
+ context 'with enum fields' do
57
+ before(:each) do
58
+ @original_apimap = ForestLiana.apimap.dup
59
+ @original_models = ForestLiana.models.dup
60
+
61
+ Object.const_set(:EnumFieldModel, Class.new(ActiveRecord::Base) do
62
+ self.table_name = 'enum_field_models'
63
+ enum status: { inactive: 0, active: 1, archived: 2 }
64
+ enum role: { user: "0", admin: "1", superadmin: "2" }
65
+ end)
66
+
67
+ ActiveRecord::Migration.suppress_messages do
68
+ if ActiveRecord::Base.connection.table_exists?('enum_field_models')
69
+ ActiveRecord::Base.connection.drop_table('enum_field_models')
70
+ end
71
+ ActiveRecord::Base.connection.create_table('enum_field_models') do |t|
72
+ t.integer :status, default: 0
73
+ t.integer :role, default: 1
74
+ end
75
+ end
76
+ end
77
+
78
+ after(:each) do
79
+ ForestLiana.apimap = @original_apimap
80
+ ForestLiana.models = @original_models
81
+
82
+ ActiveRecord::Migration.suppress_messages do
83
+ ActiveRecord::Base.connection.drop_table('enum_field_models') if ActiveRecord::Base.connection.table_exists?('enum_field_models')
84
+ end
85
+ Object.send(:remove_const, :EnumFieldModel) if Object.const_defined?(:EnumFieldModel)
86
+ end
87
+
88
+ it 'should convert enum default values to integers' do
89
+ ForestLiana.models = [EnumFieldModel]
90
+ ForestLiana.apimap = []
91
+
92
+ adapter = SchemaAdapter.new(EnumFieldModel)
93
+ collection = adapter.perform
94
+
95
+ status_field = collection.fields.find { |f| f[:field] == 'status' }
96
+ role_field = collection.fields.find { |f| f[:field] == 'role' }
97
+
98
+ expect(status_field[:default_value]).to eq(0)
99
+ expect(status_field[:default_value].class).to eq(Integer)
100
+
101
+ expect(role_field[:default_value]).to eq(1)
102
+ expect(role_field[:default_value].class).to eq(Integer)
103
+ end
104
+ end
105
+
106
+ context 'with numeric fields' do
107
+ before(:each) do
108
+ @original_apimap = ForestLiana.apimap.dup
109
+ @original_models = ForestLiana.models.dup
110
+
111
+ Object.const_set(:NumericFieldModel, Class.new(ActiveRecord::Base) do
112
+ self.table_name = 'numeric_field_models'
113
+ end)
114
+
115
+ ActiveRecord::Migration.suppress_messages do
116
+ if ActiveRecord::Base.connection.table_exists?('numeric_field_models')
117
+ ActiveRecord::Base.connection.drop_table('numeric_field_models')
118
+ end
119
+ ActiveRecord::Base.connection.create_table('numeric_field_models') do |t|
120
+ t.integer :count, default: 0
121
+ t.float :rate, default: 0.5
122
+ t.decimal :price, default: 9.99
123
+ end
124
+ end
125
+ end
126
+
127
+ after(:each) do
128
+ ForestLiana.apimap = @original_apimap
129
+ ForestLiana.models = @original_models
130
+
131
+ ActiveRecord::Migration.suppress_messages do
132
+ ActiveRecord::Base.connection.drop_table('numeric_field_models') if ActiveRecord::Base.connection.table_exists?('numeric_field_models')
133
+ end
134
+ Object.send(:remove_const, :NumericFieldModel) if Object.const_defined?(:NumericFieldModel)
135
+ end
136
+
137
+ it 'should convert numeric default values to proper types' do
138
+ ForestLiana.models = [NumericFieldModel]
139
+ ForestLiana.apimap = []
140
+
141
+ adapter = SchemaAdapter.new(NumericFieldModel)
142
+ collection = adapter.perform
143
+
144
+ count_field = collection.fields.find { |f| f[:field] == 'count' }
145
+ rate_field = collection.fields.find { |f| f[:field] == 'rate' }
146
+ price_field = collection.fields.find { |f| f[:field] == 'price' }
147
+
148
+ expect(count_field[:default_value]).to eq(0)
149
+ expect(count_field[:default_value].class).to eq(Integer)
150
+
151
+ expect(rate_field[:default_value]).to be_a(Float)
152
+ expect(price_field[:default_value]).to be_a(Float)
153
+ end
154
+ end
155
+ end
156
+ end
157
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: forest_liana
3
3
  version: !ruby/object:Gem::Version
4
- version: 9.16.1
4
+ version: 9.17.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sandro Munda
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2025-12-05 00:00:00.000000000 Z
11
+ date: 2026-01-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -192,6 +192,34 @@ dependencies:
192
192
  - - ">="
193
193
  - !ruby/object:Gem::Version
194
194
  version: '0'
195
+ - !ruby/object:Gem::Dependency
196
+ name: ostruct
197
+ requirement: !ruby/object:Gem::Requirement
198
+ requirements:
199
+ - - ">="
200
+ - !ruby/object:Gem::Version
201
+ version: '0'
202
+ type: :runtime
203
+ prerelease: false
204
+ version_requirements: !ruby/object:Gem::Requirement
205
+ requirements:
206
+ - - ">="
207
+ - !ruby/object:Gem::Version
208
+ version: '0'
209
+ - !ruby/object:Gem::Dependency
210
+ name: csv
211
+ requirement: !ruby/object:Gem::Requirement
212
+ requirements:
213
+ - - ">="
214
+ - !ruby/object:Gem::Version
215
+ version: '0'
216
+ type: :runtime
217
+ prerelease: false
218
+ version_requirements: !ruby/object:Gem::Requirement
219
+ requirements:
220
+ - - ">="
221
+ - !ruby/object:Gem::Version
222
+ version: '0'
195
223
  description: Forest is a modern admin interface that works on all major web frameworks.
196
224
  forest_liana is the gem that makes Forest admin work on any Rails application (Rails
197
225
  >= 4.0).
@@ -433,6 +461,7 @@ files:
433
461
  - spec/services/forest_liana/resource_updater_spec.rb
434
462
  - spec/services/forest_liana/resources_getter_composite_keys_spec.rb
435
463
  - spec/services/forest_liana/resources_getter_spec.rb
464
+ - spec/services/forest_liana/schema_adapter_default_values_spec.rb
436
465
  - spec/services/forest_liana/schema_adapter_spec.rb
437
466
  - spec/services/forest_liana/scope_manager_spec.rb
438
467
  - spec/services/forest_liana/serializer_factory_spec.rb
@@ -741,6 +770,7 @@ test_files:
741
770
  - spec/services/forest_liana/resource_updater_spec.rb
742
771
  - spec/services/forest_liana/resources_getter_composite_keys_spec.rb
743
772
  - spec/services/forest_liana/resources_getter_spec.rb
773
+ - spec/services/forest_liana/schema_adapter_default_values_spec.rb
744
774
  - spec/services/forest_liana/schema_adapter_spec.rb
745
775
  - spec/services/forest_liana/scope_manager_spec.rb
746
776
  - spec/services/forest_liana/serializer_factory_spec.rb