thomas07vt/lazy_require

View on GitHub
README.md

Summary

Maintainability
Test Coverage
# LazyRequire
[![Code Climate](https://codeclimate.com/github/thomas07vt/lazy_require/badges/gpa.svg)](https://codeclimate.com/github/thomas07vt/lazy_require)

Isn't it annoying when you try to load one file that is dependent on another file that hasn't been loaded yet?
**LazyRequire** lets you require all your project files without worrying about the load order.

It has a similar function to the Rails autoloader, but is much simpler.

## Installation

Add this line to your application's Gemfile:

```ruby
gem 'lazy_require'
```

And then execute:

    $ bundle

Or install it yourself as:

    $ gem install lazy_require



## Usage
Given this folder structure:

```terminal
app_root
  |- lib/
    |- first.rb
    |- second.rb
  |- app.rb
```

If you have files like these inside lib:
```ruby
# first.rb
# The First class depends on the Second class
class First < Second
end
```

```ruby
# second.rb
class Second
  # Does something special
end
```

You might want to load all files inside your lib directory from the app.rb root file.
Doing something like this could easily fail if load order matters:
```ruby
# App.rb

# This might cause issues
Dir['./lib/**/*.rb'].each { |file| require file }

class App
  # Some stuff here
end
```

In the above files, its required to load the "second.rb" file prior to the "first.rb" file.
You could add a line like this, explicitly adding the require line:

```ruby
# first.rb

require_relative './second.rb'
# The First class depends on the Second class
class First < Second
end
```

But that can get cumbersome, especially when you start moving or renaming files in your project.

With **LazyRequire**, you can ask it to load all the files in your project/folder, without having to think about the load order. If **LazyRequire** tries to load a file, which has an unloaded dependency, it will simply skip that file and try again later. So your app.rb file can look something like this:

```ruby
# App.rb

LazyRequire.require_all('./lib/**/*.rb')

class App
  # Some stuff here
end
```

**LazyRequire.load_all()** accepts any glob pattern and will try to require all files that it finds with that glob pattern. If it it successfully loads all files it will return true:

```ruby
2.3.0 :010 >   LazyRequire.require_all('./spec/support/load_all/**/*.rb')
#=> true 
```

If it cannot load any of the files, it will raise an exception:

```ruby
2.3.0 :005 > LazyRequire.require(@files)
NameError: uninitialized constant Top
    from /code/lazy_require/spec/support/errors/top_two.rb:2:in `<top (required)>'
    from /code/lazy_require/lib/lazy_require.rb:13:in `require'
    from /code/lazy_require/lib/lazy_require.rb:13:in `require'
    from (irb):5

```

If you want to load a specific collection of files and avoid using the glob pattern, you can do that to using the LazyRequire#require() method.

```ruby
files = [
  './spec/support/errors/top_two.rb',
  './spec/support/errors/top.rb',
]

LazyRequire.require(files)
#=> true
```

## Development

After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.

To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).

## Contributing

Bug reports and pull requests are welcome on GitHub at https://github.com/thomas07vt/lazy_require.


## License

The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).