class Rammer::ScaffoldGenerator

Generator class for scaffolding

Attributes

arguments[RW]
attributes[RW]
data_types[RW]
gem_path[RW]
model_class[RW]
project_class[RW]
project_name[RW]
scaffold_name[RW]
valid[RW]

Public Class Methods

new(options) click to toggle source

Initiliazes the basic attributes required for scaffolding.

# File lib/rammer/scaffold_generator.rb, line 46
def initialize(options)
  @scaffold_name = to_underscore(options[:scaffold_name])
  @model_class = @scaffold_name.split('_').map(&:capitalize).join('')
  @project_name = options[:project_name]
  @project_class = @project_name.split('_').map(&:capitalize).join('')
  @arguments = options[:arguments]
  @attributes, @data_types = [],[]
  path = `gem which rammer`
  @gem_path = path.split($gem_file_name,2).first + $gem_file_name
  @valid = false
end

Public Instance Methods

add_attributes(source,attribute,data_type) click to toggle source

Edits the migration file with the user specified model attributes.

# File lib/rammer/scaffold_generator.rb, line 129
def add_attributes(source,attribute,data_type)
  file = File.open(source, "r+")
  file.each do |line|
    while line == "    create_table :#{@scaffold_name}s do |t|\n" do
      pos = file.pos
      rest = file.read
      file.seek pos
      file.write("      t.#{data_type} :#{attribute}\n") 
      file.write(rest)
      break
    end
  end
end
config_apis() click to toggle source

Configures the api file with respect to the user input.

# File lib/rammer/scaffold_generator.rb, line 162
def config_apis
  source = "#{Dir.pwd}/app/apis/#{@project_name}/#{@scaffold_name}s/base_apis.rb"
  content = ['AppName','ScaffoldName', 'Model', 'model']
  replacement = ["#{@project_class}", "#{model_class}s", "#{model_class}", "#{@scaffold_name}"]
  for i in 0..3 do
    modify_content(source, content[i], replacement[i])
  end
end
config_migration(migration_version) click to toggle source

Configures the migration file with the required user input.

# File lib/rammer/scaffold_generator.rb, line 110
def config_migration(migration_version)
  source = "#{Dir.pwd}/db/migrate/#{migration_version}_create_#{@scaffold_name}s.rb"
  modify_content(source, 'CreateMigration', "Create#{@model_class}s")   
  modify_content(source, 'migration', "#{@scaffold_name}s") 

  @arguments.each do |value| 
    @attributes << value.split(':').first 
    @data_types << value.split(':').last 
  end

  attribute_data_types = @data_types.reverse
  @attributes.reverse.each_with_index do |value,index|
    add_attributes(source, value, attribute_data_types[index])  
  end
end
config_model() click to toggle source

Configures the model file in accordance to user input.

# File lib/rammer/scaffold_generator.rb, line 87
def config_model
  source = "#{Dir.pwd}/app/models/#{@scaffold_name}.rb"
  modify_content(source, 'Model', "#{model_class}")   
  modify_content(source, '@model', "@#{@scaffold_name}")
end
create_migration() click to toggle source

Generates migration files for the scaffold.

# File lib/rammer/scaffold_generator.rb, line 96
def create_migration
  migration_version = Time.now.to_i
  dir = "/db/migrate/#{migration_version}_create_#{@scaffold_name}s.rb"
  unless File.exists?(File.join(Dir.pwd,dir))
    source = "#{@gem_path}/lib/modules/scaffold/migration.rb"
    FileUtils.cp(source,File.join(Dir.pwd,dir))
    config_migration(migration_version)
    $stdout.puts "\e[1;32m \tcreate\e[0m\t#{dir}"
  end
end
create_model_file() click to toggle source

Generates the model file with CRED functionality.

# File lib/rammer/scaffold_generator.rb, line 70
def create_model_file
  dir = "/app/models/#{@scaffold_name}.rb"
  unless File.exists?(File.join(Dir.pwd,dir))
    File.join(Dir.pwd,dir)
    source = "#{@gem_path}/lib/modules/scaffold/model.rb"
    FileUtils.cp(source,File.join(Dir.pwd,dir))
    config_model
    @valid = true
    $stdout.puts "\e[1;32m \tcreate\e[0m\t#{dir}"
  else
    $stdout.puts "\e[1;31mError:\e[0m Model named #{@scaffold_name} already exists, aborting."
  end
end
enable_apis() click to toggle source

Generates the api file with CRED functionality apis enabled.

# File lib/rammer/scaffold_generator.rb, line 146
def enable_apis
  dir = "/app/apis/#{@project_name}/#{@scaffold_name}s/base_apis.rb"
  base_dir = "#{Dir.pwd}/app/apis/#{@project_name}/#{@scaffold_name}s"
  unless File.exists?(File.join(Dir.pwd,dir))
    FileUtils.mkdir base_dir unless File.exists?(base_dir)
    source = "#{@gem_path}/lib/modules/scaffold/base_apis.rb"
    FileUtils.cp(source,File.join(Dir.pwd,dir))
    config_apis
    $stdout.puts "\e[1;32m \tcreate\e[0m\t#{dir}"
    mount_apis
  end
end
mount_apis() click to toggle source

Mounts the scaffold apis onto the application.

# File lib/rammer/scaffold_generator.rb, line 174
def mount_apis
  require_apis_to_base
  mount_class = "::#{@project_class}::#{@model_class}s::BaseApis"
  file = File.open("#{Dir.pwd}/app/apis/#{@project_name}/base.rb", "r+")
  file.each do |line|
    while line == "\tclass Base < Grape::API\n" do
      pos = file.pos
      rest = file.read
      file.seek pos
      file.write("\t\tmount ") 
      file.puts(mount_class)
      file.write(rest)
      break
    end
  end
  $stdout.puts "\e[1;35m\tmounted\e[0m\t#{mount_class}"
end
require_apis_to_base() click to toggle source

Configures for mounting the scaffold apis.

# File lib/rammer/scaffold_generator.rb, line 195
def require_apis_to_base
  File.open("#{Dir.pwd}/app/apis/#{@project_name}/base.rb", "r+") do |f|  
    pos = f.pos   
    rest = f.read
    f.seek pos
    f.write("require_relative '#{@scaffold_name}s/base_apis'\n") 
    f.write(rest)
  end
end
run() click to toggle source

Initiates scaffolding functionality by creating model, migration and api files.

# File lib/rammer/scaffold_generator.rb, line 61
def run 
  create_model_file
  create_migration if @valid==true
  enable_apis if @valid==true
end

Private Instance Methods

modify_content(source, content, replace_value) click to toggle source

Modifies the content(specified) of a file(specified) with another value(specified).

# File lib/rammer/scaffold_generator.rb, line 219
def modify_content(source, content, replace_value)
  file = File.read(source)
  replace = file.gsub(/#{content}/, replace_value)
  File.open(source, "w"){|f|
    f.puts replace       
  }
end
to_underscore(value) click to toggle source

Converts the string into snake case format.

# File lib/rammer/scaffold_generator.rb, line 210
def to_underscore(value)
  underscore_value = value.gsub(/::/, '/').gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
  gsub(/([a-z\d])([A-Z])/,'\1_\2').tr("-", "_").downcase
  return underscore_value
end