forest_liana 8.0.17 → 9.0.0.beta.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ac43c231df7ce45742201f1824fc1733cf94dd2ccfc1f8ffaa214273f6f2f9c3
4
- data.tar.gz: 5208918a6d4dde8b08e54077060f3a822c7b8126ec15838b7dd47bb0ebcb3464
3
+ metadata.gz: 0a157aee784201e7da6a7330fc813ce01540107f3c319a6ac294120de809a823
4
+ data.tar.gz: f8343a2641fa23b7eb2934d35a0de7f5e8198e44c961380a0c07a9049671f2ab
5
5
  SHA512:
6
- metadata.gz: 33843161d1f741d9a1786c19d21607f1c2e2bcd6c64994fafefd979c8f4268d1d6ea24261d59b89ed98f3ac14563472991a1a9bb631c612a8a87ab58b744d18a
7
- data.tar.gz: f50308426ddf53f9e1599c94ed71f1d2458d281b094335e361f6570aad2657406a3c44bbb117084503304b35f8a70f3e197f491b2c4596757c831b0849cf340b
6
+ metadata.gz: 6057484cb179b3ae0203f935df4638cd080c4777807cfcc4758a4dd2bbfc9ca4627cd1a7b85b487a469f2e9a66f31a9ce9f58e7fdd474e5de552516780c57be2
7
+ data.tar.gz: 6bb712c6471e7cbe7016582b3a10fe34159cf46b12b8c1626ca706fb95f2d91e585ee4dd8592a1efcf8afd91e287def131777f35c2d028903fa502a4007cd546
@@ -63,7 +63,12 @@ module ForestLiana
63
63
  # ActionController::Parameters do not inherit from Hash anymore
64
64
  # since Rails 5.
65
65
  if (data.is_a?(Hash) || data.is_a?(ActionController::Parameters)) && data[:id]
66
- @attributes[name] = association.klass.find(data[:id])
66
+ if (SchemaUtils.polymorphic?(association))
67
+ @attributes[association.foreign_key] = data[:id]
68
+ @attributes[association.foreign_type] = data[:type]
69
+ else
70
+ @attributes[name] = association.klass.find(data[:id])
71
+ end
67
72
  elsif data.blank?
68
73
  @attributes[name] = nil
69
74
  end
@@ -1,8 +1,16 @@
1
1
  module ForestLiana
2
2
  module QueryHelper
3
3
  def self.get_one_associations(resource)
4
- SchemaUtils.one_associations(resource)
5
- .select { |association| SchemaUtils.model_included?(association.klass) }
4
+ associations = SchemaUtils.one_associations(resource)
5
+ .select do |association|
6
+ if SchemaUtils.polymorphic?(association)
7
+ SchemaUtils.polymorphic_models(association).all? { |model| SchemaUtils.model_included?(model) }
8
+ else
9
+ SchemaUtils.model_included?(association.klass)
10
+ end
11
+ end
12
+
13
+ associations
6
14
  end
7
15
 
8
16
  def self.get_one_association_names_symbol(resource)
@@ -18,10 +26,19 @@ module ForestLiana
18
26
  associations_has_one = self.get_one_associations(resource)
19
27
 
20
28
  associations_has_one.each do |association|
21
- if tables_associated_to_relations_name[association.table_name].nil?
22
- tables_associated_to_relations_name[association.table_name] = []
29
+ if SchemaUtils.polymorphic?(association)
30
+ SchemaUtils.polymorphic_models(association).each do |model|
31
+ if tables_associated_to_relations_name[model.table_name].nil?
32
+ tables_associated_to_relations_name[model.table_name] = []
33
+ end
34
+ tables_associated_to_relations_name[model.table_name] << association.name
35
+ end
36
+ else
37
+ if tables_associated_to_relations_name[association.try(:table_name)].nil?
38
+ tables_associated_to_relations_name[association.table_name] = []
39
+ end
40
+ tables_associated_to_relations_name[association.table_name] << association.name
23
41
  end
24
- tables_associated_to_relations_name[association.table_name] << association.name
25
42
  end
