lib/polytrix/core/implementor.rb in polytrix-0.1.0.pre vs lib/polytrix/core/implementor.rb in polytrix-0.1.0

- old
+ new

@@ -5,41 +5,81 @@ class FeatureNotImplementedError < StandardError def initialize(feature) super "Feature #{feature} is not implemented" end end - class Implementor < Hashie::Dash - include Polytrix::Logger + class Implementor < Polytrix::ManifestSection + class GitOptions < Polytrix::ManifestSection + property :repo, required: true + property :branch + property :to + + def initialize(data) + data = { repo: data } if data.is_a? String + super + end + end + + include Polytrix::Logging include Polytrix::Core::FileSystemHelper - include Hashie::Extensions::Coercion - include Polytrix::Executor + include Polytrix::Runners::Executor property :name property :basedir, required: true property :language coerce_key :basedir, Pathname + property :git + coerce_key :git, GitOptions def initialize(data) - data = Hashie::Mash.new data - data[:name] ||= File.basename data[:basedir] data[:basedir] = File.absolute_path(data[:basedir]) - super(data) + super end + def logger + @logger ||= Polytrix::Logger.new_logger(self) + end + + def clone + # Logging.mdc['implementor'] = name + if git.nil? || git.repo.nil? + logger.info 'Skipping clone because there are no git options' + return + end + branch = git.branch ||= 'master' + target_dir = git.to ||= basedir + if File.exists? target_dir + logger.info "Skipping clone because #{target_dir} already exists" + else + clone_cmd = "git clone #{git.repo} -b #{branch} #{target_dir}" + logger.info "Cloning: #{clone_cmd}" + execute clone_cmd + end + end + def bootstrap + # Logging.mdc['implementor'] = name + banner "Bootstrapping #{name}" + fail "Implementor #{name} has not been cloned" unless cloned? + execute('./scripts/bootstrap', cwd: basedir, prefix: name) rescue Errno::ENOENT logger.warn "Skipping bootstrapping for #{name}, no script/bootstrap exists" end def build_challenge(challenge_data) - challenge_data[:source_file] ||= find_file basedir, challenge_data[:name] challenge_data[:basedir] ||= basedir - challenge_data[:source_file] = relativize(challenge_data[:source_file], challenge_data[:basedir]) challenge_data[:implementor] ||= self challenge_data[:suite] ||= '' - fail FeatureNotImplementedError, "#{name} is not setup" unless File.directory? challenge_data[:basedir] + begin + challenge_data[:source_file] ||= find_file basedir, challenge_data[:name] + challenge_data[:source_file] = relativize(challenge_data[:source_file], challenge_data[:basedir]) + rescue Polytrix::Core::FileSystemHelper::FileNotFound + challenge_data[:source_file] = nil + end Challenge.new challenge_data - rescue Polytrix::Core::FileSystemHelper::FileNotFound - raise FeatureNotImplementedError, challenge_data[:name] + end + + def cloned? + File.directory? basedir end end end