CLASS_BASIC = <<-CODE require 'jruby_art' class %s < Processing::App def setup size %s, %s end def draw end end %s.new(title: '%s') CODE CLASS_MODE = <<-CODE require 'jruby_art' class %s < Processing::AppGL def setup size %s, %s, %s end def draw end end %s.new(title: '%s') CODE module Processing require_relative '../jruby_art/helpers/string_extra' require_relative '../jruby_art/helpers/camel_string' # Write file to disk class SketchWriter attr_reader :file def initialize(path) underscore = StringExtra.new(path).underscore @file = "#{File.dirname(path)}/#{underscore}.rb" end def save(template) File.open(file, 'w+') do |f| f.write(template) end end end # An abstract class providing common methods for real creators class Creator ALL_DIGITS = /\A\d+\Z/ def already_exist(path) underscore = StringExtra.new(path).underscore new_file = "#{File.dirname(path)}/#{underscore}.rb" return if !File.exist?(path) && !File.exist?(new_file) puts 'That file already exists!' exit end # Show the help/usage message for create. def usage puts <<-USAGE Usage: k9 create <sketch_to_generate> <width> <height> Examples: k9 create my_app 800 600 k9 create my_app 800 600 p3d USAGE end end # This class creates class wrapped sketches, with an optional render mode class ClassSketch < Creator def class_template format(CLASS_BASIC, @name, @width, @height, @name, @title) end def class_template_mode format(CLASS_MODE, @name, @width, @height, @mode, @name, @title) end # Create a bare blank sketch, given a path. def create!(path, args) return usage if /\?/ =~ path || /--help/ =~ path main_file = File.basename(path, '.rb') # allow uneeded extension input # Check to make sure that the main file doesn't exist already already_exist(path) @name = CamelString.new(main_file).camelize writer = SketchWriter.new(main_file) @title = StringExtra.new(main_file).titleize @width, @height = args[0], args[1] @mode = args[2].upcase unless args[2].nil? template = @mode.nil? ? class_template : class_template_mode writer.save(template) end end end