require_all 1.5.0 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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