Class: Jets::Booter
- Inherits:
-
Object
- Object
- Jets::Booter
- Defined in:
- lib/jets/booter.rb
Class Method Summary collapse
-
.app_initializers ⇒ Object
All Turbines.
- .boot! ⇒ Object
-
.build_middleware_stack ⇒ Object
Builds and memoize stack so it only gets built on bootup.
- .check_config_ru! ⇒ Object
-
.confirm_jets_project! ⇒ Object
Cannot call this for the jets new.
-
.connect_db ⇒ Object
Eager connect to database, so connections are established in the Lambda Execution Context and get reused.
- .eager_load ⇒ Object
-
.internal_finisher ⇒ Object
Runs right before eager_load.
- .load_internal_turbines ⇒ Object
-
.load_shared_extensions ⇒ Object
Shared extensions are added near the end because they require the Jets app load paths to first.
- .message ⇒ Object
- .preload_extensions ⇒ Object
-
.run_turbines(name) ⇒ Object
run_turbines(:initializers) run_turbines(:after_initializers).
-
.setup_db ⇒ Object
Using ActiveRecord outside of Rails, so we need to set up the db connection ourself.
-
.turbine_initializers ⇒ Object
All Turbines.
Class Method Details
.app_initializers ⇒ Object
All Turbines
122 123 124 125 126 |
# File 'lib/jets/booter.rb', line 122 def app_initializers Dir.glob("#{Jets.root}/config/initializers/**/*").sort.each do |path| load path end end |
.boot! ⇒ Object
6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
# File 'lib/jets/booter.rb', line 6 def boot! return if @booted confirm_jets_project! Jets::Bundle.require Jets.application.setup! # Turbines are loaded after setup_autoload_paths in Jets.application.setup! Some Turbine options are defined # in the project so setup must happen before internal Turbines are loaded. load_internal_turbines run_turbines(:initializers) # Load configs after Turbine initializers so Turbines can defined some config options and they are available in # user's project environment configs. Jets.application.configs! app_initializers run_turbines(:after_initializers) Jets.application.finish! setup_db # establish db connections in Lambda Execution Context. # The eager load calls connects_to in models and establish those connections in Lambda Execution Context also. internal_finisher eager_load # TODO: Figure out how to build middleware during Jets.boot without breaking jets new and webpacker:install # build_middleware_stack @booted = true end |
.build_middleware_stack ⇒ Object
Builds and memoize stack so it only gets built on bootup
140 141 142 |
# File 'lib/jets/booter.rb', line 140 def build_middleware_stack Jets.application.build_stack end |
.check_config_ru! ⇒ Object
156 157 158 159 160 161 162 163 164 165 |
# File 'lib/jets/booter.rb', line 156 def check_config_ru! config_ru = File.read("#{Jets.root}/config.ru") unless config_ru.include?("Jets.boot") puts 'The config.ru file is missing Jets.boot. Please add Jets.boot after require "jets"'.color(:red) puts "This was changed as made in Jets v1.1.0." puts "To have Jets update the config.fu file for you, you can run:\n\n" puts " jets upgrade" exit 1 end end |
.confirm_jets_project! ⇒ Object
Cannot call this for the jets new
145 146 147 148 149 150 |
# File 'lib/jets/booter.rb', line 145 def confirm_jets_project! unless File.exist?("#{Jets.root}/config/application.rb") puts "It does not look like you are running this command within a jets project. Please confirm that you are in a jets project and try again.".color(:red) exit 1 end end |
.connect_db ⇒ Object
Eager connect to database, so connections are established in the Lambda Execution Context and get reused. Interestingly, the connections info is stored in the shared state but the connection doesnt show up on ‘show processlist` until after a query. Have confirmed that the connection is reused and the connection count stays the same.
97 98 99 100 101 102 103 |
# File 'lib/jets/booter.rb', line 97 def connect_db primary_hash_config = ActiveRecord::Base.configurations.configs_for(env_name: Jets.env).find { |hash_config| hash_config.name == "primary" } primary_config = primary_hash_config.configuration_hash # configuration_hash is a normal Ruby Hash ActiveRecord::Base.establish_connection(primary_config) end |
.eager_load ⇒ Object
57 58 59 60 |
# File 'lib/jets/booter.rb', line 57 def eager_load preload_extensions Jets::Autoloaders.main.eager_load # Eager load project code. Rather have user find out early than later on AWS Lambda. end |
.internal_finisher ⇒ Object
Runs right before eager_load
38 39 40 |
# File 'lib/jets/booter.rb', line 38 def internal_finisher load_shared_extensions end |
.load_internal_turbines ⇒ Object
105 106 107 108 109 |
# File 'lib/jets/booter.rb', line 105 def load_internal_turbines Dir.glob("#{__dir__}/internal/turbines/**/*.rb").each do |path| Jets::Autoloaders.once.preload(path) end end |
.load_shared_extensions ⇒ Object
Shared extensions are added near the end because they require the Jets app load paths to first. We eager load the extensions and then use the loaded modules to extend Jets::Stack directly. Originally used an included hook but thats too early before app/shared/extensions is in the load_path.
45 46 47 48 49 50 51 52 53 54 55 |
# File 'lib/jets/booter.rb', line 45 def load_shared_extensions Jets::Autoloaders.once.preload("#{Jets.root}/app/shared/extensions") base_path = "#{Jets.root}/app/shared/extensions" Dir.glob("#{base_path}/**/*.rb").each do |path| next unless File.file?(path) class_name = path.sub("#{base_path}/", '').sub(/\.rb/,'').camelize mod = class_name.constantize # autoload Jets::Stack.extend(mod) end end |
.message ⇒ Object
152 153 154 |
# File 'lib/jets/booter.rb', line 152 def "Jets booting up in #{Jets.env.color(:green)} mode!" end |
.preload_extensions ⇒ Object
62 63 64 65 66 67 68 69 70 71 |
# File 'lib/jets/booter.rb', line 62 def preload_extensions base_path = "#{Jets.root}/app/extensions" Dir.glob("#{base_path}/**/*.rb").each do |path| next unless File.file?(path) class_name = path.sub("#{base_path}/", '').sub(/\.rb/,'').camelize klass = class_name.constantize # autoload Jets::Lambda::Functions.extend(klass) end end |
.run_turbines(name) ⇒ Object
run_turbines(:initializers) run_turbines(:after_initializers)
130 131 132 133 134 135 136 137 |
# File 'lib/jets/booter.rb', line 130 def run_turbines(name) Jets::Turbine.subclasses.each do |subclass| hooks = subclass.send(name) || [] hooks.each do |label, block| block.call(Jets.application) end end end |
.setup_db ⇒ Object
Using ActiveRecord outside of Rails, so we need to set up the db connection ourself.
Only connects to database for ActiveRecord and when config/database.yml exists. Dynomite handles connecting to the clients lazily.
77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 |
# File 'lib/jets/booter.rb', line 77 def setup_db return unless File.exist?("#{Jets.root}/config/database.yml") db_configs = Jets.application.config.database # DatabaseTasks.database_configuration for db:create db:migrate tasks # Documented in DatabaseTasks that this is the right way to set it when # using ActiveRecord rake tasks outside of Rails. ActiveRecord::Tasks::DatabaseTasks.database_configuration = db_configs if db_configs.configs_for(env_name: Jets.env).blank? abort("ERROR: config/database.yml exists but no environment section configured for #{Jets.env}") end ActiveRecord::Base.configurations = db_configs connect_db end |
.turbine_initializers ⇒ Object
All Turbines
112 113 114 115 116 117 118 119 |
# File 'lib/jets/booter.rb', line 112 def turbine_initializers Jets::Turbine.subclasses.each do |subclass| initializers = subclass.initializers || [] initializers.each do |label, block| block.call(Jets.application) end end end |