Class: Redwood::Container

Inherits:
Object show all
Defined in:
lib/sup/thread.rb

Overview

recursive structure used internally to represent message trees as described by reply-to: and references: headers.

the ‘id’ field is the same as the message id. but the message might be empty, in the case that we represent a message that was referenced by another message (as an ancestor) but never received.

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(id) ⇒ Container

Returns a new instance of Container.



160
161
162
163
164
165
# File 'lib/sup/thread.rb', line 160

def initialize id
  raise "non-String #{id.inspect}" unless id.is_a? String
  @id = id
  @message, @parent, @thread = nil, nil, nil
  @children = []
end

Instance Attribute Details

#childrenObject

Returns the value of attribute children.



158
159
160
# File 'lib/sup/thread.rb', line 158

def children
  @children
end

#idObject

Returns the value of attribute id.



158
159
160
# File 'lib/sup/thread.rb', line 158

def id
  @id
end

#messageObject

Returns the value of attribute message.



158
159
160
# File 'lib/sup/thread.rb', line 158

def message
  @message
end

#parentObject

Returns the value of attribute parent.



158
159
160
# File 'lib/sup/thread.rb', line 158

def parent
  @parent
end

#threadObject

Returns the value of attribute thread.



158
159
160
# File 'lib/sup/thread.rb', line 158

def thread
  @thread
end

Instance Method Details

#==(o) ⇒ Object



182
# File 'lib/sup/thread.rb', line 182

def == o; Container === o && id == o.id; end

#dateObject



204
# File 'lib/sup/thread.rb', line 204

def date; find_attr :date; end

#descendant_of?(o) ⇒ Boolean

Returns:

  • (Boolean)


174
175
176
177
178
179
180
# File 'lib/sup/thread.rb', line 174

def descendant_of? o
  if o == self
    true
  else
    @parent && @parent.descendant_of?(o)
  end
end

#dump_recursive(f = $stdout, indent = 0, root = true, parent = nil) ⇒ Object



215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
# File 'lib/sup/thread.rb', line 215

def dump_recursive f=$stdout, indent=0, root=true, parent=nil
  raise "inconsistency" unless parent.nil? || parent.children.include?(self)
  unless root
    f.print " " * indent
    f.print "+->"
  end
  line = #"[#{useful? ? 'U' : ' '}] " +
    if @message
      "[#{thread}] #{@message.subj} " ##{@message.refs.inspect} / #{@message.replytos.inspect}"
    else
      "<no message>"
    end

  f.puts "#{id} #{line}"#[0 .. (105 - indent)]
  indent += 3
  @children.each { |c| c.dump_recursive f, indent, false, self }
end

#each_with_stuff(parent = nil) {|_self, 0, parent| ... } ⇒ Object

Yields:

Yield Parameters:



167
168
169
170
171
172
# File 'lib/sup/thread.rb', line 167

def each_with_stuff parent=nil
  yield self, 0, parent
  @children.each do |c|
    c.each_with_stuff(self) { |cc, d, par| yield cc, d + 1, par }
  end
end

#empty?Boolean

Returns:

  • (Boolean)


184
# File 'lib/sup/thread.rb', line 184

def empty?; @message.nil?; end

#find_attr(attr) ⇒ Object



196
197
198
199
200
201
202
# File 'lib/sup/thread.rb', line 196

def find_attr attr
  if empty?
    @children.argfind { |c| c.find_attr attr }
  else
    @message.send attr
  end
end

#first_useful_descendantObject



188
189
190
191
192
193
194
# File 'lib/sup/thread.rb', line 188

def first_useful_descendant
  if empty? && @children.size == 1
    @children.first.first_useful_descendant
  else
    self
  end
end

#is_reply?Boolean

Returns:

  • (Boolean)


206
# File 'lib/sup/thread.rb', line 206

def is_reply?; subj && Message.subject_is_reply?(subj); end

#rootObject



186
# File 'lib/sup/thread.rb', line 186

def root; root? ? self : @parent.root; end

#root?Boolean

Returns:

  • (Boolean)


185
# File 'lib/sup/thread.rb', line 185

def root?; @parent.nil?; end

#subjObject



203
# File 'lib/sup/thread.rb', line 203

def subj; find_attr :subj; end

#to_sObject



208
209
210
211
212
213
# File 'lib/sup/thread.rb', line 208

def to_s
  [ "<#{id}",
    (@parent.nil? ? nil : "parent=#{@parent.id}"),
    (@children.empty? ? nil : "children=#{@children.map { |c| c.id }.inspect}"),
  ].compact.join(" ") + ">"
end