super_fast_rails 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
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
@@ -0,0 +1,10 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /_yardoc/
4
+ /coverage/
5
+ /doc/
6
+ /pkg/
7
+ /spec/reports/
8
+ /tmp/
9
+
10
+ *.gem
data/Gemfile ADDED
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ source "https://rubygems.org"
4
+
5
+ # Specify your gem's dependencies in super_fast_rails.gemspec
6
+ gemspec
7
+
8
+ gem "rake", "~> 13.0"
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
@@ -0,0 +1,4 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "bundler/gem_tasks"
4
+ task default: %i[]
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
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SuperFastRails
4
+ VERSION = "0.1.0"
5
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "super_fast_rails/version"
4
+
5
+ module SuperFastRails
6
+ class Error < StandardError; end
7
+ def self.create_missing_indexes=(value)
8
+ end
9
+ end
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: []