motor-admin 0.4.38 → 0.5.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6c943e9e5bb46c9f25141164049d7ecb775efe92fb77bbadfb436a29c926565a
4
- data.tar.gz: 03d7aa82d0bad2fc1f62c1e2dcbfe8c03cefcb8bef3d79e33cbef60b1bda9bbe
3
+ metadata.gz: d731a6842770c8a860df2506eefb38ba5aa71775b0b1ac8f8fc237732443a9d1
4
+ data.tar.gz: 8ffba29d356aafbb68067f5b0e85e2081a846a375437b54ca9e7d125797aa3fa
5
5
  SHA512:
6
- metadata.gz: 6499627caf2043999b21453aa0d02b69c5e9dcb823d0a58a637f88ca86bda9d4bee96aecc27b8950fe73334dff75d186f1fccca6b4d99088afa0215ceb8011d9
7
- data.tar.gz: e9379126de1f5a63efde92a66b37ce939938ef74123fa3fd6d61d5f5b8c0f76fa90aa5f2b79926e82ba3d972480f4debb46584dd55064732beffe903ab1978f2
6
+ metadata.gz: cf9e0ea1f7ba7bd55ccf448ebf9176d48d515fb9bbddf0f9a465f02db0b6b56e839c2e89fc66f84ce5cafaa60b811cfff922d45fef555e44959822b24944bc20
7
+ data.tar.gz: 7404c78cb16701a090799a9f7ff0bdc3b67ced5e3e4c675db9796ce9495cce72298f6b124bc612430f2a73e3aef6a6355c14b3b6105ee5bd3d582ad664e9f481
@@ -81,6 +81,7 @@ module Motor
81
81
 
82
82
  def resource_params
83
83
  if params[:data].present?
84
+ # Allow all attributes through; dynamic model class limits what is actually persisted
84
85
  params.require(:data).permit!
85
86
  else
86
87
  {}
@@ -340,41 +340,53 @@ module ActiveRecord
340
340
  if relation.polymorphic?
341
341
  value = value.dup
342
342
  klass = value.delete(:as).safe_constantize
343
+ new_trail = relation_trail + ["#{klass.table_name}_as_#{relation.name}"]
343
344
 
344
- builder = self.class.new(TableMetadata.new(
345
- klass,
346
- alias_tracker.aliased_table_for_relation(relation_trail + ["#{klass.table_name}_as_#{relation.name}"],
347
- klass.arel_table) do
348
- klass.arel_table.name
349
- end,
350
- relation
351
- ))
352
- builder.build_from_filter_hash(value, relation_trail + ["#{klass.table_name}_as_#{relation.name}"],
353
- alias_tracker)
345
+ arel_table = alias_tracker.aliased_table_for_relation(new_trail, klass.arel_table) do
346
+ klass.arel_table.name
347
+ end
348
+
349
+ metadata = build_table_metadata(klass, arel_table, relation)
350
+ builder = self.class.new(metadata)
351
+ builder.build_from_filter_hash(value, new_trail, alias_tracker)
354
352
  else
355
- builder = self.class.new(TableMetadata.new(
356
- relation.klass,
357
- alias_tracker.aliased_table_for_relation(relation_trail + [relation.name],
358
- relation.klass.arel_table) do
359
- relation.alias_candidate(table.arel_table.name || relation.klass.arel_table)
360
- end,
361
- relation
362
- ))
363
- builder.build_from_filter_hash(value, relation_trail + [relation.name], alias_tracker)
353
+ new_trail = relation_trail + [relation.name]
354
+
355
+ arel_table = alias_tracker.aliased_table_for_relation(new_trail, relation.klass.arel_table) do
356
+ relation.alias_candidate(table.arel_table.name || relation.klass.arel_table)
357
+ end
358
+
359
+ metadata = build_table_metadata(relation.klass, arel_table, relation)
360
+ builder = self.class.new(metadata)
361
+ builder.build_from_filter_hash(value, new_trail, alias_tracker)
364
362
  end
365
363
  end
366
364
 
367
365
  def expand_filter_for_join_table(relation, value, relation_trail, alias_tracker)
368
366
  relation = relation.active_record._reflections[relation.active_record._reflections[relation.name.to_s].send(:delegate_reflection).options[:through].to_s]
