slimmer 12.1.0 → 13.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 4fe9e4eda5103f993a3fa049fe354360ee1d61ea
4
- data.tar.gz: b674f301bcc0452d3ce81634a4ab280625b6d69d
3
+ metadata.gz: 668e43ea2579afcef2047274b110c10f7a377560
4
+ data.tar.gz: eb7f475b36cda8923e92c230bb190121cea7badb
5
5
  SHA512:
6
- metadata.gz: 130dff1f1186dce4297636f1bdb037f0a1d6448f61cd14a28bda29447ca41d310a92e9afa1952d1dc43adbe651d15645ee8434756fa65d0933009f4591f5b4b1
7
- data.tar.gz: bddee67fbe4cef3c30bbc058c7bdec7cecd0d2974d802877190bba9131c3ce1051311fa8dfdcb72cd6723b519d898f95bf79127cb9b30fdd0730de6cda6cdb80
6
+ metadata.gz: d02f1d56e8dd317087cc6a237cedb52df633e7baad7e35cb36f5ec934d2adf6610d272fa1c76d05b2ee8883c553cc1d0cadf44c0932457ecb1e27e6448c157e4
7
+ data.tar.gz: 3937badf8181de169406b57a6ba2eed98250d49239f727e3fd1e5d80899872e53c2da45f7af7324777117a599935f414e658b800a53bf0ed6db041db30c9498a
@@ -1,3 +1,8 @@
1
+ # 13.0.0
2
+
3
+ * Drop cache TTL to 60 seconds.
4
+ * BREAKING: Remove the component system, components are now consumed via the [govuk_publishing_components gem](https://github.com/alphagov/govuk_publishing_components)
5
+
1
6
  # 12.1.0
2
7
 
3
8
  * Make sure that the metatags defined in the application are inserted at 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:
@@ -7,7 +7,7 @@ require 'slimmer/version'
7
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
@@ -27,13 +27,6 @@ module Slimmer
27
27
  autoload :Headers, 'slimmer/headers'
28
28
  autoload :HTTPClient, 'slimmer/http_client'
29
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'
36
-
37
30
  module Processors
38
31
  autoload :BodyClassCopier, 'slimmer/processors/body_class_copier'
39
32
  autoload :BodyInserter, 'slimmer/processors/body_inserter'
@@ -1,10 +1,3 @@
1
1
  require 'cucumber'
2
2
 
3
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
@@ -2,10 +2,3 @@ require 'rspec/core'
2
2
 
3
3
  require 'slimmer'
4
4
  require 'slimmer/test'
5
- require 'slimmer/test_helpers/govuk_components'
6
-
7
- RSpec.configure do |config|
8
- config.include Slimmer::TestHelpers::GovukComponents
9
-
10
- config.before { stub_shared_component_locales }
11
- end
@@ -1,3 +1,3 @@
1
1
  module Slimmer
2
- VERSION = '12.1.0'
2
+ VERSION = '13.0.0'
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: slimmer
3
3
  version: !ruby/object:Gem::Version
4
- version: 12.1.0
4
+ version: 13.0.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-04-19 00:00:00.000000000 Z
11
+ date: 2018-06-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: nokogiri
@@ -234,16 +234,10 @@ files:
234
234
  - bin/render_slimmer_error
235
235
  - lib/slimmer.rb
236
236
  - lib/slimmer/app.rb
237
- - lib/slimmer/component_resolver.rb
238
237
  - lib/slimmer/cucumber.rb
239
- - lib/slimmer/govuk_components.rb
240
238
  - lib/slimmer/govuk_request_id.rb
241
239
  - lib/slimmer/headers.rb
242
240
  - lib/slimmer/http_client.rb
243
- - lib/slimmer/i18n_backend.rb
244
- - lib/slimmer/local_component_resolver.rb
245
- - lib/slimmer/local_govuk_components.rb
246
- - lib/slimmer/network_component_resolver.rb
247
241
  - lib/slimmer/processors/body_class_copier.rb
248
242
  - lib/slimmer/processors/body_inserter.rb
249
243
  - lib/slimmer/processors/conditional_comment_mover.rb
@@ -262,7 +256,6 @@ files:
262
256
  - lib/slimmer/skin.rb
263
257
  - lib/slimmer/template.rb
264
258
  - lib/slimmer/test.rb
265
- - lib/slimmer/test_helpers/govuk_components.rb
266
259
  - lib/slimmer/test_templates/header_footer_only.html
267
260
  - lib/slimmer/test_templates/proposition_menu.html
268
261
  - lib/slimmer/test_templates/wrapper.html
@@ -1,26 +0,0 @@
1
- module Slimmer
2
- class ComponentResolver < ::ActionView::Resolver
3
- TEST_TAG_NAME = 'test-govuk-component'
4
-
5
- def find_templates(name, prefix, partial, details, outside_app_allowed = false)
6
- return [] unless prefix == 'govuk_component'
7
- template_path = [prefix, name].join('/')
8
- details = {
9
- :format => 'text/html',
10
- :updated_at => Time.now,
11
- :virtual_path => template_path
12
- }
13
-
14
- [ActionView::Template.new(template_body(template_path), template_path, erb_handler, details)]
15
- end
16
-
17
- private
18
- def erb_handler
19
- @erb_handler ||= ActionView::Template.registered_template_handler(:erb)
20
- end
21
-
22
- def template_body(_template_path)
23
- raise NotImplementedError, "Use NetworkComponentResolver or LocalComponentResolver"
24
- end
25
- end
26
- end
@@ -1,57 +0,0 @@
1
- module Slimmer
2
- # @api public
3
- #
4
- # Include this module to add the GOV.UK Components to your app.
5
- # @example
6
- # class ApplicationController < ActionController::Base
7
- # include Slimmer::GovukComponents
8
- # end
9
- #
10
- # # In your views:
11
- #
12
- # <%= render partial: 'govuk_component/example_component' %>
13
- module GovukComponents
14
- def self.included into
15
- into.before_action :add_govuk_components
16
- end
17
-
18
- # @private
19
- def add_govuk_components
20
- append_view_path GovukComponents.expiring_resolver_cache.resolver
21
-
22
- return if slimmer_backend_included?
23
- I18n.backend = I18n::Backend::Chain.new(I18n.backend, Slimmer::I18nBackend.new)
24
- end
25
-
26
- # @private
27
- def self.expiring_resolver_cache
28
- @expiring_resolver_cache ||= TimedExpirationResolverCache.new
29
- end
30
-
31
- private
32
-
33
- def slimmer_backend_included?
34
- I18n.backend.is_a?(I18n::Backend::Chain) &&
35
- I18n.backend.backends.any? { |b| b.is_a? Slimmer::I18nBackend }
36
- end
37
-
38
- # Slimmer::ComponentResolver instantiates a lot of large objects and leaks
39
- # memory. This class will cache the resolver so that it doesn't have to
40
- # create new ActionView::Template objects for each request. The cache is
41
- # timed to allow frontends to pick up changes made to components in `static`.
42
- class TimedExpirationResolverCache
43
- def initialize
44
- @cache_last_reset = Time.now
45
- end
46
-
47
- def resolver
48
- if (@cache_last_reset + Slimmer::CACHE_TTL) < Time.now
49
- @resolver = nil
50
- @cache_last_reset = Time.now
51
- end
52
-
53
- @resolver ||= Slimmer::NetworkComponentResolver.new
54
- end
55
- end
56
- end
57
- end
@@ -1,56 +0,0 @@
1
- require 'json'
2
- require 'i18n'
3
-
4
- module Slimmer
5
- class I18nBackend
6
- include I18n::Backend::Base, I18n::Backend::Flatten
7
-
8
- def available_locales
9
- Slimmer.cache.fetch("available_locales", expires_in: Slimmer::CACHE_TTL) do
10
- locale_json = fetch(static_locales_url)
11
- JSON.parse(locale_json).map(&:to_sym)
12
- end
13
- end
14
-
15
- def lookup(locale, key, scope = [], options = {})
16
- key = normalize_flat_keys(locale, key, scope, options[:separator])
17
- translations = translations(locale)
18
- translations["#{locale}.#{key}".to_sym]
19
- end
20
-
21
- private
22
-
23
- def translations(locale)
24
- Slimmer.cache.fetch("translations/#{locale}", expires_in: Slimmer::CACHE_TTL) do
25
- fetch_translations(locale)
26
- end
27
- end
28
-
29
- def static_locales_url(locale=nil)
30
- [static_host, "templates", "locales", locale].compact.join('/')
31
- end
32
-
33
- def static_host
34
- @static_host ||= Plek.new.find('static')
35
- end
36
-
37
- def fetch_translations(locale)
38
- url = static_locales_url(locale)
39
- json_data = fetch(url)
40
- translations = JSON.parse(json_data)
41
- flatten_translations(locale, translations, false, false)
42
- rescue TemplateNotFoundException
43
- {}
44
- end
45
-
46
- def fetch(url)
47
- HTTPClient.get(url)
48
- rescue RestClient::Exception => e
49
- raise TemplateNotFoundException, "Unable to fetch: '#{url}' because #{e}", caller
50
- rescue Errno::ECONNREFUSED => e
51
- raise CouldNotRetrieveTemplate, "Unable to fetch: '#{url}' because #{e}", caller
52
- rescue SocketError => e
53
- raise CouldNotRetrieveTemplate, "Unable to fetch: '#{url}' because #{e}", caller
54
- end
55
- end
56
- end
@@ -1,19 +0,0 @@
1
- module Slimmer
2
- class LocalComponentResolver < ComponentResolver
3
- private
4
-
5
- def template_body(template_path)
6
- File.read(template_file(template_path))
7
- end
8
-
9
- def template_file(template_path)
10
- path = template_path.sub(/\.raw(\.html\.erb)?$/, '')
11
-
12
- if defined?(Rails)
13
- Rails.root.join("app", "views", "#{path}.raw.html.erb")
14
- else
15
- "#{path}.raw.html.erb"
16
- end
17
- end
18
- end
19
- end
@@ -1,49 +0,0 @@
1
- module Slimmer
2
- # @api public
3
- #
4
- # Include this module to avoid loading components over the network
5
- # @example
6
- # class ApplicationController < ActionController::Base
7
- # include Slimmer::LocalGovukComponents
8
- # end
9
- #
10
- # # In your views:
11
- #
12
- # <%= render partial: 'govuk_component/example_component' %>
13
- module LocalGovukComponents
14
- def self.included into
15
- into.before_action :add_govuk_components
16
- end
17
-
18
- # @private
19
- def add_govuk_components
20
- append_view_path LocalGovukComponents.expiring_resolver_cache.resolver
21
- end
22
-
23
- # @private
24
- def self.expiring_resolver_cache
25
- @expiring_resolver_cache ||= TimedExpirationResolverCache.new
26
- end
27
-
28
- private
29
-
30
- # Slimmer::ComponentResolver instantiates a lot of large objects and leaks
31
- # memory. This class will cache the resolver so that it doesn't have to
32
- # create new ActionView::Template objects for each request. The cache is
33
- # timed to allow frontends to pick up changes made to components in `static`.
34
- class TimedExpirationResolverCache
35
- def initialize
36
- @cache_last_reset = Time.now
37
- end
38
-
39
- def resolver
40
- if (@cache_last_reset + Slimmer::CACHE_TTL) < Time.now
41
- @resolver = nil
42
- @cache_last_reset = Time.now
43
- end
44
-
45
- @resolver ||= Slimmer::LocalComponentResolver.new
46
- end
47
- end
48
- end
49
- end
@@ -1,45 +0,0 @@
1
- require 'slimmer/govuk_request_id'
2
- require 'active_support/core_ext/string/inflections'
3
-
4
- module Slimmer
5
- class NetworkComponentResolver < ComponentResolver
6
- private
7
-
8
- def template_body(template_path)
9
- if test?
10
- test_body(template_path)
11
- else
12
- Slimmer.cache.fetch(template_path, expires_in: Slimmer::CACHE_TTL) do
13
- fetch(template_url(template_path))
14
- end
15
- end
16
- end
17
-
18
- def test?
19
- defined?(Rails) && Rails.env.test?
20
- end
21
-
22
- def fetch(template_url)
23
- HTTPClient.get(template_url)
24
- rescue RestClient::Exception => e
25
- raise TemplateNotFoundException, "Unable to fetch: '#{template_url}' because #{e}", caller
26
- rescue Errno::ECONNREFUSED => e
27
- raise CouldNotRetrieveTemplate, "Unable to fetch: '#{template_url}' because #{e}", caller
28
- rescue SocketError => e
29
- raise CouldNotRetrieveTemplate, "Unable to fetch: '#{template_url}' because #{e}", caller
30
- end
31
-
32
- def template_url(template_path)
33
- path = template_path.sub(/\.raw(\.html\.erb)?$/, '')
34
- [static_host, "templates", "#{path}.raw.html.erb"].join('/')
35
- end
36
-
37
- def static_host
38
- @static_host ||= Plek.new.find('static')
39
- end
40
-
41
- def test_body(path)
42
- %{<#{TEST_TAG_NAME} data-template="#{path.parameterize}"><%= JSON.dump(local_assigns) %></#{TEST_TAG_NAME}>}
43
- end
44
- end
45
- end
@@ -1,18 +0,0 @@
1
- require 'webmock'
2
-
3
- module Slimmer
4
- module TestHelpers
5
- module GovukComponents
6
- def stub_shared_component_locales
7
- stub_request(:get, /https?:\/\/\S+.gov.uk\/templates\/locales\/.+/).
8
- to_return(status: 400, headers: {})
9
- stub_request(:get, /https?:\/\/\S+.gov.uk\/templates\/locales/).
10
- to_return(status: 200, body: '{}', headers: {})
11
- end
12
-
13
- def shared_component_selector(name)
14
- "#{Slimmer::ComponentResolver::TEST_TAG_NAME}[data-template='govuk_component-#{name}']"
15
- end
16
- end
17
- end
18
- end