capit 0.2.0 → 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore CHANGED
@@ -4,5 +4,6 @@ Gemfile.lock
4
4
  pkg/*
5
5
  doc/*
6
6
  coverage/*
7
+ tmp/*
7
8
  .yardoc
8
9
  .DS_STORE
data/.rvmrc ADDED
@@ -0,0 +1 @@
1
+ rvm ruby-1.9.2
data/.yardopts ADDED
@@ -0,0 +1 @@
1
+ --markup markdown --title "CapIt Documentation" --protected
data/Gemfile CHANGED
@@ -4,6 +4,8 @@ source "http://rubygems.org"
4
4
 
5
5
  group :test do
6
6
  gem 'rspec', '~> 2.5.0'
7
+ gem 'yard', '~> 0.6.5'
8
+
7
9
  gem 'simplecov', '~> 0.4.0', :require => false
8
10
  gem 'guard', '~> 0.3.0'
9
11
  gem 'growl', '~> 1.0.3'
data/README.md CHANGED
@@ -33,10 +33,5 @@ Usage
33
33
  require 'capit'
34
34
  capit = CapIt::Capture("http://www.github.com")
35
35
 
36
- Notes
37
- -----
38
- Don't use this yet.
39
-
40
36
  [1]: http://cutycapt.sourceforge.net/ "CutyCapt"
41
37
  [2]: http://daveelkins.com/2009/04/10/setting-up-headless-xserver-and-cutycapt-on-ubuntu/ "Setting up Headless XServer and CutyCapt on Ubuntu"
42
-
data/Rakefile CHANGED
@@ -5,4 +5,10 @@ require 'rspec/core/rake_task'
5
5
  RSpec::Core::RakeTask.new(:spec)
6
6
 
7
7
  task :test => :spec
8
- task :default => :spec
8
+ task :default => :spec
9
+
10
+ require 'yard'
11
+
12
+ YARD::Rake::YardocTask.new do |t|
13
+ t.files = ['lib/**/*.rb']
14
+ end
data/capit.gemspec CHANGED
@@ -9,7 +9,7 @@ Gem::Specification.new do |s|
9
9
  s.platform = Gem::Platform::RUBY
10
10
  s.authors = ["Ezekiel Templin"]
11
11
  s.email = ["ezkl@me.com"]
12
- s.date = %q{2011-03-26}
12
+ s.date = %q{2011-03-27}
13
13
  s.homepage = "http://github.com/meadvillerb/capit"
14
14
  s.summary = %q{Easy screen captures with the help of CutyCapt}
