Class: RackDirect::Service

Inherits:
Object
  • Object
show all
Defined in:
lib/rack_direct/service.rb

Constant Summary collapse

@@services =
{}

Class Attribute Summary collapse

Class Method Summary collapse

Class Attribute Details

.verbose_loggingObject

Returns the value of attribute verbose_logging.



13
14
15
# File 'lib/rack_direct/service.rb', line 13

def verbose_logging
  @verbose_logging
end

Class Method Details

.log(name, msg) ⇒ Object



16
17
18
19
20
21
# File 'lib/rack_direct/service.rb', line 16

def self.log name, msg
  if self.verbose_logging
    msg = msg.gsub(/^/, "#{name}> ")
    puts msg
  end
end

.send_request(name, rack_request_env) ⇒ Object



47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
# File 'lib/rack_direct/service.rb', line 47

def self.send_request name, rack_request_env

  if @@services[name]

    rack_request_env["direct_request.unique_id"] = Guid.new.to_s

    @@services[name].puts rack_request_env.to_json
    @@services[name].puts ""

    response = ""
    in_response = false
    while true
      line = @@services[name].gets
      if line.strip == "BEGIN #{rack_request_env["direct_request.unique_id"]}"
        in_response = true
        next
      elsif line.strip == "END #{rack_request_env["direct_request.unique_id"]}"
        break
      elsif in_response
        response += line
      else
        self.log name, "#{line.strip}"
      end
    end
    # self.log name, "Final response: #{response}"
    response
  end

end

.start(path, options = {}) ⇒ Object



24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# File 'lib/rack_direct/service.rb', line 24

def self.start path, options = {}

  name = options[:name] || File.split(path).last

  unless @@services[name]

    tmppath = generate_rackup_file name, options[:env]

    # TODO: check path to make sure a Rails app exists there
    self.log name, "starting service via rack_direct..."
    cmd = "cd #{path} && rake db:test:prepare && rackup --server #{RACK_DIRECT_ALIAS} #{tmppath} 2>&1"
    self.log name, cmd
    @@services[name] = IO.popen cmd, "w+"
    self.log name, "service started"

    at_exit do
      RackDirect::Service.stop name
      File.unlink tmppath
    end
  end
  "rack-direct://#{name}"
end

.stop(name) ⇒ Object



77
78
79
80
81
82
83
84
85
86
# File 'lib/rack_direct/service.rb', line 77

def self.stop name
  if @@services[name]
    self.log name, "stopping service..."
    @@services[name].puts "EXIT"
    @@services[name].puts ""
    @@services[name] = nil
    Process.waitall
    self.log name, "service stopped."
  end
end