Module: Methadone::CLI

Defined in:
lib/methadone/cli.rb

Overview

Methadone Internal - treat as private

Stuff to implement methadone’s CLI app. These stuff isn’t generally for your use and it’s not included when you require ‘methadone’

Instance Method Summary collapse

Instance Method Details

#add_to_file(file, lines, options = {}) ⇒ Object

Add content to a file

file

path to the file

lines

Array of String representing the lines to add

options

Hash of options:

:before

A regexp that will appear right after the new content. i.e. this is where to insert said content.



37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
# File 'lib/methadone/cli.rb', line 37

def add_to_file(file,lines,options = {})
  new_lines = []
  found_line = false
  File.open(file).readlines.each do |line|
    line.chomp!
    if options[:before] && options[:before] === line
      found_line = true
      new_lines += lines
    end
    new_lines << line
  end

  raise "No line matched #{options[:before]}" if options[:before] && !found_line

  new_lines += lines unless options[:before]
  File.open(file,'w') do |fp|
    new_lines.each { |line| fp.puts line }
  end
end

#check_and_prepare_basedir!(basedir, force) ⇒ Object

Checks that the basedir can be used, either by not existing, or by existing and force is true. In that case, we clean it out entirely

basedir

base directory where the user wants to create a new project

force

if true, and basedir exists, delete it before proceeding

This will exit the app if the dir exists and force is false



19
20
21
22
23
24
25
26
27
28
# File 'lib/methadone/cli.rb', line 19

def check_and_prepare_basedir!(basedir,force)
  if File.exists? basedir
    if force
      rm_rf basedir, :verbose => true, :secure => true
    else
      exit_now! 1,"error: #{basedir} exists, use --force to override"
    end
  end
  mkdir_p basedir
end

#copy_file(relative_path, options = {}) ⇒ Object

Copies a file, running it through ERB

relative_path

path to the file, relative to the project root, minus the .erb extension You should use forward slashes to separate paths; this method will handle making the ultimate path OS independent.

options

Options to affect how the copy is done:

:from

The name of the profile from which to find the file, “full” by default

:as

The name the file should get if not the one in relative_path

:executable

true if this file should be set executable

:binding

the binding to use for the template



67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
# File 'lib/methadone/cli.rb', line 67

def copy_file(relative_path,options = {})

  relative_path = File.join(relative_path.split(/\//))

  template_path = File.join(template_dir(options[:from] || :full),relative_path + ".erb")
  template = ERB.new(File.open(template_path).readlines.join(''), nil ,'-')

  relative_path_parts = File.split(relative_path)
  relative_path_parts[-1] = options[:as] if options[:as]

  File.open(File.join(relative_path_parts),'w') do |file|
    file.puts template.result(options[:binding] || binding)
    file.chmod(0755) if options[:executable]
  end
end

#gemspecObject



113
114
115
# File 'lib/methadone/cli.rb', line 113

def gemspec
  @gemspec || @gemspec=_get_gemspec
end

#normalize_command(cmd) ⇒ Object



104
105
106
107
# File 'lib/methadone/cli.rb', line 104

def normalize_command(cmd)
  #Note: not i18n-safe
  cmd.tr('A-Z','a-z').gsub(/[^a-z0-9_]/,'_').sub(/^_*/,'')
end

#render_license_partial(partial) ⇒ Object



109
110
111
# File 'lib/methadone/cli.rb', line 109

def render_license_partial(partial)
  ERB.new(File.read(template_dir('full/'+partial))).result(binding).strip 
end

#template_dir(from) ⇒ Object

Get the location of the templates for profile “from”



84
85
86
# File 'lib/methadone/cli.rb', line 84

def template_dir(from)
  File.join(File.dirname(__FILE__),'..','..','templates',from.to_s)
end

#template_dirs_in(profile) ⇒ Object



88
89
90
91
92
93
94
95
96
# File 'lib/methadone/cli.rb', line 88

def template_dirs_in(profile)
  template_dir = template_dir(profile)

  Dir["#{template_dir}/**/*"].select { |x| 
    File.directory? x 
  }.map { |dir| 
    dir.gsub(/^#{template_dir}\//,'')
  }
end

#titlify(name) ⇒ Object

converts string to constant form:

methadone-module_name-class_name => Methadone::ModuleName::ClassName


100
101
102
# File 'lib/methadone/cli.rb', line 100

def titlify(name)
  name.gsub(/(^|-|_)(.)/) {"#{'::' if $1 == '-'}#{$2.upcase}"}
end