lib/hanami/commands/server.rb in hanami-0.8.0 vs lib/hanami/commands/server.rb in hanami-0.9.0

- old
+ new

@@ -1,156 +1,28 @@ -require 'rack' -require 'hanami/server' +require 'hanami/commands/command' module Hanami module Commands - class Server + # Server command (`hanami server`) + # + # @since 0.1.0 + # @api private + class Server < Command + requires 'code_reloading' - # Message text when Shotgun enabled but interpreter does not support `fork` - # - # @since 0.8.0 - # @api private - WARNING_MESSAGE = 'Your platform doesn\'t support code reloading.'.freeze - - ENTR_EXECUTE_COMMAND = "find %{paths} -type f | entr -r bundle exec hanami rackserver %{args}".freeze - - attr_reader :server - def initialize(options) - @options = options - detect_strategy! - prepare_server! + super(options) + + require 'hanami/server' + @server = Hanami::Server.new end def start - preload_applications! - - case @strategy - when :entr - exec ENTR_EXECUTE_COMMAND % {paths: project_paths, args: server_options} - when :shotgun - Shotgun.enable_copy_on_write - Shotgun.preload - @server.start - when :rackup - @server.start - end + server.start end - private + protected - def server_options - _options = @options.dup - _options.delete(:code_reloading) - _options.inject([]) {|res, (k, v)| res << "--#{k}=#{v}" ; res}.join(" ") - end - - def project_paths - applications = Hanami::Environment.new.container? ? 'apps' : 'app' - "#{ applications } config db lib" - end - - def prepare_server! - case @strategy - when :rackup - @server = Hanami::Server.new(@options) - when :shotgun - @server = Hanami::Server.new(@options) - @server.app = Shotgun::Loader.new(@server.rackup_config) - end - end - - # Determine server strategy - # - # In order to decide the value, it looks up the following sources: - # - # * CLI option `code_reloading` - # - # If those are missing it falls back to the following defaults: - # - # * :shotgun for development and if Shotgun enabled and `fork supported - # * :entr for development and Shotgun disabled but `entr` installed - # * :rackup for all other cases - # - # @return [:shotgun,:entr, :rackup] the result of the check - # - # @since 0.8.0 - # - # @see Hanami::Environment::CODE_RELOADING - def detect_strategy! - @strategy = :rackup - if Hanami::Environment.new(@options).code_reloading? - if shotgun_enabled? - if fork_supported? - @strategy = :shotgun - else - puts WARNING_MESSAGE - end - elsif entr_enabled? - @strategy = :entr - end - end - - @strategy - end - - def preload_applications! - Hanami::Environment.new(@options).require_application_environment - Hanami::Application.preload! - end - - # Check if entr(1) is installed - # - # @return [Boolean] - # - # @since 0.8.0 - # @api private - def entr_enabled? - !!which('entr') - end - - - # Check if Shotgun is enabled - # - # @return [Boolean] - # - # @since 0.8.0 - # @api private - def shotgun_enabled? - begin - require 'shotgun' - true - rescue LoadError - false - end - end - - # Check if ruby interpreter supports `fork` - # - # @return [Boolean] - # - # @since 0.8.0 - # @api private - def fork_supported? - Kernel.respond_to?(:fork) - end - - # Cross-platform way of finding an executable in the $PATH. - # - # Usage: - # which('ruby') #=> /usr/bin/ruby - # - # @since 0.8.0 - # @api private - def which(cmd) - exts = ENV['PATHEXT'] ? ENV['PATHEXT'].split(';') : [''] - ENV['PATH'].split(File::PATH_SEPARATOR).each do |path| - exts.each { |ext| - exe = File.join(path, "#{cmd}#{ext}") - return exe if File.executable?(exe) && !File.directory?(exe) - } - end - return nil - end + attr_reader :server end end end