headless-muse 1.1.0 → 1.1.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: f3ef46e8f92d17bf336aae8bab33f7e138dd4619
4
- data.tar.gz: 36029054c983b680a1996121ae0256a52c5f034a
3
+ metadata.gz: a2bebc3311027182542cd8a5374d6f56074b9954
4
+ data.tar.gz: 9a26b8fb2b5b68ff99423af6501e2ceca992ec90
5
5
  SHA512:
6
- metadata.gz: a4e524a612efbeab185f98efa58ba2c7490a391bc02bdee9a327b8760d62837ed76f575c4756c20aa3442978b17d0305bf0a261c8eb7e7391652c5e3b1006917
7
- data.tar.gz: 0df9462f894b68182517fe89552b22fc5ce09f1143d44233efa46e9fd5dece0d559e049bb4311e752fb69757608871db0e0a922f1b4006cc087566d4b7b12254
6
+ metadata.gz: 976b2176d38bc395b96e574e6252a893f4e44df9d9d0920c5f46c542bbe1737b37725fb6f2d060672985fce9e88598bf8892861a6b02e29d0311dd741cb36d56
7
+ data.tar.gz: 0ee6c18e1b05285179dd1f884896d8fd39b2b496e628042a61237183b8dcdcb660329b1d55eb563337f5a9b2ff3aa21652310811ca21d6d00a375f3a758256c8
@@ -3,7 +3,7 @@ case "$FFMPEG_VERSION" in
3
3
  2.3)
4
4
  sudo add-apt-repository ppa:archivematica/externals -y
5
5
  sudo apt-get update -q
6
- sudo apt-get install ffmpeg
6
+ sudo apt-get install ffmpeg fluxbox
7
7
  ;;
8
8
 
9
9
  1.2)
@@ -11,5 +11,5 @@ case "$FFMPEG_VERSION" in
11
11
  ;;
12
12
  *)
13
13
  sudo apt-get update -q
14
- sudo apt-get install ffmpeg
14
+ sudo apt-get install ffmpeg fluxbox
15
15
  esac
data/README.md CHANGED
@@ -1,10 +1,12 @@
1
1
  # Headless
