stomping_ground-celluloid 0.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.
@@ -0,0 +1,6 @@
1
+ require 'json'
2
+ require 'celluloid/io'
3
+ require 'fileutils'
4
+
5
+ require 'stomping_ground/server'
6
+ require 'stomping_ground/connection'
@@ -0,0 +1,114 @@
1
+ module StompingGround
2
+ class Connection
3
+ attr_accessor :server, :socket, :frame, :frame_info
4
+
5
+ def initialize(server, socket)
6
+ @server = server
7
+ @socket = socket
8
+ end
9
+
10
+ def handle
11
+ loop do
12
+ break if @socket.closed?
13
+
14
+ data = @socket.readpartial 4096
15
+
16
+ append_data(data)
17
+
18
+ each_frame do |frame|
19
+ @frame = frame
20
+ @frame_info = parse(frame)
21
+ case frame_info[:command]
22
+ when "CONNECT"
23
+ connect_frame
24
+ when "SUBSCRIBE"
25
+ subscribe_frame
26
+ when "DISCONNECT"
27
+ disconnect_frame
28
+ when "SEND"
29
+ send_frame
30
+ end
31
+ end
32
+ end
33
+ rescue EOFError
34
+ @socket.close
35
+ end
36
+
37
+ def connect_frame
38
+ write "CONNECTED\n"
39
+ write "version:1.1\n"
40
+ write "heart-beat:0,0\n" if frame_info[:'heart-beat']
41
+ write "\n"
42
+ write "\0"
43
+ end
44
+
45
+ def subscribe_frame
46
+ if @server.queue_name.nil? || frame_info[:destination] == @server.queue_name
47
+ message = @server.message_body || "hello"
48
+ write "MESSAGE\n"
49
+ write "subscription:#{frame_info[:id]}\n"
50
+ write "message-id:007\n"
51
+ write "destination:#{frame_info[:destination]}\n"
52
+ write "content-type:text/plain\n"
53
+ write "content-length:#{message.length}\n"
54
+ write "\n"
55
+ write "#{message}\0"
56
+ end
57
+ end
58
+
59
+ def disconnect_frame
60
+ if frame_info[:'receipt-id']
61
+ write "RECEIPT\n"
62
+ write "receipt-id:#{frame_info[:'receipt-id']}\n"
63
+ write "\0"
64
+ end
65
+ @socket.close
66
+ end
67
+
68
+ def send_frame
69
+ filename = sent_message_filename_for(frame)
70
+ if filename
71
+ dirname = File.dirname(filename)
72
+ FileUtils.mkdir_p(dirname) if !File.exists?(dirname)
73
+ File.open(filename, "w") { |file| file.write(frame) }
74
+ end
75
+ end
76
+
77
+ def write(data)
78
+ @socket.write data
79
+ end
80
+
81
+ private
82
+
83
+ def sent_message_filename_for(frame)
84
+ return nil unless @server.sent_message_dir
85
+ md5 = OpenSSL::Digest::MD5.new(frame)
86
+ "#{@server.sent_message_dir}/#{md5}.msg"
87
+ end
88
+
89
+ def parse(frame)
90
+ frame_info = {}
91
+ data_array = frame.split("\n").reject { |line| line =~ /^\s+$/ }
92
+ frame_info[:command] = data_array.shift
93
+ data_array.each do |info|
94
+ if info.include?(':')
95
+ frame_info[info.split(':')[0].to_sym] = info.split(':')[1]
96
+ end
97
+ end
98
+ frame_info
99
+ end
100
+
101
+ def append_data data
102
+ (@data ||= '') << data
103
+ end
104
+
105
+ def each_frame(&block)
106
+ while eoframe = @data.index("\0")
107
+ block.call(@data.slice!(0, eoframe + 1))
108
+ end
109
+ end
110
+
111
+ end
112
+
113
+ end
114
+
@@ -0,0 +1,39 @@
1
+ module StompingGround
2
+ class Server
3
+ include Celluloid::IO
4
+
5
+ attr_accessor :message_body
6
+ attr_accessor :queue_name
7
+ attr_accessor :sent_message_dir
8
+
9
+ def initialize(host, port, options = {})
10
+ @host = host
11
+ @port = port
12
+
13
+ @message_body = options[:message]
14
+ @queue_name = options[:queue_name]
15
+ @sent_message_dir = options[:sent_message_dir]
16
+
17
+ @server = TCPServer.new(@host, @port)
18
+
19
+ async.run
20
+ end
21
+
22
+ def self.start(*opts)
23
+ supervise(*opts)
24
+ end
25
+
26
+ def run
27
+ loop { async.handle_connection @server.accept }
28
+ end
29
+
30
+ def handle_connection(socket)
31
+ Connection.new(self, socket).handle
32
+ end
33
+
34
+ def finalize
35
+ @server.close if @server
36
+ end
37
+
38
+ end
39
+ end
@@ -0,0 +1,5 @@
1
+ module StompingGround
2
+ MAJOR=0
3
+ MINOR=1
4
+ VERSION="#{MAJOR}.#{MINOR}"
5
+ end
metadata ADDED
@@ -0,0 +1,150 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: stomping_ground-celluloid
3
+ version: !ruby/object:Gem::Version
4
+ version: '0.1'
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Francisco Trindade
9
+ - Geoffrey Giesemann
10
+ - Emilien Taque
11
+ autorequire:
12
+ bindir: bin
13
+ cert_chain: []
14
+ date: 2013-01-03 00:00:00.000000000 Z
15
+ dependencies:
16
+ - !ruby/object:Gem::Dependency
17
+ name: onstomp
18
+ requirement: !ruby/object:Gem::Requirement
19
+ none: false
20
+ requirements:
21
+ - - ! '>='
22
+ - !ruby/object:Gem::Version
23
+ version: '0'
24
+ type: :development
25
+ prerelease: false
26
+ version_requirements: !ruby/object:Gem::Requirement
27
+ none: false
28
+ requirements:
29
+ - - ! '>='
30
+ - !ruby/object:Gem::Version
31
+ version: '0'
32
+ - !ruby/object:Gem::Dependency
33
+ name: rspec
34
+ requirement: !ruby/object:Gem::Requirement
35
+ none: false
36
+ requirements:
37
+ - - ! '>='
38
+ - !ruby/object:Gem::Version
39
+ version: '0'
40
+ type: :development
41
+ prerelease: false
42
+ version_requirements: !ruby/object:Gem::Requirement
43
+ none: false
44
+ requirements:
45
+ - - ! '>='
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ - !ruby/object:Gem::Dependency
49
+ name: json
50
+ requirement: !ruby/object:Gem::Requirement
51
+ none: false
52
+ requirements:
53
+ - - ! '>='
54
+ - !ruby/object:Gem::Version
55
+ version: '0'
56
+ type: :development
57
+ prerelease: false
58
+ version_requirements: !ruby/object:Gem::Requirement
59
+ none: false
60
+ requirements:
61
+ - - ! '>='
62
+ - !ruby/object:Gem::Version
63
+ version: '0'
64
+ - !ruby/object:Gem::Dependency
65
+ name: rake
66
+ requirement: !ruby/object:Gem::Requirement
67
+ none: false
68
+ requirements:
69
+ - - ! '>='
70
+ - !ruby/object:Gem::Version
71
+ version: '0'
72
+ type: :development
73
+ prerelease: false
74
+ version_requirements: !ruby/object:Gem::Requirement
75
+ none: false
76
+ requirements:
77
+ - - ! '>='
78
+ - !ruby/object:Gem::Version
79
+ version: '0'
80
+ - !ruby/object:Gem::Dependency
81
+ name: pry
82
+ requirement: !ruby/object:Gem::Requirement
83
+ none: false
84
+ requirements:
85
+ - - ! '>='
86
+ - !ruby/object:Gem::Version
87
+ version: '0'
88
+ type: :development
89
+ prerelease: false
90
+ version_requirements: !ruby/object:Gem::Requirement
91
+ none: false
92
+ requirements:
93
+ - - ! '>='
94
+ - !ruby/object:Gem::Version
95
+ version: '0'
96
+ - !ruby/object:Gem::Dependency
97
+ name: celluloid-io
98
+ requirement: !ruby/object:Gem::Requirement
99
+ none: false
100
+ requirements:
101
+ - - ! '>='
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :runtime
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ none: false
108
+ requirements:
109
+ - - ! '>='
110
+ - !ruby/object:Gem::Version
111
+ version: '0'
112
+ description:
113
+ email:
114
+ - francisco.trindade@rea-group.com
115
+ - geoffrey.giesemann@rea-group.com
116
+ - e.taque@alphalink.fr
117
+ executables: []
118
+ extensions: []
119
+ extra_rdoc_files: []
120
+ files:
121
+ - lib/stomping_ground/connection.rb
122
+ - lib/stomping_ground/server.rb
123
+ - lib/stomping_ground/version.rb
124
+ - lib/stomping_ground.rb
125
+ homepage: http://github.com/etaque/stomping_ground
126
+ licenses: []
127
+ post_install_message:
128
+ rdoc_options: []
129
+ require_paths:
130
+ - lib
131
+ required_ruby_version: !ruby/object:Gem::Requirement
132
+ none: false
133
+ requirements:
134
+ - - ! '>='
135
+ - !ruby/object:Gem::Version
136
+ version: '0'
137
+ required_rubygems_version: !ruby/object:Gem::Requirement
138
+ none: false
139
+ requirements:
140
+ - - ! '>='
141
+ - !ruby/object:Gem::Version
142
+ version: '0'
143
+ requirements: []
144
+ rubyforge_project:
145
+ rubygems_version: 1.8.24
146
+ signing_key:
147
+ specification_version: 3
148
+ summary: Mock Stomp server to be used when testing stomp consumers, Celluloid::IO
149
+ version.
150
+ test_files: []