litestack 0.2.3 → 0.2.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +7 -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/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
|