Fix up Rubinius specific library specs.
[rbx.git] / lib / codearchive.rb
blob0afe5f6644c9a959f081a8e4acc8dda79a46993a
1 class CodeArchive
2   def initialize(path)
3     @path = path
4     reload()
5   end
6   
7   def reload
8     if File.exists?(@path)
9       @data = Archive.list_files(@path)
10       @times = {}
11       @data.each do |info|
12         @times[info[0]] = info[1]
13       end
14     else
15       @data = []
16       @times = {}
17     end
18   end
19   
20   attr_accessor :data
21   attr_accessor :times
22   
23   def files
24     out = []
25     @data.each { |t| out << t.at(0) }
26     return out
27   end
28   
29   def last_modified(file)
30     if time = @times[file]
31       return time
32     elsif file.suffix?(".rb")
33       return @times["#{file}c"]
34     else
35       return nil
36     end
37   end
38   
39   def out_of_date?(file)
40     cur = last_modified(file)
41     return true unless cur
42     
43     stat = File.stat(file)
44     stat.mtime > cur
45   end
46   
47   def find_out_of_date(dir)
48     ood = []
49     Dir["#{dir}/*.rb"].each do |file|
50       ood << file if out_of_date?(file)
51     end
52     return ood
53   end
54   
55   def add_file(name, method)
56     # Save blah.rb as blah.rbc
57     if name.suffix?(".rb")
58       name = "#{name}c"
59     end
60     
61     Archive.add_object @path, name, method
62     reload()
63     return true
64   end
65     
66   def refresh_file(file)
67     return false unless out_of_date?(file)
68     
69     meth = Compile.compile_file(file)
70     add_file(file, meth)
71   end
72   
73   def update_from_directory(dir)
74     added = find_out_of_date(dir)
75     added.each do |file|
76       yield file if block_given?
77       meth = Compile.compile_file(file)
78       add_file(file, meth)
79     end
80     
81     return added
82   end
83 end