From ba97246db8a78fb86b8935208df9c493efeb42a6 Mon Sep 17 00:00:00 2001 From: Marcin Kulik Date: Fri, 4 May 2012 21:21:05 +0200 Subject: [PATCH] Time compression --- app/decorators/asciicast_decorator.rb | 21 +++++++++++++++---- app/models/asciicast.rb | 2 +- app/views/asciicasts/_form.html.erb | 16 ++++++++++++++ ...91706_add_time_compression_to_asciicast.rb | 5 +++++ db/schema.rb | 5 +++-- 5 files changed, 42 insertions(+), 7 deletions(-) create mode 100644 db/migrate/20120504191706_add_time_compression_to_asciicast.rb diff --git a/app/decorators/asciicast_decorator.rb b/app/decorators/asciicast_decorator.rb index d573e4a..252bfe4 100644 --- a/app/decorators/asciicast_decorator.rb +++ b/app/decorators/asciicast_decorator.rb @@ -5,11 +5,13 @@ class AsciicastDecorator < ApplicationDecorator THUMBNAIL_WIDTH = 20 THUMBNAIL_HEIGHT = 10 + MAX_DELAY = 5.0 def as_json(*args) data = model.as_json(*args) data['escaped_stdout_data'] = escaped_stdout_data - data['stdout_timing_data'] = stdout_timing_data + data['stdout_timing_data'], saved_time = stdout_timing_data + data['duration'] = data['duration'] - saved_time data end @@ -23,14 +25,25 @@ class AsciicastDecorator < ApplicationDecorator end def stdout_timing_data + saved_time = 0 + if data = stdout_timing.read - Bzip2.uncompress(data).lines.map do |line| + data = Bzip2.uncompress(data).lines.map do |line| delay, n = line.split - [delay.to_f, n.to_i] + delay = delay.to_f + + if time_compression && delay > MAX_DELAY + saved_time += (delay - MAX_DELAY) + delay = MAX_DELAY + end + + [delay, n.to_i] end else - nil + data = nil end + + [data, saved_time] end def os diff --git a/app/models/asciicast.rb b/app/models/asciicast.rb index 0735c1c..b37871a 100644 --- a/app/models/asciicast.rb +++ b/app/models/asciicast.rb @@ -16,7 +16,7 @@ class Asciicast < ActiveRecord::Base before_create :assign_user, :unless => :user attr_accessible :meta, :stdout, :stdout_timing, :stdin, :stdin_timing, - :title, :description + :title, :description, :time_compression def self.assign_user(user_token, user) where(:user_id => nil, :user_token => user_token). diff --git a/app/views/asciicasts/_form.html.erb b/app/views/asciicasts/_form.html.erb index e4665c2..41c2e37 100644 --- a/app/views/asciicasts/_form.html.erb +++ b/app/views/asciicasts/_form.html.erb @@ -20,6 +20,22 @@ +
+ <%= f.label :time_compression, :class => 'control-label' %> +
+ + + +
+
+
<%= f.submit 'Update asciicast', :class => 'btn btn-primary' %> <%= link_to 'Cancel', asciicast_path, :class => 'btn' %> diff --git a/db/migrate/20120504191706_add_time_compression_to_asciicast.rb b/db/migrate/20120504191706_add_time_compression_to_asciicast.rb new file mode 100644 index 0000000..5e9b4a7 --- /dev/null +++ b/db/migrate/20120504191706_add_time_compression_to_asciicast.rb @@ -0,0 +1,5 @@ +class AddTimeCompressionToAsciicast < ActiveRecord::Migration + def change + add_column :asciicasts, :time_compression, :boolean, :null => false, :default => true + end +end diff --git a/db/schema.rb b/db/schema.rb index 0df105f..63d74b0 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -11,7 +11,7 @@ # # It's strongly recommended to check this file into your version control system. -ActiveRecord::Schema.define(:version => 20120409142151) do +ActiveRecord::Schema.define(:version => 20120504191706) do create_table "asciicasts", :force => true do |t| t.integer "user_id" @@ -36,7 +36,8 @@ ActiveRecord::Schema.define(:version => 20120409142151) do t.string "username" t.text "snapshot" t.integer "comments_count", :default => 0, :null => false - t.integer "likes_count", :default => 0, :null => false + t.integer "likes_count", :default => 0, :null => false + t.boolean "time_compression", :default => true, :null => false end add_index "asciicasts", ["created_at"], :name => "index_asciicasts_on_created_at"