Skip to content

Instantly share code, notes, and snippets.

@flash-gordon
Created May 18, 2016 09:41
Show Gist options
  • Save flash-gordon/7e066a34056131ddd0f52830bebdf4c0 to your computer and use it in GitHub Desktop.
Save flash-gordon/7e066a34056131ddd0f52830bebdf4c0 to your computer and use it in GitHub Desktop.
module Imprint
class Container
extend Dry::Container::Mixin
class << self
attr_reader :root
def register_dir(dir, eager: false, instantiate: true)
Dir["#{root}/#{dir}/**/*.rb"].map do |path|
name = path.sub("#{root}/", '').sub('.rb', '')
constant_name = Inflecto.camelize('imprint/' + name)
name.gsub('/', '.').tap do |key|
loader = -> do
require path.sub('.rb', '')
klass = Inflecto.constantize(constant_name)
if block_given?
yield(klass)
elsif instantiate
klass.new
else
klass
end
end
if eager
register(key, loader.call)
else
register(key, loader)
end
end
end
end
end
@root = Pathname(__FILE__).realpath.dirname
container = self
register(:logger) { Logger.new('/dev/null') }
register(:rom) do
config = ROM::Configuration.new(default: [:sql, ENV['IMPRINT_DATABASE_URL']])
config.auto_registration(container.root)
ROM.container(config).tap do |rom|
rom.gateways[:default].connection.loggers << container['logger']
end
end
register_dir(:models, instantiate: false)
register_dir(:repositories) do |repo|
repo.new(container[:rom])
end
register_dir(:utils)
register_dir(:builders)
register_dir(:services)
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment