slimmer 13.0.0 → 13.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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