lib/sup/draft.rb in sup-0.0.6 vs lib/sup/draft.rb in sup-0.0.7

- old
+ new

@@ -8,33 +8,37 @@ @dir = dir @source = nil self.class.i_am_the_instance self end - def self.source_name; "drafts://"; end + def self.source_name; "sup://drafts"; end def self.source_id; 9999; end def new_source; @source = DraftLoader.new; end def write_draft offset = @source.gen_offset fn = @source.fn_for_offset offset File.open(fn, "w") { |f| yield f } - @source.each do |offset, labels| - m = Message.new :source => @source, :source_info => offset, :labels => labels + my_message = nil + @source.each do |thisoffset, theselabels| + m = Message.new :source => @source, :source_info => thisoffset, :labels => theselabels Index.add_message m - UpdateManager.relay :add, m + UpdateManager.relay self, :add, m + my_message = m if thisoffset == offset end + + my_message end def discard mid docid, entry = Index.load_entry_for_id mid raise ArgumentError, "can't find entry for draft: #{mid.inspect}" unless entry raise ArgumentError, "not a draft: source id #{entry[:source_id].inspect}, should be #{DraftManager.source_id.inspect} for #{mid.inspect} / docno #{docid}" unless entry[:source_id].to_i == DraftManager.source_id Index.drop_entry docid File.delete @source.fn_for_offset(entry[:source_info]) - UpdateManager.relay :delete, mid + UpdateManager.relay self, :delete, mid end end class DraftLoader < Source attr_accessor :dir @@ -46,13 +50,20 @@ @dir = dir end def id; DraftManager.source_id; end def to_s; DraftManager.source_name; end + def uri; DraftManager.source_name; end def each - Dir.entries(@dir).select { |x| x =~ /^\d+$/ }.sort_by { |x| x.to_i }.each { |id| yield [id, [:draft]] } + ids = get_ids + ids.each do |id| + if id >= cur_offset + self.cur_offset = id + 1 + yield [id, [:draft, :inbox]] + end + end end def gen_offset i = cur_offset while File.exists? fn_for_offset(i) @@ -94,10 +105,19 @@ end ret end def start_offset; 0; end - def end_offset; Dir.new(@dir).entries.sort.last.to_i; end + def end_offset + ids = get_ids + ids.empty? ? 0 : (ids.last + 1) + end + +private + + def get_ids + Dir.entries(@dir).select { |x| x =~ /^\d+$/ }.map { |x| x.to_i }.sort + end end Redwood::register_yaml(DraftLoader, %w(cur_offset)) end