wraith 2.3.2 → 2.3.3

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: 21c2e2f34b4f57be52b02d9c1812068629fab964
4
- data.tar.gz: e0db82084db042e981d2141385e95a9f79d3bdf7
3
+ metadata.gz: 2f06fef6c1584ea8502744988e405e3717a5a1fb
4
+ data.tar.gz: 47f3489629f192b949277048a330f29e7e0df729
5
5
  SHA512:
6
- metadata.gz: fa0e6f3d579ca6e85f8a08a00ad09a059dc54798d82f8e90767585f3e85b718d9aee3a95d910987e9853edb43190ec724c1428f993562f29c167687182559aa5
7
- data.tar.gz: 2de08d53d57c00f582d1535383d837be73d4a7c4594481081c8d47147f5ee0b02dc8a006b00f2c60e494b1b8b001c0b7bfd973e9f8310dedfc509dadf58a8059
6
+ metadata.gz: a9d9dbf50a36715eb9f0f00720c84546624467c3d547ef9800a904661895e87f17c56751dd8cde11dc62139d79e4d90af65c12f267f6e6a9cf0b6712fe7effa8
7
+ data.tar.gz: 45c9b9c474a35147cd732a948cdd091691378e150961b3ab00d0b065d58ba34a755e7e861e8d81d732291f7075b4e1eab722738f409deed60a85db6aec9e77c2
@@ -0,0 +1,120 @@
1
+ AllCops:
2
+ Exclude:
3
+ - "**/*.gemspec"
4
+
5
+ Lint/SpaceBeforeFirstArg:
6
+ Severity: fatal
7
+ Enabled: true
8
+
9
+ Lint/RescueException:
10
+ Severity: fatal
11
+ Enabled: true
12
+
13
+ Lint/UnusedBlockArgument:
14
+ Severity: fatal
15
+ Enabled: true
16
+
17
+ Metrics/LineLength:
18
+ Severity: fatal
19
+ Enabled: true
20
+
21
+ Metrics/MethodLength:
22
+ Severity: convention
23
+ Enabled: true
24
+ Max: 5
25
+
26
+ Style/AlignHash:
27
+ Severity: fatal
28
+ Enabled: true
29
+ EnforcedHashRocketStyle: table
30
+
31
+ Style/AlignParameters:
32
+ Severity: fatal
33
+ Enabled: true
34
+ EnforcedStyle: with_fixed_indentation
35
+
36
+ Style/BracesAroundHashParameters:
37
+ Severity: fatal
38
+ Enabled: true
39
+
40
+ ClassAndModuleChildren:
41
+ Severity: fatal
42
+ Enabled: true
43
+
44
+ Style/ConstantName:
45
+ Severity: fatal
46
+ Enabled: true
47
+
48
+ Style/Documentation:
49
+ Enabled: false
50
+
51
+ Style/EmptyLinesAroundClassBody:
52
+ Severity: fatal
53
+ Enabled: true
54
+
55
+ Style/ExtraSpacing:
56
+ Enabled: false
57
+
58
+ Style/FileName:
59
+ Enabled: false
60
+
61
+ Style/HashSyntax:
62
+ Severity: fatal
63
+ Enabled: true
64
+ EnforcedStyle: hash_rockets
65
+
66
+ Style/IndentationConsistency:
67
+ Severity: fatal
68
+ Enabled: true
69
+
70
+ Style/IndentationWidth:
71
+ Severity: fatal
72
+ Enabled: true
73
+
74
+ Style/IndentHash:
75
+ Severity: fatal
76
+ Enabled: true
77
+
78
+ Style/InlineComment:
79
+ Severity: fatal
80
+ Enabled: true
81
+
82
+ Style/LineEndConcatenation:
83
+ Severity: fatal
84
+ Enabled: true
85
+
86
+ Style/MethodName:
87
+ Severity: fatal
88
+ Enabled: true
89
+
90
+ Style/MultilineTernaryOperator:
91
+ Enabled: false
92
+
93
+ Style/NegatedIf:
94
+ Severity: fatal
95
+ Enabled: true
96
+
97
+ Style/Not:
98
+ Severity: fatal
99
+ Enabled: true
100
+
101
+ Style/SpaceInsideHashLiteralBraces:
102
+ Severity: fatal
103
+ Enabled: true
104
+
105
+ Style/StringLiterals:
106
+ Severity: fatal
107
+ Enabled: true
108
+ EnforcedStyle: double_quotes
109
+
110
+ Style/TrailingBlankLines:
111
+ Severity: fatal
112
+ Enabled: true
113
+
114
+ Style/TrailingWhitespace:
115
+ Severity: fatal
116
+ Enabled: true
117
+
118
+ Style/VariableName:
119
+ Severity: fatal
120
+ Enabled: true
data/Gemfile CHANGED
@@ -1,4 +1,4 @@
1
- source 'https://rubygems.org'
1
+ source "https://rubygems.org"
2
2
 
3
3
  # Specify your gem's dependencies in ..gemspec
4
4
  gemspec
data/README.md CHANGED
@@ -1,7 +1,9 @@
1
1
  # Wraith
2
2
 
