0.01
No commit activity in last 3 years
No release in over 3 years
sweet autoloading using file structure conventions while allowing configuration overrides for special cases
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
 Dependencies

Development

>= 1.1.rc
>= 1.6.4
>= 0
>= 2.5.0

Runtime

>= 0
 Project Readme

Sweetloader

A 'sweet' autoloader designed to autoload your modules and classes more easily, by taking advantage of a standard directory structure approach for the placement of your classes and modules. You can also configure Sweetloader to override the defaults in various ways... and even have it use require instead of autoload :)

Install

Insert in your Gemfile:

gem 'sweetloader'

Run bundler to install

$bundle$

Usage

Simply use the autoload_modules macro in your Module and Class definitions.

CanTango
  autoload_module :Configuration, :Factory, :Permit
end

Each of these modules are then expected to be in @catango/configuration.rb@ and similar relative to a load path.

SweetLoader Configuration

The following global config vars are available in SweetLoader:

  • root
  • namespaces
  • mode

Note: AutoLoader is available as a deprecated alias for SweetLoader (versions < 1.5)

Root

Set a specific root which the dir will be calculated relative to, using root.

SweetLoader.root = 'fixtures'

Now the constant ::CanTango will be resolved as 'fixtures/can_tango'

Namespaces

Normally the constant CanTango will be translated to the dir 'can_tango', here we override this so it will instead be translated to 'cantango'.

SweetLoader.namespaces= {:CanTango => 'cantango', :Permithelper => 'permit_helper'}

Modes

SweetLoader supports the following modes: :autoload, :require

The mode :require is used to execute require statements directly. The :autoload mode is used to do autoloading. Note that autoloading is not stable in multi-threaded environments and will likely be deprecated in later version of Ruby. However autoloading does perform lazy loading and can be advantageous when you want to speed up initial load time and don't run in a multi-threaded environment.

autoload_modules Configuration

You can also specify the SweetLoader options directly as an option hash on the #autoload_modules call:

  sweetload :Configuration, :mode => :require
  sweetload :Configuration, :Factory, :root => 'helpers'
  sweetload :Configuration, :Factory, :Permit, :ns => {:CanTango => 'cantango'} # or use :namespaces

Note: #autoload_modules is deprecated in place of #sweetload

Mutate path option

This option is only available for autoload_modules. It can be used to execute more general substitution logic on the generated file path:

  sweetload :Configuration, :Factory, :Permit, :mutate_path => Proc.new {|path| path.sub(/(ies)/, 'y') }

Scopes

A Scope allows options to be specified that are effective on all autoload_modules statements within the scope.

module AutoloadModules
  module Configuration
	# the scope options only have effect for autoload_modules statements within it!
    sweet_scope
				:ns => { :AutoloadModules => 'fixtures/autoload_modulez'},
				:mutate_path => Proc.new {|path| path.sub(/(ies)/, 'y') } do
      sweetload :Admin
    end
    
    sweetload :Editor
  end
end

Note: #autoload_scope is deprecated in place of #sweet_scope

ClassExt

Sweetloader also encludes a convenient extension called ClassExt, which can be used to find a Module or Class based on a name.

module First
	module Blip
		def self.blip
		end
	end
end

module Second
	include_and_extend ClassExt
  include_and_extend First
end

Second.new.try_module('Blip').blip
Second.try_module('Blip').blip
Second.try_class('Blip') == nil # => ClassNotFoundError

Second.find_first_class(:Blop, :blip_blop, 'Blip') # => ClassNotFoundError
Second.find_first_module('Blop', :blip) # => Blip:Class

Contributing to sweetloader

  • Check out the latest master to make sure the feature hasn't been implemented or the bug hasn't been fixed yet
  • Check out the issue tracker to make sure someone already hasn't requested it and/or contributed it
  • Fork the project
  • Start a feature/bugfix branch
  • Commit and push until you are happy with your contribution
  • Make sure to add tests for it. This is important so I don't break it in a future version unintentionally.
  • Please try not to mess with the Rakefile, version, or history. If you want to have your own version, or is otherwise necessary, that is fine, but please isolate to its own commit so I can cherry-pick around it.

Copyright

Copyright (c) 2011 Kristian Mandrup. See LICENSE.txt for further details.