]> git.cworth.org Git - sup/blob - lib/sup.rb
final (?) 0.0.7 updates
[sup] / lib / sup.rb
1 require 'rubygems'
2 require 'yaml'
3 require 'zlib'
4 require 'thread'
5 require 'fileutils'
6
7 class Object
8   ## this is for debugging purposes because i keep calling #id on the
9   ## wrong object and i want it to throw an exception
10   def id
11     raise "wrong id called on #{self.inspect}"
12   end
13 end
14
15 module Redwood
16   VERSION = "0.0.7"
17
18   BASE_DIR   = ENV["SUP_BASE"] || File.join(ENV["HOME"], ".sup")
19   CONFIG_FN  = File.join(BASE_DIR, "config.yaml")
20   SOURCE_FN  = File.join(BASE_DIR, "sources.yaml")
21   LABEL_FN   = File.join(BASE_DIR, "labels.txt")
22   PERSON_FN  = File.join(BASE_DIR, "people.txt")
23   CONTACT_FN = File.join(BASE_DIR, "contacts.txt")
24   DRAFT_DIR  = File.join(BASE_DIR, "drafts")
25   SENT_FN    = File.join(BASE_DIR, "sent.mbox")
26
27   YAML_DOMAIN = "masanjin.net"
28   YAML_DATE = "2006-10-01"
29
30 ## record exceptions thrown in threads nicely
31   $exception = nil
32   def reporting_thread
33     ::Thread.new do
34       begin
35         yield
36       rescue Exception => e
37         File.open("sup-exception-log.txt", "w") do |f|
38           f.puts "--- #{e.class.name} at #{Time.now}"
39           f.puts e.message, e.backtrace
40         end
41         $exception ||= e
42         raise
43       end
44     end
45   end
46   module_function :reporting_thread
47
48 ## one-stop shop for yamliciousness
49   def register_yaml klass, props
50     vars = props.map { |p| "@#{p}" }
51     path = klass.name.gsub(/::/, "/")
52     
53     klass.instance_eval do
54       define_method(:to_yaml_properties) { vars }
55       define_method(:to_yaml_type) { "!#{YAML_DOMAIN},#{YAML_DATE}/#{path}" }
56     end
57
58     YAML.add_domain_type("#{YAML_DOMAIN},#{YAML_DATE}", path) do |type, val|
59       klass.new(*props.map { |p| val[p] })
60     end
61   end
62
63   def save_yaml_obj object, fn, compress=false
64     if compress
65       Zlib::GzipWriter.open(fn) { |f| f.puts object.to_yaml }
66     else
67       File.open(fn, "w") { |f| f.puts object.to_yaml }
68     end
69   end
70
71   def load_yaml_obj fn, compress=false
72     if File.exists? fn
73       if compress
74         Zlib::GzipReader.open(fn) { |f| YAML::load f }
75       else
76         YAML::load_file fn
77       end
78     end
79   end
80
81   def start
82     Redwood::PersonManager.new Redwood::PERSON_FN
83     Redwood::SentManager.new Redwood::SENT_FN
84     Redwood::ContactManager.new Redwood::CONTACT_FN
85     Redwood::LabelManager.new Redwood::LABEL_FN
86     Redwood::AccountManager.new $config[:accounts]
87     Redwood::DraftManager.new Redwood::DRAFT_DIR
88     Redwood::UpdateManager.new
89     Redwood::PollManager.new
90   end
91
92   def finish
93     Redwood::LabelManager.save
94     Redwood::ContactManager.save
95     Redwood::PersonManager.save
96   end
97
98   module_function :register_yaml, :save_yaml_obj, :load_yaml_obj, :start, :finish
99 end
100
101 ## set up default configuration file
102 if File.exists? Redwood::CONFIG_FN
103   $config = Redwood::load_yaml_obj Redwood::CONFIG_FN
104 else
105   $config = {
106     :accounts => {
107       :default => {
108         :name => "Your Name Here",
109         :email => "your.email.here@domain.tld",
110         :alternates => [],
111         :sendmail => "/usr/sbin/sendmail -oem -ti",
112         :signature => File.join(ENV["HOME"], ".signature")
113       }
114     },
115     :editor => ENV["EDITOR"] || "/usr/bin/vi",
116   }
117   begin
118     FileUtils.mkdir_p Redwood::BASE_DIR
119     Redwood::save_yaml_obj $config, Redwood::CONFIG_FN
120   rescue StandardError => e
121     $stderr.puts "warning: #{e.message}"
122   end
123 end
124
125 require "sup/util"
126 require "sup/update"
127 require "sup/message"
128 require "sup/source"
129 require "sup/mbox"
130 require "sup/imap"
131 require "sup/person"
132 require "sup/account"
133 require "sup/thread"
134 require "sup/index"
135 require "sup/textfield"
136 require "sup/buffer"
137 require "sup/keymap"
138 require "sup/mode"
139 require "sup/colormap"
140 require "sup/label"
141 require "sup/contact"
142 require "sup/tagger"
143 require "sup/draft"
144 require "sup/poll"
145 require "sup/modes/scroll-mode"
146 require "sup/modes/text-mode"
147 require "sup/modes/line-cursor-mode"
148 require "sup/modes/help-mode"
149 require "sup/modes/edit-message-mode"
150 require "sup/modes/compose-mode"
151 require "sup/modes/resume-mode"
152 require "sup/modes/forward-mode"
153 require "sup/modes/reply-mode"
154 require "sup/modes/label-list-mode"
155 require "sup/modes/contact-list-mode"
156 require "sup/modes/thread-view-mode"
157 require "sup/modes/thread-index-mode"
158 require "sup/modes/label-search-results-mode"
159 require "sup/modes/search-results-mode"
160 require "sup/modes/person-search-results-mode"
161 require "sup/modes/inbox-mode"
162 require "sup/modes/buffer-list-mode"
163 require "sup/modes/log-mode"
164 require "sup/modes/poll-mode"
165 require "sup/logger"
166 require "sup/sent"
167
168 module Redwood
169   def log s; Logger.log s; end
170   module_function :log
171 end
172
173 $:.each do |base|
174   d = File.join base, "sup/share/modes/"
175   Redwood::Mode.load_all_modes d if File.directory? d
176 end