Module: Retrospec::Plugins::V1::ModuleHelpers

Included in:
Config, Plugin
Defined in:
lib/retrospec/plugins/v1/module_helpers.rb

Instance Method Summary collapse

Instance Method Details

#create_content(type, dest, src = nil, overwrite = false) ⇒ Object

creates the content, then notifies the user



32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
# File 'lib/retrospec/plugins/v1/module_helpers.rb', line 32

def create_content(type, dest, src = nil, overwrite = false)
  case type
    when :file
      File.open(dest, 'w') do |f|
        f.puts(src)
      end
    when :dir
      FileUtils.mkdir_p(dest)
    when :link
      FileUtils.copy_entry(src,dest,false,false,true) # always remove destination
    when :mv
      FileUtils.mv(src,dest)
    when :touch
      FileUtils.touch(dest)
    when :cp
      FileUtils.cp(src,dest)
  end
  notify(dest, overwrite)
end

#default_retrospec_dirObject

the directory where the config, repos, and other info are saved



138
139
140
# File 'lib/retrospec/plugins/v1/module_helpers.rb', line 138

def default_retrospec_dir
  File.expand_path(File.join(ENV['HOME'], '.retrospec' ))
end

#notify(dest, overwrite = false) ⇒ Object

notifies the user of what action will be performed + creates a file

  • + overwrites a file



23
24
25
26
27
28
29
# File 'lib/retrospec/plugins/v1/module_helpers.rb', line 23

def notify(dest, overwrite=false)
  if overwrite
    puts " - + #{dest}".info
  else
    puts " + #{dest}".info
  end
end

#overwrite?(dest) ⇒ Boolean

sets @overwrite_all if the user chooses ‘a’ and saves for next time

Parameters:

  • dest (String)
    • the destination of the file

Returns:

  • (Boolean)


55
56
57
58
59
60
61
62
63
64
65
66
67
# File 'lib/retrospec/plugins/v1/module_helpers.rb', line 55

def overwrite?(dest)
  return true if overwrite_all
  return false unless overwrite_enabled?
  answer = prompt_for_overwrite(dest)
  if answer == 'a'
    print "Are you sure you wish to overwrite all generated files?(y/n): ".fatal
    sure = gets.chomp.downcase
    return @@overwrite_all = true if sure == 'y'
    overwrite?(dest)
  else
    answer == 'y'
  end
end

#overwrite_allBoolean

stores the answer if the user wants to overwrite all files

Returns:

  • (Boolean)

    true if overwrite_all mode is enabled



11
12
13
# File 'lib/retrospec/plugins/v1/module_helpers.rb', line 11

def overwrite_all
  @@overwrite_all ||= !ENV['RETROSPEC_OVERWRITE_ALL'].nil?
end

#overwrite_enabled?Boolean

Returns true if overwrite mode is enabled.

Returns:

  • (Boolean)

    true if overwrite mode is enabled



16
17
18
# File 'lib/retrospec/plugins/v1/module_helpers.rb', line 16

def overwrite_enabled?
  !ENV['RETROSPEC_OVERWRITE_ENABLE'].nil?
end

#prompt_for_overwrite(dest) ⇒ Object



69
70
71
72
# File 'lib/retrospec/plugins/v1/module_helpers.rb', line 69

def prompt_for_overwrite(dest)
  print "Overwrite #{dest}?(y/n/a): ".cyan
  gets.chomp.downcase
end

#retrospec_repos_dirObject



142
143
144
# File 'lib/retrospec/plugins/v1/module_helpers.rb', line 142

def retrospec_repos_dir
  File.join(default_retrospec_dir, 'repos')
end

#safe_copy_file(src, dest) ⇒ Object

safely copy an existing file to another dest



103
104
105
106
107
108
109
110
# File 'lib/retrospec/plugins/v1/module_helpers.rb', line 103

def safe_copy_file(src, dest)
  if File.exists?(dest) and !File.zero?(dest) && !overwrite?(dest)
    return $stderr.puts "!! #{dest} already exists".warning
  end
  return safe_touch(src) unless File.exists?(src)
  safe_mkdir(File.dirname(dest))
  create_content(:cp, dest, src)
end

#safe_create_file(dest, content) ⇒ Object

