class AdequateSerialization::Rails::CacheVisualization

Constants

FILES
STATIC

Attributes

app[R]
server[R]

Public Class Methods

call(env) click to toggle source
# File lib/adequate_serialization/rails/cache_visualization.rb, line 35
def self.call(env)
  (@app ||= new).call(env)
end
new() click to toggle source
# File lib/adequate_serialization/rails/cache_visualization.rb, line 21
def initialize
  @server = Rack::File.new(STATIC)
end

Public Instance Methods

call(env) click to toggle source
# File lib/adequate_serialization/rails/cache_visualization.rb, line 25
def call(env)
  if env[Rack::PATH_INFO] == '/'
    render_index(env)
  elsif FILES.include?(env[Rack::PATH_INFO])
    server.call(env)
  else
    [404, { 'Content-Type' => 'text/plain' }, ['Not Found']]
  end
end
to_dot() click to toggle source
# File lib/adequate_serialization/rails/cache_visualization.rb, line 9
def to_dot
  "#{klass.name} -> #{active_record.name} [label=\"#{name}\"];"
end

Private Instance Methods

reflections() click to toggle source
# File lib/adequate_serialization/rails/cache_visualization.rb, line 83
def reflections
  serializers.each_with_object([]) do |serializer, selected|
    serializer.attributes.each do |attribute|
      serializes = serializer.serializes
      reflection = serializes.reflect_on_association(attribute.name)

      next if !reflection || reflection.polymorphic?

      selected << reflection
    end
  end
end
render_index(env) click to toggle source
# File lib/adequate_serialization/rails/cache_visualization.rb, line 62
def render_index(env)
  content = File.read(File.join(STATIC, 'index.html.erb'))
  locals = { svg: to_svg, script_name: env[Rack::SCRIPT_NAME] }

  result = ERB.new(content).result_with_hash(locals)
  [200, { 'Content-Type' => 'text/html' }, [result]]
end
serializers() click to toggle source
# File lib/adequate_serialization/rails/cache_visualization.rb, line 70
def serializers
  ::Rails.application.eager_load!
  base = Serializer

  ObjectSpace.each_object(base.singleton_class).select do |serializer|
    serializer < base &&
      serializer.name &&
      serializer.serializes < ActiveRecord::Base
  rescue AdequateSerialization::Serializer::ClassNotFoundError
    false
  end
end
to_svg() click to toggle source
# File lib/adequate_serialization/rails/cache_visualization.rb, line 50
def to_svg
  svg =
    IO.popen('dot -Tsvg', 'w+') do |f|
      f.write(to_dot)
      f.close_write
      f.readlines
    end

  3.times { svg.shift }
  svg.join.gsub(/(height|width)="[^"]*"/, '')
end