class MrubyMix::Processor

Attributes

dest_file_name[R]
results[RW]
root_file_name[R]

Public Class Methods

new(root_file_name, dest_file_name) click to toggle source
# File lib/mrubymix.rb, line 8
def initialize(root_file_name, dest_file_name)
  @root_file_name = root_file_name
  @dest_file_name = dest_file_name
  @results = []
end

Public Instance Methods

mix() click to toggle source

mix all source files trackable from the root file

# File lib/mrubymix.rb, line 15
def mix
  process_files(File.expand_path(root_file_name))

  File.open(dest_file_name, "w") do |o_f|
    results.each do |name, skip_lines|
      File.open(name, "r") do |i_f|
        o_f.write "\# File: #{name}\n"
        i_f.each do |l|
          # skip_lines is sorted
          if i_f.lineno == skip_lines.first
            skip_lines.shift
          else
            o_f.write l
          end
        end
        o_f.write "\n"
      end
    end
  end
end

Private Instance Methods

file_not_processed(full_file_name) click to toggle source
# File lib/mrubymix.rb, line 57
def file_not_processed(full_file_name)
  results.none? {|r| r[0] == full_file_name}
end
normalize_file_name(file_name, base_dir) click to toggle source
# File lib/mrubymix.rb, line 61
def normalize_file_name(file_name, base_dir)
  file_name = File.expand_path(file_name, base_dir)
  file_name <<= '.rb' unless file_name.end_with?('.rb')
  file_name
end
parse_single_file(file_name) click to toggle source

Processes a single file and returned all required items with line numbers and item name in the following format:

[[2, "require", "foo"], [3, "require", "bar"]]
# File lib/mrubymix.rb, line 43
def parse_single_file(file_name)
  r = []
  File.open(file_name, "r") do |f|
    f.each do |l|
      words = l.split(' ').select {|w| !w.empty? }
      if (words.length == 3) &&
          (words[0] == '#=')
        r <<= [f.lineno, words[1], words[2]]
      end
    end
  end
  r
end
process_files(root_file_name) click to toggle source

Starts recursive processing from a base file, and adds the required files in results field. The result format is:

[“~/foo.rb”, [1, 2, 3]], [“~/tmp/bar.rb”, [4, 5]], [“~/app.rb”, [1]]

The file name returned are in full path. For each file, the line needed to skip is also returned

file_name must be a full path

# File lib/mrubymix.rb, line 76
def process_files(root_file_name)
  file_dir = File.dirname(root_file_name)

  required_files = parse_single_file(root_file_name)
  skip_lines = []

  required_files.each do |lineno, cmd, arg|
    skip_lines <<= lineno
    if cmd == 'require'
      required_file_path = normalize_file_name(arg, file_dir)
      process_files required_file_path if file_not_processed required_file_path
    end
  end

  results << [root_file_name, skip_lines] if file_not_processed root_file_name
end