integration-diff 0.0.3 → 0.1.0

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: 56099739623d94131dbb655d6f2a6fcc3b7ba644
4
- data.tar.gz: a9a405856011a2e5d4750d127fc5302de202a768
3
+ metadata.gz: 97cfcbbd84c5a7bc1b00555ea38c2437d26303ae
4
+ data.tar.gz: 9337a1a04ecf3b7e95f7a92a647f5aad83d0d886
5
5
  SHA512:
6
- metadata.gz: 34385079e07bedca35e2d84bc0457707ff769eb471c8182546869d19590b224bef20be92e1cfc5dc5dc1e46c571d87542d469a95922e6a99bc5765bd8e8d7445
7
- data.tar.gz: f96ad96632e09ddca7597a81347cd9f37ee4222f5be9ea228331a2c9a079c2249079e1a49bd2dc41ee1f0e3e7c255d2264806f2fc52e12f70b9662120e259bcf
6
+ metadata.gz: d16826719150fe1768d51bb968b1a97c18ab793a08b0ce156ef12f0bded4ca0eaeef8e39cc116f648882ac3cd02ad1f9f5d8db0e04708b1d79c630782bd506d0
7
+ data.tar.gz: b53301ceadb3023d6f0be26ab4263bd296011e1f81bed949d4f5a18c45e657c653430994b72d5cc4377c5d2ca765d5314b94f7b64d07d3a3aa74084f64774db9
data/Readme.md CHANGED
@@ -73,3 +73,13 @@ describe "Landing page" do
73
73
  end
74
74
  end
