summaryrefslogtreecommitdiff
path: root/lib/gemfile_tools.rb
diff options
context:
space:
mode:
authorazul <azul@leap.se>2014-06-18 22:09:11 +0200
committerazul <azul@leap.se>2014-06-18 22:09:11 +0200
commit110bc16297d7736f1025bfa85f3551313e913d84 (patch)
tree588b0852cbafdaaa3dcc1c4284b30139e0480f08 /lib/gemfile_tools.rb
parent3051a51a4b7d51994e7cd8d90f0cdf5f237a0a4d (diff)
parent240fd8f1efe9e76540787a17a13dcaf345c7933e (diff)
Merge pull request #172 from elijh/feature/customgem
Add support for custom gems via a dynamic Gemfile
Diffstat (limited to 'lib/gemfile_tools.rb')
-rw-r--r--lib/gemfile_tools.rb85
1 files changed, 85 insertions, 0 deletions
diff --git a/lib/gemfile_tools.rb b/lib/gemfile_tools.rb
new file mode 100644
index 0000000..50798cb
--- /dev/null
+++ b/lib/gemfile_tools.rb
@@ -0,0 +1,85 @@
+#
+# Utilities for use in Gemfile, in order to support
+# enabling and disabling gems, and including custom gems
+# in the deployment.
+#
+# Dynamic code in Gemfile is incompatible with
+# `bundle install --deployment` because dynamic code might
+# produce new Gemfile.lock. For this reason, this app must
+# be deployed with `bundle install --path vendor/bundle` instead.
+#
+
+require 'yaml'
+
+#
+# custom gems are gems placed in config/customization/gems.
+# this are added at deploy time by the platform.
+# The Gemfile.lock is then rebuilt to take these into account.
+#
+def custom_gems
+ custom_gem_dir = File.expand_path('../../config/customization/gems', __FILE__)
+ Dir["#{custom_gem_dir}/*"].collect{|gem_dir|
+ resolve_gem_directory(gem_dir)
+ }.compact
+end
+
+#
+# returns an array of [engine_name, engine_path] from Rails.root/engines/* that are
+# enabled. Uses the 'engines' key from config.yml to determine if engine is enabled
+#
+def enabled_engines(environment)
+ if local_config[environment]
+ if local_config[environment][:engines]
+ local_config[environment][:engines].collect {|engine_dir|
+ full_dir_path = File.join(File.expand_path("../../engines", __FILE__), engine_dir)
+ resolve_gem_directory(full_dir_path)
+ }.compact
+ else
+ []
+ end
+ else
+ []
+ end
+end
+
+#
+# local_config can be accessed as an indifferent hash of
+# the merger of config/default.yml and config/config.yml
+#
+def local_config
+ @local_config ||= begin
+ # a quick and dirty indifferent hash (note: does not affect children):
+ empty_hash = {}
+ empty_hash.default_proc = proc{|h, k| h.key?(k.to_s) ? h[k.to_s] : nil}
+ ["defaults.yml", "config.yml"].inject(empty_hash.dup) {|config, file|
+ filepath = File.join(File.expand_path("../../config", __FILE__), file)
+ if File.exists?(filepath)
+ new_config = YAML.load_file(filepath)
+ ['development', 'test','production'].each do |env|
+ config[env] ||= empty_hash.dup
+ if new_config[env]
+ config[env].merge!(new_config[env])
+ end
+ end
+ end
+ config
+ }
+ end
+end
+
+#
+# return [gem_name, relative_gem_path] for gem at the specific directory
+# or nil if not actually a gem directory
+#
+def resolve_gem_directory(gem_dir)
+ if Dir.exists?(gem_dir)
+ gemspec = Dir["#{gem_dir}/*.gemspec"]
+ if gemspec.any?
+ gem_name = File.basename(gemspec.first).sub(/\.gemspec$/,'')
+ [gem_name, gem_dir]
+ end
+ else
+ puts "Warning: no gem at `#{gem_dir}`"
+ nil
+ end
+end