26
43
 
27
44
  tables_associated_to_relations_name
@@ -265,7 +265,19 @@ module ForestLiana
265
265
 
266
266
  SchemaUtils.associations(active_record_class).each do |a|
267
267
  begin
268
- if SchemaUtils.model_included?(a.klass)
268
+ if SchemaUtils.polymorphic?(a)
269
+ serializer.send(serializer_association(a), a.name) {
270
+ if [:has_one, :belongs_to].include?(a.macro)
271
+ begin
272
+ object.send(a.name)
273
+ rescue ActiveRecord::RecordNotFound
274
+ nil
275
+ end
276
+ else
277
+ []
278
+ end
279
+ }
280
+ elsif SchemaUtils.model_included?(a.klass)
269
281
  serializer.send(serializer_association(a), a.name) {
270
282
  if [:has_one, :belongs_to].include?(a.macro)
271
283
  begin
@@ -369,6 +381,7 @@ module ForestLiana
369
381
 
370
382
  def attributes(active_record_class)
371
383
  return [] if @is_smart_collection
384
+
372
385
  active_record_class.column_names.select do |column_name|
373
386
  !association?(active_record_class, column_name)
374
387
  end
@@ -410,6 +423,9 @@ module ForestLiana
410
423
  def foreign_keys(active_record_class)
411
424
  begin
412
425
  SchemaUtils.belongs_to_associations(active_record_class).map(&:foreign_key)
426
+ SchemaUtils.belongs_to_associations(active_record_class)
427
+ .select { |association| !SchemaUtils.polymorphic?(association) }
428
+ .map(&:foreign_key)
413
429
  rescue => err
414
430
  # Association foreign_key triggers an error. Put the stacktrace and
415
431
  # returns no foreign keys.
@@ -29,6 +29,7 @@ module ForestLiana
29
29
  'relationship',
30
30
  'widget',
31
31
  'validations',
32
+ 'polymorphic_referenced_models',
32
33
  ]
