sails 0.1.0 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
 - data/.travis.yml +6 -0
 - data/CHANGELOG.md +13 -0
 - data/Gemfile +1 -0
 - data/Gemfile.lock +3 -1
 - data/README.md +49 -3
 - data/lib/sails/base.rb +159 -53
 - data/lib/sails/cli.rb +24 -74
 - data/lib/sails/config.rb +25 -0
 - data/lib/sails/console.rb +44 -0
 - data/lib/sails/daemon.rb +103 -0
 - data/lib/sails/service/base.rb +56 -0
 - data/lib/sails/service/exception.rb +22 -0
 - data/lib/sails/service/interface.rb +60 -0
 - data/lib/sails/service.rb +8 -75
 - data/lib/sails/templates/Rakefile.tt +0 -5
 - data/lib/sails/templates/app/services/application_service.rb.tt +5 -3
 - data/lib/sails/templates/config/application.rb.tt +9 -3
 - data/lib/sails/templates/config/environments/development.rb +3 -0
 - data/lib/sails/templates/config/environments/production.rb +3 -0
 - data/lib/sails/templates/config/environments/test.rb +3 -0
 - data/lib/sails/version.rb +1 -1
 - data/lib/sails.rb +38 -5
 - data/sails.gemspec +4 -4
 - data/spec/cli_spec.rb +44 -0
 - data/spec/dummy/log/development.log +27 -0
 - data/spec/rails_spec.rb +5 -0
 - data/spec/sails_spec.rb +70 -0
 - data/spec/service_spec.rb +38 -0
 - data/spec/spec_helper.rb +23 -1
 - metadata +28 -6
 - data/spec/tails_spec.rb +0 -33
 
    
        data/lib/sails/daemon.rb
    ADDED
    
    | 
         @@ -0,0 +1,103 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            module Sails
         
     | 
| 
      
 2 
     | 
    
         
            +
              class Daemon
         
     | 
| 
      
 3 
     | 
    
         
            +
                class << self
         
     | 
| 
      
 4 
     | 
    
         
            +
                  attr_accessor :options, :mode, :app_name, :pid_file
         
     | 
| 
      
 5 
     | 
    
         
            +
             
     | 
| 
      
 6 
     | 
    
         
            +
                  def init(opts = {})
         
     | 
| 
      
 7 
     | 
    
         
            +
                    self.app_name = Sails.config.app_name
         
     | 
| 
      
 8 
     | 
    
         
            +
                    self.mode = opts[:mode]
         
     | 
| 
      
 9 
     | 
    
         
            +
                    self.app_name = "#{Sails::Daemon.app_name}-thread" if self.mode == "thread"
         
     | 
| 
      
 10 
     | 
    
         
            +
                    self.pid_file = Sails.root.join("tmp/#{Sails::Daemon.app_name}.pid")
         
     | 
| 
      
 11 
     | 
    
         
            +
                    self.options = options
         
     | 
| 
      
 12 
     | 
    
         
            +
                  end
         
     | 
| 
      
 13 
     | 
    
         
            +
             
     | 
| 
      
 14 
     | 
    
         
            +
                  def read_pid
         
     | 
| 
      
 15 
     | 
    
         
            +
                    if !File.exist?(pid_file)
         
     | 
| 
      
 16 
     | 
    
         
            +
                      return nil
         
     | 
| 
      
 17 
     | 
    
         
            +
                    end
         
     | 
| 
      
 18 
     | 
    
         
            +
             
     | 
| 
      
 19 
     | 
    
         
            +
                    pid = File.open(pid_file).read.to_i
         
     | 
| 
      
 20 
     | 
    
         
            +
                    begin
         
     | 
| 
      
 21 
     | 
    
         
            +
                      Process.getpgid(pid)
         
     | 
| 
      
 22 
     | 
    
         
            +
                    rescue
         
     | 
| 
      
 23 
     | 
    
         
            +
                      pid = nil
         
     | 
| 
      
 24 
     | 
    
         
            +
                    end
         
     | 
| 
      
 25 
     | 
    
         
            +
                    return pid
         
     | 
| 
      
 26 
     | 
    
         
            +
                  end
         
     | 
| 
      
 27 
     | 
    
         
            +
             
     | 
| 
      
 28 
     | 
    
         
            +
                  def start_process(options = {})
         
     | 
| 
      
 29 
     | 
    
         
            +
                    old_pid = read_pid
         
     | 
| 
      
 30 
     | 
    
         
            +
                    if old_pid != nil
         
     | 
| 
      
 31 
     | 
    
         
            +
                      puts "Current have #{app_name} process in running on pid #{old_pid}"
         
     | 
| 
      
 32 
     | 
    
         
            +
                      return
         
     | 
| 
      
 33 
     | 
    
         
            +
                    end
         
     | 
| 
      
 34 
     | 
    
         
            +
             
     | 
| 
      
 35 
     | 
    
         
            +
                    # start master process
         
     | 
| 
      
 36 
     | 
    
         
            +
                    @master_pid = fork_master_process!
         
     | 
| 
      
 37 
     | 
    
         
            +
                    File.open(pid_file, "w+") do |f|
         
     | 
| 
      
 38 
     | 
    
         
            +
                      f.puts @master_pid
         
     | 
| 
      
 39 
     | 
    
         
            +
                    end
         
     | 
| 
      
 40 
     | 
    
         
            +
                    
         
     | 
| 
      
 41 
     | 
    
         
            +
                    puts "Started #{app_name} on pid: #{@master_pid}"
         
     | 
| 
      
 42 
     | 
    
         
            +
             
     | 
| 
      
 43 
     | 
    
         
            +
                    if options[:daemon] == false
         
     | 
| 
      
 44 
     | 
    
         
            +
                      Process.waitpid(@master_pid)
         
     | 
| 
      
 45 
     | 
    
         
            +
                    end
         
     | 
| 
      
 46 
     | 
    
         
            +
                  end
         
     | 
| 
      
 47 
     | 
    
         
            +
                  
         
     | 
| 
      
 48 
     | 
    
         
            +
                  def fork_master_process!
         
     | 
| 
      
 49 
     | 
    
         
            +
                    fork do
         
     | 
| 
      
 50 
     | 
    
         
            +
                      $PROGRAM_NAME = self.app_name + " [master]"
         
     | 
| 
      
 51 
     | 
    
         
            +
                      @child_pid = fork_child_process!
         
     | 
| 
      
 52 
     | 
    
         
            +
              
         
     | 
| 
      
 53 
     | 
    
         
            +
                      Signal.trap("QUIT") { 
         
     | 
| 
      
 54 
     | 
    
         
            +
                        Process.kill("QUIT", @child_pid)
         
     | 
| 
      
 55 
     | 
    
         
            +
                        exit
         
     | 
| 
      
 56 
     | 
    
         
            +
                      }
         
     | 
| 
      
 57 
     | 
    
         
            +
                      
         
     | 
| 
      
 58 
     | 
    
         
            +
                      Signal.trap("USR2") {
         
     | 
| 
      
 59 
     | 
    
         
            +
                        Process.kill("USR2", @child_pid)
         
     | 
| 
      
 60 
     | 
    
         
            +
                      }
         
     | 
| 
      
 61 
     | 
    
         
            +
              
         
     | 
| 
      
 62 
     | 
    
         
            +
                      loop do
         
     | 
| 
      
 63 
     | 
    
         
            +
                        sleep 1
         
     | 
| 
      
 64 
     | 
    
         
            +
                        begin
         
     | 
