Class: Vcvars::Scaffold
- Inherits:
-
Object
- Object
- Vcvars::Scaffold
- 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
-
#dest ⇒ Object
readonly
Returns the value of attribute dest.
-
#module_name ⇒ Object
readonly
Returns the value of attribute module_name.
-
#name ⇒ Object
readonly
Returns the value of attribute name.
Instance Method Summary collapse
-
#files ⇒ Object
relpath => contents.
-
#generate(force: false) ⇒ Object
Writes the skeleton.
-
#initialize(name, dir: nil) ⇒ Scaffold
constructor
A new instance of Scaffold.
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.(dir || @name) end |
Instance Attribute Details
#dest ⇒ Object (readonly)
Returns the value of attribute dest.
14 15 16 |
# File 'lib/vcvars/scaffold.rb', line 14 def dest @dest end |
#module_name ⇒ Object (readonly)
Returns the value of attribute module_name.
14 15 16 |
# File 'lib/vcvars/scaffold.rb', line 14 def module_name @module_name end |
#name ⇒ Object (readonly)
Returns the value of attribute name.
14 15 16 |
# File 'lib/vcvars/scaffold.rb', line 14 def name @name end |
Instance Method Details
#files ⇒ Object
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 |