litestack 0.4.1 → 0.4.3

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.
Files changed (67) hide show
  1. checksums.yaml +4 -4
  2. data/.standard.yml +3 -0
  3. data/BENCHMARKS.md +23 -7
  4. data/CHANGELOG.md +35 -0
  5. data/Gemfile +1 -7
  6. data/README.md +124 -6
  7. data/ROADMAP.md +45 -0
  8. data/Rakefile +3 -1
  9. data/WHYLITESTACK.md +1 -1
  10. data/assets/litecache_metrics.png +0 -0
  11. data/assets/litedb_metrics.png +0 -0
  12. data/assets/litemetric_logo_teal.png +0 -0
  13. data/assets/litesearch_logo_teal.png +0 -0
  14. data/bench/bench.rb +17 -10
  15. data/bench/bench_cache_rails.rb +45 -14
  16. data/bench/bench_cache_raw.rb +44 -28
  17. data/bench/bench_jobs_rails.rb +18 -12
  18. data/bench/bench_jobs_raw.rb +17 -10
  19. data/bench/bench_queue.rb +4 -6
  20. data/bench/rails_job.rb +5 -7
  21. data/bench/skjob.rb +4 -4
  22. data/bench/uljob.rb +6 -6
  23. data/bin/liteboard +2 -1
  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 +72 -84
  27. data/lib/active_support/cache/litecache.rb +61 -41
  28. data/lib/generators/litestack/install/install_generator.rb +3 -3
  29. data/lib/generators/litestack/install/templates/cable.yml +0 -3
  30. data/lib/generators/litestack/install/templates/database.yml +7 -1
  31. data/lib/litestack/liteboard/liteboard.rb +269 -149
  32. data/lib/litestack/litecable.rb +41 -37
  33. data/lib/litestack/litecable.sql.yml +22 -11
  34. data/lib/litestack/litecache.rb +118 -93
  35. data/lib/litestack/litecache.sql.yml +83 -22
  36. data/lib/litestack/litecache.yml +1 -1
  37. data/lib/litestack/litedb.rb +35 -40
  38. data/lib/litestack/litejob.rb +30 -29
  39. data/lib/litestack/litejobqueue.rb +63 -65
  40. data/lib/litestack/litemetric.rb +80 -92
  41. data/lib/litestack/litemetric.sql.yml +244 -234
  42. data/lib/litestack/litemetric_collector.sql.yml +38 -41
  43. data/lib/litestack/litequeue.rb +39 -41
  44. data/lib/litestack/litequeue.sql.yml +39 -31
  45. data/lib/litestack/litescheduler.rb +24 -18
  46. data/lib/litestack/litesearch/index.rb +93 -63
  47. data/lib/litestack/litesearch/model.rb +66 -65
  48. data/lib/litestack/litesearch/schema.rb +53 -56
  49. data/lib/litestack/litesearch/schema_adapters/backed_adapter.rb +46 -50
  50. data/lib/litestack/litesearch/schema_adapters/basic_adapter.rb +44 -35
  51. data/lib/litestack/litesearch/schema_adapters/contentless_adapter.rb +3 -6
  52. data/lib/litestack/litesearch/schema_adapters/standalone_adapter.rb +7 -9
  53. data/lib/litestack/litesearch/schema_adapters.rb +4 -9
  54. data/lib/litestack/litesearch.rb +6 -9
  55. data/lib/litestack/litesupport.rb +78 -87
  56. data/lib/litestack/railtie.rb +1 -1
  57. data/lib/litestack/version.rb +2 -2
  58. data/lib/litestack.rb +6 -4
  59. data/lib/railties/rails/commands/dbconsole.rb +16 -20
  60. data/lib/sequel/adapters/litedb.rb +16 -21
  61. data/lib/sequel/adapters/shared/litedb.rb +168 -168
  62. data/scripts/build_metrics.rb +91 -0
  63. data/scripts/test_cable.rb +30 -0
  64. data/scripts/test_job_retry.rb +33 -0
  65. data/scripts/test_metrics.rb +60 -0
  66. data/template.rb +2 -2
  67. metadata +115 -7
