forest_liana 9.17.0 → 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: 79bda2b54d1daacca266bd2f1b8197ef59a8964c46d895fda1c240bdbcc6b7d1
4
- data.tar.gz: 1f60f2be8749c3d3e3aeb9208e4cae70cd3616030a6563980ca843743186073c
3
+ metadata.gz: 16bdb91facdb11410af87209603b89aee45670322979b84bcb586a753fe47179
4
+ data.tar.gz: 0c748d62bc3081e48a2ad46f1c7a27ce133b7e5c2b2eb9e9fa1f5c64c2a6491e
5
5
  SHA512:
6
- metadata.gz: 9a3754ed9509e127884404b37c1afb9a059522379673b48514c511dc5f94bb97c0dfef68bc2d7284dae25dea580875a772bae8eb464d529ab79c1eb96315c459
7
- data.tar.gz: 89c13361f05f461155aae07c8f63b2524513ff50342506d9e7139ea5c9dcbea7fcaf67166a27f6601199696861d4acc611d7d4461e0aa6c4f75998b2ea9bd0a4
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.17.0"
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.17.0
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: 2026-01-06 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
@@ -461,6 +461,7 @@ files:
461
461
  - spec/services/forest_liana/resource_updater_spec.rb
462
462
  - spec/services/forest_liana/resources_getter_composite_keys_spec.rb
463
463
  - spec/services/forest_liana/resources_getter_spec.rb
464
+ - spec/services/forest_liana/schema_adapter_default_values_spec.rb
464
465
  - spec/services/forest_liana/schema_adapter_spec.rb
465
466
  - spec/services/forest_liana/scope_manager_spec.rb
466
467
  - spec/services/forest_liana/serializer_factory_spec.rb
@@ -769,6 +770,7 @@ test_files:
769
770
  - spec/services/forest_liana/resource_updater_spec.rb
770
771
  - spec/services/forest_liana/resources_getter_composite_keys_spec.rb
771
772
  - spec/services/forest_liana/resources_getter_spec.rb
773
+ - spec/services/forest_liana/schema_adapter_default_values_spec.rb
772
774
  - spec/services/forest_liana/schema_adapter_spec.rb
773
775
  - spec/services/forest_liana/scope_manager_spec.rb
774
776
  - spec/services/forest_liana/serializer_factory_spec.rb