Class: Temp::Copier

Inherits:
Object
  • Object
show all
Defined in:
lib/temp/copier.rb

Overview

A Copier object provides various functions for creating a project from a template. It can also be given a path to the directory where templates can be found.

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(options = {}) ⇒ Copier

Returns a new instance of Copier.



12
13
14
15
# File 'lib/temp/copier.rb', line 12

def initialize(options = {})
  @options = options
  @template_dir = File.expand_path(options[:template_dir] || '~/.temp')
end

Instance Attribute Details

#optionsObject (readonly)

Returns the value of attribute options.



10
11
12
# File 'lib/temp/copier.rb', line 10

def options
  @options
end

Instance Method Details

#create_project(project, template) ⇒ Object

Creates a new project with the given path from the given template name.



18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# File 'lib/temp/copier.rb', line 18

def create_project(project, template)
  project = File.expand_path(project)
  template_path = File.expand_path(File.join(@template_dir, template))

  raise 'project already exists' if File.exist? project
  raise 'template does not exist' unless File.exist? template_path

  ignore = read_tempignore(template)
  files = find_files(template, ignore)

  FileUtils.mkdir(project)
  files.each do |file|
    p = File.join(project, file)
    t = File.join(template_path, file)

    if File.directory? t
      FileUtils.mkdir(p)
    else
      FileUtils.cp(t, p)
    end
  end
end

#find_files(template, ignore = []) ⇒ Object

Returns an array of all files in a template, optionally ignoring all files in ignore.



43
44
45
46
47
48
# File 'lib/temp/copier.rb', line 43

def find_files(template, ignore = [])
  template = File.expand_path(File.join(@template_dir, template))
  Dir.glob(File.join(template, '**/*')).map do |file|
    file.sub(template + '/', '')
  end - ignore
end

#read_tempignore(template) ⇒ Object

Returns an array of files in a template to ignore.



51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
# File 'lib/temp/copier.rb', line 51

def read_tempignore(template)
  template = File.expand_path(File.join(@template_dir, template))
  tempignore = File.join(template, '.tempignore')
  files = ['.tempignore']

  if File.exist? tempignore
    files |= File.read(tempignore).split(?\n).map do |line|
      Dir.glob(File.join(template, line)).map do |file|
        file.sub(template + '/', '')
      end
    end.flatten
  end

  files
end