gastly 0.2.1 → 0.2.2

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: c192b43a0068cbba91b24d1a7e5647d846b386d9
4
- data.tar.gz: bf9af7de29d4482a18daafa105e84abd91a41767
3
+ metadata.gz: 327d0941c591a2f1b07c19b013307d917f9c744e
4
+ data.tar.gz: 0f87c8fc8905ffc76e0dccb6395302214f13ca71
5
5
  SHA512:
6
- metadata.gz: 4c0c5705e90950d8ab2e23e9ea4739b2110e6ab5f0ce6bc10d409c56bd2046085640a96513d7eebe130353517caed0e7f9d2af7befbdd08f59850cd1893a8653
7
- data.tar.gz: 61c0cf280a979d41fe03c02ae77f9916bd2eff7383d991f3cc67a4fcc4b3cc13849331f4f4528eed6e9f4405c780d92352eab15a387f08ade40fc4317776c5b7
6
+ metadata.gz: bd7e4f76405c0c344427fc052950ff8b36abf56269becf515cd278527a2af2e09dd48f31891fa1646653117e26c52d1146edbe273f4316f4384c5b449d79c8cc
7
+ data.tar.gz: c49f95e949893ef171c9d6d9366aa327d10300db95cc8e91b03db5a82717c6981855f097973be6b1a640d7096727a066ad30c15919ed369f1103743dc0bd7ec5
@@ -0,0 +1,32 @@
1
+ ## 0.2.2 (19/08/2015)
2
+
3
+ ### Enhancements
4
+
5
+ * Improved exception handling and error
6
+ * Capture all page if selector not found
7
+
8
+ ## 0.2.1 (10/08/2015)
9
+
10
+ ### Bug Fixes
11
+
12
+ * Stop PhantomJS if a site unavailable
13
+
14
+ ## 0.2.0 (23/07/2015)
15
+
16
+ ### Features
17
+
18
+ * Add proxy support
19
+
20
+ ### Enhancements
21
+
22
+ * Update dependencies
23
+
24
+ ## 0.1.1 (13/07/2015)
25
+
26
+ ### Enhancements
27
+
28
+ * Update version Phantomjs to 2.0
29
+
30
+ ## 0.1.0 (13/07/2015)
31
+
32
+ * Initial release
@@ -1,5 +1,6 @@
1
1
  require_relative 'gastly/image'
2
2
  require_relative 'gastly/screenshot'
3
+ require_relative 'gastly/exceptions'
3
4
  require_relative 'gastly/version'
4
5
 
5
6
  module Gastly
@@ -0,0 +1,11 @@
1
+ module Gastly
2
+ class FetchError < StandardError
3
+ attr_reader :url
4
+
5
+ def initialize(url)
6
+ super("Unable to load #{url}")
7
+ end
8
+ end
9
+
10
+ PhantomJSError = Class.new(StandardError)
11
+ end
@@ -5,8 +5,6 @@ require 'active_support/core_ext/object/blank'
5
5
  module Gastly
6
6
  class Screenshot
7
7
 
8
- FetchError = Class.new(StandardError)
9
-
10
8
  SCRIPT_PATH = File.expand_path('../script.js', __FILE__)
11
9
  DEFAULT_TIMEOUT = 0
12
10
  DEFAULT_BROWSER_WIDTH = 1440
@@ -16,11 +14,13 @@ module Gastly
16
14
 
17
15
  attr_writer :timeout, :browser_width, :browser_height
18
16
  attr_accessor :url, :selector, :cookies, :proxy_host, :proxy_port
17
+ attr_reader :tempfile
19
18
 
20
19
  def initialize(url, **kwargs)
21
20
  kwargs.assert_valid_keys(:timeout, :browser_width, :browser_height, :selector, :cookies, :proxy_host, :proxy_port)
22
21
 
23
22
  @url = url
23
+ @tempfile = Tempfile.new([DEFAULT_FILE_NAME, DEFAULT_FILE_FORMAT])
24
24
  self.cookies = kwargs.delete(:cookies)
25
25
 
26
26
  kwargs.each { |key, value| instance_variable_set(:"@#{key}", value) }
@@ -39,8 +39,24 @@ module Gastly
39
39
  end
40
40
 
41
41
  def capture
42
- tempfile = Tempfile.new([DEFAULT_FILE_NAME, DEFAULT_FILE_FORMAT])
42
+ Phantomjs.proxy_host = proxy_host if proxy_host
43
+ Phantomjs.proxy_port = proxy_port if proxy_port
44
+
45
+ output = Phantomjs.run(proxy_options, SCRIPT_PATH.to_s, *prepared_params)
46
+
47
+ handle_exception(output) if output.present?
48
+
49
+ Gastly::Image.new(tempfile)
50
+ end
51
+
52
+ private
53
+
54
+ def proxy_options
55
+ return '' if proxy_host.blank? && proxy_port.blank?
56
+ "--proxy=#{proxy_host}:#{proxy_port}"
57
+ end
43
58
 
59
+ def prepared_params
44
60
  params = {
45
61
  url: url,
46
62
  timeout: timeout,
@@ -50,23 +66,22 @@ module Gastly
50
66
  }
51
67
 
52
68
  params[:selector] = selector if selector.present?
