slimmer 12.0.0 → 13.2.1

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.
Files changed (39) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +33 -0
  3. data/README.md +1 -50
  4. data/Rakefile +4 -4
  5. data/bin/render_slimmer_error +13 -14
  6. data/lib/slimmer.rb +27 -34
  7. data/lib/slimmer/app.rb +25 -27
  8. data/lib/slimmer/cucumber.rb +2 -9
  9. data/lib/slimmer/headers.rb +14 -13
  10. data/lib/slimmer/processors/body_class_copier.rb +4 -4
  11. data/lib/slimmer/processors/body_inserter.rb +4 -4
  12. data/lib/slimmer/processors/conditional_comment_mover.rb +2 -4
  13. data/lib/slimmer/processors/footer_remover.rb +1 -1
  14. data/lib/slimmer/processors/header_context_inserter.rb +3 -3
  15. data/lib/slimmer/processors/inside_header_inserter.rb +2 -2
  16. data/lib/slimmer/processors/metadata_inserter.rb +10 -10
  17. data/lib/slimmer/processors/navigation_mover.rb +4 -5
  18. data/lib/slimmer/processors/search_parameter_inserter.rb +7 -7
  19. data/lib/slimmer/processors/search_path_setter.rb +3 -3
  20. data/lib/slimmer/processors/search_remover.rb +1 -1
  21. data/lib/slimmer/processors/tag_mover.rb +18 -11
  22. data/lib/slimmer/processors/title_inserter.rb +6 -6
  23. data/lib/slimmer/railtie.rb +13 -1
  24. data/lib/slimmer/rspec.rb +3 -10
  25. data/lib/slimmer/skin.rb +16 -16
  26. data/lib/slimmer/test.rb +3 -3
  27. data/lib/slimmer/test_templates/header_footer_only.html +2 -0
  28. data/lib/slimmer/test_templates/wrapper.html +2 -0
  29. data/lib/slimmer/version.rb +1 -1
  30. data/lib/tasks/slimmer.rake +2 -2
  31. metadata +50 -59
  32. data/lib/slimmer/component_resolver.rb +0 -26
  33. data/lib/slimmer/govuk_components.rb +0 -57
  34. data/lib/slimmer/i18n_backend.rb +0 -56
  35. data/lib/slimmer/local_component_resolver.rb +0 -19
  36. data/lib/slimmer/local_govuk_components.rb +0 -49
  37. data/lib/slimmer/network_component_resolver.rb +0 -45
  38. data/lib/slimmer/test_helpers/govuk_components.rb +0 -18
  39. data/lib/tasks/lint.rake +0 -4
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 55f0a341bbb309da449a52a668b281087674586c
4
- data.tar.gz: e090f9302dfd9dea5d91184a50942bfe9751bd02
2
+ SHA256:
3
+ metadata.gz: ddad98c75bd0222c98ea9a7021096064cd2786c93f647c5390b39fcf489a3ab8
4
+ data.tar.gz: 63217d5ac791ffa9de31f0f20178d997cc0fad22ddea6e3728bcbb2405277ce6
5
5
  SHA512:
