Sha256: a4847b8559591369f53db15c06dc38e78ddb4bd157676cdb1a2bea9d3c0ee57e

Contents?: true

Size: 1.48 KB

Versions: 1

Compression:

Stored size: 1.48 KB

Contents

module FsTemplate
  class Project
    include FromHash
    attr_accessor :path

    def config_body
      if FileTest.exist?("#{path}/.fstemplate")
        File.read("#{path}/.fstemplate")
      elsif FileTest.exist?("#{path}/.overlay")
        File.read("#{path}/.overlay")
      else
        raise "no config"
      end
    end

    fattr(:config) do
      res = ProjectConfig.new
      res.body = config_body
      res.load!
      res
    end

    def overlay_paths
      config.overlays + [path]
    end

    fattr(:overlays) do
      overlay_paths.map { |x| Files.load(x) }
    end

    fattr(:base_files) do
      Files.load(config.base)
    end

    fattr(:combined_files) do
      res = base_files
      overlays.each do |overlay|
        res = res.apply(overlay)
      end
      res
    end

    def write_to!(output_path)
      base_files.write_to! output_path
      `rm -rf #{output_path}/.git`
      ec "cd #{output_path} && git init && git add . && git commit -m 'Base Files #{config.base}'", :silent => true
      combined_files.write_to!(output_path)
      ec "cd #{output_path} && git add . && git commit -m 'Overlay Files #{path}'", :silent => true
    end
  end

  class ProjectConfig
    include FromHash
    attr_accessor :body, :base
    fattr(:overlays) { [] }

    def base(*args)
      if args.empty?
        @base
      else
        @base = args.first
      end
    end

    def overlay(name)
      self.overlays << name
    end

    def load!
      c = self
      eval(body)
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
fs_template-0.1.0 lib/fs_template/project.rb