Module: Timet::TimeValidationHelpers
- Included in:
- ValidationEditor
- Defined in:
- lib/timet/validation_editor.rb
Overview
Helper module containing validation logic for time tracking items.
Class Method Summary collapse
- .adjust_end_datetime_for_next_day(start_timestamp, new_datetime) ⇒ Object
- .check_start_before_end(new_epoch, ref_timestamp, new_datetime) ⇒ Object
- .create_new_datetime(base_date_time, parsed_time_component) ⇒ Object
- .determine_base_date_time(_item, field, start_timestamp) ⇒ Object
- .determine_end_base_date_time(start_timestamp) ⇒ Object
- .determine_start_base_date_time(start_timestamp) ⇒ Object
- .fetch_item_after_start(db, id) ⇒ Object
- .fetch_item_before_end(db, id, item_start) ⇒ Object
- .fetch_item_end(item) ⇒ Object
- .fetch_item_start(item) ⇒ Object
- .format_time(epoch) ⇒ Object
- .parse_time_string(time_str) ⇒ Object
- .validate_end_after_start(new_epoch, ref_timestamp, new_datetime) ⇒ Object
- .validate_end_time(new_epoch, ref_timestamp, new_datetime) ⇒ Object
- .validate_future_date(new_datetime) ⇒ Object
- .validate_start_before_end(new_epoch, ref_timestamp, new_datetime) ⇒ Object
- .validate_time_difference(earlier_timestamp, later_timestamp) ⇒ Object
Class Method Details
.adjust_end_datetime_for_next_day(start_timestamp, new_datetime) ⇒ Object
11 12 13 14 15 |
# File 'lib/timet/validation_editor.rb', line 11 def adjust_end_datetime_for_next_day(, new_datetime) return new_datetime unless && (new_datetime.to_i <= ) new_datetime + (24 * 60 * 60) end |
.check_start_before_end(new_epoch, ref_timestamp, new_datetime) ⇒ Object
97 98 99 100 |
# File 'lib/timet/validation_editor.rb', line 97 def check_start_before_end(new_epoch, , new_datetime) validate_start_before_end(new_epoch, , new_datetime) validate_time_difference(new_epoch, ) end |
.create_new_datetime(base_date_time, parsed_time_component) ⇒ Object
17 18 19 20 21 22 23 24 25 26 27 |
# File 'lib/timet/validation_editor.rb', line 17 def create_new_datetime(base_date_time, parsed_time_component) Time.new( base_date_time.year, base_date_time.month, base_date_time.day, parsed_time_component.hour, parsed_time_component.min, parsed_time_component.sec, base_date_time.utc_offset ) end |
.determine_base_date_time(_item, field, start_timestamp) ⇒ Object
39 40 41 42 43 44 45 46 47 48 |
# File 'lib/timet/validation_editor.rb', line 39 def determine_base_date_time(_item, field, ) case field when 'start' determine_start_base_date_time() when 'end' determine_end_base_date_time() else raise ArgumentError, "Invalid field: #{field}" end end |
.determine_end_base_date_time(start_timestamp) ⇒ Object
33 34 35 36 37 |
# File 'lib/timet/validation_editor.rb', line 33 def determine_end_base_date_time() raise ArgumentError, "Cannot set 'end' time because 'start' time is not set." unless Time.at() end |
.determine_start_base_date_time(start_timestamp) ⇒ Object
29 30 31 |
# File 'lib/timet/validation_editor.rb', line 29 def determine_start_base_date_time() ? Time.at() : Time.now end |
.fetch_item_after_start(db, id) ⇒ Object
114 115 116 |
# File 'lib/timet/validation_editor.rb', line 114 def fetch_item_after_start(db, id) db.find_item(id + 1)&.dig(Timet::Application::FIELD_INDEX['start']) || TimeHelper. end |
.fetch_item_before_end(db, id, item_start) ⇒ Object
110 111 112 |
# File 'lib/timet/validation_editor.rb', line 110 def fetch_item_before_end(db, id, item_start) db.find_item(id - 1)&.dig(Timet::Application::FIELD_INDEX['end']) || item_start end |
.fetch_item_end(item) ⇒ Object
106 107 108 |
# File 'lib/timet/validation_editor.rb', line 106 def fetch_item_end(item) item[Timet::Application::FIELD_INDEX['end']] || TimeHelper. end |
.fetch_item_start(item) ⇒ Object
102 103 104 |
# File 'lib/timet/validation_editor.rb', line 102 def fetch_item_start(item) item[Timet::Application::FIELD_INDEX['start']] end |
.format_time(epoch) ⇒ Object
56 57 58 |
# File 'lib/timet/validation_editor.rb', line 56 def format_time(epoch) Time.at(epoch).strftime('%Y-%m-%d %H:%M:%S') end |
.parse_time_string(time_str) ⇒ Object
50 51 52 53 54 |
# File 'lib/timet/validation_editor.rb', line 50 def parse_time_string(time_str) Time.parse(time_str) rescue ArgumentError raise ArgumentError, "Invalid time format: #{time_str}" end |
.validate_end_after_start(new_epoch, ref_timestamp, new_datetime) ⇒ Object
72 73 74 75 76 77 78 79 80 |
# File 'lib/timet/validation_editor.rb', line 72 def validate_end_after_start(new_epoch, , new_datetime) reference_time = Time.at() formatted_new = new_datetime.strftime('%Y-%m-%d %H:%M:%S') formatted_ref = reference_time.strftime('%Y-%m-%d %H:%M:%S') return unless new_epoch <= raise ArgumentError, "End time (#{formatted_new}) must be after start time (#{formatted_ref})." end |
.validate_end_time(new_epoch, ref_timestamp, new_datetime) ⇒ Object
92 93 94 95 |
# File 'lib/timet/validation_editor.rb', line 92 def validate_end_time(new_epoch, , new_datetime) validate_end_after_start(new_epoch, , new_datetime) validate_time_difference(, new_epoch) end |
.validate_future_date(new_datetime) ⇒ Object
60 61 62 63 64 |
# File 'lib/timet/validation_editor.rb', line 60 def validate_future_date(new_datetime) return unless new_datetime > Time.now.getlocal raise ArgumentError, "Cannot set time to a future date or time: #{new_datetime.strftime('%Y-%m-%d %H:%M:%S')}" end |
.validate_start_before_end(new_epoch, ref_timestamp, new_datetime) ⇒ Object
82 83 84 85 86 87 88 89 90 |
# File 'lib/timet/validation_editor.rb', line 82 def validate_start_before_end(new_epoch, , new_datetime) reference_time = Time.at() formatted_new = new_datetime.strftime('%Y-%m-%d %H:%M:%S') formatted_ref = reference_time.strftime('%Y-%m-%d %H:%M:%S') return unless new_epoch >= raise ArgumentError, "Start time (#{formatted_new}) must be before end time (#{formatted_ref})." end |
.validate_time_difference(earlier_timestamp, later_timestamp) ⇒ Object
66 67 68 69 70 |
# File 'lib/timet/validation_editor.rb', line 66 def validate_time_difference(, ) return unless ( - ).abs >= 24 * 60 * 60 raise ArgumentError, 'The difference between start and end time must be less than 24 hours.' end |