Module: NameNormalizer

Defined in:
lib/scaffolding/name_normalizer.rb

Constant Summary collapse

SUFFIXES =
%w[_page _spec _steps _helper _test _feature].freeze

Class Method Summary collapse

Class Method Details

.camel_to_snake(str) ⇒ Object



49
50
51
52
53
54
# File 'lib/scaffolding/name_normalizer.rb', line 49

def camel_to_snake(str)
  str.gsub(/::/, '/')
     .gsub(/([A-Z]+)([A-Z][a-z])/, '\1_\2')
     .gsub(/([a-z\d])([A-Z])/, '\1_\2')
     .downcase
end

.leaf_name(input) ⇒ Object

Get the leaf name: ‘admin/users’ -> ‘users’



45
46
47
# File 'lib/scaffolding/name_normalizer.rb', line 45

def leaf_name(input)
  normalize(input).split('/').last
end

.module_parts(input) ⇒ Object

Get the module path for nested names: ‘admin/users’ -> [‘Admin’]



39
40
41
42
# File 'lib/scaffolding/name_normalizer.rb', line 39

def module_parts(input)
  parts = normalize(input).split('/')
  parts[0..-2].map { |p| p.split('_').map(&:capitalize).join }
end

.nested?(input) ⇒ Boolean

Check if the input contains a nested path

Returns:

  • (Boolean)


34
35
36
# File 'lib/scaffolding/name_normalizer.rb', line 34

def nested?(input)
  normalize(input).include?('/')
end

.normalize(input) ⇒ Object

Normalize raw user input to a clean base name ‘LoginPage’ -> ‘login’, ‘login_page’ -> ‘login’, ‘admin/users’ -> ‘admin/users’



10
11
12
13
14
# File 'lib/scaffolding/name_normalizer.rb', line 10

def normalize(input)
  name = input.to_s.strip
  name = camel_to_snake(name) if name.match?(/[A-Z]/)
  strip_suffixes(name)
end

.strip_suffixes(name) ⇒ Object



56
57
58
59
60
61
62
# File 'lib/scaffolding/name_normalizer.rb', line 56

def strip_suffixes(name)
  result = name.dup
  SUFFIXES.each do |suffix|
    result = result.delete_suffix(suffix) if result.end_with?(suffix)
  end
  result
end

.to_class_name(input, suffix = '') ⇒ Object

Convert to class name: ‘login’ -> ‘LoginPage’, ‘admin/users’ -> ‘Admin::UsersPage’



17
18
19
20
21
# File 'lib/scaffolding/name_normalizer.rb', line 17

def to_class_name(input, suffix = '')
  normalized = normalize(input)
  parts = normalized.split('/')
  parts.map { |part| part.split('_').map(&:capitalize).join }.join('::') + suffix
end

.to_file_name(input) ⇒ Object

Convert to file name: ‘LoginPage’ -> ‘login’, ‘admin/users’ -> ‘admin/users’



29
30
31
# File 'lib/scaffolding/name_normalizer.rb', line 29

def to_file_name(input)
  normalize(input)
end

.to_page_class(input) ⇒ Object

Convert to page class: ‘login’ -> ‘LoginPage’



24
25
26
# File 'lib/scaffolding/name_normalizer.rb', line 24

def to_page_class(input)
  to_class_name(input, 'Page')
end