75
75
  ```
76
+
77
+ ### Concurrency
78
+
79
+ By default, when all the screenshots are collected, and before suite ends, this
80
+ gem will upload all the screenshots taken. `IntegrationDiff.wrap_run` is the
81
+ method responsible for the same.
82
+
83
+ However, if you want to upload screenshots as and when they are taken, this gem
84
+ has soft dependency on `concurrent-ruby` gem. Make sure that this gem is
85
+ **required** before capturing screenshots, and see the magic yourself :)
@@ -1,32 +1,31 @@
1
1
  require 'time'
2
2
  require 'json'
3
3
  require 'integration_diff/run_details'
4
+ require 'integration_diff/uploader'
5
+ require 'integration_diff/utils'
4
6
 
5
7
  module IntegrationDiff
6
8
  class Runner
7
9
  include Capybara::DSL
8
10
 
9
- DIR = 'tmp/idiff_images'.freeze
10
-
11
11
  def self.instance
12
- @runner ||= Runner.new(IntegrationDiff.base_uri,
13
- IntegrationDiff.project_name,
12
+ @runner ||= Runner.new(IntegrationDiff.project_name,
14
13
  IntegrationDiff.javascript_driver)
15
14
  end
16
15
 
17
- def initialize(base_uri, project_name, javascript_driver)
18
- @base_uri = base_uri
16
+ def initialize(project_name, javascript_driver)
19
17
  @project_name = project_name
20
18
  @javascript_driver = javascript_driver
21
19
 
20
+ dir = IntegrationDiff::Utils.images_dir
22
21
  Dir.mkdir('tmp') unless Dir.exist?('tmp')
23
- Dir.mkdir(DIR) unless Dir.exist?(DIR)
22
+ Dir.mkdir(dir) unless Dir.exist?(dir)
24
23
  end
25
24
 
26
25
  # TODO: Improve error handling here for network timeouts
27
26
  def start_run
28
- @identifiers = []
29
27
  draft_run
28
+ @uploader = IntegrationDiff::Uploader.build(@run_id)
30
29
  rescue StandardError => e
31
30
  IntegrationDiff.logger.fatal e.message
32
31
  raise e
@@ -34,9 +33,7 @@ module IntegrationDiff
34
33
 
35
34
  # TODO: Improve error handling here for network timeouts
36
35
  def wrap_run
37
- @identifiers.each do |identifier|
38
- upload_image(identifier)
39
- end
36
+ @uploader.wrapup
40
37
 
41
38
  complete_run if @run_id
42
39
  rescue StandardError => e
@@ -45,9 +42,9 @@ module IntegrationDiff
45
42
  end
46
43
 
47
44
  def screenshot(identifier)
48
- screenshot_name = image_file(identifier)
45
+ screenshot_name = IntegrationDiff::Utils.image_file(identifier)
49
46
  page.save_screenshot(screenshot_name, full: true)
50
- @identifiers << identifier
47
+ @uploader.enqueue(identifier)
51
48
  end
52
49
 
53
50
  private
@@ -58,7 +55,7 @@ module IntegrationDiff
58
55
  details = IntegrationDiff::RunDetails.new.details
59
56
  branch = details.branch
60
57
  author = details.author
61
- project = IntegrationDiff.project_name
58
+ project = @project_name
62
59
 
63
60
  response = connection.post('/api/v1/runs',
64
61
  name: run_name, project: project, group: branch,
@@ -67,28 +64,12 @@ module IntegrationDiff
67
64
  @run_id = JSON.parse(response.body)["id"]
68
65
  end
69
66
 
70
- def upload_image(identifier)
71
- IntegrationDiff.logger.fatal "uploading #{identifier}"
72
- image_io = Faraday::UploadIO.new(image_file(identifier), 'image/png')
73
- connection.post("/api/v1/runs/#{@run_id}/run_images",
74
- identifier: identifier, image: image_io)
75
- end
76
-
77
67
  def complete_run
78
68
  connection.put("/api/v1/runs/#{@run_id}/status", status: "completed")
79
69
  end
80
70
 
81
- def image_file(identifier)
82
- "#{Dir.pwd}/#{DIR}/#{identifier}.png"
83
- end
84
-
85
71
  def connection
86
- @conn ||= Faraday.new(@base_uri, request: { timeout: 120, open_timeout: 120 }) do |f|
87
- f.request :basic_auth, IntegrationDiff.api_key, 'X'
88
- f.request :multipart
89
- f.request :url_encoded
90
- f.adapter :net_http
91
- end
72
+ @connection ||= IntegrationDiff::Utils.connection
92
73
  end
93
74
  end
94
75
  end
@@ -0,0 +1,13 @@
1
+ module IntegrationDiff
2
+ class Uploader
3
+ def self.build(run_id)
4
+ if defined?(::Concurrent)
5
+ require 'integration_diff/uploaders/concurrent'
6
+ IntegrationDiff::Uploaders::Concurrent.new(run_id)
7
+ else
8
+ require 'integration_diff/uploaders/sequential'
9
+ IntegrationDiff::Uploaders::Sequential.new(run_id)
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,38 @@
1
+ require 'integration_diff/utils'
2
+
3
+ module IntegrationDiff
4
+ module Uploaders
5
+ class Concurrent
6
+ MAX_NO_OF_THREADS = 20
7
+
8
+ def initialize(run_id)
9
+ @run_id = run_id
10
+ @pool = ::Concurrent::FixedThreadPool.new(MAX_NO_OF_THREADS)
11
+ @screenshots_taken = 0
12
+ end
13
+
14
+ def enqueue(identifier)
15
+ @screenshots_taken += 1
16
+
17
+ @pool.post do
18
+ IntegrationDiff::Utils.upload_image(@run_id, identifier)
19
+ end
20
+ end
21
+
22
+ def wrapup
23
+ retries = 180 # 30 mins
24
+
25
+ # if all screenshots are not uploaded, wait.
26
+ until @screenshots_taken == @pool.completed_task_count
27
+ retries -= 1
28
+ break if retries.zero?
29
+
30
+ sleep 10
31
+ end
32
+
33
+ @pool.shutdown
34
+ @pool.wait_for_termination
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,22 @@
1
+ require 'integration_diff/utils'
2
+
3
+ module IntegrationDiff
4
+ module Uploaders
5
+ class Sequential
6
+ def initialize(run_id)
7
+ @run_id = run_id
8
+ @identifiers = []
9
+ end
10
+
11
+ def enqueue(identifier)
12
+ @identifiers << identifier
13
+ end
14
+
15
+ def wrapup
16
+ @identifiers.each do |identifier|
17
+ IntegrationDiff::Utils.upload_image(@run_id, identifier)
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,29 @@
1
+ module IntegrationDiff
2
+ module Utils
3
+ # http connection that will be used for uploading images
4
+ def self.connection
5
+ base_uri = IntegrationDiff.base_uri
6
+ Faraday.new(base_uri, request: { timeout: 120, open_timeout: 120 }) do |f|
7
+ f.request :basic_auth, IntegrationDiff.api_key, 'X'
8
+ f.request :multipart
9
+ f.request :url_encoded
10
+ f.adapter :net_http
11
+ end
12
+ end
13
+
14
+ def self.images_dir
15
+ 'tmp/idiff_images'.freeze
16
+ end
17
+
18
+ def self.upload_image(run_id, identifier)
19
+ IntegrationDiff.logger.fatal "uploading #{identifier}"
20
+ image_io = Faraday::UploadIO.new(image_file(identifier), 'image/png')
21
+ connection.post("/api/v1/runs/#{run_id}/run_images",
22
+ identifier: identifier, image: image_io)
23
+ end
24
+
25
+ def self.image_file(identifier)
26
+ "#{Dir.pwd}/#{images_dir}/#{identifier}.png"
27
+ end
28
+ end
29
+ end
@@ -1,3 +1,3 @@
1
1
  module IntegrationDiff
2
- VERSION = "0.0.3"
2
+ VERSION = "0.1.0"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: integration-diff
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Yuva
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-07-17 00:00:00.000000000 Z
11
+ date: 2016-07-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: faraday
@@ -40,6 +40,10 @@ files:
40
40
  - lib/integration_diff/dummy_runner.rb
41
41
  - lib/integration_diff/run_details.rb
42
42
  - lib/integration_diff/runner.rb
43
+ - lib/integration_diff/uploader.rb
44
+ - lib/integration_diff/uploaders/concurrent.rb
45
+ - lib/integration_diff/uploaders/sequential.rb
46
+ - lib/integration_diff/utils.rb
43
47
  - lib/integration_diff/version.rb
44
48
  homepage: http://diff.codemancers.com
45
49
  licenses: