irb.rb in amq-protocol-0.0.1.pre vs irb.rb in amq-protocol-0.5.0
- old
+ new
@@ -1,9 +1,81 @@
#!/usr/bin/env ruby
-# encoding: utf-8
+# encoding: binary
+# This file is supposed to make inspecting AMQ protocol easier.
+
+# How does it work:
+# 1) This file is executed.
+# 2) We load irb, redefine where IRB looks for .irbrc and start IRB.
+# 3) IRB loads .irbrc, which we redefined, so it loads this file again.
+# However now the second branch of "if __FILE__ == $0" gets executed,
+# so it runs our custom code which loads the original .irbrc and then
+# it redefines some IRB settings. In this case it add IRB hook which
+# is executed after IRB is started.
+
+# Although it looks unnecessarily complicated, I can't see any easier
+# solution to this problem in case that you need to patch original settings.
+# Obviously in case you don't have the need, you'll be happy with simple:
+
+# require "irb"
+#
+# require_relative "lib/amq/protocol/client.rb"
+# include AMQ::Protocol
+#
+# IRB.start(__FILE__)
+
require "irb"
-require_relative "lib/amq/protocol.rb"
-include AMQ::Protocol
+if __FILE__ == $0
+ puts "~ Using #{__FILE__} as an executable ..."
-IRB.start(__FILE__)
+
+ def IRB.rc_file_generators
+ yield Proc.new { |_| __FILE__ }
+ end
+
+ IRB.start(__FILE__)
+else
+ begin
+ irbrc = File.join(ENV["HOME"], ".irbrc")
+ puts "~ Using #{__FILE__} as a custom .irbrc .."
+ puts "~ Loading original #{irbrc} ..."
+ load irbrc
+
+ file = ENV["FILE"] || "client"
+ require_relative "lib/amq/protocol/#{file}.rb"
+ include AMQ::Protocol
+
+ begin
+ require "amq/client/io/string"
+
+ class AMQ::Protocol::Frame
+ def self.decode(string)
+ AMQ::Client::StringAdapter::Frame.decode(string)
+ end
+ end
+ rescue LoadError
+ warn "~ AMQ Client isn't available."
+ end
+
+ # "0123456789".chunks(1, 1, 2, 3)
+ # => ["0", "1", "23", "456"]
+ class String
+ def chunks(*parts)
+ offset = 0
+ parts.map do |number_of_characters|
+ self[offset..(offset + number_of_characters - 1)].tap do
+ offset += number_of_characters
+ end
+ end << self[offset..-1]
+ end
+ end
+
+ require "stringio"
+
+ def fd(data)
+ Frame.decode(StringIO.new(data))
+ end
+ rescue Exception => exception # it just discards all the exceptions!
+ abort exception.message + "\n - " + exception.backtrace.join("\n - ")
+ end
+end