cartodb-4.42/lib/carto/carto_gears_support.rb
2024-04-06 05:25:13 +00:00

58 lines
1.7 KiB
Ruby

# Support to dynamic CartoGears loading
# Inspired by BootInquirer at https://github.com/taskrabbit/rails_engines_example/blob/17b5ee5286c2186951312cbe440b8d21738596eb/lib/boot_inquirer.rb
module Carto
class CartoGearsSupport
# Returns gears found at:
# - `/gears`. Should be "installed" (added to `Gemfile.lock``)
# - `/private_gears` (shouldn't be installed)
# Returns install gears first.
def gears
(public_gears + private_gears).sort { |a, _| a.installable ? -1 : 1 }
end
private
def public_gears
Dir['gears/*/*.gemspec'].map { |gemspec_file| gear_from_gemspec_file(gemspec_file, true) }
end
def private_gears
Dir['private_gears/*/*.gemspec'].map { |gemspec_file| gear_from_gemspec_file(gemspec_file, false) }
end
def gear_from_gemspec_file(gemspec_file, install)
Carto::Gear.new(File.basename(gemspec_file, File.extname(gemspec_file)), File.dirname(gemspec_file), install)
end
end
class Gear
def initialize(gem_name, path, installable)
@name = gem_name.dup.freeze
@path = path.dup.freeze
@installable = installable
end
# path should only be used from CARTO Gemfile, because Rails is not yet available and relative path is good enough.
# If you need access to the gear path, use full_path instead.
attr_reader :name, :path, :installable
def engine
module_name = @name.classify
module_name << 's' if @name[-1] == 's'
"#{module_name}::Engine".constantize
end
def gemspec
pwd = Dir.pwd
Dir.chdir(path)
Gem::Specification::load("#{name}.gemspec")
ensure
Dir.chdir(pwd)
end
def full_path
Rails.root.join(path)
end
end
end