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

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.



28
29
30
31
32
# File 'lib/kaal/rails/installer.rb', line 28

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



42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
# File 'lib/kaal/rails/installer.rb', line 42

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_scheduler_configObject



34
35
36
37
38
39
40
# File 'lib/kaal/rails/installer.rb', line 34

def install_scheduler_config
  ensure_scheduler_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