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 +4 -4
- data/app/components/content_block_tools/time_period_component.rb +10 -7
- data/lib/content_block_tools/normalised_date_range.rb +63 -0
- data/lib/content_block_tools/presenters/field_presenters/time_period/date_presenter.rb +17 -2
- data/lib/content_block_tools/presenters/field_presenters/time_period/date_range_presenter.rb +17 -4
- data/lib/content_block_tools/presenters/field_presenters/time_period/end_presenter.rb +17 -0
- data/lib/content_block_tools/presenters/field_presenters/time_period/start_presenter.rb +17 -0
- data/lib/content_block_tools/version.rb +1 -1
- data/lib/content_block_tools.rb +3 -0
- metadata +4 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: cb61fc3df8d1dc8cb8d612db04f79372df5b136c84af620aa50727e6dd7ee17f
|
|
4
|
+
data.tar.gz: b70351fcd23de104adfbb6d0e1c23ed3720eb8c22487ce22eda3894e4cefa908
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
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
|
-
|
|
10
|
-
|
|
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
|
data/lib/content_block_tools/presenters/field_presenters/time_period/date_range_presenter.rb
CHANGED
|
@@ -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
|
|
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(
|
|
26
|
+
presented_date(normalised_date_range.start_date)
|
|
20
27
|
end
|
|
21
28
|
|
|
22
29
|
def end_date
|
|
23
|
-
presented_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
|
data/lib/content_block_tools.rb
CHANGED
|
@@ -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.
|
|
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
|