Class: LittleGhost::Generators::ApplicationGenerator

Inherits:
Object
  • Object
show all
Defined in:
lib/little_ghost/generators/application_generator.rb

Overview

Creates one conventional standalone LittleGhost application.

Defined Under Namespace

Classes: DestinationExistsError, Error, GenerationError, InvalidNameError

Constant Summary collapse

NAME_PATTERN =

:nodoc:

/\A[A-Za-z](?:[A-Za-z0-9]|[-_](?=[A-Za-z0-9]))*\z/
TEMPLATE_ROOT =

:nodoc:

File.expand_path("templates/application", __dir__)
EMPTY_DIRECTORIES =

:nodoc:

%w[app/assemblies app/tools app/skills].freeze

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(name:, current_directory: Dir.pwd, template_root: TEMPLATE_ROOT, dependency_path: nil) ⇒ ApplicationGenerator

Returns a new instance of ApplicationGenerator.



21
22
23
24
25
26
27
28
# File 'lib/little_ghost/generators/application_generator.rb', line 21

def initialize(name:, current_directory: Dir.pwd, template_root: TEMPLATE_ROOT, dependency_path: nil)
  @name = name.to_s
  @current_directory = File.expand_path(current_directory)
  @template_root = File.expand_path(template_root)
  @dependency_path = dependency_path && File.expand_path(dependency_path)
  @directory_name = normalize_name
  @class_name = directory_name.split("_").map(&:capitalize).join
end

Instance Attribute Details

#directory_nameObject (readonly)

Returns the value of attribute directory_name.



19
20
21
# File 'lib/little_ghost/generators/application_generator.rb', line 19

def directory_name
  @directory_name
end

Instance Method Details

#generateObject



30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
# File 'lib/little_ghost/generators/application_generator.rb', line 30

def generate
  destination = File.join(current_directory, directory_name)
  raise DestinationExistsError, "#{destination} already exists" if File.symlink?(destination) || File.exist?(destination)

  identity = nil
  begin
    Dir.mkdir(destination, 0o700)
  rescue Errno::EEXIST
    raise DestinationExistsError, "#{destination} already exists"
  rescue SystemCallError => error
    raise GenerationError, "Could not create #{directory_name}: #{error.message}"
  end

  begin
    identity = directory_identity(destination)
    files = rendered_files
    create_directories(destination, identity, files)
    create_files(destination, identity, files)
    directory_mode = File.stat(File.join(destination, "app")).mode & 0o777
    verify_destination!(destination, identity)
    yield(destination) if block_given?
    restore_directory_mode(destination, identity, directory_mode)
    destination
  rescue Error
    remove_created_destination(destination, identity) if identity
    raise
  rescue => error
    remove_created_destination(destination, identity) if identity
    raise GenerationError, "Could not create #{directory_name}: #{error.message}"
  end
end