Class: Domino::ScaffoldRunner

Inherits:
Object
  • Object
show all
Defined in:
lib/domino/scaffolder.rb

Overview

ScaffoldRunner: handles the actual file generation

Instance Method Summary collapse

Constructor Details

#initialize(model_name, columns, namespace, generate_model) ⇒ ScaffoldRunner

Returns a new instance of ScaffoldRunner.



26
27
28
29
30
31
32
33
34
# File 'lib/domino/scaffolder.rb', line 26

def initialize(model_name, columns, namespace, generate_model)
  @model_name = model_name
  @file_name = model_name.underscore
  @plural_file_name = @file_name.pluralize
  @columns = columns
  @namespace = namespace
  @generate_model = generate_model
  @fields = columns.map(&:name).reject { |c| c == "id" }
end

Instance Method Details

#column_argsObject



55
56
57
58
59
60
61
62
63
# File 'lib/domino/scaffolder.rb', line 55

def column_args
  # @columns.map { |col| "#{col.name}:#{col.sql_type}" unless col.name == "id" }.compact
  @columns.map do |col|
    next if col.name == "id"

    rails_type = map_sql_type(col.sql_type)
    "#{col.name}:#{rails_type}" if rails_type
  end.compact
end

#generate_file(type) ⇒ Object

rubocop:disable Metrics/MethodLength



79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
# File 'lib/domino/scaffolder.rb', line 79

def generate_file(type) # rubocop:disable Metrics/MethodLength
  require "erb"

  template_path = File.expand_path("../../generators/domino/templates/#{type}.rb.tt", __FILE__)
  raise "Missing template: #{template_path}" unless File.exist?(template_path)

  content = ERB.new(File.read(template_path)).result(binding)
  puts "Generating #{type} for #{@model_name}"

  folder = case type
           when "blueprint" then "app/mappers"
           when "controller" then "app/controllers"
           when "repository" then "app/repositories"
           when "service" then "app/services"
           else "app/#{type}s"
           end

  filename = case type
             when "controller"
               "#{@plural_file_name}_controller.rb"
             else
               "#{@file_name}_#{type}.rb"
             end

  FileUtils.mkdir_p(folder)
  File.write(File.join(folder, filename), content)
end

#generate_model_fileObject



49
50
51
52
53
# File 'lib/domino/scaffolder.rb', line 49

def generate_model_file
  cmd = ["rails", "generate", "model", @model_name] + column_args
  system(*cmd)
  # system("rails generate model #{@model_name} #{column_args.join(" ")}")
end

#map_sql_type(sql_type) ⇒ Object

rubocop:disable Metrics/MethodLength



65
66
67
68
69
70
71
72
73
74
75
76
77
# File 'lib/domino/scaffolder.rb', line 65

def map_sql_type(sql_type) # rubocop:disable Metrics/MethodLength
  case sql_type
  when /nvarchar|varchar|text/ then "string"
  when /int/ then "integer"
  when /timestamp/ then "datetime"
  when /bool/ then "boolean"
  when /decimal|numeric/ then "decimal"
  when /date/ then "date"
  else
    puts "Warning: unknown SQL type #{sql_type}, skipping."
    nil
  end
end

#register_dependency(key, class_name) ⇒ Object



107
108
109
110
111
112
113
114
115
# File 'lib/domino/scaffolder.rb', line 107

def register_dependency(key, class_name)
  init_file = Rails.root.join("config/initializers/domino_container.rb")
  line = "Domino::Container.register(\"#{key}\", -> { #{class_name}.new })"

  FileUtils.mkdir_p(File.dirname(init_file))
  return if File.exist?(init_file) && File.read(init_file).include?(line)

  File.write(init_file, "#{line}\n", mode: "a")
end

#runObject



36
37
38
39
40
41
42
43
44
45
46
47
# File 'lib/domino/scaffolder.rb', line 36

def run
  generate_model_file if @generate_model

  generate_file("repository")
  register_dependency("#{@file_name}_repository", "#{@model_name}Repository")

  generate_file("service")
  register_dependency("#{@file_name}_service", "#{@model_name}Service")

  generate_file("blueprint")
  generate_file("controller")
end