require_all 1.5.0 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: d0acf6c3cfe3c05348dc4f39a44862b3ff9e1588
4
- data.tar.gz: dfd83ec51fd0c052866242da84e23ee677baa107
3
+ metadata.gz: 3e7c0c747bfdb3c3c59c6561700e67736f43949f
4
+ data.tar.gz: 4e83ce18c619ab69e6d663afe349f8d2c3a112b5
5
5
  SHA512:
6
- metadata.gz: 5cf536e611f4a5d089be5890d01775628b564051d7c60d9f1827abea02b0b4b9eafad8270be8951000612f02d8f4ba0713ce396bc4190a712a9cddf30bcb4b0d
7
- data.tar.gz: 9108afdd13f81ad242b5e9824ef6eb2477326d4979f1d51bae39739c256eaaa64046f3c1f777a08bde1fc6eacb974bcd70847a316adfde8c5198acb565d426cf
6
+ metadata.gz: e409b3c92b49698fe477322570fb6965956bd5ec75683afd341ae2a483eb621f87b7c5db39642cf6768895bb31ea75d3f18bcd6501ba6819bd1731ad48737311
7
+ data.tar.gz: 96ce20ca7ef905cfaa035e98c2e1a02aaff7c5fda41455fc59ba90654f568deb107d072a8773c0ae7a550eef0c41be0a71bae8ae1175803360583f12c4fe8b15
@@ -1,16 +1,16 @@
1
- rvm:
2
- - 2.4.0
3
- - 2.3.3
4
- - 2.2.6
5
- - jruby-19mode
6
- - rbx-3
7
- - ruby-head
8
- notifications:
9
- recipients:
10
- - jarmo.p@gmail.com
11
- matrix:
12
- allow_failures:
13
- - rvm: ruby-head
14
- - rvm: jruby-19mode
15
- - rvm: rbx-3
16
-
1
+ rvm:
2
+ - 2.5.0
3
+ - 2.4.3
4
+ - 2.3.6
5
+ - jruby-19mode
6
+ - rbx-3
7
+ - ruby-head
8
+ notifications:
9
+ recipients:
10
+ - jarmo.p@gmail.com
11
+ matrix:
12
+ allow_failures:
13
+ - rvm: ruby-head
14
+ - rvm: jruby-19mode
15
+ - rvm: rbx-3
16
+
data/CHANGES CHANGED
@@ -1,45 +1,55 @@
1
- 1.5.0:
2
-
3
- * Merged PR #13 (https://github.com/jarmo/require_all/pull/13).
4
- * Merged PR #18 (https://github.com/jarmo/require_all/pull/18).
5
-
6
- 1.4.0:
7
-
8
- * License is now correctly as MIT. Thanks to Eric Kessler for pull request #16.
9
-
10
- 1.3.3:
11
-
12
- * Support empty directories without crashing. Issue #11. Thanks to Eric Kessler.
13
-
14
- 1.3.2:
15
-
16
- * Add license to gemspec.
17
-
18
- 1.3.1:
19
-
20
- * README improvements.
21
-
22
- 1.3.0:
23
-
24
- * Make everything work with Ruby 1.9 and 2.0. Awesome! Thanks to Aaron Klaassen.
25
-
26
- 1.2.0:
27
-
28
- * Add load_all, and load_rel which behave similarly to require_all/require_rel except that Kernel#load is used
29
- * Add autoload_all and autoload_rel (see README and/or specs for examples of usage)
30
- * Minor bug fixes
31
- * Improved specs
32
-
33
- 1.1.0:
34
-
35
- * Add require_rel (require_all relative to the current file)
36
- * Fix bug in auto-appending .rb ala require
37
-
38
- 1.0.1:
39
-
40
- * Allow require_all to take a directory name as an argument
41
-
42
- 1.0.0:
43
-
44
- * Initial release (was originally load_glob, converted to require_all which is
45
- a lot cooler, seriously trust me)
1
+ 2.0.0:
2
+
3
+ * Merged PR #24 (https://github.com/jarmo/require_all/pull/24)
4
+ Prior to version 2, RequireAll attempted to automatically resolve dependencies between files, thus
5
+ allowing them to be required in any order. Whilst convenient, the approach used (of rescuing
6
+ `NameError`s and later retrying files that failed to load) was fundamentally unsafe and can result
7
+ in incorrect behaviour (for example issue #8, plus more detail and discussion in #21).
8
+
9
+ Thanks to Joe Horsnell (@joehorsnell)
10
+
11
+ 1.5.0:
12
+
13
+ * Merged PR #13 (https://github.com/jarmo/require_all/pull/13).
14
+ * Merged PR #18 (https://github.com/jarmo/require_all/pull/18).
15
+
16
+ 1.4.0:
17
+
18
+ * License is now correctly as MIT. Thanks to Eric Kessler for pull request #16.
19
+
20
+ 1.3.3:
21
+
22
+ * Support empty directories without crashing. Issue #11. Thanks to Eric Kessler.
23
+
24
+ 1.3.2:
25
+
26
+ * Add license to gemspec.
27
+
28
+ 1.3.1:
29
+
30
+ * README improvements.
31
+
32
+ 1.3.0:
33
+
34
+ * Make everything work with Ruby 1.9 and 2.0. Awesome! Thanks to Aaron Klaassen.
35
+
36
+ 1.2.0:
37
+
38
+ * Add load_all, and load_rel which behave similarly to require_all/require_rel except that Kernel#load is used
39
+ * Add autoload_all and autoload_rel (see README and/or specs for examples of usage)
40
+ * Minor bug fixes
41
+ * Improved specs
42
+
43
+ 1.1.0:
44
+
45
+ * Add require_rel (require_all relative to the current file)
46
+ * Fix bug in auto-appending .rb ala require
47
+
48
+ 1.0.1:
49
+
50
+ * Allow require_all to take a directory name as an argument
51
+
52
+ 1.0.0:
53
+
54
+ * Initial release (was originally load_glob, converted to require_all which is
55
+ a lot cooler, seriously trust me)
data/Gemfile CHANGED
@@ -1,4 +1,4 @@
1
- source 'https://rubygems.org'
2
-
3
- gemspec
4
- gem 'coveralls', :require => false
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
4
+ gem 'coveralls', require: false
data/LICENSE CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2009 Jarmo Pertman
1
+ Copyright (c) Jarmo Pertman
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person obtaining
4
4
  a copy of this software and associated documentation files (the
data/README.md CHANGED
@@ -1,128 +1,123 @@
1
- # require_all
2
- [![Gem Version](https://badge.fury.io/rb/require_all.png)](http://badge.fury.io/rb/require_all)
3
- [![Build Status](https://secure.travis-ci.org/jarmo/require_all.png)](http://travis-ci.org/jarmo/require_all)
4
- [![Coverage](https://coveralls.io/repos/jarmo/require_all/badge.png?branch=master)](https://coveralls.io/r/jarmo/require_all)
5
-
6
- A wonderfully simple way to load your code.
7
-
8
- Tired of futzing around with `require` statements everywhere, littering your code
9
- with `require File.dirname(__FILE__)` crap? What if you could just
10
- point something at a big directory full of code and have everything just
11
- automagically load regardless of the dependency structure?
12
-
13
- Wouldn't that be nice? Well, now you can!
14
-
15
- ## Installation
16
-
17
- Add this line to your application's Gemfile:
18
-
19
- gem 'require_all'
20
-
21
- And then execute:
22
-
23
- $ bundle
24
-
25
- Or install it yourself as:
26
-
27
- $ gem install require_all
28
-
29
- ## Usage
30
-
31
- ```ruby
32
- require 'require_all'
33
-
34
- # load all ruby files in the directory "lib" and its subdirectories
35
- require_all 'lib'
36
-
37
- # or load all files by using glob
38
- require_all 'lib/**/*.rb'
39
-
40
- # or load files in an Array
41
- require_all Dir.glob("blah/**/*.rb").reject { |f| stupid_file? f }
42
-
43
- # or load manually specified files
44
- require_all 'lib/a.rb', 'lib/b.rb', 'lib/c.rb', 'lib/d.rb'
45
- ```
46
-
47
- You can also load files relative to the current file by using `require_rel`:
48
-
49
- ```ruby
50
- # Instead of
51
- require File.dirname(__FILE__) + '/foobar'
52
-
53
- # you can do simply like this
54
- require_rel 'foobar'
55
- ```
56
-
57
- You can give all the same argument types to the `require_rel` as for `require_all`.
58
-
59
- It is recommended to use `require_rel` instead of `require_all` since it will require files relatively
60
- to the current file (`__FILE__`) as opposed to loading files relative from the working directory.
61
-
62
- `load_all` and `load_rel` methods also exist to use `Kernel#load` instead of `Kernel#require`!
63
-
64
- The proper order to in which to load files is determined automatically for you.
65
-
66
- It's just that easy! Code loading shouldn't be hard.
67
-
68
- ## autoload_all
69
-
70
- This library also includes methods for performing `autoload` - what a bargain!
71
-
72
- Similar syntax is used as for `require_(all|rel)` and `load_(all|rel)` methods with some caveats:
73
-
74
- * Directory and file names have to reflect namespaces and/or constant names:
75
-
76
- ```ruby
77
- # lib/dir1/dir2/my_file.rb
78
- module Dir1
79
- module Dir2
80
- class MyFile
81
- end
82
- end
83
- end
84
-
85
- # lib/loader.rb
86
- autoload_all File.dirname(__FILE__) + "/dir1"
87
- ```
88
-
89
- * A `base_dir` option has to be specified if loading directories or files from some other location
90
- than top-level directory:
91
-
92
- ```ruby
93
- # lib/dir1/other_file.rb
94
- autoload_all File.dirname(__FILE__) + "/dir2/my_file.rb",
95
- :base_dir => File.dirname(__FILE__) + "/../dir1"
96
- ```
97
-
98
- * All namespaces will be created dynamically by `autoload_all` - this means that `defined?(Dir1)` will
99
- return `"constant"` even if `my_file.rb` is not yet loaded!
100
-
101
- Of course there's also an `autoload_rel` method:
102
- ```ruby
103
- autoload_rel "dir2/my_file.rb", :base_dir => File.dirname(__FILE__) + "/../dir1"
104
- ```
105
-
106
- If having some problems with `autoload_all` or `autoload_rel` then set `$DEBUG=true` to see how files
107
- are mapped to their respective modules and classes.
108
-
109
- ## Methodology (except for autoload_{all|rel})
110
-
111
- * Enumerate the files to be loaded
112
- * Try to load all of the files. If we encounter a `NameError` loading a
113
- particular file, store that file in a "try to load it later" list.
114
- * If all the files loaded, great, we're done! If not, go through the
115
- "try to load it later" list again rescuing `NameError` the same way.
116
- * If we walk the whole "try to load it later" list and it doesn't shrink
117
- at all, we've encountered an unresolvable dependency. In this case,
118
- `require_all` will rethrow the first `NameError` it encountered.
119
-
120
- ## Questions? Comments? Concerns?
121
-
122
- You can reach the author on github or by email [jarmo.p@gmail.com](mailto:jarmo.p@gmail.com)
123
-
124
- ## License
125
-
126
- Jarmo Pertman
127
-
128
- MIT (see the LICENSE file for details)
1
+ # require_all
2
+ [![Gem Version](https://badge.fury.io/rb/require_all.png)](http://badge.fury.io/rb/require_all)
3
+ [![Build Status](https://secure.travis-ci.org/jarmo/require_all.png)](http://travis-ci.org/jarmo/require_all)
4
+ [![Coverage](https://coveralls.io/repos/jarmo/require_all/badge.png?branch=master)](https://coveralls.io/r/jarmo/require_all)
5
+
6
+ A wonderfully simple way to load your code.
7
+
8
+ Tired of futzing around with `require` statements everywhere, littering your code
9
+ with `require File.dirname(__FILE__)` crap? What if you could just
10
+ point something at a big directory full of code and have everything just
11
+ automagically load?
12
+
13
+ Wouldn't that be nice? Well, now you can!
14
+
15
+ ## Installation
16
+
17
+ Add this line to your application's Gemfile:
18
+
19
+ gem 'require_all'
20
+
21
+ And then execute:
22
+
23
+ $ bundle
24
+
25
+ Or install it yourself as:
26
+
27
+ $ gem install require_all
28
+
29
+ ## Usage
30
+
31
+ ```ruby
32
+ require 'require_all'
33
+
34
+ # load all ruby files in the directory "lib" and its subdirectories
35
+ require_all 'lib'
36
+
37
+ # or load all files by using glob
38
+ require_all 'lib/**/*.rb'
39
+
40
+ # or load files in an Array
41
+ require_all Dir.glob("blah/**/*.rb").reject { |f| stupid_file? f }
42
+
43
+ # or load manually specified files
44
+ require_all 'lib/a.rb', 'lib/b.rb', 'lib/c.rb', 'lib/d.rb'
45
+ ```
46
+
47
+ You can also load files relative to the current file by using `require_rel`:
48
+
49
+ ```ruby
50
+ # Instead of
51
+ require File.dirname(__FILE__) + '/foobar'
52
+
53
+ # you can do simply like this
54
+ require_rel 'foobar'
55
+ ```
56
+
57
+ You can give all the same argument types to the `require_rel` as for `require_all`.
58
+
59
+ It is recommended to use `require_rel` instead of `require_all` since it will require files relatively
60
+ to the current file (`__FILE__`) as opposed to loading files relative from the working directory.
61
+
62
+ `load_all` and `load_rel` methods also exist to use `Kernel#load` instead of `Kernel#require`!
63
+
64
+ Files are required in alphabetical order and if there are files in nested directories, they are
65
+ required depth-first. If a `NameError` caused by a reference to an uninitialised constant is
66
+ encountered during the requiring process, then a `RequireAll::LoadError` will be thrown,
67
+ indicating the file that needs the dependency adding to.
68
+
69
+ ## autoload_all
70
+
71
+ This library also includes methods for performing `autoload` - what a bargain!
72
+
73
+ Similar syntax is used as for `require_(all|rel)` and `load_(all|rel)` methods with some caveats:
74
+
75
+ * Directory and file names have to reflect namespaces and/or constant names:
76
+
77
+ ```ruby
78
+ # lib/dir1/dir2/my_file.rb
79
+ module Dir1
80
+ module Dir2
81
+ class MyFile
82
+ end
83
+ end
84
+ end
85
+
86
+ # lib/loader.rb
87
+ autoload_all File.dirname(__FILE__) + "/dir1"
88
+ ```
89
+
90
+ * A `base_dir` option has to be specified if loading directories or files from some other location
91
+ than top-level directory:
92
+
93
+ ```ruby
94
+ # lib/dir1/other_file.rb
95
+ autoload_all File.dirname(__FILE__) + "/dir2/my_file.rb",
96
+ base_dir: File.dirname(__FILE__) + "/../dir1"
97
+ ```
98
+
99
+ * All namespaces will be created dynamically by `autoload_all` - this means that `defined?(Dir1)` will
100
+ return `"constant"` even if `my_file.rb` is not yet loaded!
101
+
102
+ Of course there's also an `autoload_rel` method:
103
+ ```ruby
104
+ autoload_rel "dir2/my_file.rb", base_dir: File.dirname(__FILE__) + "/../dir1"
105
+ ```
106
+
107
+ If having some problems with `autoload_all` or `autoload_rel` then set `$DEBUG=true` to see how files
108
+ are mapped to their respective modules and classes.
109
+
110
+ ## Version compatibility and upgrading
111
+
112
+ As of version 2, RequireAll will raise a `RequireAll::LoadError` if it encounters a `NameError`
113
+ caused by a reference to an uninitialised constant during the requiring process. As such, it is not
114
+ backwards compatible with version 1.x, but simple to upgrade by adding any requires to load
115
+ dependencies in files that need them. See [CHANGES](CHANGES) for more details.
116
+
117
+ ## Questions? Comments? Concerns?
118
+
119
+ You can reach the author on github or by email [jarmo.p@gmail.com](mailto:jarmo.p@gmail.com)
120
+
121
+ ## License
122
+
123
+ MIT (see the [LICENSE](LICENSE) file for details)
@@ -5,6 +5,8 @@
5
5
  #++
6
6
 
7
7
  module RequireAll
8
+ LoadError = Class.new(::LoadError)
9
+
8
10
  # A wonderfully simple way to load your code.
9
11
  #
10
12
  # The easiest way to use require_all is to just point it at a directory
@@ -14,10 +16,9 @@ module RequireAll
14
16
  # require_all 'lib'
15
17
  #
16
18
  # This will find all the .rb files under the lib directory and load them.
17
- # The proper order to load them in will be determined automatically.
18
19
  #
19
- # If the dependencies between the matched files are unresolvable, it will
20
- # throw the first unresolvable NameError.
20
+ # If a file required by require_all references a constant that is not yet
21
+ # loaded, a RequireAll::LoadError will be thrown.
21
22
  #
22
23
  # You can also give it a glob, which will enumerate all the matching files:
23
24
  #
@@ -35,7 +36,7 @@ module RequireAll
35
36
  # Handle passing an array as an argument
36
37
  args.flatten!
37
38
 
38
- options = {:method => :require}
39
+ options = {method: :require}
39
40
  options.merge!(args.pop) if args.last.is_a?(Hash)
40
41
 
41
42
  if args.empty?
@@ -92,51 +93,15 @@ module RequireAll
92
93
  return true
93
94
  end
94
95
 
95
- files.map! { |file_| File.expand_path file_ }
96
- files.sort!
97
-
98
- begin
99
- failed = []
100
- first_name_error = nil
101
-
102
- # Attempt to load each file, rescuing which ones raise NameError for
103
- # undefined constants. Keep trying to successively reload files that
104
- # previously caused NameErrors until they've all been loaded or no new
105
- # files can be loaded, indicating unresolvable dependencies.
106
- files.each do |file_|
107
- begin
108
- __require(options[:method], file_)
109
- rescue NameError => ex
110
- failed << file_
111
- first_name_error ||= ex
112
- rescue ArgumentError => ex
113
- # Work around ActiveSuport freaking out... *sigh*
114
- #
115
- # ActiveSupport sometimes throws these exceptions and I really
116
- # have no idea why. Code loading will work successfully if these
117
- # exceptions are swallowed, although I've run into strange
118
- # nondeterministic behaviors with constants mysteriously vanishing.
119
- # I've gone spelunking through dependencies.rb looking for what
120
- # exactly is going on, but all I ended up doing was making my eyes
121
- # bleed.
122
- #
123
- # FIXME: If you can understand ActiveSupport's dependencies.rb
124
- # better than I do I would *love* to find a better solution
125
- raise unless ex.message["is not missing constant"]
126
-
127
- STDERR.puts "Warning: require_all swallowed ActiveSupport 'is not missing constant' error"
128
- STDERR.puts ex.backtrace[0..9]
129
- end
130
- end
131
-
132
- # If this pass didn't resolve any NameErrors, we've hit an unresolvable
133
- # dependency, so raise one of the exceptions we encountered.
134
- if failed.size == files.size
135
- raise first_name_error
136
- else
137
- files = failed
96
+ files.map { |file_| File.expand_path file_ }.sort.each do |file_|
97
+ begin
98
+ __require(options[:method], file_)
99
+ rescue NameError => e
100
+ # Only wrap NameError exceptions for uninitialized constants
101
+ raise e unless e.instance_of?(NameError) && e.message.include?('uninitialized constant')
102
+ raise LoadError, "Could not require #{file_} (#{e}). Please require the necessary files"
138
103
  end
139
- end until failed.empty?
104
+ end
140
105
 
141
106
  true
142
107
  end
@@ -156,7 +121,7 @@ module RequireAll
156
121
 
157
122
  # Loads all files like require_all instead of requiring
158
123
  def load_all(*paths)
159
- require_all paths, :method => :load
124
+ require_all paths, method: :load
160
125
  end
161
126
 
162
127
  # Loads all files by using relative paths of the caller rather than
@@ -167,7 +132,7 @@ module RequireAll
167
132
 
168
133
  source_directory = File.dirname caller.first.sub(/:\d+$/, '')
169
134
  paths.each do |path|
170
- require_all File.join(source_directory, path), :method => :load
135
+ require_all File.join(source_directory, path), method: :load
171
136
  end
172
137
  end
173
138
 
@@ -197,7 +162,7 @@ module RequireAll
197
162
  # For example loading only my_file.rb from dir1/dir2 with autoload_all:
198
163
  #
199
164
  # autoload_all File.dirname(__FILE__) + '/dir1/dir2/my_file',
200
- # :base_dir => File.dirname(__FILE__) + '/dir1'
165
+ # base_dir: File.dirname(__FILE__) + '/dir1'
201
166
  #
202
167
  # WARNING: All modules will be created even if files themselves aren't loaded yet, meaning
203
168
  # that all the code which depends of the modules being loaded or not will not work, like usages
@@ -212,11 +177,11 @@ module RequireAll
212
177
  return false if paths.empty?
213
178
  require "pathname"
214
179
 
215
- options = {:method => :autoload}
180
+ options = {method: :autoload}
216
181
  options.merge!(paths.pop) if paths.last.is_a?(Hash)
217
182
 
218
183
  paths.each do |path|
219
- require_all path, {:base_dir => path}.merge(options)
184
+ require_all path, {base_dir: path}.merge(options)
220
185
  end
221
186
  end
222
187
 
@@ -226,14 +191,14 @@ module RequireAll
226
191
  return false if paths.empty?
227
192
  require "pathname"
228
193
 
229
- options = {:method => :autoload}
194
+ options = {method: :autoload}
230
195
  options.merge!(paths.pop) if paths.last.is_a?(Hash)
231
196
 
232
197
  source_directory = File.dirname caller.first.sub(/:\d+$/, '')
233
198
  paths.each do |path|
234
199
  file_path = Pathname.new(source_directory).join(path).to_s
235
- require_all file_path, {:method => :autoload,
236
- :base_dir => source_directory}.merge(options)
200
+ require_all file_path, {method: :autoload,
201
+ base_dir: source_directory}.merge(options)
237
202
  end
238
203
  end
239
204
 
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = "require_all"
3
- s.version = "1.5.0"
3
+ s.version = "2.0.0"
4
4
  s.authors = ["Jarmo Pertman", "Tony Arcieri"]
5
5
  s.email = "jarmo.p@gmail.com"
6
6
  s.summary = "A wonderfully simple way to load your code"
@@ -9,18 +9,18 @@ shared_examples_for "#autoload_all syntactic sugar" do
9
9
 
10
10
  it "accepts files with and without extensions" do
11
11
  is_expected.not_to be_loaded("Autoloaded::Module2::LongerName")
12
- expect(send(@method, @base_dir + '/module2/longer_name', :base_dir => @autoload_base_dir)).to be_truthy
12
+ expect(send(@method, @base_dir + '/module2/longer_name', base_dir: @autoload_base_dir)).to be_truthy
13
13
  is_expected.to be_loaded("Autoloaded::Module2::LongerName")
14
14
 
15
15
  is_expected.not_to be_loaded("Autoloaded::Module1::A")
16
- expect(send(@method, @base_dir + '/module1/a.rb', :base_dir => @autoload_base_dir)).to be_truthy
16
+ expect(send(@method, @base_dir + '/module1/a.rb', base_dir: @autoload_base_dir)).to be_truthy
17
17
  is_expected.to be_loaded("Autoloaded::Module1::A")
18
18
  end
19
19
 
20
20
  it "accepts lists of files" do
21
21
  is_expected.not_to be_loaded("Autoloaded::Module1::A", "Autoloaded::Module2::LongerName",
22
22
  "Autoloaded::Module2::Module3::B")
23
- expect(send(@method, @file_list, :base_dir => @autoload_base_dir)).to be_truthy
23
+ expect(send(@method, @file_list, base_dir: @autoload_base_dir)).to be_truthy
24
24
  is_expected.to be_loaded("Autoloaded::Module1::A", "Autoloaded::Module2::LongerName",
25
25
  "Autoloaded::Module2::Module3::B")
26
26
  end
@@ -28,7 +28,7 @@ shared_examples_for "#autoload_all syntactic sugar" do
28
28
  it "is totally cool with a splatted list of arguments" do
29
29
  is_expected.not_to be_loaded("Autoloaded::Module1::A", "Autoloaded::Module2::LongerName",
30
30
  "Autoloaded::Module2::Module3::B")
31
- expect(send(@method, *(@file_list << {:base_dir => @autoload_base_dir}))).to be_truthy
31
+ expect(send(@method, *(@file_list << {base_dir: @autoload_base_dir}))).to be_truthy
32
32
  is_expected.to be_loaded("Autoloaded::Module1::A", "Autoloaded::Module2::LongerName",
33
33
  "Autoloaded::Module2::Module3::B")
34
34
  end
@@ -36,7 +36,7 @@ shared_examples_for "#autoload_all syntactic sugar" do
36
36
  it "will load all .rb files under a directory without a trailing slash" do
37
37
  is_expected.not_to be_loaded("Autoloaded::Module1::A", "Autoloaded::Module2::LongerName",
38
38
  "Autoloaded::Module2::Module3::B")
39
- expect(send(@method, @base_dir, :base_dir => @autoload_base_dir)).to be_truthy
39
+ expect(send(@method, @base_dir, base_dir: @autoload_base_dir)).to be_truthy
40
40
  is_expected.to be_loaded("Autoloaded::Module1::A", "Autoloaded::Module2::LongerName",
41
41
  "Autoloaded::Module2::Module3::B")
42
42
  end
@@ -44,7 +44,7 @@ shared_examples_for "#autoload_all syntactic sugar" do
44
44
  it "will load all .rb files under a directory with a trailing slash" do
45
45
  is_expected.not_to be_loaded("Autoloaded::Module1::A", "Autoloaded::Module2::LongerName",
46
46
  "Autoloaded::Module2::Module3::B")
47
- expect(send(@method, "#{@base_dir}/", :base_dir => @autoload_base_dir)).to be_truthy
47
+ expect(send(@method, "#{@base_dir}/", base_dir: @autoload_base_dir)).to be_truthy
48
48
  is_expected.to be_loaded("Autoloaded::Module1::A", "Autoloaded::Module2::LongerName",
49
49
  "Autoloaded::Module2::Module3::B")
50
50
  end
@@ -52,7 +52,7 @@ shared_examples_for "#autoload_all syntactic sugar" do
52
52
  it "will load all files specified by a glob" do
53
53
  is_expected.not_to be_loaded("Autoloaded::Module1::A", "Autoloaded::Module2::LongerName",
54
54
  "Autoloaded::Module2::Module3::B")
55
- expect(send(@method, "#{@base_dir}/**/*.rb", :base_dir => @autoload_base_dir)).to be_truthy
55
+ expect(send(@method, "#{@base_dir}/**/*.rb", base_dir: @autoload_base_dir)).to be_truthy
56
56
  is_expected.to be_loaded("Autoloaded::Module1::A", "Autoloaded::Module2::LongerName",
57
57
  "Autoloaded::Module2::Module3::B")
58
58
  end
@@ -78,7 +78,7 @@ shared_examples_for "#autoload_all syntactic sugar" do
78
78
  end
79
79
 
80
80
  it "raises LoadError if :base_dir doesn't exist" do
81
- expect {send(@method, @base_dir, :base_dir => @base_dir + "/non_existing_dir")}.
81
+ expect {send(@method, @base_dir, base_dir: @base_dir + "/non_existing_dir")}.
82
82
  to raise_exception(LoadError)
83
83
  end
84
84
  end
@@ -4,21 +4,21 @@ require File.dirname(__FILE__) + '/autoload_shared.rb'
4
4
  describe "autoload_all" do
5
5
 
6
6
  subject { self }
7
-
7
+
8
8
  it "provides require_all functionality by using 'autoload' instead of 'require'" do
9
9
  is_expected.not_to be_loaded("Autoloaded::Module1::A", "Autoloaded::Module2::LongerName", "Autoloaded::Module2::Module3::B")
10
- autoload_all File.dirname(__FILE__) + "/fixtures/autoloaded"
10
+ autoload_all fixture_path('autoloaded')
11
11
  is_expected.to be_loaded("Autoloaded::Module1::A", "Autoloaded::Module2::LongerName", "Autoloaded::Module2::Module3::B")
12
12
  end
13
13
 
14
14
  it "doesn't autoload files with wrong module names" do
15
- autoload_all File.dirname(__FILE__) + "/fixtures/autoloaded"
15
+ autoload_all fixture_path('autoloaded')
16
16
  is_expected.not_to be_loaded("Autoloaded::WrongModule::WithWrongModule", "WrongModule::WithWrongModule")
17
17
  end
18
18
 
19
19
  it "autoloads class nested into another class" do
20
20
  is_expected.not_to be_loaded("Autoloaded::Class1", "Autoloaded::Class1::C")
21
- autoload_all File.dirname(__FILE__) + "/fixtures/autoloaded"
21
+ autoload_all fixture_path('autoloaded')
22
22
  is_expected.to be_loaded("Autoloaded::Class1")
23
23
  expect(Autoloaded::Class1).to be_a Class
24
24
  is_expected.to be_loaded("Autoloaded::Class1::C")
@@ -26,17 +26,16 @@ describe "autoload_all" do
26
26
 
27
27
  it "needs to specify base_dir for autoloading if loading something from under top-level module directory" do
28
28
  is_expected.not_to be_loaded("Autoloaded::Module1::A", "Autoloaded::Module2::LongerName", "Autoloaded::Module2::Module3::B")
29
- autoload_all File.dirname(__FILE__) + "/fixtures/autoloaded/module1"
29
+ autoload_all fixture_path('autoloaded/module1')
30
30
  is_expected.not_to be_loaded("Autoloaded::Module1::A", "Autoloaded::Module2::LongerName", "Autoloaded::Module2::Module3::B")
31
31
 
32
- autoload_all File.dirname(__FILE__) + "/fixtures/autoloaded/module1",
33
- :base_dir => File.dirname(__FILE__) + "/fixtures/autoloaded"
32
+ autoload_all fixture_path('autoloaded/module1'), base_dir: fixture_path('autoloaded')
34
33
  is_expected.to be_loaded("Autoloaded::Module1::A")
35
34
  is_expected.not_to be_loaded("Autoloaded::Module2::LongerName", "Autoloaded::Module2::Module3::B")
36
35
  end
37
36
 
38
37
  before(:all) do
39
- @base_dir = File.dirname(__FILE__) + '/fixtures/autoloaded'
38
+ @base_dir = fixture_path('autoloaded')
40
39
  @method = :autoload_all
41
40
  @autoload_base_dir = @base_dir
42
41
  end
@@ -49,25 +48,24 @@ describe "autoload_rel" do
49
48
 
50
49
  it "provides autoload_all functionality relative to the current file" do
51
50
  is_expected.not_to be_loaded("Modules::Module1::First", "Modules::Module2::Second", "Modules::Zero")
52
- require File.dirname(__FILE__) + '/fixtures/autoloaded_rel/modules/zero'
51
+ require fixture_path('autoloaded_rel/modules/zero')
53
52
  is_expected.to be_loaded("Modules::Module1::First", "Modules::Module2::Second", "Modules::Zero")
54
53
  end
55
54
 
56
55
  it "needs to specify base_dir for autoloading if loading something from under top-level module directory" do
57
56
  is_expected.not_to be_loaded("Autoloaded::Module1::A", "Autoloaded::Module2::LongerName", "Autoloaded::Module2::Module3::B")
58
- autoload_rel "./fixtures/autoloaded/module1"
57
+ autoload_rel relative_fixture_path('autoloaded/module1')
59
58
  is_expected.not_to be_loaded("Autoloaded::Module1::A", "Autoloaded::Module2::LongerName", "Autoloaded::Module2::Module3::B")
60
59
 
61
- autoload_rel "./fixtures/autoloaded/module1",
62
- :base_dir => File.dirname(__FILE__) + "/fixtures/autoloaded"
60
+ autoload_rel relative_fixture_path('autoloaded/module1'), base_dir: fixture_path('autoloaded')
63
61
  is_expected.to be_loaded("Autoloaded::Module1::A")
64
62
  is_expected.not_to be_loaded("Autoloaded::Module2::LongerName", "Autoloaded::Module2::Module3::B")
65
63
  end
66
64
 
67
65
  before(:all) do
68
- @base_dir = './fixtures/autoloaded'
66
+ @base_dir = relative_fixture_path('autoloaded')
69
67
  @method = :autoload_rel
70
- @autoload_base_dir = File.dirname(__FILE__) + "/fixtures/autoloaded"
68
+ @autoload_base_dir = fixture_path('autoloaded')
71
69
  end
72
70
  it_should_behave_like "#autoload_all syntactic sugar"
73
71
  end
@@ -0,0 +1,3 @@
1
+ class A
2
+ non_existent_method
3
+ end
@@ -1 +1,3 @@
1
+ require_relative 'c'
2
+
1
3
  class A < C; end
@@ -2,11 +2,11 @@ require File.dirname(__FILE__) + '/spec_helper.rb'
2
2
  require File.dirname(__FILE__) + '/require_shared.rb'
3
3
 
4
4
  describe "load_all" do
5
-
5
+
6
6
  subject { self }
7
7
 
8
8
  it "provides require_all functionality but using 'load' instead of 'require'" do
9
- require_all File.dirname(__FILE__) + '/fixtures/resolvable'
9
+ require_all fixture_path('resolvable')
10
10
  expect(C.new).to be_cool
11
11
 
12
12
  class C
@@ -18,12 +18,12 @@ describe "load_all" do
18
18
  expect(C.new).not_to be_cool
19
19
  C.send :remove_method, :cool?
20
20
 
21
- load_all File.dirname(__FILE__) + '/fixtures/resolvable'
21
+ load_all fixture_path('resolvable')
22
22
  expect(C.new).to be_cool
23
23
  end
24
24
 
25
25
  before(:all) do
26
- @base_dir = File.dirname(__FILE__) + '/fixtures/autoloaded'
26
+ @base_dir = fixture_path('autoloaded')
27
27
  @method = :load_all
28
28
  end
29
29
  it_should_behave_like "#require_all syntactic sugar"
@@ -34,7 +34,7 @@ describe "load_rel" do
34
34
  subject { self }
35
35
 
36
36
  it "provides load_all functionality relative to the current file" do
37
- require File.dirname(__FILE__) + '/fixtures/relative/d/d'
37
+ require fixture_path('relative/d/d')
38
38
 
39
39
  is_expected.to be_loaded("RelativeA", "RelativeC", "RelativeD")
40
40
  expect(RelativeD.new).to be_ok
@@ -48,7 +48,7 @@ describe "load_rel" do
48
48
  expect(RelativeD.new).not_to be_ok
49
49
  RelativeD.send :remove_method, :ok?
50
50
 
51
- load File.dirname(__FILE__) + '/fixtures/relative/d/d.rb'
51
+ load fixture_path('relative/d/d.rb')
52
52
  expect(RelativeD.new).to be_ok
53
53
  end
54
54
 
@@ -5,22 +5,35 @@ describe "require_all" do
5
5
 
6
6
  subject { self }
7
7
 
8
- describe "dependency resolution" do
9
- it "handles load ordering when dependencies are resolvable" do
10
- require_all File.dirname(__FILE__) + '/fixtures/resolvable/*.rb'
8
+ context "when files correctly declare their dependencies" do
9
+ it "requires them successfully" do
10
+ require_all fixture_path('resolvable/*.rb')
11
11
 
12
12
  is_expected.to be_loaded("A", "B", "C", "D")
13
13
  end
14
+ end
15
+
16
+ context "errors" do
17
+ it "raises RequireAll:LoadError if files do not declare their dependencies" do
18
+ expect do
19
+ require_all fixture_path('unresolvable/*.rb')
20
+ end.to raise_error(RequireAll::LoadError) do |error|
21
+ expect(error.cause).to be_a NameError
22
+ expect(error.message).to match /Please require the necessary files/
23
+ end
24
+ end
14
25
 
15
- it "raises NameError if dependencies can't be resolved" do
26
+ it "raises other NameErrors if encountered" do
16
27
  expect do
17
- require_all File.dirname(__FILE__) + '/fixtures/unresolvable/*.rb'
18
- end.to raise_error(NameError)
28
+ require_all fixture_path('error')
29
+ end.to raise_error(NameError) do |error|
30
+ expect(error.message).to match /undefined local variable or method `non_existent_method'/
31
+ end
19
32
  end
20
33
  end
21
34
 
22
35
  before(:all) do
23
- @base_dir = File.dirname(__FILE__) + '/fixtures/autoloaded'
36
+ @base_dir = fixture_path('autoloaded')
24
37
  @method = :require_all
25
38
  end
26
39
  it_should_behave_like "#require_all syntactic sugar"
@@ -31,14 +44,14 @@ describe "require_rel" do
31
44
  subject { self }
32
45
 
33
46
  it "provides require_all functionality relative to the current file" do
34
- require File.dirname(__FILE__) + '/fixtures/relative/b/b'
47
+ require fixture_path('relative/b/b')
35
48
 
36
49
  is_expected.to be_loaded("RelativeA", "RelativeB", "RelativeC")
37
50
  is_expected.not_to be_loaded("RelativeD")
38
51
  end
39
52
 
40
53
  before(:all) do
41
- @base_dir = './fixtures/autoloaded'
54
+ @base_dir = relative_fixture_path('autoloaded')
42
55
  @method = :require_rel
43
56
  end
44
57
  it_should_behave_like "#require_all syntactic sugar"
@@ -1,30 +1,38 @@
1
- require "simplecov"
2
- require "coveralls"
3
-
4
- SimpleCov.formatter = Coveralls::SimpleCov::Formatter
5
- SimpleCov.start
6
-
7
- require File.dirname(__FILE__) + '/../lib/require_all.rb'
8
-
9
- module SpecHelper
10
- def unload_all
11
- %w{A B C D WrongModule Autoloaded Modules
12
- RelativeA RelativeB RelativeC RelativeD}.each do |const|
13
- Object.send(:remove_const, const) rescue nil
14
- end
15
- $LOADED_FEATURES.delete_if {|f| f =~ /autoloaded|relative|resolvable/}
16
- end
17
-
18
- def loaded?(*klazzes)
19
- klazzes.all? {|klazz| Object.class_eval(klazz) rescue nil}
20
- end
21
- end
22
-
23
- RSpec.configure do |config|
24
- config.include SpecHelper
25
- config.color = true
26
-
27
- config.before do
28
- unload_all
29
- end
30
- end
1
+ require "simplecov"
2
+ require "coveralls"
3
+
4
+ SimpleCov.formatter = Coveralls::SimpleCov::Formatter
5
+ SimpleCov.start
6
+
7
+ require File.dirname(__FILE__) + '/../lib/require_all.rb'
8
+
9
+ module SpecHelper
10
+ def fixture_path(fixture_name, relative_dir = File.dirname(__FILE__))
11
+ File.join(relative_dir, 'fixtures', fixture_name)
12
+ end
13
+
14
+ def relative_fixture_path(fixture_name)
15
+ fixture_path(fixture_name, '.')
16
+ end
17
+
18
+ def unload_all
19
+ %w{A B C D WrongModule Autoloaded Modules
20
+ RelativeA RelativeB RelativeC RelativeD}.each do |const|
21
+ Object.send(:remove_const, const) rescue nil
22
+ end
23
+ $LOADED_FEATURES.delete_if {|f| f =~ /autoloaded|error|relative|resolvable/}
24
+ end
25
+
26
+ def loaded?(*klazzes)
27
+ klazzes.all? {|klazz| Object.class_eval(klazz) rescue nil}
28
+ end
29
+ end
30
+
31
+ RSpec.configure do |config|
32
+ config.include SpecHelper
33
+ config.color = true
34
+
35
+ config.before do
36
+ unload_all
37
+ end
38
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: require_all
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.5.0
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jarmo Pertman
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2017-12-29 00:00:00.000000000 Z
12
+ date: 2018-03-07 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rake
@@ -82,6 +82,7 @@ files:
82
82
  - spec/fixtures/autoloaded_rel/modules/module1/first.rb
83
83
  - spec/fixtures/autoloaded_rel/modules/module2/second.rb
84
84
  - spec/fixtures/autoloaded_rel/modules/zero.rb
85
+ - spec/fixtures/error/a.rb
85
86
  - spec/fixtures/relative/a.rb
86
87
  - spec/fixtures/relative/b/b.rb
87
88
  - spec/fixtures/relative/c/c.rb
@@ -139,6 +140,7 @@ test_files:
139
140
  - spec/fixtures/autoloaded_rel/modules/module1/first.rb
140
141
  - spec/fixtures/autoloaded_rel/modules/module2/second.rb
141
142
  - spec/fixtures/autoloaded_rel/modules/zero.rb
143
+ - spec/fixtures/error/a.rb
142
144
  - spec/fixtures/relative/a.rb
143
145
  - spec/fixtures/relative/b/b.rb
144
146
  - spec/fixtures/relative/c/c.rb