Class: RailsForge::Generators::BaseGenerator

Inherits:
Object
  • Object
show all
Defined in:
lib/railsforge/generators/base_generator.rb

Overview

Base class for all generators

Defined Under Namespace

Classes: InvalidNameError

Constant Summary collapse

TEMPLATE_VERSION =

Default template version

"v1".freeze

Instance Method Summary collapse

Constructor Details

#initialize(name, options = {}) ⇒ BaseGenerator

Initialize generator

Parameters:

  • name (String)

    Name for the generated object

  • options (Hash) (defaults to: {})

    Generator options



19
20
21
22
23
# File 'lib/railsforge/generators/base_generator.rb', line 19

def initialize(name, options = {})
  @name = name
  @options = options
  @base_path = find_rails_app_path
end

Instance Method Details

#camelizeString

Convert to camelize

Returns:



60
61
62
63
64
65
66
67
# File 'lib/railsforge/generators/base_generator.rb', line 60

def camelize
  result = @name.to_s.gsub(/::/, '/')
  result.gsub(/([A-Z]+)([A-Z][a-z])/, '\1_\2')
        .gsub(/([a-z\d])([A-Z])/, '\1_\2')
        .split('_')
        .map(&:capitalize)
        .join
end

#find_rails_app_pathString?

Find Rails app path

Returns:

  • (String, nil)

    Rails app root path



27
28
29
30
31
32
33
34
35
36
37
38
39
# File 'lib/railsforge/generators/base_generator.rb', line 27

def find_rails_app_path
  path = Dir.pwd
  max_depth = 10

  max_depth.times do
    return path if File.exist?(File.join(path, "config", "application.rb"))
    parent = File.dirname(path)
    break if parent == path
    path = parent
  end

  nil
end

#generateObject

Generate the file

Raises:

  • (NotImplementedError)


70
71
72
# File 'lib/railsforge/generators/base_generator.rb', line 70

def generate
  raise NotImplementedError, "Subclasses must implement #generate"
end

#underscoreString

Convert to underscore

Returns:

  • (String)

    Underscored name



52
53
54
55
56
# File 'lib/railsforge/generators/base_generator.rb', line 52

def underscore
  @name.to_s.gsub(/([A-Z]+)([A-Z][a-z])/, '\1_\2')
        .gsub(/([a-z\d])([A-Z])/, '\1_\2')
        .downcase
end

#validate_name!(name, pattern, error_class) ⇒ Object

Validate name

Parameters:

  • name (String)

    Name to validate

  • pattern (Regexp)

    Pattern to match

  • error_class (Class)

    Error class to raise

Raises:

  • (error_class)


45
46
47
48
# File 'lib/railsforge/generators/base_generator.rb', line 45

def validate_name!(name, pattern, error_class)
  raise error_class, "#{self.class.name.split('::').last} name cannot be empty" if name.nil? || name.strip.empty?
  raise error_class, "Name must match pattern: #{pattern}" unless name =~ pattern
end