Sha256: 7b28709e906ac1c0d2dd91c3b6d5dfd60a7b54d20be0597c3bcffa47a733bcf4

Contents?: true

Size: 1.61 KB

Versions: 3

Compression:

Stored size: 1.61 KB

Contents

# frozen_string_literal: true

require 'active_support'

# Preload all the DHS::Records that are defined in app/models/*
# in order to collect record endpoints and to be able to identify records from hrefs
# and not only from model constant names (which is different to ActiveRecord)
module AutoloadRecords
  extend ActiveSupport::Concern

  included do
    class Engine < Rails::Engine
      initializer 'Load all DHS::Records from app/models/**' do |app|
        Middleware.require_records
        next if app.config.cache_classes

        app.config.middleware.use Middleware
      end

      class Middleware
        def initialize(app)
          @app = app
        end

        def call(env)
          self.class.require_records
          @app.call(env)
        end

        def self.model_files
          Dir.glob(Rails.root.join('app', 'models', '**', '*.rb'))
        end

        def self.require_direct_inheritance
          model_files.sort.map do |file|
            next unless File.read(file).match('DHS::Record')
            require_dependency file
            file.split('models/').last.gsub('.rb', '').classify
          end.compact
        end

        def self.require_inheriting_records(parents)
          model_files.each do |file|
            file_content = File.read(file)
            next if parents.none? { |parent| file_content.match(/\b#{parent}\b/) }
            next if file_content.match?('extend ActiveSupport::Concern')
            require_dependency file
          end
        end

        def self.require_records
          require_inheriting_records(require_direct_inheritance)
        end
      end
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
dhs-1.0.2 lib/dhs/concerns/autoload_records.rb
dhs-1.0.1 lib/dhs/concerns/autoload_records.rb
dhs-1.0.0 lib/dhs/concerns/autoload_records.rb