safely creates a file and does not override the existing file



124
125
126
127
128
129
130
131
132
133
134
135
# File 'lib/retrospec/plugins/v1/module_helpers.rb', line 124

def safe_create_file(dest, content)
  if File.exists?(dest) && !overwrite?(dest)
    old_content = File.read(dest)
    # if we did a better comparison of content we could be smarter about when we create files
    if old_content != content or not File.zero?(dest)
      $stderr.puts "!! #{dest} already exists and differs from template".warning
    end
  else
    safe_mkdir(File.dirname(dest)) unless File.exists? File.dirname(dest)
    create_content(:file, dest, content)
  end
end

#safe_create_module_files(template_dir, module_path, spec_object) ⇒ Object

creates any file that is contained in the templates/modules_files directory structure loops through the directory looking for erb files or other files. strips the erb extension and renders the template to the current module path filenames must named how they would appear in the normal module path. The directory structure where the file is contained



168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
# File 'lib/retrospec/plugins/v1/module_helpers.rb', line 168

def safe_create_module_files(template_dir, module_path, spec_object)
  templates = Find.find(File.join(template_dir,'module_files')).sort
  templates.each do |template|
    dest = template.gsub(File.join(template_dir,'module_files'), module_path)
    if File.symlink?(template)
      safe_create_symlink(template, dest)
    elsif File.directory?(template)
      safe_mkdir(dest)
    else
      # because some plugins contain erb files themselves any erb file will be copied only
      # so we need to designate which files should be rendered with .retrospec.erb
      if template =~ /\.retrospec\.erb/
        # render any file ending in .retrospec_erb as a template
        dest = dest.gsub(/\.retrospec\.erb/, '')
        safe_create_template_file(dest, template, spec_object)
      else
        safe_copy_file(template, dest)
      end
    end
  end
end

copy the symlink and preserve the link



95
96
97
98
99
100
# File 'lib/retrospec/plugins/v1/module_helpers.rb', line 95

def safe_create_symlink(src,dest)
  if File.exists?(dest) && !overwrite?(dest)
    return $stderr.puts "!! #{dest} already exists and differs from template".warning
  end
  create_content(:link, dest, src)
end

#safe_create_template_file(path, template, spec_object) ⇒ Object

path is the full path of the file to create template is the full path to the template file spec_object is any bindable object which the templates uses for context



149
150
151
152
153
154
155
156
157
158
159
160
161
# File 'lib/retrospec/plugins/v1/module_helpers.rb', line 149

def safe_create_template_file(path, template, spec_object)
  # check to ensure parent directory exists
  file_dir_path = File.expand_path(File.dirname(path))
  if ! File.exists?(file_dir_path)
    safe_mkdir(file_dir_path)
  end
  File.open(template) do |file|
    renderer = ERB.new(file.read, 0, '-')
    content = renderer.result spec_object.get_binding
    dest_path = File.expand_path(path)
    safe_create_file(dest_path, content)
  end
end

#safe_mkdir(dir) ⇒ Object

only creates a directory if the directory doesn’t already exist



75
76
77
78
79
80
81
82
83
84
# File 'lib/retrospec/plugins/v1/module_helpers.rb', line 75

def safe_mkdir(dir)
  dir = File.expand_path(dir)
  if File.exists? dir
    unless File.directory? dir
      $stderr.puts "!! #{dir} already exists and is not a directory".fatal
    end
  else
    create_content(:dir, dir)
  end
end

#safe_move_file(src, dest) ⇒ Object

move the file, safely



87
88
89
90
91
92
# File 'lib/retrospec/plugins/v1/module_helpers.rb', line 87

def safe_move_file(src,dest)
  if File.exists?(dest) && !overwrite?(dest)
    return $stderr.puts "!! #{dest} already exists and differs from template".warning
  end
  create_content(:mv, dest, src)
end

#safe_touch(file) ⇒ Object

touch a file, this is useful for setting up trigger files



113
114
115
116
117
118
119
120
121
# File 'lib/retrospec/plugins/v1/module_helpers.rb', line 113

def safe_touch(file)
  if File.exists? file
    unless File.file? file
      $stderr.puts "!! #{file} already exists and is not a regular file".fatal
    end
  else
    create_content(:touch, file)
  end
end