Class: Liquid::LocalFileSystem

Inherits:
Object
  • Object
show all
Defined in:
lib/liquid/file_system.rb

Overview

This implements an abstract file system which retrieves template files named in a manner similar to Rails partials, ie. with the template name prefixed with an underscore. The extension “.liquid” is also added.

For security reasons, template paths are only allowed to contain letters, numbers, and underscore.

Example:

file_system = Liquid::LocalFileSystem.new("/some/path")

file_system.full_path("mypartial")       # => "/some/path/_mypartial.liquid"
file_system.full_path("dir/mypartial")   # => "/some/path/dir/_mypartial.liquid"

Optionally in the second argument you can specify a custom pattern for template filenames. The Kernel::sprintf format specification is used. Default pattern is “_%s.liquid”.

Example:

file_system = Liquid::LocalFileSystem.new("/some/path", "%s.html")

file_system.full_path("index") # => "/some/path/index.html"

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(root, pattern = "_%s.liquid") ⇒ LocalFileSystem

Returns a new instance of LocalFileSystem.



49
50
51
52
# File 'lib/liquid/file_system.rb', line 49

def initialize(root, pattern = "_%s.liquid")
  @root    = root
  @pattern = pattern
end

Instance Attribute Details

#rootObject

Returns the value of attribute root.



47
48
49
# File 'lib/liquid/file_system.rb', line 47

def root
  @root
end

Instance Method Details

#full_path(template_path) ⇒ Object

Raises:



61
62
63
64
65
66
67
68
69
70
71
72
73
# File 'lib/liquid/file_system.rb', line 61

def full_path(template_path)
  raise FileSystemError, "Illegal template name '#{template_path}'" unless %r{\A[^./][a-zA-Z0-9_/]+\z}.match?(template_path)

  full_path = if template_path.include?('/')
    File.join(root, File.dirname(template_path), @pattern % File.basename(template_path))
  else
    File.join(root, @pattern % template_path)
  end

  raise FileSystemError, "Illegal template path '#{File.expand_path(full_path)}'" unless File.expand_path(full_path).start_with?(File.expand_path(root))

  full_path
end

#read_template_file(template_path) ⇒ Object

Raises:



54
55
56
57
58
59
# File 'lib/liquid/file_system.rb', line 54

def read_template_file(template_path)
  full_path = full_path(template_path)
  raise FileSystemError, "No such template '#{template_path}'" unless File.exist?(full_path)

  File.read(full_path)
end