litestack 0.2.2 → 0.2.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +16 -0
- data/Gemfile +2 -0
- data/README.md +4 -10
- data/bench/bench_jobs_rails.rb +1 -1
- data/bench/bench_jobs_raw.rb +1 -1
- data/bin/liteboard +81 -0
- data/lib/active_job/queue_adapters/litejob_adapter.rb +0 -4
- data/lib/generators/litestack/install/USAGE +11 -0
- data/lib/generators/litestack/install/install_generator.rb +35 -0
- data/lib/generators/litestack/install/templates/cable.yml +11 -0
- data/lib/generators/litestack/install/templates/database.yml +30 -0
- data/lib/litestack/liteboard/liteboard.rb +168 -0
- data/lib/litestack/liteboard/views/event.erb +32 -0
- data/lib/litestack/liteboard/views/index.erb +22 -0
- data/lib/litestack/liteboard/views/layout.erb +152 -0
- data/lib/litestack/liteboard/views/topic.erb +48 -0
- data/lib/litestack/litecable.rb +1 -1
- data/lib/litestack/litecache.rb +25 -11
- data/lib/litestack/litedb.rb +115 -1
- data/lib/litestack/litejob.rb +2 -2
- data/lib/litestack/litejobqueue.rb +8 -8
- data/lib/litestack/litemetric.rb +185 -73
- data/lib/litestack/litemetric.sql.yml +307 -39
- data/lib/litestack/litemetric_collector.sql.yml +56 -0
- data/lib/litestack/litequeue.rb +20 -10
- data/lib/litestack/litequeue.sql.yml +11 -0
- data/lib/litestack/litesupport.rb +97 -38
- data/lib/litestack/railtie.rb +10 -0
- data/lib/litestack/version.rb +1 -1
- data/lib/litestack.rb +1 -0
- data/lib/sequel/adapters/litedb.rb +1 -1
- data/template.rb +7 -0
- metadata +74 -5
- data/lib/litestack/metrics_app.rb +0 -5
@@ -4,47 +4,66 @@ require 'sqlite3'
|
|
4
4
|
require 'logger'
|
5
5
|
require 'oj'
|
6
6
|
require 'yaml'
|
7
|
+
require 'pathname'
|
8
|
+
require 'fileutils'
|
7
9
|
|
8
10
|
module Litesupport
|
9
11
|
|
10
12
|
class Error < StandardError; end
|
11
13
|
|
12
|
-
# cache the environment we are running in
|
13
|
-
# it is an error to change the environment for a process
|
14
|
-
# or for a child forked from that process
|
15
|
-
def self.environment
|
16
|
-
@env ||= detect_environment
|
17
|
-
end
|
18
|
-
|
19
14
|
def self.max_contexts
|
20
|
-
return 50 if
|
15
|
+
return 50 if scheduler == :fiber || scheduler == :polyphony
|
21
16
|
5
|
22
17
|
end
|
23
|
-
|
24
|
-
#
|
25
|
-
# we currently support :fiber, :polyphony, :iodine & :threaded
|
26
|
-
# in the future we might want to expand to other environments
|
18
|
+
|
19
|
+
# Detect the Rack or Rails environment.
|
27
20
|
def self.detect_environment
|
21
|
+
if defined? Rails
|
22
|
+
Rails.env
|
23
|
+
elsif ENV["RACK_ENV"]
|
24
|
+
ENV["RACK_ENV"]
|
25
|
+
elsif ENV["APP_ENV"]
|
26
|
+
ENV["RACK_ENV"]
|
27
|
+
else
|
28
|
+
"development"
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def self.environment
|
33
|
+
@environment ||= detect_environment
|
34
|
+
end
|
35
|
+
|
36
|
+
# cache the scheduler we are running in
|
37
|
+
# it is an error to change the scheduler for a process
|
38
|
+
# or for a child forked from that process
|
39
|
+
def self.scheduler
|
40
|
+
@scehduler ||= detect_scheduler
|
41
|
+
end
|
42
|
+
|
43
|
+
# identify which scheduler we are running in
|
44
|
+
# we currently support :fiber, :polyphony, :iodine & :threaded
|
45
|
+
# in the future we might want to expand to other schedulers
|
46
|
+
def self.detect_scheduler
|
28
47
|
return :fiber if Fiber.scheduler
|
29
48
|
return :polyphony if defined? Polyphony
|
30
49
|
return :iodine if defined? Iodine
|
31
|
-
return :threaded # fall back for all other
|
50
|
+
return :threaded # fall back for all other schedulers
|
32
51
|
end
|
33
52
|
|
34
53
|
# spawn a new execution context
|
35
54
|
def self.spawn(&block)
|
36
|
-
if self.
|
55
|
+
if self.scheduler == :fiber
|
37
56
|
Fiber.schedule(&block)
|
38
|
-
elsif self.
|
57
|
+
elsif self.scheduler == :polyphony
|
39
58
|
spin(&block)
|
40
|
-
elsif self.
|
59
|
+
elsif self.scheduler == :threaded or self.scheduler == :iodine
|
41
60
|
Thread.new(&block)
|
42
61
|
end
|
43
62
|
# we should never reach here
|
44
63
|
end
|
45
|
-
|
64
|
+
|
46
65
|
def self.context
|
47
|
-
if
|
66
|
+
if scheduler == :fiber || scheduler == :poylphony
|
48
67
|
Fiber.current.storage
|
49
68
|
else
|
50
69
|
Thread.current
|
@@ -52,7 +71,7 @@ module Litesupport
|
|
52
71
|
end
|
53
72
|
|
54
73
|
def self.current_context
|
55
|
-
if
|
74
|
+
if scheduler == :fiber || scheduler == :poylphony
|
56
75
|
Fiber.current
|
57
76
|
else
|
58
77
|
Thread.current
|
@@ -61,10 +80,10 @@ module Litesupport
|
|
61
80
|
|
62
81
|
# switch the execution context to allow others to run
|
63
82
|
def self.switch
|
64
|
-
if self.
|
83
|
+
if self.scheduler == :fiber
|
65
84
|
Fiber.scheduler.yield
|
66
85
|
true
|
67
|
-
elsif self.
|
86
|
+
elsif self.scheduler == :polyphony
|
68
87
|
Fiber.current.schedule
|
69
88
|
Thread.current.switch_fiber
|
70
89
|
true
|
@@ -85,7 +104,7 @@ module Litesupport
|
|
85
104
|
# they must send (true) as a parameter to this method
|
86
105
|
# else it is a no-op for fibers
|
87
106
|
def self.synchronize(fiber_sync = false, &block)
|
88
|
-
if self.
|
107
|
+
if self.scheduler == :fiber or self.scheduler == :polyphony
|
89
108
|
yield # do nothing, just run the block as is
|
90
109
|
else
|
91
110
|
self.mutex.synchronize(&block)
|
@@ -103,7 +122,30 @@ module Litesupport
|
|
103
122
|
end
|
104
123
|
db
|
105
124
|
end
|
106
|
-
|
125
|
+
|
126
|
+
# Databases will be stored by default at this path.
|
127
|
+
def self.root
|
128
|
+
@root ||= ensure_root_volume detect_root
|
129
|
+
end
|
130
|
+
|
131
|
+
# Default path where we'll store all of the databases.
|
132
|
+
def self.detect_root
|
133
|
+
path = if ENV["LITESTACK_DATA_PATH"]
|
134
|
+
ENV["LITESTACK_DATA_PATH"]
|
135
|
+
elsif defined? Rails
|
136
|
+
"./db"
|
137
|
+
else
|
138
|
+
"."
|
139
|
+
end
|
140
|
+
|
141
|
+
Pathname.new(path).join(Litesupport.environment)
|
142
|
+
end
|
143
|
+
|
144
|
+
def self.ensure_root_volume(path)
|
145
|
+
FileUtils.mkdir_p path unless path.exist?
|
146
|
+
path
|
147
|
+
end
|
148
|
+
|
107
149
|
class Mutex
|
108
150
|
|
109
151
|
def initialize
|
@@ -111,7 +153,7 @@ module Litesupport
|
|
111
153
|
end
|
112
154
|
|
113
155
|
def synchronize(&block)
|
114
|
-
if Litesupport.
|
156
|
+
if Litesupport.scheduler == :threaded || Litesupport.scheduler == :iodine
|
115
157
|
@mutex.synchronize{ block.call }
|
116
158
|
else
|
117
159
|
block.call
|
@@ -188,7 +230,7 @@ module Litesupport
|
|
188
230
|
def _fork(*args)
|
189
231
|
ppid = Process.pid
|
190
232
|
result = super
|
191
|
-
if Process.pid != ppid && [:threaded, :iodine].include?(Litesupport.
|
233
|
+
if Process.pid != ppid && [:threaded, :iodine].include?(Litesupport.scheduler)
|
192
234
|
ForkListener.listeners.each{|l| l.call }
|
193
235
|
end
|
194
236
|
result
|
@@ -201,6 +243,11 @@ module Litesupport
|
|
201
243
|
include Forkable
|
202
244
|
|
203
245
|
# close, setup, run_stmt and run_sql assume a single connection was created
|
246
|
+
|
247
|
+
def options
|
248
|
+
@options
|
249
|
+
end
|
250
|
+
|
204
251
|
def close
|
205
252
|
@running = false
|
206
253
|
@conn.acquire do |q|
|
@@ -209,6 +256,22 @@ module Litesupport
|
|
209
256
|
end
|
210
257
|
end
|
211
258
|
|
259
|
+
def size
|
260
|
+
run_sql("SELECT size.page_size * count.page_count FROM pragma_page_size() AS size, pragma_page_count() AS count")[0][0].to_f / (1024*1024)
|
261
|
+
end
|
262
|
+
|
263
|
+
def journal_mode
|
264
|
+
run_method(:journal_mode)
|
265
|
+
end
|
266
|
+
|
267
|
+
def synchronous
|
268
|
+
run_method(:synchronous)
|
269
|
+
end
|
270
|
+
|
271
|
+
def path
|
272
|
+
run_method(:filename)
|
273
|
+
end
|
274
|
+
|
212
275
|
private # all methods are private
|
213
276
|
|
214
277
|
def init(options = {})
|
@@ -224,22 +287,14 @@ module Litesupport
|
|
224
287
|
Litesupport::ForkListener.listen do
|
225
288
|
setup
|
226
289
|
end
|
227
|
-
end
|
228
|
-
|
290
|
+
end
|
291
|
+
|
229
292
|
def configure(options = {})
|
230
|
-
# detect
|
231
|
-
env = "development"
|
232
|
-
if defined? Rails
|
233
|
-
env = ENV["RAILS_ENV"]
|
234
|
-
elsif ENV["RACK_ENV"]
|
235
|
-
env = ENV["RACK_ENV"]
|
236
|
-
elsif ENV["APP_ENV"]
|
237
|
-
env = ENV["RACK_ENV"]
|
238
|
-
end
|
293
|
+
# detect enviornment (production, development, etc.)
|
239
294
|
defaults = self.class::DEFAULT_OPTIONS rescue {}
|
240
295
|
@options = defaults.merge(options)
|
241
296
|
config = YAML.load_file(@options[:config_path]) rescue {} # an empty hash won't hurt
|
242
|
-
config = config[
|
297
|
+
config = config[Litesupport.environment] if config[Litesupport.environment] # if there is a config for the current enviornment defined then use it, otherwise use the top level declaration
|
243
298
|
config.keys.each do |k| # symbolize keys
|
244
299
|
config[k.to_sym] = config[k]
|
245
300
|
config.delete k
|
@@ -266,7 +321,7 @@ module Litesupport
|
|
266
321
|
def exit_callback
|
267
322
|
close
|
268
323
|
end
|
269
|
-
|
324
|
+
|
270
325
|
def run_stmt(stmt, *args)
|
271
326
|
@conn.acquire{|q| q.stmts[stmt].execute!(*args) }
|
272
327
|
end
|
@@ -275,6 +330,10 @@ module Litesupport
|
|
275
330
|
@conn.acquire{|q| q.execute(sql, *args) }
|
276
331
|
end
|
277
332
|
|
333
|
+
def run_method(method, *args)
|
334
|
+
@conn.acquire{|q| q.send(method, *args)}
|
335
|
+
end
|
336
|
+
|
278
337
|
def create_pooled_connection(count = 1)
|
279
338
|
Litesupport::Pool.new(1){create_connection}
|
280
339
|
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
require "rails/railtie"
|
2
|
+
|
3
|
+
module Litestack
|
4
|
+
class Railtie < ::Rails::Railtie
|
5
|
+
initializer :disable_production_sqlite_warning do |app|
|
6
|
+
# The whole point of this gem is to use sqlite3 in production.
|
7
|
+
app.config.active_record.sqlite3_production_warning = false
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
data/lib/litestack/version.rb
CHANGED
data/lib/litestack.rb
CHANGED
@@ -16,6 +16,7 @@ require_relative "./railties/rails/commands/dbconsole" if defined? Rails && defi
|
|
16
16
|
require_relative "./active_support/cache/litecache" if defined? ActiveSupport
|
17
17
|
require_relative "./active_job/queue_adapters/litejob_adapter" if defined? ActiveJob
|
18
18
|
require_relative "./action_cable/subscription_adapter/litecable" if defined? ActionCable
|
19
|
+
require_relative "./litestack/railtie" if defined? Rails
|
19
20
|
|
20
21
|
module Litestack
|
21
22
|
class NotImplementedError < Exception; end
|
@@ -15,7 +15,7 @@ module Sequel
|
|
15
15
|
|
16
16
|
def connect(server)
|
17
17
|
|
18
|
-
Sequel.extension :fiber_concurrency if [:fiber, :polyphony].include? Litesupport.
|
18
|
+
Sequel.extension :fiber_concurrency if [:fiber, :polyphony].include? Litesupport.scheduler
|
19
19
|
|
20
20
|
opts = server_opts(server)
|
21
21
|
opts[:database] = ':memory:' if blank_object?(opts[:database])
|
data/template.rb
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
# Run `rails new my-app -m https://raw.githubusercontent.com/bradgessler/litestack/master/template.rb`
|
2
|
+
# to create a new Rails app with Litestack pre-installed.
|
3
|
+
gem "litestack", github: "bradgessler/litestack"
|
4
|
+
|
5
|
+
after_bundle do
|
6
|
+
generate "litestack:install"
|
7
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: litestack
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Mohamed Hassan
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-
|
11
|
+
date: 2023-07-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: sqlite3
|
@@ -38,10 +38,67 @@ dependencies:
|
|
38
38
|
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rack
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: hanami-router
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: tilt
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :runtime
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: erubi
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
type: :runtime
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ">="
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
41
97
|
description:
|
42
98
|
email:
|
43
99
|
- oldmoe@gmail.com
|
44
|
-
executables:
|
100
|
+
executables:
|
101
|
+
- liteboard
|
45
102
|
extensions: []
|
46
103
|
extra_rdoc_files: []
|
47
104
|
files:
|
@@ -67,11 +124,21 @@ files:
|
|
67
124
|
- bench/rails_job.rb
|
68
125
|
- bench/skjob.rb
|
69
126
|
- bench/uljob.rb
|
127
|
+
- bin/liteboard
|
70
128
|
- lib/action_cable/subscription_adapter/litecable.rb
|
71
129
|
- lib/active_job/queue_adapters/litejob_adapter.rb
|
72
130
|
- lib/active_record/connection_adapters/litedb_adapter.rb
|
73
131
|
- lib/active_support/cache/litecache.rb
|
132
|
+
- lib/generators/litestack/install/USAGE
|
133
|
+
- lib/generators/litestack/install/install_generator.rb
|
134
|
+
- lib/generators/litestack/install/templates/cable.yml
|
135
|
+
- lib/generators/litestack/install/templates/database.yml
|
74
136
|
- lib/litestack.rb
|
137
|
+
- lib/litestack/liteboard/liteboard.rb
|
138
|
+
- lib/litestack/liteboard/views/event.erb
|
139
|
+
- lib/litestack/liteboard/views/index.erb
|
140
|
+
- lib/litestack/liteboard/views/layout.erb
|
141
|
+
- lib/litestack/liteboard/views/topic.erb
|
75
142
|
- lib/litestack/litecable.rb
|
76
143
|
- lib/litestack/litecable.sql.yml
|
77
144
|
- lib/litestack/litecache.rb
|
@@ -82,15 +149,17 @@ files:
|
|
82
149
|
- lib/litestack/litejobqueue.rb
|
83
150
|
- lib/litestack/litemetric.rb
|
84
151
|
- lib/litestack/litemetric.sql.yml
|
152
|
+
- lib/litestack/litemetric_collector.sql.yml
|
85
153
|
- lib/litestack/litequeue.rb
|
86
154
|
- lib/litestack/litequeue.sql.yml
|
87
155
|
- lib/litestack/litesupport.rb
|
88
|
-
- lib/litestack/
|
156
|
+
- lib/litestack/railtie.rb
|
89
157
|
- lib/litestack/version.rb
|
90
158
|
- lib/railties/rails/commands/dbconsole.rb
|
91
159
|
- lib/sequel/adapters/litedb.rb
|
92
160
|
- lib/sequel/adapters/shared/litedb.rb
|
93
161
|
- samples/ultrajob.yaml
|
162
|
+
- template.rb
|
94
163
|
homepage: http://github.com/oldmoe/litestack
|
95
164
|
licenses:
|
96
165
|
- MIT
|
@@ -115,7 +184,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
115
184
|
- !ruby/object:Gem::Version
|
116
185
|
version: '0'
|
117
186
|
requirements: []
|
118
|
-
rubygems_version: 3.4.
|
187
|
+
rubygems_version: 3.4.17
|
119
188
|
signing_key:
|
120
189
|
specification_version: 4
|
121
190
|
summary: A SQLite based, lightning fast, super efficient and dead simple to setup
|