2
+ [![Gem Version](https://badge.fury.io/rb/headless-muse.svg)](http://badge.fury.io/rb/headless-muse)
2
3
  [![Build Status](https://travis-ci.org/pgeraghty/headless.svg?branch=master)](https://travis-ci.org/pgeraghty/headless)
3
4
  [![Coverage Status](https://img.shields.io/coveralls/pgeraghty/headless.svg)](https://coveralls.io/r/pgeraghty/headless?branch=master)
5
+ [![Code Climate](https://codeclimate.com/github/pgeraghty/headless/badges/gpa.svg)](https://codeclimate.com/github/pgeraghty/headless)
4
6
 
5
7
  # This fork
6
8
 
7
- This fork is the source of the [headless-muse gem]().
9
+ This fork is the source of the [headless-muse gem](https://rubygems.org/gems/headless-muse).
8
10
 
9
11
  ## Notes by original author (Leonid Shevtsov)
10
12
 
@@ -3,16 +3,16 @@ Gem::Specification.new do |s|
3
3
  s.email = 'muse@appsthatcould.be'
4
4
 
5
5
  s.name = 'headless-muse'
6
- s.version = '1.1.0'
6
+ s.version = '1.1.1'
7
7
  s.summary = 'Ruby headless display interface'
8
8
 
9
9
  s.description = <<-EOF
10
10
  Headless is a Ruby interface for Xvfb. It allows you to create a headless display straight from Ruby code, hiding some low-level action.
11
- It can also capture video and audio via ffmpeg and take screenshots.
11
+ It can also capture video and audio via ffmpeg (including the latest versions) and take screenshots using ImageMagick.
12
12
  EOF
13
13
  s.requirements = 'Xvfb'
14
14
  s.homepage = 'https://github.com/pgeraghty/headless'
15
- s.license = 'MIT'
15
+ s.license = 'MIT'
16
16
  s.files = `git ls-files`.split("\n")
17
17
 
18
18
  s.add_development_dependency 'rake'
@@ -23,10 +23,8 @@ class Headless
23
23
  Process.kill(0, pid)
24
24
  pid
25
25
  rescue Errno::ESRCH
26
- nil
26
+ false
27
27
  end
28
- else
29
- nil
30
28
  end
31
29
  end
32
30
 
@@ -43,9 +41,10 @@ class Headless
43
41
  end
44
42
 
45
43
  def self.kill_process(pid_filename, options={})
44
+ options[:sig] ||= 'TERM'
46
45
  if pid = self.read_pid(pid_filename)
47
46
  begin
48
- Process.kill 'TERM', pid
47
+ Process.kill options[:sig], pid
49
48
  Process.wait pid if options[:wait]
50
49
  rescue Errno::ESRCH
51
50
  # no such process; assume it's already killed
@@ -60,5 +59,17 @@ class Headless
60
59
  # pid file already removed
61
60
  end
62
61
  end
62
+
63
+ def self.signal_process(pid_filename, signal, options={})
64
+ if pid = self.read_pid(pid_filename)
65
+ begin
66
+ Process.kill signal, pid
67
+ true
68
+ rescue Errno::ESRCH
69
+ # no such process; assume it's already killed
70
+ false
71
+ end
72
+ end
73
+ end
63
74
  end
64
75
  end
@@ -58,8 +58,16 @@ class Headless
58
58
  end
59
59
  end
60
60
 
61
+ def pause
62
+ CliUtil.signal_process(@pid_file_path, 'STOP')
63
+ end
64
+
65
+ def resume
66
+ CliUtil.signal_process(@pid_file_path, 'CONT')
67
+ end
68
+
61
69
  def stop_and_save(path)
62
- CliUtil.kill_process(@pid_file_path, :wait => true)
70
+ CliUtil.kill_process(@pid_file_path, :wait => true, :sig => 'INT')
63
71
  if File.exists? @tmp_file_path
64
72
  begin
65
73
  FileUtils.mv(@tmp_file_path, path)
@@ -57,9 +57,40 @@ describe Headless::CliUtil do
57
57
  subject.class.read_pid('/tmp/.headless_ffmpeg_99.pid').should eq(999999999999)
58
58
  end
59
59
 
60
- it 'returns nil after a rescued error when process does not exist' do
60
+ it 'returns false after a rescued error when process does not exist' do
61
61
  Process.stub(:kill).and_raise(Errno::ESRCH)
62
- subject.class.read_pid('/tmp/.headless_ffmpeg_99.pid').should eq(nil)
62
+ subject.class.read_pid('/tmp/.headless_ffmpeg_99.pid').should eq(false)
63
+ end
64
+ end
65
+
66
+ describe 'signal_process' do
67
+ let(:pidfile) { '/tmp/pid' }
68
+ let(:fakepid) { 999999999999 }
69
+
70
+ before do
71
+ Process.stub(:kill)
72
+ File.stub(:read).and_return(fakepid.to_s)
73
+ end
74
+
75
+ it 'reads PID file' do
76
+ #File.should_receive(:read).with(pidfile).and_return('')
77
+ File.stub(:read).and_return('')
78
+ subject.class.should_receive(:read_pid).with(pidfile).and_return(nil)
79
+ subject.class.signal_process(pidfile, 'CONT').should eq(nil)
63
80
  end
81
+
82
+ it 'sends signal to process' do
83
+ Process.should_receive(:kill).with('CONT', fakepid)
84
+ subject.class.should_receive(:read_pid).with(pidfile).and_return(fakepid)
85
+ subject.class.signal_process(pidfile, 'CONT').should eq(true)
86
+ end
87
+
88
+ it 'returns false after a rescued error when process does not exist' do
89
+ Process.stub(:kill).and_raise(Errno::ESRCH)
90
+ subject.class.should_receive(:read_pid).with(pidfile).and_return(fakepid)
91
+ subject.class.signal_process(pidfile, 'STOP').should eq(false)
92
+ end
93
+
94
+
64
95
  end
65
96
  end
@@ -0,0 +1,25 @@
1
+ require 'spec_helper'
2
+
3
+ describe Headless::VideoRecorder do
4
+ it 'should capture 10s of video on request' do
5
+ h = Headless.new(:display => 99, :reuse => true, :dimensions => '1280x720x24')
6
+
7
+ capture_file = '/tmp/screen-capture-mpeg4.mkv'
8
+ log = '/tmp/ffmpeg_test.log'
9
+
10
+ sleep 5 # give Xvfb some time
11
+ `DISPLAY=:99 fluxbox > /dev/null 2>&1 &`
12
+ sleep 3
13
+ `ffmpeg -f x11grab -r 30 -s 1280x720 -i :99.0 -vcodec mpeg4 -qscale:v 2 -threads 1 -y -t 10 #{capture_file} > #{log} 2>&1`
14
+ expected_duration =
15
+ if h.video.guess_ffmpeg_version! > Gem::Version.new(1.2)
16
+ /time=00:00:10/
17
+ else
18
+ /time=10/
19
+ end
20
+ expect(File.read log).to match(expected_duration)
21
+ expect(`ffprobe #{capture_file} 2>&1 | grep Duration`).to match(/Duration: 00:00:10/)
22
+ `rm #{capture_file}`
23
+ expect { h.destroy }.not_to raise_error
24
+ end
25
+ end if Headless::CliUtil.application_exists?('Xvfb') && Headless::CliUtil.application_exists?('ffmpeg')
@@ -0,0 +1,13 @@
1
+ require 'spec_helper'
2
+
3
+ describe Headless do
4
+ let(:h) { Headless.new }
5
+
6
+ it 'should start Xvfb when instantiated' do
7
+ expect(h).to be_instance_of(Headless)
8
+ end
9
+
10
+ it 'should destroy Xvfb when requested' do
11
+ expect { h.destroy }.not_to raise_error
12
+ end
13
+ end if Headless::CliUtil.application_exists?('Xvfb')
@@ -32,7 +32,7 @@ describe Headless::VideoRecorder do
32
32
  end
33
33
  end
34
34
 
35
- context "stopping video recording" do
35
+ context 'stopping, pausing and resuming video recording' do
36
36
  let(:tmpfile) { '/tmp/ci.mov' }
37
37
  let(:filename) { '/tmp/test.mov' }
38
38
  let(:pidfile) { '/tmp/pid' }
@@ -45,7 +45,7 @@ describe Headless::VideoRecorder do
45
45
 
46
46
  describe "using #stop_and_save" do
47
47
  it "stops video recording and saves file" do
48
- Headless::CliUtil.should_receive(:kill_process).with(pidfile, :wait => true)
48
+ Headless::CliUtil.should_receive(:kill_process).with(pidfile, :wait => true, :sig => 'INT')
49
49
  File.should_receive(:exists?).with(tmpfile).and_return(true)
50
50
  FileUtils.should_receive(:mv).with(tmpfile, filename)
51
51
 
@@ -75,6 +75,22 @@ describe Headless::VideoRecorder do
75
75
  end
76
76
  end
77
77
 
78
+ describe 'using #pause' do
79
+ it 'pauses video recording' do
80
+ Headless::CliUtil.should_receive(:signal_process).with(pidfile, 'STOP')
81
+
82
+ expect(subject.pause).to eq(nil)
83
+ end
84
+ end
85
+
86
+ describe 'using #resume' do
87
+ it 'resumes video recording' do
88
+ Headless::CliUtil.should_receive(:signal_process).with(pidfile, 'CONT')
89
+
90
+ expect(subject.resume).to eq(nil)
91
+ end
92
+ end
93
+
78
94
  describe '#capture_running?' do
79
95
  it 'returns false unless the PID file exists' do
80
96
  Headless::CliUtil.should_receive(:read_pid).with(pidfile)
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: headless-muse
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0
4
+ version: 1.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Leonid Shevtsov
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2014-08-17 00:00:00.000000000 Z
13
+ date: 2014-08-18 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: rake
@@ -56,7 +56,7 @@ dependencies:
56
56
  version: '0'
57
57
  description: |2
58
58
  Headless is a Ruby interface for Xvfb. It allows you to create a headless display straight from Ruby code, hiding some low-level action.
59
- It can also capture video and audio via ffmpeg and take screenshots.
59
+ It can also capture video and audio via ffmpeg (including the latest versions) and take screenshots using ImageMagick.
60
60
  email: muse@appsthatcould.be
61
61
  executables: []
62
62
  extensions: []
@@ -75,6 +75,8 @@ files:
75
75
  - lib/headless/cli_util.rb
76
76
  - lib/headless/video/video_recorder.rb
77
77
  - spec/cli_util_spec.rb
78
+ - spec/features/capture_video_spec.rb
79
+ - spec/features/headless_spec.rb
78
80
  - spec/headless_spec.rb
79
81
  - spec/spec_helper.rb
80
82
  - spec/video_recorder_spec.rb