lib/smallcage/commands/update.rb in smallcage-0.2.6 vs lib/smallcage/commands/update.rb in smallcage-0.2.7

- old
+ new

@@ -1,35 +1,39 @@ module SmallCage::Commands + # + # 'smc update' command + # class Update include SmallCage def self.execute(opts) - self.new(opts).execute + new(opts).execute end def initialize(opts) @opts = opts end def execute start = Time.now target = Pathname.new(@opts[:path]) - unless target.exist? - raise "target directory or file does not exist.: " + target.to_s - end + fail 'target directory or file does not exist.: ' + target.to_s unless target.exist? + @loader = Loader.new(target) @renderer = Renderer.new(@loader) @list = UpdateList.create(@loader.root, target) + STDERR.puts 'WARN: Can\'t load tmp/list.yml file.' if @list.load_error + render_smc_files expire_old_files @list.expire @list.save count = @list.update_count elapsed = Time.now - start - puts "-- #{count} files. #{"%.3f" % elapsed} sec." + - " #{"%.3f" % (count == 0 ? 0 : elapsed/count)} sec/file." unless @opts[:quiet] + puts "-- #{count} files. #{sprintf('%.3f', elapsed)} sec." + + " #{sprintf('%.3f', count == 0 ? 0 : elapsed / count)} sec/file." unless @opts[:quiet] end def expire_old_files(uris) root = @loader.root uris.each do |uri| @@ -48,42 +52,51 @@ end end private :render_smc_files def render_smc_obj(obj) - uris = @renderer.render(obj["template"] + ".uri", obj) + uris = @renderer.render(obj['template'] + '.uri', obj) if uris render_multi(obj, uris.split(/\r\n|\r|\n/)) else render_single(obj) end end private :render_smc_obj def render_single(obj, mtime = nil) - mark = obj["path"].exist? ? "U " : "A " - mtime ||= obj["path"].smc.stat.mtime.to_i - result = @renderer.render(obj["template"], obj) + mark = obj['path'].exist? ? 'U ' : 'A ' + mtime ||= obj['path'].smc.stat.mtime.to_i + + if @opts[:fast] + last_mtime = @list.mtime(obj['uri'].smc) + if mtime == last_mtime + @list.update(obj['uri'].smc, mtime, String.new(obj['uri'])) + return + end + end + + result = @renderer.render(obj['template'], obj) result = after_rendering_filters(obj, result) output_result(obj, result) - puts mark + obj["uri"] unless @opts[:quiet] + puts mark + obj['uri'] unless @opts[:quiet] # create new uri String to remove smc instance-specific method. - @list.update(obj["uri"].smc, mtime, String.new(obj["uri"])) + @list.update(obj['uri'].smc, mtime, String.new(obj['uri'])) end private :render_single def render_multi(obj, uris) obj['uris'] ||= uris - uris = uris.map {|uri| uri.strip } + uris = uris.map { |uri| uri.strip } smcuri = obj['uri'].smc smcpath = obj['path'].smc base = obj['path'].parent mtime = smcpath.stat.mtime.to_i uris.each_with_index do |uri, index| next if uri.empty? - docpath = DocumentPath.create_with_uri(@loader.root, uri, base) + docpath = DocumentPath.create_with_uri(@loader.root, uri, base) next if docpath.path.directory? FileUtils.mkpath(docpath.path.parent) obj['uri'] = DocumentPath.add_smc_method(docpath.uri, smcuri) obj['path'] = DocumentPath.add_smc_method(docpath.path, smcpath) obj['cursor'] = index @@ -91,19 +104,19 @@ end end private :render_multi def after_rendering_filters(obj, result) - filters = @loader.filters("after_rendering_filters") + filters = @loader.filters('after_rendering_filters') filters.each do |f| result = f.after_rendering_filter(obj, result) end - return result + result end private :after_rendering_filters def output_result(obj, str) - open(obj["path"], "w") do |io| + open(obj['path'], 'w') do |io| io << str end end private :output_result end