53
- params[:cookies] = cookies.map { |k, v| "#{k}=#{v}" }.join(',') if cookies.present?
54
- prepared_params = params.map { |k, v| "#{k}=#{v}" }
55
-
56
- Phantomjs.proxy_host = proxy_host if proxy_host
57
- Phantomjs.proxy_port = proxy_port if proxy_port
58
- output = Phantomjs.run(proxy_options, SCRIPT_PATH.to_s, *prepared_params)
69
+ params[:cookies] = hash_to_array(cookies).join(',') if cookies.present?
59
70
 
60
- raise FetchError, output if output.present?
71
+ hash_to_array(params)
72
+ end
61
73
 
62
- Gastly::Image.new(tempfile)
74
+ def hash_to_array(data)
75
+ data.map { |key, value| "#{key}=#{value}" }
63
76
  end
64
77
 
65
- private
78
+ def handle_exception(output)
79
+ error = case output
80
+ when /^FetchError:(.+)/ then Gastly::FetchError
81
+ when /^RuntimeError:(.+)/m then Gastly::PhantomJSError
82
+ end
66
83
 
67
- def proxy_options
68
- return '' if proxy_host.blank? && proxy_port.blank?
69
- "--proxy=#{proxy_host}:#{proxy_port}"
84
+ raise error, $1
70
85
  end
71
86
 
72
87
  end
@@ -1,13 +1,11 @@
1
1
  function extractDomain(url){
2
2
  var domain;
3
3
  // Remove protocol
4
- if (url.indexOf("://") > -1){
4
+ if (url.indexOf("://") > -1) {
5
5
  domain = url.split('/')[2];
6
- }
7
- else {
6
+ } else {
8
7
  domain = url.split('/')[0];
9
8
  }
10
-
11
9
  // Remove port number
12
10
  domain = domain.split(':')[0];
13
11
 
@@ -19,16 +17,16 @@ var i, pair,
19
17
  system = require('system'),
20
18
  page = require('webpage').create();
21
19
 
22
- for(i = 1; i < system.args.length; i++){
23
- pair = system.args[i].split(/=(.*)/);
20
+ system.args.forEach(function(arg) {
21
+ pair = arg.split(/=(.*)/);
24
22
  args[pair[0]] = pair[1];
25
- }
23
+ });
26
24
 
27
- if (args.cookies !== undefined){
25
+ if (args.cookies !== undefined) {
28
26
  var cookiesPair = args.cookies.split(',');
29
27
 
30
- for(i = 0; i < cookiesPair.length; i++){
31
- pair = cookiesPair[i].split(/=(.*)/);
28
+ cookiesPair.forEach(function(cookie) {
29
+ pair = cookie.split(/=(.*)/);
32
30
 
33
31
  page.addCookie({
34
32
  'name': pair[0],
@@ -36,28 +34,52 @@ if (args.cookies !== undefined){
36
34
  'path': '/',
37
35
  'domain': extractDomain(args.url)
38
36
  });
37
+ });
38
+ }
39
+
40
+ phantom.onError = function(message, trace){
41
+ var messageStack = ['RuntimeError:' + message];
42
+
43
+ if (trace && trace.length) {
44
+ messageStack.push('Trace:');
45
+
46
+ trace.forEach(function(t) {
47
+ messageStack.push(' -> ' + t.file + ': ' + t.line + (t.function ? ' (in function "' + t.function +'")' : ''));
48
+ });
39
49
  }
50
+
51
+ console.log(messageStack.join('\n'));
52
+ phantom.exit(1);
40
53
  }
41
54
 
42
55
  page.open(args.url, function(status){
43
56
  if(status !== 'success') {
44
- console.log('Unable to load: ' + args.url);
57
+ console.log('FetchError:' + args.url);
45
58
  phantom.exit();
46
59
  } else {
47
60
  window.setTimeout(function(){
48
61
  page.viewportSize = { width: args.width, height: args.height };
49
62
 
50
63
  if (args.selector !== undefined){
64
+ // Returns ClientRect object or null if selector not found
51
65
  var clipRect = page.evaluate(function(s){
52
- return document.querySelector(s).getBoundingClientRect();
66
+ var result, selector = document.querySelector(s);
67
+
68
+ if (selector !== null) {
69
+ result = selector.getBoundingClientRect();
70
+ }
71
+
72
+ return result;
53
73
  }, args.selector);
54
74
 
55
- page.clipRect = {
56
- top: clipRect.top,
57
- left: clipRect.left,
58
- width: clipRect.width,
59
- height: clipRect.height
60
- };
75
+ if (clipRect !== null) {
76
+ page.clipRect = {
77
+ top: clipRect.top,
78
+ left: clipRect.left,
79
+ width: clipRect.width,
80
+ height: clipRect.height
81
+ };
82
+ }
61
83
  }
62
84
 
63
85
  page.render(args.output);
@@ -1,3 +1,3 @@
1
1
  module Gastly
2
- VERSION = '0.2.1'
2
+ VERSION = '0.2.2'
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gastly
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.1
4
+ version: 0.2.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mikhail Grachev
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2015-08-10 00:00:00.000000000 Z
11
+ date: 2015-08-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -90,6 +90,7 @@ extra_rdoc_files: []
90
90
  files:
91
91
  - ".gitignore"
92
92
  - ".travis.yml"
93
+ - CHANGELOG.md
93
94
  - Gemfile
94
95
  - README.md
95
96
  - Rakefile
@@ -98,6 +99,7 @@ files:
98
99
  - gastly.gemspec
99
100
  - gastly.png
100
101
  - lib/gastly.rb
102
+ - lib/gastly/exceptions.rb
101
103
  - lib/gastly/image.rb
102
104
  - lib/gastly/screenshot.rb
103
105
  - lib/gastly/script.js