class Snowglobe::RailsApplication

Attributes

bundle[R]
command_runner[R]
database[R]
fs[R]

Public Class Methods

new() click to toggle source
# File lib/snowglobe/rails_application.rb, line 17
def initialize
  @fs = Filesystem.new
  @command_runner = ProjectCommandRunner.new(fs)
  @bundle = Bundle.new(fs: fs, command_runner: command_runner)
  @database = Database.new
end

Public Instance Methods

create() click to toggle source
# File lib/snowglobe/rails_application.rb, line 24
def create
  fs.clean
  generate

  fs.within_project do
    remove_unwanted_gems
  end
end
evaluate!(code) click to toggle source
# File lib/snowglobe/rails_application.rb, line 33
def evaluate!(code)
  command_runner = nil

  Dir::Tmpname.create(
    ["", ".rb"],
    fs.find_in_project("tmp"),
  ) do |path, _, _, _|
    tempfile = fs.write_file(path, code)

    command_runner = run_command!(
      "ruby",
      tempfile.to_s,
      err: nil,
      env: { "RUBYOPT" => "" },
    )
  end

  command_runner.output
end
migration_class_name() click to toggle source
# File lib/snowglobe/rails_application.rb, line 61
def migration_class_name
  if rails_version > 5
    number = [rails_version.major, rails_version.minor].join(".").to_f
    "ActiveRecord::Migration[#{number}]"
  else
    "ActiveRecord::Migration"
  end
end
rails_version() click to toggle source
# File lib/snowglobe/rails_application.rb, line 70
def rails_version
  @_rails_version ||= bundle.version_of("rails")
end
run_command(*args, &block) click to toggle source
# File lib/snowglobe/rails_application.rb, line 53
def run_command(*args, &block)
  command_runner.run(*args, &block)
end
run_command!(*args, &block) click to toggle source
# File lib/snowglobe/rails_application.rb, line 57
def run_command!(*args, &block)
  command_runner.run!(*args, &block)
end

Private Instance Methods

add_initializer_for_time_zone_aware_types() click to toggle source
# File lib/snowglobe/rails_application.rb, line 140
    def add_initializer_for_time_zone_aware_types
      path = "config/initializers/configure_time_zone_aware_types.rb"
      fs.write_file(path, <<-TEXT)
Rails.application.configure do
  config.active_record.time_zone_aware_types = [:datetime, :time]
end
      TEXT
    end
configure_tests_to_run_in_sorted_order() click to toggle source
# File lib/snowglobe/rails_application.rb, line 132
    def configure_tests_to_run_in_sorted_order
      fs.transform_file("config/environments/test.rb") do |lines|
        lines.insert(-2, <<-CONTENT)
  config.active_support.test_order = :sorted
        CONTENT
      end
    end
fix_available_locales_warning() click to toggle source
# File lib/snowglobe/rails_application.rb, line 104
    def fix_available_locales_warning
      # See here for more on this:
      # http://stackoverflow.com/questions/20361428/rails-i18n-validation-deprecation-warning
      fs.transform_file("config/application.rb") do |lines|
        lines.insert(-3, <<-TEXT)
if I18n.respond_to?(:enforce_available_locales=)
  I18n.enforce_available_locales = false
end
        TEXT
      end
    end
generate() click to toggle source
# File lib/snowglobe/rails_application.rb, line 86
def generate
  rails_new
  fix_available_locales_warning
  remove_bootsnap
  write_database_configuration
  configure_tests_to_run_in_sorted_order

  if bundle.version_of("rails") >= 5
    add_initializer_for_time_zone_aware_types
  end
end
migrations_directory() click to toggle source
# File lib/snowglobe/rails_application.rb, line 78
def migrations_directory
  fs.find_in_project("db/migrate")
end
rails_new() click to toggle source
# File lib/snowglobe/rails_application.rb, line 98
def rails_new
  CommandRunner.run!(
    %W(rails new #{fs.project_directory} --skip-bundle --no-rc),
  )
end
remove_bootsnap() click to toggle source
# File lib/snowglobe/rails_application.rb, line 116
def remove_bootsnap
  # Rails 5.2 introduced bootsnap, which is helpful when you're developing
  # or deploying an app, but we don't really need it (and it messes with
  # Zeus anyhow)
  fs.comment_lines_matching_in_file(
    "config/boot.rb",
    %r{\Arequire 'bootsnap/setup'},
  )
end
remove_unwanted_gems() click to toggle source
# File lib/snowglobe/rails_application.rb, line 149
def remove_unwanted_gems
  bundle.updating do
    bundle.remove_gem "debugger"
    bundle.remove_gem "byebug"
    bundle.add_gem "pry-byebug"
    bundle.remove_gem "web-console"
  end
end
temp_view_path_for(path) click to toggle source
# File lib/snowglobe/rails_application.rb, line 82
def temp_view_path_for(path)
  temp_views_directory.join(path)
end
write_database_configuration() click to toggle source
# File lib/snowglobe/rails_application.rb, line 126
def write_database_configuration
  fs.open_file("config/database.yml", "w") do |f|
    YAML.dump(database.config.to_hash, f)
  end
end