3
3
  [![Build Status](https://secure.travis-ci.org/BBC-News/wraith.png?branch=master)](http://travis-ci.org/BBC-News/wraith)
4
+ [![Gem Version](https://badge.fury.io/rb/wraith.svg)](http://badge.fury.io/rb/wraith)
4
5
  [![Code Climate](https://codeclimate.com/github/BBC-News/wraith.png)](https://codeclimate.com/github/BBC-News/wraith)
6
+ [![Join the chat at https://gitter.im/BBC-News/wraith](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/BBC-News/wraith?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
5
7
 
6
8
  * Website: http://responsivenews.co.uk
7
9
  * Source: http://github.com/bbc-news/wraith
@@ -108,9 +110,9 @@ Take a look at the LICENSE file in the code.
108
110
 
109
111
  ## Credits
110
112
 
111
- * [Dave Blooman](http://twitter.com/dblooman)
112
- * [John Cleveley](http://twitter.com/jcleveley)
113
- * [Simon Thulbourn](http://twitter.com/sthulbourn)
113
+ * [Dave Blooman](https://twitter.com/dblooman)
114
+ * [John Cleveley](https://twitter.com/jcleveley)
115
+ * [Simon Thulbourn](https://twitter.com/sthulb)
114
116
 
115
117
  ## Selenium-Wraith
116
118
 
data/Rakefile CHANGED
@@ -1,25 +1,25 @@
1
- $LOAD_PATH.unshift File.join(File.dirname(__FILE__), 'lib')
1
+ $LOAD_PATH.unshift File.join(File.dirname(__FILE__), "lib")
2
2
 
3
- require 'bundler/gem_tasks'
4
- require 'wraith/save_images'
5
- require 'wraith/crop'
6
- require 'wraith/spider'
7
- require 'wraith/folder'
8
- require 'wraith/thumbnails'
9
- require 'wraith/compare_images'
10
- require 'wraith/gallery'
3
+ require "bundler/gem_tasks"
4
+ require "wraith/save_images"
5
+ require "wraith/crop"
6
+ require "wraith/spider"
7
+ require "wraith/folder"
8
+ require "wraith/thumbnails"
9
+ require "wraith/compare_images"
10
+ require "wraith/gallery"
11
11
 
12
- @config = ('config')
12
+ @config = ("config")
13
13
 
14
- desc 'Execute wraith on two sites with a config you specify'
14
+ desc "Execute wraith on two sites with a config you specify"
15
15
  task :config, [:yaml] do |_t, custom|
16
- custom.with_defaults(yaml: 'config')
16
+ custom.with_defaults(:yaml => "config")
17
17
  @config = "#{custom[:yaml]}"
18
- Rake::Task['default'].invoke
18
+ Rake::Task["default"].invoke
19
19
  end
20
20
 
21
- task default: [:reset_shots_folder, :check_for_paths, :setup_folders, :save_images, :crop_images, :compare_images, :generate_thumbnails, :generate_gallery] do
22
- puts 'Done!'
21
+ task :default => [:reset_shots_folder, :check_for_paths, :setup_folders, :save_images, :crop_images, :compare_images, :generate_thumbnails, :generate_gallery] do
22
+ puts "Done!"
23
23
  end
24
24
 
25
25
  task :reset_shots_folder do
@@ -58,18 +58,18 @@ task :generate_thumbnails do
58
58
  end
59
59
 
60
60
  task :generate_gallery do
61
- gallery = Wraith::GalleryGenerator.new(@config)
61
+ gallery = Wraith::GalleryGenerator.new(@config, false)
62
62
  gallery.generate_gallery
63
63
  end
64
64
 
65
- desc 'Execute wraith on a single site, no image diffs, with a config you specify'
65
+ desc "Execute wraith on a single site, no image diffs, with a config you specify"
66
66
  task :grabber, [:yaml] do |_t, custom|
67
- custom.with_defaults(yaml: 'config')
67
+ custom.with_defaults(:yaml => "config")
68
68
  @config = "#{custom[:yaml]}"
69
- Rake::Task['grab'].invoke
69
+ Rake::Task["grab"].invoke
70
70
  end
71
71
 
72
- desc 'Execute wraith on a single site, no image diffs'
73
- task grab: [:reset_shots_folder, :check_for_paths, :setup_folders, :save_images, :generate_thumbnails, :generate_gallery] do
74
- puts 'Done!'
72
+ desc "Execute wraith on a single site, no image diffs"
73
+ task :grab => [:reset_shots_folder, :check_for_paths, :setup_folders, :save_images, :generate_thumbnails, :generate_gallery] do
74
+ puts "Done!"
75
75
  end
data/bin/wraith CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
3
  begin
4
- require 'wraith/cli'
4
+ require "wraith/cli"
5
5
  Wraith::CLI.start
6
6
  rescue Interrupt
7
7
  puts "\nQuitting..."
@@ -1,5 +1,5 @@
1
- require 'wraith/version'
1
+ require "wraith/version"
2
2
 
3
3
  module Wraith
4
- autoload :CLI, 'wraith/cli'
4
+ autoload :CLI, "wraith/cli"
5
5
  end
@@ -1,12 +1,12 @@
1
- require 'thor'
2
- require 'wraith'
3
- require 'wraith/save_images'
4
- require 'wraith/crop'
5
- require 'wraith/spider'
6
- require 'wraith/folder'
7
- require 'wraith/thumbnails'
8
- require 'wraith/compare_images'
9
- require 'wraith/gallery'
1
+ require "thor"
2
+ require "wraith"
3
+ require "wraith/save_images"
4
+ require "wraith/crop"
5
+ require "wraith/spider"
6
+ require "wraith/folder"
7
+ require "wraith/thumbnails"
8
+ require "wraith/compare_images"
9
+ require "wraith/gallery"
10
10
 
11
11
  class Wraith::CLI < Thor
12
12
  include Thor::Actions
@@ -14,28 +14,28 @@ class Wraith::CLI < Thor
14
14
  attr_accessor :config_name
15
15
 
16
16
  def self.source_root
17
- File.expand_path('../../../templates/', __FILE__)
17
+ File.expand_path("../../../templates/", __FILE__)
18
18
  end
19
19
 
20
- desc 'setup', 'creates config folder and default config'
20
+ desc "setup", "creates config folder and default config"
21
21
  def setup
22
- template('configs/config.yaml', 'configs/config.yaml')
23
- template('javascript/snap.js', 'javascript/snap.js')
22
+ template("configs/config.yaml", "configs/config.yaml")
23
+ template("javascript/snap.js", "javascript/snap.js")
24
24
  end
25
25
 
26
- desc 'setup_casper', 'creates config folder and default config for casper'
26
+ desc "setup_casper", "creates config folder and default config for casper"
27
27
  def setup_casper
28
- template('configs/component.yaml', 'configs/component.yaml')
29
- template('javascript/casper.js', 'javascript/casper.js')
28
+ template("configs/component.yaml", "configs/component.yaml")
29
+ template("javascript/casper.js", "javascript/casper.js")
30
30
  end
31
31
 
32
- desc 'reset_shots [config_name]', 'removes all the files in the shots folder'
32
+ desc "reset_shots [config_name]", "removes all the files in the shots folder"
33
33
  def reset_shots(config_name)
34
34
  reset = Wraith::FolderManager.new(config_name)
35
35
  reset.clear_shots_folder
36
36
  end
37
37
 
38
- desc 'setup_folders [config_name]', 'create folders for images'
38
+ desc "setup_folders [config_name]", "create folders for images"
39
39
  def setup_folders(config_name)
40
40
  create = Wraith::FolderManager.new(config_name)
41
41
  create.create_folders
@@ -58,37 +58,37 @@ class Wraith::CLI < Thor
58
58
  end
59
59
  end
60
60
 
61
- desc 'save_images [config_name]', 'captures screenshots'
61
+ desc "save_images [config_name]", "captures screenshots"
62
62
  def save_images(config_name, history = false)
63
63
  save_images = Wraith::SaveImages.new(config_name, history)
64
64
  save_images.save_images
65
65
  end
66
66
 
67
- desc 'crop_images [config_name]', 'crops images to the same height'
67
+ desc "crop_images [config_name]", "crops images to the same height"
68
68
  def crop_images(config_name)
69
69
  crop = Wraith::CropImages.new(config_name)
70
70
  crop.crop_images
71
71
  end
72
72
 
73
- desc 'compare_images [config_name]', 'compares images to generate diffs'
73
+ desc "compare_images [config_name]", "compares images to generate diffs"
74
74
  def compare_images(config_name)
75
75
  compare = Wraith::CompareImages.new(config_name)
76
76
  compare.compare_images
77
77
  end
78
78
 
79
- desc 'generate_thumbnails [config_name]', 'create thumbnails for gallery'
79
+ desc "generate_thumbnails [config_name]", "create thumbnails for gallery"
80
80
  def generate_thumbnails(config_name)
81
81
  thumbs = Wraith::Thumbnails.new(config_name)
82
82
  thumbs.generate_thumbnails
83
83
  end
84
84
 
85
- desc 'generate_gallery [config_name]', 'create page for viewing images'
85
+ desc "generate_gallery [config_name]", "create page for viewing images"
86
86
  def generate_gallery(config_name, multi = false)
87
87
  gallery = Wraith::GalleryGenerator.new(config_name, multi)
88
88
  gallery.generate_gallery
89
89
  end
90
90
 
91
- desc 'capture [config_name]', 'A full Wraith job'
91
+ desc "capture [config_name]", "A full Wraith job"
92
92
  def capture(config, multi = false)
93
93
  reset_shots(config)
94
94
  check_for_paths(config)
@@ -100,7 +100,7 @@ class Wraith::CLI < Thor
100
100
  generate_gallery(config, multi)
101
101
  end
102
102
 
103
- desc 'multi_capture [filelist]', 'A Batch of Wraith Jobs'
103
+ desc "multi_capture [filelist]", "A Batch of Wraith Jobs"
104
104
  def multi_capture(filelist)
105
105
  config_array = IO.readlines(filelist)
106
106
  config_array.each do |config|
@@ -108,15 +108,16 @@ class Wraith::CLI < Thor
108
108
  end
109
109
  end
110
110
 
111
- desc 'history [config_name]', 'Setup a baseline set of shots'
111
+ desc "history [config_name]", "Setup a baseline set of shots"
112
112
  def history(config)
113
113
  reset_shots(config)
114
+ check_for_paths(config)
114
115
  setup_folders(config)
115
116
  save_images(config)
116
117
  copy_old_shots(config)
117
118
  end
118
119
 
119
- desc 'latest [config_name]', 'Capture new shots to compare with baseline'
120
+ desc "latest [config_name]", "Capture new shots to compare with baseline"
120
121
  def latest(config)
121
122
  reset_shots(config)
122
123
  restore_shots(config)
@@ -1,7 +1,7 @@
1
- require 'wraith'
2
- require 'image_size'
3
- require 'open3'
4
- require 'parallel'
1
+ require "wraith"
2
+ require "image_size"
3
+ require "open3"
4
+ require "parallel"
5
5
 
6
6
  class Wraith::CompareImages
7
7
  attr_reader :wraith
@@ -12,18 +12,18 @@ class Wraith::CompareImages
12
12
 
13
13
  def compare_images
14
14
  files = Dir.glob("#{wraith.directory}/*/*.png").sort
15
- Parallel.each(files.each_slice(2), in_processes: Parallel.processor_count) do |base, compare|
16
- diff = base.gsub(/([a-z0-9]+).png$/, 'diff.png')
17
- info = base.gsub(/([a-z0-9]+).png$/, 'data.txt')
15
+ Parallel.each(files.each_slice(2), :in_processes => Parallel.processor_count) do |base, compare|
16
+ diff = base.gsub(/([a-z0-9]+).png$/, "diff.png")
17
+ info = base.gsub(/([a-z0-9]+).png$/, "data.txt")
18
18
  compare_task(base, compare, diff, info)
19
- puts 'Saved diff'
19
+ puts "Saved diff"
20
20
  end
21
21
  end
22
22
 
23
23
  def percentage(img_size, px_value, info)
24
24
  pixel_count = (px_value / img_size) * 100
25
25
  rounded = pixel_count.round(2)
26
- File.open(info, 'w') { |file| file.write(rounded) }
26
+ File.open(info, "w") { |file| file.write(rounded) }
27
27
  end
28
28
 
29
29
  def compare_task(base, compare, output, info)
@@ -33,7 +33,7 @@ class Wraith::CompareImages
33
33
  img_size = ImageSize.path(output).size.inject(:*)
34
34
  percentage(img_size, px_value, info)
35
35
  rescue
36
- File.open(info, 'w') { |file| file.write('invalid') } unless File.exist?(output)
36
+ File.open(info, "w") { |file| file.write("invalid") } unless File.exist?(output)
37
37
  end
38
38
  end
39
39
  end
@@ -1,6 +1,6 @@
1
- require 'wraith'
2
- require 'image_size'
3
- require 'parallel'
1
+ require "wraith"
2
+ require "image_size"
3
+ require "parallel"
4
4
 
5
5
  class Wraith::CropImages
6
6
  attr_reader :wraith
@@ -12,8 +12,8 @@ class Wraith::CropImages
12
12
  def crop_images
13
13
  files = Dir.glob("#{wraith.directory}/*/*.png").sort
14
14
 
15
- Parallel.each(files.each_slice(2), in_processes: Parallel.processor_count) do |base, compare|
16
- puts 'cropping images'
15
+ Parallel.each(files.each_slice(2), :in_processes => Parallel.processor_count) do |base, compare|
16
+ puts "cropping images"
17
17
 
18
18
  width = image_dimensions(base)[0]
19
19
  base_height = image_dimensions(base)[1]
@@ -36,6 +36,6 @@ class Wraith::CropImages
36
36
  end
37
37
 
38
38
  def image_dimensions(image)
39
- ImageSize.new(File.open(image, 'rb').read).size
39
+ ImageSize.new(File.open(image, "rb").read).size
40
40
  end
41
41
  end
@@ -1,4 +1,4 @@
1
- require 'wraith'
1
+ require "wraith"
2
2
 
3
3
  class Wraith::FolderManager
4
4
  attr_reader :wraith
@@ -38,7 +38,7 @@ class Wraith::FolderManager
38
38
  end
39
39
 
40
40
  def restore_shots
41
- puts 'restoring'
41
+ puts "restoring"
42
42
  FileUtils.cp_r(Dir.glob("#{history_dir}/*"), dir)
43
43
  end
44
44
 
@@ -46,17 +46,17 @@ class Wraith::FolderManager
46
46
  spider_paths.each do |folder_label, path|
47
47
  unless path
48
48
  path = folder_label
49
- folder_label = path.gsub('/', '__')
49
+ folder_label = path.gsub("/", "__")
50
50
  end
51
51
 
52
52
  FileUtils.mkdir_p("#{dir}/thumbnails/#{folder_label}")
53
53
  FileUtils.mkdir_p("#{dir}/#{folder_label}")
54
54
  end
55
- puts 'Creating Folders'
55
+ puts "Creating Folders"
56
56
  end
57
57
 
58
58
  def tidy_shots_folder(dirs)
59
- if wraith.mode == 'diffs_only'
59
+ if wraith.mode == "diffs_only"
60
60
  dirs.each do |folder_name, shot_info|
61
61
  if shot_info.none? { |_k, v| v[:data] > 0 }
62
62
  FileUtils.rm_rf("#{wraith.directory}/#{folder_name}")
@@ -1,16 +1,16 @@
1
- require 'erb'
2
- require 'pp'
3
- require 'fileutils'
4
- require 'wraith/wraith'
1
+ require "erb"
2
+ require "pp"
3
+ require "fileutils"
4
+ require "wraith/wraith"
5
5
 
6
6
  class Wraith::GalleryGenerator
7
7
  attr_reader :wraith
8
8
 
9
9
  MATCH_FILENAME = /(\S+)_(\S+)\.\S+/
10
10
 
11
- TEMPLATE_LOCATION = File.expand_path('gallery_template/gallery_template.erb', File.dirname(__FILE__))
12
- TEMPLATE_BY_DOMAIN_LOCATION = File.expand_path('gallery_template/gallery_template.erb', File.dirname(__FILE__))
13
- BOOTSTRAP_LOCATION = File.expand_path('gallery_template/bootstrap.min.css', File.dirname(__FILE__))
11
+ TEMPLATE_LOCATION = File.expand_path("gallery_template/gallery_template.erb", File.dirname(__FILE__))
12
+ TEMPLATE_BY_DOMAIN_LOCATION = File.expand_path("gallery_template/gallery_template.erb", File.dirname(__FILE__))
13
+ BOOTSTRAP_LOCATION = File.expand_path("gallery_template/bootstrap.min.css", File.dirname(__FILE__))
14
14
 
15
15
  def initialize(config, multi)
16
16
  @wraith = Wraith::Wraith.new(config)
@@ -22,10 +22,10 @@ class Wraith::GalleryGenerator
22
22
  def parse_directories(dirname)
23
23
  @dirs = {}
24
24
  categories = Dir.foreach(dirname).select do |category|
25
- if ['.', '..', 'thumbnails'].include? category
25
+ if [".", "..", "thumbnails"].include? category
26
26
  # Ignore special dirs
27
27
  false
28
- elsif File.directory? "#{dirname}/#{category}" then
28
+ elsif File.directory? "#{dirname}/#{category}"
29
29
  # Ignore stray files
30
30
  true
31
31
  else
@@ -54,11 +54,11 @@ class Wraith::GalleryGenerator
54
54
  def matcher(match, filename, dirname, category)
55
55
  @size = match[1].to_i
56
56
  @group = match[2]
57
- @filepath = category + '/' + filename
57
+ @filepath = category + "/" + filename
58
58
  @thumbnail = "thumbnails/#{category}/#{filename}"
59
59
 
60
60
  if @dirs[category][@size].nil?
61
- @dirs[category][@size] = { variants: [] }
61
+ @dirs[category][@size] = { :variants => [] }
62
62
  end
63
63
 
64
64
  size_dict = @dirs[category][@size]
@@ -68,9 +68,9 @@ class Wraith::GalleryGenerator
68
68
 
69
69
  def data_group(group, size_dict, dirname, filepath)
70
70
  case group
71
- when 'diff'
71
+ when "diff"
72
72
  diff_check(size_dict, filepath)
73
- when 'data'
73
+ when "data"
74
74
  data_check(size_dict, dirname, filepath)
75
75
  else
76
76
  variant_check(size_dict, group)
@@ -79,16 +79,16 @@ class Wraith::GalleryGenerator
79
79
 
80
80
  def variant_check(size_dict, group)
81
81
  size_dict[:variants] << {
82
- name: group,
83
- filename: @filepath,
84
- thumb: @thumbnail
82
+ :name => group,
83
+ :filename => @filepath,
84
+ :thumb => @thumbnail
85
85
  }
86
86
  size_dict[:variants].sort! { |a, b| a[:name] <=> b[:name] }
87
87
  end
88
88
 
89
89
  def diff_check(size_dict, filepath)
90
90
  size_dict[:diff] = {
91
- filename: filepath, thumb: @thumbnail
91
+ :filename => filepath, :thumb => @thumbnail
92
92
  }
93
93
  end
94
94
 
@@ -109,23 +109,23 @@ class Wraith::GalleryGenerator
109
109
  def generate_html(location, directories, template, destination, path)
110
110
  template = File.read(template)
111
111
  locals = {
112
- location: location,
113
- directories: directories,
114
- path: path,
115
- threshold: wraith.threshold
112
+ :location => location,
113
+ :directories => directories,
114
+ :path => path,
115
+ :threshold => wraith.threshold
116
116
  }
117
117
  html = ERB.new(template).result(ErbBinding.new(locals).get_binding)
118
- File.open(destination, 'w') do |outf|
118
+ File.open(destination, "w") do |outf|
119
119
  outf.write(html)
120
120
  end
121
121
  end
122
122
 
123
- def generate_gallery(withPath = '')
123
+ def generate_gallery(withPath = "")
124
124
  dest = "#{@location}/gallery.html"
125
125
  directories = parse_directories(@location)
126
126
  generate_html(@location, directories, TEMPLATE_BY_DOMAIN_LOCATION, dest, withPath)
127
127
  FileUtils.cp(BOOTSTRAP_LOCATION, "#{@location}/bootstrap.min.css")
128
- puts 'Gallery generated'
128
+ puts "Gallery generated"
129
129
  check_failed_shots
130
130
  end
131
131
 
@@ -133,7 +133,7 @@ class Wraith::GalleryGenerator
133
133
  if @mutli
134
134
  return true
135
135
  elsif @failed_shots == false
136
- puts 'Failures detected'
136
+ puts "Failures detected"
137
137
  exit 1
138
138
  else
139
139
  true
@@ -1,16 +1,13 @@
1
- require 'wraith'
2
- require 'parallel'
1
+ require "wraith"
2
+ require "parallel"
3
3
 
4
4
  class Wraith::SaveImages
5
- attr_reader :wraith, :history
5
+ attr_reader :wraith, :history, :meta
6
6
 
7
7
  def initialize(config, history = false)
8
8
  @wraith = Wraith::Wraith.new(config)
9
9
  @history = history
10
- end
11
-
12
- def directory
13
- wraith.directory
10
+ @meta = SaveMetadata.new(@wraith, history)
14
11
  end
15
12
 
16
13
  def check_paths
@@ -22,33 +19,42 @@ class Wraith::SaveImages
22
19
  end
23
20
  end
24
21
 
25
- def history_label
26
- history ? '_latest' : ''
27
- end
22
+ def save_images
23
+ jobs = []
24
+ check_paths.each do |label, options|
25
+ settings = CaptureOptions.new(options, wraith)
28
26
 
29
- def engine
30
- wraith.engine.each { |_label, browser| return browser }
31
- end
27
+ wraith.widths.each do |width|
28
+ base_file_name = meta.file_names(width, label, meta.base_label)
29
+ compare_file_name = meta.file_names(width, label, meta.compare_label)
32
30
 
33
- def engine_label
34
- wraith.engine.key(engine)
31
+ jobs << [label, settings.path, width, settings.base_url, base_file_name, settings.selector]
32
+ jobs << [label, settings.path, width, settings.compare_url, compare_file_name, settings.selector] unless settings.compare_url.nil?
33
+ end
34
+ end
35
+ parallel_task(jobs)
35
36
  end
36
37
 
37
- def base_urls(path)
38
- wraith.base_domain + path unless wraith.base_domain.nil?
38
+ def capture_page_image(browser, url, width, file_name, selector)
39
+ puts `"#{browser}" "#{wraith.phantomjs_options}" "#{wraith.snap_file}" "#{url}" "#{width}" "#{file_name}" "#{selector}"`
39
40
  end
40
41
 
41
- def compare_urls(path)
42
- wraith.comp_domain + path unless wraith.comp_domain.nil?
43
- end
42
+ private
44
43
 
45
- def file_names(width, label, domain_label)
46
- "#{directory}/#{label}/#{width}_#{engine_label}_#{domain_label}.png"
44
+ def parallel_task(jobs)
45
+ Parallel.each(jobs, :in_threads => 8) do |_label, _path, width, url, filename, selector|
46
+ begin
47
+ attempt_image_capture(width, url, filename, selector, 5)
48
+ rescue => e
49
+ puts e
50
+ create_invalid_image(filename, width)
51
+ end
52
+ end
47
53
  end
48
54
 
49
55
  def attempt_image_capture(width, url, filename, selector, max_attempts)
50
56
  max_attempts.times do |i|
51
- capture_page_image engine, url, width, filename, selector
57
+ capture_page_image meta.engine, url, width, filename, selector
52
58
 
53
59
  return if File.exist? filename
54
60
 
@@ -58,56 +64,88 @@ class Wraith::SaveImages
58
64
  fail "Unable to capture image #{filename} after #{max_attempts} attempt(s)"
59
65
  end
60
66
 
67
+ def create_invalid_image(filename, width)
68
+ puts "Using fallback image instead"
69
+ invalid = File.expand_path("../../assets/invalid.jpg", File.dirname(__FILE__))
70
+ FileUtils.cp invalid, filename
71
+
72
+ set_image_width(filename, width)
73
+ end
74
+
75
+ def set_image_width(image, width)
76
+ `convert #{image} -background none -extent #{width}x0 #{image}`
77
+ end
78
+ end
79
+
80
+ class CaptureOptions
81
+ attr_reader :options, :wraith
82
+
83
+ def initialize(options, wraith)
84
+ @options = options
85
+ @wraith = wraith
86
+ end
87
+
88
+ def path
89
+ has_casper(options)
90
+ end
91
+
92
+ def selector
93
+ casper_selector(options)
94
+ end
95
+
96
+ def base_url
97
+ base_urls(path)
98
+ end
99
+
100
+ def compare_url
101
+ compare_urls(path)
102
+ end
103
+
104
+ def base_urls(path)
105
+ wraith.base_domain + path unless wraith.base_domain.nil?
106
+ end
107
+
108
+ def compare_urls(path)
109
+ wraith.comp_domain + path unless wraith.comp_domain.nil?
110
+ end
111
+
61
112
  def has_casper(options)
62
- options['path'] ? options['path'] : options
113
+ options["path"] ? options["path"] : options
63
114
  end
64
115
 
65
116
  def casper_selector(options)
66
- options['selector'] ? options['selector'] : ' '
117
+ options["selector"] ? options["selector"] : " "
67
118
  end
119
+ end
68
120
 
69
- def save_images
70
- jobs = []
71
- check_paths.each do |label, options|
72
- path = has_casper(options)
73
- selector = casper_selector(options)
74
-
75
- base_url = base_urls(path)
76
- compare_url = compare_urls(path)
121
+ class SaveMetadata
122
+ attr_reader :wraith, :history
77
123
 
78
- wraith.widths.each do |width|
79
- base_file_name = file_names(width, label, "#{wraith.base_domain_label}#{history_label}")
80
- compare_file_name = file_names(width, label, "#{wraith.comp_domain_label}#{history_label}")
124
+ def initialize(config, _history)
125
+ @wraith = config
126
+ end
81
127
 
82
- jobs << [label, path, width, base_url, base_file_name, selector]
83
- jobs << [label, path, width, compare_url, compare_file_name, selector] unless compare_url.nil?
84
- end
85
- end
86
- parallel_task(jobs)
128
+ def history_label
129
+ history ? "_latest" : ""
87
130
  end
88
131
 
89
- def parallel_task(jobs)
90
- Parallel.each(jobs, in_threads: 8) do |_label, _path, width, url, filename, selector|
91
- begin
92
- attempt_image_capture(width, url, filename, selector, 5)
93
- rescue => e
94
- puts e
132
+ def engine_label
133
+ wraith.engine.key(wraith.engine)
134
+ end
95
135
 
96
- puts 'Using fallback image instead'
97
- invalid = File.expand_path('../../assets/invalid.jpg', File.dirname(__FILE__))
98
- FileUtils.cp invalid, filename
136
+ def file_names(width, label, domain_label)
137
+ "#{wraith.directory}/#{label}/#{width}_#{engine_label}_#{domain_label}.png"
138
+ end
99
139
 
100
- # Set width of fallback image
101
- set_image_width(filename, width)
102
- end
103
- end
140
+ def base_label
141
+ "#{wraith.base_domain_label}#{history_label}"
104
142
  end
105
143
 
106
- def set_image_width(image, width)
107
- `convert #{image} -background none -extent #{width}x0 #{image}`
144
+ def compare_label
145
+ "#{wraith.comp_domain_label}#{history_label}"
108
146
  end
109
147
 
110
- def capture_page_image(browser, url, width, file_name, selector)
111
- puts `"#{browser}" "#{wraith.phantomjs_options}" "#{wraith.snap_file}" "#{url}" "#{width}" "#{file_name}" "#{selector}"`
148
+ def engine
149
+ wraith.engine.each { |_label, browser| return browser }
112
150
  end
113
151
  end
@@ -1,7 +1,7 @@
1
- require 'wraith'
2
- require 'anemone'
3
- require 'nokogiri'
4
- require 'uri'
1
+ require "wraith"
2
+ require "anemone"
3
+ require "nokogiri"
4
+ require "uri"
5
5
 
6
6
  class Wraith::Spidering
7
7
  def initialize(config)
@@ -11,10 +11,10 @@ class Wraith::Spidering
11
11
  def check_for_paths
12
12
  if @wraith.paths.nil?
13
13
  unless @wraith.sitemap.nil?
14
- puts 'no paths defined in config, loading paths from sitemap'
14
+ puts "no paths defined in config, loading paths from sitemap"
15
15
  spider = Wraith::Sitemap.new(@wraith)
16
16
  else
17
- puts 'no paths defined in config, crawling from site root'
17
+ puts "no paths defined in config, crawling from site root"
18
18
  spider = Wraith::Crawler.new(@wraith)
19
19
  end
20
20
  spider.determine_paths
@@ -36,11 +36,11 @@ class Wraith::Spider
36
36
  private
37
37
 
38
38
  def write_file
39
- File.open(@wraith.spider_file, 'w+') { |file| file.write(@paths) }
39
+ File.open(@wraith.spider_file, "w+") { |file| file.write(@paths) }
40
40
  end
41
41
 
42
42
  def add_path(path)
43
- @paths[path == '/' ? 'home' : path.gsub('/', '__').chomp('__').downcase] = path.downcase
43
+ @paths[path == "/" ? "home" : path.gsub("/", "__").chomp("__").downcase] = path.downcase
44
44
  end
45
45
 
46
46
  def spider
@@ -56,13 +56,13 @@ class Wraith::Crawler < Wraith::Spider
56
56
 
57
57
  def spider
58
58
  if File.exist?(@wraith.spider_file) && modified_since(@wraith.spider_file, @wraith.spider_days[0])
59
- puts 'using existing spider file'
59
+ puts "using existing spider file"
60
60
  @paths = eval(File.read(@wraith.spider_file))
61
61
  else
62
- puts 'creating new spider file'
62
+ puts "creating new spider file"
63
63
  spider_list = []
64
64
  Anemone.crawl(@wraith.base_domain) do |anemone|
65
- anemone.skip_links_like(/\.#{EXT.join('|')}$/)
65
+ anemone.skip_links_like(/\.(#{EXT.join('|')})$/)
66
66
  # Add user specified skips
67
67
  anemone.skip_links_like(@wraith.spider_skips)
68
68
  anemone.on_every_page { |page| add_path(page.url.path) }
@@ -85,11 +85,11 @@ class Wraith::Sitemap < Wraith::Spider
85
85
  sitemap = Nokogiri::XML(File.open(@wraith.sitemap))
86
86
  end
87
87
  urls = {}
88
- sitemap.css('loc').each do |loc|
88
+ sitemap.css("loc").each do |loc|
89
89
  path = loc.content
90
90
  # Allow use of either domain in the sitemap.xml
91
91
  @wraith.domains.each do |_k, v|
92
- path.sub!(v, '')
92
+ path.sub!(v, "")
93
93
  end
94
94
  if @wraith.spider_skips.nil? || @wraith.spider_skips.none? { |regex| regex.match(path) }
95
95
  add_path(path)
@@ -1,6 +1,6 @@
1
- require 'wraith'
2
- require 'parallel'
3
- require 'fileutils'
1
+ require "wraith"
2
+ require "parallel"
3
+ require "fileutils"
4
4
 
5
5
  class Wraith::Thumbnails
6
6
  attr_reader :wraith
@@ -10,11 +10,11 @@ class Wraith::Thumbnails
10
10
  end
11
11
 
12
12
  def generate_thumbnails
13
- puts 'Generating thumbnails'
13
+ puts "Generating thumbnails"
14
14
 
15
15
  files = Dir.glob("#{wraith.directory}/*/*.png")
16
16
 
17
- Parallel.each(files, in_processes: Parallel.processor_count) do |filename|
17
+ Parallel.each(files, :in_processes => Parallel.processor_count) do |filename|
18
18
  new_name = filename.gsub(/^#{wraith.directory}/, "#{wraith.directory}/thumbnails")
19
19
  thumbnail_image(filename, new_name)
20
20
  end
@@ -1,3 +1,3 @@
1
1
  module Wraith
2
- VERSION = '2.3.2'
2
+ VERSION = "2.3.3"
3
3
  end
@@ -1,38 +1,38 @@
1
- require 'yaml'
1
+ require "yaml"
2
2
 
3
3
  class Wraith::Wraith
4
4
  attr_accessor :config
5
5
 
6
6
  def initialize(config_name)
7
- if File.exist?(config_name) && File.extname(config_name) == '.yaml'
7
+ if File.exist?(config_name) && File.extname(config_name) == ".yaml"
8
8
  @config = YAML.load(File.open(config_name))
9
9
  else
10
10
  @config = YAML.load(File.open("configs/#{config_name}.yaml"))
11
11
  end
12
12
  rescue
13
- puts 'unable to find config'
13
+ puts "unable to find config"
14
14
  exit 1
15
15
  end
16
16
 
17
17
  def directory
18
18
  # Legacy support for those using array configs
19
- @config['directory'].is_a?(Array) ? @config['directory'].first : @config['directory']
19
+ @config["directory"].is_a?(Array) ? @config["directory"].first : @config["directory"]
20
20
  end
21
21
 
22
22
  def history_dir
23
- @config['history_dir']
23
+ @config["history_dir"]
24
24
  end
25
25
 
26
26
  def snap_file
27
- @config['snap_file'] ? @config['snap_file'] : File.expand_path('lib/wraith/javascript/snap.js')
27
+ @config["snap_file"] ? @config["snap_file"] : File.expand_path("lib/wraith/javascript/snap.js")
28
28
  end
29
29
 
30
30
  def widths
31
- @config['screen_widths']
31
+ @config["screen_widths"]
32
32
  end
33
33
 
34
34
  def domains
35
- @config['domains']
35
+ @config["domains"]
36
36
  end
37
37
 
38
38
  def base_domain
@@ -52,46 +52,46 @@ class Wraith::Wraith
52
52
  end
53
53
 
54
54
  def spider_file
55
- @config['spider_file'] ? @config['spider_file'] : 'spider.txt'
55
+ @config["spider_file"] ? @config["spider_file"] : "spider.txt"
56
56
  end
57
57
 
58
58
  def spider_days
59
- @config['spider_days']
59
+ @config["spider_days"]
60
60
  end
61
61
 
62
62
  def sitemap
63
- @config['sitemap']
63
+ @config["sitemap"]
64
64
  end
65
65
 
66
66
  def spider_skips
67
- @config['spider_skips']
67
+ @config["spider_skips"]
68
68
  end
69
69
 
70
70
  def paths
71
- @config['paths']
71
+ @config["paths"]
72
72
  end
73
73
 
74
74
  def engine
75
- @config['browser']
75
+ @config["browser"]
76
76
  end
77
77
 
78
78
  def fuzz
79
- @config['fuzz']
79
+ @config["fuzz"]
80
80
  end
81
81
 
82
82
  def mode
83
- if %w(diffs_only diffs_first alphanumeric).include?(@config['mode'])
84
- @config['mode']
83
+ if %w(diffs_only diffs_first alphanumeric).include?(@config["mode"])
84
+ @config["mode"]
85
85
  else
86
- 'alphanumeric'
86
+ "alphanumeric"
87
87
  end
88
88
  end
89
89
 
90
90
  def threshold
91
- @config['threshold'] ? @config['threshold'] : 0
91
+ @config["threshold"] ? @config["threshold"] : 0
92
92
  end
93
93
 
94
94
  def phantomjs_options
95
- @config['phantomjs_options']
95
+ @config["phantomjs_options"]
96
96
  end
97
97
  end
@@ -1,68 +1,116 @@
1
- require 'rspec-given'
2
- require 'image_size'
3
- require './lib/wraith/cli'
1
+ require "rspec"
2
+ require "image_size"
3
+ require "./lib/wraith/cli"
4
4
 
5
5
  describe Wraith do
6
- Given { Wraith::FolderManager.new(config_name).clear_shots_folder }
7
- Given { Dir.mkdir('shots/test') }
8
- let(:config_name) { 'test_config' }
9
- let(:test_url1) { 'http://www.bbc.co.uk/russian' }
10
- let(:test_url2) { 'http://www.bbc.co.uk/russian' }
11
- let(:test_image1) { 'shots/test/test1.png' }
12
- let(:test_image2) { 'shots/test/test2.png' }
13
- let(:diff_image) { 'shots/test/test_diff.png' }
14
- let(:data_txt) { 'shots/test/test.txt' }
15
- let(:selector) { '' }
6
+ let(:config_name) { "test_config" }
7
+ let(:test_url1) { "http://www.bbc.co.uk/russian" }
8
+ let(:test_url2) { "http://www.bbc.co.uk/russian" }
9
+ let(:test_image1) { "shots/test/test1.png" }
10
+ let(:test_image2) { "shots/test/test2.png" }
11
+ let(:diff_image) { "shots/test/test_diff.png" }
12
+ let(:data_txt) { "shots/test/test.txt" }
13
+ let(:selector) { "" }
16
14
  let(:saving) { Wraith::SaveImages.new(config_name) }
15
+ let(:wraith) { Wraith::Wraith.new(config_name) }
17
16
 
18
- When(:wraith) { Wraith::Wraith.new(config_name) }
19
- Then { wraith.is_a? Wraith::Wraith }
17
+ before(:each) do
18
+ Wraith::FolderManager.new(config_name).clear_shots_folder
19
+ Dir.mkdir("shots/test")
20
+ end
20
21
 
21
- context 'When creating a wraith worker' do
22
+ describe "Config" do
23
+ it "returns a Wraith class" do
24
+ expect(wraith).is_a? Wraith::Wraith
25
+ end
22
26
 
23
- Then { wraith.config.keys.size == 7 }
24
- Then { wraith.widths == [320, 600, 1280] }
25
- Then { wraith.base_domain == 'http://www.bbc.co.uk/russian' }
26
- Then { wraith.comp_domain == 'http://www.bbc.co.uk/russian' }
27
- Then { wraith.base_domain_label == 'english' }
28
- Then { wraith.comp_domain_label == 'russian' }
29
- Then { wraith.paths == { 'home' => '/', 'uk_index' => '/uk' } }
27
+ it "when config is loaded" do
28
+ expect(wraith).to respond_to :config
29
+ end
30
+
31
+ it "contains shot options" do
32
+ expect(wraith.config).to include "directory" => "shots"
33
+ end
30
34
  end
31
35
 
32
- context 'When capturing an image' do
33
- # capture_page_image
34
- When do
35
- wraith.engine.each do |_type, engine|
36
- saving.capture_page_image(engine, test_url1, 320, test_image1, selector)
37
- end
36
+ context "When creating a wraith worker" do
37
+ it "should have 7 config keys" do
38
+ expect(wraith.config.keys.size).to be 7
39
+ end
40
+
41
+ it "should have widths" do
42
+ expect(wraith.widths).to eq [320, 600, 1280]
43
+ end
44
+
45
+ it "include base domain" do
46
+ expect(wraith.base_domain).to eq "http://www.bbc.co.uk/russian"
47
+ end
48
+
49
+ it "include compare domain" do
50
+ expect(wraith.comp_domain).to eq "http://www.bbc.co.uk/russian"
51
+ end
52
+
53
+ it "include base label" do
54
+ expect(wraith.base_domain_label).to eq "english"
55
+ end
56
+
57
+ it "include compare label" do
58
+ expect(wraith.comp_domain_label).to eq "russian"
59
+ end
60
+
61
+ it "include compare label" do
62
+ expect(wraith.paths).to eq("home" => "/", "uk_index" => "/uk")
38
63
  end
39
- When(:image_size) { ImageSize.path(test_image1).size }
40
- Then { image_size[0] == 320 }
41
64
  end
42
65
 
43
- context 'When comparing images' do
44
- When(:diff_image_size) do
66
+ describe "When capturing an image" do
67
+ let(:image_size) { ImageSize.path(test_image1).size }
68
+
69
+ it "saves image" do
45
70
  wraith.engine.each do |_type, engine|
46
71
  saving.capture_page_image(engine, test_url1, 320, test_image1, selector)
47
- saving.capture_page_image(engine, test_url2, 320, test_image2, selector)
48
72
  end
49
- Wraith::CropImages.new(config_name).crop_images
50
- Wraith::CompareImages.new(config_name).compare_task(test_image1, test_image2, diff_image, data_txt)
51
- ImageSize.path(diff_image).size
73
+
74
+ expect(image_size[0]).to eq 320
52
75
  end
53
- Then { diff_image_size[0] == 320 }
54
76
  end
55
77
 
56
- context 'When generating tumbnails' do
57
- When do
58
- wraith.engine.each do |_type, engine|
59
- saving.capture_page_image(engine, test_url1, 320, test_image1, selector)
60
- saving.capture_page_image(engine, test_url2, 320, test_image2, selector)
61
- end
62
- Wraith::CropImages.new(config_name).crop_images
78
+ describe "When comparing images" do
79
+ it "should compare" do
80
+ create_diff_image
81
+ crop_images
82
+ compare_images
83
+
84
+ diff = ImageSize.path(diff_image).size
85
+
86
+ expect(diff[0]).to eq 320
87
+ end
88
+ end
89
+
90
+ describe "When generating tumbnails" do
91
+ it "produce thumbnails" do
92
+ create_diff_image
63
93
  Wraith::CompareImages.new(config_name).compare_task(test_image1, test_image2, diff_image, data_txt)
64
94
  Wraith::Thumbnails.new(config_name).generate_thumbnails
95
+
96
+ expect(File).to exist("shots/thumbnails/test/test1.png")
97
+ expect(File).to exist("shots/thumbnails/test/test2.png")
98
+ expect(File).to exist("shots/thumbnails/test/test_diff.png")
65
99
  end
66
- Then { File.exist?('shots/thumbnails/test/test1.png') && File.exist?('shots/thumbnails/test/test2.png') && File.exist?('shots/thumbnails/test/test_diff.png') }
67
100
  end
68
101
  end
102
+
103
+ def create_diff_image
104
+ wraith.engine.each do |_type, engine|
105
+ saving.capture_page_image(engine, test_url1, 320, test_image1, selector)
106
+ saving.capture_page_image(engine, test_url2, 320, test_image2, selector)
107
+ end
108
+ end
109
+
110
+ def crop_images
111
+ Wraith::CropImages.new(config_name).crop_images
112
+ end
113
+
114
+ def compare_images
115
+ Wraith::CompareImages.new(config_name).compare_task(test_image1, test_image2, diff_image, data_txt)
116
+ end
@@ -11,7 +11,12 @@ var selector = casper.cli.get(3);
11
11
  casper.start(url, function() {
12
12
  this.viewport(view_port_width, 1500).then(function(){
13
13
  this.wait(2000, function() {
14
- this.captureSelector(image_name, selector);
14
+ if (selector == undefined) {
15
+ this.capture(image_name);
16
+ }
17
+ else {
18
+ this.captureSelector(image_name, selector);
19
+ }
15
20
  console.log('Snapping ' + url + ' at width ' + view_port_width);
16
21
  });
17
22
  });
@@ -19,7 +19,7 @@ Gem::Specification.new do |spec|
19
19
  spec.require_paths = ['lib']
20
20
 
21
21
  spec.add_development_dependency 'pry'
22
- spec.add_development_dependency 'rspec-given'
22
+ spec.add_development_dependency 'rspec'
23
23
 
24
24
  spec.add_runtime_dependency 'rake'
25
25
  spec.add_runtime_dependency 'image_size'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: wraith
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.3.2
4
+ version: 2.3.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dave Blooman
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2015-02-09 00:00:00.000000000 Z
12
+ date: 2015-04-05 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: pry
@@ -26,7 +26,7 @@ dependencies:
26
26
  - !ruby/object:Gem::Version
27
27
  version: '0'
28
28
  - !ruby/object:Gem::Dependency
29
- name: rspec-given
29
+ name: rspec
30
30
  requirement: !ruby/object:Gem::Requirement
31
31
  requirements:
32
32
  - - '>='
@@ -177,6 +177,7 @@ extra_rdoc_files: []
177
177
  files:
178
178
  - .gemset
179
179
  - .gitignore
180
+ - .rubocop.yml
180
181
  - .ruby-version
181
182
  - .travis.yml
182
183
  - Dockerfile