Module: Kaal::Sequel

Defined in:
lib/kaal/sequel_support.rb

Overview

Sequel migration/install support for SQL-backed Kaal backends.

Class Method Summary collapse

Class Method Details

.default_migration_name_for(backend) ⇒ Object



60
61
62
# File 'lib/kaal/sequel_support.rb', line 60

def default_migration_name_for(backend)
  "create_kaal_#{backend}_backend"
end

.digit?(char) ⇒ Boolean

Returns:

  • (Boolean)


78
79
80
# File 'lib/kaal/sequel_support.rb', line 78

def digit?(char)
  char.between?('0', '9')
end

.install_migrations(target_dir:, backend:, migration_name: nil) ⇒ Object



26
27
28
29
30
31
32
33
34
35
36
37
38
39
# File 'lib/kaal/sequel_support.rb', line 26

def install_migrations(target_dir:, backend:, migration_name: nil)
  require_sequel!

  normalized_name = normalize_migration_name(migration_name, fallback: default_migration_name_for(backend))
  base_path = File.expand_path(target_dir)
  FileUtils.mkdir_p(base_path)

  Kaal::Persistence::MigrationTemplates.for_backend(backend).map.with_index do |(_name, contents), index|
    suffix = migration_suffixes_for(backend).fetch(index)
    path = File.expand_path("#{timestamp(index)}_#{normalized_name}_#{suffix}.rb", base_path)
    File.write(path, contents)
    path
  end
end

.install_mysql_migration(target_dir:, migration_name: 'create_kaal_mysql_backend') ⇒ Object



18
19
20
# File 'lib/kaal/sequel_support.rb', line 18

def install_mysql_migration(target_dir:, migration_name: 'create_kaal_mysql_backend')
  install_migrations(target_dir:, backend: 'mysql', migration_name:)
end

.install_postgres_migration(target_dir:, migration_name: 'create_kaal_postgres_backend') ⇒ Object



14
15
16
# File 'lib/kaal/sequel_support.rb', line 14

def install_postgres_migration(target_dir:, migration_name: 'create_kaal_postgres_backend')
  install_migrations(target_dir:, backend: 'postgres', migration_name:)
end

.install_sqlite_migration(target_dir:, migration_name: 'create_kaal_sqlite_backend') ⇒ Object



22
23
24
# File 'lib/kaal/sequel_support.rb', line 22

def install_sqlite_migration(target_dir:, migration_name: 'create_kaal_sqlite_backend')
  install_migrations(target_dir:, backend: 'sqlite', migration_name:)
end

.letter?(char) ⇒ Boolean

Returns:

  • (Boolean)


74
75
76
# File 'lib/kaal/sequel_support.rb', line 74

def letter?(char)
  char.between?('a', 'z') || char.between?('A', 'Z')
end

.migration_suffixes_for(backend) ⇒ Object



64
65
66
67
68
# File 'lib/kaal/sequel_support.rb', line 64

def migration_suffixes_for(backend)
  return %w[dispatches locks definitions] if backend.to_s == 'sqlite'

  %w[dispatches definitions]
end

.normalize_migration_name(name, fallback:) ⇒ Object



49
50
51
52
53
54
55
56
57
58
# File 'lib/kaal/sequel_support.rb', line 49

def normalize_migration_name(name, fallback:)
  normalized = name.to_s.each_char.with_object(+'') do |char, buffer|
    if letter?(char) || digit?(char)
      buffer << char.downcase
    elsif !buffer.empty? && !buffer.end_with?('_')
      buffer << '_'
    end
  end.delete_suffix('_')
  normalized.empty? ? fallback : normalized
end

.require_sequel!Object



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

def require_sequel!
  require 'sequel'
rescue LoadError => e
  raise LoadError,
        "#{e.message}. Add `gem 'sequel'` to your Gemfile to use Sequel-backed Kaal SQL support.",
        cause: e
end

.timestamp(offset = 0) ⇒ Object



70
71
72
# File 'lib/kaal/sequel_support.rb', line 70

def timestamp(offset = 0)
  (Time.now.utc + offset).strftime('%Y%m%d%H%M%S')
end