super_fast_rails 0.1.0
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 +7 -0
- data/.gitignore +10 -0
- data/Gemfile +8 -0
- data/LICENSE.txt +21 -0
- data/README.md +187 -0
- data/Rakefile +4 -0
- data/bin/console +15 -0
- data/bin/setup +8 -0
- data/lib/super_fast_rails/version.rb +5 -0
- data/lib/super_fast_rails.rb +9 -0
- data/rorvswild_logo.jpg +0 -0
- data/super_fast_rails.gemspec +96 -0
- metadata +117 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: ccaa0ac92409e6cbf9a91cd391348af847cea2f6691ab810fd3e8340ce103400
|
4
|
+
data.tar.gz: 454c6db0a4526337f5131ed049d6bd27106cb164f8cee362ce4baa7234b19fe5
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: a37874cb4b075a45f961b28b2091e115a7cdb50dd126a51ab5a535cddfd57996e9f87116fc9c39c594b4f06ecc6dcbe9758dc78c941342c5078c52d9f8bf04f1
|
7
|
+
data.tar.gz: 336985dae68387a118fb7fa7d572e814585db96bb582341dccae8e39aec3a0c38cfb667f246dc2566273d6895f5b2c9fb81266ec7fc8ca9da0354d6440834211
|
data/.gitignore
ADDED
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
The MIT License (MIT)
|
2
|
+
|
3
|
+
Copyright (c) 2024 Alexis Bernard
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
7
|
+
in the Software without restriction, including without limitation the rights
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
10
|
+
furnished to do so, subject to the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be included in
|
13
|
+
all copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
21
|
+
THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,187 @@
|
|
1
|
+
# SuperFastRails
|
2
|
+
|
3
|
+
Most of the time, optimizing a Rails application requires repeating the same techniques.
|
4
|
+
For example, at the database layer, it's about creating the proper indexes, preventing 1+N queries, etc.
|
5
|
+
Could we do that automatically?
|
6
|
+
|
7
|
+
---
|
8
|
+
|
9
|
+
<img align="left" height="24px" src="rorvswild_logo.jpg" alt="RorVsWild logo"/>Made by <a href="https://www.rorvswild.com">RorVsWild</a>, performances & exceptions monitoring for Ruby on Rails applications.
|
10
|
+
|
11
|
+
---
|
12
|
+
|
13
|
+
## Introducing SuperFastRails!
|
14
|
+
|
15
|
+
We are releasing a gem to help developers write ultra-optimized code.
|
16
|
+
The goal is to allow developers to write code as fast as possible without caring about performance.
|
17
|
+
Rails scales; it's just a matter of writing the correct code.
|
18
|
+
|
19
|
+
*SuperFastRails* automatically improves the requests in your Rails application.
|
20
|
+
Thus, we focus only on the business logic and don't have to think about indexes, 1+n queries, dangerous migrations, etc.
|
21
|
+
|
22
|
+
For the first version, *SuperFastRails* takes good care of the database layer.
|
23
|
+
We want to keep adding more automatic optimizations in the future.
|
24
|
+
Here is the list of the current automatic optimizations.
|
25
|
+
|
26
|
+
|
27
|
+
## Create automatically missing indexes
|
28
|
+
|
29
|
+
Let's see the following query:
|
30
|
+
|
31
|
+
```sql
|
32
|
+
SELECT * FROM projects WHERE projects.user_id = ?
|
33
|
+
```
|
34
|
+
|
35
|
+
Without an index on user_id, the query planner scans the entire table, which is slow because it must go through all rows.
|
36
|
+
By enabling the following option:
|
37
|
+
|
38
|
+
```ruby
|
39
|
+
SuperFastRails.create_missing_indexes = 500.in_milliseconds
|
40
|
+
```
|
41
|
+
|
42
|
+
If the query takes longer than 500ms, SuperFastRails analyzes the query plan with `EXPLAIN` to detect if an index is missing.
|
43
|
+
In that case, it creates it to match the condition in the `where` clause.
|
44
|
+
Thus, when creating a new table in a migration, we don't have to think about which indexes to make because it does so automatically when the application is running.
|
45
|
+
|
46
|
+
|
47
|
+
## Remove unused indexes
|
48
|
+
|
49
|
+
Indexes speed up reads, but they slow down writes.
|
50
|
+
So, unused indexes are not good and should be removed.
|
51
|
+
By enabling the following options, it will automatically get rid of unused indexes:
|
52
|
+
|
53
|
+
```ruby
|
54
|
+
SuperFastRails.remove_unused_indexes = true
|
55
|
+
```
|
56
|
+
|
57
|
+
The combination of the two options `create_missing_indexes` and `remove_unused_indexes` ensures that the database always has relevant indexes, even if the where clauses change.
|
58
|
+
|
59
|
+
|
60
|
+
## Optimise automatically SQL
|
61
|
+
|
62
|
+
Indexes are essential, but SQL also needs to be written correctly.
|
63
|
+
For example, the following query:
|
64
|
+
|
65
|
+
```sql
|
66
|
+
SELECT *
|
67
|
+
FROM users
|
68
|
+
WHERE (SELECT count(*) FROM projects WHERE projects.user_id = users.id) > 1
|
69
|
+
```
|
70
|
+
|
71
|
+
is slower than:
|
72
|
+
|
73
|
+
```sql
|
74
|
+
SELECT *
|
75
|
+
FROM users
|
76
|
+
WHERE EXISTS (SELECT 1 FROM projects WHERE projects.user_id = users.id)
|
77
|
+
```
|
78
|
+
|
79
|
+
Because it stops once it finds a row instead of keep counting.
|
80
|
+
There are a bunch of tricks to know about SQL.
|
81
|
+
Learning them requires time, and we need to remember them.
|
82
|
+
The option `SuperFastRails.auto_optimise_queries = true` parses the SQL, and rewrites it before sending it to the database.
|
83
|
+
Thanks to it, we don't have to care about all these tricks.
|
84
|
+
|
85
|
+
You can also use it with a block if you prefer to enable it on a smaller scope:
|
86
|
+
|
87
|
+
```ruby
|
88
|
+
SuperFastRails.optimise_queries do
|
89
|
+
User.where("(SELECT count(*) FROM projects WHERE user_id = users.id) > 1")
|
90
|
+
# SELECT *
|
91
|
+
# FROM users
|
92
|
+
# WHERE EXISTS (SELECT 1 FROM projects WHERE user_id = users.id)
|
93
|
+
end
|
94
|
+
|
95
|
+
```
|
96
|
+
|
97
|
+
|
98
|
+
## Get rid of 1+N queries
|
99
|
+
|
100
|
+
The 1+N queries problem happens when iterating through a collection where the same query is repeated.
|
101
|
+
For the following example:
|
102
|
+
|
103
|
+
```ruby
|
104
|
+
Project.all.each do |project|
|
105
|
+
puts "#{project.name} by #{project.user.name}"
|
106
|
+
end
|
107
|
+
```
|
108
|
+
|
109
|
+
It triggers one extra query for each project:
|
110
|
+
|
111
|
+
```sql
|
112
|
+
SELECT * FROM projects
|
113
|
+
SELECT * FROM users WHERE users.id = ?
|
114
|
+
SELECT * FROM users WHERE users.id = ?
|
115
|
+
SELECT * FROM users WHERE users.id = ?
|
116
|
+
SELECT * FROM users WHERE users.id = ?
|
117
|
+
SELECT * FROM users WHERE users.id = ?
|
118
|
+
SELECT * FROM users WHERE users.id = ?
|
119
|
+
-- And so on
|
120
|
+
```
|
121
|
+
|
122
|
+
To solve this, SuperFastRails adds a method `each_without_1_plus_n_queries` to ActiveRecord relations.
|
123
|
+
It detects when two identical queries are triggered to load all the missing data in a single query.
|
124
|
+
|
125
|
+
```ruby
|
126
|
+
Project.all.each_without_1_plus_n_queries do |project|
|
127
|
+
puts "#{project.name} by #{project.user.name}"
|
128
|
+
end
|
129
|
+
```
|
130
|
+
|
131
|
+
```sql
|
132
|
+
SELECT * FROM projects
|
133
|
+
SELECT * FROM users WHERE users.id = ?
|
134
|
+
-- Before the 2nd repetition, superFastRails detects the 1+N pattern.
|
135
|
+
-- So it loads all relevant users in a single query.
|
136
|
+
SELECT * FROM users WHERE users.id IN (?)
|
137
|
+
-- No more queries
|
138
|
+
```
|
139
|
+
|
140
|
+
|
141
|
+
|
142
|
+
## Protect against dangerous migrations
|
143
|
+
|
144
|
+
There are already many gems that help to detect dangerous migrations.
|
145
|
+
They are great, but we still have to do the work manually.
|
146
|
+
For example, renaming a column must be achieved in many steps:
|
147
|
+
|
148
|
+
1. Create a new column
|
149
|
+
2. Backfill values
|
150
|
+
3. Synchronizing both columns
|
151
|
+
4. Switching the code to the new column
|
152
|
+
5. Ignoring the old column
|
153
|
+
6. Removing the old column
|
154
|
+
|
155
|
+
All this is tiring and wasting time.
|
156
|
+
Thanks to SuperFastRails, it can be achieved in a single step with only one line:
|
157
|
+
|
158
|
+
```ruby
|
159
|
+
SuperFastRails.rename_column :table, :old_name, :new_name
|
160
|
+
```
|
161
|
+
|
162
|
+
It takes care of creating the new columns, backfilling, and switching them.
|
163
|
+
|
164
|
+
|
165
|
+
## Tune database settings
|
166
|
+
|
167
|
+
A database must be tuned to efficiently use the hardware.
|
168
|
+
PostgreSQL should be told how much RAM it can use for the cache, the wall size, and the working memory.
|
169
|
+
It's the same for SQLite, where the journal mode, page size, and so on can be changed.
|
170
|
+
|
171
|
+
Currently, there is no other way to do that manually.
|
172
|
+
That's why we added a method that tunes perfectly the settings:
|
173
|
+
|
174
|
+
```ruby
|
175
|
+
SuperFastRails.tune_database!
|
176
|
+
```
|
177
|
+
|
178
|
+
It modifies the settings according to many parameters such as the database hardware, the ratio of reads and writes, the number of concurrent connections, etc.
|
179
|
+
|
180
|
+
|
181
|
+
## Install
|
182
|
+
|
183
|
+
Install the gem right today and speed up your app automatically:
|
184
|
+
|
185
|
+
```ruby
|
186
|
+
gem "super_fast_rails"
|
187
|
+
```
|
data/Rakefile
ADDED
data/bin/console
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
require "bundler/setup"
|
5
|
+
require "super_fast_rails"
|
6
|
+
|
7
|
+
# You can add fixtures and/or initialization code here to make experimenting
|
8
|
+
# with your gem easier. You can also use a different console, if you like.
|
9
|
+
|
10
|
+
# (If you use this, don't forget to add pry to your Gemfile!)
|
11
|
+
# require "pry"
|
12
|
+
# Pry.start
|
13
|
+
|
14
|
+
require "irb"
|
15
|
+
IRB.start(__FILE__)
|
data/bin/setup
ADDED
data/rorvswild_logo.jpg
ADDED
Binary file
|
@@ -0,0 +1,96 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative "lib/super_fast_rails/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |spec|
|
6
|
+
spec.name = "super_fast_rails"
|
7
|
+
spec.version = SuperFastRails::VERSION
|
8
|
+
spec.authors = ["Alexis Bernard"]
|
9
|
+
spec.email = ["alexis@basesecrete.com"]
|
10
|
+
|
11
|
+
spec.summary = "Optimise automatically Rails apps"
|
12
|
+
spec.description = "Create automatically missing index, remove unused, get rid of 1+N queries, ..."
|
13
|
+
spec.homepage = "https://www.rorvswild.com"
|
14
|
+
spec.license = "MIT"
|
15
|
+
spec.required_ruby_version = ">= 2.4.0"
|
16
|
+
|
17
|
+
|
18
|
+
spec.metadata["homepage_uri"] = spec.homepage
|
19
|
+
spec.metadata["source_code_uri"] = "https://github.com/BaseSecrete/super_fast_rails"
|
20
|
+
|
21
|
+
# Specify which files should be added to the gem when it is released.
|
22
|
+
# The `git ls-files -z` loads the files in the RubyGem that have been added into git.
|
23
|
+
spec.files = Dir.chdir(File.expand_path(__dir__)) do
|
24
|
+
`git ls-files -z`.split("\x0").reject { |f| f.match(%r{\A(?:test|spec|features)/}) }
|
25
|
+
end
|
26
|
+
spec.bindir = "exe"
|
27
|
+
spec.executables = spec.files.grep(%r{\Aexe/}) { |f| File.basename(f) }
|
28
|
+
spec.require_paths = ["lib"]
|
29
|
+
|
30
|
+
spec.post_install_message = "MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
|
31
|
+
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMWNNNXXXNNNWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
|
32
|
+
MMMMMMMMMMMMMMMMMMMMMMWWNNWWMMMMWNXK00OOOOOOO0KKXWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
|
33
|
+
MMMMMMMMMMMMMMMMMMWK0kkxxxxkO0KXK0OOOkkxddddddxkO0KNMMMMMMMMMMMMMMMMMMMMMMMMMMMM
|
34
|
+
MMMMMMMMMMMMMMMMWKkdddddooooooxOOkkxdol:::clllccoxO0XWMMMMMMMMMMMMMMMMMMMMMMMMMM
|
35
|
+
MMMMMMMMMMMMMMMW0dddollllllllloxxxdlc::oxOKXNXKOxllxOXWMMMMMMMMMMMMMMMMMMMMMMMMM
|
36
|
+
MMMMMMMMMMMMMMMXxddllc::;;;::cldxdc:;cOWMMMMMMMMWXkloOXWMMMMMMMMMMMMMMMMMMMMMMMM
|
37
|
+
MMMMMMMMMMMMMWWKxdoc:;,,,,,,,;cooc:;;kWMMMMMMMMMMMWXxxKNWMMMMMMMMMMMMMMMMMMMMMMM
|
38
|
+
MMMMMMMMWNXKKKKOxdl:,,'''.''',,cc;;;;kWMMMMMMMMMMMMMNKKXXXWMMMMMMMMMMMMMMMMMMMMM
|
39
|
+
MMMMMMNXK000OOOkddl;,''',,''''',;;;;;oXMMMMMMMMMMMMWXK0OKNWMMMMMMMMMMMMMMMMMMMMM
|
40
|
+
MMMMWX00OOxdolllloo:'.';;;;;,'.';:c;;;dKKXWMMMMMMMMMWWNKNWMMMMMMMMMMMMMWWWMMMMMM
|
41
|
+
MMMWK0Okdlc::::::coc,',;;;;;;'',,cxkdclxxOXWMMMMMMMMMMMMMMMMMMMMMWWWMNkddONMMMMM
|
42
|
+
MMWK0kdlccldddoc;;ll;',;;:ll:;cdlco0XOkkkkONMMMMMMMMMMMMMMMMMMMNOxdxXKoccxNMMMMM
|
43
|
+
MMN0kdccd0NWMMWXkc:lc,';;l0KOddxkkOKK000OOOXWMMMMMMMMMMMMMMMMMMXdccl0KoccxNMMMMM
|
44
|
+
MWXOxl:xNMMMMMMMMXd:l:,:clOXXX0kkxkNXKNXKKKXWWXXXNMNOxxk0OxxxOXWN00XWKoccxNMMMMM
|
45
|
+
MMXOd:lKMMMMMMMMMMNxokO0OxOKOxolccl0MMNxclloxdllloOKdccclcccccdXXKKKNKlccxNMMMMM
|
46
|
+
MMN0d:lKMMMMMMMMMMWX0KKKKK0occcccccxNMXd:cccoxdlcclkdcccokkoccoKxcclKKlccxNMMMMM
|
47
|
+
MMMXkcc0MMMMMMMMMMWNKKKOKNkcccllcccoKMXd:cclOWNxcclxdccl0MWkccoKxccl0KlccxNMMMMM
|
48
|
+
MMMWXd:xNMMMMMMMMMMMW0okNKocccx0dccckWNd:ccl0MWOcclxdccdXMWOlcdKxccl0KlccxNMMMMM
|
49
|
+
MMMMWXO0XNWMMMMMMMMMMN0XWkcccl0WOcccoKNd:ccl0MM0cclkdccdXMMNXXXXxccl0KlccxNMMMMM
|
50
|
+
MMMMWXKKKKNWMMMMMMMMMMMMXocccdXWKoccckXd:ccl0MM0lclkdccdXMMMMMMNxccl0KlccxNMMMMM
|
51
|
+
MMMMWXXKOXWMMMMMMMMMMMMWOccccldxdlccco0d:ccl0MMOcclkdccoXMMMMMMNxccl0KoccxNMMMMM
|
52
|
+
MMMMMMWWWWMMMMMMMMMMMMMXdccccllllccccldo:ccl0MWkcclkdccoKMMMMMMNxccl0KoccxNMMMMM
|
53
|
+
MMMMMMMMMMMMMMMMMMMMMMWOlccckKXXXOocccccccccxXKdccoOdcclKMMMMMMNxccl0KoccxNMMMMM
|
54
|
+
MMMMMMMMMMMMMMMMMMMMMMXxclcdXMMMMWkccccccccccllcccdKdccl0MMMMMMNxccl0KoccxNMMMMM
|
55
|
+
MMMMMMMMMMMMMMMMMMMMMMWXKKKXWMMMMMXxodolccclddlloxKNkoodKMMMMMMWOoodKXxookNMMMMM
|
56
|
+
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMWNNKd:ccoKWXXNWMMWN0xxx0WMMMMWNNWWWWWWWMMMMMM
|
57
|
+
MMMMMMMMMMMMMMMMMMMWNXXXXXXXXNWMMMMMMMXd:ccoKMMMMMMMMMOc::xXOxx0WMMMMMMMMMMMMMMM
|
58
|
+
MMMMMMMMMMMMMMMMMMMXdclllllllxNMMMMWWWNkloodXMMWWWMMMMOc::xXd::xNMMMWWWWMMMMMMMM
|
59
|
+
MMMMMMMMMMMMMMMMMMMXo:cccccc:dNWKkxdddkKXNNXKkxdddxKWWOc::xXd::xNWKkdoodkXWMMMMM
|
60
|
+
MMMMMMMMMMMMMMMMMMMXo:c:oO000XNOc:lddc:okXWOl:cddl:l0WOc::xXd::xNOc:cc:::l0WMMMM
|
61
|
+
MMMMMMMMMMMMMMMMMMMXo:c:dNMMMMXo:ckWNx:ccONd::dNWkc:xNOcc:xXd:cx0o:clddlc:lKMMMM
|
62
|
+
MMMMMMMMMMMMMMMMMMMXo:c:dNMMMMKl:c0MWkc::xKd::xNMOc:dXOcc:xNX0KXOc:ckWWkc:ckWMMM
|
63
|
+
MMMMMMMMMMMMMMMMMMMXo:c:lxxkXMKo:c0MWkc::xKd::xNMOc:dXOcc:xNMMMWkc:cOMWOccckWMMM
|
64
|
+
MMMMMMMMMMMMMMMMMMMXo:cccc:l0MXo:c0MWkc::xXd::xNMOc:dXOc::xNMMMWOc:cxNW0dddKMMMM
|
65
|
+
MMMMMMMMMMMMMMMMMMMXo:c:o0KKNMXo:c0MWkc::xKd::xNMOc:oXOc::xNMMMMKo:ccoOKNWWMMMMM
|
66
|
+
MMMMMMMMMMMMMMMMMMMXo:c:dNMMMMKo:l0MWOc::xKd:ckWM0c:oXOcc:xNMMMMWXkdoc:cd0WMMMMM
|
67
|
+
MMMMMMMMMMMMMMMMMMMXo:c:dNMMMMKo:cOMWkc::xKo:cxNWOc:oXOcc:xNMMMMNOOO0Kxc:cOWMMMM
|
68
|
+
MMMMMMMMMMMMMMMMMMMXo:c:dNMMMMKo:cokxl:::xKd:clxxlc:oXOc::xNMMMM0l:cxKOl::dNMMMM
|
69
|
+
MMMMMMMMMMMMMMMMMMMXo:c:dNMMMMNkc::c:::ld0WOc:c::c:cOWOcc:xNMMMMXd:cclcc:cOWMMMM
|
70
|
+
MMMMMMMMMMMMMMMMMMMXdclcxNMMMMMN0xdddxkXWWMWKkddddkKWM0oolkWMMMMWXxlcccld0WMMMMM
|
71
|
+
MMMMMMMMMMMMMMMMMMMWNXXXNWW0xxxxddoodkXWMMMMMMWWWWMMMMWNNNWMMMMMMMWXK0KXWMMMMMMM
|
72
|
+
MMMMMMMMMMMMMMMMMMMMMMMMMMNo,;;;;;;;;;lKMMMMWNXKKXWMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
|
73
|
+
MMMMMMMMMMMMMMMMMMMMMMMMMMXo;;;:ooc;;;;kWWWKdl:::clkNMMWXKKNMMMXkxxONMMMMMMMMMMM
|
74
|
+
MMMMMMMMMMMMMMMMMMMMMMMMMMXo;;;oNWKl;;;xXN0c;;;;;;;;dNMXo::xWMWk;;;xWMMMMMMMMMMM
|
75
|
+
MMMMMMMMMMMMMMMMMMMMMMMMMMXl;;;dNMNo;;;xNXo;;;col:;;:OMWk:;lXMXo;;c0MMMMMMMMMMMM
|
76
|
+
MMMMMMMMMMMMMMMMMMMMMMMMMMXl;;;dWMNd;;;kW0c;;c0WNx;;;dNM0c;:OW0c;;oXMMMMMMMMMMMM
|
77
|
+
MMMMMMMMMMMMMMMMMMMMMMMMMMXl;;;xWMWd;;;kW0c;;lKMM0c;;dNMNd;;oXx;;;kWMMMMMMMMMMMM
|
78
|
+
MMMMMMMMMMMMMMMMMMMMMMMMMMXl;;;dNMWd;;;kM0c;;cKMM0:;;oNMMO:,cdl;;cKMMMMMMMMMMMMM
|
79
|
+
MMMMMMMMMMMMMMMMMMMMMMMMMMXo;;;dNMNd;;;kW0l::lKWKo;;;dNMMXo;;:;;;dNMMMMMMMMMMMMM
|
80
|
+
MMMMMMMMMMMMMMMMMMMMMMMMMMXo;;;dNMNd;;;xNNX0Oxdo:;;;;dNMMWO:;;;;:OMMMMMMMMMMMMMM
|
81
|
+
MMMMMMMMMMMMMMMMMMMMMMMMMMXo;;;dNMXo;;;xWN0ocokOxc;;;xWMMMXl;;;;lKMMMMMMMMMMMMMM
|
82
|
+
MMMMMMMMMMMMMMMMMMMMMMMMMMXo;;;lOOd:;;:kWO:,:OMMWk;;;kWMMMWk:;;;xNMMMMMMMMMMMMMM
|
83
|
+
MMMMMMMMMMMMMMMMMMMMMMMMMMXo;;;;;;;;;;lKWO:;;cxOxl:;;kWMMMMNkc,c0MMMMMMMMMMMMMMM
|
84
|
+
MMMMMMMMMMMMMMMMMMMMMMMMMMNkoddooooddx0WMNkl:;;co0Oc;kWNNNNXx:;oNMMMMMMMMMMMMMMM
|
85
|
+
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMNKKKXWMWX0XKocclc;;:OMMMMMMMMMMMMMMMM
|
86
|
+
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM0c,;;;;;oXMMMMMMMMMMMMMMMM
|
87
|
+
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMNOkkkkkOXWMMMMMMMMMMMMMMMM
|
88
|
+
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
|
89
|
+
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM"
|
90
|
+
|
91
|
+
# Uncomment to register a new dependency of your gem
|
92
|
+
# spec.add_dependency "example-gem", "~> 1.0"
|
93
|
+
|
94
|
+
# For more information and examples about making a new gem, checkout our
|
95
|
+
# guide at: https://bundler.io/guides/creating_gem.html
|
96
|
+
end
|
metadata
ADDED
@@ -0,0 +1,117 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: super_fast_rails
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Alexis Bernard
|
8
|
+
autorequire:
|
9
|
+
bindir: exe
|
10
|
+
cert_chain: []
|
11
|
+
date: 2024-04-01 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
13
|
+
description: Create automatically missing index, remove unused, get rid of 1+N queries,
|
14
|
+
...
|
15
|
+
email:
|
16
|
+
- alexis@basesecrete.com
|
17
|
+
executables: []
|
18
|
+
extensions: []
|
19
|
+
extra_rdoc_files: []
|
20
|
+
files:
|
21
|
+
- ".gitignore"
|
22
|
+
- Gemfile
|
23
|
+
- LICENSE.txt
|
24
|
+
- README.md
|
25
|
+
- Rakefile
|
26
|
+
- bin/console
|
27
|
+
- bin/setup
|
28
|
+
- lib/super_fast_rails.rb
|
29
|
+
- lib/super_fast_rails/version.rb
|
30
|
+
- rorvswild_logo.jpg
|
31
|
+
- super_fast_rails.gemspec
|
32
|
+
homepage: https://www.rorvswild.com
|
33
|
+
licenses:
|
34
|
+
- MIT
|
35
|
+
metadata:
|
36
|
+
homepage_uri: https://www.rorvswild.com
|
37
|
+
source_code_uri: https://github.com/BaseSecrete/super_fast_rails
|
38
|
+
post_install_message: |-
|
39
|
+
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
|
40
|
+
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMWNNNXXXNNNWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
|
41
|
+
MMMMMMMMMMMMMMMMMMMMMMWWNNWWMMMMWNXK00OOOOOOO0KKXWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
|
42
|
+
MMMMMMMMMMMMMMMMMMWK0kkxxxxkO0KXK0OOOkkxddddddxkO0KNMMMMMMMMMMMMMMMMMMMMMMMMMMMM
|
43
|
+
MMMMMMMMMMMMMMMMWKkdddddooooooxOOkkxdol:::clllccoxO0XWMMMMMMMMMMMMMMMMMMMMMMMMMM
|
44
|
+
MMMMMMMMMMMMMMMW0dddollllllllloxxxdlc::oxOKXNXKOxllxOXWMMMMMMMMMMMMMMMMMMMMMMMMM
|
45
|
+
MMMMMMMMMMMMMMMXxddllc::;;;::cldxdc:;cOWMMMMMMMMWXkloOXWMMMMMMMMMMMMMMMMMMMMMMMM
|
46
|
+
MMMMMMMMMMMMMWWKxdoc:;,,,,,,,;cooc:;;kWMMMMMMMMMMMWXxxKNWMMMMMMMMMMMMMMMMMMMMMMM
|
47
|
+
MMMMMMMMWNXKKKKOxdl:,,'''.''',,cc;;;;kWMMMMMMMMMMMMMNKKXXXWMMMMMMMMMMMMMMMMMMMMM
|
48
|
+
MMMMMMNXK000OOOkddl;,''',,''''',;;;;;oXMMMMMMMMMMMMWXK0OKNWMMMMMMMMMMMMMMMMMMMMM
|
49
|
+
MMMMWX00OOxdolllloo:'.';;;;;,'.';:c;;;dKKXWMMMMMMMMMWWNKNWMMMMMMMMMMMMMWWWMMMMMM
|
50
|
+
MMMWK0Okdlc::::::coc,',;;;;;;'',,cxkdclxxOXWMMMMMMMMMMMMMMMMMMMMMWWWMNkddONMMMMM
|
51
|
+
MMWK0kdlccldddoc;;ll;',;;:ll:;cdlco0XOkkkkONMMMMMMMMMMMMMMMMMMMNOxdxXKoccxNMMMMM
|
52
|
+
MMN0kdccd0NWMMWXkc:lc,';;l0KOddxkkOKK000OOOXWMMMMMMMMMMMMMMMMMMXdccl0KoccxNMMMMM
|
53
|
+
MWXOxl:xNMMMMMMMMXd:l:,:clOXXX0kkxkNXKNXKKKXWWXXXNMNOxxk0OxxxOXWN00XWKoccxNMMMMM
|
54
|
+
MMXOd:lKMMMMMMMMMMNxokO0OxOKOxolccl0MMNxclloxdllloOKdccclcccccdXXKKKNKlccxNMMMMM
|
55
|
+
MMN0d:lKMMMMMMMMMMWX0KKKKK0occcccccxNMXd:cccoxdlcclkdcccokkoccoKxcclKKlccxNMMMMM
|
56
|
+
MMMXkcc0MMMMMMMMMMWNKKKOKNkcccllcccoKMXd:cclOWNxcclxdccl0MWkccoKxccl0KlccxNMMMMM
|
57
|
+
MMMWXd:xNMMMMMMMMMMMW0okNKocccx0dccckWNd:ccl0MWOcclxdccdXMWOlcdKxccl0KlccxNMMMMM
|
58
|
+
MMMMWXO0XNWMMMMMMMMMMN0XWkcccl0WOcccoKNd:ccl0MM0cclkdccdXMMNXXXXxccl0KlccxNMMMMM
|
59
|
+
MMMMWXKKKKNWMMMMMMMMMMMMXocccdXWKoccckXd:ccl0MM0lclkdccdXMMMMMMNxccl0KlccxNMMMMM
|
60
|
+
MMMMWXXKOXWMMMMMMMMMMMMWOccccldxdlccco0d:ccl0MMOcclkdccoXMMMMMMNxccl0KoccxNMMMMM
|
61
|
+
MMMMMMWWWWMMMMMMMMMMMMMXdccccllllccccldo:ccl0MWkcclkdccoKMMMMMMNxccl0KoccxNMMMMM
|
62
|
+
MMMMMMMMMMMMMMMMMMMMMMWOlccckKXXXOocccccccccxXKdccoOdcclKMMMMMMNxccl0KoccxNMMMMM
|
63
|
+
MMMMMMMMMMMMMMMMMMMMMMXxclcdXMMMMWkccccccccccllcccdKdccl0MMMMMMNxccl0KoccxNMMMMM
|
64
|
+
MMMMMMMMMMMMMMMMMMMMMMWXKKKXWMMMMMXxodolccclddlloxKNkoodKMMMMMMWOoodKXxookNMMMMM
|
65
|
+
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMWNNKd:ccoKWXXNWMMWN0xxx0WMMMMWNNWWWWWWWMMMMMM
|
66
|
+
MMMMMMMMMMMMMMMMMMMWNXXXXXXXXNWMMMMMMMXd:ccoKMMMMMMMMMOc::xXOxx0WMMMMMMMMMMMMMMM
|
67
|
+
MMMMMMMMMMMMMMMMMMMXdclllllllxNMMMMWWWNkloodXMMWWWMMMMOc::xXd::xNMMMWWWWMMMMMMMM
|
68
|
+
MMMMMMMMMMMMMMMMMMMXo:cccccc:dNWKkxdddkKXNNXKkxdddxKWWOc::xXd::xNWKkdoodkXWMMMMM
|
69
|
+
MMMMMMMMMMMMMMMMMMMXo:c:oO000XNOc:lddc:okXWOl:cddl:l0WOc::xXd::xNOc:cc:::l0WMMMM
|
70
|
+
MMMMMMMMMMMMMMMMMMMXo:c:dNMMMMXo:ckWNx:ccONd::dNWkc:xNOcc:xXd:cx0o:clddlc:lKMMMM
|
71
|
+
MMMMMMMMMMMMMMMMMMMXo:c:dNMMMMKl:c0MWkc::xKd::xNMOc:dXOcc:xNX0KXOc:ckWWkc:ckWMMM
|
72
|
+
MMMMMMMMMMMMMMMMMMMXo:c:lxxkXMKo:c0MWkc::xKd::xNMOc:dXOcc:xNMMMWkc:cOMWOccckWMMM
|
73
|
+
MMMMMMMMMMMMMMMMMMMXo:cccc:l0MXo:c0MWkc::xXd::xNMOc:dXOc::xNMMMWOc:cxNW0dddKMMMM
|
74
|
+
MMMMMMMMMMMMMMMMMMMXo:c:o0KKNMXo:c0MWkc::xKd::xNMOc:oXOc::xNMMMMKo:ccoOKNWWMMMMM
|
75
|
+
MMMMMMMMMMMMMMMMMMMXo:c:dNMMMMKo:l0MWOc::xKd:ckWM0c:oXOcc:xNMMMMWXkdoc:cd0WMMMMM
|
76
|
+
MMMMMMMMMMMMMMMMMMMXo:c:dNMMMMKo:cOMWkc::xKo:cxNWOc:oXOcc:xNMMMMNOOO0Kxc:cOWMMMM
|
77
|
+
MMMMMMMMMMMMMMMMMMMXo:c:dNMMMMKo:cokxl:::xKd:clxxlc:oXOc::xNMMMM0l:cxKOl::dNMMMM
|
78
|
+
MMMMMMMMMMMMMMMMMMMXo:c:dNMMMMNkc::c:::ld0WOc:c::c:cOWOcc:xNMMMMXd:cclcc:cOWMMMM
|
79
|
+
MMMMMMMMMMMMMMMMMMMXdclcxNMMMMMN0xdddxkXWWMWKkddddkKWM0oolkWMMMMWXxlcccld0WMMMMM
|
80
|
+
MMMMMMMMMMMMMMMMMMMWNXXXNWW0xxxxddoodkXWMMMMMMWWWWMMMMWNNNWMMMMMMMWXK0KXWMMMMMMM
|
81
|
+
MMMMMMMMMMMMMMMMMMMMMMMMMMNo,;;;;;;;;;lKMMMMWNXKKXWMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
|
82
|
+
MMMMMMMMMMMMMMMMMMMMMMMMMMXo;;;:ooc;;;;kWWWKdl:::clkNMMWXKKNMMMXkxxONMMMMMMMMMMM
|
83
|
+
MMMMMMMMMMMMMMMMMMMMMMMMMMXo;;;oNWKl;;;xXN0c;;;;;;;;dNMXo::xWMWk;;;xWMMMMMMMMMMM
|
84
|
+
MMMMMMMMMMMMMMMMMMMMMMMMMMXl;;;dNMNo;;;xNXo;;;col:;;:OMWk:;lXMXo;;c0MMMMMMMMMMMM
|
85
|
+
MMMMMMMMMMMMMMMMMMMMMMMMMMXl;;;dWMNd;;;kW0c;;c0WNx;;;dNM0c;:OW0c;;oXMMMMMMMMMMMM
|
86
|
+
MMMMMMMMMMMMMMMMMMMMMMMMMMXl;;;xWMWd;;;kW0c;;lKMM0c;;dNMNd;;oXx;;;kWMMMMMMMMMMMM
|
87
|
+
MMMMMMMMMMMMMMMMMMMMMMMMMMXl;;;dNMWd;;;kM0c;;cKMM0:;;oNMMO:,cdl;;cKMMMMMMMMMMMMM
|
88
|
+
MMMMMMMMMMMMMMMMMMMMMMMMMMXo;;;dNMNd;;;kW0l::lKWKo;;;dNMMXo;;:;;;dNMMMMMMMMMMMMM
|
89
|
+
MMMMMMMMMMMMMMMMMMMMMMMMMMXo;;;dNMNd;;;xNNX0Oxdo:;;;;dNMMWO:;;;;:OMMMMMMMMMMMMMM
|
90
|
+
MMMMMMMMMMMMMMMMMMMMMMMMMMXo;;;dNMXo;;;xWN0ocokOxc;;;xWMMMXl;;;;lKMMMMMMMMMMMMMM
|
91
|
+
MMMMMMMMMMMMMMMMMMMMMMMMMMXo;;;lOOd:;;:kWO:,:OMMWk;;;kWMMMWk:;;;xNMMMMMMMMMMMMMM
|
92
|
+
MMMMMMMMMMMMMMMMMMMMMMMMMMXo;;;;;;;;;;lKWO:;;cxOxl:;;kWMMMMNkc,c0MMMMMMMMMMMMMMM
|
93
|
+
MMMMMMMMMMMMMMMMMMMMMMMMMMNkoddooooddx0WMNkl:;;co0Oc;kWNNNNXx:;oNMMMMMMMMMMMMMMM
|
94
|
+
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMNKKKXWMWX0XKocclc;;:OMMMMMMMMMMMMMMMM
|
95
|
+
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM0c,;;;;;oXMMMMMMMMMMMMMMMM
|
96
|
+
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMNOkkkkkOXWMMMMMMMMMMMMMMMM
|
97
|
+
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
|
98
|
+
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
|
99
|
+
rdoc_options: []
|
100
|
+
require_paths:
|
101
|
+
- lib
|
102
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
103
|
+
requirements:
|
104
|
+
- - ">="
|
105
|
+
- !ruby/object:Gem::Version
|
106
|
+
version: 2.4.0
|
107
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
108
|
+
requirements:
|
109
|
+
- - ">="
|
110
|
+
- !ruby/object:Gem::Version
|
111
|
+
version: '0'
|
112
|
+
requirements: []
|
113
|
+
rubygems_version: 3.2.22
|
114
|
+
signing_key:
|
115
|
+
specification_version: 4
|
116
|
+
summary: Optimise automatically Rails apps
|
117
|
+
test_files: []
|