litestack 0.3.0 → 0.4.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (66) hide show
  1. checksums.yaml +4 -4
  2. data/.standard.yml +3 -0
  3. data/BENCHMARKS.md +34 -7
  4. data/CHANGELOG.md +21 -0
  5. data/Gemfile +1 -5
  6. data/Gemfile.lock +92 -0
  7. data/README.md +120 -6
  8. data/ROADMAP.md +45 -0
  9. data/Rakefile +3 -1
  10. data/WHYLITESTACK.md +1 -1
  11. data/assets/litecache_metrics.png +0 -0
  12. data/assets/litedb_metrics.png +0 -0
  13. data/assets/litemetric_logo_teal.png +0 -0
  14. data/assets/litesearch_logo_teal.png +0 -0
  15. data/bench/bench.rb +17 -10
  16. data/bench/bench_cache_rails.rb +10 -13
  17. data/bench/bench_cache_raw.rb +17 -22
  18. data/bench/bench_jobs_rails.rb +19 -13
  19. data/bench/bench_jobs_raw.rb +17 -10
  20. data/bench/bench_queue.rb +4 -6
  21. data/bench/rails_job.rb +5 -7
  22. data/bench/skjob.rb +4 -4
  23. data/bench/uljob.rb +6 -6
  24. data/lib/action_cable/subscription_adapter/litecable.rb +5 -8
  25. data/lib/active_job/queue_adapters/litejob_adapter.rb +6 -8
  26. data/lib/active_record/connection_adapters/litedb_adapter.rb +65 -75
  27. data/lib/active_support/cache/litecache.rb +38 -41
  28. data/lib/generators/litestack/install/install_generator.rb +3 -3
  29. data/lib/generators/litestack/install/templates/database.yml +7 -1
  30. data/lib/litestack/liteboard/liteboard.rb +269 -149
  31. data/lib/litestack/litecable.rb +44 -40
  32. data/lib/litestack/litecable.sql.yml +22 -11
  33. data/lib/litestack/litecache.rb +80 -89
  34. data/lib/litestack/litecache.sql.yml +81 -22
  35. data/lib/litestack/litecache.yml +1 -1
  36. data/lib/litestack/litedb.rb +39 -38
  37. data/lib/litestack/litejob.rb +31 -31
  38. data/lib/litestack/litejobqueue.rb +107 -106
  39. data/lib/litestack/litemetric.rb +83 -95
  40. data/lib/litestack/litemetric.sql.yml +244 -234
  41. data/lib/litestack/litemetric_collector.sql.yml +38 -41
  42. data/lib/litestack/litequeue.rb +39 -41
  43. data/lib/litestack/litequeue.sql.yml +39 -31
  44. data/lib/litestack/litescheduler.rb +84 -0
  45. data/lib/litestack/litesearch/index.rb +260 -0
  46. data/lib/litestack/litesearch/model.rb +179 -0
  47. data/lib/litestack/litesearch/schema.rb +190 -0
  48. data/lib/litestack/litesearch/schema_adapters/backed_adapter.rb +143 -0
  49. data/lib/litestack/litesearch/schema_adapters/basic_adapter.rb +137 -0
  50. data/lib/litestack/litesearch/schema_adapters/contentless_adapter.rb +14 -0
  51. data/lib/litestack/litesearch/schema_adapters/standalone_adapter.rb +31 -0
  52. data/lib/litestack/litesearch/schema_adapters.rb +4 -0
  53. data/lib/litestack/litesearch.rb +34 -0
  54. data/lib/litestack/litesupport.rb +85 -186
  55. data/lib/litestack/railtie.rb +1 -1
  56. data/lib/litestack/version.rb +2 -2
  57. data/lib/litestack.rb +7 -4
  58. data/lib/railties/rails/commands/dbconsole.rb +11 -15
  59. data/lib/sequel/adapters/litedb.rb +18 -22
  60. data/lib/sequel/adapters/shared/litedb.rb +168 -168
  61. data/scripts/build_metrics.rb +91 -0
  62. data/scripts/test_cable.rb +30 -0
  63. data/scripts/test_job_retry.rb +33 -0
  64. data/scripts/test_metrics.rb +60 -0
  65. data/template.rb +2 -2
  66. metadata +112 -7
@@ -1,39 +1,45 @@
1
- require './bench'
1
+ require "./bench"
2
2
 
