slimmer 13.0.0 → 13.3.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
- SHA1:
3
- metadata.gz: 668e43ea2579afcef2047274b110c10f7a377560
4
- data.tar.gz: eb7f475b36cda8923e92c230bb190121cea7badb
2
+ SHA256:
3
+ metadata.gz: 29c95c6ec5fcb3d786e88628da00aa44018de1a338e49359d19088db092ea025
4
+ data.tar.gz: 5c2f32ef832e751dc5812af7cb9d388fd4a36c8bde03d9525f58b7a46b5f0e87
5
5
  SHA512:
6
- metadata.gz: d02f1d56e8dd317087cc6a237cedb52df633e7baad7e35cb36f5ec934d2adf6610d272fa1c76d05b2ee8883c553cc1d0cadf44c0932457ecb1e27e6448c157e4
7
- data.tar.gz: 3937badf8181de169406b57a6ba2eed98250d49239f727e3fd1e5d80899872e53c2da45f7af7324777117a599935f414e658b800a53bf0ed6db041db30c9498a
6
+ metadata.gz: 111d7b5964863534428a2a6b9f46252f49624cb226c524e6c048cbff155c2a37d96cf14f85ade73d71b9b8bbeef1065596f9e795682f7f4fe913529fb0225116
7
+ data.tar.gz: 182cab20358b7ae4b69b17c11b19ddb6697e54bd94cd66575478bdc0fa11d6a03597d9788ec4c03b6da22f6ccbb5a4156042aaecb433b1c7ddc907c2e3b7934f
@@ -1,3 +1,33 @@
1
+ # 13.3.0
2
+
3
+ * Add X-Slimmer-Ignore-Error header flag to prevent overriding non-200 status responses
4
+
5
+ # 13.2.2
6
+
7
+ * Fix bug where parent_name was called without app
8
+
9
+ # 13.2.1
10
+
11
+ * Fix deprecation warning: `Module#parent_name` has been renamed to
12
+ `module_parent_name`. `parent_name` is deprecated and will be removed in
13
+ Rails 6.1. (#237)
14
+ * Migrate from govuk-lint to rubocop-govuk (#237)
15
+ * Remove lint rake task (#237)
16
+ * Fix linting issues (#237)
17
+ * Fix deprecation warning: Mocha deprecation warning at
18
+ /my/local/path/to/test/test_helper.rb:6:in 'require': Require
19
+ 'mocha/test_unit', 'mocha/minitest' or 'mocha/api' instead of 'mocha/setup'.
20
+ (#237)
21
+
22
+ # 13.2.0
23
+
24
+ * Upgrade Ruby version to 2.6.5. (#234)
25
+ * Fix linting issues. (#234)
26
+
27
+ # 13.1.0
28
+
29
+ * Add `js-enabled` to body tag of test templates. (#226)
30
+
1
31
  # 13.0.0
2
32
 
3
33
  * Drop cache TTL to 60 seconds.
data/Rakefile CHANGED
@@ -2,9 +2,9 @@
2
2
 
3
3
  require "bundler/gem_tasks"
4
4
  require "rdoc/task"
5
- require 'rake/testtask'
5
+ require "rake/testtask"
6
6
 
7
- Dir.glob('lib/tasks/*.rake').each { |r| import r }
7
+ Dir.glob("lib/tasks/*.rake").each { |r| import r }
8
8
 
9
9
  RDoc::Task.new do |rd|
10
10
  rd.rdoc_files.include("lib/**/*.rb")
@@ -12,10 +12,10 @@ RDoc::Task.new do |rd|
12
12
  end
13
13
 
14
14
  Rake::TestTask.new("test") do |t|
15
- t.ruby_opts << "-rubygems"
15
+ t.ruby_opts << "-rrubygems"
16
16
  t.libs << "test"
17
17
  t.test_files = FileList["test/**/*_test.rb"]
18
18
  t.verbose = true
19
19
  end
20
20
 
21
- task :default => [:test, :lint]
21
+ task default: %i[test]
@@ -1,26 +1,25 @@
1
1
  #! /usr/bin/env ruby
2
2
 
3
- require 'optparse'
4
- require 'slimmer'
5
- require 'logger'
3
+ require "optparse"
4
+ require "slimmer"
5
+ require "logger"
6
6
 
7
7
  options = {}
8
- OptionParser.new do |opts|
9
- opts.on '-t', '--template=TEMPLATE',
10
- 'Template to render' do |v|
8
+ option_parser = OptionParser.new do |opts|
9
+ opts.on "-t", "--template=TEMPLATE", "Template to render" do |v|
11
10
  options[:template] = v
12
11
  end
13
12
 
14
- opts.on '-h', '--asset-host=HOST',
15
- 'Host that serves assets used in the template' do |v|
13
+ opts.on "-h", "--asset-host=HOST", "Host that serves assets used in the template" do |v|
16
14
  options[:asset_host] = v
17
15
  end
18
16
 
19
- opts.on '-o', '--output-file=FILE',
20
- 'File to write static error page to' do |v|
17
+ opts.on "-o", "--output-file=FILE", "File to write static error page to" do |v|
21
18
  options[:file] = v
22
19
  end
23
- end.parse!
20
+ end
21
+
22
+ option_parser.parse!
24
23
 
25
24
  raise "Please specify a template" unless options[:template]
26
25
  raise "Please specify an asset host" unless options[:asset_host]
@@ -28,13 +27,13 @@ raise "Please specify an output file" unless options[:file]
28
27
 
29
28
  logger = Logger.new STDOUT
30
29
  logger.level = Logger::DEBUG
31
- skin = Slimmer::Skin.new options[:asset_host], false, :logger => logger
30
+ skin = Slimmer::Skin.new options[:asset_host], false, logger: logger
32
31
  static_error = skin.error nil, options[:template], Nokogiri::HTML("").to_html
33
32
 
34
- if options[:file] == '-'
33
+ if options[:file] == "-"
35
34
  STDOUT.print static_error
36
35
  else
37
- File.open options[:file], 'w' do |f|
36
+ File.open options[:file], "w" do |f|
38
37
  f.print static_error
39
38
  end
40
39
  end
@@ -1,10 +1,10 @@
1
- require 'nokogiri'
2
- require 'erb'
3
- require 'plek'
4
- require 'null_logger'
1
+ require "nokogiri"
2
+ require "erb"
3
+ require "plek"
4
+ require "null_logger"
5
5
 
6
- require 'slimmer/version'
7
- require 'slimmer/railtie' if defined? Rails
6
+ require "slimmer/version"
7
+ require "slimmer/railtie" if defined? Rails
8
8
 
9
9
  module Slimmer
10
10
  CACHE_TTL = 60
@@ -19,29 +19,29 @@ module Slimmer
19
19
  end
20
20
  end
21
21
 
22
- autoload :Railtie, 'slimmer/railtie'
23
- autoload :Skin, 'slimmer/skin'
22
+ autoload :Railtie, "slimmer/railtie"
23
+ autoload :Skin, "slimmer/skin"
24
24
 
25
- autoload :Template, 'slimmer/template'
26
- autoload :App, 'slimmer/app'
27
- autoload :Headers, 'slimmer/headers'
28
- autoload :HTTPClient, 'slimmer/http_client'
25
+ autoload :Template, "slimmer/template"
26
+ autoload :App, "slimmer/app"
27
+ autoload :Headers, "slimmer/headers"
28
+ autoload :HTTPClient, "slimmer/http_client"
29
29
 
30
30
  module Processors
31
- autoload :BodyClassCopier, 'slimmer/processors/body_class_copier'
32
- autoload :BodyInserter, 'slimmer/processors/body_inserter'
33
- autoload :ConditionalCommentMover, 'slimmer/processors/conditional_comment_mover'
34
- autoload :FooterRemover, 'slimmer/processors/footer_remover'
35
- autoload :MetadataInserter, 'slimmer/processors/metadata_inserter'
36
- autoload :HeaderContextInserter, 'slimmer/processors/header_context_inserter'
37
- autoload :InsideHeaderInserter, 'slimmer/processors/inside_header_inserter'
38
- autoload :NavigationMover, 'slimmer/processors/navigation_mover'
39
- autoload :SearchIndexSetter, 'slimmer/processors/search_index_setter'
40
- autoload :SearchPathSetter, 'slimmer/processors/search_path_setter'
41
- autoload :SearchParameterInserter, 'slimmer/processors/search_parameter_inserter'
42
- autoload :SearchRemover, 'slimmer/processors/search_remover'
43
- autoload :TagMover, 'slimmer/processors/tag_mover'
44
- autoload :TitleInserter, 'slimmer/processors/title_inserter'
31
+ autoload :BodyClassCopier, "slimmer/processors/body_class_copier"
32
+ autoload :BodyInserter, "slimmer/processors/body_inserter"
33
+ autoload :ConditionalCommentMover, "slimmer/processors/conditional_comment_mover"
34
+ autoload :FooterRemover, "slimmer/processors/footer_remover"
35
+ autoload :MetadataInserter, "slimmer/processors/metadata_inserter"
36
+ autoload :HeaderContextInserter, "slimmer/processors/header_context_inserter"
37
+ autoload :InsideHeaderInserter, "slimmer/processors/inside_header_inserter"
38
+ autoload :NavigationMover, "slimmer/processors/navigation_mover"
39
+ autoload :SearchIndexSetter, "slimmer/processors/search_index_setter"
40
+ autoload :SearchPathSetter, "slimmer/processors/search_path_setter"
41
+ autoload :SearchParameterInserter, "slimmer/processors/search_parameter_inserter"
42
+ autoload :SearchRemover, "slimmer/processors/search_remover"
43
+ autoload :TagMover, "slimmer/processors/tag_mover"
44
+ autoload :TitleInserter, "slimmer/processors/title_inserter"
45
45
  end
46
46
 
47
47
  class TemplateNotFoundException < StandardError; end
@@ -1,23 +1,20 @@
1
- require 'slimmer/govuk_request_id'
1
+ require "slimmer/govuk_request_id"
2
2
 
3
3
  module Slimmer
4
4
  class App
5
5
  attr_accessor :logger
6
6
 
7
- def initialize(app, *args, &block)
7
+ def initialize(app, *args)
8
8
  options = args.first || {}
9
9
  @app = app
10
10
 
11
11
  logger = options[:logger] || NullLogger.instance
12
12
  self.logger = logger
13
- begin
14
- if logger.level == 0 # Log set to debug level
15
- unless options[:enable_debugging]
16
- self.logger = logger.dup
17
- self.logger.level = 1 # info
18
- end
13
+ if logger&.level&.zero? # Log set to debug level
14
+ unless options[:enable_debugging]
15
+ self.logger = logger.dup
16
+ self.logger.level = 1 # info
19
17
  end
20
- rescue NoMethodError # In case logger doesn't respond_to? :level
21
18
  end
22
19
 
23
20
  if options.key? :template_path
@@ -55,22 +52,27 @@ module Slimmer
55
52
  end
56
53
 
57
54
  def in_development?
58
- ENV['RAILS_ENV'] == 'development'
55
+ ENV["RAILS_ENV"] == "development"
59
56
  end
60
57
 
61
58
  def skip_slimmer_param?(env)
62
- skip = Rack::Request.new(env).params['skip_slimmer']
63
- skip and skip.to_i > 0
59
+ skip = Rack::Request.new(env).params["skip_slimmer"]
60
+ skip && skip.to_i.positive?
64
61
  end
65
62
 
66
63
  def skip_slimmer_header?(response)
67
64
  !!response.headers[Headers::SKIP_HEADER]
68
65
  end
69
66
 
67
+ def ignore_error_header?(response)
68
+ !!response.headers[Headers::IGNORE_ERROR_HEADER]
69
+ end
70
+
70
71
  def s(body)
71
72
  return body.to_s unless body.respond_to?(:each)
73
+
72
74
  b = ""
73
- body.each {|a| b << a }
75
+ body.each { |a| b << a }
74
76
  b
75
77
  end
76
78
 
@@ -84,30 +86,36 @@ module Slimmer
84
86
  request = Rack::Request.new(env)
85
87
 
86
88
  # Store the request id so it can be passed on with any template requests
87
- GovukRequestId.value = env['HTTP_GOVUK_REQUEST_ID']
89
+ GovukRequestId.value = env["HTTP_GOVUK_REQUEST_ID"]
90
+
91
+ body = rewritten_body(request, response)
92
+
93
+ body = [body] unless body.respond_to?(:each)
94
+ response.body = body
95
+ response.headers["Content-Length"] = content_length(response.body)
96
+
97
+ response.finish
98
+ end
99
+
100
+ def rewritten_body(request, response)
101
+ return @skin.success request, response, s(response.body) if ignore_error_header?(response)
88
102
 
89
- rewritten_body = case response.status
103
+ case response.status
90
104
  when 200
91
105
  @skin.success request, response, s(response.body)
92
106
  when 403
93
- @skin.error '403', s(response.body), request.env
107
+ @skin.error "403", s(response.body), request.env
94
108
  when 404
95
- @skin.error '404', s(response.body), request.env
109
+ @skin.error "404", s(response.body), request.env
96
110
  when 410
97
- @skin.error '410', s(response.body), request.env
111
+ @skin.error "410", s(response.body), request.env
98
112
  else
99
- @skin.error '500', s(response.body), request.env
113
+ @skin.error "500", s(response.body), request.env
100
114
  end
101
-
102
- rewritten_body = [rewritten_body] unless rewritten_body.respond_to?(:each)
103
- response.body = rewritten_body
104
- response.headers['Content-Length'] = content_length(response.body)
105
-
106
- response.finish
107
115
  end
108
116
 
109
117
  def strip_slimmer_headers(headers)
110
- headers.reject {|k, v| k =~ /\A#{Headers::HEADER_PREFIX}/ }
118
+ headers.reject { |k, _v| k =~ /\A#{Headers::HEADER_PREFIX}/ }
111
119
  end
112
120
  end
113
121
  end
@@ -1,3 +1,3 @@
1
- require 'cucumber'
1
+ require "cucumber"
2
2
 
3
- require 'slimmer/test'
3
+ require "slimmer/test"
@@ -5,7 +5,7 @@ module Slimmer
5
5
  InvalidHeader = Class.new(RuntimeError)
6
6
 
7
7
  # @private
8
- HEADER_PREFIX = "X-Slimmer"
8
+ HEADER_PREFIX = "X-Slimmer".freeze
9
9
 
10
10
  # @private
11
11
  SLIMMER_HEADER_MAPPING = {
@@ -20,45 +20,51 @@ module Slimmer
20
20
  skip: "Skip",
21
21
  template: "Template",
22
22
  remove_search: "Remove-Search",
23
- }
23
+ ignore_error: "Ignore-Error",
24
+ }.freeze
24
25
 
25
26
  # @private
26
- APPLICATION_NAME_HEADER = "#{HEADER_PREFIX}-#{SLIMMER_HEADER_MAPPING[:application_name]}"
27
+ APPLICATION_NAME_HEADER = "#{HEADER_PREFIX}-#{SLIMMER_HEADER_MAPPING[:application_name]}".freeze
27
28
 
28
29
  # @private
29
- FORMAT_HEADER = "#{HEADER_PREFIX}-#{SLIMMER_HEADER_MAPPING[:format]}"
30
+ FORMAT_HEADER = "#{HEADER_PREFIX}-#{SLIMMER_HEADER_MAPPING[:format]}".freeze
30
31
 
31
32
  # @private
32
- ORGANISATIONS_HEADER = "#{HEADER_PREFIX}-#{SLIMMER_HEADER_MAPPING[:organisations]}"
33
+ ORGANISATIONS_HEADER = "#{HEADER_PREFIX}-#{SLIMMER_HEADER_MAPPING[:organisations]}".freeze
33
34
 
34
35
  # @private
35
- WORLD_LOCATIONS_HEADER = "#{HEADER_PREFIX}-#{SLIMMER_HEADER_MAPPING[:world_locations]}"
36
+ WORLD_LOCATIONS_HEADER = "#{HEADER_PREFIX}-#{SLIMMER_HEADER_MAPPING[:world_locations]}".freeze
36
37
 
37
38
  # @private
38
- PAGE_OWNER_HEADER = "#{HEADER_PREFIX}-#{SLIMMER_HEADER_MAPPING[:page_owner]}"
39
+ PAGE_OWNER_HEADER = "#{HEADER_PREFIX}-#{SLIMMER_HEADER_MAPPING[:page_owner]}".freeze
39
40
 
40
41
  # @private
41
- RESULT_COUNT_HEADER = "#{HEADER_PREFIX}-#{SLIMMER_HEADER_MAPPING[:result_count]}"
42
+ RESULT_COUNT_HEADER = "#{HEADER_PREFIX}-#{SLIMMER_HEADER_MAPPING[:result_count]}".freeze
42
43
 
43
44
  # @private
44
- SEARCH_PATH_HEADER = "#{HEADER_PREFIX}-Search-Path"
45
+ SEARCH_PATH_HEADER = "#{HEADER_PREFIX}-Search-Path".freeze
45
46
 
46
47
  # @private
47
- SEARCH_PARAMETERS_HEADER = "#{HEADER_PREFIX}-#{SLIMMER_HEADER_MAPPING[:search_parameters]}"
48
+ SEARCH_PARAMETERS_HEADER = "#{HEADER_PREFIX}-#{SLIMMER_HEADER_MAPPING[:search_parameters]}".freeze
48
49
 
49
50
  # @private
50
- SKIP_HEADER = "#{HEADER_PREFIX}-#{SLIMMER_HEADER_MAPPING[:skip]}"
51
+ SKIP_HEADER = "#{HEADER_PREFIX}-#{SLIMMER_HEADER_MAPPING[:skip]}".freeze
51
52
 
52
53
  # @private
53
- TEMPLATE_HEADER = "#{HEADER_PREFIX}-#{SLIMMER_HEADER_MAPPING[:template]}"
54
+ TEMPLATE_HEADER = "#{HEADER_PREFIX}-#{SLIMMER_HEADER_MAPPING[:template]}".freeze
54
55
 
55
56
  # @private
56
- REMOVE_SEARCH_HEADER = "#{HEADER_PREFIX}-#{SLIMMER_HEADER_MAPPING[:remove_search]}"
57
+ REMOVE_SEARCH_HEADER = "#{HEADER_PREFIX}-#{SLIMMER_HEADER_MAPPING[:remove_search]}".freeze
58
+
59
+ # @private
60
+ IGNORE_ERROR_HEADER = "#{HEADER_PREFIX}-#{SLIMMER_HEADER_MAPPING[:ignore_error]}".freeze
61
+
57
62
 
58
63
  # Set the "slimmer headers" to configure the page
59
64
  #
60
65
  # @param hash [Hash] the options
61
66
  # @option hash [String] application_name
67
+ # @option hash [String] ignore_error
62
68
  # @option hash [String] format
63
69
  # @option hash [String] organisations
64
70
  # @option hash [String] page_owner
@@ -71,6 +77,7 @@ module Slimmer
71
77
  # @option hash [String] world_locations
72
78
  def set_slimmer_headers(hash)
73
79
  raise InvalidHeader if (hash.keys - SLIMMER_HEADER_MAPPING.keys).any?
80
+
74
81
  SLIMMER_HEADER_MAPPING.each do |hash_key, header_suffix|
75
82
  value = hash[hash_key]
76
83
  headers["#{HEADER_PREFIX}-#{header_suffix}"] = value.to_s if value
@@ -2,11 +2,11 @@ module Slimmer::Processors
2
2
  class BodyClassCopier
3
3
  def filter(src, dest)
4
4
  src_body_tag = src.at_css("body")
5
- dest_body_tag = dest.at_css('body')
5
+ dest_body_tag = dest.at_css("body")
6
6
  if src_body_tag.has_attribute?("class")
7
- combinded_classes = dest_body_tag.attr('class').to_s.split(/ +/)
8
- combinded_classes << src_body_tag.attr('class').to_s.split(/ +/)
9
- dest_body_tag.set_attribute("class", combinded_classes.join(' '))
7
+ combinded_classes = dest_body_tag.attr("class").to_s.split(/ +/)
8
+ combinded_classes << src_body_tag.attr("class").to_s.split(/ +/)
9
+ dest_body_tag.set_attribute("class", combinded_classes.join(" "))
10
10
  end
11
11
  end
12
12
  end
@@ -1,11 +1,11 @@
1
1
  module Slimmer::Processors
2
2
  class BodyInserter
3
- def initialize(source_id='wrapper', destination_id='wrapper')
4
- @source_selector = '#' + source_id
5
- @destination_selector = '#' + destination_id
3
+ def initialize(source_id = "wrapper", destination_id = "wrapper")
4
+ @source_selector = "#" + source_id
5
+ @destination_selector = "#" + destination_id
6
6
  end
7
7
 
8
- def filter(src,dest)
8
+ def filter(src, dest)
9
9
  body = Nokogiri::HTML.fragment(src.at_css(@source_selector).to_html)
10
10
  dest.at_css(@destination_selector).replace(body)
11
11
  end
@@ -1,9 +1,9 @@
1
1
  module Slimmer::Processors
2
2
  class ConditionalCommentMover
3
3
  def filter(src, dest)
4
- src.xpath('//comment()').each do |comment|
4
+ src.xpath("//comment()").each do |comment|
5
5
  if match_conditional_comments(comment)
6
- dest.at_xpath('/html/head') << comment
6
+ dest.at_xpath("/html/head") << comment
7
7
  end
8
8
  end
9
9
  end
@@ -13,5 +13,3 @@ module Slimmer::Processors
13
13
  end
14
14
  end
15
15
  end
16
-
17
-
@@ -1,6 +1,6 @@
1
1
  module Slimmer::Processors
2
2
  class FooterRemover
3
- def filter(src,dest)
3
+ def filter(src, _dest)
4
4
  footer = src.at_css("#footer")
5
5
  footer.remove if footer
6
6
  end
@@ -1,11 +1,11 @@
1
1
  module Slimmer::Processors
2
2
  class HeaderContextInserter
3
- def initialize(path='.header-context')
3
+ def initialize(path = ".header-context")
4
4
  @path = path
5
5
  end
6
6
 
7
- def filter(src,dest)
8
- if dest.at_css(@path) && replacement = src.at_css(@path)
7
+ def filter(src, dest)
8
+ if dest.at_css(@path) && (replacement = src.at_css(@path))
9
9
  header_context = src.fragment(replacement)
10
10
  dest.at_css(@path).replace(header_context)
11
11
  end
@@ -1,10 +1,10 @@
1
1
  module Slimmer::Processors
2
2
  class InsideHeaderInserter
3
3
  def filter(src, dest)
4
- insertion = src.at_css('.slimmer-inside-header')
4
+ insertion = src.at_css(".slimmer-inside-header")
5
5
 
6
6
  if insertion
7
- logo = dest.at_css('.header-logo')
7
+ logo = dest.at_css(".header-logo")
8
8
  logo.add_next_sibling(insertion.inner_html) unless logo.nil?
9
9
  end
10
10
  end
@@ -5,23 +5,23 @@ module Slimmer::Processors
5
5
  @app_name = app_name
6
6
  end
7
7
 
8
- def filter(src, dest)
9
- head = dest.at_css('head')
8
+ def filter(_src, dest)
9
+ head = dest.at_css("head")
10
10
 
11
- add_meta_tag('analytics:organisations', @headers[Slimmer::Headers::ORGANISATIONS_HEADER], head)
12
- add_meta_tag('analytics:world-locations', @headers[Slimmer::Headers::WORLD_LOCATIONS_HEADER], head)
13
- add_meta_tag('format', @headers[Slimmer::Headers::FORMAT_HEADER], head)
14
- add_meta_tag('search-result-count', @headers[Slimmer::Headers::RESULT_COUNT_HEADER], head)
15
- add_meta_tag('rendering-application', @app_name, head)
11
+ add_meta_tag("analytics:organisations", @headers[Slimmer::Headers::ORGANISATIONS_HEADER], head)
12
+ add_meta_tag("analytics:world-locations", @headers[Slimmer::Headers::WORLD_LOCATIONS_HEADER], head)
13
+ add_meta_tag("format", @headers[Slimmer::Headers::FORMAT_HEADER], head)
14
+ add_meta_tag("search-result-count", @headers[Slimmer::Headers::RESULT_COUNT_HEADER], head)
15
+ add_meta_tag("rendering-application", @app_name, head)
16
16
  end
17
17
 
18
18
  private
19
19
 
20
20
  def add_meta_tag(name, content, head)
21
21
  if content
22
- meta_node = Nokogiri::XML::Node.new('meta', head)
23
- meta_node['name'] = "govuk:#{name}"
24
- meta_node['content'] = content
22
+ meta_node = Nokogiri::XML::Node.new("meta", head)
23
+ meta_node["name"] = "govuk:#{name}"
24
+ meta_node["content"] = content
25
25
 
26
26
  head.add_child(meta_node)
27
27
  end
@@ -1,5 +1,4 @@
1
1
  class Slimmer::Processors::NavigationMover
2
-
3
2
  def initialize(skin)
4
3
  @skin = skin
5
4
  end
@@ -10,16 +9,16 @@ class Slimmer::Processors::NavigationMover
10
9
  if proposition_header && global_header
11
10
  proposition_header.remove
12
11
 
13
- global_header['class'] = [global_header['class'], 'with-proposition'].compact.join(' ')
12
+ global_header["class"] = [global_header["class"], "with-proposition"].compact.join(" ")
14
13
 
15
14
  header_block = Nokogiri::HTML.fragment(proposition_header_block)
16
- header_block.at_css('.content') << proposition_header
15
+ header_block.at_css(".content") << proposition_header
17
16
 
18
- global_header.at_css('.header-wrapper') << header_block
17
+ global_header.at_css(".header-wrapper") << header_block
19
18
  end
20
19
  end
21
20
 
22
21
  def proposition_header_block
23
- @proposition_header_block ||= @skin.template('proposition_menu')
22
+ @proposition_header_block ||= @skin.template("proposition_menu")
24
23
  end
25
24
  end
@@ -1,4 +1,4 @@
1
- require 'json'
1
+ require "json"
2
2
 
3
3
  module Slimmer::Processors
4
4
  class SearchParameterInserter
@@ -6,8 +6,8 @@ module Slimmer::Processors
6
6
  @response = response
7
7
  end
8
8
 
9
- def filter(content_document, page_template)
10
- search_form = page_template.at_css('form#search')
9
+ def filter(_content_document, page_template)
10
+ search_form = page_template.at_css("form#search")
11
11
  if search_parameters && search_form
12
12
  search_parameters.each_pair do |name, value|
13
13
  # Value can either be a string or an array of values
@@ -24,10 +24,10 @@ module Slimmer::Processors
24
24
  end
25
25
 
26
26
  def add_hidden_input(search_form, name, value)
27
- element = Nokogiri::XML::Node.new('input', search_form)
28
- element['type'] = 'hidden'
29
- element['name'] = name
30
- element['value'] = value.to_s
27
+ element = Nokogiri::XML::Node.new("input", search_form)
28
+ element["type"] = "hidden"
29
+ element["name"] = name
30
+ element["value"] = value.to_s
31
31
  search_form.add_child(element)
32
32
  end
33
33
 
@@ -4,9 +4,9 @@ module Slimmer::Processors
4
4
  @response = response
5
5
  end
6
6
 
7
- def filter(content_document, page_template)
8
- if search_scope && page_template.at_css('form#search')
9
- page_template.at_css('form#search').attributes["action"].value = search_scope
7
+ def filter(_content_document, page_template)
8
+ if search_scope && page_template.at_css("form#search")
9
+ page_template.at_css("form#search").attributes["action"].value = search_scope
10
10
  end
11
11
  end
12
12
 
@@ -4,7 +4,7 @@ module Slimmer::Processors
4
4
  @headers = headers
5
5
  end
6
6
 
7
- def filter(src,dest)
7
+ def filter(_src, dest)
8
8
  if @headers.include?(Slimmer::Headers::REMOVE_SEARCH_HEADER)
9
9
  search = dest.at_css("#global-header #search")
10
10
  search.remove if search
@@ -1,10 +1,10 @@
1
1
  module Slimmer::Processors
2
2
  class TagMover
3
3
  def filter(src, dest)
4
- move_tags(src, dest, 'script', dest_node: 'body', keys: %w(src inner_html))
5
- move_tags(src, dest, 'link', must_have: ['href'])
6
- move_tags(src, dest, 'meta', must_have: %w(name content), keys: ['name', 'content', 'http-equiv'], insertion_location: :top)
7
- move_tags(src, dest, 'meta', must_have: %w(property content), keys: %w(property content), insertion_location: :top)
4
+ move_tags(src, dest, "script", dest_node: "body", keys: %w(src inner_html))
5
+ move_tags(src, dest, "link", must_have: %w[href])
6
+ move_tags(src, dest, "meta", must_have: %w(name content), keys: %w[name content http-equiv], insertion_location: :top)
7
+ move_tags(src, dest, "meta", must_have: %w(property content), keys: %w(property content), insertion_location: :top)
8
8
  end
9
9
 
10
10
  def include_tag?(node, min_attrs)
@@ -12,17 +12,19 @@ module Slimmer::Processors
12
12
  end
13
13
 
14
14
  def tag_fingerprint(node, attrs)
15
- attrs.collect do |attr_name|
16
- if attr_name == 'inner_html'
15
+ collected_attrs = attrs.collect do |attr_name|
16
+ if attr_name == "inner_html"
17
17
  node.content
18
18
  else
19
19
  node.has_attribute?(attr_name) ? node.attr(attr_name) : nil
20
20
  end
21
- end.compact.sort
21
+ end
22
+
23
+ collected_attrs.compact.sort
22
24
  end
23
25
 
24
26
  def wrap_node(src, node)
25
- if node.previous_sibling.to_s =~ /<!--\[if[^\]]+\]><!-->/ && node.next_sibling.to_s == '<!--<![endif]-->'
27
+ if node.previous_sibling.to_s =~ /<!--\[if[^\]]+\]><!-->/ && node.next_sibling.to_s == "<!--<![endif]-->"
26
28
  node = Nokogiri::XML::NodeSet.new(src, [node.previous_sibling, node, node.next_sibling])
27
29
  end
28
30
  node
@@ -34,7 +36,7 @@ module Slimmer::Processors
34
36
  already_there = dest.css(type).map { |node|
35
37
  tag_fingerprint(node, comparison_attrs)
36
38
  }.compact
37
- dest_node = opts[:dest_node] || 'head'
39
+ dest_node = opts[:dest_node] || "head"
38
40
 
39
41
  src.css(type).each do |node|
40
42
  if include_tag?(node, min_attrs) && !already_there.include?(tag_fingerprint(node, comparison_attrs))
@@ -1,18 +1,18 @@
1
1
  module Slimmer::Processors
2
2
  class TitleInserter
3
- def filter(src,dest)
4
- title = src.at_css('head title')
5
- head = dest.at_xpath('/html/head')
3
+ def filter(src, dest)
4
+ title = src.at_css("head title")
5
+ head = dest.at_xpath("/html/head")
6
6
  if head && title
7
- insert_title(title,head)
7
+ insert_title(title, head)
8
8
  end
9
9
  end
10
10
 
11
11
  def insert_title(title, head)
12
- if head.at_css('title').nil?
12
+ if head.at_css("title").nil?
13
13
  head.first_element_child.nil? ? head << title : head.first_element_child.before(title)
14
14
  else
15
- head.at_css('title').replace(title)
15
+ head.at_css("title").replace(title)
16
16
  end
17
17
  end
18
18
  end
@@ -4,11 +4,20 @@ module Slimmer
4
4
 
5
5
  initializer "slimmer.configure" do |app|
6
6
  slimmer_config = app.config.slimmer.to_hash
7
-
8
- app_name = ENV['GOVUK_APP_NAME'] || app.class.parent_name
7
+ app_name = ENV["GOVUK_APP_NAME"] || Slimmer::Railtie.parent_name(app)
9
8
  slimmer_config = slimmer_config.reverse_merge(app_name: app_name)
10
9
 
11
10
  app.middleware.use Slimmer::App, slimmer_config
12
11
  end
12
+
13
+ # TODO: remove this method when all our apps are in rails 6 and substitute
14
+ # it with: app_name = ENV['GOVUK_APP_NAME'] || app.class.module_parent_name
15
+ def self.parent_name(app)
16
+ if app.class.respond_to?(:module_parent_name)
17
+ app.class.module_parent_name
18
+ else
19
+ app.class.parent_name
20
+ end
21
+ end
13
22
  end
14
23
  end
@@ -1,4 +1,4 @@
1
- require 'rspec/core'
1
+ require "rspec/core"
2
2
 
3
- require 'slimmer'
4
- require 'slimmer/test'
3
+ require "slimmer"
4
+ require "slimmer/test"
@@ -1,5 +1,5 @@
1
- require 'rest_client'
2
- require 'slimmer/govuk_request_id'
1
+ require "rest_client"
2
+ require "slimmer/govuk_request_id"
3
3
 
4
4
  module Slimmer
5
5
  class Skin
@@ -10,7 +10,7 @@ module Slimmer
10
10
  @asset_host = options[:asset_host]
11
11
 
12
12
  @logger = options[:logger] || NullLogger.instance
13
- @strict = options[:strict] || (%w{development test}.include?(ENV['RACK_ENV']))
13
+ @strict = options[:strict] || %w{development test}.include?(ENV["RACK_ENV"])
14
14
  end
15
15
 
16
16
  def template(template_name)
@@ -30,19 +30,19 @@ module Slimmer
30
30
 
31
31
  def template_url(template_name)
32
32
  host = asset_host.dup
33
- host += '/' unless host =~ /\/$/
33
+ host += "/" unless host =~ /\/$/
34
34
  "#{host}templates/#{template_name}.html.erb"
35
35
  end
36
36
 
37
- def report_parse_errors_if_strict!(nokogiri_doc, description_for_error_message)
37
+ def report_parse_errors_if_strict!(nokogiri_doc, _description_for_error_message)
38
38
  nokogiri_doc
39
39
  end
40
40
 
41
41
  def parse_html(html, description_for_error_message)
42
42
  doc = Nokogiri::HTML.parse(html)
43
43
  if strict
44
- errors = doc.errors.select {|e| e.error?}.reject {|e| ignorable?(e)}
45
- if errors.size > 0
44
+ errors = doc.errors.select(&:error?).reject { |e| ignorable?(e) }
45
+ if !errors.empty?
46
46
  error = errors.first
47
47
  message = "In #{description_for_error_message}: '#{error.message}' at line #{error.line} col #{error.column} (code #{error.code}).\n"
48
48
  message << "Add ?skip_slimmer=1 to the url to show the raw backend request.\n\n"
@@ -59,7 +59,7 @@ module Slimmer
59
59
  lines = [""] + html.split("\n")
60
60
  from = [1, error.line - context_size].max
61
61
  to = [lines.size - 1, error.line + context_size].min
62
- context = (from..to).zip(lines[from..to]).map {|lineno, line| "%4d: %s" % [lineno, line] }
62
+ context = (from..to).zip(lines[from..to]).map { |lineno, line| "%4d: %s" % [lineno, line] }
63
63
  marker = " " * (error.column - 1) + "-----v"
64
64
  context.insert(context_size, marker)
65
65
  context.join("\n")
@@ -70,7 +70,7 @@ module Slimmer
70
70
  ignorable_codes.include?(error.code) || error.message.match(/Element script embeds close tag/) || error.message.match(/Unexpected end tag : noscript/)
71
71
  end
72
72
 
73
- def process(processors,body,template, rack_env)
73
+ def process(processors, body, template, _rack_env)
74
74
  logger.debug "Slimmer: starting skinning process"
75
75
  src = parse_html(body.to_s, "backend response")
76
76
  dest = parse_html(template, "template")
@@ -92,30 +92,30 @@ module Slimmer
92
92
  end
93
93
 
94
94
  def success(source_request, response, body)
95
- wrapper_id = options[:wrapper_id] || 'wrapper'
95
+ wrapper_id = options[:wrapper_id] || "wrapper"
96
96
 
97
97
  processors = [
98
- Processors::TitleInserter.new(),
99
- Processors::TagMover.new(),
98
+ Processors::TitleInserter.new,
99
+ Processors::TagMover.new,
100
100
  Processors::NavigationMover.new(self),
101
- Processors::ConditionalCommentMover.new(),
101
+ Processors::ConditionalCommentMover.new,
102
102
  Processors::BodyInserter.new(wrapper_id),
103
103
  Processors::BodyClassCopier.new,
104
104
  Processors::InsideHeaderInserter.new,
105
- Processors::HeaderContextInserter.new(),
105
+ Processors::HeaderContextInserter.new,
106
106
  Processors::MetadataInserter.new(response, options[:app_name]),
107
107
  Processors::SearchParameterInserter.new(response),
108
108
  Processors::SearchPathSetter.new(response),
109
109
  Processors::SearchRemover.new(response.headers),
110
110
  ]
111
111
 
112
- template_name = response.headers[Headers::TEMPLATE_HEADER] || 'core_layout'
112
+ template_name = response.headers[Headers::TEMPLATE_HEADER] || "core_layout"
113
113
  process(processors, body, template(template_name), source_request.env)
114
114
  end
115
115
 
116
116
  def error(template_name, body, rack_env)
117
117
  processors = [
118
- Processors::TitleInserter.new()
118
+ Processors::TitleInserter.new,
119
119
  ]
120
120
  process(processors, body, template(template_name), rack_env)
121
121
  end
@@ -1,4 +1,4 @@
1
- require 'slimmer/skin'
1
+ require "slimmer/skin"
2
2
 
3
3
  module Slimmer
4
4
  class Skin
@@ -6,10 +6,10 @@ module Slimmer
6
6
  logger.debug "Slimmer: TEST MODE - Loading fixture template from #{__FILE__}"
7
7
  if name =~ /\A(.*)\.raw\z/
8
8
  %{<div id="test-#{$1}"></div>}
9
- elsif File.exist?(template_path = File.join(File.dirname(__FILE__), 'test_templates', "#{name}.html"))
9
+ elsif File.exist?(template_path = File.join(File.dirname(__FILE__), "test_templates", "#{name}.html"))
10
10
  File.read(template_path)
11
11
  else
12
- File.read(File.join(File.dirname(__FILE__), 'test_templates', "wrapper.html"))
12
+ File.read(File.join(File.dirname(__FILE__), "test_templates", "wrapper.html"))
13
13
  end
14
14
  end
15
15
  end
@@ -3,6 +3,8 @@
3
3
  <title>Test Template</title>
4
4
  </head>
5
5
  <body>
6
+ <script>document.body.className = ((document.body.className) ? document.body.className + ' js-enabled' : 'js-enabled');</script>
7
+
6
8
  <header id="global-header">
7
9
  <div class="header-wrapper"></div>
8
10
  </header>
@@ -3,6 +3,8 @@
3
3
  <title>Test Template</title>
4
4
  </head>
5
5
  <body>
6
+ <script>document.body.className = ((document.body.className) ? document.body.className + ' js-enabled' : 'js-enabled');</script>
7
+
6
8
  <header id="global-header">
7
9
  <div class="header-wrapper"></div>
8
10
  </header>
@@ -1,3 +1,3 @@
1
1
  module Slimmer
2
- VERSION = '13.0.0'
2
+ VERSION = "13.3.0".freeze
3
3
  end
@@ -1,4 +1,4 @@
1
- require 'rake'
1
+ require "rake"
2
2
 
3
3
  namespace :slimmer do
4
4
  desc "Symlink from public directory to static directory"
@@ -6,7 +6,7 @@ namespace :slimmer do
6
6
  path_to_static = "../static/public"
7
7
  path_to_public = "public"
8
8
  commands = ["cd #{path_to_public}"]
9
- dirs_to_link = Dir.glob("../static/public/*") {|f|
9
+ Dir.glob("../static/public/*") { |f|
10
10
  commands << "ln -s #{path_to_static}/#{f}"
11
11
  }
12
12
  commands << ["cd .."]
metadata CHANGED
@@ -1,31 +1,31 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: slimmer
3
3
  version: !ruby/object:Gem::Version
4
- version: 13.0.0
4
+ version: 13.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - GOV.UK Dev
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-06-01 00:00:00.000000000 Z
11
+ date: 2020-04-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: nokogiri
14
+ name: activesupport
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "~>"
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: '1.7'
19
+ version: '0'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - "~>"
24
+ - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: '1.7'
26
+ version: '0'
27
27
  - !ruby/object:Gem::Dependency
28
- name: rack
28
+ name: json
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - ">="
@@ -39,21 +39,21 @@ dependencies:
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
41
  - !ruby/object:Gem::Dependency
42
- name: plek
42
+ name: nokogiri
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - ">="
45
+ - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: 1.1.0
47
+ version: '1.7'
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - ">="
52
+ - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: 1.1.0
54
+ version: '1.7'
55
55
  - !ruby/object:Gem::Dependency
56
- name: json
56
+ name: null_logger
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
59
  - - ">="
@@ -67,21 +67,21 @@ dependencies:
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0'
69
69
  - !ruby/object:Gem::Dependency
70
- name: null_logger
70
+ name: plek
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
73
  - - ">="
74
74
  - !ruby/object:Gem::Version
75
- version: '0'
75
+ version: 1.1.0
76
76
  type: :runtime
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
80
  - - ">="
81
81
  - !ruby/object:Gem::Version
82
- version: '0'
82
+ version: 1.1.0
83
83
  - !ruby/object:Gem::Dependency
84
- name: rest-client
84
+ name: rack
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
87
  - - ">="
@@ -95,7 +95,7 @@ dependencies:
95
95
  - !ruby/object:Gem::Version
96
96
  version: '0'
97
97
  - !ruby/object:Gem::Dependency
98
- name: activesupport
98
+ name: rest-client
99
99
  requirement: !ruby/object:Gem::Requirement
100
100
  requirements:
101
101
  - - ">="
@@ -109,89 +109,89 @@ dependencies:
109
109
  - !ruby/object:Gem::Version
110
110
  version: '0'
111
111
  - !ruby/object:Gem::Dependency
112
- name: yard
112
+ name: minitest
113
113
  requirement: !ruby/object:Gem::Requirement
114
114
  requirements:
115
- - - '='
115
+ - - "~>"
116
116
  - !ruby/object:Gem::Version
117
- version: 0.8.7.6
117
+ version: '5.4'
118
118
  type: :development
119
119
  prerelease: false
120
120
  version_requirements: !ruby/object:Gem::Requirement
121
121
  requirements:
122
- - - '='
122
+ - - "~>"
123
123
  - !ruby/object:Gem::Version
124
- version: 0.8.7.6
124
+ version: '5.4'
125
125
  - !ruby/object:Gem::Dependency
126
- name: minitest
126
+ name: mocha
127
127
  requirement: !ruby/object:Gem::Requirement
128
128
  requirements:
129
129
  - - "~>"
130
130
  - !ruby/object:Gem::Version
131
- version: '5.4'
131
+ version: '1.1'
132
132
  type: :development
133
133
  prerelease: false
134
134
  version_requirements: !ruby/object:Gem::Requirement
135
135
  requirements:
136
136
  - - "~>"
137
137
  - !ruby/object:Gem::Version
138
- version: '5.4'
138
+ version: '1.1'
139
139
  - !ruby/object:Gem::Dependency
140
- name: rake
140
+ name: rack-test
141
141
  requirement: !ruby/object:Gem::Requirement
142
142
  requirements:
143
143
  - - "~>"
144
144
  - !ruby/object:Gem::Version
145
- version: 0.9.2.2
145
+ version: 0.6.1
146
146
  type: :development
147
147
  prerelease: false
148
148
  version_requirements: !ruby/object:Gem::Requirement
149
149
  requirements:
150
150
  - - "~>"
151
151
  - !ruby/object:Gem::Version
152
- version: 0.9.2.2
152
+ version: 0.6.1
153
153
  - !ruby/object:Gem::Dependency
154
- name: rack-test
154
+ name: rails
155
155
  requirement: !ruby/object:Gem::Requirement
156
156
  requirements:
157
157
  - - "~>"
158
158
  - !ruby/object:Gem::Version
159
- version: 0.6.1
159
+ version: 6.0.2
160
160
  type: :development
161
161
  prerelease: false
162
162
  version_requirements: !ruby/object:Gem::Requirement
163
163
  requirements:
164
164
  - - "~>"
165
165
  - !ruby/object:Gem::Version
166
- version: 0.6.1
166
+ version: 6.0.2
167
167
  - !ruby/object:Gem::Dependency
168
- name: mocha
168
+ name: rake
169
169
  requirement: !ruby/object:Gem::Requirement
170
170
  requirements:
171
171
  - - "~>"
172
172
  - !ruby/object:Gem::Version
173
- version: '1.1'
173
+ version: 0.9.2.2
174
174
  type: :development
175
175
  prerelease: false
176
176
  version_requirements: !ruby/object:Gem::Requirement
177
177
  requirements:
178
178
  - - "~>"
179
179
  - !ruby/object:Gem::Version
180
- version: '1.1'
180
+ version: 0.9.2.2
181
181
  - !ruby/object:Gem::Dependency
182
- name: webmock
182
+ name: rubocop-govuk
183
183
  requirement: !ruby/object:Gem::Requirement
184
184
  requirements:
185
- - - '='
185
+ - - "~>"
186
186
  - !ruby/object:Gem::Version
187
- version: 1.18.0
187
+ version: 2.0.0
188
188
  type: :development
189
189
  prerelease: false
190
190
  version_requirements: !ruby/object:Gem::Requirement
191
191
  requirements:
192
- - - '='
192
+ - - "~>"
193
193
  - !ruby/object:Gem::Version
194
- version: 1.18.0
194
+ version: 2.0.0
195
195
  - !ruby/object:Gem::Dependency
196
196
  name: timecop
197
197
  requirement: !ruby/object:Gem::Requirement
@@ -207,19 +207,33 @@ dependencies:
207
207
  - !ruby/object:Gem::Version
208
208
  version: 0.5.1
209
209
  - !ruby/object:Gem::Dependency
210
- name: govuk-lint
210
+ name: webmock
211
211
  requirement: !ruby/object:Gem::Requirement
212
212
  requirements:
213
- - - "~>"
213
+ - - '='
214
214
  - !ruby/object:Gem::Version
215
- version: 0.5.1
215
+ version: 3.5.0
216
216
  type: :development
217
217
  prerelease: false
218
218
  version_requirements: !ruby/object:Gem::Requirement
219
219
  requirements:
220
- - - "~>"
220
+ - - '='
221
221
  - !ruby/object:Gem::Version
222
- version: 0.5.1
222
+ version: 3.5.0
223
+ - !ruby/object:Gem::Dependency
224
+ name: yard
225
+ requirement: !ruby/object:Gem::Requirement
226
+ requirements:
227
+ - - '='
228
+ - !ruby/object:Gem::Version
229
+ version: 0.8.7.6
230
+ type: :development
231
+ prerelease: false
232
+ version_requirements: !ruby/object:Gem::Requirement
233
+ requirements:
234
+ - - '='
235
+ - !ruby/object:Gem::Version
236
+ version: 0.8.7.6
223
237
  description: Rack middleware for skinning pages using a specific template
224
238
  email:
225
239
  - govuk-dev@digital.cabinet-office.gov.uk
@@ -260,7 +274,6 @@ files:
260
274
  - lib/slimmer/test_templates/proposition_menu.html
261
275
  - lib/slimmer/test_templates/wrapper.html
262
276
  - lib/slimmer/version.rb
263
- - lib/tasks/lint.rake
264
277
  - lib/tasks/slimmer.rake
265
278
  homepage: http://github.com/alphagov/slimmer
266
279
  licenses:
@@ -281,8 +294,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
281
294
  - !ruby/object:Gem::Version
282
295
  version: '0'
283
296
  requirements: []
284
- rubyforge_project: slimmer
285
- rubygems_version: 2.5.1
297
+ rubygems_version: 3.0.3
286
298
  signing_key:
287
299
  specification_version: 4
288
300
  summary: Thinner than the skinner
@@ -1,4 +0,0 @@
1
- desc "Run govuk-lint with similar params to CI"
2
- task :lint do
3
- sh "bundle exec govuk-lint-ruby --diff --cached --format clang bin lib test"
4
- end