content_block_tools 1.10.4 → 1.11.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
2
  SHA256:
3
- metadata.gz: 76585fdad22164fb9dfd3b6953cb7be7f97dfd100c351382ef964208aa614465
4
- data.tar.gz: 3d085a7d8ad591f8f0697a1d8692b257aaec4e24aeaafd00a7c635f4335a1a81
3
+ metadata.gz: cb61fc3df8d1dc8cb8d612db04f79372df5b136c84af620aa50727e6dd7ee17f
4
+ data.tar.gz: b70351fcd23de104adfbb6d0e1c23ed3720eb8c22487ce22eda3894e4cefa908
5
5
  SHA512:
6
- metadata.gz: de0296c3df4f4ecc38bf097b7d7c51964fdcdefbefbccbb999373a91da915997bbf53e08d3b122296148c94e1d5f9e0c50962b7dbed8602fe28eb8f72db34618
7
- data.tar.gz: 9dada776d7e0aa69dfc74c6c2267d6c236459b8cfd571e509306e1118d584c4bab8133f912c29de1ecd31368e1f66eca05deb1dfa7c0ba72cda18cfc24c291e2
6
+ metadata.gz: '05793c290c8331ba99b6c5973928d5d3f3f25c585c3c21057646962a8775943b9a64f627acebab02a856ba2a1736491a67706ae24b868eeb8536461ecc7b8960'
7
+ data.tar.gz: 954103c40e093cb47a6d64ebd92b4ae2fd6166a4c89cb8b9b958e7228c20e11b432dda2e6bf5b59ba25d94f374c3bc2a7fa749641c02d67fafefd26a1c337e61
@@ -2,25 +2,28 @@ module ContentBlockTools
2
2
  class TimePeriodComponent < ContentBlockTools::BaseComponent
3
3
  def initialize(content_block:, _block_type: nil, _block_name: nil)
4
4
  @content_block = content_block
5
+ @normalised_date_range = normalise_date_range
5
6
  end
6
7
 
7
8
  def start_date
8
- presented_date(
9
- content_block.details.dig(:date_range, :start, :date),
10
- )
9
+ presented_date(normalised_date_range.start_date)
11
10
  end
12
11
 
13
12
  def end_date
14
- presented_date(
15
- content_block.details.dig(:date_range, :end, :date),
16
- )
13
+ presented_date(normalised_date_range.end_date)
17
14
  end
18
15
 
19
16
  private
20
17
 
21
- attr_reader :content_block
18
+ attr_reader :content_block, :normalised_date_range
19
+
20
+ def normalise_date_range
21
+ NormalisedDateRange.new(content_block.details[:date_range])
22
+ end
22
23
 
23
24
  def presented_date(date)
25
+ return unless date.present?
26
+
24
27
  Presenters::FieldPresenters::TimePeriod::DatePresenter.new(
25
28
  date,
26
29
  ).render
@@ -0,0 +1,63 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ContentBlockTools
4
+ class NormalisedDateRange
5
+ class ParseError < StandardError; end
6
+
7
+ def initialize(date_range)
8
+ @date_range = date_range || {}
9
+ end
10
+
11
+ def start_time
12
+ @start_time ||= parse_value(date_range[:start])
13
+ end
14
+
15
+ def end_time
16
+ @end_time ||= parse_value(date_range[:end])
17
+ end
18
+
19
+ def start_date
20
+ start_time&.to_date
21
+ end
22
+
23
+ def end_date
24
+ end_time&.to_date
25
+ end
26
+
27
+ private
28
+
29
+ attr_reader :date_range
30
+
31
+ def parse_value(value)
32
+ return nil if value.blank?
33
+
34
+ if value.is_a?(Hash)
35
+ parse_legacy_format(value)
36
+ else
37
+ parse_iso8601_format(value)
38
+ end
39
+ end
40
+
41
+ def parse_legacy_format(value)
42
+ date_string = value[:date]
43
+ time_string = value[:time]
44
+
45
+ return nil if date_string.blank?
46
+
47
+ # Validate date with Date.parse (stricter than Time.zone.parse)
48
+ Date.parse(date_string)
49
+
50
+ datetime_string = [date_string, time_string].compact.join(" ")
51
+ Time.zone.parse(datetime_string)
52
+ rescue Date::Error
53
+ raise ParseError, "Invalid legacy date format: #{value.inspect}"
54
+ end
55
+
56
+ def parse_iso8601_format(datetime_string)
57
+ result = Time.zone.parse(datetime_string)
58
+ raise ParseError, "Invalid ISO 8601 format: #{datetime_string.inspect}" if result.nil?
59
+
60
+ result
61
+ end
62
+ end
63
+ end
@@ -6,8 +6,23 @@ module ContentBlockTools
6
6
  def render
7
7
  return unless field.present?
8
8
 
