Class: Nanoc::Int::Executor

Inherits:
Object
  • Object
show all
Defined in:
lib/nanoc/base/services/executor.rb

Defined Under Namespace

Classes: OutputNotWrittenError

Instance Method Summary collapse

Constructor Details

#initialize(rep, compilation_context, dependency_tracker) ⇒ Executor

Returns a new instance of Executor



12
13
14
15
16
# File 'lib/nanoc/base/services/executor.rb', line 12

def initialize(rep, compilation_context, dependency_tracker)
  @rep = rep
  @compilation_context = compilation_context
  @dependency_tracker = dependency_tracker
end

Instance Method Details

#assigns_for(rep) ⇒ Object



91
92
93
# File 'lib/nanoc/base/services/executor.rb', line 91

def assigns_for(rep)
  @compilation_context.assigns_for(rep, @dependency_tracker)
end

#filter(filter_name, filter_args = {}) ⇒ Object



18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
# File 'lib/nanoc/base/services/executor.rb', line 18

def filter(filter_name, filter_args = {})
  filter = filter_for_filtering(@rep, filter_name)

  begin
    Nanoc::Int::NotificationCenter.post(:filtering_started, @rep, filter_name)

    # Run filter
    last = @compilation_context.snapshot_repo.get(@rep, :last)
    source = last.binary? ? last.filename : last.string
    filter_args.freeze
    result = filter.setup_and_run(source, filter_args)
    last =
      if filter.class.to_binary?
        Nanoc::Int::BinaryContent.new(filter.output_filename).tap(&:freeze)
      else
        Nanoc::Int::TextualContent.new(result).tap(&:freeze)
      end

    # Store
    @compilation_context.snapshot_repo.set(@rep, :last, last)

    # Check whether file was written
    if filter.class.to_binary? && !File.file?(filter.output_filename)
      raise OutputNotWrittenError.new(filter_name, filter.output_filename)
    end
  ensure
    Nanoc::Int::NotificationCenter.post(:filtering_ended, @rep, filter_name)
  end
end

#filter_for_filtering(rep, filter_name) ⇒ Object



113
114
115
116
117
118
119
120
121
122
123
124
# File 'lib/nanoc/base/services/executor.rb', line 113

def filter_for_filtering(rep, filter_name)
  klass = Nanoc::Filter.named!(filter_name)

  last = @compilation_context.snapshot_repo.get(@rep, :last)
  if klass.from_binary? && !last.binary?
    raise Nanoc::Int::Errors::CannotUseBinaryFilter.new(rep, klass)
  elsif !klass.from_binary? && last.binary?
    raise Nanoc::Int::Errors::CannotUseTextualFilter.new(rep, klass)
  end

  klass.new(assigns_for(rep))
end

#find_layout(arg) ⇒ Object

Raises:

  • (Nanoc::Int::Errors::UnknownLayout)


99
100
101
102
103
104
105
106
107
108
109
110
111
# File 'lib/nanoc/base/services/executor.rb', line 99

def find_layout(arg)
  req_id = arg.__nanoc_cleaned_identifier
  layout = layouts.find { |l| l.identifier == req_id }
  return layout if layout

  if use_globs?
    pat = Nanoc::Int::Pattern.from(arg)
    layout = layouts.find { |l| pat.match?(l.identifier) }
    return layout if layout
  end

  raise Nanoc::Int::Errors::UnknownLayout.new(arg)
end

#layout(layout_identifier, extra_filter_args = nil) ⇒ Object

Raises:

  • (Nanoc::Int::Errors::CannotLayoutBinaryItem)


48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
# File 'lib/nanoc/base/services/executor.rb', line 48

def layout(layout_identifier, extra_filter_args = nil)
  layout = find_layout(layout_identifier)
  filter_name, filter_args = *@compilation_context.filter_name_and_args_for_layout(layout)
  if filter_name.nil?
    raise Nanoc::Int::Errors::Generic, "Cannot find rule for layout matching #{layout_identifier}"
  end
  filter_args = filter_args.merge(extra_filter_args || {})
  filter_args.freeze

  # Check whether item can be laid out
  last = @compilation_context.snapshot_repo.get(@rep, :last)
  raise Nanoc::Int::Errors::CannotLayoutBinaryItem.new(@rep) if last.binary?

  # Create filter
  klass = Nanoc::Filter.named!(filter_name)
  view_context = @compilation_context.create_view_context(@dependency_tracker)
  layout_view = Nanoc::LayoutView.new(layout, view_context)
  filter = klass.new(assigns_for(@rep).merge(layout: layout_view))

  # Visit
  @dependency_tracker.bounce(layout, raw_content: true)

  begin
    Nanoc::Int::NotificationCenter.post(:filtering_started, @rep, filter_name)

    # Layout
    content = layout.content
    arg = content.binary? ? content.filename : content.string
    res = filter.setup_and_run(arg, filter_args)

    # Store
    last = Nanoc::Int::TextualContent.new(res).tap(&:freeze)
    @compilation_context.snapshot_repo.set(@rep, :last, last)
  ensure
    Nanoc::Int::NotificationCenter.post(:filtering_ended, @rep, filter_name)
  end
end

#layoutsObject



95
96
97
# File 'lib/nanoc/base/services/executor.rb', line 95

def layouts
  @compilation_context.site.layouts
end

#snapshot(snapshot_name) ⇒ Object



86
87
88
89
# File 'lib/nanoc/base/services/executor.rb', line 86

def snapshot(snapshot_name)
  last = @compilation_context.snapshot_repo.get(@rep, :last)
  @compilation_context.snapshot_repo.set(@rep, snapshot_name, last)
end

#use_globs?Boolean

Returns:

  • (Boolean)


126
127
128
# File 'lib/nanoc/base/services/executor.rb', line 126

def use_globs?
  @compilation_context.site.config[:string_pattern_type] == 'glob'
end