krakow 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.md +2 -0
- data/Gemfile +3 -0
- data/Gemfile.lock +28 -0
- data/README.md +36 -0
- data/krakow.gemspec +16 -0
- data/lib/krakow/command/cls.rb +15 -0
- data/lib/krakow/command/fin.rb +16 -0
- data/lib/krakow/command/identify.rb +24 -0
- data/lib/krakow/command/mpub.rb +19 -0
- data/lib/krakow/command/nop.rb +15 -0
- data/lib/krakow/command/pub.rb +17 -0
- data/lib/krakow/command/rdy.rb +16 -0
- data/lib/krakow/command/req.rb +16 -0
- data/lib/krakow/command/sub.rb +16 -0
- data/lib/krakow/command/touch.rb +16 -0
- data/lib/krakow/command.rb +25 -0
- data/lib/krakow/connection.rb +89 -0
- data/lib/krakow/consumer.rb +101 -0
- data/lib/krakow/discovery.rb +41 -0
- data/lib/krakow/exceptions.rb +9 -0
- data/lib/krakow/frame_type/error.rb +12 -0
- data/lib/krakow/frame_type/message.rb +12 -0
- data/lib/krakow/frame_type/response.rb +12 -0
- data/lib/krakow/frame_type.rb +50 -0
- data/lib/krakow/producer.rb +61 -0
- data/lib/krakow/utils/lazy.rb +52 -0
- data/lib/krakow/utils.rb +5 -0
- data/lib/krakow/version.rb +7 -0
- data/lib/krakow.rb +15 -0
- metadata +122 -0
data/CHANGELOG.md
ADDED
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
krakow (0.1.0)
|
5
|
+
celluloid-io
|
6
|
+
http
|
7
|
+
multi_json
|
8
|
+
|
9
|
+
GEM
|
10
|
+
remote: https://rubygems.org/
|
11
|
+
specs:
|
12
|
+
celluloid (0.15.2)
|
13
|
+
timers (~> 1.1.0)
|
14
|
+
celluloid-io (0.15.0)
|
15
|
+
celluloid (>= 0.15.0)
|
16
|
+
nio4r (>= 0.5.0)
|
17
|
+
http (0.5.0)
|
18
|
+
http_parser.rb
|
19
|
+
http_parser.rb (0.6.0)
|
20
|
+
multi_json (1.8.4)
|
21
|
+
nio4r (0.5.0)
|
22
|
+
timers (1.1.0)
|
23
|
+
|
24
|
+
PLATFORMS
|
25
|
+
ruby
|
26
|
+
|
27
|
+
DEPENDENCIES
|
28
|
+
krakow!
|
data/README.md
ADDED
@@ -0,0 +1,36 @@
|
|
1
|
+
# Krakow
|
2
|
+
|
3
|
+
"KRAKOW! KRAKOW! Two direct hits!"
|
4
|
+
|
5
|
+
## Spiff
|
6
|
+
|
7
|
+
```ruby
|
8
|
+
require 'krakow'
|
9
|
+
|
10
|
+
producer = Krakow::Producer(
|
11
|
+
:host => 'HOST',
|
12
|
+
:port => 'PORT',
|
13
|
+
:topic => 'target'
|
14
|
+
)
|
15
|
+
producer.write('direct hit!')
|
16
|
+
```
|
17
|
+
|
18
|
+
## Zargons
|
19
|
+
|
20
|
+
```ruby
|
21
|
+
require 'krakow'
|
22
|
+
|
23
|
+
consumer = Krakow::Consumer(
|
24
|
+
:nsqlookupd => 'http://HOST:PORT',
|
25
|
+
:topic => 'target',
|
26
|
+
:channel => 'ship'
|
27
|
+
)
|
28
|
+
|
29
|
+
message = consumer.queue.pop
|
30
|
+
# do stuff
|
31
|
+
consumer.confirm(message.message_id)
|
32
|
+
```
|
33
|
+
|
34
|
+
# Info
|
35
|
+
* Repo: https://github.com/chrisroberts/krakow
|
36
|
+
* IRC: Freenode @ spox
|
data/krakow.gemspec
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
$LOAD_PATH.unshift File.expand_path(File.dirname(__FILE__)) + '/lib/'
|
2
|
+
require 'krakow/version'
|
3
|
+
Gem::Specification.new do |s|
|
4
|
+
s.name = 'krakow'
|
5
|
+
s.version = Krakow::VERSION.version
|
6
|
+
s.summary = 'NSQ library'
|
7
|
+
s.author = 'Chris Roberts'
|
8
|
+
s.email = 'code@chrisroberts.org'
|
9
|
+
s.homepage = 'http://github.com/chrisroberts/krakow'
|
10
|
+
s.description = 'NSQ ruby library'
|
11
|
+
s.require_path = 'lib'
|
12
|
+
s.add_dependency 'celluloid-io'
|
13
|
+
s.add_dependency 'http'
|
14
|
+
s.add_dependency 'multi_json'
|
15
|
+
s.files = Dir['**/*']
|
16
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'multi_json'
|
2
|
+
|
3
|
+
module Krakow
|
4
|
+
class Command
|
5
|
+
class Identify < Command
|
6
|
+
|
7
|
+
def initialize(args={})
|
8
|
+
super
|
9
|
+
required! :short_id, :long_id
|
10
|
+
optional(
|
11
|
+
:feature_negotiation, :heartbeat_interval, :output_buffer_size,
|
12
|
+
:output_buffer_timeout, :tls_v1, :snappy, :deflate, :deflate_level,
|
13
|
+
:sample_rate
|
14
|
+
)
|
15
|
+
end
|
16
|
+
|
17
|
+
def to_line
|
18
|
+
payload = MultiJson.dump(arguments)
|
19
|
+
[name, "\n", payload.length, payload].pack('a*a*l>a*')
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module Krakow
|
2
|
+
class Command
|
3
|
+
class Mpub < Command
|
4
|
+
|
5
|
+
def initialize(args={})
|
6
|
+
super
|
7
|
+
required! :topic_name, :messages
|
8
|
+
end
|
9
|
+
|
10
|
+
def to_line
|
11
|
+
formatted_messages = messages.map do |message|
|
12
|
+
[message.length, message].pack('l>a*')
|
13
|
+
end.join
|
14
|
+
[name, ' ', topic_name, "\n", formatted_messages.length, messages.size, formatted_messages].pack('a*a*a*a*l>l>a*')
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
|
2
|
+
module Krakow
|
3
|
+
class Command
|
4
|
+
class Pub < Command
|
5
|
+
|
6
|
+
def initialize(args={})
|
7
|
+
super
|
8
|
+
required! :topic_name, :message
|
9
|
+
end
|
10
|
+
|
11
|
+
def to_line
|
12
|
+
[name, ' ', topic_name, "\n", message.length, message].pack('a*a*a*a*l>a*')
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module Krakow
|
2
|
+
class Command
|
3
|
+
|
4
|
+
include Utils::Lazy
|
5
|
+
|
6
|
+
# Return command name
|
7
|
+
def name
|
8
|
+
self.class.name.split('::').last.upcase
|
9
|
+
end
|
10
|
+
|
11
|
+
# Convert to line output
|
12
|
+
def to_line
|
13
|
+
raise NoMethodError.new 'No line conversion method defined!'
|
14
|
+
end
|
15
|
+
|
16
|
+
# Make all the commands available
|
17
|
+
Dir.glob(File.join(File.dirname(__FILE__), 'command', '*')).each do |path|
|
18
|
+
autoload(
|
19
|
+
File.basename(path).sub(File.extname(path), '').capitalize.to_sym,
|
20
|
+
File.join('krakow/command', File.basename(path).sub(File.extname(path), ''))
|
21
|
+
)
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,89 @@
|
|
1
|
+
require 'celluloid/io'
|
2
|
+
require 'celluloid/autostart'
|
3
|
+
|
4
|
+
module Krakow
|
5
|
+
class Connection
|
6
|
+
|
7
|
+
include Utils::Lazy
|
8
|
+
include Celluloid::IO
|
9
|
+
|
10
|
+
finalizer :goodbye_my_love!
|
11
|
+
|
12
|
+
attr_reader :socket
|
13
|
+
|
14
|
+
def initialize(args={})
|
15
|
+
super
|
16
|
+
required! :host, :port
|
17
|
+
optional :version, :queue, :callback
|
18
|
+
arguments[:queue] ||= Queue.new
|
19
|
+
arguments[:version] ||= 'v2'
|
20
|
+
@socket = TCPSocket.new(host, port)
|
21
|
+
end
|
22
|
+
|
23
|
+
# Initialize the connection
|
24
|
+
def init!
|
25
|
+
socket.write version.rjust(4).upcase
|
26
|
+
async.process_to_queue!
|
27
|
+
end
|
28
|
+
|
29
|
+
# message:: Command instance to send
|
30
|
+
# Send the message
|
31
|
+
def transmit(message)
|
32
|
+
socket.write message.to_line
|
33
|
+
end
|
34
|
+
|
35
|
+
# Cleanup prior to destruction
|
36
|
+
def goodbye_my_love!
|
37
|
+
if(socket && !socket.closed?)
|
38
|
+
socket.write Command::Cls.new.to_line
|
39
|
+
socket.close
|
40
|
+
end
|
41
|
+
@socket = nil
|
42
|
+
end
|
43
|
+
|
44
|
+
# Receive message and return proper FrameType instance
|
45
|
+
def receive
|
46
|
+
buf = socket.read(8)
|
47
|
+
if(buf)
|
48
|
+
@receiving = true
|
49
|
+
struct = FrameType.decode(buf)
|
50
|
+
struct[:data] = socket.read(struct[:size])
|
51
|
+
@receiving = false
|
52
|
+
FrameType.build(struct)
|
53
|
+
else
|
54
|
+
nil
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
# Currently in the process of receiving a message
|
59
|
+
def receiving?
|
60
|
+
!!@receiving
|
61
|
+
end
|
62
|
+
|
63
|
+
# Pull message and queue
|
64
|
+
def process_to_queue!
|
65
|
+
loop do
|
66
|
+
message = handle(receive)
|
67
|
+
if(message)
|
68
|
+
queue << message
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
# message:: FrameType instance
|
74
|
+
# Handle message if not an actual message
|
75
|
+
def handle(message)
|
76
|
+
# Grab heartbeats upfront
|
77
|
+
if(message.is_a?(FrameType::Response) && message.response == '_heartbeat_')
|
78
|
+
socket.write Command::Nop.new.to_line
|
79
|
+
nil
|
80
|
+
else
|
81
|
+
if(callback && callback[:actor] && callback[:method])
|
82
|
+
callback[:actor].send(callback[:method], message, current_actor)
|
83
|
+
else
|
84
|
+
message
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
@@ -0,0 +1,101 @@
|
|
1
|
+
module Krakow
|
2
|
+
class Consumer
|
3
|
+
|
4
|
+
include Utils::Lazy
|
5
|
+
include Celluloid
|
6
|
+
|
7
|
+
finalizer :goodbye_my_love!
|
8
|
+
|
9
|
+
attr_reader :connections, :discovery, :queue
|
10
|
+
|
11
|
+
def initialize(args={})
|
12
|
+
super
|
13
|
+
required! :topic, :channel
|
14
|
+
optional :host, :port, :nslookupd, :receive_count
|
15
|
+
@connections = {}
|
16
|
+
@queue = Queue.new
|
17
|
+
if(nslookupd)
|
18
|
+
@discovery = Discovery.new(:nslookupd => nslookupd)
|
19
|
+
every(60){ init! }
|
20
|
+
init!
|
21
|
+
else
|
22
|
+
connection = build_connection(host, port, queue)
|
23
|
+
if(register(connection))
|
24
|
+
connections[:default] = connection
|
25
|
+
else
|
26
|
+
raise Error.new("Failed to establish subscription at provided end point (#{host}:#{port}")
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def goodbye_my_love!
|
32
|
+
connections.values.each do |con|
|
33
|
+
con.terminate
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def build_connection(host, port, queue)
|
38
|
+
connection = Connection.new(
|
39
|
+
:host => host,
|
40
|
+
:port => port,
|
41
|
+
:queue => queue
|
42
|
+
)
|
43
|
+
end
|
44
|
+
|
45
|
+
def process_message(message, connection)
|
46
|
+
puts 'PROCESSING!'
|
47
|
+
if(message.is_a?(FrameType::Message))
|
48
|
+
connection.transmit(Command::Rdy.new(:count => receive_count || 1))
|
49
|
+
end
|
50
|
+
message
|
51
|
+
end
|
52
|
+
|
53
|
+
# Requests lookup and adds connections
|
54
|
+
def init!
|
55
|
+
found = discovery.lookup(topic)
|
56
|
+
found.each do |node|
|
57
|
+
unless(connections[node[:hostname]])
|
58
|
+
connection = build_connection(node[:broadcast_address], node[:tcp_port], queue)
|
59
|
+
connections[node[:hostname]] = connection if register(connection)
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
# connection:: Connection
|
65
|
+
# Registers connection with subscription. Returns false if failed
|
66
|
+
def register(connection)
|
67
|
+
connection.init!
|
68
|
+
connection.transmit(Command::Sub.new(:topic_name => topic, :channel_name => channel))
|
69
|
+
unless(connection.queue.pop.is_a?(FrameType::Error))
|
70
|
+
connection.transmit(Command::Rdy.new(:count => receive_count || 1))
|
71
|
+
true
|
72
|
+
else
|
73
|
+
connection.terminate
|
74
|
+
false
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
# message_id:: Message ID
|
79
|
+
# Confirm message has been processed
|
80
|
+
def confirm(message_id)
|
81
|
+
writer.transmit(Command::Fin.new(:message_id => message_id))
|
82
|
+
writer.transmit(Command::Rdy.new(:count => (receive_count - queue.size) + 1))
|
83
|
+
true
|
84
|
+
end
|
85
|
+
|
86
|
+
# message_id:: Message ID
|
87
|
+
# timeout:: Requeue timeout (default is none)
|
88
|
+
# Requeue message (processing failure)
|
89
|
+
def requeue(message_id, timeout=0)
|
90
|
+
writer.transmit(Command::Req.new(:message_id => message_id, :timeout => timeout))
|
91
|
+
end
|
92
|
+
|
93
|
+
# Attempt to return free connection from pool for writing
|
94
|
+
def writer
|
95
|
+
connections.values.detect do |con|
|
96
|
+
!con.receiving?
|
97
|
+
end || connections.values.first
|
98
|
+
end
|
99
|
+
|
100
|
+
end
|
101
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
require 'uri'
|
2
|
+
require 'http'
|
3
|
+
require 'multi_json'
|
4
|
+
|
5
|
+
module Krakow
|
6
|
+
class Discovery
|
7
|
+
|
8
|
+
include Utils::Lazy
|
9
|
+
|
10
|
+
def initialize(args={})
|
11
|
+
super
|
12
|
+
required! :nslookupd
|
13
|
+
end
|
14
|
+
|
15
|
+
# topic:: Topic name
|
16
|
+
# Return list of end points with given topic name available
|
17
|
+
def lookup(topic)
|
18
|
+
[nslookupd].flatten.map do |location|
|
19
|
+
uri = URI.parse(location)
|
20
|
+
uri.path = '/lookup'
|
21
|
+
uri.query = "topic=#{topic}&ts=#{Time.now.to_i}"
|
22
|
+
begin
|
23
|
+
content = HTTP.with(:accept => 'application/octet-stream').get(uri.to_s)
|
24
|
+
unless(content.respond_to?(:to_hash))
|
25
|
+
data = MultiJson.load(content.to_s)
|
26
|
+
else
|
27
|
+
data = content.to_hash
|
28
|
+
end
|
29
|
+
if(data['data'] && data['data']['producers'])
|
30
|
+
data['data']['producers'].map do |producer|
|
31
|
+
Hash[*producer.map{|k,v| [k.to_sym, v]}.flatten]
|
32
|
+
end
|
33
|
+
end
|
34
|
+
rescue => e
|
35
|
+
nil
|
36
|
+
end
|
37
|
+
end.compact.flatten(1).uniq
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
module Krakow
|
2
|
+
class FrameType
|
3
|
+
|
4
|
+
autoload :Error, 'krakow/frame_type/error'
|
5
|
+
autoload :Message, 'krakow/frame_type/message'
|
6
|
+
autoload :Response, 'krakow/frame_type/response'
|
7
|
+
|
8
|
+
include Utils::Lazy
|
9
|
+
|
10
|
+
FRAME_TYPE_MAP = [
|
11
|
+
FrameType::Response,
|
12
|
+
FrameType::Error,
|
13
|
+
FrameType::Message
|
14
|
+
]
|
15
|
+
SIZE_BYTES = 4
|
16
|
+
|
17
|
+
class << self
|
18
|
+
|
19
|
+
# bytes:: 8 bytes
|
20
|
+
# Return information about incoming frame
|
21
|
+
def decode(bytes)
|
22
|
+
size, type = bytes.unpack('l>l>')
|
23
|
+
{:size => size - SIZE_BYTES, :type => type}
|
24
|
+
end
|
25
|
+
|
26
|
+
# args:: arguments (:type, :data, :size)
|
27
|
+
# Build proper FrameType instance based on args
|
28
|
+
def build(args={})
|
29
|
+
klass = FRAME_TYPE_MAP[args[:type].to_i]
|
30
|
+
if(klass == FrameType::Response)
|
31
|
+
klass.new(:response => args[:data])
|
32
|
+
elsif(klass == FrameType::Error)
|
33
|
+
klass.new(:error => args[:data])
|
34
|
+
elsif(klass == FrameType::Message)
|
35
|
+
unpacked = args[:data].unpack("Q>s>a16a#{args[:size]}")
|
36
|
+
klass.new(
|
37
|
+
Hash[*([:timestamp, :attempts, :message_id, :message].zip(unpacked).flatten)]
|
38
|
+
)
|
39
|
+
else
|
40
|
+
raise TypeError.new "Unknown frame type received: #{args[:type].inspect} - #{klass.inspect}"
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def initialize(args={})
|
46
|
+
super
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
module Krakow
|
2
|
+
class Producer
|
3
|
+
|
4
|
+
include Utils::Lazy
|
5
|
+
include Celluloid
|
6
|
+
|
7
|
+
finalizer :goodbye_my_love!
|
8
|
+
|
9
|
+
attr_reader :connection
|
10
|
+
|
11
|
+
def initialize(args={})
|
12
|
+
super
|
13
|
+
required! :host, :port, :topic
|
14
|
+
@connection = Connection.new(:host => host, :port => port)
|
15
|
+
connection.init!
|
16
|
+
end
|
17
|
+
|
18
|
+
def goodbye_my_love!
|
19
|
+
if(connection)
|
20
|
+
connection.terminate
|
21
|
+
end
|
22
|
+
@connection = nil
|
23
|
+
end
|
24
|
+
|
25
|
+
# message:: Message to send
|
26
|
+
# Write message
|
27
|
+
def write(*message)
|
28
|
+
if(message.size > 1)
|
29
|
+
connection.transmit(
|
30
|
+
Command::Mpub.new(
|
31
|
+
:topic_name => topic,
|
32
|
+
:messages => message
|
33
|
+
)
|
34
|
+
)
|
35
|
+
else
|
36
|
+
connection.transmit(
|
37
|
+
Command::Pub.new(
|
38
|
+
:message => message.first,
|
39
|
+
:topic_name => topic
|
40
|
+
)
|
41
|
+
)
|
42
|
+
end
|
43
|
+
read(:validate)
|
44
|
+
end
|
45
|
+
|
46
|
+
# args:: Options (:validate)
|
47
|
+
# Read response from connection. If :validate is included an
|
48
|
+
# exception will be raised if `FrameType::Error` is received
|
49
|
+
def read(*args)
|
50
|
+
result = connection.queue.pop
|
51
|
+
if(args.include?(:validate) && result.is_a?(FrameType::Error))
|
52
|
+
error = Error::BadResponse.new('Write failed')
|
53
|
+
error.result = result
|
54
|
+
abort error
|
55
|
+
else
|
56
|
+
result
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
end
|
61
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
module Krakow
|
2
|
+
module Utils
|
3
|
+
module Lazy
|
4
|
+
attr_reader :arguments
|
5
|
+
|
6
|
+
def initialize(args={})
|
7
|
+
@arguments = {}.tap do |hash|
|
8
|
+
args.each do |k,v|
|
9
|
+
hash[k.to_sym] = v
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
# args:: list of required keys
|
15
|
+
# Check that required keys exist in `arguments` hash. Raise
|
16
|
+
# error if not found
|
17
|
+
def required!(*args)
|
18
|
+
args.each do |key|
|
19
|
+
unless(arguments.has_key?(key.to_sym))
|
20
|
+
raise ArgumentError.new "Missing required option `#{key}`!"
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
# args:: list of required keys
|
26
|
+
# Optional keys for arguments
|
27
|
+
def optional(*args)
|
28
|
+
args.each do |key|
|
29
|
+
key = key.to_sym
|
30
|
+
unless(arguments.has_key?(key))
|
31
|
+
arguments[key] = nil
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def method_missing(*args)
|
37
|
+
key = args.first.to_sym
|
38
|
+
if(arguments.has_key?(key))
|
39
|
+
arguments[key]
|
40
|
+
else
|
41
|
+
super
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def respond_to_missing?(key, *args)
|
46
|
+
key = key.to_sym
|
47
|
+
super || arguments.has_key?(key)
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
data/lib/krakow/utils.rb
ADDED
data/lib/krakow.rb
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
autoload :Celluloid, 'celluloid'
|
2
|
+
|
3
|
+
module Krakow
|
4
|
+
|
5
|
+
autoload :Command, 'krakow/command'
|
6
|
+
autoload :Connection, 'krakow/connection'
|
7
|
+
autoload :Consumer, 'krakow/consumer'
|
8
|
+
autoload :Discovery, 'krakow/discovery'
|
9
|
+
autoload :Error, 'krakow/exceptions'
|
10
|
+
autoload :FrameType, 'krakow/frame_type'
|
11
|
+
autoload :Producer, 'krakow/producer'
|
12
|
+
autoload :Utils, 'krakow/utils'
|
13
|
+
autoload :Version, 'krakow/version'
|
14
|
+
|
15
|
+
end
|
metadata
ADDED
@@ -0,0 +1,122 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: krakow
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Chris Roberts
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2014-01-24 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: celluloid-io
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '0'
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: http
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ! '>='
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '0'
|
38
|
+
type: :runtime
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '0'
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
name: multi_json
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
50
|
+
requirements:
|
51
|
+
- - ! '>='
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '0'
|
54
|
+
type: :runtime
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ! '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
description: NSQ ruby library
|
63
|
+
email: code@chrisroberts.org
|
64
|
+
executables: []
|
65
|
+
extensions: []
|
66
|
+
extra_rdoc_files: []
|
67
|
+
files:
|
68
|
+
- lib/krakow.rb
|
69
|
+
- lib/krakow/consumer.rb
|
70
|
+
- lib/krakow/frame_type.rb
|
71
|
+
- lib/krakow/command.rb
|
72
|
+
- lib/krakow/version.rb
|
73
|
+
- lib/krakow/utils/lazy.rb
|
74
|
+
- lib/krakow/producer.rb
|
75
|
+
- lib/krakow/frame_type/response.rb
|
76
|
+
- lib/krakow/frame_type/error.rb
|
77
|
+
- lib/krakow/frame_type/message.rb
|
78
|
+
- lib/krakow/command/pub.rb
|
79
|
+
- lib/krakow/command/cls.rb
|
80
|
+
- lib/krakow/command/touch.rb
|
81
|
+
- lib/krakow/command/fin.rb
|
82
|
+
- lib/krakow/command/identify.rb
|
83
|
+
- lib/krakow/command/req.rb
|
84
|
+
- lib/krakow/command/nop.rb
|
85
|
+
- lib/krakow/command/mpub.rb
|
86
|
+
- lib/krakow/command/sub.rb
|
87
|
+
- lib/krakow/command/rdy.rb
|
88
|
+
- lib/krakow/connection.rb
|
89
|
+
- lib/krakow/exceptions.rb
|
90
|
+
- lib/krakow/utils.rb
|
91
|
+
- lib/krakow/discovery.rb
|
92
|
+
- Gemfile
|
93
|
+
- README.md
|
94
|
+
- krakow.gemspec
|
95
|
+
- CHANGELOG.md
|
96
|
+
- Gemfile.lock
|
97
|
+
homepage: http://github.com/chrisroberts/krakow
|
98
|
+
licenses: []
|
99
|
+
post_install_message:
|
100
|
+
rdoc_options: []
|
101
|
+
require_paths:
|
102
|
+
- lib
|
103
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
104
|
+
none: false
|
105
|
+
requirements:
|
106
|
+
- - ! '>='
|
107
|
+
- !ruby/object:Gem::Version
|
108
|
+
version: '0'
|
109
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
110
|
+
none: false
|
111
|
+
requirements:
|
112
|
+
- - ! '>='
|
113
|
+
- !ruby/object:Gem::Version
|
114
|
+
version: '0'
|
115
|
+
requirements: []
|
116
|
+
rubyforge_project:
|
117
|
+
rubygems_version: 1.8.24
|
118
|
+
signing_key:
|
119
|
+
specification_version: 3
|
120
|
+
summary: NSQ library
|
121
|
+
test_files: []
|
122
|
+
has_rdoc:
|