Class: Rake::Pipeline

Inherits:
Object
  • Object
show all
Defined in:
lib/rake-pipeline.rb,
lib/rake-pipeline/dsl.rb,
lib/rake-pipeline/error.rb,
lib/rake-pipeline/filter.rb,
lib/rake-pipeline/matcher.rb,
lib/rake-pipeline/version.rb,
lib/rake-pipeline/middleware.rb,
lib/rake-pipeline/file_wrapper.rb,
lib/rake-pipeline/filters/concat.rb

Overview

A Pipeline is responsible for taking a directory of input files, applying a number of filters to the inputs, and outputting them into an output directory.

The normal way to build and configure a pipeline is by using Pipeline.build. Inside the block passed to Pipeline.build, all methods of DSL are available.

Examples:

Rake::Pipeline.build do
  # process all js, css and html files in app/assets
  input "app/assets", "**/*.{js,coffee,css,scss,html}"

  # processed files should be outputted to public
  output "public"

  # process all coffee files
  match "*.coffee" do
    # compile all CoffeeScript files. the output file
    # for the compilation should be the input name
    # with the .coffee extension replaced with .js
    filter(CoffeeCompiler) do |input|
      input.sub(/\.coffee$/, '.js')
    end
  end

  # specify filters for js files. this includes the
  # output of the previous step, which converted
  # coffee files to js files
  match "*.js" do
    # first, wrap all JS files in a custom filter
    filter ClosureFilter
    # then, concatenate all JS files into a single file
    filter Rake::Pipeline::ConcatFilter, "application.js"
  end

  # specify filters for css and scss files
  match "*.{css,scss}" do
    # compile CSS and SCSS files using the SCSS
    # compiler. if an input file has the extension
    # scss, replace it with css
    filter(ScssCompiler) do |input|
      input.sub(/\.scss$/, 'css')
    end
    # then, concatenate all CSS files into a single file
    filter Rake::Pipeline::ConcatFilter, "application.css"
  end

  # the remaining files not specified by a matcher (the
  # HTML files) are simply copied over.

  # you can also specify filters here that will apply to
  # all processed files (application.js and application.css)
  # up until this point, as well as the HTML files.
end

See Also:

Direct Known Subclasses

Matcher

Defined Under Namespace

Classes: ConcatFilter, DSL, EncodingError, Error, FileWrapper, Filter, Matcher, Middleware, UnopenedFile

Constant Summary

VERSION =

Version:

  • 0.5.0

"0.5.0"
@@tmp_id =
0

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initializePipeline



119
120
121
122
123
# File 'lib/rake-pipeline.rb', line 119

def initialize
  @filters = []
  @tmpdir = "tmp"
  @mutex = Mutex.new
end

Instance Attribute Details

#input_filesArray<FileWrapper> Also known as: eligible_input_files

If you specify a glob for #input_glob, this method will calculate the input files for the directory. If you supply input_files directly, this method will simply return the input_files you supplied.



195
196
197
198
199
200
201
202
203
204
205
206
207
# File 'lib/rake-pipeline.rb', line 195

def input_files
  return @input_files if @input_files

  assert_input_provided

  expanded_root = File.expand_path(input_root)
  files = Dir[File.join(expanded_root, input_glob)].select { |f| File.file?(f) }

  files.map do |file|
    relative_path = file.sub(%r{^#{Regexp.escape(expanded_root)}/}, '')
    FileWrapper.new(expanded_root, relative_path)
  end
end

#input_globString



97
98
99
# File 'lib/rake-pipeline.rb', line 97

def input_glob
  @input_glob
end

#input_rootString



100
101
102
# File 'lib/rake-pipeline.rb', line 100

def input_root
  @input_root
end

#output_filesArray<FileWrapper> (readonly)

A list of the output files that invoking this pipeline will generate.



115
116
117
# File 'lib/rake-pipeline.rb', line 115

def output_files
  @filters.last.output_files unless @filters.empty?
end

#output_rootString



103
104
105
# File 'lib/rake-pipeline.rb', line 103

def output_root
  @output_root
end

#rake_tasksArray (readonly)



111
112
113
# File 'lib/rake-pipeline.rb', line 111

def rake_tasks
  @rake_tasks
end

#tmpdirString



106
107
108
# File 'lib/rake-pipeline.rb', line 106

def tmpdir
  @tmpdir
end

Class Method Details

.build(&block) ⇒ Rake::Pipeline

Build a new pipeline taking a block. The block will be evaluated by the Rake::Pipeline::DSL class.

Examples:

Rake::Pipeline.build do
  input "app/assets"
  output "public"

  filter Rake::Pipeline::ConcatFilter, "app.js"
end

See Also:



143
144
145
146
147
# File 'lib/rake-pipeline.rb', line 143

def self.build(&block)
  pipeline = new
  DSL.evaluate(pipeline, &block) if block
  pipeline
end

Instance Method Details

#add_filters(*filters) ⇒ void Also known as: add_filter

This method returns an undefined value.

Add one or more filters to the current pipeline.



232
233
234
235
# File 'lib/rake-pipeline.rb', line 232

def add_filters(*filters)
  filters.each { |filter| filter.rake_application = rake_application }
  @filters.concat(filters)
end

#copy(target_class = self.class, &block) ⇒ Pipeline

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.

Copy the current pipeline's attributes over.



159
160
161
162
163
164
165
# File 'lib/rake-pipeline.rb', line 159

def copy(target_class=self.class, &block)
  pipeline = target_class.build(&block)
  pipeline.input_root = input_root
  pipeline.tmpdir = tmpdir
  pipeline.rake_application = rake_application
  pipeline
end

#invokevoid

This method returns an undefined value.

Invoke the pipeline, processing the inputs into the output. If the pipeline has already been invoked, reinvoking will not pick up new input files added to the file system.



243
244
245
246
247
248
249
250
251
252
# File 'lib/rake-pipeline.rb', line 243

def invoke
  @mutex.synchronize do
    self.rake_application = Rake::Application.new unless @rake_application

    setup

    @rake_tasks.each { |task| task.recursively_reenable(rake_application) }
    @rake_tasks.each { |task| task.invoke }
  end
end

#invoke_cleanvoid

This method returns an undefined value.

Pick up any new files added to the inputs and process them through the filters. Then call #invoke.



258
259
260
261
# File 'lib/rake-pipeline.rb', line 258

def invoke_clean
  @rake_tasks = @rake_application = nil
  invoke
end

#rake_applicationRake::Application



215
216
217
# File 'lib/rake-pipeline.rb', line 215

def rake_application
  @rake_application || Rake.application
end

#rake_application=(rake_application) ⇒ void

This method returns an undefined value.

Set the rake_application on the pipeline and apply it to filters.



222
223
224
225
226
# File 'lib/rake-pipeline.rb', line 222

def rake_application=(rake_application)
  @rake_application = rake_application
  @filters.each { |filter| filter.rake_application = rake_application }
  @rake_tasks = nil
end

#setupvoid

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.

This method returns an undefined value.

Set up the filters and generate rake tasks. In general, this method is called by invoke.



268
269
270
271
# File 'lib/rake-pipeline.rb', line 268

def setup
  setup_filters
  generate_rake_tasks
end