@@ -0,0 +1,91 @@
1
+ require_relative "../lib/litestack/litemetric"
2
+ require_relative "../lib/litestack/litecache"
3
+ require_relative "../lib/litestack/litejob"
4
+
5
+ # standard:disable Style/GlobalVars
6
+
7
+ # initialize the litemetric to modify the date function
8
+
9
+ lm = Litemetric.instance
10
+
11
+ # initialize the queue to capture the options
12
+ Litejobqueue.new({
13
+ path: ":memory:",
14
+ retries: 2,
15
+ queues: [["normal", 1], ["urgent", 3], ["critical", 10]],
16
+ metrics: true,
17
+ log: nil
18
+ })
19
+
20
+ $time = Time.now.to_i #- 10800
21
+ $start_time = Time.now.to_i
22
+
23
+ class NormalJob
24
+ include Litejob
25
+ self.queue = "normal"
26
+ def perform(time)
27
+ $time = time #-= (rand * 100).to_i #10 seconds in the past
28
+ sleep 0.001
29
+ warn "performing some normal action"
30
+ end
31
+ end
32
+
33
+ class SlowJob
34
+ include Litejob
35
+ self.queue = "normal"
36
+
37
+ def perform(time)
38
+ $time = time # (rand * 100).to_i #10 seconds in the past
39
+ sleep 0.1
40
+ warn "performing some slow action"
41
+ end
42
+ end
43
+
44
+ class CriticalJob
45
+ include Litejob
46
+ self.queue = "critical"
47
+
48
+ def perform(time)
49
+ $time = time # (rand * 100).to_i #10 seconds in the past
50
+ sleep 0.01
51
+ warn "performing some critical action"
52
+ end
53
+ end
54
+
55
+ class UrgentJob
56
+ include Litejob
57
+ self.queue = "urgent"
58
+
59
+ def perform(time)
60
+ $time = time # (rand * 100).to_i #10 seconds in the past
61
+ sleep 0.001
62
+ warn "performing some urgent action"
63
+ end
64
+ end
65
+
66
+ cache = Litecache.new({metrics: true})
67
+
68
+ def lm.current_time_slot
69
+ ($time / 300) * 300
70
+ end
71
+
72
+ jobs = [SlowJob, UrgentJob, NormalJob, CriticalJob]
73
+
74
+ payload = "A" * 128
75
+ setter = proc { cache.set((rand * 1000).to_i.to_s, payload) }
76
+ getter = proc { cache.get((rand * 1300).to_i.to_s) }
77
+ cache_actions = [getter] * 5
78
+ cache_actions << setter
79
+
80
+ t = Time.now
81
+ 5000.times do |i|
82
+ $time = $start_time - (rand * (3600 * 24 * 7 * 52)).to_i # up to 52 weeks in the past
83
+ jobs.sample.perform_async($time)
84
+ cache_actions.sample.call
85
+ puts "Finished #{i} events after #{Time.now - t} seconds for time_slot=#{lm.send(:current_time_slot)}" if i % 1000 == 0 && i > 0
86
+ end
87
+ puts "finished creating jobs, now summarizing"
88
+ lm.summarize
89
+ sleep
90
+
91
+ # standard:enable Style/GlobalVars
@@ -0,0 +1,30 @@
1
+ require_relative "../lib/litestack/litecable"
2
+
3
+ # fork
4
+
5
+ lc = Litecable.new({logger: "STDOUT", metrics: true})
6
+
7
+ class Client
8
+ def initialize(channel)
9
+ @channel = channel
10
+ warn "[#{Process.pid}]:#{object_id} listening to #{@channel}"
11
+ end
12
+
13
+ def call(*args)
14
+ warn "[#{Process.pid}]:#{object_id} recieved #{args} from #{@channel}"
15
+ end
16
+ end
17
+
18
+ channels = []
19
+ 5.times { |i| channels << "channel##{i + 1}" }
20
+
21
+ 20.times do
22
+ channel = channels.sample
23
+ lc.subscribe(channel, Client.new(channel))
24
+ end
25
+
26
+ 100.times do |i|
27
+ lc.broadcast(channels.sample, "message##{i + 1}")
28
+ end
29
+
30
+ sleep
@@ -0,0 +1,33 @@
1
+ require "minitest/autorun"
2
+ require "../lib/litestack/litejob"
3
+
4
+ # create a job queue (will be saved in a class variable)
5
+ Litejobqueue.new({retries: 3, retry_delay: 1, retry_delay_multiplier: 1, gc_sleep_interval: 1, dead_job_retention: 1, logger: "STDOUT"})
6
+
7
+ class MyJob
8
+ include Litejob
9
+
10
+ @@attempts = {}
11
+
12
+ def perform(name, time)
13
+ if @@attempts[name]
14
+ @@attempts[name] += 1
15
+ else
16
+ @@attempts[name] = 1
17
+ end
18
+ puts "Job: #{name}: attempt #{@@attempts[name]}"
19
+ raise "some error" if Time.now.to_i < time
20
+ puts "Job: #{name}: finished"
21
+ end
22
+ end
23
+
24
+ # this job will fail forever
25
+ MyJob.perform_async("FAILURE", Time.now.to_i + 10)
26
+
27
+ # this job will fail two times
28
+ MyJob.perform_async("EVENTUAL SUCCESS", Time.now.to_i + 2)
29
+
30
+ # this job will never fail
31
+ MyJob.perform_async("SUCCESS", Time.now.to_i)
32
+
33
+ sleep
@@ -0,0 +1,60 @@
1
+ require "../lib/litestack"
2
+
3
+ # standard:disable Style/GlobalVars
4
+
5
+ class SomeAction
6
+ include Litemetric::Measurable
7
+
8
+ def initialize
9
+ collect_metrics
10
+ end
11
+
12
+ def do1(param)
13
+ capture("something", param)
14
+ end
15
+
16
+ def do2(param)
17
+ capture("anotherthing", param)
18
+ end
19
+
20
+ def do3(param)
21
+ measure("differentthing", param) do
22
+ sleep 0.001
23
+ end
24
+ end
25
+
26
+ def report
27
+ resolution = "minute"
28
+ puts topics = @litemetric.topics
29
+ topics.each do |topic|
30
+ puts topic
31
+ puts events = @litemetric.event_names(resolution, topic)
32
+ events.each do |event|
33
+ if event[0] == "differentthing"
34
+ puts keys = @litemetric.keys(resolution, topic, event[0])
35
+ keys.each do |key|
36
+ puts @litemetric.event_data(resolution, topic, event[0], key[0])
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
43
+
44
+ some_action = SomeAction.new
45
+ $time = Time.now.to_i - 10800
46
+ lm = Litemetric.instance
47
+ def lm.current_time_slot
48
+ ($time / 300) * 300
49
+ end
50
+ t = Time.now
51
+ 40000.times do |i|
52
+ $time += (rand * 100).to_i # extra 10 seconds
53
+ action = ["do1", "do2", "do3"].sample
54
+ some_action.send(action, "key_#{i}")
55
+ puts "Finished #{i} events after #{Time.now - t} seconds" if i % 1000 == 0 && i > 0
56
+ end
57
+ puts "finished capturing, now reporting"
58
+ # some_action.report
59
+
60
+ # standard:enable Style/GlobalVars
data/template.rb CHANGED
@@ -1,6 +1,6 @@
1
- # Run `rails new my-app -m https://raw.githubusercontent.com/bradgessler/litestack/master/template.rb`
1
+ # Run `rails new my-app -m https://raw.githubusercontent.com/oldmoe/litestack/master/template.rb`
2
2
  # to create a new Rails app with Litestack pre-installed.
3
- gem "litestack", github: "bradgessler/litestack"
3
+ gem "litestack", github: "litestack"
4
4
 
5
5
  after_bundle do
6
6
  generate "litestack:install"
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.4.1
4
+ version: 0.4.3
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-10-11 00:00:00.000000000 Z
11
+ date: 2024-02-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: sqlite3
@@ -94,6 +94,104 @@ dependencies:
94
94
  - - ">="
95
95
  - !ruby/object:Gem::Version
96
96
  version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: rake
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: railties
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: minitest
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ - !ruby/object:Gem::Dependency
140
+ name: rack
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - "~>"
144
+ - !ruby/object:Gem::Version
145
+ version: '3.0'
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - "~>"
151
+ - !ruby/object:Gem::Version
152
+ version: '3.0'
153
+ - !ruby/object:Gem::Dependency
154
+ name: simplecov
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - ">="
158
+ - !ruby/object:Gem::Version
159
+ version: '0'
160
+ type: :development
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - ">="
165
+ - !ruby/object:Gem::Version
166
+ version: '0'
167
+ - !ruby/object:Gem::Dependency
168
+ name: standard
169
+ requirement: !ruby/object:Gem::Requirement
170
+ requirements:
171
+ - - ">="
172
+ - !ruby/object:Gem::Version
173
+ version: '0'
174
+ type: :development
175
+ prerelease: false
176
+ version_requirements: !ruby/object:Gem::Requirement
177
+ requirements:
178
+ - - ">="
179
+ - !ruby/object:Gem::Version
180
+ version: '0'
181
+ - !ruby/object:Gem::Dependency
182
+ name: sequel
183
+ requirement: !ruby/object:Gem::Requirement
184
+ requirements:
185
+ - - ">="
186
+ - !ruby/object:Gem::Version
187
+ version: '0'
188
+ type: :development
189
+ prerelease: false
190
+ version_requirements: !ruby/object:Gem::Requirement
191
+ requirements:
192
+ - - ">="
193
+ - !ruby/object:Gem::Version
194
+ version: '0'
97
195
  description:
98
196
  email:
99
197
  - oldmoe@gmail.com
@@ -102,19 +200,25 @@ executables:
102
200
  extensions: []
103
201
  extra_rdoc_files: []
104
202
  files:
203
+ - ".standard.yml"
105
204
  - BENCHMARKS.md
106
205
  - CHANGELOG.md
107
206
  - Gemfile
108
207
  - LICENSE.txt
109
208
  - README.md
209
+ - ROADMAP.md
110
210
  - Rakefile
111
211
  - WHYLITESTACK.md
112
212
  - assets/event_page.png
113
213
  - assets/index_page.png
114
214
  - assets/litecable_logo_teal.png
115
215
  - assets/litecache_logo_teal.png
216
+ - assets/litecache_metrics.png
116
217
  - assets/litedb_logo_teal.png
218
+ - assets/litedb_metrics.png
117
219
  - assets/litejob_logo_teal.png
220
+ - assets/litemetric_logo_teal.png
221
+ - assets/litesearch_logo_teal.png
118
222
  - assets/litestack_logo_teal.png
119
223
  - assets/litestack_logo_teal_large.png
120
224
  - assets/topic_page.png
@@ -176,15 +280,19 @@ files:
176
280
  - lib/sequel/adapters/litedb.rb
177
281
  - lib/sequel/adapters/shared/litedb.rb
178
282
  - samples/ultrajob.yaml
283
+ - scripts/build_metrics.rb
284
+ - scripts/test_cable.rb
285
+ - scripts/test_job_retry.rb
286
+ - scripts/test_metrics.rb
179
287
  - template.rb
180
- homepage: http://github.com/oldmoe/litestack
288
+ homepage: https://github.com/oldmoe/litestack
181
289
  licenses:
182
290
  - MIT
183
291
  metadata:
184
292
  allowed_push_host: https://rubygems.org
185
- homepage_uri: http://github.com/oldmoe/litestack
186
- source_code_uri: http://github.com/oldmoe/litestack
187
- changelog_uri: http://github.com/oldmoe/litestack/CHANEGELOG.md
293
+ homepage_uri: https://github.com/oldmoe/litestack
294
+ source_code_uri: https://github.com/oldmoe/litestack
295
+ changelog_uri: https://github.com/oldmoe/litestack/CHANEGELOG.md
188
296
  post_install_message:
189
297
  rdoc_options: []
190
298
  require_paths:
@@ -201,7 +309,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
201
309
  - !ruby/object:Gem::Version
202
310
  version: '0'
203
311
  requirements: []
204
- rubygems_version: 3.4.20
312
+ rubygems_version: 3.5.3
205
313
  signing_key:
206
314
  specification_version: 4
207
315
  summary: A SQLite based, lightning fast, super efficient and dead simple to setup