ircparser 0.6.2 → 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d1262a7e23aab10553888d9d4221bd92135b2946c9eb62926151e922cf6bcc28
4
- data.tar.gz: 1211d6f79d995dc880eae1f289bcd73cc9c6f2ecf4cd2bb7198e25aa10343114
3
+ metadata.gz: c6b7566a57bb2e617b579c0ce2a174b66f96af0da0ed94efdeae3688f7a23cdb
4
+ data.tar.gz: 90e612dea1ea55b93896ebfdfb4d44880b021191120d2c49119785883b2e6bbc
5
5
  SHA512:
6
- metadata.gz: c3863279345f02af5357738b2c54488289259ad7f304da349663892af23f3cbe819a506175d139caf35edfb42d1db511289b89dba0e3fe82dea51baec989611a
7
- data.tar.gz: 9dcca8e8329dd38534fec6dc95e88bae6e1cc3ad601f9983bc52c47484f4526c99bca64b450a88230f8ac330656b377edf24a8b9cd8238b09256697acbd7adb6
6
+ metadata.gz: ec325e4e96dbd73405c3b4815be8028e0243855af8c7f3889a34ad1ab7a3325bd64c11e8fcd08b63eea7444ec08bfe1dea56a6534f7dfe6dd7640b78baa04079
7
+ data.tar.gz: 53a1b4419baf3a2e56f51f5ff4e6bc586ac9b7217904704a80ae6a1bc603681b87a5f0d9e174ef2edc8dc73f54fcd05e35ffe2884d603b37bfe980912e3c27df
@@ -16,7 +16,7 @@
16
16
  module IRCParser
17
17
 
18
18
  # Public: The version of IRCParser in use.
19
- VERSION = '0.6.2'
19
+ VERSION = '0.7.0'
20
20
  end
21
21
 
22
22
  require_relative 'ircparser/error'
@@ -38,8 +38,12 @@ module IRCParser
38
38
  def append data
39
39
  (@buffer ||= '') << data
40
40
  while @buffer.slice! /(.*?)\r?\n/
41
- message = IRCParser::Message.parse $1
42
- @block.call message
41
+ begin
42
+ message = IRCParser::Message.parse $1
43
+ @block.call message, nil
44
+ rescue IRCParser::Error => error
45
+ @block.call nil, error
46
+ end
43
47
  end
44
48
  end
45
49
  end
@@ -18,6 +18,41 @@ module IRCParser
18
18
  # Internal: Implements objectification and stringification for the RFC wire format.
19
19
  module RFCWireFormat
20
20
 
21
+ class MessageTokenizer
22
+
23
+ def initialize message
24
+ @message = message
25
+ # Skip any preceding whitespace. This is technically invalid but
26
+ # is implemented by several servers in the wild.
27
+ @position = message.index(/\S/) || 0
28
+ end
29
+
30
+ # Internal: Retrieves a space delimited token from the message.
31
+ def read_middle
32
+ return nil if @position >= @message.length
33
+ old_position = @position
34
+ @position = @message.index(' ', old_position) || @message.length
35
+ return nil unless @position - old_position > 0
36
+ token = @message.slice old_position...@position
37
+ @position = @message.index(/\S+/, @position) || @message.length
38
+ return token
39
+ end
40
+
41
+ # Internal: Retrieves a space delimited token that may be a <trailing> parameter.
42
+ #
43
+ # message - The message to retrieve the token from.
44
+ def read_trailing
45
+ return nil if @position >= @message.length
46
+ if @message[@position] == ':'
47
+ token = @message[@position+1..-1]
48
+ @position = @message.length
49
+ return token
50
+ end
51
+ return read_middle
52
+ end
53
+
54
+ end
55
+
21
56
  # Internal: Objectifies a message from the RFC wire format to an IRCParser::Message.
22
57
  #
23
58
  # str - A String containing a message in the RFC wire format.
@@ -28,31 +63,28 @@ module IRCParser
28
63
  raise IRCParser::Error.new(str), "message is not a String"
29
64
  end
30
65
 
31
- # Skip any preceding whitespace. This is technically invalid but
32
- # is implemented by several servers in the wild.
33
- message = str.lstrip
34
-
35
66
  # Split the message up into an array of tokens.
36
- current_token = self.__get_token message
67
+ tokenizer = MessageTokenizer.new str
68
+ current_token = tokenizer.read_middle
37
69
  components = Hash.new
38
70
 
39
71
  # Have we encountered IRCv3 message tags?
40
72
  components[:tags] = Hash.new
41
73
  if current_token != nil && current_token[0] == '@'
42
74
  components[:tags] = self.__objectify_tags current_token
43
- current_token = self.__get_token message
75
+ current_token = tokenizer.read_middle
44
76
  end
45
77
 
46
78
  # Have we encountered the prefix of this message?
47
79
  if current_token != nil && current_token[0] == ':'
48
80
  components[:prefix] = self.__objectify_prefix current_token
49
- current_token = self.__get_token message
81
+ current_token = tokenizer.read_middle
50
82
  end
51
83
 
52
84
  # The command parameter is mandatory.
53
85
  if current_token != nil
54
86
  components[:command] = current_token.upcase
55
- current_token = self.__get_final_token message
87
+ current_token = tokenizer.read_trailing
56
88
  else
57
89
  raise IRCParser::Error.new(str), 'message is missing the command name'
58
90
  end
@@ -61,7 +93,7 @@ module IRCParser
61
93
  components[:parameters] = Array.new
62
94
  while current_token != nil
63
95
  components[:parameters] << current_token
64
- current_token = self.__get_final_token message
96
+ current_token = tokenizer.read_trailing
65
97
  end
66
98
 
67
99
  return IRCParser::Message.new components
@@ -119,40 +151,6 @@ module IRCParser
119
151
  '\n' => "\n",
120
152
  }
121
153
 
122
- # Internal: Retrieves a space delimited token from the buffer.
123
- #
124
- # buffer - The buffer to retrieve the token from.
125
- def self.__get_token buffer
126
- return nil if buffer.empty?
127
- position = buffer.index ' '
128
- if position == nil
129
- token = buffer.clone
130
- buffer.clear
131
- return token
132
- end
133
- token = buffer.slice! 0...position
134
- position = buffer.index /\S+/
135
- if position == nil
136
- buffer.clear
137
- else
138
- buffer.slice! 0...position
139
- end
140
- return token
141
- end
142
-
143
- # Internal: Retrieves a space delimited token that may be a <trailing> parameter.
144
- #
145
- # buffer - The buffer to retrieve the token from.
146
- def self.__get_final_token buffer
147
- return nil if buffer.empty?
148
- if buffer[0] == ':'
149
- token = buffer[1..-1]
150
- buffer.clear
151
- return token
152
- end
153
- return self.__get_token buffer
154
- end
155
-
156
154
  # Internal: Objectifies the prefix from the RFC wire format to an IRCParser::Prefix.
157
155
  #
158
156
  # token - A String containing the prefix in the RFC wire format.
@@ -170,10 +168,9 @@ module IRCParser
170
168
  tags = Hash.new
171
169
  token[1..-1].split(';').each do |tag|
172
170
  if tag =~ MATCH_TAG
173
- value = nil
171
+ value = String.new
174
172
  value_index = 0
175
173
  while $~['value'] != nil && value_index < $~['value'].size
176
- value ||= String.new
177
174
  if $~['value'][value_index] == '\\'
178
175
  escape = $~['value'].slice(value_index, 2)
179
176
  if TAG_ESCAPES.include? escape
@@ -233,7 +230,7 @@ module IRCParser
233
230
  tags.each.with_index do |tag, idx|
234
231
  key, value = tag
235
232
  buffer += key
236
- unless value.nil?
233
+ unless value.nil? || value.empty?
237
234
  buffer += '='
238
235
  value.each_char do |chr|
239
236
  if TAG_ESCAPES.has_value? chr
@@ -25,7 +25,7 @@ describe IRCParser::Message do
25
25
  @message = IRCParser::Message.parse @text
26
26
  end
27
27
  it 'should consist of the correct components' do
28
- tags = { 'tag1' => 'value1', 'tag2' => nil, 'vendor1/tag3' => 'value2', 'vendor2/tag4' => nil }
28
+ tags = { 'tag1' => 'value1', 'tag2' => '', 'vendor1/tag3' => 'value2', 'vendor2/tag4' => '' }
29
29
  parameters = [ 'param1', 'param2', 'param3 param3' ]
30
30
 
31
31
  _(@message.tags).must_equal tags
@@ -64,7 +64,7 @@ describe IRCParser::Message do
64
64
  @message = IRCParser::Message.parse @text
65
65
  end
66
66
  it 'should consist of the correct components' do
67
- tags = { 'tag1' => 'value1', 'tag2' => nil, 'vendor1/tag3' => 'value2', 'vendor2/tag4' => nil }
67
+ tags = { 'tag1' => 'value1', 'tag2' => '', 'vendor1/tag3' => 'value2', 'vendor2/tag4' => '' }
68
68
  parameters = [ 'param1', 'param2', 'param3 param3' ]
69
69
 
70
70
  _(@message.tags).must_equal tags
@@ -83,7 +83,7 @@ describe IRCParser::Message do
83
83
  @message = IRCParser::Message.parse @text
84
84
  end
85
85
  it 'should consist of the correct components' do
86
- tags = { 'tag1' => 'value1', 'tag2' => nil, 'vendor1/tag3' => 'value2', 'vendor2/tag4' => nil }
86
+ tags = { 'tag1' => 'value1', 'tag2' => '', 'vendor1/tag3' => 'value2', 'vendor2/tag4' => '' }
87
87
  parameters = [ 'param1', 'param2', 'param3 param3' ]
88
88
 
89
89
  _(@message.tags).must_equal tags
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ircparser
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.2
4
+ version: 0.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sadie Powell
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-12-31 00:00:00.000000000 Z
11
+ date: 2020-01-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: minitest