packet 0.1.0 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,127 +0,0 @@
1
- # BufferedTokenizer - Statefully split input data by a specifiable token
2
- #
3
- # Authors:: Tony Arcieri, Martin Emde
4
- #
5
- #----------------------------------------------------------------------------
6
- #
7
- # Copyright (C) 2006-07 by Tony Arcieri and Martin Emde
8
- #
9
- # Distributed under the Ruby license (http://www.ruby-lang.org/en/LICENSE.txt)
10
- #
11
- #---------------------------------------------------------------------------
12
- #
13
-
14
- # (C)2006 Tony Arcieri, Martin Emde
15
- # Distributed under the Ruby license (http://www.ruby-lang.org/en/LICENSE.txt)
16
-
17
- # BufferedTokenizer takes a delimiter upon instantiation, or acts line-based
18
- # by default. It allows input to be spoon-fed from some outside source which
19
- # receives arbitrary length datagrams which may-or-may-not contain the token
20
- # by which entities are delimited.
21
-
22
- class BufferedTokenizer
23
- # New BufferedTokenizers will operate on lines delimited by "\n" by default
24
- # or allow you to specify any delimiter token you so choose, which will then
25
- # be used by String#split to tokenize the input data
26
- def initialize(delimiter = "\n", size_limit = nil)
27
- # Store the specified delimiter
28
- @delimiter = delimiter
29
-
30
- # Store the specified size limitation
31
- @size_limit = size_limit
32
-
33
- # The input buffer is stored as an array. This is by far the most efficient
34
- # approach given language constraints (in C a linked list would be a more
35
- # appropriate data structure). Segments of input data are stored in a list
36
- # which is only joined when a token is reached, substantially reducing the
37
- # number of objects required for the operation.
38
- @input = []
39
-
40
- # Size of the input buffer
41
- @input_size = 0
42
- end
43
-
44
- # Extract takes an arbitrary string of input data and returns an array of
45
- # tokenized entities, provided there were any available to extract. This
46
- # makes for easy processing of datagrams using a pattern like:
47
- #
48
- # tokenizer.extract(data).map { |entity| Decode(entity) }.each do ...
49
- def extract(data)
50
- # Extract token-delimited entities from the input string with the split command.
51
- # There's a bit of craftiness here with the -1 parameter. Normally split would
52
- # behave no differently regardless of if the token lies at the very end of the
53
- # input buffer or not (i.e. a literal edge case) Specifying -1 forces split to
54
- # return "" in this case, meaning that the last entry in the list represents a
55
- # new segment of data where the token has not been encountered
56
- entities = data.split @delimiter, -1
57
-
58
- # Check to see if the buffer has exceeded capacity, if we're imposing a limit
59
- if @size_limit
60
- raise 'input buffer full' if @input_size + entities.first.size > @size_limit
61
- @input_size += entities.first.size
62
- end
63
-
64
- # Move the first entry in the resulting array into the input buffer. It represents
65
- # the last segment of a token-delimited entity unless it's the only entry in the list.
66
- @input << entities.shift
67
-
68
- # If the resulting array from the split is empty, the token was not encountered
69
- # (not even at the end of the buffer). Since we've encountered no token-delimited
70
- # entities this go-around, return an empty array.
71
- return [] if entities.empty?
72
-
73
- # At this point, we've hit a token, or potentially multiple tokens. Now we can bring
74
- # together all the data we've buffered from earlier calls without hitting a token,
75
- # and add it to our list of discovered entities.
76
- entities.unshift @input.join
77
-
78
- =begin
79
- # Note added by FC, 10Jul07. This paragraph contains a regression. It breaks
80
- # empty tokens. Think of the empty line that delimits an HTTP header. It will have
81
- # two "\n" delimiters in a row, and this code mishandles the resulting empty token.
82
- # It someone figures out how to fix the problem, we can re-enable this code branch.
83
- # Multi-character token support.
84
- # Split any tokens that were incomplete on the last iteration buf complete now.
85
- entities.map! do |e|
86
- e.split @delimiter, -1
87
- end
88
- # Flatten the resulting array. This has the side effect of removing the empty
89
- # entry at the end that was produced by passing -1 to split. Add it again if
90
- # necessary.
91
- if (entities[-1] == [])
92
- entities.flatten! << []
93
- else
94
- entities.flatten!
95
- end
96
- =end
97
-
98
- # Now that we've hit a token, joined the input buffer and added it to the entities
99
- # list, we can go ahead and clear the input buffer. All of the segments that were
100
- # stored before the join can now be garbage collected.
101
- @input.clear
102
-
103
- # The last entity in the list is not token delimited, however, thanks to the -1
104
- # passed to split. It represents the beginning of a new list of as-yet-untokenized
105
- # data, so we add it to the start of the list.
106
- @input << entities.pop
107
-
108
- # Set the new input buffer size, provided we're keeping track
109
- @input_size = @input.first.size if @size_limit
110
-
111
- # Now we're left with the list of extracted token-delimited entities we wanted
112
- # in the first place. Hooray!
113
- entities
114
- end
115
-
116
- # Flush the contents of the input buffer, i.e. return the input buffer even though
117
- # a token has not yet been encountered
118
- def flush
119
- buffer = @input.join
120
- @input.clear
121
- buffer
122
- end
123
-
124
- def empty?
125
- @input.empty?
126
- end
127
- end
@@ -1,19 +0,0 @@
1
- module Packet
2
- class CPUWorker < Packet::Worker
3
- @@worker_type = 'cpu'
4
- cattr_accessor :worker_type
5
- # this is the place where all the worker specific inititlization has to be done
6
- def worker_init
7
- @worker_started = true
8
- end
9
-
10
- def receive_data p_data
11
- p p_data
12
- end
13
-
14
- def receive_internal_data p_data
15
- p p_data
16
- end
17
-
18
- end
19
- end
@@ -1,210 +0,0 @@
1
- # $Id: deferrable.rb 534 2007-09-15 23:06:15Z blackhedd $
2
- #
3
- # Author:: Francis Cianfrocca (gmail: blackhedd)
4
- # Homepage:: http://rubyeventmachine.com
5
- # Date:: 16 Jul 2006
6
- #
7
- # See EventMachine and EventMachine::Connection for documentation and
8
- # usage examples.
9
- #
10
- #----------------------------------------------------------------------------
11
- #
12
- # Copyright (C) 2006-07 by Francis Cianfrocca. All Rights Reserved.
13
- # Gmail: blackhedd
14
- #
15
- # This program is free software; you can redistribute it and/or modify
16
- # it under the terms of either: 1) the GNU General Public License
17
- # as published by the Free Software Foundation; either version 2 of the
18
- # License, or (at your option) any later version; or 2) Ruby's License.
19
- #
20
- # See the file COPYING for complete licensing information.
21
- #
22
- #---------------------------------------------------------------------------
23
- #
24
- #
25
-
26
- # FIXME: Packet doesn't support timers on Deferables yet
27
-
28
- require 'forwardable'
29
-
30
- module Packet
31
-
32
- module Deferrable
33
-
34
- # Specify a block to be executed if and when the Deferrable object receives
35
- # a status of :succeeded. See #set_deferred_status for more information.
36
- #
37
- # Calling this method on a Deferrable object whose status is not yet known
38
- # will cause the callback block to be stored on an internal list.
39
- # If you call this method on a Deferrable whose status is :succeeded, the
40
- # block will be executed immediately, receiving the parameters given to the
41
- # prior #set_deferred_status call.
42
- #
43
- #--
44
- # If there is no status, add a callback to an internal list.
45
- # If status is succeeded, execute the callback immediately.
46
- # If status is failed, do nothing.
47
- #
48
- def callback &block
49
- return unless block
50
- if @deferred_status == :succeeded
51
- block.call(*@deferred_args)
52
- elsif @deferred_status != :failed
53
- @callbacks ||= []
54
- @callbacks.unshift block # << block
55
- end
56
- end
57
-
58
- # Specify a block to be executed if and when the Deferrable object receives
59
- # a status of :failed. See #set_deferred_status for more information.
60
- #--
61
- # If there is no status, add an errback to an internal list.
62
- # If status is failed, execute the errback immediately.
63
- # If status is succeeded, do nothing.
64
- #
65
- def errback &block
66
- return unless block
67
- if @deferred_status == :failed
68
- block.call(*@deferred_args)
69
- elsif @deferred_status != :succeeded
70
- @errbacks ||= []
71
- @errbacks.unshift block # << block
72
- end
73
- end
74
-
75
- # Sets the "disposition" (status) of the Deferrable object. See also the large set of
76
- # sugarings for this method.
77
- # Note that if you call this method without arguments,
78
- # no arguments will be passed to the callback/errback.
79
- # If the user has coded these with arguments, then the
80
- # user code will throw an argument exception.
81
- # Implementors of deferrable classes <b>must</b>
82
- # document the arguments they will supply to user callbacks.
83
- #
84
- # OBSERVE SOMETHING VERY SPECIAL here: you may call this method even
85
- # on the INSIDE of a callback. This is very useful when a previously-registered
86
- # callback wants to change the parameters that will be passed to subsequently-registered
87
- # ones.
88
- #
89
- # You may give either :succeeded or :failed as the status argument.
90
- #
91
- # If you pass :succeeded, then all of the blocks passed to the object using the #callback
92
- # method (if any) will be executed BEFORE the #set_deferred_status method returns. All of the blocks
93
- # passed to the object using #errback will be discarded.
94
- #
95
- # If you pass :failed, then all of the blocks passed to the object using the #errback
96
- # method (if any) will be executed BEFORE the #set_deferred_status method returns. All of the blocks
97
- # passed to the object using # callback will be discarded.
98
- #
99
- # If you pass any arguments to #set_deferred_status in addition to the status argument,
100
- # they will be passed as arguments to any callbacks or errbacks that are executed.
101
- # It's your responsibility to ensure that the argument lists specified in your callbacks and
102
- # errbacks match the arguments given in calls to #set_deferred_status, otherwise Ruby will raise
103
- # an ArgumentError.
104
- #
105
- # --
106
- # We're shifting callbacks off and discarding them as we execute them.
107
- # This is valid because by definition callbacks are executed no more than
108
- # once. It also has the magic effect of permitting recursive calls, which
109
- # means that a callback can call #set_deferred_status and change the parameters
110
- # that will be sent to subsequent callbacks down the chain.
111
- #
112
- # Changed @callbacks and @errbacks from push/shift to unshift/pop, per suggestion
113
- # by Kirk Haines, to work around the memory leak bug that still exists in many Ruby
114
- # versions.
115
- #
116
- # Changed 15Sep07: after processing callbacks or errbacks, CLEAR the other set of
117
- # handlers. This gets us a little closer to the behavior of Twisted's "deferred,"
118
- # which only allows status to be set once. Prior to making this change, it was possible
119
- # to "succeed" a Deferrable (triggering its callbacks), and then immediately "fail" it,
120
- # triggering its errbacks! That is clearly undesirable, but it's just as undesirable
121
- # to raise an exception is status is set more than once on a Deferrable. The latter
122
- # behavior would invalidate the idiom of resetting arguments by setting status from
123
- # within a callback or errback, but more seriously it would cause spurious errors
124
- # if a Deferrable was timed out and then an attempt was made to succeed it. See the
125
- # comments under the new method #timeout.
126
- #
127
- def set_deferred_status status, *args
128
- #cancel_timeout
129
- @deferred_status = status
130
- @deferred_args = args
131
- case @deferred_status
132
- when :succeeded
133
- if @callbacks
134
- while cb = @callbacks.pop
135
- cb.call(*@deferred_args)
136
- end
137
- end
138
- @errbacks.clear if @errbacks
139
- when :failed
140
- if @errbacks
141
- while eb = @errbacks.pop
142
- eb.call(*@deferred_args)
143
- end
144
- end
145
- @callbacks.clear if @callbacks
146
- end
147
- end
148
-
149
-
150
- # Setting a timeout on a Deferrable causes it to go into the failed state after
151
- # the Timeout expires (passing no arguments to the object's errbacks).
152
- # Setting the status at any time prior to a call to the expiration of the timeout
153
- # will cause the timer to be cancelled.
154
- #--
155
- #
156
- #
157
- def timeout seconds
158
- cancel_timeout
159
- me = self
160
- @deferred_timeout = EventMachine::Timer.new(seconds) {me.fail}
161
- end
162
-
163
-
164
- # Cancels an outstanding timeout if any. Undoes the action of #timeout.
165
- #
166
- #
167
- def cancel_timeout
168
- if @deferred_timeout
169
- @deferred_timeout.cancel
170
- @deferred_timeout = nil
171
- end
172
- end
173
-
174
-
175
- # Equivalent to set_deferred_status(:succeeded, ...)
176
- #
177
- def set_deferred_success *args
178
- set_deferred_status :succeeded, *args
179
- end
180
-
181
- # Equivalent to set_deferred_status(:failed, ...)
182
- #
183
- def set_deferred_failure *args
184
- set_deferred_status :failed, *args
185
- end
186
-
187
- # And still more sugar
188
- #
189
- def succeed *args
190
- set_deferred_success(*args)
191
- end
192
-
193
- # Can't get enough sugar
194
- #
195
- def fail *args
196
- set_deferred_failure(*args)
197
- end
198
- end
199
-
200
-
201
- # DefaultDeferrable is an otherwise empty class that includes Deferrable.
202
- # This is very useful when you just need to return a Deferrable object
203
- # as a way of communicating deferred status to some other part of a program.
204
- #
205
- class DefaultDeferrable
206
- include Deferrable
207
- end
208
-
209
- end
210
-
@@ -1,6 +0,0 @@
1
- module Packet
2
- class IOWorker < Packet::Worker
3
- @@worker_type = :io
4
- cattr_accessor :worker_type
5
- end
6
- end
@@ -1,125 +0,0 @@
1
- # FIXME: ultimate goal should be remove dependence from activesupport gem altogether.
2
-
3
- class Object
4
- def deep_copy
5
- Marshal.load(Marshal.dump(self))
6
- end
7
-
8
- def nothing?
9
- if respond_to?(:empty?) && respond_to?(:strip)
10
- empty? or strip.empty?
11
- elsif respond_to?(:empty?)
12
- empty?
13
- elsif respond_to?(:zero?)
14
- zero?
15
- else
16
- !self
17
- end
18
- end
19
-
20
- def clean!
21
- if respond_to?(:empty?) && respond_to?(:strip)
22
- return nil if empty?
23
- (strip.empty?) ? nil : (self.strip)
24
- elsif respond_to?(:empty?)
25
- empty? ? nil : self
26
- else
27
- self
28
- end
29
- end
30
-
31
- def blank?
32
- if respond_to?(:empty?) && respond_to?(:strip)
33
- empty? or strip.empty?
34
- elsif respond_to?(:empty?)
35
- empty?
36
- else
37
- !self
38
- end
39
- end
40
-
41
- def self.metaclass; class << self; self; end; end
42
-
43
- def self.iattr_accessor *args
44
-
45
- metaclass.instance_eval do
46
- attr_accessor *args
47
- args.each do |attr|
48
- define_method("set_#{attr}") do |b_value|
49
- self.send("#{attr}=",b_value)
50
- end
51
- end
52
- end
53
-
54
- args.each do |attr|
55
- class_eval do
56
- define_method(attr) do
57
- self.class.send(attr)
58
- end
59
- define_method("#{attr}=") do |b_value|
60
- self.class.send("#{attr}=",b_value)
61
- end
62
- end
63
- end
64
- end
65
- end
66
-
67
-
68
- class NilClass #:nodoc:
69
- def blank?
70
- true
71
- end
72
- end
73
-
74
- class FalseClass #:nodoc:
75
- def blank?
76
- true
77
- end
78
- end
79
-
80
- class TrueClass #:nodoc:
81
- def blank?
82
- false
83
- end
84
- end
85
-
86
- class Array #:nodoc:
87
- alias_method :blank?, :empty?
88
- def clean!
89
- (empty?) ? nil : self
90
- end
91
-
92
- def extract_options!
93
- last.is_a?(Hash) ? pop : {}
94
- end
95
- end
96
-
97
- class Hash #:nodoc:
98
- alias_method :blank?, :empty?
99
- def clean!
100
- (empty?) ? nil : self
101
- end
102
- end
103
-
104
- class String #:nodoc:
105
- def blank?
106
- empty? || strip.empty?
107
- end
108
-
109
- def clean!
110
- return nil if empty?
111
- t_val = self.strip
112
- (t_val.empty?) ? nil : t_val
113
- end
114
-
115
- def classify
116
- word_parts = split('_')
117
- return word_parts.map { |x| x.capitalize}.join
118
- end
119
- end
120
-
121
- class Numeric #:nodoc:
122
- def blank?
123
- false
124
- end
125
- end