Class: Kaal::Rails::Installer

Inherits:
Object
  • Object
show all
Defined in:
lib/kaal/rails/installer.rb

Overview

Installs scheduler config and Active Record migrations into a Rails app.

Constant Summary collapse

KAAL_TEMPLATE =
<<~YAML
  defaults:
    namespace: kaal
    tick_interval: 5
    window_lookback: 120
    window_lookahead: 0
    lease_ttl: 125
    scheduler_config_path: config/kaal-scheduler.yml
    enable_dispatch_recovery: true
    enable_log_dispatch_registry: false
    delayed_job_allowed_class_prefixes: []
    backend_config: {}
YAML
SCHEDULER_TEMPLATE =
<<~YAML
  defaults:
    jobs:
      - key: "example:heartbeat"
        cron: "*/5 * * * *"
        job_class: "ExampleHeartbeatJob"
        enabled: true
        args:
          - "{{fire_time.iso8601}}"
        kwargs:
          idempotency_key: "{{idempotency_key}}"
YAML

Instance Method Summary collapse

Constructor Details

#initialize(root:, backend:, time_source: -> { Time.now.utc }) ⇒ Installer

Returns a new instance of Installer.



42
43
44
45
46
# File 'lib/kaal/rails/installer.rb', line 42

def initialize(root:, backend:, time_source: -> { Time.now.utc })
  @root = Pathname(root)
  @backend = validate_backend(backend.to_s)
  @time_source = time_source
end

Instance Method Details

#install_migrationsObject



64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
# File 'lib/kaal/rails/installer.rb', line 64

def install_migrations
  migrations_dir = root.join('db', 'migrate')
  FileUtils.mkdir_p(migrations_dir)

  Kaal::Internal::ActiveRecord::MigrationTemplates.for_backend(backend).map.with_index do |(name, contents), index|
    slug = name.sub(/^\d+_/, '')
    existing = Dir[migrations_dir.join("*_#{slug}").to_s].first
    next({ status: :exists, path: existing.to_s }) if existing

    timestamp = (time_source.call + index).strftime('%Y%m%d%H%M%S')
    target = migrations_dir.join("#{timestamp}_#{slug}")
    File.write(target, contents)
    { status: :create, path: target.to_s }
  end
end

#install_runtime_configObject



48
49
50
51
52
53
54
# File 'lib/kaal/rails/installer.rb', line 48

def install_runtime_config
  ensure_config_dir
  return { status: :exists, path: runtime_config_path_string } if runtime_config_exists?

  File.write(runtime_config_path, KAAL_TEMPLATE)
  { status: :create, path: runtime_config_path_string }
end

#install_scheduler_configObject



56
57
58
59
60
61
62
# File 'lib/kaal/rails/installer.rb', line 56

def install_scheduler_config
  ensure_config_dir
  return { status: :exists, path: scheduler_config_path_string } if scheduler_config_exists?

  File.write(scheduler_config_path, SCHEDULER_TEMPLATE)
  { status: :create, path: scheduler_config_path_string }
end