ircbgb 0.0.1.pre

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,72 @@
1
+ require File.expand_path('../../spec_helper', __FILE__)
2
+
3
+ describe Ircbgb::User do
4
+ describe "parsing" do
5
+ it "parses a `nick!user@host` string" do
6
+ user = Ircbgb::User.parse('my_nick!~stuffit@some.exotic.host')
7
+ user.nick.must_equal 'my_nick'
8
+ user.user.must_equal '~stuffit'
9
+ user.host.must_equal 'some.exotic.host'
10
+ end
11
+
12
+ it "parses a wildcarded string" do
13
+ user = Ircbgb::User.parse('*!?stuffy@*.example.???')
14
+ user.nick.must_equal '*'
15
+ user.user.must_equal '?stuffy'
16
+ user.host.must_equal '*.example.???'
17
+ end
18
+
19
+ it "parses missing bits, wildcarding what's left out" do
20
+ user = Ircbgb::User.parse('beeboz')
21
+ user.nick.must_equal 'beeboz'
22
+ user.user.must_equal '*'
23
+ user.host.must_equal '*'
24
+ user = Ircbgb::User.parse('booboz!@host')
25
+ user.nick.must_equal 'booboz'
26
+ user.user.must_equal '*'
27
+ user.host.must_equal 'host'
28
+ end
29
+
30
+ it "parses a user as itself" do
31
+ user = Ircbgb::User.parse('my_nick!~stuffit@some.exotic.host')
32
+ Ircbgb::User.parse(user).must_equal user
33
+ end
34
+ end
35
+
36
+ describe "methods" do
37
+ it "converts to a string" do
38
+ user = Ircbgb::User.new('a_nick', 'a_username', 'a.host.example.org')
39
+ user.to_s.must_equal 'a_nick!a_username@a.host.example.org'
40
+ Ircbgb::User.parse('nick').to_s.must_equal 'nick!*@*'
41
+ end
42
+ end
43
+
44
+ describe "matching" do
45
+ def match_me; @match_me ||= Ircbgb::User.new('someNick', '~stuffy', 'britches.co.uk'); end
46
+
47
+ it "matches against IRC wildcard strings" do
48
+ 'someNick!~stuffy@britches.co.uk'.must_match match_me
49
+ '*o*!*stuffy@*i*.?o.u?'.must_match match_me
50
+ 'S???nick!*~stuffy@britches.co.**'.must_match match_me
51
+ '*!*@*'.must_match match_me
52
+ '?*'.must_match match_me
53
+ 'someNick?!*@*'.wont_match match_me
54
+ '*b*!*@*'.wont_match match_me
55
+ '*q*'.wont_match match_me
56
+ end
57
+
58
+ it "matches against regexs" do
59
+ /\Asome/.must_match match_me
60
+ /stuffy@bri/.must_match match_me
61
+ /\AsomeNick.!/.wont_match match_me
62
+ /.*b.*!.*@.*/.wont_match match_me
63
+ /q/.wont_match match_me
64
+ end
65
+
66
+ it "matches against matchers" do
67
+ Ircbgb::Matcher.new('*o*!*stuffy@*i*.?o.u?').must_match match_me
68
+ Ircbgb::Matcher.new('someNick?!*@*').wont_match match_me
69
+ end
70
+ end
71
+ end
72
+
@@ -0,0 +1,18 @@
1
+ if ENV['SCOV']
2
+ require 'simplecov'
3
+ SimpleCov.start do
4
+ add_filter "/spec/"
5
+ end
6
+ end
7
+
8
+ begin
9
+ require 'minitest/autorun'
10
+ require 'minitest/emoji'
11
+ rescue LoadError
12
+ end
13
+
14
+ Dir[File.expand_path('../support/*.rb', __FILE__)].each do |r|
15
+ require r
16
+ end
17
+
18
+ require 'ircbgb'
@@ -0,0 +1,70 @@
1
+ require 'stringio'
2
+
3
+ # Used to test IO stuff, using stringio objects for the write and
4
+ # read stream.
5
+ class DummyIO
6
+ attr_reader :closed, :w_stream, :r_stream, :raised_write, :raised_read
7
+ alias :closed? :closed
8
+ alias :raised_write? :raised_write
9
+ alias :raised_read? :raised_read
10
+ attr_accessor :readable, :writeable
11
+ attr_accessor :write_delay, :read_delay
12
+ attr_accessor :max_write, :max_read
13
+ attr_accessor :raise_read, :raise_write
14
+ alias :readable? :readable
15
+ alias :writeable? :writeable
16
+
17
+ def initialize *args, &block
18
+ @r_stream = StringIO.new
19
+ @w_stream = StringIO.new
20
+ @readable = @writeable = true
21
+ @read_delay = @write_delay = 0
22
+ @max_write = 0
23
+ @max_read = 0
24
+ @closed = false
25
+ @raise_read = nil
26
+ @raise_write = nil
27
+ @raised_write = false
28
+ @raised_read = false
29
+ end
30
+
31
+ def close
32
+ @closed = true
33
+ @w_stream.close
34
+ @r_stream.close
35
+ end
36
+
37
+ def write_nonblock bytes
38
+ sleep(@write_delay) if @write_delay > 0
39
+ do_raise_write
40
+ if @max_write > 0 && bytes.size > @max_write
41
+ @w_stream.write bytes[0...@max_write]
42
+ else
43
+ @w_stream.write bytes
44
+ end
45
+ end
46
+
47
+ def read_nonblock len
48
+ sleep(@read_delay) if @read_delay > 0
49
+ do_raise_read
50
+ if @max_read > 0 && len > @max_read
51
+ @r_stream.read @max_read
52
+ else
53
+ @r_stream.read len
54
+ end
55
+ end
56
+
57
+ def do_raise_write
58
+ if @raise_write
59
+ @raised_write = true
60
+ raise @raise_write
61
+ end
62
+ end
63
+
64
+ def do_raise_read
65
+ if @raise_read
66
+ @raised_read = true
67
+ raise @raise_read
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,49 @@
1
+ module Stubz
2
+ def self.included base
3
+ base.__send__(:before) { _ensure_stubs_ }
4
+ base.__send__(:after) { _reset_stubs_ }
5
+ end
6
+
7
+ def stub_instance(klass, meth, *val, &block)
8
+ _do_stub_ klass, meth, *val, &block
9
+ end
10
+
11
+ def stub(obj, meth, *val, &block)
12
+ _do_stub_ get_meta_class(obj), meth, *val, &block
13
+ end
14
+
15
+ def get_meta_class klass
16
+ class << klass; self; end
17
+ end
18
+
19
+ def _do_stub_ klass, meth, *val, &block
20
+ if klass.method_defined? meth
21
+ aliased = "_stub_#{meth}_#{Time.now.to_i}_"
22
+ klass.send(:alias_method, aliased, meth)
23
+ else
24
+ aliased = nil
25
+ end
26
+ if block
27
+ klass.send(:define_method, meth, &block)
28
+ else
29
+ klass.send(:define_method, meth) do |*_|
30
+ val.first
31
+ end
32
+ end
33
+ @stubbies << [klass, meth, aliased]
34
+ end
35
+
36
+ def _ensure_stubs_
37
+ @stubbies = []
38
+ end
39
+
40
+ def _reset_stubs_
41
+ @stubbies.each do |(klass, meth, aliased)|
42
+ klass.send(:remove_method, meth)
43
+ if aliased
44
+ klass.send(:alias_method, meth, aliased)
45
+ klass.send(:remove_method, aliased)
46
+ end
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,60 @@
1
+ # Rather than using IoUnblock with a mock TCPSocket, we'll trust IoUnblock to
2
+ # test itself properly, and mock out IoUnblock::TcpSocket instead.
3
+ class UnblockedTcpSocket
4
+ attr_reader :host, :port, :callbacks, :written
5
+
6
+ def initialize
7
+ @written = []
8
+ end
9
+
10
+ def init_with host, port, callbacks=nil
11
+ @callbacks = callbacks || {}
12
+ @host = host
13
+ @port = port
14
+ @callbacks[:callback_failed] ||= lambda { |ex|
15
+ warn "Default callback_failed handler: #{ex}"
16
+ }
17
+ self
18
+ end
19
+
20
+ def start; self; end
21
+ def stop; self; end
22
+ def running?; true; end
23
+
24
+ def server_write_raw str
25
+ @callbacks[:read] && @callbacks[:read].call(str)
26
+ end
27
+
28
+ def server_write cmd, max_len=nil
29
+ server_write_raw ":#{@host} #{cmd}\r\n"
30
+ end
31
+
32
+ def write str
33
+ if str[-2..-1] != "\r\n"
34
+ raise "You forgot to CRLF your message"
35
+ end
36
+ @written << str[0..-3]
37
+ end
38
+
39
+ def trigger_start
40
+ trigger_ev :started, :start
41
+ end
42
+
43
+ def trigger_loop
44
+ trigger_ev :looped, self
45
+ end
46
+
47
+ def trigger_stop
48
+ trigger_ev :stopped, :stop
49
+ end
50
+
51
+ def trigger_ev ev, *args
52
+ @callbacks[ev] && @callbacks[ev].call(*args)
53
+ rescue Exception
54
+ if ev != :callback_failed
55
+ @callbacks[:callback_failed].call($!)
56
+ else
57
+ warn "Your callback failure callback is raising errors: #{$!}"
58
+ end
59
+ end
60
+ end
metadata ADDED
@@ -0,0 +1,93 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: ircbgb
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1.pre
5
+ prerelease: 6
6
+ platform: ruby
7
+ authors:
8
+ - Ian D. Eccles
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-03-14 00:00:00.000000000Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rake
16
+ requirement: &2156987900 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :development
23
+ prerelease: false
24
+ version_requirements: *2156987900
25
+ description: An IRC client library geared toward writing custom clients and bots
26
+ email:
27
+ - ian.eccles@gmail.com
28
+ executables: []
29
+ extensions: []
30
+ extra_rdoc_files: []
31
+ files:
32
+ - .autotest
33
+ - .gitignore
34
+ - Gemfile
35
+ - Rakefile
36
+ - ircbgb.gemspec
37
+ - lib/ircbgb.rb
38
+ - lib/ircbgb/behaviors.rb
39
+ - lib/ircbgb/behaviors/negotiates_connection.rb
40
+ - lib/ircbgb/behaviors/provides_commands.rb
41
+ - lib/ircbgb/client.rb
42
+ - lib/ircbgb/errors.rb
43
+ - lib/ircbgb/matcher.rb
44
+ - lib/ircbgb/message.rb
45
+ - lib/ircbgb/message_parser.rb
46
+ - lib/ircbgb/message_parser.rl
47
+ - lib/ircbgb/server.rb
48
+ - lib/ircbgb/user.rb
49
+ - lib/ircbgb/version.rb
50
+ - spec/ircbgb/client_spec.rb
51
+ - spec/ircbgb/matcher_spec.rb
52
+ - spec/ircbgb/message_parser_spec.rb
53
+ - spec/ircbgb/message_spec.rb
54
+ - spec/ircbgb/user_spec.rb
55
+ - spec/spec_helper.rb
56
+ - spec/support/dummy_io.rb
57
+ - spec/support/stubz.rb
58
+ - spec/support/unblocked_tcp_socket.rb
59
+ homepage: ''
60
+ licenses: []
61
+ post_install_message:
62
+ rdoc_options: []
63
+ require_paths:
64
+ - lib
65
+ required_ruby_version: !ruby/object:Gem::Requirement
66
+ none: false
67
+ requirements:
68
+ - - ! '>='
69
+ - !ruby/object:Gem::Version
70
+ version: '0'
71
+ required_rubygems_version: !ruby/object:Gem::Requirement
72
+ none: false
73
+ requirements:
74
+ - - ! '>'
75
+ - !ruby/object:Gem::Version
76
+ version: 1.3.1
77
+ requirements: []
78
+ rubyforge_project: ircbgb
79
+ rubygems_version: 1.8.12
80
+ signing_key:
81
+ specification_version: 3
82
+ summary: An IRC client library
83
+ test_files:
84
+ - spec/ircbgb/client_spec.rb
85
+ - spec/ircbgb/matcher_spec.rb
86
+ - spec/ircbgb/message_parser_spec.rb
87
+ - spec/ircbgb/message_spec.rb
88
+ - spec/ircbgb/user_spec.rb
89
+ - spec/spec_helper.rb
90
+ - spec/support/dummy_io.rb
91
+ - spec/support/stubz.rb
92
+ - spec/support/unblocked_tcp_socket.rb
93
+ has_rdoc: