Module: Litestream::Commands

Defined in:
lib/litestream/commands.rb

Constant Summary collapse

DEFAULT_DIR =
File.expand_path(File.join(__dir__, "..", "..", "exe"))
GEM_NAME =
"litestream"
UnsupportedPlatformException =

raised when the host platform is not supported by upstream litestream’s binary releases

Class.new(StandardError)
ExecutableNotFoundException =

raised when the litestream executable could not be found where we expected it to be

Class.new(StandardError)
DirectoryNotFoundException =

raised when LITESTREAM_INSTALL_DIR does not exist

Class.new(StandardError)
DatabaseRequiredException =

raised when a litestream command requires a database argument but it isn’t provided

Class.new(StandardError)
CommandFailedException =

raised when a litestream command fails

Class.new(StandardError)

Class Method Summary collapse

Class Method Details

.databases(async: false, **argv) ⇒ Object



91
92
93
# File 'lib/litestream/commands.rb', line 91

def databases(async: false, **argv)
  execute("databases", argv, async: async, tabled_output: true)
end

.executable(exe_path: DEFAULT_DIR) ⇒ Object



29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
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/litestream/commands.rb', line 29

def executable(exe_path: DEFAULT_DIR)
  litestream_install_dir = ENV["LITESTREAM_INSTALL_DIR"]
  if litestream_install_dir
    if File.directory?(litestream_install_dir)
      warn "NOTE: using LITESTREAM_INSTALL_DIR to find litestream executable: #{litestream_install_dir}"
      exe_path = litestream_install_dir
      exe_file = File.expand_path(File.join(litestream_install_dir, "litestream"))
    else
      raise DirectoryNotFoundException, "        LITESTREAM_INSTALL_DIR is set to \#{litestream_install_dir}, but that directory does not exist.\n      MESSAGE\n    end\n  else\n    if Litestream::Upstream::NATIVE_PLATFORMS.keys.none? { |p| Gem::Platform.match_gem?(Gem::Platform.new(p), GEM_NAME) }\n      raise UnsupportedPlatformException, <<~MESSAGE\n        litestream-ruby does not support the \#{platform} platform\n        Please install litestream following instructions at https://litestream.io/install\n      MESSAGE\n    end\n\n    exe_file = Dir.glob(File.expand_path(File.join(exe_path, \"*\", \"litestream\"))).find do |f|\n      Gem::Platform.match_gem?(Gem::Platform.new(File.basename(File.dirname(f))), GEM_NAME)\n    end\n  end\n\n  if exe_file.nil? || !File.exist?(exe_file)\n    raise ExecutableNotFoundException, <<~MESSAGE\n      Cannot find the litestream executable for \#{platform} in \#{exe_path}\n\n      If you're using bundler, please make sure you're on the latest bundler version:\n\n          gem install bundler\n          bundle update --bundler\n\n      Then make sure your lock file includes this platform by running:\n\n          bundle lock --add-platform \#{platform}\n          bundle install\n\n      See `bundle lock --help` output for details.\n\n      If you're still seeing this message after taking those steps, try running\n      `bundle config` and ensure `force_ruby_platform` isn't set to `true`. See\n      https://github.com/fractaledmind/litestream-ruby#check-bundle_force_ruby_platform\n      for more details.\n    MESSAGE\n  end\n\n  exe_file\nend\n"

.generations(database, async: false, **argv) ⇒ Object



95
96
97
98
99
# File 'lib/litestream/commands.rb', line 95

def generations(database, async: false, **argv)
  raise DatabaseRequiredException, "database argument is required for generations command, e.g. litestream:generations -- --database=path/to/database.sqlite" if database.nil?

  execute("generations", argv, database, async: async, tabled_output: true)
end

.platformObject



25
26
27
# File 'lib/litestream/commands.rb', line 25

def platform
  [:cpu, :os].map { |m| Gem::Platform.local.send(m) }.join("-")
end

.replicate(async: false, **argv) ⇒ Object



80
81
82
# File 'lib/litestream/commands.rb', line 80

def replicate(async: false, **argv)
  execute("replicate", argv, async: async, tabled_output: false)
end

.restore(database, async: false, **argv) ⇒ Object



84
85
86
87
88
89
# File 'lib/litestream/commands.rb', line 84

def restore(database, async: false, **argv)
  raise DatabaseRequiredException, "database argument is required for restore command, e.g. litestream:restore -- --database=path/to/database.sqlite" if database.nil?
  argv.stringify_keys!

  execute("restore", argv, database, async: async, tabled_output: false)
end

.snapshots(database, async: false, **argv) ⇒ Object



101
102
103
104
105
# File 'lib/litestream/commands.rb', line 101

def snapshots(database, async: false, **argv)
  raise DatabaseRequiredException, "database argument is required for snapshots command, e.g. litestream:snapshots -- --database=path/to/database.sqlite" if database.nil?

  execute("snapshots", argv, database, async: async, tabled_output: true)
end

.wal(database, async: false, **argv) ⇒ Object



107
108
109
110
111
# File 'lib/litestream/commands.rb', line 107

def wal(database, async: false, **argv)
  raise DatabaseRequiredException, "database argument is required for wal command, e.g. litestream:wal -- --database=path/to/database.sqlite" if database.nil?

  execute("wal", argv, database, async: async, tabled_output: true)
end