3
- count = ARGV[0].to_i rescue 1000
3
+ count = begin
4
+ ARGV[0].to_i
5
+ rescue
6
+ 1000
7
+ end
4
8
  env = ARGV[1] || "t"
5
- delay = ARGV[2].to_f rescue 0
6
-
9
+ _delay = begin
10
+ ARGV[2].to_f
11
+ rescue
12
+ 0
13
+ end
7
14
 
8
- #ActiveJob::Base.logger = Logger.new(IO::NULL)
15
+ # ActiveJob::Base.logger = Logger.new(IO::NULL)
9
16
 
10
- require './rails_job.rb'
17
+ require "./rails_job"
11
18
 
12
19
  RailsJob.queue_adapter = :sidekiq
13
20
  t = Time.now.to_f
14
- puts "Make sure sidekiq is started with -c ./rails_job.rb"
15
- bench("enqueuing sidekiq jobs", count) do
21
+ puts "Make sure sidekiq is started with -c ./rails_job.rb"
22
+ bench("enqueuing sidekiq jobs", count) do
16
23
  RailsJob.perform_later(count, t)
17
24
  end
18
25
 
19
26
  puts "Don't forget to check the sidekiq log for processing time conclusion"
20
27
 
21
-
22
28
  # Litejob bench
23
29
  ###############
24
30
 
25
31
  if env == "a" # threaded
26
- require 'async/scheduler'
32
+ require "async/scheduler"
27
33
  Fiber.set_scheduler Async::Scheduler.new
28
34
  ActiveSupport::IsolatedExecutionState.isolation_level = :fiber
29
35
  end
30
36
 
31
- require_relative '../lib/active_job/queue_adapters/litejob_adapter'
32
- puts Litesupport.scheduler
37
+ require_relative "../lib/active_job/queue_adapters/litejob_adapter"
38
+ puts Litescheduler.backend
33
39
 
34
40
  RailsJob.queue_adapter = :litejob
35
41
  t = Time.now.to_f
36
- bench("enqueuing litejobs", count) do
42
+ bench("enqueuing litejobs", count) do
37
43
  RailsJob.perform_later(count, t)
38
44
  end
39
45
 
@@ -1,15 +1,23 @@
1
- require './bench'
1
+ require "./bench"
2
2
 
3
- count = ARGV[0].to_i rescue 1000
3
+ count = begin
4
+ ARGV[0].to_i
5
+ rescue
6
+ 1000
7
+ end
4
8
  env = ARGV[1] || "t"
5
- delay = ARGV[2].to_f rescue 0
9
+ delay = begin
10
+ ARGV[2].to_f
11
+ rescue
12
+ 0
13
+ end
6
14
 
7
15
  # Sidekiq bench
8
16
  ###############
9
- require './skjob.rb'
17
+ require "./skjob"
10
18
 
11
19
  t = Process.clock_gettime(Process::CLOCK_MONOTONIC)
12
- puts "make sure sidekiq is started with skjob.rb as the job"
20
+ puts "make sure sidekiq is started with skjob.rb as the job"
13
21
  bench("enqueuing sidekiq jobs", count) do |i|
14
22
  SidekiqJob.perform_async(count, t, delay)
15
23
  end
@@ -20,15 +28,15 @@ puts "Don't forget to check the sidekiq log for processing time conclusion"
20
28
  ###############
21
29
 
22
30
  if env == "t" # threaded
23
- # do nothing
31
+ # do nothing
24
32
  elsif env == "a" # async
25
- require 'async/scheduler'
33
+ require "async/scheduler"
26
34
  Fiber.set_scheduler Async::Scheduler.new
27
35
  end
28
36
 
29
- require './uljob.rb'
37
+ require "./uljob"
30
38
 
31
- STDERR.puts "litejob started in #{Litesupport.scheduler} environmnet"
39
+ warn "litejob started in #{Litescheduler.backend} environment"
32
40
 
33
41
  t = Process.clock_gettime(Process::CLOCK_MONOTONIC)
34
42
  bench("enqueuing litejobs", count) do |i|
@@ -40,4 +48,3 @@ puts "Please wait for the benchmark to finish .."
40
48
  Fiber.scheduler.run if env == "a"
41
49
 
42
50
  sleep
43
-
data/bench/bench_queue.rb CHANGED
@@ -1,16 +1,14 @@
1
- require './bench'
2
- require_relative '../lib/litestack'
1
+ require "./bench"
2
+ require_relative "../lib/litestack"
3
3
 
4
4
  count = 1000
5
5
 
6
- q = Litequeue.new({path: '../db/queue.db' })
6
+ q = Litequeue.new({path: "../db/queue.db"})
7
7
 
8
8
  bench("Litequeue enqueue", count) do |i|
9
9
  q.push i.to_s
10
10
  end
11
11
 
12
12
  bench("Litequeue dequeue", count) do |i|
13
- q.pop
13
+ q.pop
14
14
  end
15
-
16
-
data/bench/rails_job.rb CHANGED
@@ -1,18 +1,16 @@
1
- require 'active_job'
1
+ require "active_job"
2
2
 
3
3
  class RailsJob < ActiveJob::Base
4
-
5
4
  queue_as :default
6
5
 
7
6
  @@count = 0
8
-
7
+
9
8
  def perform(count, time)
10
- #sleep 1
11
- @@count += 1
12
- if @@count == count
9
+ # sleep 1
10
+ @@count += 1
11
+ if @@count == count
13
12
  puts "[litejob] Finished in #{Time.now.to_f - time} seconds (#{count / (Time.now.to_f - time)} jps)"
14
13
  @@count = 0
15
14
  end
16
15
  end
17
-
18
16
  end
data/bench/skjob.rb CHANGED
@@ -1,14 +1,14 @@
1
- require 'sidekiq'
1
+ require "sidekiq"
2
2
 
3
3
  class SidekiqJob
4
4
  include Sidekiq::Job
5
5
  @@count = 0
6
6
  def perform(count, time, sleep_interval = nil)
7
- sleep sleep_interval if sleep_interval
7
+ sleep sleep_interval if sleep_interval
8
8
  @@count += 1
9
- if @@count == count
9
+ if @@count == count
10
10
  now = Process.clock_gettime(Process::CLOCK_MONOTONIC)
11
- STDERR.puts "Sidekiq finished in #{now - time} seconds (#{count / (now - time)} jps)"
11
+ warn "Sidekiq finished in #{now - time} seconds (#{count / (now - time)} jps)"
12
12
  @@count = 0
13
13
  end
14
14
  end
data/bench/uljob.rb CHANGED
@@ -1,16 +1,16 @@
1
- require './bench'
2
- require '../lib/litestack'
1
+ require "./bench"
2
+ require "../lib/litestack/litejob"
3
3
 
4
4
  class MyJob
5
5
  include Litejob
6
6
  @@count = 0
7
- #self.queue = :default
7
+ # self.queue = :default
8
8
  def perform(count, time, sleep_interval = nil)
9
- sleep sleep_interval if sleep_interval
9
+ sleep sleep_interval if sleep_interval
10
10
  @@count += 1
11
- if @@count == count
11
+ if @@count == count
12
12
  now = Process.clock_gettime(Process::CLOCK_MONOTONIC)
13
- STDERR.puts "Litejob finished in #{now - time} seconds (#{count / (now - time)} jps)"
13
+ warn "Litejob finished in #{now - time} seconds (#{count / (now - time)} jps)"
14
14
  end
15
15
  end
16
16
  end
@@ -1,26 +1,23 @@
1
1
  # frozen_stringe_literal: true
2
2
 
3
- require_relative '../../litestack/litecable'
3
+ require_relative "../../litestack/litecable"
4
4
 
5
5
  module ActionCable
6
6
  module SubscriptionAdapter
7
- class Litecable < ::Litecable# :nodoc:
8
-
7
+ class Litecable < ::Litecable # :nodoc:
9
8
  attr_reader :logger, :server
10
-
9
+
11
10
  prepend ChannelPrefix
12
11
 
13
- def initialize(server, logger=nil)
12
+ def initialize(server, logger = nil)
14
13
  @server = server
15
14
  @logger = server.logger
16
15
  super({config_path: "./config/litecable.yml"})
17
16
  end
18
-
17
+
19
18
  def shutdown
20
19
  close
21
20
  end
22
-
23
21
  end
24
22
  end
25
23
  end
26
-
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative '../../litestack/litejob.rb'
3
+ require_relative "../../litestack/litejob"
4
4
  require "active_support/core_ext/enumerable"
5
5
  require "active_support/core_ext/array/access"
6
6
  require "active_job"
@@ -12,13 +12,12 @@ module ActiveJob
12
12
  #
13
13
  # Rails.application.config.active_job.queue_adapter = :litejob
14
14
  class LitejobAdapter
15
-
16
- def initialize(options={})
15
+ def initialize(options = {})
17
16
  # we currently don't honour individual options per job class
18
17
  # possible in the future?
19
18
  # Job.options = DEFAULT_OPTIONS.merge(options)
20
19
  end
21
-
20
+
22
21
  def enqueue(job) # :nodoc:
23
22
  Job.queue = job.queue_name
24
23
  Job.perform_async(job.serialize)
@@ -30,14 +29,13 @@ module ActiveJob
30
29
  end
31
30
 
32
31
  class Job # :nodoc:
33
-
34
32
  DEFAULT_OPTIONS = {
35
33
  config_path: "./config/litejob.yml",
36
- logger: nil, # Rails performs its logging already
37
- }
34
+ logger: nil # Rails performs its logging already
35
+ }
38
36
 
39
37
  include ::Litejob
40
-
38
+
41
39
  def perform(job_data)
42
40
  Base.execute job_data
43
41
  end
@@ -1,54 +1,47 @@
1
- require_relative '../../litestack/litedb'
2
- require 'active_record'
3
- require 'active_record/connection_adapters/sqlite3_adapter'
4
- require 'active_record/tasks/sqlite_database_tasks'
1
+ require_relative "../../litestack/litedb"
2
+ require "active_record"
3
+ require "active_record/connection_adapters/sqlite3_adapter"
4
+ require "active_record/tasks/sqlite_database_tasks"
5
5
 
6
6
  module ActiveRecord
7
+ module ConnectionHandling # :nodoc:
8
+ def litedb_connection(config)
9
+ config = config.symbolize_keys
7
10
 
8
- module ConnectionHandling # :nodoc:
9
-
10
- def litedb_connection(config)
11
-
12
- config = config.symbolize_keys
13
-
14
- # Require database.
15
- unless config[:database]
16
- raise ArgumentError, "No database file specified. Missing argument: database"
17
- end
18
-
19
- # Allow database path relative to Rails.root, but only if the database
20
- # path is not the special path that tells sqlite to build a database only
21
- # in memory.
22
- if ":memory:" != config[:database] && !config[:database].to_s.start_with?("file:")
23
- config[:database] = File.expand_path(config[:database], Rails.root) if defined?(Rails.root)
24
- dirname = File.dirname(config[:database])
25
- Dir.mkdir(dirname) unless File.directory?(dirname)
26
- end
27
-
28
- db = ::Litedb.new(
29
- config[:database].to_s,
30
- config.merge(results_as_hash: true)
31
- )
11
+ # Require database.
12
+ unless config[:database]
13
+ raise ArgumentError, "No database file specified. Missing argument: database"
14
+ end
32
15
 
33
- ConnectionAdapters::LitedbAdapter.new(db, logger, nil, config)
34
-
35
- rescue Errno::ENOENT => error
36
- if error.message.include?("No such file or directory")
37
- raise ActiveRecord::NoDatabaseError
38
- else
39
- raise
40
- end
41
- end
42
- end
16
+ # Allow database path relative to Rails.root, but only if the database
17
+ # path is not the special path that tells sqlite to build a database only
18
+ # in memory.
19
+ if config[:database] != ":memory:" && !config[:database].to_s.start_with?("file:")
20
+ config[:database] = File.expand_path(config[:database], Rails.root) if defined?(Rails.root)
21
+ dirname = File.dirname(config[:database])
22
+ Dir.mkdir(dirname) unless File.directory?(dirname)
23
+ end
43
24
 
44
- module ConnectionAdapters # :nodoc:
25
+ db = ::Litedb.new(
26
+ config[:database].to_s,
27
+ config.merge(results_as_hash: true)
28
+ )
29
+
30
+ ConnectionAdapters::LitedbAdapter.new(db, logger, nil, config)
31
+ rescue Errno::ENOENT => error
32
+ if error.message.include?("No such file or directory")
33
+ raise ActiveRecord::NoDatabaseError
34
+ else
35
+ raise
36
+ end
37
+ end
38
+ end
45
39
 
46
- class LitedbAdapter < SQLite3Adapter
40
+ module ConnectionAdapters # :nodoc:
41
+ class LitedbAdapter < SQLite3Adapter
42
+ ADAPTER_NAME = "litedb"
47
43
 
48
- ADAPTER_NAME = "litedb"
49
-
50
44
  class << self
51
-
52
45
  def dbconsole(config, options = {})
53
46
  args = []
54
47
 
@@ -58,45 +51,42 @@ module ActiveRecord
58
51
 