6
- metadata.gz: 464f4d805159cd667d1cdc3478fba42e18741e4f7d3978c717b608098099fb3b87f56b83c9b31f61ee8bd2fa1acaf7778ab62be006d363365bd673162b2d18ad
7
- data.tar.gz: 7aa2bb20cb3c5a3151949436d6e2d36cae311ee31552ef17cb7e254f2a2569c93205dec13b0e5baf6e155c862714af4a1ec6379165cd23275929ffcec2bec1b7
6
+ metadata.gz: 9048af33f02df5b5e6e9e36382cf38c1028bbeb6eafe2019bc2035e0c4f5b71027c3ce79266e1f7fd013578e4024b0aa1d7735fae2a0bb6c9abd0a81ad4dbd92
7
+ data.tar.gz: 3af49e52feefa8c44480ff144512a1347157ccae6aafb5596a03b1d3382a53e13b53e0a82f1f8041d5a0b71effe6410727dfd2a21b27ec84586822b4ea64afa9
@@ -1,3 +1,36 @@
1
+ # 13.2.1
2
+
3
+ * Fix deprecation warning: `Module#parent_name` has been renamed to
4
+ `module_parent_name`. `parent_name` is deprecated and will be removed in
5
+ Rails 6.1. (#237)
6
+ * Migrate from govuk-lint to rubocop-govuk (#237)
7
+ * Remove lint rake task (#237)
8
+ * Fix linting issues (#237)
9
+ * Fix deprecation warning: Mocha deprecation warning at
10
+ /my/local/path/to/test/test_helper.rb:6:in 'require': Require
11
+ 'mocha/test_unit', 'mocha/minitest' or 'mocha/api' instead of 'mocha/setup'.
12
+ (#237)
13
+
14
+ # 13.2.0
15
+
16
+ * Upgrade Ruby version to 2.6.5. (#234)
17
+ * Fix linting issues. (#234)
18
+
19
+ # 13.1.0
20
+
21
+ * Add `js-enabled` to body tag of test templates. (#226)
22
+
23
+ # 13.0.0
24
+
25
+ * Drop cache TTL to 60 seconds.
26
+ * BREAKING: Remove the component system, components are now consumed via the [govuk_publishing_components gem](https://github.com/alphagov/govuk_publishing_components)
27
+
28
+ # 12.1.0
29
+
30
+ * Make sure that the metatags defined in the application are inserted at the
31
+ top of the page. This means that third parties will see the custom metatags
32
+ like `og:image` first, and template tags like the default sharing image second (#218)
33
+
1
34
  # 12.0.0
2
35
 
3
36
  * Remove the "report a problem" feature. This is now being covered by the
data/README.md CHANGED
@@ -15,8 +15,7 @@ Slimmer provides a Railtie so no configuration is necessary.
15
15
 
16
16
  ## Caching
17
17
 
18
- Slimmer makes HTTP requests to `static` for templates, components and locales. These
19
- are cached for 15 minutes. Slimmer uses `Rails.cache` for this.
18
+ Slimmer makes HTTP requests to `static` for templates. These are cached using `Rails.cache`.
20
19
 
21
20
  ## Asset tag helpers
22
21
 
@@ -82,54 +81,6 @@ YourApp::Application.configure do
82
81
  end
83
82
  ```
84
83
 
85
- ## GOV.UK Components
86
-
87
- To use [shared template components](https://govuk-static.herokuapp.com/component-guide) you need to include the GOV.UK component module:
88
-
89
- ```rb
90
- class ApplicationController < ActionController::Base
91
- include Slimmer::GovukComponents
92
- end
93
- ```
94
-
95
- This will make calls out to static when you try and render a partial prefixed with `govuk_component`:
96
-
97
- ```erb
98
- <%= render partial: 'govuk_component/example_component' %>
99
- ```
100
-
101
- You will need a copy of static running for the templates to be loaded from.
102
-
103
- ### Testing components
104
-
105
- In test mode (when `Rails.env.test?` returns `true`), shared components are not
106
- fetched from Static. Instead they are rendered as a dummy tag which contains a
107
- JSON dump of the `locals` - the arguments passed to the component.
108
-
109
- A test helper is included which returns a CSS selector for finding a given
110
- component to assert that it was used. You can make it available in your tests
111
- with:
112
-
113
- ```rb
114
- require 'slimmer/test_helpers/govuk_components'
115
- include Slimmer::TestHelpers::GovukComponents
116
- ```
117
-
118
- And then assert that the component has been used:
119
-
120
- ```rb
121
- page.should have_css(shared_component_selector('metadata'))
122
- ```
123
-
124
- Or look for one of the arguments to the component which will have been
125
- `JSON.dump`ed inside the tag:
126
-
127
- ```rb
128
- within(shared_component_selector('title')) do
129
- expect(page).to have_content(expected_title_text)
130
- end
131
- ```
132
-
133
84
  ### Cucumber
134
85
 
135
86
  Add the following code to features/support:
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,13 +1,13 @@
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
- CACHE_TTL = 900
10
+ CACHE_TTL = 60
11
11
 
12
12
  def self.cache
13
13
  @cache ||= defined?(Rails) ? Rails.cache : NoCache.new
@@ -19,36 +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'
29
-
30
- autoload :GovukComponents, 'slimmer/govuk_components'
31
- autoload :LocalGovukComponents, 'slimmer/local_govuk_components'
32
- autoload :ComponentResolver, 'slimmer/component_resolver'
33
- autoload :NetworkComponentResolver, 'slimmer/network_component_resolver'
34
- autoload :LocalComponentResolver, 'slimmer/local_component_resolver'
35
- autoload :I18nBackend, 'slimmer/i18n_backend'
25
+ autoload :Template, "slimmer/template"
26
+ autoload :App, "slimmer/app"
27
+ autoload :Headers, "slimmer/headers"
28
+ autoload :HTTPClient, "slimmer/http_client"
36
29
 
37
30
  module Processors
38
- autoload :BodyClassCopier, 'slimmer/processors/body_class_copier'
39
- autoload :BodyInserter, 'slimmer/processors/body_inserter'
40
- autoload :ConditionalCommentMover, 'slimmer/processors/conditional_comment_mover'
41
- autoload :FooterRemover, 'slimmer/processors/footer_remover'
42
- autoload :MetadataInserter, 'slimmer/processors/metadata_inserter'
43
- autoload :HeaderContextInserter, 'slimmer/processors/header_context_inserter'
44
- autoload :InsideHeaderInserter, 'slimmer/processors/inside_header_inserter'
45
- autoload :NavigationMover, 'slimmer/processors/navigation_mover'
46
- autoload :SearchIndexSetter, 'slimmer/processors/search_index_setter'
47
- autoload :SearchPathSetter, 'slimmer/processors/search_path_setter'
48
- autoload :SearchParameterInserter, 'slimmer/processors/search_parameter_inserter'
49
- autoload :SearchRemover, 'slimmer/processors/search_remover'
50
- autoload :TagMover, 'slimmer/processors/tag_mover'
51
- 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"
52
45
  end
53
46
 
54
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,12 +52,12 @@ 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)
@@ -69,8 +66,9 @@ module Slimmer
69
66
 
70
67
  def s(body)
71
68
  return body.to_s unless body.respond_to?(:each)
69
+
72
70
  b = ""
73
- body.each {|a| b << a }
71
+ body.each { |a| b << a }
74
72
  b
75
73
  end
76
74
 
@@ -84,30 +82,30 @@ module Slimmer
84
82
  request = Rack::Request.new(env)
85
83
 
86
84
  # Store the request id so it can be passed on with any template requests
87
- GovukRequestId.value = env['HTTP_GOVUK_REQUEST_ID']
85
+ GovukRequestId.value = env["HTTP_GOVUK_REQUEST_ID"]
88
86
 
89
87
  rewritten_body = case response.status
90
- when 200
91
- @skin.success request, response, s(response.body)
92
- when 403
93
- @skin.error '403', s(response.body), request.env
94
- when 404
95
- @skin.error '404', s(response.body), request.env
96
- when 410
97
- @skin.error '410', s(response.body), request.env
98
- else
99
- @skin.error '500', s(response.body), request.env
100
- end
88
+ when 200
89
+ @skin.success request, response, s(response.body)
90
+ when 403
91
+ @skin.error "403", s(response.body), request.env
92
+ when 404
93
+ @skin.error "404", s(response.body), request.env
94
+ when 410
95
+ @skin.error "410", s(response.body), request.env
96
+ else
97
+ @skin.error "500", s(response.body), request.env
98
+ end
101
99
 
102
100
  rewritten_body = [rewritten_body] unless rewritten_body.respond_to?(:each)
103
101
  response.body = rewritten_body
104
- response.headers['Content-Length'] = content_length(response.body)
102
+ response.headers["Content-Length"] = content_length(response.body)
105
103
 
106
104
  response.finish
107
105
  end
108
106
 
109
107
  def strip_slimmer_headers(headers)
110
- headers.reject {|k, v| k =~ /\A#{Headers::HEADER_PREFIX}/ }
108
+ headers.reject { |k, _v| k =~ /\A#{Headers::HEADER_PREFIX}/ }
111
109
  end
112
110
  end
113
111
  end
@@ -1,10 +1,3 @@
1
- require 'cucumber'
1
+ require "cucumber"
2
2
 
3
- require 'slimmer/test'
4
- require 'slimmer/test_helpers/govuk_components'
5
-
6
- World(Slimmer::TestHelpers::GovukComponents)
7
-
8
- Before do
9
- stub_shared_component_locales
10
- end
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,40 +20,40 @@ module Slimmer
20
20
  skip: "Skip",
21
21
  template: "Template",
22
22
  remove_search: "Remove-Search",
23
- }
23
+ }.freeze
24
24
 
25
25
  # @private
26
- APPLICATION_NAME_HEADER = "#{HEADER_PREFIX}-#{SLIMMER_HEADER_MAPPING[:application_name]}"
26
+ APPLICATION_NAME_HEADER = "#{HEADER_PREFIX}-#{SLIMMER_HEADER_MAPPING[:application_name]}".freeze
27
27
 
28
28
  # @private
29
- FORMAT_HEADER = "#{HEADER_PREFIX}-#{SLIMMER_HEADER_MAPPING[:format]}"
29
+ FORMAT_HEADER = "#{HEADER_PREFIX}-#{SLIMMER_HEADER_MAPPING[:format]}".freeze
30
30
 
31
31
  # @private
32
- ORGANISATIONS_HEADER = "#{HEADER_PREFIX}-#{SLIMMER_HEADER_MAPPING[:organisations]}"
32
+ ORGANISATIONS_HEADER = "#{HEADER_PREFIX}-#{SLIMMER_HEADER_MAPPING[:organisations]}".freeze
33
33
 
34
34
  # @private
35
- WORLD_LOCATIONS_HEADER = "#{HEADER_PREFIX}-#{SLIMMER_HEADER_MAPPING[:world_locations]}"
35
+ WORLD_LOCATIONS_HEADER = "#{HEADER_PREFIX}-#{SLIMMER_HEADER_MAPPING[:world_locations]}".freeze
36
36
 
37
37
  # @private
38
- PAGE_OWNER_HEADER = "#{HEADER_PREFIX}-#{SLIMMER_HEADER_MAPPING[:page_owner]}"
38
+ PAGE_OWNER_HEADER = "#{HEADER_PREFIX}-#{SLIMMER_HEADER_MAPPING[:page_owner]}".freeze
39
39
 
40
40
  # @private
41
- RESULT_COUNT_HEADER = "#{HEADER_PREFIX}-#{SLIMMER_HEADER_MAPPING[:result_count]}"
41
+ RESULT_COUNT_HEADER = "#{HEADER_PREFIX}-#{SLIMMER_HEADER_MAPPING[:result_count]}".freeze
42
42
 
43
43
  # @private
44
- SEARCH_PATH_HEADER = "#{HEADER_PREFIX}-Search-Path"
44
+ SEARCH_PATH_HEADER = "#{HEADER_PREFIX}-Search-Path".freeze
45
45
 
46
46
  # @private
47
- SEARCH_PARAMETERS_HEADER = "#{HEADER_PREFIX}-#{SLIMMER_HEADER_MAPPING[:search_parameters]}"
47
+ SEARCH_PARAMETERS_HEADER = "#{HEADER_PREFIX}-#{SLIMMER_HEADER_MAPPING[:search_parameters]}".freeze
48
48
 
49
49
  # @private
50
- SKIP_HEADER = "#{HEADER_PREFIX}-#{SLIMMER_HEADER_MAPPING[:skip]}"
50
+ SKIP_HEADER = "#{HEADER_PREFIX}-#{SLIMMER_HEADER_MAPPING[:skip]}".freeze
51
51
 
52
52
  # @private
53
- TEMPLATE_HEADER = "#{HEADER_PREFIX}-#{SLIMMER_HEADER_MAPPING[:template]}"
53
+ TEMPLATE_HEADER = "#{HEADER_PREFIX}-#{SLIMMER_HEADER_MAPPING[:template]}".freeze
54
54
 
55
55
  # @private
56
- REMOVE_SEARCH_HEADER = "#{HEADER_PREFIX}-#{SLIMMER_HEADER_MAPPING[:remove_search]}"
56
+ REMOVE_SEARCH_HEADER = "#{HEADER_PREFIX}-#{SLIMMER_HEADER_MAPPING[:remove_search]}".freeze
57
57
 
58
58
  # Set the "slimmer headers" to configure the page
59
59
  #
@@ -71,6 +71,7 @@ module Slimmer
71
71
  # @option hash [String] world_locations
72
72
  def set_slimmer_headers(hash)
73
73
  raise InvalidHeader if (hash.keys - SLIMMER_HEADER_MAPPING.keys).any?
74
+
74
75
  SLIMMER_HEADER_MAPPING.each do |hash_key, header_suffix|
75
76
  value = hash[hash_key]
76
77
  headers["#{HEADER_PREFIX}-#{header_suffix}"] = value.to_s if value