Class: Vcvars::Scaffold

Inherits:
Object
  • Object
show all
Defined in:
lib/vcvars/scaffold.rb

Overview

Generates a new C-extension gem skeleton that is correct for an MSVC (mswin) Ruby: an MSVC-aware extconf.rb, a Rakefile wired to ‘vcvars/rake` (so `rake compile` works without a Developer Command Prompt), a warning-clean sample .c, and a passing test.

Constant Summary collapse

NAME_RE =
/\A[a-z][a-z0-9_]*\z/

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(name, dir: nil) ⇒ Scaffold

Returns a new instance of Scaffold.



16
17
18
19
20
21
22
23
24
# File 'lib/vcvars/scaffold.rb', line 16

def initialize(name, dir: nil)
  @name = name.to_s
  unless @name =~ NAME_RE
    raise Error, "invalid extension name #{name.inspect}: use lowercase " \
      "letters, digits and underscores, starting with a letter (e.g. my_ext)."
  end
  @module_name = camelize(@name)
  @dest = File.expand_path(dir || @name)
end

Instance Attribute Details

#destObject (readonly)

Returns the value of attribute dest.



14
15
16
# File 'lib/vcvars/scaffold.rb', line 14

def dest
  @dest
end

#module_nameObject (readonly)

Returns the value of attribute module_name.



14
15
16
# File 'lib/vcvars/scaffold.rb', line 14

def module_name
  @module_name
end

#nameObject (readonly)

Returns the value of attribute name.



14
15
16
# File 'lib/vcvars/scaffold.rb', line 14

def name
  @name
end

Instance Method Details

#filesObject

relpath => contents



45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
# File 'lib/vcvars/scaffold.rb', line 45

def files
  {
    "#{name}.gemspec"               => render(GEMSPEC),
    "Gemfile"                       => render(GEMFILE),
    "Rakefile"                      => render(RAKEFILE),
    "README.md"                     => render(README),
    "LICENSE.txt"                   => render(LICENSE),
    ".gitignore"                    => render(GITIGNORE),
    "lib/#{name}.rb"                => render(LIB_ENTRY),
    "lib/#{name}/version.rb"        => render(LIB_VERSION),
    "ext/#{name}/extconf.rb"        => render(EXTCONF),
    "ext/#{name}/#{name}.c"         => render(EXT_C),
    "test/test_#{name}.rb"          => render(TEST)
  }
end

#generate(force: false) ⇒ Object

Writes the skeleton. Returns the list of created file paths. Raises if the destination already contains files (unless force: true).



28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
# File 'lib/vcvars/scaffold.rb', line 28

def generate(force: false)
  if File.directory?(@dest) && !Dir.empty?(@dest) && !force
    raise Error, "destination #{@dest} already exists and is not empty " \
      "(pass force: true / --force to overwrite)."
  end

  created = []
  files.each do |relpath, content|
    full = File.join(@dest, relpath)
    FileUtils.mkdir_p(File.dirname(full))
    File.write(full, content)
    created << full
  end
  created
end