lib/org-converge/command.rb in org-converge-0.0.1 vs lib/org-converge/command.rb in org-converge-0.0.2

- old
+ new

@@ -1,58 +1,77 @@ module OrgConverge class Command attr_reader :dotorg attr_reader :logger attr_reader :ob + attr_reader :engine def initialize(options) @options = options @dotorg = options['<org_file>'] @logger = Logger.new(options['--log'] || STDOUT) @root_dir = options['--root-dir'] - @ob = Orgmode::Parser.new(File.read(dotorg)).babelize + @run_dir = File.expand_path('run') + @ob = Orgmode::Parser.new(File.read(dotorg)).babelize + @babel = nil end def execute! case when @options['--showfiles'] - showfiles when @options['--tangle'] tangle! else converge! end true rescue => e + @logger.error e false end def converge! tangle! + run_blocks! end def tangle! - begin - babel = Orgmode::Babel.new(ob, { :logger => logger, :root_dir => @root_dir }) - results = babel.tangle! - rescue Orgmode::Babel::TangleError - logger.error "Cannot converge because there were errors during tangle step".red + results = babel.tangle! + rescue Orgmode::Babel::TangleError + logger.error "Cannot converge because there were errors during tangle step".red + end + + # TODO: Too much foreman has made this running blocks in parallel the default behavior. + # We should actually be supporting run lists instead, but liking this experiment so far. + def run_blocks! + @engine = OrgConverge::Engine.new(:logger => @logger, :babel => @babel) + babel.tangle_runnable_blocks!(@run_dir) + babel.ob.scripts.each do |key, script| + file = File.expand_path("#{@run_dir}/#{key}") + cmd = "#{script[:lang]} #{file}" + @engine.register script[:lang], cmd, { :cwd => @root_dir, :logger => logger } end + logger.info "Running code blocks now! (#{babel.ob.scripts.count} runnable blocks found in total)" + @engine.start end + def babel + @babel ||= Orgmode::Babel.new(ob, { :logger => @logger, :root_dir => @root_dir }) + end + def showfiles ob.tangle.each do |file, lines| puts "---------- #{file} --------------".green lines.each do |line| puts line end end - ob.scripts.each_with_index do |script, index| - puts "---------- script: #{index} --------------".green - puts script + ob.scripts.each do |index, block| + puts "---------- script: #{index} to be run with: #{block[:header][:shebang]} --------------".green + puts block[:lines] end end end end