content_block_tools 1.10.3 → 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: fc62b1911234ad251567ec3c5ab50dd5c446a74b6dc5d1d760e0c45fc1111919
4
- data.tar.gz: 7e4c649d068f297d1d157bf6b26f9eff264b32cbe4705dec4e8a044101214409
3
+ metadata.gz: cb61fc3df8d1dc8cb8d612db04f79372df5b136c84af620aa50727e6dd7ee17f
4
+ data.tar.gz: b70351fcd23de104adfbb6d0e1c23ed3720eb8c22487ce22eda3894e4cefa908
5
5
  SHA512:
6
- metadata.gz: b5869cf1833b2f9e4bd6a7c14cace2ca2535be7b54fa34a96e5e43913848008bc225a1b7f03904fa5057ffaf8f0e33f82027737bb9ea0e6d3d76919f1a8a64a1
7
- data.tar.gz: a1a3a9b5e2ce434fcf809192003b668f8f7aa75c998a4dfe047871b6b432a06e0d00b5556a8f0bca3a677c6f2b278b66f44db18167e617613688a53c28a0f0bc
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.3"
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.3
4
+ version: 1.11.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - GOV.UK Dev
@@ -88,7 +88,7 @@ dependencies:
88
88
  version: '6'
89
89
  - - "<"
90
90
  - !ruby/object:Gem::Version
91
- version: 8.1.3
91
+ version: 8.1.4
92
92
  type: :runtime
93
93
  prerelease: false
94
94
  version_requirements: !ruby/object:Gem::Requirement
@@ -98,7 +98,7 @@ dependencies:
98
98
  version: '6'
99
99
  - - "<"
100
100
  - !ruby/object:Gem::Version
101
- version: 8.1.3
101
+ version: 8.1.4
102
102
  - !ruby/object:Gem::Dependency
103
103
  name: gds-api-adapters
104
104
  requirement: !ruby/object:Gem::Requirement
@@ -136,7 +136,7 @@ dependencies:
136
136
  version: '6'
137
137
  - - "<"
138
138
  - !ruby/object:Gem::Version
139
- version: 8.1.3
139
+ version: 8.1.4
140
140
  type: :runtime
141
141
  prerelease: false
142
142
  version_requirements: !ruby/object:Gem::Requirement
@@ -146,7 +146,7 @@ dependencies:
146
146
  version: '6'
147
147
  - - "<"
148
148
  - !ruby/object:Gem::Version
149
- version: 8.1.3
149
+ version: 8.1.4
150
150
  - !ruby/object:Gem::Dependency
151
151
  name: view_component
152
152
  requirement: !ruby/object:Gem::Requirement
@@ -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
@@ -1060,7 +1063,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
1060
1063
  - !ruby/object:Gem::Version
1061
1064
  version: '0'
1062
1065
  requirements: []
1063
- rubygems_version: 4.0.8
1066
+ rubygems_version: 4.0.10
1064
1067
  specification_version: 4
1065
1068
  summary: A suite of tools for working with GOV.UK Content Blocks
1066
1069
  test_files: []