33
34
  KEYS_ACTION = [
34
35
  'name',
@@ -33,16 +33,23 @@ module ForestLiana
33
33
  def optimize_record_loading(resource, records)
34
34
  instance_dependent_associations = instance_dependent_associations(resource)
35
35
 
36
+ polymorphic = []
36
37
  preload_loads = @includes.select do |name|
37
- targetModelConnection = resource.reflect_on_association(name).klass.connection
38
- targetModelDatabase = targetModelConnection.current_database if targetModelConnection.respond_to? :current_database
39
- resourceConnection = resource.connection
40
- resourceDatabase = resourceConnection.current_database if resourceConnection.respond_to? :current_database
38
+ association = resource.reflect_on_association(name)
39
+ if SchemaUtils.polymorphic?(association)
40
+ polymorphic << association.name
41
+ false
42
+ else
43
+ targetModelConnection = association.klass.connection
44
+ targetModelDatabase = targetModelConnection.current_database if targetModelConnection.respond_to? :current_database
45
+ resourceConnection = resource.connection
46
+ resourceDatabase = resourceConnection.current_database if resourceConnection.respond_to? :current_database
41
47
 
42
- targetModelDatabase != resourceDatabase
48
+ targetModelDatabase != resourceDatabase
49
+ end
43
50
  end + instance_dependent_associations
44
51
 
45
- result = records.eager_load(@includes - preload_loads)
52
+ result = records.eager_load(@includes - preload_loads - polymorphic)
46
53
 
47
54
  # Rails 7 can mix `eager_load` and `preload` in the same scope
48
55
  # Rails 6 cannot mix `eager_load` and `preload` in the same scope
@@ -13,7 +13,16 @@ module ForestLiana
13
13
  def perform
14
14
  begin
15
15
  @record = @resource.find(@params[:id])
16
- new_value = @association.klass.find(@data[:id]) if @data && @data[:id]
16
+ if (SchemaUtils.polymorphic?(@association))
17
+ if @data.nil?
18
+ new_value = nil
19
+ else
20
+ association_klass = SchemaUtils.polymorphic_models(@association).select { |a| a.name.downcase == @data[:type] }.first
21
+ new_value = association_klass.find(@data[:id]) if @data && @data[:id]
22
+ end
23
+ else
24
+ new_value = @association.klass.find(@data[:id]) if @data && @data[:id]
25
+ end
17
26
  @record.send("#{@association.name}=", new_value)
18
27
 
19
28
  @record.save
@@ -40,17 +40,23 @@ module ForestLiana
40
40
  @includes = @association.klass
41
41
  .reflect_on_all_associations
42
42
  .select do |association|
43
- inclusion = !association.options[:polymorphic] &&
44
- SchemaUtils.model_included?(association.klass) &&
45
- [:belongs_to, :has_and_belongs_to_many].include?(association.macro)
46
43
 
47
- if @field_names_requested
48
- inclusion && @field_names_requested.include?(association.name)
44
+ if SchemaUtils.polymorphic?(association)
45
+ inclusion = SchemaUtils.polymorphic_models(association)
46
+ .all? { |model| SchemaUtils.model_included?(model) } &&
47
+ [:belongs_to, :has_and_belongs_to_many].include?(association.macro)
49
48
  else
50
- inclusion
49
+ inclusion = SchemaUtils.model_included?(association.klass) &&
50
+ [:belongs_to, :has_and_belongs_to_many].include?(association.macro)
51
51
  end
52
- end
53
- .map { |association| association.name.to_s }
52
+
53
+ if @field_names_requested
54
+ inclusion && @field_names_requested.include?(association.name)
55
+ else
56
+ inclusion
57
+ end
58
+ end
59
+ .map { |association| association.name }
54
60
  end
55
61
 
56
62
  def field_names_requested
@@ -241,8 +241,31 @@ module ForestLiana
241
241
  def add_associations
242
242
  SchemaUtils.associations(@model).each do |association|
243
243
  begin
244
+ if SchemaUtils.polymorphic?(association) &&
245
+ collection.fields << {
246
+ field: association.name.to_s,
247
+ type: get_type_for_association(association),
248
+ relationship: get_relationship_type(association),
249
+ reference: "#{association.name.to_s}.id",
250
+ inverse_of: @model.name.demodulize.underscore,
251
+ is_filterable: false,
252
+ is_sortable: true,
253
+ is_read_only: false,
254
+ is_required: false,
255
+ is_virtual: false,
256
+ default_value: nil,
257
+ integration: nil,
258
+ relationships: nil,
259
+ widget: nil,
260
+ validations: [],
261
+ polymorphic_referenced_models: get_polymorphic_types(association)
262
+ }
263
+
264
+ collection.fields = collection.fields.reject do |field|
265
+ field[:field] == association.foreign_key || field[:field] == association.foreign_type
266
+ end
244
267
  # NOTICE: Delete the association if the targeted model is excluded.
245
- if !SchemaUtils.model_included?(association.klass)
268
+ elsif !SchemaUtils.model_included?(association.klass)
246
269
  field = collection.fields.find do |x|
247
270
  x[:field] == association.foreign_key
248
271
  end
@@ -275,6 +298,17 @@ module ForestLiana
275
298
  automatic_inverse_of(association)
276
299
  end
277
300
 
301
+ def get_polymorphic_types(relation)
302
+ types = []
303
+ ForestLiana.models.each do |model|
304
+ unless model.reflect_on_all_associations.select { |association| association.options[:as] == relation.name.to_sym }.empty?
305
+ types << model.name
306
+ end
307
+ end
308
+
309
+ types
310
+ end
311
+
278
312
  def automatic_inverse_of(association)
279
313
  name = association.active_record.name.demodulize.underscore
280
314
 
@@ -4,7 +4,7 @@ module ForestLiana
4
4
  def self.associations(active_record_class)
5
5
  active_record_class.reflect_on_all_associations.select do |association|
6
6
  begin
7
- !polymorphic?(association) && !is_active_type?(association.klass)
7
+ polymorphic?(association) ? true : !is_active_type?(association.klass)
8
8
  rescue
9
9
  FOREST_LOGGER.warn "Unknown association #{association.name} on class #{active_record_class.name}"
10
10
  false
@@ -53,12 +53,30 @@ module ForestLiana
53
53
  ActiveRecord::Base.connection.tables
54
54
  end
55
55
 
56
- private
57
-
58
56
  def self.polymorphic?(association)
59
57
  association.options[:polymorphic]
60
58
  end
61
59
 
60
+ def self.klass(association)
61
+ return association.klass unless polymorphic?(association)
62
+
63
+
64
+ end
65
+
66
+ def self.polymorphic_models(relation)
67
+ models = []
68
+ ForestLiana.models.each do |model|
69
+ unless model.reflect_on_all_associations.select { |association| association.options[:as] == relation.name.to_sym }.empty?
70
+ models << model
71
+ end
72
+ end
73
+
74
+ models
75
+ end
76
+
77
+
78
+ private
79
+
62
80
  def self.find_model_from_abstract_class(abstract_class, collection_name)
63
81
  abstract_class.subclasses.find do |subclass|
64
82
  if subclass.abstract_class?
@@ -5,7 +5,12 @@ module ForestLiana
5
5
  class Bootstrapper
6
6
  SCHEMA_FILENAME = File.join(Dir.pwd, '.forestadmin-schema.json')
7
7
 
8
- def initialize
8
+ def initialize(reset_api_map = false)
9
+ if reset_api_map
10
+ ForestLiana.apimap = []
11
+ ForestLiana.models = []
12
+ end
13
+
9
14
  @integration_stripe_valid = false
10
15
  @integration_intercom_valid = false
11
16
 
@@ -35,6 +35,7 @@ module ForestLiana
35
35
  'relationship',
36
36
  'widget',
37
37
  'validations',
38
+ 'polymorphic_referenced_models',
38
39
  ]