369
- builder = self.class.new(TableMetadata.new(
370
- relation.klass,
371
- alias_tracker.aliased_table_for_relation(relation_trail + [relation.name],
372
- relation.klass.arel_table) do
373
- relation.alias_candidate(table.arel_table.name || relation.klass.arel_table)
374
- end,
375
- relation
376
- ))
377
- builder.build_from_filter_hash(value, relation_trail + [relation.name], alias_tracker)
367
+ new_trail = relation_trail + [relation.name]
368
+
369
+ arel_table = alias_tracker.aliased_table_for_relation(new_trail, relation.klass.arel_table) do
370
+ relation.alias_candidate(table.arel_table.name || relation.klass.arel_table)
371
+ end
372
+
373
+ metadata = build_table_metadata(relation.klass, arel_table, relation)
374
+ builder = self.class.new(metadata)
375
+ builder.build_from_filter_hash(value, new_trail, alias_tracker)
376
+ end
377
+
378
+ private
379
+
380
+ def build_table_metadata(klass, arel_table, reflection = nil)
381
+ if table_metadata_supports_reflection?
382
+ ::ActiveRecord::TableMetadata.new(klass, arel_table, reflection)
383
+ else
384
+ ::ActiveRecord::TableMetadata.new(klass, arel_table)
385
+ end
386
+ end
387
+
388
+ def table_metadata_supports_reflection?
389
+ @table_metadata_supports_reflection ||= ::ActiveRecord::TableMetadata.instance_method(:initialize).arity != 2
378
390
  end
379
391
  end
380
392
  end
@@ -23,7 +23,9 @@ module Motor
23
23
 
24
24
  next unless file_timestamp
25
25
 
26
- FILE_TIMESTAMPS_STORE.fetch(file_timestamp.to_s) do
26
+ cache_key = file_timestamp.to_s
27
+
28
+ unless FILE_TIMESTAMPS_STORE.exist?(cache_key)
27
29
  Motor::Configs::SyncFromHash.call(
28
30
  YAML.safe_load(file.read, permitted_classes: [Time, Date])
29
31
  )
@@ -118,7 +118,7 @@ module Motor
118
118
  case value
119
119
  when Integer
120
120
  'integer'
121
- when Float
121
+ when Float, BigDecimal
122
122
  'float'
123
123
  when Time
124
124
  'datetime'
@@ -114,36 +114,55 @@ module Motor
114
114
 
115
115
  columns_hash =
116
116
  columns.each_with_object({}) do |column, acc|
117
- acc[column[:name]] =
118
- if Rails.version.to_f >= 7.2
119
- base_column.class.new(
120
- column[:name],
121
- nil,
122
- base_column.sql_type_metadata.class.new(
123
- ActiveRecord::ConnectionAdapters::SqlTypeMetadata.new(sql_type: column[:column_type],
124
- type: column[:column_type].to_sym))
125
- )
126
- else
127
- ActiveRecord::ConnectionAdapters::Column.new(
128
- column[:name],
129
- nil,
130
- ActiveRecord::ConnectionAdapters::SqlTypeMetadata.new(sql_type: column[:column_type],
131
- type: column[:column_type].to_sym)
132
- )
133
- end
117
+ acc[column[:name]] = synthesize_column(base_column, column[:name], column[:column_type])
134
118
  end
135
119
 
136
120
  klass.instance_variable_set(:@__motor_custom_sql_columns_hash, columns_hash)
137
121
 
138
122
  # rubocop:disable Naming/MemoizedInstanceVariableName
139
123
  klass.instance_eval do
124
+ # Expose custom_sql columns for reading/type-casting, but keep persistence
125
+ # behavior based only on real DB columns.
140
126
  def columns_hash
141
127
  @__motor__columns_hash ||= @__motor_custom_sql_columns_hash.merge(super)
142
128
  end
129
+
130
+ # Only real DB columns should be considered for persistence and strong params.
131
+ def column_names
132
+ connection.schema_cache.columns_hash(table_name).keys
133
+ end
134
+
135
+ # Same for the columns collection used by AR internals.
136
+ def columns
137
+ connection.schema_cache.columns(table_name)
138
+ end
143
139
  end
144
140
  # rubocop:enable Naming/MemoizedInstanceVariableName
145
141
  end
146
142
 
143
+ def synthesize_column(template_column, name, sql_type)
144
+ column = template_column.dup
145
+
146
+ generic_meta = ActiveRecord::ConnectionAdapters::SqlTypeMetadata.new(
147
+ sql_type: sql_type,
148
+ type: sql_type.to_sym
149
+ )
150
+
151
+ adapter_meta = template_column.sql_type_metadata.class.new(generic_meta)
152
+
153
+ begin
154
+ cast_type = ActiveRecord::Type.lookup(sql_type.to_sym)
155
+ rescue StandardError
156
+ cast_type = ActiveRecord::Type.lookup(:string)
157
+ end
158
+
159
+ column.instance_variable_set(:@name, name)
160
+ column.instance_variable_set(:@sql_type_metadata, adapter_meta)
161
+ column.instance_variable_set(:@cast_type, cast_type)
162
+
163
+ column
164
+ end
165
+
147
166
  def define_column_reflections(klass, config)
148
167
  config.fetch(:columns, []).each do |column|
149
168
  reference = column[:reference]
data/lib/motor/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Motor
4
- VERSION = '0.4.38'
4
+ VERSION = '0.5.0'
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: motor-admin
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.38
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Pete Matsyburka