File: require_valid_schema.rb

package info (click to toggle)
ruby-sequel 5.63.0-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 10,408 kB
  • sloc: ruby: 113,747; makefile: 3
file content (67 lines) | stat: -rw-r--r-- 2,591 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
# frozen-string-literal: true

module Sequel
  module Plugins
    # The require_valid_schema plugin makes Sequel raise or warn if attempting
    # to set the dataset of a model class to a simple table, where the database
    # supports schema parsing, but schema parsing does not work for the model's
    # table.
    #
    # The plugin's default behavior requires that all models that select from a
    # single identifier have a valid table schema, if the database supports
    # schema parsing. If the schema cannot be determined for such
    # a model, an error is raised:
    #   
    #   Sequel::Model.plugin :require_valid_schema
    #
    # If you load the plugin with an argument of :warn, Sequel will warn instead
    # of raising for such tables:
    #
    #   Sequel::Model.plugin :require_valid_schema, :warn
    #
    # This can catch bugs where you expect models to have valid schema, but
    # they do not. This setting only affects future attempts to set datasets
    # in the current class and subclasses created in the future.
    #
    # If you load the plugin with an argument of false, it will not require valid schema.
    # This can be used in subclasses where you do not want to require valid schema,
    # but the plugin must be loaded before a dataset with invalid schema is set:
    #
    #   Sequel::Model.plugin :require_valid_schema
    #   InvalidSchemaAllowed = Class.new(Sequel::Model)
    #   InvalidSchemaAllowed.plugin :require_valid_schema, false
    #   class MyModel < InvalidSchemaAllowed
    #   end
    module RequireValidSchema
      # Modify the current model's dataset selection, if the model
      # has a dataset.
      def self.configure(model, setting=true)
        model.instance_variable_set(:@require_valid_schema, setting)
      end

      module ClassMethods
        Plugins.inherited_instance_variables(self, :@require_valid_schema=>nil)

        private

        # If the schema cannot be determined, the model uses a simple table,
        # require_valid_schema is set, and the database supports schema parsing, raise or
        # warn based on the require_valid_schema setting.
        def get_db_schema_array(reload)
          schema_array = super

          if !schema_array && simple_table && @require_valid_schema
            message = "Not able to parse schema for model: #{inspect}, table: #{simple_table}"
            if @require_valid_schema == :warn
              warn message
            else
              raise Error, message
            end
          end

          schema_array
        end
      end
    end
  end
end