module Conductor

Main Conductor class

Constants

VERSION

Attributes

original_input[RW]
stdin[W]

Public Class Methods

conduct(tracks, res = nil, condition = nil) click to toggle source

Main function to parse conditions and

execute actions. Executes recursively for
sub-tracks.

@param tracks The tracks to process @param res The current result @param condition The current condition

@return [Array] result, matched condition(s)

# File bin/conductor, line 56
def conduct(tracks, res = nil, condition = nil)
  tracks.each do |track|
    cond = Condition.new(track[:condition])

    next unless cond.true?

    # Build "matched condition" message
    title = track[:title] || track[:condition]
    condition ||= [""]
    condition << title
    condition.push(track.key?(:continue) ? " -> " : ", ")

    res = execute_track(track)

    if track[:tracks]
      ts = track[:tracks]

      res, condition = conduct(ts, res, condition)

      next if res.nil?
    end

    break unless track[:continue]
  end

  if res == Conductor.original_input
    [nil, "No change in output"]
  else
    [res, condition]
  end
end
execute_track(track) click to toggle source

Execute commands/scripts in the track

@param track The track

@return Resulting STDOUT output

# File bin/conductor, line 17
def execute_track(track)
  if track[:sequence]
    track[:sequence].each do |cmd|
      if cmd[:script]
        script = Script.new(cmd[:script])

        res = script.run
      elsif cmd[:command]
        command = Command.new(cmd[:command])

        res = command.run
      end

      Conductor.stdin = res unless res.nil?
    end
  elsif track[:script]
    script = Script.new(track[:script])

    Conductor.stdin = script.run
  elsif track[:command]
    command = Command.new(track[:command])

    Conductor.stdin = command.run
  end

  Conductor.stdin
end
stdin() click to toggle source
# File lib/conductor.rb, line 26
def stdin
  warn "input on STDIN required" unless $stdin.stat.size.positive? || $stdin.fcntl(Fcntl::F_GETFL, 0).zero?
  @stdin ||= $stdin.read.strip.force_encoding("utf-8")
end

Public Instance Methods

create_config(config_file) click to toggle source
# File lib/conductor/config.rb, line 19
def create_config(config_file)
  config_dir = File.dirname(config_file)
  scripts_dir = File.dirname(File.join(config_dir, "scripts"))
  FileUtils.mkdir_p(config_dir) unless File.directory?(config_dir)
  FileUtils.mkdir_p(scripts_dir) unless File.directory?(scripts_dir)
  File.open(config_file, "w") { |f| f.puts sample_config }
  puts "Sample config created at #{config_file}"

  Process.exit 0
end
sample_config() click to toggle source
# File lib/conductor/config.rb, line 30
  def sample_config
    <<~EOCONFIG
      tracks:
        - condition: phase is pre
          tracks:
          - condition: tree contains .obsidian
            tracks:
            - condition: extension is md
              script: obsidian-md-filter
          - condition: extension is md
            command: rdiscount $file
        - condition: yaml includes comments
          script: blog-processor
        - condition: any
          command: echo 'NOCUSTOM'
    EOCONFIG
  end