59
52
  find_cmd_and_exec("sqlite3", *args)
60
53
  end
61
-
62
54
  end
63
55
 
64
- NATIVE_DATABASE_TYPES = {
65
- primary_key: "integer PRIMARY KEY NOT NULL",
66
- string: { name: "text" },
67
- text: { name: "text" },
68
- integer: { name: "integer" },
69
- float: { name: "real" },
70
- decimal: { name: "real" },
71
- datetime: { name: "text" },
72
- time: { name: "integer" },
73
- date: { name: "text" },
74
- binary: { name: "blob" },
75
- boolean: { name: "integer" },
76
- json: { name: "text" },
77
- unixtime: { name: "integer" }
78
- }
79
-
80
- private
81
-
82
- def connect
83
- @raw_connection = ::Litedb.new(
84
- @config[:database].to_s,
85
- @config.merge(results_as_hash: true)
86
- )
87
- configure_connection
88
- end
89
- end
56
+ NATIVE_DATABASE_TYPES = {
57
+ primary_key: "integer PRIMARY KEY NOT NULL",
58
+ string: {name: "text"},
59
+ text: {name: "text"},
60
+ integer: {name: "integer"},
61
+ float: {name: "real"},
62
+ decimal: {name: "real"},
63
+ datetime: {name: "text"},
64
+ time: {name: "integer"},
65
+ date: {name: "text"},
66
+ binary: {name: "blob"},
67
+ boolean: {name: "integer"},
68
+ json: {name: "text"},
69
+ unixtime: {name: "integer"}
70
+ }
71
+
72
+ private
73
+
74
+ def connect
75
+ @raw_connection = ::Litedb.new(
76
+ @config[:database].to_s,
77
+ @config.merge(results_as_hash: true)
78
+ )
79
+ configure_connection
80
+ end
81
+ end
82
+ end
90
83
 
91
- end
92
-
93
84
  module Tasks # :nodoc:
94
85
  class LitedbDatabaseTasks < SQLiteDatabaseTasks # :nodoc:
95
86
  end
96
-
87
+
97
88
  module DatabaseTasks
98
89
  register_task(/litedb/, "ActiveRecord::Tasks::LitedbDatabaseTasks")
99
-
100
90
  end
101
- end
91
+ end
102
92
  end
@@ -3,23 +3,21 @@ require "active_support/core_ext/enumerable"
3
3
  require "active_support/core_ext/array/extract_options"
4
4
  require "active_support/core_ext/numeric/time"
5
5
  require "active_support/cache"
6
- require_relative '../../litestack'
7
-
6
+ require_relative "../../litestack/litecache"
8
7
 
9
8
  module ActiveSupport
10
9
  module Cache
11
10
  class Litecache < Store
12
-
13
11
  prepend Strategy::LocalCache
14
-
12
+
15
13
  def self.supports_cache_versioning?
16
14
  true
17
15
  end
18
16
 
19
- def initialize(options={})
17
+ def initialize(options = {})
20
18
  super
21
19
  @options[:return_full_record] = true
22
- @cache = ::Litecache.new(@options) # reachout to the outer litecache class
20
+ @cache = ::Litecache.new(@options) # reachout to the outer litecache class
23
21
  end
24
22
 
25
23
  def increment(key, amount = 1, options = nil)
@@ -27,39 +25,39 @@ module ActiveSupport
27
25
  options = merged_options(options)
28
26
  # todo: fix me
29
27
  # this is currently a hack to avoid dealing with Rails cache encoding and decoding
30
- #@cache.transaction(:immediate) do
31
- if value = read(key, options)
32
- value = value.to_i + amount
33
- write(key, value, options)
34
- end
35
- #end
28
+ # @cache.transaction(:immediate) do
29
+ if (value = read(key, options))
30
+ value = value.to_i + amount
31
+ write(key, value, options)
32
+ end
33
+ # end
36
34
  end
37
35
 
38
36
  def decrement(key, amount = 1, options = nil)
39
37
  options = merged_options(options)
40
38
  increment(key, -1 * amount, options[:expires_in])
41
39
  end
42
-
40
+
43
41
  def prune(limit = nil, time = nil)
44
42
  @cache.prune(limit)
45
43
  end
46
44
 
47
45
  def cleanup(limit = nil, time = nil)
48
46
  @cache.prune(limit)
49
- end
47
+ end
50
48
 
