Class: Nanoc::Int::Executor Private

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

This class is part of a private API. You should avoid using this class if possible, as it may be removed or be changed in the future.

Defined Under Namespace

Classes: OutputNotWrittenError

Instance Method Summary collapse

Constructor Details

#initialize(compiler, dependency_tracker) ⇒ Executor

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Returns a new instance of Executor.



10
11
12
13
# File 'lib/nanoc/base/services/executor.rb', line 10

def initialize(compiler, dependency_tracker)
  @compiler = compiler
  @dependency_tracker = dependency_tracker
end

Instance Method Details

#assigns_for(rep) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.



111
112
113
# File 'lib/nanoc/base/services/executor.rb', line 111

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

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

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.



15
16
17
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
# File 'lib/nanoc/base/services/executor.rb', line 15

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

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

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

    # Check whether file was written
    if filter.class.to_binary? && !File.file?(filter.output_filename)
      raise OutputNotWrittenError.new(filter_name, filter.output_filename)
    end

    # Create snapshot
    snapshot(rep, rep.snapshot_contents[:post] ? :post : :pre, final: false) unless rep.binary?
  ensure
    Nanoc::Int::NotificationCenter.post(:filtering_ended, rep, filter_name)
  end
end

#filter_for_filtering(rep, filter_name) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.



133
134
135
136
137
138
139
140
141
142
143
144
# File 'lib/nanoc/base/services/executor.rb', line 133

def filter_for_filtering(rep, filter_name)
  klass = Nanoc::Filter.named(filter_name)
  raise Nanoc::Int::Errors::UnknownFilter.new(filter_name) if klass.nil?

  if klass.from_binary? && !rep.binary?
    raise Nanoc::Int::Errors::CannotUseBinaryFilter.new(rep, klass)
  elsif !klass.from_binary? && rep.binary?
    raise Nanoc::Int::Errors::CannotUseTextualFilter.new(rep, klass)
  end

  klass.new(assigns_for(rep))
end

#find_layout(arg) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.



119
120
121
122
123
124
125
126
127
128
129
130
131
# File 'lib/nanoc/base/services/executor.rb', line 119

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(rep, layout_identifier, extra_filter_args = nil) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.



45
46
47
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
85
86
87
88
89
90
# File 'lib/nanoc/base/services/executor.rb', line 45

def layout(rep, layout_identifier, extra_filter_args = nil)
  layout = find_layout(layout_identifier)
  filter_name, filter_args = *@compiler.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
  raise Nanoc::Int::Errors::CannotLayoutBinaryItem.new(rep) if rep.binary?

  # Create "pre" snapshot
  if rep.snapshot_contents[:post].nil?
    snapshot(rep, :pre, final: true)
  end

  # Create filter
  klass = Nanoc::Filter.named(filter_name)
  raise Nanoc::Int::Errors::UnknownFilter.new(filter_name) if klass.nil?
  view_context = @compiler.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)

  begin
    # Notify start
    Nanoc::Int::NotificationCenter.post(:processing_started, layout)
    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)
    rep.snapshot_contents[:last] = Nanoc::Int::TextualContent.new(res).tap(&:freeze)

    # Create "post" snapshot
    snapshot(rep, :post, final: false)
  ensure
    # Notify end
    Nanoc::Int::NotificationCenter.post(:filtering_ended,  rep, filter_name)
    Nanoc::Int::NotificationCenter.post(:processing_ended, layout)
  end
end

#layoutsObject

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.



115
116
117
# File 'lib/nanoc/base/services/executor.rb', line 115

def layouts
  @compiler.site.layouts
end

#snapshot(rep, snapshot_name, final: true, path: nil) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

rubocop:disable Lint/UnusedMethodArgument



92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
# File 'lib/nanoc/base/services/executor.rb', line 92

def snapshot(rep, snapshot_name, final: true, path: nil) # rubocop:disable Lint/UnusedMethodArgument
  # NOTE: :path is irrelevant

  unless rep.binary?
    rep.snapshot_contents[snapshot_name] = rep.snapshot_contents[:last]
  end

  if snapshot_name == :pre && final
    rep.snapshot_defs << Nanoc::Int::SnapshotDef.new(:pre, true)
  end

  if final
    raw_path = rep.raw_path(snapshot: snapshot_name)
    if raw_path
      ItemRepWriter.new.write(rep, raw_path)
    end
  end
end

#use_globs?Boolean

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Returns:

  • (Boolean)


146
147
148
# File 'lib/nanoc/base/services/executor.rb', line 146

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