cinch 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,8 @@
1
+ spec = File.dirname(__FILE__)
2
+ $LOAD_PATH.unshift(spec) unless $LOAD_PATH.include?(spec)
3
+
4
+ lib = File.dirname(__FILE__) + '../lib/'
5
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
6
+
7
+ require 'cinch'
8
+
@@ -0,0 +1,8 @@
1
+ spec = File.dirname(__FILE__)
2
+ $LOAD_PATH.unshift(spec) unless $LOAD_PATH.include?(spec)
3
+
4
+ lib = File.dirname(__FILE__) + '../../lib/'
5
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
6
+
7
+ require 'cinch/irc'
8
+
@@ -0,0 +1,61 @@
1
+ require File.dirname(__FILE__) + '/helper'
2
+
3
+ describe "IRC::Message" do
4
+ before do
5
+ @message = Cinch::IRC::Message.new('rawline', 'prefix', 'COMMAND', ['#chan', 'hello world'])
6
+ end
7
+
8
+ describe "#add, #[]=" do
9
+ it "should add an attribute" do
10
+ @message.add(:custom, 'something')
11
+ @message.data.should include :custom
12
+ @message.data[:custom].should == "something"
13
+ end
14
+ end
15
+
16
+ describe "#delete" do
17
+ it "should remove an attribute" do
18
+ @message.add(:custom, 'something')
19
+ @message.delete(:custom)
20
+ @message.data.should_not include :custom
21
+ end
22
+ end
23
+
24
+ describe "#to_s" do
25
+ it "should return the raw IRC message" do
26
+ @message.to_s.should == @message.raw
27
+ end
28
+ end
29
+
30
+ describe "#method_missing" do
31
+ it "should return an attribute if it exists" do
32
+ @message.add(:custom, 'something')
33
+ @message.custom.should == 'something'
34
+ end
35
+
36
+ it "should return nil if no attribute exists" do
37
+ @message.foobar.should == nil
38
+ end
39
+ end
40
+
41
+ describe "default attributes" do
42
+ it "should contain a prefix" do
43
+ @message.prefix.should == 'prefix'
44
+ end
45
+
46
+ it "should contain a command" do
47
+ @message.command.should == "COMMAND"
48
+ end
49
+
50
+ it "should contain params" do
51
+ @message.params.should be_kind_of(Array)
52
+ @message.params.size.should == 2
53
+ end
54
+
55
+ it "should contain a symbolized command" do
56
+ @message.symbol.should == :command
57
+ end
58
+ end
59
+
60
+ end
61
+
@@ -0,0 +1,107 @@
1
+ require File.dirname(__FILE__) + '/helper'
2
+
3
+ # Common commands
4
+ commands = {
5
+ :ping => "PING :foobar",
6
+ :nick => ":foo!~baz@host.com NICK Baz",
7
+ :join => ":foo!~bar@host.com JOIN #baz",
8
+
9
+ :privmsg => {
10
+ "to a channel" => ":foo!~bar@host.com PRIVMSG #baz :hello world",
11
+ "to a user" => ":foo!~bar@host.com PRIVMSG Baz :hello world",
12
+ "with an action" => ":foo!~bar@host.com PRIVMSG #baz :\001ACTION hello word\001",
13
+ },
14
+
15
+ :notice => {
16
+ "to a channel" => ":foo!~bar@host.com NOTICE #baz :hello world",
17
+ "to a user" => ":foo!~bar@host.com NOTICE Baz :hello world",
18
+ },
19
+
20
+ :part => {
21
+ "without a message" => ":foo!~bar@host.com PART #baz",
22
+ "with a message" => ":foo!~bar@host.com PART #baz :beer",
23
+ },
24
+
25
+ :quit => {
26
+ "without a message" => ":foo!~bar@host.com QUIT",
27
+ "with a message" => ":foo!~bar@host.com QUIT :baz"
28
+ }
29
+ }
30
+
31
+ describe "IRC::Parser" do
32
+ before do
33
+ @parser = Cinch::IRC::Parser.new
34
+ end
35
+
36
+ describe "#add_pattern" do
37
+ it "should add a pattern" do
38
+ @parser.add_pattern(:custom, /foo/)
39
+ @parser.patterns.key?(:custom)
40
+ end
41
+
42
+ it "should raise ArgumentError if pattern is not Regexp" do
43
+ lambda { @parser.add_pattern(:custom, 'foo') }.should raise_error(ArgumentError)
44
+ end
45
+ end
46
+
47
+ describe "#remove_pattern" do
48
+ it "should remove a pattern" do
49
+ @parser.add_pattern(:custom, /foo/)
50
+ @parser.remove_pattern(:custom)
51
+ @parser.patterns.keys.should_not include(:custom)
52
+ end
53
+
54
+ it "should return nil if a pattern doesn't exist" do
55
+ @parser.remove_pattern(:foo).should be nil
56
+ end
57
+ end
58
+
59
+ describe "#parse_servermessage" do
60
+ it "should return an IRC::Message" do
61
+ @parser.parse("foo :bar").should be_kind_of(Cinch::IRC::Message)
62
+ end
63
+
64
+ it "should raise if given an invalid message" do
65
+ lambda { @parser.parse("#") }.should raise_error(ArgumentError)
66
+ end
67
+
68
+ commands.each do |cmd, passes|
69
+ if passes.is_a?(Hash)
70
+ passes.each do |extra, pass|
71
+ it "should parse a #{cmd.to_s.upcase} command #{extra}" do
72
+ m = @parser.parse(pass)
73
+ m.symbol.should == cmd
74
+ end
75
+ end
76
+ else
77
+ it "should parse a #{cmd.to_s.upcase} command" do
78
+ m = @parser.parse(passes)
79
+ m.symbol.should == cmd
80
+ end
81
+ end
82
+ end
83
+
84
+ end
85
+
86
+ describe "#parse_userhost" do
87
+ it "should return an Array" do
88
+ @parser.parse_userhost(":foo!bar@baz").should be_kind_of(Array)
89
+ end
90
+
91
+ it "should return 3 values" do
92
+ @parser.parse_userhost(":foo!bar@baz").size.should be 3
93
+ end
94
+ end
95
+
96
+ describe "#valid_channel?" do
97
+ it "should return true with a valid channel name" do
98
+ @parser.valid_channel?("#foo").should be true
99
+ end
100
+
101
+ it "should return false with an invalid channel name" do
102
+ @parser.valid_channel?("foo").should be false
103
+ end
104
+ end
105
+
106
+ end
107
+
@@ -0,0 +1,90 @@
1
+ require File.dirname(__FILE__) + '/helper'
2
+
3
+ class Cinch::IRC::Socket
4
+ def write(data)
5
+ return data
6
+ end
7
+
8
+ def read(chompstr="\r\n")
9
+ str = "foo bar baz\r\n"
10
+ str.chomp!(chompstr) if chompstr
11
+ end
12
+ end
13
+
14
+ commands = [
15
+ [:pass, %w(foobar), "PASS foobar"],
16
+ [:nick, %(ipsum), "NICK ipsum"],
17
+ [:user, ["guest", 0, '*', "real name"], "USER guest 0 * :real name"],
18
+ [:oper, %w(foo bar), "OPER foo bar"],
19
+ [:mode, %w(#foo +v bar), "MODE #foo +v bar"],
20
+ [:quit, %w(goodbye), "QUIT :goodbye"],
21
+ [:join, %w(#mychan), "JOIN #mychan"],
22
+ [:part, %w(#mychan), "PART #mychan"],
23
+ [:part, %w(#mychan cya!), "PART #mychan :cya!", "with part message"],
24
+ [:topic, %w(#mychan newtopic), "TOPIC #mychan :newtopic"],
25
+ [:names, %w(#foo #bar), "NAMES #foo,#bar"],
26
+ [:list, %w(#foo #bar), "LIST #foo,#bar"],
27
+ [:invite, %w(foo #mychan), "INVITE foo #mychan"],
28
+ [:kick, %w(#chan villian), "KICK #chan villian"],
29
+ [:kick, %w(#chan villian gtfo!), "KICK #chan villian :gtfo!", "with kick reason"],
30
+ [:privmsg, ['#chan', 'foo bar baz'], "PRIVMSG #chan :foo bar baz"],
31
+ [:notice, ['#chan', 'foo bar baz'], "NOTICE #chan :foo bar baz"],
32
+ [:motd, %w(someserver), "MOTD someserver"],
33
+ [:version, %w(anotherserver), "VERSION anotherserver"],
34
+ [:stats, %w(m server), "STATS m server"],
35
+ [:time, %w(irc.someserver.net), "TIME irc.someserver.net"],
36
+ [:info, %w(foobar), "INFO foobar"],
37
+ [:squery, %w(irchelp HELPME), "SQUERY irchelp :HELPME"],
38
+ [:who, %w(*.com o), "WHO *.com o"],
39
+ [:whois, %w(foo.org user), "WHOIS foo.org user"],
40
+ [:whowas, %w(foo.org user), "WHOWAS foo.org user"],
41
+ [:kill, ['badperson', 'get out!'], "KILL badperson :get out!"],
42
+ [:ping, %w(010123444), "PING 010123444"],
43
+ [:pong, %w(irc.foobar.org), "PONG irc.foobar.org"],
44
+ [:away, [], "AWAY"],
45
+ [:away, ['gone for lunch'], "AWAY :gone for lunch"],
46
+ [:users, %w(irc.foobar.org), "USERS irc.foobar.org"],
47
+ [:userhost, %w(foo bar baz), "USERHOST foo bar baz"],
48
+ ]
49
+
50
+ describe "Cinch::IRC::Socket" do
51
+ before do
52
+ @irc = Cinch::IRC::Socket.new('irc.myserver.net')
53
+ end
54
+
55
+ describe "::new" do
56
+ it "should return an Cinch::IRC::Socket" do
57
+ @irc.class.should == Cinch::IRC::Socket
58
+ end
59
+
60
+ it "should default to port 6667" do
61
+ @irc.port.should == 6667
62
+ end
63
+
64
+ it "should not automatically connect" do
65
+ @irc.connected.should == false
66
+ end
67
+
68
+ it "should set socket instance as nil" do
69
+ @irc.socket.should == nil
70
+ end
71
+ end
72
+
73
+ describe "#read" do
74
+ it "should chomp CRLF by default" do
75
+ @irc.read.should == "foo bar baz"
76
+ @irc.read.should_not == "foo bar baz\r\n"
77
+ end
78
+ end
79
+
80
+ commands.each do |requirements|
81
+ meth, params, pass, extra = *requirements
82
+ describe "##{meth}" do
83
+ it "should send a #{meth.to_s.upcase} command #{extra if extra}" do
84
+ @irc.send(meth, *params).should == pass
85
+ end
86
+ end
87
+ end
88
+
89
+ end
90
+
@@ -0,0 +1,40 @@
1
+ require File.dirname(__FILE__) + '/helper'
2
+
3
+ describe "Cinch::Base options" do
4
+ before do
5
+ @base = Cinch::Base
6
+ end
7
+
8
+ it "should set options via a hash" do
9
+ base = @base.new(:server => 'irc.foobar.org')
10
+ base.options.server.should == "irc.foobar.org"
11
+ end
12
+
13
+ it "should set options via a block" do
14
+ base = @base.new do
15
+ server "irc.foobar.org"
16
+ end
17
+ base.options.server.should == "irc.foobar.org"
18
+ end
19
+
20
+ it "should set options via setters" do
21
+ base = @base.new
22
+ base.options.server = "irc.foobar.org"
23
+ base.options.server.should == "irc.foobar.org"
24
+ end
25
+
26
+ it "should set specific default values" do
27
+ defaults = {
28
+ :port => 6667,
29
+ :nick => 'Cinch',
30
+ :prefix => '!',
31
+ }
32
+
33
+ base = @base.new
34
+ defaults.each do |k, v|
35
+ base.options.send(k).should == v
36
+ end
37
+ end
38
+
39
+ end
40
+
metadata ADDED
@@ -0,0 +1,93 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: cinch
3
+ version: !ruby/object:Gem::Version
4
+ prerelease: false
5
+ segments:
6
+ - 0
7
+ - 1
8
+ version: "0.1"
9
+ platform: ruby
10
+ authors:
11
+ - Lee 'injekt' Jarvis
12
+ autorequire:
13
+ bindir: bin
14
+ cert_chain: []
15
+
16
+ date: 2010-04-25 00:00:00 +01:00
17
+ default_executable:
18
+ dependencies:
19
+ - !ruby/object:Gem::Dependency
20
+ name: rspec
21
+ prerelease: false
22
+ requirement: &id001 !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "="
25
+ - !ruby/object:Gem::Version
26
+ segments:
27
+ - 1
28
+ - 3
29
+ - 0
30
+ version: 1.3.0
31
+ type: :development
32
+ version_requirements: *id001
33
+ description: An IRC Microframework
34
+ email: ljjarvis@gmail.com
35
+ executables: []
36
+
37
+ extensions: []
38
+
39
+ extra_rdoc_files:
40
+ - README.rdoc
41
+ files:
42
+ - README.rdoc
43
+ - Rakefile
44
+ - spec/irc/socket_spec.rb
45
+ - spec/irc/helper.rb
46
+ - spec/irc/message_spec.rb
47
+ - spec/irc/parser_spec.rb
48
+ - spec/helper.rb
49
+ - spec/options_spec.rb
50
+ - lib/cinch.rb
51
+ - lib/cinch/base.rb
52
+ - lib/cinch/irc/message.rb
53
+ - lib/cinch/irc/socket.rb
54
+ - lib/cinch/irc/parser.rb
55
+ - lib/cinch/irc.rb
56
+ has_rdoc: true
57
+ homepage: http://rdoc.injekt.net/cinch
58
+ licenses: []
59
+
60
+ post_install_message:
61
+ rdoc_options:
62
+ - --quiet
63
+ - --title
64
+ - "Cinch: The IRC Microframework"
65
+ - --main
66
+ - README.rdoc
67
+ require_paths:
68
+ - lib
69
+ required_ruby_version: !ruby/object:Gem::Requirement
70
+ requirements:
71
+ - - ">="
72
+ - !ruby/object:Gem::Version
73
+ segments:
74
+ - 1
75
+ - 8
76
+ - 6
77
+ version: 1.8.6
78
+ required_rubygems_version: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ segments:
83
+ - 0
84
+ version: "0"
85
+ requirements: []
86
+
87
+ rubyforge_project:
88
+ rubygems_version: 1.3.6
89
+ signing_key:
90
+ specification_version: 3
91
+ summary: An IRC Microframework
92
+ test_files: []
93
+