| 
      
 65 
     | 
    
         
            +
                          Process.getpgid(@child_pid)
         
     | 
| 
      
 66 
     | 
    
         
            +
                        rescue Errno::ESRCH => e
         
     | 
| 
      
 67 
     | 
    
         
            +
                          # puts "Child not found, will restart..."
         
     | 
| 
      
 68 
     | 
    
         
            +
                          @child_pid = fork_child_process!
         
     | 
| 
      
 69 
     | 
    
         
            +
                        end
         
     | 
| 
      
 70 
     | 
    
         
            +
                      end
         
     | 
| 
      
 71 
     | 
    
         
            +
                    end
         
     | 
| 
      
 72 
     | 
    
         
            +
                  end
         
     | 
| 
      
 73 
     | 
    
         
            +
                  
         
     | 
| 
      
 74 
     | 
    
         
            +
                  def fork_child_process!
         
     | 
| 
      
 75 
     | 
    
         
            +
                    fork do
         
     | 
| 
      
 76 
     | 
    
         
            +
                      $PROGRAM_NAME = self.app_name
         
     | 
| 
      
 77 
     | 
    
         
            +
                      Sails.start!(self.mode)
         
     | 
| 
      
 78 
     | 
    
         
            +
                      
         
     | 
| 
      
 79 
     | 
    
         
            +
                      Signal.trap("USR2") {
         
     | 
| 
      
 80 
     | 
    
         
            +
                        # TODO: reload Sails in current process
         
     | 
| 
      
 81 
     | 
    
         
            +
                        exit
         
     | 
| 
      
 82 
     | 
    
         
            +
                      }
         
     | 
| 
      
 83 
     | 
    
         
            +
                    end
         
     | 
| 
      
 84 
     | 
    
         
            +
                  end
         
     | 
| 
      
 85 
     | 
    
         
            +
                  
         
     | 
| 
      
 86 
     | 
    
         
            +
                  def stop_process
         
     | 
| 
      
 87 
     | 
    
         
            +
                    pid = read_pid
         
     | 
| 
      
 88 
     | 
    
         
            +
                    if pid == nil
         
     | 
| 
      
 89 
     | 
    
         
            +
                      puts "#{app_name} process not found, pid #{pid}"
         
     | 
| 
      
 90 
     | 
    
         
            +
                      return
         
     | 
| 
      
 91 
     | 
    
         
            +
                    end
         
     | 
| 
      
 92 
     | 
    
         
            +
             
     | 
| 
      
 93 
     | 
    
         
            +
                    print "Stopping #{app_name} with pid: #{pid}..."
         
     | 
| 
      
 94 
     | 
    
         
            +
                    begin
         
     | 
| 
      
 95 
     | 
    
         
            +
                      Process.kill("QUIT", pid)
         
     | 
| 
      
 96 
     | 
    
         
            +
                    ensure
         
     | 
| 
      
 97 
     | 
    
         
            +
                      File.delete(pid_file)
         
     | 
| 
      
 98 
     | 
    
         
            +
                    end
         
     | 
| 
      
 99 
     | 
    
         
            +
                    puts " [Done]"
         
     | 
| 
      
 100 
     | 
    
         
            +
                  end
         
     | 
| 
      
 101 
     | 
    
         
            +
                end
         
     | 
| 
      
 102 
     | 
    
         
            +
              end
         
     | 
| 
      
 103 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,56 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            module Sails
         
     | 
| 
      
 2 
     | 
    
         
            +
              module Service
         
     | 
| 
      
 3 
     | 
    
         
            +
                # Like ActionController::Base
         
     | 
| 
      
 4 
     | 
    
         
            +
                class Base
         
     | 
| 
      
 5 
     | 
    
         
            +
                  include ActiveSupport::Callbacks
         
     | 
| 
      
 6 
     | 
    
         
            +
                  
         
     | 
| 
      
 7 
     | 
    
         
            +
                  define_callbacks :action
         
     | 
| 
      
 8 
     | 
    
         
            +
             
     | 
| 
      
 9 
     | 
    
         
            +
                  set_callback :action, :before do |object|
         
     | 
| 
      
 10 
     | 
    
         
            +
                    # TODO: only reload on files changed
         
     | 
| 
      
 11 
     | 
    
         
            +
                    Sails.reload!
         
     | 
| 
      
 12 
     | 
    
         
            +
                  end
         
     | 
| 
      
 13 
     | 
    
         
            +
             
     | 
| 
      
 14 
     | 
    
         
            +
                  set_callback :action, :after do |object|
         
     | 
| 
      
 15 
     | 
    
         
            +
                    ActiveRecord::Base.clear_active_connections! if defined?(ActiveRecord::Base)
         
     | 
| 
      
 16 
     | 
    
         
            +
                  end
         
     | 
| 
      
 17 
     | 
    
         
            +
                  
         
     | 
| 
      
 18 
     | 
    
         
            +
                  class << self
         
     | 
| 
      
 19 
     | 
    
         
            +
                    def internal_methods
         
     | 
| 
      
 20 
     | 
    
         
            +
                      controller = self.superclass
         
     | 
| 
      
 21 
     | 
    
         
            +
                      controller.public_instance_methods(true)
         
     | 
| 
      
 22 
     | 
    
         
            +
                    end
         
     | 
| 
      
 23 
     | 
    
         
            +
                    
         
     | 
| 
      
 24 
     | 
    
         
            +
                    def action_methods
         
     | 
| 
      
 25 
     | 
    
         
            +
                      @action_methods ||= begin
         
     | 
| 
      
 26 
     | 
    
         
            +
                        # All public instance methods of this class, including ancestors
         
     | 
| 
      
 27 
     | 
    
         
            +
                        methods = (public_instance_methods(true) -
         
     | 
| 
      
 28 
     | 
    
         
            +
                          # Except for public instance methods of Base and its ancestors
         
     | 
| 
      
 29 
     | 
    
         
            +
                          internal_methods +
         
     | 
| 
      
 30 
     | 
    
         
            +
                          # Be sure to include shadowed public instance methods of this class
         
     | 
| 
      
 31 
     | 
    
         
            +
                          public_instance_methods(false)).uniq.map { |x| x.to_s }
         
     | 
| 
      
 32 
     | 
    
         
            +
             
     | 
| 
      
 33 
     | 
    
         
            +
                        # Clear out AS callback method pollution
         
     | 
| 
      
 34 
     | 
    
         
            +
                        Set.new(methods.reject { |method| method =~ /_one_time_conditions/ })
         
     | 
| 
      
 35 
     | 
    
         
            +
                      end
         
     | 
| 
      
 36 
     | 
    
         
            +
                    end
         
     | 
| 
      
 37 
     | 
    
         
            +
                  end
         
     | 
| 
      
 38 
     | 
    
         
            +
                  
         
     | 
| 
      
 39 
     | 
    
         
            +
                  # Raise a Sails::Service::Exception (Thrift::Exception)
         
     | 
| 
      
 40 
     | 
    
         
            +
                  # if you want custom error you can override this method in you ApplicationService
         
     | 
| 
      
 41 
     | 
    
         
            +
                  def raise_error(code, msg = nil)
         
     | 
| 
      
 42 
     | 
    
         
            +
                    raise Exception.new(code: code, message: msg)
         
     | 
| 
      
 43 
     | 
    
         
            +
                  end
         
     | 
| 
      
 44 
     | 
    
         
            +
                  
         
     | 
| 
      
 45 
     | 
    
         
            +
                  def action_methods
         
     | 
| 
      
 46 
     | 
    
         
            +
                    self.class.action_methods
         
     | 
| 
      
 47 
     | 
    
         
            +
                  end
         
     | 
| 
      
 48 
     | 
    
         
            +
             
     | 
| 
      
 49 
     | 
    
         
            +
                  # Sails.logger
         
     | 
| 
      
 50 
     | 
    
         
            +
                  # You can use this method in app/services
         
     | 
| 
      
 51 
     | 
    
         
            +
                  def logger
         
     | 
| 
      
 52 
     | 
    
         
            +
                    Sails.logger
         
     | 
| 
      
 53 
     | 
    
         
            +
                  end
         
     | 
| 
      
 54 
     | 
    
         
            +
                end
         
     | 
| 
      
 55 
     | 
    
         
            +
              end
         
     | 
| 
      
 56 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,22 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            module Sails
         
     | 
| 
      
 2 
     | 
    
         
            +
              module Service
         
     | 
| 
      
 3 
     | 
    
         
            +
                # Thrift Exception
         
     | 
| 
      
 4 
     | 
    
         
            +
                class Exception < ::Thrift::Exception
         
     | 
| 
      
 5 
     | 
    
         
            +
                  include ::Thrift::Struct, ::Thrift::Struct_Union
         
     | 
| 
      
 6 
     | 
    
         
            +
                  CODE = 1
         
     | 
| 
      
 7 
     | 
    
         
            +
                  MESSAGE = 2
         
     | 
| 
      
 8 
     | 
    
         
            +
             
     | 
| 
      
 9 
     | 
    
         
            +
                  FIELDS = {
         
     | 
| 
      
 10 
     | 
    
         
            +
                    CODE => {:type => ::Thrift::Types::I32, :name => 'code'},
         
     | 
| 
      
 11 
     | 
    
         
            +
                    MESSAGE => {:type => ::Thrift::Types::STRING, :name => 'message'}
         
     | 
| 
      
 12 
     | 
    
         
            +
                  }
         
     | 
| 
      
 13 
     | 
    
         
            +
             
     | 
| 
      
 14 
     | 
    
         
            +
                  def struct_fields; FIELDS; end
         
     | 
| 
      
 15 
     | 
    
         
            +
             
     | 
| 
      
 16 
     | 
    
         
            +
                  def validate
         
     | 
| 
      
 17 
     | 
    
         
            +
                  end
         
     | 
| 
      
 18 
     | 
    
         
            +
             
     | 
| 
      
 19 
     | 
    
         
            +
                  ::Thrift::Struct.generate_accessors self
         
     | 
| 
      
 20 
     | 
    
         
            +
                end
         
     | 
| 
      
 21 
     | 
    
         
            +
              end
         
     | 
| 
      
 22 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,60 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            module Sails
         
     | 
| 
      
 2 
     | 
    
         
            +
              module Service
         
     | 
| 
      
 3 
     | 
    
         
            +
                class Interface
         
     | 
| 
      
 4 
     | 
    
         
            +
                  attr_accessor :services
         
     | 
| 
      
 5 
     | 
    
         
            +
                  
         
     | 
| 
      
 6 
     | 
    
         
            +
                  def initialize
         
     | 
| 
      
 7 
     | 
    
         
            +
                    @services = []
         
     | 
| 
      
 8 
     | 
    
         
            +
                    Dir["#{Sails.root.join("app/services")}/*_service.rb"].each do |f|
         
     | 
| 
      
 9 
     | 
    
         
            +
                      if File.basename(f) =~ /^(.*)_service.rb$/
         
     | 
| 
      
 10 
     | 
    
         
            +
                        require f
         
     | 
| 
      
 11 
     | 
    
         
            +
                        mtd = $1.dup
         
     | 
| 
      
 12 
     | 
    
         
            +
                        klass_name = "#{mtd.camelize}Service"
         
     | 
| 
      
 13 
     | 
    
         
            +
                        @services << klass_name.constantize.new
         
     | 
| 
      
 14 
     | 
    
         
            +
                      end
         
     | 
| 
      
 15 
     | 
    
         
            +
                    end
         
     | 
| 
      
 16 
     | 
    
         
            +
                    define_service_methods!
         
     | 
| 
      
 17 
     | 
    
         
            +
                  end
         
     | 
| 
      
 18 
     | 
    
         
            +
             
     | 
| 
      
 19 
     | 
    
         
            +
                  private
         
     | 
| 
      
 20 
     | 
    
         
            +
                  def define_service_methods!
         
     | 
| 
      
 21 
     | 
    
         
            +
                    @services.each do |instance|
         
     | 
| 
      
 22 
     | 
    
         
            +
                      instance.action_methods.each do |method_name|
         
     | 
| 
      
 23 
     | 
    
         
            +
                        self.class.send(:define_method, method_name) do |*args, &block|
         
     | 
| 
      
 24 
     | 
    
         
            +
                          run_action(instance, method_name, *args, &block)
         
     | 
| 
      
 25 
     | 
    
         
            +
                        end
         
     | 
| 
      
 26 
     | 
    
         
            +
                      end
         
     | 
| 
      
 27 
     | 
    
         
            +
                    end
         
     | 
| 
      
 28 
     | 
    
         
            +
                  end
         
     | 
| 
      
 29 
     | 
    
         
            +
                  
         
     | 
| 
      
 30 
     | 
    
         
            +
                  def run_action(instance, method_name, *args, &block)
         
     | 
| 
      
 31 
     | 
    
         
            +
                    instance.run_callbacks :action do
         
     | 
| 
      
 32 
     | 
    
         
            +
                      time = Time.now.to_f
         
     | 
| 
      
 33 
     | 
    
         
            +
             
     | 
| 
      
 34 
     | 
    
         
            +
                      Sails.logger.info "\nProcessing by \"#{method_name}\" at #{Time.now.to_s}" unless Sails.env.test?
         
     | 
| 
      
 35 
     | 
    
         
            +
                      Sails.logger.info "  Parameters: { #{args.map(&:inspect).join(', ')} }" unless Sails.env.test?
         
     | 
| 
      
 36 
     | 
    
         
            +
             
     | 
| 
      
 37 
     | 
    
         
            +
                      begin
         
     | 
| 
      
 38 
     | 
    
         
            +
                        res = instance.send(method_name, *args, &block)
         
     | 
| 
      
 39 
     | 
    
         
            +
                        status = "Completed"
         
     | 
| 
      
 40 
     | 
    
         
            +
                        return res
         
     | 
| 
      
 41 
     | 
    
         
            +
                      rescue ActiveRecord::RecordNotFound => e
         
     | 
| 
      
 42 
     | 
    
         
            +
                        status = "Not Found"
         
     | 
| 
      
 43 
     | 
    
         
            +
                        instance.raise_error(404)
         
     | 
| 
      
 44 
     | 
    
         
            +
                      rescue Thrift::Exception => e
         
     | 
| 
      
 45 
     | 
    
         
            +
                        status = "Failed #{e.try(:code)}"
         
     | 
| 
      
 46 
     | 
    
         
            +
                        raise e
         
     | 
| 
      
 47 
     | 
    
         
            +
                      rescue => e
         
     | 
| 
      
 48 
     | 
    
         
            +
                        status = "Error 500"
         
     | 
| 
      
 49 
     | 
    
         
            +
                        Sails.logger.info "\"#{method_name}\" error : #{e.inspect}\n\n"
         
     | 