51
- def clear()
52
- @cache.clear
49
+ def clear
50
+ @cache.clear
53
51
  end
54
-
52
+
55
53
  def count
56
54
  @cache.count
57
55
  end
58
-
56
+
59
57
  def size
60
58
  @cache.size
61
59
  end
62
-
60
+
63
61
  def max_size
64
62
  @cache.max_size
65
63
  end
@@ -70,33 +68,32 @@ module ActiveSupport
70
68
 
71
69
  private
72
70
 
73
- # Read an entry from the cache.
74
- def read_entry(key, **options)
75
- deserialize_entry(@cache.get(key))
76
- end
71
+ # Read an entry from the cache.
72
+ def read_entry(key, **options)
73
+ deserialize_entry(@cache.get(key))
74
+ end
77
75
 
78
- # Write an entry to the cache.
79
- def write_entry(key, entry, **options)
80
- write_serialized_entry(key, serialize_entry(entry, **options), **options)
81
- end
76
+ # Write an entry to the cache.
77
+ def write_entry(key, entry, **options)
78
+ write_serialized_entry(key, serialize_entry(entry, **options), **options)
79
+ end
82
80
 
83
- def write_serialized_entry(key, payload, **options)
84
- expires_in = options[:expires_in].to_i
85
- if options[:race_condition_ttl] && expires_in > 0 && !options[:raw]
86
- expires_in += 5.minutes
87
- end
88
- if options[:unless_exist]
89
- @cache.set_unless_exists(key, payload, expires_in)
90
- else
91
- @cache.set(key, payload, expires_in)
92
- end
81
+ def write_serialized_entry(key, payload, **options)
82
+ expires_in = options[:expires_in].to_i
83
+ if options[:race_condition_ttl] && expires_in > 0 && !options[:raw]
84
+ expires_in += 5.minutes
93
85
  end
94
-
95
- # Delete an entry from the cache.
96
- def delete_entry(key, **options)
97
- return @cache.delete(key)
86
+ if options[:unless_exist]
87
+ @cache.set_unless_exists(key, payload, expires_in)
88
+ else
89
+ @cache.set(key, payload, expires_in)
98
90
  end
91
+ end
99
92
 
93
+ # Delete an entry from the cache.
94
+ def delete_entry(key, **options)
95
+ @cache.delete(key)
96
+ end
100
97
  end
101
98
  end
102
99
  end
@@ -27,9 +27,9 @@ class Litestack::InstallGenerator < Rails::Generators::Base
27
27
  def modify_gitignore
28
28
  append_file ".gitignore", <<~TEXT
29
29
 
30
- # Ignore default Litestack SQLite databases.
31
- /db/**/*.sqlite3
32
- /db/**/*.sqlite3-*
30
+ # Ignore default Litestack SQLite databases.
31
+ /db/**/*.sqlite3
32
+ /db/**/*.sqlite3-*
33
33
  TEXT
34
34
  end
35
35
  end
@@ -7,6 +7,9 @@
7
7
  # `Litesupport.root.join("data.sqlite3")` stores
8
8
  # application data in the path `./db/#{Rails.env}/data.sqlite3`
9
9
  #
10
+ # `Litesupport.root(env).join(path)` stores
11
+ # application data in the path `./db/#{env}/#{path}`
12
+ #
10
13
  # idle_timeout should be set to zero, to avoid recycling sqlite connections
11
14
  # and losing the page cache
12
15
  #
@@ -14,16 +17,17 @@ default: &default
14
17
  adapter: litedb
15
18
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
16
19
  idle_timeout: 0
17
- database: <%= Litesupport.root.join("data.sqlite3") %>
18
20
 
19
21
  development:
20
22
  <<: *default
23
+ database: <%= Litesupport.root("development").join("data.sqlite3") %>
21
24
 
22
25
  # Warning: The database defined as "test" will be erased and
23
26
  # re-generated from your development database when you run "rake".
24
27
  # Do not set this db to the same as development or production.
25
28
  test:
26
29
  <<: *default
30
+ database: <%= Litesupport.root("test").join("data.sqlite3") %>
27
31
 
28
32
  # Warning: Make sure your production database path is on a persistent
29
33
  # volume, otherwise your application data could be deleted between deploys.
@@ -32,3 +36,5 @@ test:
32
36
  # `LITESTACK_DATA_PATH` environment variable.
33
37
  production:
34
38
  <<: *default
39
+ database: <%= Litesupport.root("production").join("data.sqlite3") %>
40
+