Class: Braintrust::Vendor::Mustache::Context

Inherits:
Object
  • Object
show all
Defined in:
lib/braintrust/vendor/mustache/context.rb

Overview

A Context represents the context which a Mustache template is executed within. All Mustache tags reference keys in the Context.

Instance Method Summary collapse

Constructor Details

#initialize(mustache) ⇒ Context

Initializes a Mustache::Context.

Parameters:

  • mustache (Mustache)

    A Mustache instance.



20
21
22
23
# File 'lib/braintrust/vendor/mustache/context.rb', line 20

def initialize(mustache)
  @stack = [mustache]
  @partial_template_cache = {}
end

Instance Method Details

#[](name) ⇒ Object

Alias for fetch.



99
100
101
# File 'lib/braintrust/vendor/mustache/context.rb', line 99

def [](name)
  fetch(name, nil)
end

#[]=(name, value) ⇒ Object

Can be used to add a value to the context in a hash-like way.

context = "Chris"



94
95
96
# File 'lib/braintrust/vendor/mustache/context.rb', line 94

def []=(name, value)
  push(name => value)
end

#currentObject



157
158
159
# File 'lib/braintrust/vendor/mustache/context.rb', line 157

def current
  @stack.first
end

#escape(value) ⇒ String

Allows customization of how Mustache escapes things.

Parameters:

  • value (Object)

    Value to escape.

Returns:

  • (String)

    Escaped string.



64
65
66
# File 'lib/braintrust/vendor/mustache/context.rb', line 64

def escape(value)
  mustache_in_stack.escape(value)
end

#fetch(name, default = :__raise) ⇒ Object

Similar to Hash#fetch, finds a value by name in the context's stack. You may specify the default return value by passing a second parameter.

If no second parameter is passed (or raise_on_context_miss is set to true), will raise a ContextMiss exception on miss.



117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
# File 'lib/braintrust/vendor/mustache/context.rb', line 117

def fetch(name, default = :__raise)
  @stack.each do |frame|
    # Prevent infinite recursion.
    next if frame == self

    value = find(frame, name, :__missing)
    return value if :__missing != value
  end

  if default == :__raise || mustache_in_stack.raise_on_context_miss?
    raise ContextMiss.new("Can't find #{name} in #{@stack.inspect}")
  else
    default
  end
end

#find(obj, key, default = nil) ⇒ Object

Finds a key in an object, using whatever method is most appropriate. If the object is a hash, does a simple hash lookup. If it's an object that responds to the key as a method call, invokes that method. You get the idea.

Parameters:

  • obj (Object)

    The object to perform the lookup on.

  • key (String, Symbol)

    The key whose value you want

  • default (Object) (defaults to: nil)

    An optional default value, to return if the key is not found.

Returns:

  • (Object)

    The value of key in object if it is found, and default otherwise.



144
145
146
147
148
149
150
151
152
153
154
155
# File 'lib/braintrust/vendor/mustache/context.rb', line 144

def find(obj, key, default = nil)
  return find_in_hash(obj.to_hash, key, default) if obj.respond_to?(:to_hash)

  unless obj.respond_to?(key)
    # no match for the key, but it may include a hyphen, so try again replacing hyphens with underscores.
    key = key.to_s.tr("-", "_")
    return default unless obj.respond_to?(key)
  end

  meth = obj.method(key) rescue proc { obj.send(key) }
  meth.arity == 1 ? meth.to_proc : meth.call
end

#has_key?(key) ⇒ Boolean

Do we know about a particular key? In other words, will calling context[key] give us a result that was set. Basically.

Returns:

  • (Boolean)


105
106
107
108
109
# File 'lib/braintrust/vendor/mustache/context.rb', line 105

def has_key?(key)
  fetch(key, false)
rescue ContextMiss
  false
end

#mustache_in_stackMustache

Find the first Mustache in the stack.

If we're being rendered inside a Mustache object as a context, we'll use that one.

Returns:

  • (Mustache)

    First Mustache in the stack.



54
55
56
# File 'lib/braintrust/vendor/mustache/context.rb', line 54

def mustache_in_stack
  @mustache_in_stack ||= @stack.find { |frame| frame.is_a?(Mustache) }
end

#partial(name, indentation = "") ⇒ Object

A {>partial} tag translates into a call to the context's partial method, which would be this sucker right here.

If the Mustache view handling the rendering (e.g. the view representing your profile page or some other template) responds to partial, we call it and render the result.



32
33
34
35
36
37
38
39
40
41
# File 'lib/braintrust/vendor/mustache/context.rb', line 32

def partial(name, indentation = "")
  # Look for the first Mustache in the stack.
  mustache = mustache_in_stack

  # Indent the partial template by the given indentation.
  part = mustache.partial(name).to_s.gsub(/^/, indentation)

  # Get a template object for the partial and render the result.
  template_for_partial(part).render(self)
end

#popContext

Removes the most recently added object from the context's internal stack.

Returns:

  • (Context)

    Returns the Context.



85
86
87
88
89
# File 'lib/braintrust/vendor/mustache/context.rb', line 85

def pop
  @stack.shift
  @mustache_in_stack = nil
  self
end

#push(new_obj) ⇒ Context

Adds a new object to the context's internal stack.

Parameters:

  • new_obj (Object)

    Object to be added to the internal stack.

Returns:

  • (Context)

    Returns the Context.



74
75
76
77
78
# File 'lib/braintrust/vendor/mustache/context.rb', line 74

def push(new_obj)
  @stack.unshift(new_obj)
  @mustache_in_stack = nil
  self
end

#template_for_partial(partial) ⇒ Object



43
44
45
# File 'lib/braintrust/vendor/mustache/context.rb', line 43

def template_for_partial(partial)
  @partial_template_cache[partial] ||= Template.new(partial)
end