9
- date = Date.parse(field)
10
- date.strftime("%e %B %Y").strip
9
+ time = field.is_a?(String) ? parsed_string : field
10
+
11
+ time.strftime("%e %B %Y").strip
12
+ rescue Date::Error
13
+ nil
14
+ end
15
+
16
+ private
17
+
18
+ def parsed_string
19
+ validate_string_representation
20
+
21
+ Time.zone.parse(field)
22
+ end
23
+
24
+ def validate_string_representation
25
+ Date.parse(field)
11
26
  end
12
27
  end
13
28
  end
@@ -5,25 +5,38 @@ module ContentBlockTools
5
5
  class TimePeriodPresenterError < RuntimeError; end
6
6
 
7
7
  class DateRangePresenter < BasePresenter
8
+ def initialize(field, **args)
9
+ super
10
+ @normalised_date_range = normalise_date_range
11
+ end
12
+
8
13
  def render
9
14
  return unless start_date.present? && end_date.present?
10
15
 
11
16
  "#{start_date} to #{end_date}"
12
- rescue Date::Error, TypeError
13
- raise TimePeriodPresenterError, "Not a valid date range: #{field}"
17
+ rescue NormalisedDateRange::ParseError => e
18
+ raise TimePeriodPresenterError, "Not a valid date range: #{field} (#{e.message})"
14
19
  end
15
20
 
16
21
  private
17
22
 
23
+ attr_reader :normalised_date_range
24
+
18
25
  def start_date
19
- presented_date(field.dig(:start, :date))
26
+ presented_date(normalised_date_range.start_date)
20
27
  end
21
28
 
22
29
  def end_date
23
- presented_date(field.dig(:end, :date))
30
+ presented_date(normalised_date_range.end_date)
31
+ end
32
+
33
+ def normalise_date_range
34
+ NormalisedDateRange.new(field)
24
35
  end
25
36
 
26
37
  def presented_date(date)
38
+ return unless date.present?
39
+
27
40
  Presenters::FieldPresenters::TimePeriod::DatePresenter.new(
28
41
  date,
29
42
  ).render
@@ -0,0 +1,17 @@
1
+ module ContentBlockTools
2
+ module Presenters
3
+ module FieldPresenters
4
+ module TimePeriod
5
+ class EndPresenter < BasePresenter
6
+ def render
7
+ return unless field.present?
8
+
9
+ Presenters::FieldPresenters::TimePeriod::DatePresenter.new(
10
+ field,
11
+ ).render
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,17 @@
1
+ module ContentBlockTools
2
+ module Presenters
3
+ module FieldPresenters
4
+ module TimePeriod
5
+ class StartPresenter < BasePresenter
6
+ def render
7
+ return unless field.present?
8
+
9
+ Presenters::FieldPresenters::TimePeriod::DatePresenter.new(
10
+ field,
11
+ ).render
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module ContentBlockTools
4
- VERSION = "1.10.4"
4
+ VERSION = "1.11.0"
5
5
  end
@@ -13,9 +13,12 @@ require "content_block_tools/presenters/field_presenters/contact/email_presenter
13
13
  require "content_block_tools/presenters/field_presenters/time_period/date_range_presenter"
14
14
  require "content_block_tools/presenters/field_presenters/time_period/date_presenter"
15
15
  require "content_block_tools/presenters/field_presenters/time_period/time_presenter"
16
+ require "content_block_tools/presenters/field_presenters/time_period/start_presenter"
17
+ require "content_block_tools/presenters/field_presenters/time_period/end_presenter"
16
18
 
17
19
  require "content_block_tools/content_block"
18
20
  require "content_block_tools/content_block_reference"
21
+ require "content_block_tools/normalised_date_range"
19
22
 
20
23
  require "content_block_tools/engine"
21
24
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: content_block_tools
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.10.4
4
+ version: 1.11.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - GOV.UK Dev
@@ -188,10 +188,13 @@ files:
188
188
  - lib/content_block_tools/engine.rb
189
189
  - lib/content_block_tools/helpers/govspeak.rb
190
190
  - lib/content_block_tools/helpers/override_classes.rb
191
+ - lib/content_block_tools/normalised_date_range.rb
191
192
  - lib/content_block_tools/presenters/field_presenters/base_presenter.rb
192
193
  - lib/content_block_tools/presenters/field_presenters/contact/email_presenter.rb
193
194
  - lib/content_block_tools/presenters/field_presenters/time_period/date_presenter.rb
194
195
  - lib/content_block_tools/presenters/field_presenters/time_period/date_range_presenter.rb
196
+ - lib/content_block_tools/presenters/field_presenters/time_period/end_presenter.rb
197
+ - lib/content_block_tools/presenters/field_presenters/time_period/start_presenter.rb
195
198
  - lib/content_block_tools/presenters/field_presenters/time_period/time_presenter.rb
196
199
  - lib/content_block_tools/version.rb
197
200
  - node_modules/govuk-frontend/README.md