15
15
  s.description = %q{CapIt provides a simple Ruby interface to Björn Höhrmann's CutyCapt.}
data/lib/capit/capture.rb CHANGED
@@ -13,6 +13,15 @@ module CapIt
13
13
  end
14
14
  end
15
15
 
16
+ # This class provides the screen capture functionality.
17
+ #
18
+ # @example
19
+ # capit = CapIt::Capture.new("http://mdvlrb.com", :filename => "mdvlrb.png")
20
+ # capit.max_wait = 5000
21
+ # capit.folder = "/home/user/screenshots"
22
+ # capit.capture
23
+ # capit.output = "/home/user/screenshots/mdvlrb.png"
24
+ #
16
25
  class Capture
17
26
 
18
27
  # All extensions CutyCapt can use to infer format of output
@@ -21,22 +30,25 @@ module CapIt
21
30
  # The URL of the page to be captured
22
31
  attr_reader :url
23
32
 
24
-
25
- attr_accessor :folder, :filename, :user_agent, :max_wait,
26
- :delay, :output
33
+ attr_accessor :folder, :filename, :user_agent, :max_wait, :delay, :output
27
34
 
28
35
  # Initialize a new Capture
36
+ # @param [String] url The URL we want to capture.
37
+ # @param [Hash] options Various options we can set.
29
38
  #
30
- # @example
31
- # capit = CapIt::Capture.new("http://mdvlrb.com", :filename => "mdvlrb.png")
32
- # capit.max_wait = 5000
33
- # capit.folder = "/home/user/screenshots"
39
+ # @return [Object]
40
+ #
41
+ # @see CapIt::Capture#cutycapt_installed?
42
+ # @see CapIt::Capture#valid_extension?
43
+ #
44
+ # @raise CutyCaptError
45
+ # @raise InvalidExtensionError
34
46
  #
35
47
  def initialize url, options = {}
36
48
  cutycapt_installed?
37
49
  @url = url
38
50
  @folder = options[:folder] || Dir.pwd
39
- @filename = options[:filename] || "capit.jpg"
51
+ @filename = options[:filename] || "capit.jpeg"
40
52
  @user_agent = options[:user_agent] || "CapIt! [http://github.com/meadvillerb/capit]"
41
53
  @max_wait = options[:max_wait] || 15000
42
54
  @delay = options[:delay]
@@ -52,27 +64,36 @@ module CapIt
52
64
  #
53
65
  # @return [String, false]
54
66
  #
67
+ # @see CapIt::Capture#successful?
68
+ #
55
69
  def capture
56
70
  `#{capture_command}`
57
71
  successful?
58
72
  end
59
73
 
74
+ # Overloads #filename= to ensure that filenames have valid extensions.
75
+ #
76
+ # @param [String] filename
77
+ # @see CapIt::Capture#valid_extension?
78
+ #
60
79
  def filename=(filename)
61
80
  valid_extension?(filename)
62
81
  @filename = filename
63
82
  end
64
83
 
84
+ # Compares filename against EXTENSIONS. Raises InvalidExtensionError if the extension is invalid.
85
+ #
86
+ # @param [String] filename
87
+ #
65
88
  def valid_extension?(filename)
66
- unless !filename[EXTENSIONS].nil?
67
- raise InvalidExtensionError, "You must supply a valid extension!"
68
- end
89
+ raise InvalidExtensionError, "You must supply a valid extension!" if filename[EXTENSIONS].nil?
69
90
  end
70
91
 
71
92
  # Determines whether the capture was successful
72
93
  # by checking for the existence of the output file.
73
- # Sets {@output} if true.
94
+ # Sets CapIt::Capture#output if true.
74
95
  #
75
- # @return [true, false]
96
+ # @return [String, false]
76
97
  #
77
98
  def successful?
78
99
  if FileTest.exists?("#{@folder}/#{@filename}")
@@ -85,8 +106,7 @@ module CapIt
85
106
  # @return [String]
86
107
  #
87
108
  def capture_command
88
- cmd = "CutyCapt"
89
- cmd += " --url='#{@url}'"
109
+ cmd = "CutyCapt --url='#{@url}'"
90
110
  cmd += " --out='#{@folder}/#{@filename}'"
91
111
  cmd += " --max-wait=#{@max_wait}"
92
112
  cmd += " --delay=#{@delay}" if @delay
@@ -104,6 +124,7 @@ module CapIt
104
124
  # Not foolproof, but good enough for the time being.
105
125
  #
106
126
  # @return [Symbol]
127
+ # @raise [InvalidOSError]
107
128
  #
108
129
  def determine_os
109
130
  case RUBY_PLATFORM
@@ -113,6 +134,11 @@ module CapIt
113
134
  end
114
135
  end
115
136
 
137
+ # Checks to see if CutyCapt is available in PATH.
138
+ # Raises CutyCaptError if not.
139
+ #
140
+ # @return
141
+ #
116
142
  def cutycapt_installed?
117
143
  raise CutyCaptError, "CutyCapt must be installed and available on PATH" if `which CutyCapt`.empty?
118
144
  end
data/lib/capit/version.rb CHANGED
@@ -5,5 +5,5 @@ module CapIt
5
5
  #
6
6
  # The version number
7
7
  #
8
- VERSION = "0.2.0"
8
+ VERSION = "0.2.1"
9
9
  end
@@ -1,92 +1,95 @@
1
1
  # encoding: UTF-8
2
2
  require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
3
3
 
4
- describe CapIt::Capture do
5
- describe "Convenience Method" do
6
- it "should have a Convenience Method" do
7
- @folder = Dir.pwd + '/spec/temporary'
8
- `mkdir #{@folder}`
9
- @capit = CapIt::Capture("http://mdvlrb.com/", :filename => 'mdvlrb.png', :folder => @folder).should == @folder + "/mdvlrb.png"
10
- `rm -rf #{@folder}`
11
- end
4
+ describe CapIt do
5
+ it "should have a Convenience Method" do
6
+ @folder = setup_temporary_folder
7
+ @capit = CapIt::Capture("http://mdvlrb.com/", :filename => 'mdvlrb.png', :folder => @folder).should == @folder + "/mdvlrb.png"
8
+ destroy_temporary_folder(@folder)
12
9
  end
13
-
14
- describe "Capture Class" do
15
- subject { CapIt::Capture.new("http://mdvlrb.com/", :filename => 'mdvlrb.png') }
10
+
11
+ describe CapIt::Capture do
12
+ before { @capit = CapIt::Capture.new("http://mdvlrb.com/") }
13
+ subject { @capit }
16
14
 
17
15
  describe "#initialize" do
18
- it "should have defaults" do
19
- subject.folder.should == Dir.pwd
20
- subject.filename.should == "mdvlrb.png"
21
- subject.user_agent.should == "CapIt! [http://github.com/meadvillerb/capit]"
22
- subject.max_wait.should == 15000
16
+ it { should respond_to :url, :folder, :filename, :user_agent, :max_wait, :delay }
17
+
18
+ context "defaults" do
19
+ specify { @capit.folder.should == Dir.pwd }
20
+ specify { @capit.filename.should == "capit.jpeg" }
21
+ specify { @capit.user_agent.should == "CapIt! [http://github.com/meadvillerb/capit]" }
22
+ specify { @capit.max_wait.should == 15000 }
23
23
  end
24
-
25
- it "should respond to input" do
26
- subject.should respond_to :url, :folder, :filename, :user_agent, :max_wait, :delay
24
+ end
25
+
26
+ describe ":filename" do
27
+ context "when valid" do
28
+ before { @capit.filename = "mdvlrb.png" }
29
+ specify { @capit.filename.should == "mdvlrb.png" }
27
30
  end
28
31
 
29
- it "should allow filename to be changed if extension is valid" do
30
- @capit = CapIt::Capture.new("http://mdvlrb.com/")
31
- @capit.filename = "mdvlrb.png"
32
- @capit.filename.should == "mdvlrb.png"
32
+ context "when invalid" do
33
+ it "should raise an error" do
34
+ expect { @capit.filename = "capit.foo" }.to raise_error(/valid extension/)
35
+ end
33
36
  end
34
37
  end
35
38
 
39
+
36
40
  describe "#capture" do
37
41
  before(:all) do
38
- @folder = Dir.pwd + '/spec/temporary'
39
- @capit = CapIt::Capture.new("http://mdvlrb.com/", :filename => 'mdvlrb.jpeg', :folder => @folder)
40
- `mkdir #{@folder}`
41
- end
42
-
43
- it "should return the full path to the screenshot" do
44
- @capit.capture.should == @folder + "/mdvlrb.jpeg"
42
+ @folder = setup_temporary_folder
43
+ @capture = CapIt::Capture.new("http://mdvlrb.com", :folder => @folder)
45
44
  end
46
-
47
- it "should capture the proper screenshot" do
48
- @capit.output.should == @folder + "/mdvlrb.jpeg"
45
+
46
+ context "when screen capture is successful" do
47
+ specify { @capture.capture.should == @folder + "/capit.jpeg" }
48
+ specify { @capture.output.should == @folder + "/capit.jpeg" }
49
49
  end
50
-
50
+
51
51
  after(:all) do
52
- `rm -rf #{@folder}`
52
+ destroy_temporary_folder(@folder)
53
53
  end
54
54
  end
55
55
 
56
56
  describe "#capture_command" do
57
- it "should prefix xvfb when platform is Linux" do
58
- @capit = CapIt::Capture.new("http://mdvlrb.com/")
59
- RUBY_PLATFORM = "linux"
60
- @capit.capture_command.should match /^xvfb/
61
- end
62
-
63
- it "shouldn't prefix anything when platform is Mac" do
64
- @capit = CapIt::Capture.new("http://mdvlrb.com/")
65
- RUBY_PLATFORM = "darwin"
66
- @capit.capture_command.should match /^CutyCapt/
57
+ before { @capit = CapIt::Capture.new("http://mdvlrb.com/") }
58
+ subject { @capit }
59
+
60
+ context "when platform is Linux" do
61
+ it "should add the xvfb prefix" do
62
+ with_constants :RUBY_PLATFORM => "linux" do
63
+ @capit.capture_command.should match /^xvfb/
64
+ end
65
+ end
67
66
  end
68
-
67
+
68
+ context "when platform is Mac" do
69
+ it "should not add the xvfb prefix" do
70
+ with_constants :RUBY_PLATFORM => "darwin" do
71
+ @capit.capture_command.should match /^CutyCapt/
72
+ end
73
+ end
74
+ end
69
75
  end
70
76
 
71
- describe "Errors" do
72
-
73
- it "should raise an error if CutyCapt isn't available" do
74
- path = ENV['PATH']
75
- expect { ENV['PATH'] = ""; CapIt::Capture.new("http://mdvlrb.com/") }.to raise_error(/CutyCapt/)
76
- ENV['PATH'] = path
77
+ describe "Fatal Errors" do
78
+ context "when platform is unknown" do
79
+ it "should raise an error" do
80
+ with_constants :RUBY_PLATFORM => "mingw" do
81
+ expect { @capit.determine_os }.should raise_error(/platforms/)
82
+ end
83
+ end
77
84
  end
78
-
79
- it "should raise an error if OS isn't Linux or Mac" do
80
- RUBY_PLATFORM = "mingw"
81
- expect { subject.determine_os }.to raise_error(/platforms/)
82
- RUBY_PLATFORM = "darwin"
83
- end
84
-
85
- it "should not accept filenames without a valid extension" do
86
- expect { CapIt::Capture.new("http://mdvlrb.com/", :filename => 'capit.foo') }.to raise_error(/valid extension/)
87
- expect { subject.filename = "capit.foo" }.to raise_error(/valid extension/)
85
+
86
+ context "when CutyCapt executable is unavailable" do
87
+ it "should raise an error" do
88
+ with_environment_variable 'PATH' => "" do
89
+ expect { CapIt::Capture.new("http://mdvlrb.com/") }.to raise_error(/CutyCapt/)
90
+ end
91
+ end
88
92
  end
89
- end
90
-
93
+ end
91
94
  end
92
95
  end
data/spec/capit_spec.rb CHANGED
@@ -2,9 +2,8 @@
2
2
  require 'spec_helper'
3
3
 
4
4
  describe CapIt do
5
- describe "Basic Module" do
6
- it "should have a VERSION" do
7
- CapIt::VERSION.should_not be_nil
8
- end
9
- end
5
+ context "Constants" do
6
+ subject { CapIt::VERSION }
7
+ it { should_not be_nil }
8
+ end
10
9
  end
data/spec/spec_helper.rb CHANGED
@@ -3,8 +3,12 @@ require 'simplecov'
3
3
 
4
4
  SimpleCov.start do
5
5
  coverage_dir 'coverage'
6
- add_filter '/spec/'
6
+ add_filter 'spec/'
7
7
  end
8
8
 
9
9
  require 'rspec'
10
+ require 'support/with_constants'
11
+ require 'support/deferred_garbage_collection' # http://makandra.com/notes/950-speed-up-rspec-by-deferring-garbage-collection
12
+ require 'support/temporary_folder_helper'
13
+
10
14
  require 'capit'
@@ -0,0 +1,26 @@
1
+ class DeferredGarbageCollection
2
+ DEFERRED_GC_THRESHOLD = (ENV['DEFER_GC'] || 10.0).to_f
3
+ @@last_gc_run = Time.now
4
+ def self.start
5
+ GC.disable if DEFERRED_GC_THRESHOLD > 0
6
+ end
7
+
8
+ def self.reconsider
9
+ if DEFERRED_GC_THRESHOLD > 0 && Time.now - @@last_gc_run >= DEFERRED_GC_THRESHOLD
10
+ GC.enable
11
+ GC.start
12
+ GC.disable
13
+ @@last_gc_run = Time.now
14
+ end
15
+ end
16
+ end
17
+
18
+ RSpec.configure do |config|
19
+ config.before(:all) do
20
+ DeferredGarbageCollection.start
21
+ end
22
+
23
+ config.after(:all) do
24
+ DeferredGarbageCollection.reconsider
25
+ end
26
+ end
@@ -0,0 +1,9 @@
1
+ def setup_temporary_folder
2
+ folder = Dir.pwd + '/spec/temporary'
3
+ `mkdir -p #{folder}`
4
+ folder
5
+ end
6
+
7
+ def destroy_temporary_folder(folder)
8
+ `rm -rf #{folder}`
9
+ end
@@ -0,0 +1,52 @@
1
+ # Borrowing Rails monkeypatch: http://api.rubyonrails.org/classes/Kernel.html
2
+ # Make sure we don't redefine it if its already defined.
3
+ #
4
+ unless Kernel.method_defined?(:silence_warnings)
5
+ module Kernel
6
+ def silence_warnings
7
+ with_warnings(nil) { yield }
8
+ end
9
+
10
+ def with_warnings(flag)
11
+ old_verbose, $VERBOSE = $VERBOSE, flag
12
+ yield
13
+ ensure
14
+ $VERBOSE = old_verbose
15
+ end
16
+ end
17
+ end
18
+
19
+ # From: http://digitaldumptruck.jotabout.com/?p=551
20
+ def with_constants(constants, &block)
21
+ saved_constants = {}
22
+
23
+ constants.each do |constant, val|
24
+ saved_constants[ constant ] = Object.const_get( constant )
25
+ Kernel::silence_warnings { Object.const_set( constant, val ) }
26
+ end
27
+
28
+ begin
29
+ block.call
30
+ ensure
31
+ constants.each do |constant, val|
32
+ Kernel::silence_warnings { Object.const_set( constant, saved_constants[ constant ] ) }
33
+ end
34
+ end
35
+ end
36
+
37
+ def with_environment_variable(variables, &block)
38
+ saved_variables = {}
39
+
40
+ variables.each do |variable, value|
41
+ saved_variables[variable] = ENV[variable]
42
+ Kernel::silence_warnings { ENV[variable] = value }
43
+ end
44
+
45
+ begin
46
+ block.call
47
+ ensure
48
+ variables.each do |variable, value|
49
+ Kernel::silence_warnings { ENV[variable] = saved_variables[variable] }
50
+ end
51
+ end
52
+ end
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: capit
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 0.2.0
5
+ version: 0.2.1
6
6
  platform: ruby
7
7
  authors:
8
8
  - Ezekiel Templin
@@ -10,7 +10,7 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2011-03-26 00:00:00 -04:00
13
+ date: 2011-03-27 00:00:00 -04:00
14
14
  default_executable:
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
@@ -92,6 +92,8 @@ extra_rdoc_files:
92
92
  files:
93
93
  - .gemtest
94
94
  - .gitignore
95
+ - .rvmrc
96
+ - .yardopts
95
97
  - Gemfile
96
98
  - Guardfile
97
99
  - LICENSE
@@ -104,6 +106,9 @@ files:
104
106
  - spec/capit/capture_spec.rb
105
107
  - spec/capit_spec.rb
106
108
  - spec/spec_helper.rb
109
+ - spec/support/deferred_garbage_collection.rb
110
+ - spec/support/temporary_folder_helper.rb
111
+ - spec/support/with_constants.rb
107
112
  has_rdoc: true
108
113
  homepage: http://github.com/meadvillerb/capit
109
114
  licenses: []
@@ -136,3 +141,6 @@ test_files:
136
141
  - spec/capit/capture_spec.rb
137
142
  - spec/capit_spec.rb
138
143
  - spec/spec_helper.rb
144
+ - spec/support/deferred_garbage_collection.rb
145
+ - spec/support/temporary_folder_helper.rb
146
+ - spec/support/with_constants.rb