projectcypress/health-data-standards

View on GitHub
lib/health-data-standards/export/template_helper.rb

Summary

Maintainability
A
0 mins
Test Coverage
module HealthDataStandards
  module Export
    # Class that finds ERb templates. Here is how it can be configured:
    # [template_format] What format (C32, CCDA, etc) are we looking for. This will cause
    #                   the TemplateHelper to look for template_name.template_format.erb
    # [template_subdir] The sub directory where templates live. If none is provided, it
    #                   will look for templates in the root of the template_directory
    # [template_directory] The root directory to look in for templates. By default, it
    #                      is in the template folder of this gem. It can be handy to
    #                      provide a different directory if you want to use this class
    #                      outside of the HDS gem
    class TemplateHelper
      def initialize(template_format, template_subdir = nil, template_directory = nil, qrda_version = nil)
        @template_format = template_format
        @template_directory = template_directory
        @template_subdir = template_subdir
        @qrda_version = qrda_version
        @template_cache = {}
      end

      def template_root
        @template_directory ||= File.join(File.dirname(__FILE__), '..', '..', '..', 'templates')

        if @template_subdir
          return File.join(@template_directory, @template_subdir)
        else
          return @template_directory
        end
      end

      # Returns the raw ERb for the template_name provided. This method will look in
      # template_directory/template_subdir/template_name.template_format.erb
      def template(template_name)
        cache_template(template_name)
      end

      # Basically the same template, but prepends an underscore to the template name
      # to mimic the Rails convention for template fragments
      def partial(partial_name)
        cache_template("_#{partial_name}")
      end

      protected 

      def cache_template(template_name)
        subdir = @qrda_version
        
        entry = @template_cache[template_name] || {mtime:-1, erb:nil}
        template_dir = template_root
        template_dir = File.join(template_root, subdir) if subdir
        filename = File.join(template_dir, "#{template_name}.#{@template_format}.erb")
        mtime = File.mtime(filename).to_i
        if mtime > entry[:mtime]
          src = File.read(filename)
          erb = Erubis::EscapedEruby.new(src)
          erb.filename=filename
          entry[:mtime]=mtime
          entry[:erb] = erb
          @template_cache[template_name]=entry
        end
        entry[:erb]
      end
    end
  end
end