39
40
  KEYS_VALIDATION = [
40
41
  'message',
@@ -1,3 +1,3 @@
1
1
  module ForestLiana
2
- VERSION = "8.0.17"
2
+ VERSION = "9.0.0.beta.1"
3
3
  end
@@ -3,7 +3,7 @@ namespace :forest do
3
3
  task(:send_apimap).clear
4
4
  task send_apimap: :environment do
5
5
  if ForestLiana.env_secret
6
- bootstrapper = ForestLiana::Bootstrapper.new
6
+ bootstrapper = ForestLiana::Bootstrapper.new(true)
7
7
  bootstrapper.synchronize(true)
8
8
  else
9
9
  puts 'Cannot send the Apimap, Forest cannot find your env_secret'
@@ -0,0 +1,5 @@
1
+ class Address < ActiveRecord::Base
2
+ self.table_name = 'addresses'
3
+
4
+ belongs_to :addressable, polymorphic: true
5
+ end
@@ -1,6 +1,7 @@
1
1
  class User < ActiveRecord::Base
2
2
  has_many :trees_owned, class_name: 'Tree', inverse_of: :owner
3
3
  has_many :trees_cut, class_name: 'Tree', inverse_of: :cutter
4
+ has_many :addresses, as: :addressable
4
5
 
5
6
  enum title: [ :king, :villager, :outlaw ]
6
7
  end
@@ -0,0 +1,12 @@
1
+ class CreateAddresses < ActiveRecord::Migration[6.0]
2
+ def change
3
+ create_table :addresses do |t|
4
+ t.string :line1
5
+ t.string :city
6
+ t.string :zipcode
7
+ t.references :addressable, polymorphic: true, null: false
8
+
9
+ t.timestamps
10
+ end
11
+ end
12
+ end
@@ -10,7 +10,18 @@
10
10
  #
11
11
  # It's strongly recommended that you check this file into your version control system.
12
12
 
13
- ActiveRecord::Schema.define(version: 2022_07_27_114930) do
13
+ ActiveRecord::Schema.define(version: 2023_11_17_084236) do
14
+
15
+ create_table "addresses", force: :cascade do |t|
16
+ t.string "line1"
17
+ t.string "city"
18
+ t.string "zipcode"
19
+ t.string "addressable_type", null: false
20
+ t.integer "addressable_id", null: false
21
+ t.datetime "created_at", precision: 6, null: false
22
+ t.datetime "updated_at", precision: 6, null: false
23
+ t.index ["addressable_type", "addressable_id"], name: "index_addresses_on_addressable_type_and_addressable_id"
24
+ end
14
25
 
15
26
  create_table "isle", force: :cascade do |t|
16
27
  t.string "name"
@@ -3,6 +3,7 @@ module ForestLiana
3
3
  before(:all) do
4
4
  Tree.connection
5
5
  User.connection
6
+ Address.connection
6
7
  Island.connection
7
8
  end
8
9
 
@@ -14,6 +15,21 @@ module ForestLiana
14
15
  end
15
16
  end
16
17
 
18
+ context 'on a model having 1 polymorphic association' do
19
+ it 'should return the association' do
20
+ associations = QueryHelper.get_one_associations(Address)
21
+ expect(associations).to eq(Address.reflect_on_all_associations(:belongs_to))
22
+ end
23
+
24
+ it 'should return 0 association when one of referenced model was excluded' do
25
+ allow(ForestLiana).to receive(:excluded_models).and_return(['User'])
26
+ associations = QueryHelper.get_one_associations(Address)
27
+
28
+ expect(associations.length).to eq(0)
29
+ end
30
+ end
31
+
32
+
17
33
  context 'on a model having some belongsTo associations' do
18
34
  let(:expected_association_attributes) do
19
35
  [
@@ -75,7 +91,15 @@ module ForestLiana
75
91
  expect(tables_associated_to_relations_name['isle'].second).to eq(:eponymous_island)
76
92
  end
77
93
  end
78
- end
79
94
 
95
+ context 'on a model having polymorphic association' do
96
+ tables_associated_to_relations_name =
97
+ QueryHelper.get_tables_associated_to_relations_name(Address)
98
+
99
+ it 'should return the one-one associations' do
100
+ expect(tables_associated_to_relations_name.keys.length).to eq(1)
101
+ end
102
+ end
103
+ end
80
104
  end
81
105
  end
@@ -23,6 +23,7 @@ module ForestLiana
23
23
 
24
24
  let(:expected_application_models) do
25
25
  [
26
+ Address,
26
27
  Island,
27
28
  Location,
28
29
  Manufacturer,
@@ -10,6 +10,41 @@ module ForestLiana
10
10
  end
11
11
 
12
12
  describe "with a given collection" do
13
+ describe "when the collection has a polymorphic relation" do
14
+ it "should save the relation" do
15
+ collections = [
16
+ {
17
+ "name" => "Address",
18
+ "fields" => [
19
+ {
20
+ "field" => "addressable",
21
+ "type" => "Number",
22
+ "relationship" => "BelongsTo",
23
+ "reference" => "addressable.id",
24
+ "inverse_of" => "address",
25
+ "is_filterable" => false,
26
+ "is_sortable" => true,
27
+ "is_read_only" => false,
28
+ "is_required" => false,
29
+ "is_virtual" => false,
30
+ "default_value" => nil,
31
+ "integration" => nil,
32
+ "relationships" => nil,
33
+ "widget" => nil,
34
+ "validations" => [],
35
+ "polymorphic_referenced_models" => ["User"]
36
+ },
37
+ ],
38
+ "actions" => [],
39
+ "segments" => []
40
+ }
41
+ ]
42
+ schema_file_updater = ForestLiana::SchemaFileUpdater.new("test.txt", collections, {})
43
+ expect(schema_file_updater.instance_variable_get(:@collections))
44
+ .to eq(collections)
45
+ end
46
+ end
47
+
13
48
  describe "when the collection has a smart action action" do
14
49
  it "should save the smart action" do
15
50
  collections = [{
@@ -154,3 +154,87 @@ describe 'Requesting Tree resources', :type => :request do
154
154
  end
155
155
  end
156
156
  end
157
+
158
+ describe 'Requesting Address resources', :type => :request do
159
+
160
+ before do
161
+ user = User.create(name: 'Michel')
162
+ address = Address.create(line1: '10 Downing Street', city: 'London', zipcode: '2AB', addressable: user)
163
+
164
+ Rails.cache.write('forest.users', {'1' => { 'id' => 1, 'roleId' => 1, 'rendering_id' => '1' }})
165
+ Rails.cache.write('forest.has_permission', true)
166
+ Rails.cache.write(
167
+ 'forest.collections',
168
+ {
169
+ 'Address' => {
170
+ 'browse' => [1],
171
+ 'read' => [1],
172
+ 'edit' => [1],
173
+ 'add' => [1],
174
+ 'delete' => [1],
175
+ 'export' => [1],
176
+ 'actions' => {}
177
+ }
178
+ }
179
+ )
180
+
181
+ allow(ForestLiana::IpWhitelist).to receive(:retrieve) { true }
182
+ allow(ForestLiana::IpWhitelist).to receive(:is_ip_whitelist_retrieved) { true }
183
+ allow(ForestLiana::IpWhitelist).to receive(:is_ip_valid) { true }
184
+ allow(ForestLiana::ScopeManager).to receive(:fetch_scopes).and_return({})
185
+ end
186
+
187
+ after do
188
+ User.destroy_all
189
+ Address.destroy_all
190
+ end
191
+
192
+ token = JWT.encode({
193
+ id: 1,
194
+ email: 'michael.kelso@that70.show',
195
+ first_name: 'Michael',
196
+ last_name: 'Kelso',
197
+ team: 'Operations',
198
+ rendering_id: 16,
199
+ exp: Time.now.to_i + 2.weeks.to_i,
200
+ permission_level: 'admin'
201
+ }, ForestLiana.auth_secret, 'HS256')
202
+
203
+ headers = {
204
+ 'Accept' => 'application/json',
205
+ 'Content-Type' => 'application/json',
206
+ 'Authorization' => "Bearer #{token}"
207
+ }
208
+
209
+ describe 'index' do
210
+ params = {
211
+ fields: { 'Address' => 'id,line1,city,zip_code,addressable' },
212
+ page: { 'number' => '1', 'size' => '10' },
213
+ searchExtended: '0',
214
+ sort: '-id',
215
+ timezone: 'Europe/Paris'
216
+ }
217
+
218
+ it 'should respond the address data' do
219
+ get '/forest/Address', params: params, headers: headers
220
+
221
+ expect(JSON.parse(response.body)).to include(
222
+ "data" => [
223
+ {
224
+ "type" => "Address",
225
+ "id" => "1",
226
+ "attributes" => {
227
+ "id" => 1,
228
+ "line1" => "10 Downing Street",
229
+ "city" => "London"
230
+ },
231
+ "links" => { "self" => "/forest/address/1" },
232
+ "relationships" => {
233
+ "addressable" => { "links" => { "related" => {} }, "data" => { "type" => "User", "id" => "1" } }
234
+ }
235
+ }
236
+ ]
237
+ )
238
+ end
239
+ end
240
+ end
@@ -1,6 +1,47 @@
1
1
  module ForestLiana
2
2
  describe SchemaAdapter do
3
3
  describe 'perform' do
4
+ context 'with polymorphic association' do
5
+ it 'should define the association with the referenced models' do
6
+ collection = ForestLiana.apimap.find do |object|
7
+ object.name.to_s == ForestLiana.name_for(Address)
8
+ end
9
+ field = collection.fields.find { |field| field[:field] == 'addressable' }
10
+
11
+ expect(field).to eq(
12
+ {
13
+ field: "addressable",
14
+ type: "Number",
15
+ relationship: "BelongsTo",
16
+ reference: "addressable.id",
17
+ inverse_of: "address",
18
+ is_filterable: false,
19
+ is_sortable: true,
20
+ is_read_only: false,
21
+ is_required: false,
22
+ is_virtual: false,
23
+ default_value: nil,
24
+ integration: nil,
25
+ relationships: nil,
26
+ widget: nil,
27
+ validations: [],
28
+ polymorphic_referenced_models: ['User']
29
+ }
30
+ )
31
+ end
32
+
33
+ it 'should remove the polymorphic attributes(_id and _type)' do
34
+ collection = ForestLiana.apimap.find do |object|
35
+ object.name.to_s == ForestLiana.name_for(Address)
36
+ end
37
+ removed_fields = collection.fields.select do
38
+ |field| field[:field] == 'addressable_id' || field[:field] == 'addressable_type'
39
+ end
40
+
41
+ expect(removed_fields).to be_empty
42
+ end
43
+ end
44
+
4
45
  context 'with an "unhandled" column types (binary, postgis geography, ...)' do
5
46
  it 'should not define theses column in the schema' do
6
47
  collection = ForestLiana.apimap.find do |object|
data/spec/spec_helper.rb CHANGED
@@ -19,6 +19,7 @@ SimpleCov.add_filter ['app/services/forest_liana/ability/fetch.rb', 'lib/forest_
19
19
  # See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
20
20
  RSpec.configure do |config|
21
21
  ENV['RAILS_ENV'] = 'test'
22
+
22
23
  require File.expand_path('../dummy/config/environment', __FILE__)
23
24
 
24
25
  # rspec-expectations config goes here. You can use an alternate
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: 8.0.17
4
+ version: 9.0.0.beta.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: 2023-12-05 00:00:00.000000000 Z
11
+ date: 2024-01-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -350,6 +350,7 @@ files:
350
350
  - spec/dummy/app/controllers/application_controller.rb
351
351
  - spec/dummy/app/controllers/forest/islands_controller.rb
352
352
  - spec/dummy/app/helpers/application_helper.rb
353
+ - spec/dummy/app/models/address.rb
353
354
  - spec/dummy/app/models/application_record.rb
354
355
  - spec/dummy/app/models/car.rb
355
356
  - spec/dummy/app/models/driver.rb
@@ -403,6 +404,7 @@ files:
403
404
  - spec/dummy/db/migrate/20220719094450_create_drivers.rb
404
405
  - spec/dummy/db/migrate/20220727114450_create_manufacturers.rb
405
406
  - spec/dummy/db/migrate/20220727114930_add_columns_to_products.rb
407
+ - spec/dummy/db/migrate/20231117084236_create_addresses.rb
406
408
  - spec/dummy/db/schema.rb
407
409
  - spec/dummy/lib/forest_liana/collections/island.rb
408
410
  - spec/dummy/lib/forest_liana/collections/location.rb
@@ -540,9 +542,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
540
542
  version: '0'
541
543
  required_rubygems_version: !ruby/object:Gem::Requirement
542
544
  requirements:
543
- - - ">="
545
+ - - ">"
544
546
  - !ruby/object:Gem::Version
545
- version: '0'
547
+ version: 1.3.1
546
548
  requirements: []
547
549
  rubygems_version: 3.3.5
548
550
  signing_key:
@@ -646,6 +648,7 @@ test_files:
646
648
  - spec/dummy/app/controllers/application_controller.rb
647
649
  - spec/dummy/app/controllers/forest/islands_controller.rb
648
650
  - spec/dummy/app/helpers/application_helper.rb
651
+ - spec/dummy/app/models/address.rb
649
652
  - spec/dummy/app/models/application_record.rb
650
653
  - spec/dummy/app/models/car.rb
651
654
  - spec/dummy/app/models/driver.rb
@@ -699,6 +702,7 @@ test_files:
699
702
  - spec/dummy/db/migrate/20220719094450_create_drivers.rb
700
703
  - spec/dummy/db/migrate/20220727114450_create_manufacturers.rb
701
704
  - spec/dummy/db/migrate/20220727114930_add_columns_to_products.rb
705
+ - spec/dummy/db/migrate/20231117084236_create_addresses.rb
702
706
  - spec/dummy/db/schema.rb
703
707
  - spec/dummy/lib/forest_liana/collections/island.rb
704
708
  - spec/dummy/lib/forest_liana/collections/location.rb