Class: Kaal::SchedulerFileLoader::JobNormalizer

Inherits:
Object
  • Object
show all
Includes:
Kaal::Support::HashTools
Defined in:
lib/kaal/scheduler_file/job_normalizer.rb,
sig/kaal/scheduler_file/job_normalizer.rbs

Overview

Normalizes scheduler job payloads into application-ready hashes.

Instance Method Summary collapse

Methods included from Kaal::Support::HashTools

constantize, deep_dup, deep_merge, duplicable?, stringify_keys, symbolize_keys

Constructor Details

#initialize(hash_transform:, placeholder_support:, cron_validator:) ⇒ JobNormalizer

Returns a new instance of JobNormalizer.

Parameters:

  • hash_transform: (Kaal::rbs_any)
  • placeholder_support: (Kaal::rbs_any)
  • cron_validator: (Kaal::rbs_any)


15
16
17
18
19
# File 'lib/kaal/scheduler_file/job_normalizer.rb', line 15

def initialize(hash_transform:, placeholder_support:, cron_validator:)
  @hash_transform = hash_transform
  @placeholder_support = placeholder_support
  @cron_validator = cron_validator
end

Instance Method Details

#call(job_payload) ⇒ ::Hash[:key | :cron | :job_class_name | Kaal::rbs_any, Kaal::rbs_any]

Parameters:

  • job_payload (Kaal::rbs_any)

Returns:

  • (::Hash[:key | :cron | :job_class_name | Kaal::rbs_any, Kaal::rbs_any])

Raises:



21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# File 'lib/kaal/scheduler_file/job_normalizer.rb', line 21

def call(job_payload)
  payload = @hash_transform.stringify_keys(job_payload)
  key = payload.fetch('key', '').to_s.strip
  raise SchedulerConfigError, 'Job key cannot be blank' if key.empty?

  cron = required_string(payload, field: 'cron', error_prefix: "Job cron cannot be blank for key '#{key}'")
  job_class_name = required_string(payload, field: 'job_class', error_prefix: "Job class cannot be blank for key '#{key}'")
  validate_cron(key:, cron:)
  options = extract_job_options(payload, key:)

  {
    key: key,
    cron: cron,
    job_class_name: job_class_name,
    **options
  }
end

#extract_job_options(payload, key:) ⇒ { queue: Kaal::rbs_any, args: Kaal::rbs_any, kwargs: Kaal::rbs_any, enabled: Kaal::rbs_any, metadata: Kaal::rbs_any }

Parameters:

  • payload (Kaal::rbs_any)
  • key: (Kaal::rbs_any)

Returns:

  • ({ queue: Kaal::rbs_any, args: Kaal::rbs_any, kwargs: Kaal::rbs_any, enabled: Kaal::rbs_any, metadata: Kaal::rbs_any })

Raises:



54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
# File 'lib/kaal/scheduler_file/job_normalizer.rb', line 54

def extract_job_options(payload, key:)
  , args, kwargs, queue, enabled_value = payload.values_at('metadata', 'args', 'kwargs', 'queue', 'enabled')
  args ||= []
  kwargs ||= {}
  enabled = true
  if payload.key?('enabled')
    raise SchedulerConfigError, "enabled must be a boolean for key '#{key}'" unless enabled_value.is_a?(TrueClass) || enabled_value.is_a?(FalseClass)

    enabled = enabled_value
  end

  raise SchedulerConfigError, "metadata must be a mapping for key '#{key}'" if  && !.is_a?(Hash)

  validate_job_option_types(key:, args:, kwargs:, queue:)
  @placeholder_support.validate_placeholders(args, key:)
  @placeholder_support.validate_placeholders(kwargs, key:)

  {
    queue: queue,
    args: deep_dup(args),
    kwargs: deep_dup(kwargs),
    enabled: enabled,
    metadata:  ? deep_dup() : {}
  }
end

#required_string(payload, field:, error_prefix:) ⇒ Kaal::rbs_any

Parameters:

  • payload (Kaal::rbs_any)
  • field: (Kaal::rbs_any)
  • error_prefix: (Kaal::rbs_any)

Returns:

  • (Kaal::rbs_any)

Raises:



41
42
43
44
45
46
# File 'lib/kaal/scheduler_file/job_normalizer.rb', line 41

def required_string(payload, field:, error_prefix:)
  value = payload.fetch(field, '').to_s.strip
  raise SchedulerConfigError, error_prefix if value.empty?

  value
end

#validate_cron(key:, cron:) ⇒ nil, Kaal::rbs_any

Parameters:

  • key: (Kaal::rbs_any)
  • cron: (Kaal::rbs_any)

Returns:

  • (nil, Kaal::rbs_any)

Raises:



48
49
50
51
52
# File 'lib/kaal/scheduler_file/job_normalizer.rb', line 48

def validate_cron(key:, cron:)
  return if @cron_validator.call(cron)

  raise SchedulerConfigError, "Invalid cron expression '#{cron}' for key '#{key}'"
end

#validate_job_option_types(key:, args:, kwargs:, queue:) ⇒ nil, Kaal::rbs_any

Parameters:

  • key: (Kaal::rbs_any)
  • args: (Kaal::rbs_any)
  • kwargs: (Kaal::rbs_any)
  • queue: (Kaal::rbs_any)

Returns:

  • (nil, Kaal::rbs_any)

Raises:



80
81
82
83
84
85
86
87
# File 'lib/kaal/scheduler_file/job_normalizer.rb', line 80

def validate_job_option_types(key:, args:, kwargs:, queue:)
  raise SchedulerConfigError, "args must be an array for key '#{key}'" unless args.is_a?(Array)
  raise SchedulerConfigError, "kwargs must be a mapping for key '#{key}'" unless kwargs.is_a?(Hash)
  raise SchedulerConfigError, "queue must be a string for key '#{key}'" if queue && !queue.is_a?(String)
  return if kwargs.keys.all? { |kwargs_key| kwargs_key.is_a?(String) || kwargs_key.is_a?(Symbol) }

  raise SchedulerConfigError, "kwargs keys must be strings or symbols for key '#{key}'"
end