| 
      
 50 
     | 
    
         
            +
                        Sails.logger.info %Q(backtrace: #{e.backtrace.join("\n")}\n)
         
     | 
| 
      
 51 
     | 
    
         
            +
                        instance.raise_error(500)
         
     | 
| 
      
 52 
     | 
    
         
            +
                      ensure
         
     | 
| 
      
 53 
     | 
    
         
            +
                        elapsed = format('%.3f', (Time.now.to_f - time) * 1000)
         
     | 
| 
      
 54 
     | 
    
         
            +
                        Sails.logger.info "#{status} in (#{elapsed}ms).\n\n" unless Sails.env.test?
         
     | 
| 
      
 55 
     | 
    
         
            +
                      end
         
     | 
| 
      
 56 
     | 
    
         
            +
                    end
         
     | 
| 
      
 57 
     | 
    
         
            +
                  end
         
     | 
| 
      
 58 
     | 
    
         
            +
                end
         
     | 
| 
      
 59 
     | 
    
         
            +
              end
         
     | 
| 
      
 60 
     | 
    
         
            +
            end
         
     | 
    
        data/lib/sails/service.rb
    CHANGED
    
    | 
         @@ -1,77 +1,10 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            module Sails
         
     | 
| 
       2 
     | 
    
         
            -
               
     | 
| 
       3 
     | 
    
         
            -
                 
     | 
| 
       4 
     | 
    
         
            -
                 
     | 
| 
       5 
     | 
    
         
            -
             
     | 
| 
       6 
     | 
    
         
            -
                 
     | 
| 
       7 
     | 
    
         
            -
                 
     | 
| 
       8 
     | 
    
         
            -
             
     | 
| 
       9 
     | 
    
         
            -
                set_callback :action, :after do |object|
         
     | 
| 
       10 
     | 
    
         
            -
                  ActiveRecord::Base.clear_active_connections! if defined?(ActiveRecord::Base)
         
     | 
| 
       11 
     | 
    
         
            -
                end
         
     | 
| 
       12 
     | 
    
         
            -
             
     | 
| 
       13 
     | 
    
         
            -
                def method_missing(method_name, *args, &block)
         
     | 
| 
       14 
     | 
    
         
            -
                  run_callbacks :action do
         
     | 
| 
       15 
     | 
    
         
            -
                    time = Time.now.to_f
         
     | 
| 
       16 
     | 
    
         
            -
             
     | 
| 
       17 
     | 
    
         
            -
                    Sails.logger.info "\nProcessing by \"#{method_name}\" at #{Time.now.to_s}" unless Sails.env.test?
         
     | 
| 
       18 
     | 
    
         
            -
                    Sails.logger.info "  Parameters: { #{args.map(&:inspect).join(', ')} }" unless Sails.env.test?
         
     | 
| 
       19 
     | 
    
         
            -
             
     | 
| 
       20 
     | 
    
         
            -
                    begin
         
     | 
| 
       21 
     | 
    
         
            -
                      res = interface.send(method_name, *args, &block)
         
     | 
| 
       22 
     | 
    
         
            -
                      status = "Completed"
         
     | 
| 
       23 
     | 
    
         
            -
                      return res
         
     | 
| 
       24 
     | 
    
         
            -
                    rescue ActiveRecord::RecordNotFound => e
         
     | 
| 
       25 
     | 
    
         
            -
                      status = "Not Found"
         
     | 
| 
       26 
     | 
    
         
            -
                      interface.raise_error(-1004)
         
     | 
| 
       27 
     | 
    
         
            -
                    rescue ThriftServer::OperationFailed => e
         
     | 
| 
       28 
     | 
    
         
            -
                      status = "Failed #{e.code}"
         
     | 
| 
       29 
     | 
    
         
            -
                      raise e
         
     | 
| 
       30 
     | 
    
         
            -
                    rescue => e
         
     | 
| 
       31 
     | 
    
         
            -
                      status = "Error 500"
         
     | 
| 
       32 
     | 
    
         
            -
                      Sails.logger.info "\"#{method_name}\" error : #{e.inspect}\n\n"
         
     | 
| 
       33 
     | 
    
         
            -
                      Sails.logger.info %Q(backtrace: #{e.backtrace.join("\n")}\n)
         
     | 
| 
       34 
     | 
    
         
            -
                      interface.raise_error(-1000)
         
     | 
| 
       35 
     | 
    
         
            -
                    ensure
         
     | 
| 
       36 
     | 
    
         
            -
                      elapsed = format('%.3f', (Time.now.to_f - time) * 1000)
         
     | 
| 
       37 
     | 
    
         
            -
                      Sails.logger.info "#{status} in (#{elapsed}ms).\n\n" unless Sails.env.test?
         
     | 
| 
       38 
     | 
    
         
            -
                    end
         
     | 
| 
       39 
     | 
    
         
            -
                  end
         
     | 
| 
       40 
     | 
    
         
            -
                end
         
     | 
| 
       41 
     | 
    
         
            -
             
     | 
| 
       42 
     | 
    
         
            -
                def args
         
     | 
| 
       43 
     | 
    
         
            -
                  @args ||= []
         
     | 
| 
       44 
     | 
    
         
            -
                end
         
     | 
| 
       45 
     | 
    
         
            -
             
     | 
| 
       46 
     | 
    
         
            -
                def initialize(*array)
         
     | 
| 
       47 
     | 
    
         
            -
                  args.concat array
         
     | 
| 
       48 
     | 
    
         
            -
                end
         
     | 
| 
       49 
     | 
    
         
            -
             
     | 
| 
       50 
     | 
    
         
            -
                class Interface
         
     | 
| 
       51 
     | 
    
         
            -
                  Dir["#{Sails.root.join("app/services")}/*_service.rb"].each do |f|
         
     | 
| 
       52 
     | 
    
         
            -
                    next if 'base_service.rb' == File.basename(f)
         
     | 
| 
       53 
     | 
    
         
            -
                    if File.basename(f) =~ /^(.*)_service.rb$/
         
     | 
| 
       54 
     | 
    
         
            -
                      require f
         
     | 
| 
       55 
     | 
    
         
            -
                      mtd = $1.dup
         
     | 
| 
       56 
     | 
    
         
            -
                      klass_name = "#{mtd.camelize}Service"
         
     | 
| 
       57 
     | 
    
         
            -
                      include klass_name.constantize
         
     | 
| 
       58 
     | 
    
         
            -
                    end
         
     | 
| 
       59 
     | 
    
         
            -
                  end
         
     | 
| 
       60 
     | 
    
         
            -
             
     | 
| 
       61 
     | 
    
         
            -
                  def raise_error code, msg = nil
         
     | 
| 
       62 
     | 
    
         
            -
                    raise ThriftServer::OperationFailed.new(
         
     | 
| 
       63 
     | 
    
         
            -
                    code: code,
         
     | 
| 
       64 
     | 
    
         
            -
                    message: msg
         
     | 
| 
       65 
     | 
    
         
            -
                    )
         
     | 
| 
       66 
     | 
    
         
            -
                  end
         
     | 
| 
       67 
     | 
    
         
            -
             
     | 
| 
       68 
     | 
    
         
            -
                  def logger
         
     | 
| 
       69 
     | 
    
         
            -
                    Sails.logger
         
     | 
| 
       70 
     | 
    
         
            -
                  end
         
     | 
| 
       71 
     | 
    
         
            -
                end
         
     | 
| 
       72 
     | 
    
         
            -
             
     | 
| 
       73 
     | 
    
         
            -
                def interface
         
     | 
| 
       74 
     | 
    
         
            -
                  @interface ||= Interface.new
         
     | 
| 
       75 
     | 
    
         
            -
                end
         
     | 
| 
      
 2 
     | 
    
         
            +
              module Service
         
     | 
| 
      
 3 
     | 
    
         
            +
                extend ActiveSupport::Autoload
         
     | 
| 
      
 4 
     | 
    
         
            +
                
         
     | 
| 
      
 5 
     | 
    
         
            +
                autoload :Base
         
     | 
| 
      
 6 
     | 
    
         
            +
                autoload :Config
         
     | 
| 
      
 7 
     | 
    
         
            +
                autoload :Exception
         
     | 
| 
      
 8 
     | 
    
         
            +
                autoload :Interface
         
     | 
| 
       76 
9 
     | 
    
         
             
              end
         
     | 
| 
       77 
     | 
    
         
            -
            end
         
     | 
| 
      
 10 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -7,11 +7,6 @@ Dir.glob('lib/tasks/*.rake').each { |r| import r } 
     | 
|
| 
       7 
7 
     | 
    
         | 
| 
       8 
8 
     | 
    
         
             
            task :default => :test
         
     | 
| 
       9 
9 
     | 
    
         | 
| 
       10 
     | 
    
         
            -
            task :console do
         
     | 
| 
       11 
     | 
    
         
            -
              puts "Starting thrift-server console..."
         
     | 
| 
       12 
     | 
    
         
            -
              system "pry -I config/application.rb -r ./config/application.rb"
         
     | 
| 
       13 
     | 
    
         
            -
            end
         
     | 
| 
       14 
     | 
    
         
            -
             
     | 
| 
       15 
10 
     | 
    
         
             
            task :gen do
         
     | 
| 
       16 
11 
     | 
    
         
             
              puts "Generating thrift code..."
         
     | 
| 
       17 
12 
     | 
    
         
             
              system 'thrift \
         
     | 
| 
         @@ -1,6 +1,8 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
             
     | 
| 
       2 
     | 
    
         
            -
              extend ActiveSupport::Concern
         
     | 
| 
       3 
     | 
    
         
            -
              
         
     | 
| 
      
 1 
     | 
    
         
            +
            class ApplicationService < Sails::Service::Base
         
     | 
| 
       4 
2 
     | 
    
         
             
              # def require_user!(user_id, access_token)
         
     | 
| 
       5 
3 
     | 
    
         
             
              # end
         
     | 
| 
      
 4 
     | 
    
         
            +
              
         
     | 
| 
      
 5 
     | 
    
         
            +
              # def raise_error(code, msg = nil)
         
     | 
| 
      
 6 
     | 
    
         
            +
              #   raise YouCustomThriftException.new(code: code, message: msg)
         
     | 
| 
      
 7 
     | 
    
         
            +
              # end
         
     | 
| 
       6 
8 
     | 
    
         
             
            end
         
     | 
| 
         @@ -8,9 +8,15 @@ require "app/services/handler" 
     | 
|
| 
       8 
8 
     | 
    
         
             
            module Sails
         
     | 
| 
       9 
9 
     | 
    
         
             
              config.app_name = '<%= app_name %>'
         
     | 
| 
       10 
10 
     | 
    
         
             
              # Thrift Configs
         
     | 
| 
       11 
     | 
    
         
            -
              config. 
     | 
| 
       12 
     | 
    
         
            -
               
     | 
| 
       13 
     | 
    
         
            -
               
     | 
| 
      
 11 
     | 
    
         
            +
              config.port = 4000
         
     | 
| 
      
 12 
     | 
    
         
            +
              
         
     | 
| 
      
 13 
     | 
    
         
            +
              # Thrift protocol allows: :binary, :compact, default: :binary
         
     | 
| 
      
 14 
     | 
    
         
            +
              # config.protocol = :binary 
         
     | 
| 
      
 15 
     | 
    
         
            +
              
         
     | 
| 
      
 16 
     | 
    
         
            +
              # Number of threads, default: 20
         
     | 
| 
      
 17 
     | 
    
         
            +
              # config.thread_size = 20
         
     | 
| 
      
 18 
     | 
    
         
            +
              
         
     | 
| 
      
 19 
     | 
    
         
            +
              config.processor = Thrift::<%= app_name.capitalize %>::Processor
         
     | 
| 
       14 
20 
     | 
    
         | 
| 
       15 
21 
     | 
    
         
             
              # config.autoload_paths += %W(app/workers)
         
     | 
| 
       16 
22 
     | 
    
         | 
    
        data/lib/sails/version.rb
    CHANGED
    
    
    
        data/lib/sails.rb
    CHANGED
    
    | 
         @@ -1,7 +1,40 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            require  
     | 
| 
       2 
     | 
    
         
            -
            require  
     | 
| 
      
 1 
     | 
    
         
            +
            require 'rubygems'
         
     | 
| 
      
 2 
     | 
    
         
            +
            require 'bundler/setup'
         
     | 
| 
      
 3 
     | 
    
         
            +
            require 'active_support/all'
         
     | 
| 
      
 4 
     | 
    
         
            +
            require 'i18n'
         
     | 
| 
      
 5 
     | 
    
         
            +
            require 'thrift'
         
     | 
| 
      
 6 
     | 
    
         
            +
            require 'yaml'
         
     | 
| 
       3 
7 
     | 
    
         
             
            require "sails/rails"
         
     | 
| 
       4 
     | 
    
         
            -
            require "sails/ 
     | 
| 
       5 
     | 
    
         
            -
            require "sails/service"
         
     | 
| 
      
 8 
     | 
    
         
            +
            require "sails/base"
         
     | 
| 
       6 
9 
     | 
    
         | 
| 
       7 
     | 
    
         
            -
            Sails 
     | 
| 
      
 10 
     | 
    
         
            +
            # Sails 
         
     | 
| 
      
 11 
     | 
    
         
            +
            #
         
     | 
| 
      
 12 
     | 
    
         
            +
            # You can custom Sails configs in config/application.rb
         
     | 
| 
      
 13 
     | 
    
         
            +
            #
         
     | 
| 
      
 14 
     | 
    
         
            +
            #    module Sails
         
     | 
| 
      
 15 
     | 
    
         
            +
            #      config.app_name = 'you_app_name'
         
     | 
| 
      
 16 
     | 
    
         
            +
            #      config.thrift.port = 7075
         
     | 
| 
      
 17 
     | 
    
         
            +
            #      config.thrift.processor = Thrift::YouAppName::Processor
         
     | 
| 
      
 18 
     | 
    
         
            +
            #
         
     | 
| 
      
 19 
     | 
    
         
            +
            #      # Thrift Protocols can be use [:binary, :compact, :json]
         
     | 
| 
      
 20 
     | 
    
         
            +
            #      # http://jnb.ociweb.com/jnb/jnbJun2009.html#protocols
         
     | 
| 
      
 21 
     | 
    
         
            +
            #      config.thrift.procotol = :binary
         
     | 
| 
      
 22 
     | 
    
         
            +
            #    
         
     | 
| 
      
 23 
     | 
    
         
            +
            #      config.autoload_paths += %W(app/workers)
         
     | 
| 
      
 24 
     | 
    
         
            +
            #    
         
     | 
| 
      
 25 
     | 
    
         
            +
            #      config.i18n.default_locale = 'zh-CN'
         
     | 
| 
      
 26 
     | 
    
         
            +
            #    
         
     | 
| 
      
 27 
     | 
    
         
            +
            #      # cache store
         
     | 
| 
      
 28 
     | 
    
         
            +
            #      config.cache_store = [:dalli_store, '127.0.0.1' }]
         
     | 
| 
      
 29 
     | 
    
         
            +
            #    end
         
     | 
| 
      
 30 
     | 
    
         
            +
            #
         
     | 
| 
      
 31 
     | 
    
         
            +
            module Sails
         
     | 
| 
      
 32 
     | 
    
         
            +
              extend ActiveSupport::Autoload
         
     | 
| 
      
 33 
     | 
    
         
            +
              
         
     | 
| 
      
 34 
     | 
    
         
            +
              autoload :Config
         
     | 
| 
      
 35 
     | 
    
         
            +
              autoload :Version
         
     | 
| 
      
 36 
     | 
    
         
            +
              autoload :Service
         
     | 
| 
      
 37 
     | 
    
         
            +
              autoload :CLI
         
     | 
| 
      
 38 
     | 
    
         
            +
              autoload :Daemon
         
     | 
| 
      
 39 
     | 
    
         
            +
              autoload :Console
         
     | 
| 
      
 40 
     | 
    
         
            +
            end
         
     | 
    
        data/sails.gemspec
    CHANGED
    
    | 
         @@ -6,11 +6,11 @@ Gem::Specification.new do |s| 
     | 
|
| 
       6 
6 
     | 
    
         
             
              s.name        = "sails"
         
     | 
| 
       7 
7 
     | 
    
         
             
              s.version     = Sails.version
         
     | 
| 
       8 
8 
     | 
    
         
             
              s.platform    = Gem::Platform::RUBY
         
     | 
| 
       9 
     | 
    
         
            -
              s.authors     = ["Jason Lee"]
         
     | 
| 
       10 
     | 
    
         
            -
              s.email       = ["huacnlee@gmail.com"]
         
     | 
| 
      
 9 
     | 
    
         
            +
              s.authors     = ["Jason Lee", "P.S.V.R", "wxianfeng", "sapronlee","qhwa"]
         
     | 
| 
      
 10 
     | 
    
         
            +
              s.email       = ["huacnlee@gmail.com", "pmq2001@gmail.com", "wang.fl1429@gmail.com", "sapronlee@gmail.com","qhwa@163.com"]
         
     | 
| 
       11 
11 
     | 
    
         
             
              s.homepage    = "https://github.com/huacnlee/sails"
         
     | 
| 
       12 
     | 
    
         
            -
              s.summary     = %q{Sails, create Thrift Server 
     | 
| 
       13 
     | 
    
         
            -
              s.description = %q{Sails, create Thrift Server 
     | 
| 
      
 12 
     | 
    
         
            +
              s.summary     = %q{Sails, Help you to create Rails style Thrift Server}
         
     | 
| 
      
 13 
     | 
    
         
            +
              s.description = %q{Sails, Help you to create Rails style Thrift Server}
         
     | 
| 
       14 
14 
     | 
    
         
             
              s.files         = `git ls-files`.split("\n")
         
     | 
| 
       15 
15 
     | 
    
         
             
              s.test_files    = `git ls-files -- {test,spec,features}/*`.split("\n")
         
     | 
| 
       16 
16 
     | 
    
         
             
              s.executables   = ["sails"]
         
     | 
    
        data/spec/cli_spec.rb
    ADDED
    
    | 
         @@ -0,0 +1,44 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require 'spec_helper'
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            describe 'Sails::CLI' do
         
     | 
| 
      
 4 
     | 
    
         
            +
              let(:cli) { Sails::CLI.new }
         
     | 
| 
      
 5 
     | 
    
         
            +
              describe '.start' do
         
     | 
| 
      
 6 
     | 
    
         
            +
                it { expect(cli).to respond_to(:start) }
         
     | 
| 
      
 7 
     | 
    
         
            +
                it {
         
     | 
| 
      
 8 
     | 
    
         
            +
                  expect(Sails::Daemon).to receive(:init)
         
     | 
| 
      
 9 
     | 
    
         
            +
                  expect(Sails::Daemon).to receive(:start_process)
         
     | 
| 
      
 10 
     | 
    
         
            +
                  cli.start
         
     | 
| 
      
 11 
     | 
    
         
            +
                }
         
     | 
| 
      
 12 
     | 
    
         
            +
              end
         
     | 
| 
      
 13 
     | 
    
         
            +
              
         
     | 
| 
      
 14 
     | 
    
         
            +
              describe '.stop' do
         
     | 
| 
      
 15 
     | 
    
         
            +
                it { expect(cli).to respond_to(:stop) }
         
     | 
| 
      
 16 
     | 
    
         
            +
                it {
         
     | 
| 
      
 17 
     | 
    
         
            +
                  expect(Sails::Daemon).to receive(:init)
         
     | 
| 
      
 18 
     | 
    
         
            +
                  expect(Sails::Daemon).to receive(:stop_process)
         
     | 
| 
      
 19 
     | 
    
         
            +
                  cli.stop
         
     | 
| 
      
 20 
     | 
    
         
            +
                }
         
     | 
| 
      
 21 
     | 
    
         
            +
              end
         
     | 
| 
      
 22 
     | 
    
         
            +
              
         
     | 
| 
      
 23 
     | 
    
         
            +
              describe '.restart' do
         
     | 
| 
      
 24 
     | 
    
         
            +
                it { expect(cli).to respond_to(:restart) }
         
     | 
| 
      
 25 
     | 
    
         
            +
                it {
         
     | 
| 
      
 26 
     | 
    
         
            +
                  # expect(Sails::Daemon).to receive(:init)
         
     | 
| 
      
 27 
     | 
    
         
            +
                  expect(Sails::Daemon).to receive(:stop_process)
         
     | 
| 
      
 28 
     | 
    
         
            +
                  expect(Sails::Daemon).to receive(:start_process)
         
     | 
| 
      
 29 
     | 
    
         
            +
                  cli.restart
         
     | 
| 
      
 30 
     | 
    
         
            +
                }
         
     | 
| 
      
 31 
     | 
    
         
            +
              end
         
     | 
| 
      
 32 
     | 
    
         
            +
              
         
     | 
| 
      
 33 
     | 
    
         
            +
              describe '.new' do
         
     | 
| 
      
 34 
     | 
    
         
            +
                it { expect(cli).to respond_to(:new) }
         
     | 
| 
      
 35 
     | 
    
         
            +
              end
         
     | 
| 
      
 36 
     | 
    
         
            +
              
         
     | 
| 
      
 37 
     | 
    
         
            +
              describe '.console' do
         
     | 
| 
      
 38 
     | 
    
         
            +
                it { expect(cli).to respond_to(:console) }
         
     | 
| 
      
 39 
     | 
    
         
            +
              end
         
     | 
| 
      
 40 
     | 
    
         
            +
              
         
     | 
| 
      
 41 
     | 
    
         
            +
              describe '.version' do
         
     | 
| 
      
 42 
     | 
    
         
            +
                it { expect(cli).to respond_to(:version) }
         
     | 
| 
      
 43 
     | 
    
         
            +
              end
         
     | 
| 
      
 44 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -1 +1,28 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            # Logfile created on 2014-12-08 13:02:26 +0800 by logger.rb/44203
         
     | 
| 
      
 2 
     | 
    
         
            +
            Cache clear: flushing all keys
         
     | 
| 
      
 3 
     | 
    
         
            +
            Dalli::Server#connect 127.0.0.1:11211
         
     | 
| 
      
 4 
     | 
    
         
            +
            Cache clear: flushing all keys
         
     | 
| 
      
 5 
     | 
    
         
            +
            Cache clear: flushing all keys
         
     | 
| 
      
 6 
     | 
    
         
            +
            Cache clear: flushing all keys
         
     | 
| 
      
 7 
     | 
    
         
            +
            Cache clear: flushing all keys
         
     | 
| 
      
 8 
     | 
    
         
            +
            Cache clear: flushing all keys
         
     | 
| 
      
 9 
     | 
    
         
            +
            Cache clear: flushing all keys
         
     | 
| 
      
 10 
     | 
    
         
            +
            Cache clear: flushing all keys
         
     | 
| 
      
 11 
     | 
    
         
            +
            Cache clear: flushing all keys
         
     | 
| 
      
 12 
     | 
    
         
            +
            Cache clear: flushing all keys
         
     | 
| 
      
 13 
     | 
    
         
            +
            Cache clear: flushing all keys
         
     | 
| 
      
 14 
     | 
    
         
            +
            Cache clear: flushing all keys
         
     | 
| 
      
 15 
     | 
    
         
            +
            Cache clear: flushing all keys
         
     | 
| 
      
 16 
     | 
    
         
            +
            Cache clear: flushing all keys
         
     | 
| 
      
 17 
     | 
    
         
            +
            Cache clear: flushing all keys
         
     | 
| 
      
 18 
     | 
    
         
            +
            Cache clear: flushing all keys
         
     | 
| 
      
 19 
     | 
    
         
            +
            Cache clear: flushing all keys
         
     | 
| 
      
 20 
     | 
    
         
            +
            Cache clear: flushing all keys
         
     | 
| 
      
 21 
     | 
    
         
            +
            Cache clear: flushing all keys
         
     | 
| 
      
 22 
     | 
    
         
            +
            Cache clear: flushing all keys
         
     | 
| 
      
 23 
     | 
    
         
            +
            Cache clear: flushing all keys
         
     | 
| 
      
 24 
     | 
    
         
            +
            Cache clear: flushing all keys
         
     | 
| 
      
 25 
     | 
    
         
            +
            Cache clear: flushing all keys
         
     | 
| 
      
 26 
     | 
    
         
            +
            Cache clear: flushing all keys
         
     | 
| 
      
 27 
     | 
    
         
            +
            Cache clear: flushing all keys
         
     | 
| 
      
 28 
     | 
    
         
            +
            Cache clear: flushing all keys
         
     | 
    
        data/spec/rails_spec.rb
    ADDED
    
    
    
        data/spec/sails_spec.rb
    ADDED
    
    | 
         @@ -0,0 +1,70 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require "spec_helper"
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            describe 'Sails' do
         
     | 
| 
      
 4 
     | 
    
         
            +
              it { expect(Sails.version).not_to be_nil }
         
     | 
| 
      
 5 
     | 
    
         
            +
              
         
     | 
| 
      
 6 
     | 
    
         
            +
              describe '#root' do
         
     | 
| 
      
 7 
     | 
    
         
            +
                it 'should be a Pathname class' do
         
     | 
| 
      
 8 
     | 
    
         
            +
                  expect(Sails.root).to be_a(Pathname)
         
     | 
| 
      
 9 
     | 
    
         
            +
                end
         
     | 
| 
      
 10 
     | 
    
         
            +
                
         
     | 
| 
      
 11 
     | 
    
         
            +
                it 'should support Sails.root.join' do
         
     | 
| 
      
 12 
     | 
    
         
            +
                  expect(Sails.root.join("aaa").to_s).to eq File.join(Dir.pwd, "spec/dummy/aaa")
         
     | 
| 
      
 13 
     | 
    
         
            +
                end
         
     | 
| 
      
 14 
     | 
    
         
            +
                
         
     | 
| 
      
 15 
     | 
    
         
            +
                it 'should work' do
         
     | 
| 
      
 16 
     | 
    
         
            +
                  expect(Sails.root.to_s).to eq File.join(Dir.pwd, "spec/dummy")
         
     | 
| 
      
 17 
     | 
    
         
            +
                end
         
     | 
| 
      
 18 
     | 
    
         
            +
              end
         
     | 
| 
      
 19 
     | 
    
         
            +
              
         
     | 
| 
      
 20 
     | 
    
         
            +
              describe '#logger' do
         
     | 
| 
      
 21 
     | 
    
         
            +
                it 'should be a Logger class' do
         
     | 
| 
      
 22 
     | 
    
         
            +
                  expect(Sails.logger).to be_a(Logger)
         
     | 
| 
      
 23 
     | 
    
         
            +
                end
         
     | 
| 
      
 24 
     | 
    
         
            +
              end
         
     | 
| 
      
 25 
     | 
    
         
            +
              
         
     | 
| 
      
 26 
     | 
    
         
            +
              describe '#config' do
         
     | 
| 
      
 27 
     | 
    
         
            +
                it 'should work' do
         
     | 
| 
      
 28 
     | 
    
         
            +
                  expect(Sails.config).to be_a(Hash)
         
     | 
| 
      
 29 
     | 
    
         
            +
                  expect(Sails.config.autoload_paths).to be_a(Array)
         
     | 
| 
      
 30 
     | 
    
         
            +
                end
         
     | 
| 
      
 31 
     | 
    
         
            +
                
         
     | 
| 
      
 32 
     | 
    
         
            +
                describe 'Real config' do
         
     | 
| 
      
 33 
     | 
    
         
            +
                  it { expect(Sails.config.app_name).to eq 'hello' }
         
     | 
| 
      
 34 
     | 
    
         
            +
                  it { expect(Sails.config.host).to eq '1.1.1.1' }
         
     | 
| 
      
 35 
     | 
    
         
            +
                  it { expect(Sails.config.port).to eq 1000 }
         
     | 
| 
      
 36 
     | 
    
         
            +
                  it { expect(Sails.config.protocol).to eq :binary }
         
     | 
| 
      
 37 
     | 
    
         
            +
                  it { expect(Sails.config.thread_size).to eq 20 }
         
     | 
| 
      
 38 
     | 
    
         
            +
                  it { expect(Sails.config.i18n.default_locale).to eq :'zh-TW' }
         
     | 
| 
      
 39 
     | 
    
         
            +
                  it { expect(Sails.config.autoload_paths).to include("app/bar") }
         
     | 
| 
      
 40 
     | 
    
         
            +
                end
         
     | 
| 
      
 41 
     | 
    
         
            +
              end
         
     | 
| 
      
 42 
     | 
    
         
            +
              
         
     | 
| 
      
 43 
     | 
    
         
            +
              describe '#cache' do
         
     | 
| 
      
 44 
     | 
    
         
            +
                it { expect(Sails.cache).to be_a(ActiveSupport::Cache::DalliStore) }
         
     | 
| 
      
 45 
     | 
    
         
            +
                it { expect(Sails.cache).to respond_to(:read, :write, :delete, :clear) }
         
     | 
| 
      
 46 
     | 
    
         
            +
              end
         
     | 
| 
      
 47 
     | 
    
         
            +
              
         
     | 
| 
      
 48 
     | 
    
         
            +
              describe '#thrift_protocol_class' do
         
     | 
| 
      
 49 
     | 
    
         
            +
                it 'should work' do
         
     | 
| 
      
 50 
     | 
    
         
            +
                  allow(Sails.config).to receive(:protocol).and_return(:binary)
         
     | 
| 
      
 51 
     | 
    
         
            +
                  expect(Sails.thrift_protocol_class).to eq ::Thrift::BinaryProtocolFactory
         
     | 
| 
      
 52 
     | 
    
         
            +
                  allow(Sails.config).to receive(:protocol).and_return(:compact)
         
     | 
| 
      
 53 
     | 
    
         
            +
                  expect(Sails.thrift_protocol_class).to eq ::Thrift::CompactProtocolFactory
         
     | 
| 
      
 54 
     | 
    
         
            +
                  allow(Sails.config).to receive(:protocol).and_return(:json)
         
     | 
| 
      
 55 
     | 
    
         
            +
                  expect(Sails.thrift_protocol_class).to eq ::Thrift::JsonProtocolFactory
         
     | 
| 
      
 56 
     | 
    
         
            +
                  allow(Sails.config).to receive(:protocol).and_return(:xxx)
         
     | 
| 
      
 57 
     | 
    
         
            +
                  expect(Sails.thrift_protocol_class).to eq ::Thrift::BinaryProtocolFactory
         
     | 
| 
      
 58 
     | 
    
         
            +
                end
         
     | 
| 
      
 59 
     | 
    
         
            +
              end
         
     | 
| 
      
 60 
     | 
    
         
            +
              
         
     | 
| 
      
 61 
     | 
    
         
            +
              describe '#reload!' do
         
     | 
| 
      
 62 
     | 
    
         
            +
                it 'should work' do
         
     | 
| 
      
 63 
     | 
    
         
            +
                  s1 = Sails.service
         
     | 
| 
      
 64 
     | 
    
         
            +
                  Sails.reload!
         
     | 
| 
      
 65 
     | 
    
         
            +
                  expect(Sails.service).not_to eq s1
         
     | 
| 
      
 66 
     | 
    
         
            +
                  # TODO: test reload autoload_paths
         
     | 
| 
      
 67 
     | 
    
         
            +
                end
         
     | 
| 
      
 68 
     | 
    
         
            +
              end
         
     | 
| 
      
 69 
     | 
    
         
            +
              
         
     | 
| 
      
 70 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,38 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require "spec_helper"
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            describe 'Service' do
         
     | 
| 
      
 4 
     | 
    
         
            +
              class SimpleService < Sails::Service::Base
         
     | 
| 
      
 5 
     | 
    
         
            +
                def foo
         
     | 
| 
      
 6 
     | 
    
         
            +
                end
         
     | 
| 
      
 7 
     | 
    
         
            +
                
         
     | 
| 
      
 8 
     | 
    
         
            +
                def bar
         
     | 
| 
      
 9 
     | 
    
         
            +
                end
         
     | 
| 
      
 10 
     | 
    
         
            +
                
         
     | 
| 
      
 11 
     | 
    
         
            +
                private
         
     | 
| 
      
 12 
     | 
    
         
            +
                def dar
         
     | 
| 
      
 13 
     | 
    
         
            +
                end
         
     | 
| 
      
 14 
     | 
    
         
            +
              end
         
     | 
| 
      
 15 
     | 
    
         
            +
              
         
     | 
| 
      
 16 
     | 
    
         
            +
              let(:simple) { SimpleService.new }
         
     | 
| 
      
 17 
     | 
    
         
            +
              
         
     | 
| 
      
 18 
     | 
    
         
            +
              describe '.raise_error' do
         
     | 
| 
      
 19 
     | 
    
         
            +
                it { expect(simple).to respond_to(:raise_error) }
         
     | 
| 
      
 20 
     | 
    
         
            +
                it {
         
     | 
| 
      
 21 
     | 
    
         
            +
                  expect { simple.raise_error(11,'foo') }.to raise_error do |error|
         
     | 
| 
      
 22 
     | 
    
         
            +
                    expect(error).to be_a(Sails::Service::Exception)
         
     | 
| 
      
 23 
     | 
    
         
            +
                    expect(error.code).to eq 11
         
     | 
| 
      
 24 
     | 
    
         
            +
                    expect(error.message).to eq 'foo'
         
     | 
| 
      
 25 
     | 
    
         
            +
                  end
         
     | 
| 
      
 26 
     | 
    
         
            +
                }
         
     | 
| 
      
 27 
     | 
    
         
            +
              end
         
     | 
| 
      
 28 
     | 
    
         
            +
              
         
     | 
| 
      
 29 
     | 
    
         
            +
              describe '.action_methods' do
         
     | 
| 
      
 30 
     | 
    
         
            +
                it { expect(simple.action_methods).to include("foo", "bar") }
         
     | 
| 
      
 31 
     | 
    
         
            +
                it { expect(simple.action_methods.size).to eq 2 }
         
     | 
| 
      
 32 
     | 
    
         
            +
                it { expect(simple.action_methods).not_to include("dar") }
         
     | 
| 
      
 33 
     | 
    
         
            +
              end
         
     | 
| 
      
 34 
     | 
    
         
            +
              
         
     | 
| 
      
 35 
     | 
    
         
            +
              describe '.logger' do
         
     | 
| 
      
 36 
     | 
    
         
            +
                it { expect(simple.logger).to eq Sails.logger }
         
     | 
| 
      
 37 
     | 
    
         
            +
              end
         
     | 
| 
      
 38 
     | 
    
         
            +
            end
         
     | 
    
        data/spec/spec_helper.rb
    CHANGED
    
    | 
         @@ -1,4 +1,26 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            require_relative "../lib/sails"
         
     | 
| 
       2 
2 
     | 
    
         | 
| 
       3 
3 
     | 
    
         
             
            # Force set Sails root to spec/dummy
         
     | 
| 
       4 
     | 
    
         
            -
            Sails.root = File.expand_path("../dummy", __FILE__)
         
     | 
| 
      
 4 
     | 
    
         
            +
            Sails.root = File.expand_path("../dummy", __FILE__)
         
     | 
| 
      
 5 
     | 
    
         
            +
            $LOAD_PATH.unshift Sails.root
         
     | 
| 
      
 6 
     | 
    
         
            +
             
     | 
| 
      
 7 
     | 
    
         
            +
            # for test Sails config
         
     | 
| 
      
 8 
     | 
    
         
            +
            module Sails
         
     | 
| 
      
 9 
     | 
    
         
            +
              config.app_name = 'hello'
         
     | 
| 
      
 10 
     | 
    
         
            +
              config.host = '1.1.1.1'
         
     | 
| 
      
 11 
     | 
    
         
            +
              config.port = 1000
         
     | 
| 
      
 12 
     | 
    
         
            +
              config.i18n.default_locale = 'zh-TW'
         
     | 
| 
      
 13 
     | 
    
         
            +
              config.autoload_paths += %W(app/bar)
         
     | 
| 
      
 14 
     | 
    
         
            +
              config.cache_store = [:dalli_store, '127.0.0.1']
         
     | 
| 
      
 15 
     | 
    
         
            +
            end
         
     | 
| 
      
 16 
     | 
    
         
            +
             
     | 
| 
      
 17 
     | 
    
         
            +
            RSpec.configure do |config|
         
     | 
| 
      
 18 
     | 
    
         
            +
             
     | 
| 
      
 19 
     | 
    
         
            +
              config.before(:each) do
         
     | 
| 
      
 20 
     | 
    
         
            +
              end
         
     | 
| 
      
 21 
     | 
    
         
            +
             
     | 
| 
      
 22 
     | 
    
         
            +
              config.after(:each) do
         
     | 
| 
      
 23 
     | 
    
         
            +
              end
         
     | 
| 
      
 24 
     | 
    
         
            +
             
     | 
| 
      
 25 
     | 
    
         
            +
              config.raise_errors_for_deprecations!
         
     | 
| 
      
 26 
     | 
    
         
            +
            end
         
     |