autoloaded 1.2.0 → 1.3.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.
Files changed (57) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +1 -1
  3. data/History.md +4 -0
  4. data/README.md +411 -60
  5. data/autoloaded.gemspec +19 -14
  6. data/lib/autoloaded.rb +104 -91
  7. data/lib/autoloaded/autoloader.rb +260 -0
  8. data/lib/autoloaded/compatibility/refine_and_using.rb +2 -0
  9. data/lib/autoloaded/constant.rb +5 -2
  10. data/lib/autoloaded/deprecation.rb +50 -0
  11. data/lib/autoloaded/inflection.rb +71 -0
  12. data/lib/autoloaded/load_pathed_directory.rb +112 -0
  13. data/lib/autoloaded/refine.rb +7 -1
  14. data/lib/autoloaded/refine/string.rb +7 -0
  15. data/lib/autoloaded/refine/string/to_source_filename.rb +12 -0
  16. data/lib/autoloaded/specification.rb +97 -0
  17. data/lib/autoloaded/specifications.rb +66 -0
  18. data/lib/autoloaded/version.rb +3 -1
  19. data/lib/autoloaded/warning.rb +125 -0
  20. data/spec/autoloaded/autoloader_spec.rb +469 -0
  21. data/spec/autoloaded/constant_spec.rb +0 -2
  22. data/spec/autoloaded/deprecation_spec.rb +23 -0
  23. data/spec/autoloaded/inflection_spec.rb +30 -0
  24. data/spec/autoloaded/load_pathed_directory_spec.rb +120 -0
  25. data/spec/autoloaded/refine/string/to_source_filename_spec.rb +0 -2
  26. data/spec/autoloaded/specification_spec.rb +98 -0
  27. data/spec/autoloaded/specifications_spec.rb +191 -0
  28. data/spec/autoloaded/version_spec.rb +0 -2
  29. data/spec/autoloaded/warning_spec.rb +115 -0
  30. data/spec/autoloaded_macro_sharedspec.rb +24 -0
  31. data/spec/autoloaded_spec.rb +277 -95
  32. data/spec/fixtures/autoloaded_with_conventional_filename.rb +3 -1
  33. data/spec/fixtures/autoloaded_with_conventional_filename/nested.rb +12 -1
  34. data/spec/fixtures/autoloaded_with_conventional_filename/nested/doubly_nested.rb +9 -0
  35. data/spec/fixtures/autoloaded_with_unconventional_filename.rb +12 -0
  36. data/spec/fixtures/autoloaded_with_unconventional_filename/N-est-ed.rb +7 -0
  37. data/spec/fixtures/autoloaded_with_unconventional_filename/nest_ed.rb +1 -0
  38. data/spec/fixtures/autoloaded_with_unconventional_filename/old_school_autoload.rb +5 -0
  39. data/spec/fixtures/not_autoloaded/nested.rb +1 -0
  40. data/spec/fixtures/old_api/autoloaded_with_conventional_filename.rb +10 -0
  41. data/spec/fixtures/old_api/autoloaded_with_conventional_filename/N-est-ed.rb +1 -0
  42. data/spec/fixtures/old_api/autoloaded_with_conventional_filename/nest_ed.rb +1 -0
  43. data/spec/fixtures/old_api/autoloaded_with_conventional_filename/nested.rb +5 -0
  44. data/spec/fixtures/old_api/autoloaded_with_conventional_filename/old_school_autoload.rb +5 -0
  45. data/spec/fixtures/{autoloaded_with_conventional_filename_only.rb → old_api/autoloaded_with_conventional_filename_only.rb} +1 -1
  46. data/spec/fixtures/{autoloaded_with_conventional_filename_only → old_api/autoloaded_with_conventional_filename_only}/nested.rb +0 -0
  47. data/spec/fixtures/{autoloaded_with_conventional_filename_only → old_api/autoloaded_with_conventional_filename_only}/old_school_autoload.rb +0 -0
  48. data/spec/fixtures/{autoloaded_with_unconventional_filenames.rb → old_api/autoloaded_with_unconventional_filenames.rb} +1 -1
  49. data/spec/fixtures/{autoloaded_with_unconventional_filenames → old_api/autoloaded_with_unconventional_filenames}/N-est-ed.rb +0 -0
  50. data/spec/fixtures/{autoloaded_with_unconventional_filenames → old_api/autoloaded_with_unconventional_filenames}/nest_ed.rb +0 -0
  51. data/spec/fixtures/{autoloaded_with_unconventional_filenames → old_api/autoloaded_with_unconventional_filenames}/old_school_autoload.rb +0 -0
  52. data/spec/fixtures/old_api/not_autoloaded.rb +6 -0
  53. data/spec/fixtures/old_api/not_autoloaded/nested.rb +1 -0
  54. data/spec/fixtures/old_api/not_autoloaded/old_school_autoload.rb +5 -0
  55. data/spec/matchers.rb +4 -33
  56. data/spec/spec_helper.rb +2 -0
  57. metadata +95 -41
@@ -1,6 +1,8 @@
1
1
  module Autoloaded
2
2
 
3
3
  # The current version of the _Autoloaded_ project.
4
- VERSION = '1.2.0'
4
+ #
5
+ # @since 0.0.1
6
+ VERSION = '1.3.0'
5
7
 
6
8
  end
@@ -0,0 +1,125 @@
1
+ module Autoloaded; end
2
+
3
+ # Prints warning messages to _stderr_.
4
+ #
5
+ # @since 1.3
6
+ #
7
+ # @api private
8
+ module Autoloaded::Warning
9
+
10
+ class << self
11
+
12
+ # Sets the warning stream.
13
+ #
14
+ # @param [IO] value a new value for #io
15
+ attr_writer :io
16
+
17
+ # The warning stream. Defaults to +$stderr+.
18
+ #
19
+ # @return [IO] the warning stream
20
+ def io
21
+ @io || $stderr
22
+ end
23
+
24
+ # Prints a warning message to _#io_ concerning an existing autoloaded
25
+ # constant for which the autoloaded source file is being changed.
26
+ #
27
+ # @param [Symbol] constant_name the name of the constant
28
+ # @param [String] old_source_filename the name of the existing autoloaded
29
+ # source file
30
+ # @param [String] new_source_filename the name of the new autoloaded source
31
+ # file
32
+ # @param [String] host_source_location the file and line number of the source
33
+ # establishing autoloading
34
+ #
35
+ # @return [Module] _Warning_
36
+ def changing_autoload(constant_name: raise(::ArgumentError,
37
+ 'missing keyword: constant_name'),
38
+ old_source_filename: raise(::ArgumentError,
39
+ 'missing keyword: old_source_filename'),
40
+ new_source_filename: raise(::ArgumentError,
41
+ 'missing keyword: new_source_filename'),
42
+ host_source_location: raise(::ArgumentError,
43
+ 'missing keyword: host_source_location'))
44
+ message = "Existing autoload of \e[4m#{constant_name}\e[0m from " +
45
+ "#{old_source_filename.inspect} is being overridden to " +
46
+ "autoload from #{new_source_filename.inspect} -- avoid this " +
47
+ "warning by using an \e[4monly\e[0m or an \e[4mexcept\e[0m " +
48
+ "specification in the block at #{host_source_location}"
49
+ warn message
50
+ end
51
+
52
+ # Enables or disables warning messages depending on the specified _enabling_
53
+ # argument.
54
+ #
55
+ # @param [Object] enabling disables warnings if +nil+ or +false+
56
+ #
57
+ # @yield if a block is given, the value of _#enabled?_ is reset after the
58
+ # block is called
59
+ #
60
+ # @return if a block is given, the result of calling the block
61
+ # @return [Module] if a block is not given, _Warning_
62
+ #
63
+ # @see .enabled?
64
+ def enable(enabling)
65
+ previous_value = @disabled
66
+ @disabled = not!(enabling)
67
+ if block_given?
68
+ begin
69
+ return yield
70
+ ensure
71
+ @disabled = previous_value
72
+ end
73
+ end
74
+
75
+ self
76
+ end
77
+
78
+ # Indicates whether warning messages are enabled or disabled.
79
+ #
80
+ # @return [true] if warning messages are enabled
81
+ # @return [false] if warning messages are enabled
82
+ #
83
+ # @see .enable
84
+ def enabled?
85
+ not! @disabled
86
+ end
87
+
88
+ # Prints a warning message to _#io_ concerning a defined constant for which
89
+ # autoloading is being established.
90
+ #
91
+ # @param [Symbol] constant_name the name of the constant
92
+ # @param [String] source_filename the name of the autoloaded source file
93
+ # @param [String] host_source_location the file and line number of the source
94
+ # establishing autoloading
95
+ #
96
+ # @return [Module] _Warning_
97
+ def existing_constant(constant_name: raise(::ArgumentError,
98
+ 'missing keyword: constant_name'),
99
+ source_filename: raise(::ArgumentError,
100
+ 'missing keyword: source_filename'),
101
+ host_source_location: raise(::ArgumentError,
102
+ 'missing keyword: host_source_location'))
103
+ message = "Existing definition of \e[4m#{constant_name}\e[0m obviates " +
104
+ "autoloading from #{source_filename.inspect} -- avoid this " +
105
+ "warning by using an \e[4monly\e[0m or an \e[4mexcept\e[0m " +
106
+ "specification in the block at #{host_source_location}"
107
+ warn message
108
+ end
109
+
110
+ private
111
+
112
+ def not!(value)
113
+ value.nil? || (value == false)
114
+ end
115
+
116
+ def warn(message)
117
+ warning = "\e[33m*** \e[7m WARNING \e[0m #{message}"
118
+ io.puts(warning) if enabled?
119
+
120
+ self
121
+ end
122
+
123
+ end
124
+
125
+ end
@@ -0,0 +1,469 @@
1
+ RSpec.describe Autoloaded::Autoloader do
2
+ subject(:autoloader) { autoloader_class.new host_binding }
3
+
4
+ before :each do
5
+ allow(specifications_class).to receive(:new).and_return(specifications)
6
+ allow(inflector_class).to receive(:to_constant_name).
7
+ and_return(:FromInflection1,
8
+ :FromInflection2,
9
+ :FromInflection3,
10
+ :FromInflection4)
11
+ end
12
+
13
+ let(:autoloader_class) { described_class }
14
+
15
+ let(:host_binding) { self.class.class_eval 'binding', __FILE__, __LINE__ }
16
+
17
+ let(:directory_class) { Autoloaded::LoadPathedDirectory }
18
+
19
+ let(:specifications) { specifications_class.new }
20
+
21
+ let(:specifications_class) { Autoloaded::Specifications }
22
+
23
+ let(:specification_class) { Autoloaded::Specification }
24
+
25
+ let(:inflector_class) { Autoloaded::Inflection }
26
+
27
+ describe '.new' do
28
+ describe 'with nil argument' do
29
+ specify {
30
+ expect { autoloader_class.new nil }.to raise_error(ArgumentError,
31
+ "can't be nil")
32
+ }
33
+ end
34
+ end
35
+
36
+ describe '#from' do
37
+ subject(:from) { autoloader.from }
38
+
39
+ describe 'has expected default value' do
40
+ specify { is_expected.to eq(__FILE__.gsub(/\.rb$/, '')) }
41
+ end
42
+
43
+ describe 'rejects relative path argument' do
44
+ specify {
45
+ expect {
46
+ autoloader.from 'a/relative/path'
47
+ }.to raise_error(ArgumentError, "can't be relative")
48
+ }
49
+ end
50
+
51
+ describe 'operates as attribute reader and writer' do
52
+ specify {
53
+ autoloader.from '/an/absolute/path'
54
+ is_expected.to eq('/an/absolute/path')
55
+ }
56
+ end
57
+ end
58
+
59
+ describe '#except' do
60
+ specify("delegates to #{Autoloaded::Specifications.name}#except") {
61
+ expect(specifications.except).to be_empty
62
+ autoloader.except 'foo'
63
+ expect(specifications.except).to contain_exactly(specification_class.new('foo'))
64
+ }
65
+
66
+ describe 'where #only is specified' do
67
+ before :each do
68
+ autoloader.only :Foo
69
+ end
70
+
71
+ specify {
72
+ expect { autoloader.except :Bar }.to raise_error(RuntimeError,
73
+ "can't specify `except' when `only' is already specified")
74
+ }
75
+ end
76
+ end
77
+
78
+ describe '#only' do
79
+ specify("delegates to #{Autoloaded::Specifications.name}#only") {
80
+ expect(specifications.only).to be_empty
81
+ autoloader.only 'foo'
82
+ expect(specifications.only).to contain_exactly(specification_class.new('foo'))
83
+ }
84
+
85
+ describe 'where #except is specified' do
86
+ before :each do
87
+ autoloader.except :Foo
88
+ end
89
+
90
+ specify {
91
+ expect { autoloader.only :Bar }.to raise_error(RuntimeError,
92
+ "can't specify `only' when `except' is already specified")
93
+ }
94
+ end
95
+ end
96
+
97
+ describe '#with' do
98
+ specify("delegates to #{Autoloaded::Specifications.name}#with") {
99
+ expect(specifications.with).to be_empty
100
+ autoloader.with 'foo'
101
+ expect(specifications.with).to contain_exactly(specification_class.new('foo'))
102
+ }
103
+ end
104
+
105
+ describe '#autoload!' do
106
+ before :each do
107
+ allow_any_instance_of(directory_class).to receive(:closest_ruby_load_path).
108
+ and_return('/foo')
109
+ allow(directory_class).to receive(:new).and_return(directory)
110
+ allow(directory).to receive(:each_source_filename)
111
+ end
112
+
113
+ let(:directory) { directory_class.new '/foo' }
114
+
115
+ describe 'where #from is' do
116
+ describe 'not specified' do
117
+ describe "initializes #{Autoloaded::LoadPathedDirectory.name} with computed value" do
118
+ specify {
119
+ expect(directory_class).to receive(:new).
120
+ with(__FILE__.gsub(/\.rb$/, '')).
121
+ and_return(directory)
122
+ autoloader.autoload!
123
+ }
124
+ end
125
+ end
126
+
127
+ describe 'specified' do
128
+ before :each do
129
+ autoloader.from directory.path
130
+ allow(specifications).to receive(:except).
131
+ and_return(except_specifications)
132
+ allow(specifications).to receive(:only).
133
+ and_return(only_specifications)
134
+ allow(specifications).to receive(:with).
135
+ and_return(with_specifications)
136
+ end
137
+
138
+ let(:except_specifications) { [] }
139
+
140
+ let(:except_specification) { specification_class.new }
141
+
142
+ let(:only_specifications) { [] }
143
+
144
+ let(:only_specification) { specification_class.new }
145
+
146
+ let(:with_specifications) { [] }
147
+
148
+ let(:with_specification) { specification_class.new }
149
+
150
+ describe 'where no source files are found' do
151
+ specify {
152
+ expect(Kernel).not_to receive(:eval)
153
+ autoloader.autoload!
154
+ }
155
+
156
+ specify { expect(autoloader.autoload!).to be_empty }
157
+ end
158
+
159
+ describe 'where a source file is found' do
160
+ before :each do
161
+ allow(directory).to receive(:each_source_filename).
162
+ and_yield('from_each_source_filename')
163
+ end
164
+
165
+ describe 'and no specifications are provided' do
166
+ specify {
167
+ expect(Kernel).to receive(:eval).
168
+ with('autoload? :FromInflection1',
169
+ # host_binding,
170
+ # kind_of(String),
171
+ # kind_of(Numeric)).
172
+ host_binding).
173
+ ordered
174
+ expect(Kernel).to receive(:eval).
175
+ with('constants.include? :FromInflection1',
176
+ # host_binding,
177
+ # kind_of(String),
178
+ # kind_of(Numeric)).
179
+ host_binding).
180
+ ordered
181
+ expect(Kernel).to receive(:eval).
182
+ with('autoload :FromInflection1, "from_each_source_filename"',
183
+ # host_binding,
184
+ # kind_of(String),
185
+ # kind_of(Numeric)).
186
+ host_binding).
187
+ ordered
188
+ autoloader.autoload!
189
+ }
190
+
191
+ specify {
192
+ expect(autoloader.autoload!).to eq([[:FromInflection1,
193
+ 'from_each_source_filename']])
194
+ }
195
+ end
196
+
197
+ describe "and a `with' specification is provided" do
198
+ before :each do
199
+ allow(with_specification).to receive(:match).and_return(:FromWith)
200
+ end
201
+
202
+ let(:with_specifications) { [with_specification] }
203
+
204
+ specify {
205
+ expect(Kernel).to receive(:eval).
206
+ with('autoload? :FromWith',
207
+ # host_binding,
208
+ # kind_of(String),
209
+ # kind_of(Numeric)).
210
+ host_binding).
211
+ ordered
212
+ expect(Kernel).to receive(:eval).
213
+ with('constants.include? :FromWith',
214
+ # host_binding,
215
+ # kind_of(String),
216
+ # kind_of(Numeric)).
217
+ host_binding).
218
+ ordered
219
+ expect(Kernel).to receive(:eval).
220
+ with('autoload :FromWith, "from_each_source_filename"',
221
+ # host_binding,
222
+ # kind_of(String),
223
+ # kind_of(Numeric))
224
+ host_binding).
225
+ ordered
226
+ autoloader.autoload!
227
+ }
228
+
229
+ specify {
230
+ expect(autoloader.autoload!).to eq([[:FromWith,
231
+ 'from_each_source_filename']])
232
+ }
233
+ end
234
+
235
+ describe "and an `only' specification is provided" do
236
+ before :each do
237
+ allow(only_specification).to receive(:match).and_return(:FromOnly)
238
+ end
239
+
240
+ let(:only_specifications) { [only_specification] }
241
+
242
+ specify {
243
+ expect(Kernel).to receive(:eval).
244
+ with('autoload? :FromOnly',
245
+ # host_binding,
246
+ # kind_of(String),
247
+ # kind_of(Numeric)).
248
+ host_binding).
249
+ ordered
250
+ expect(Kernel).to receive(:eval).
251
+ with('constants.include? :FromOnly',
252
+ # host_binding,
253
+ # kind_of(String),
254
+ # kind_of(Numeric)).
255
+ host_binding).
256
+ ordered
257
+ expect(Kernel).to receive(:eval).
258
+ with('autoload :FromOnly, "from_each_source_filename"',
259
+ # host_binding,
260
+ # kind_of(String),
261
+ # kind_of(Numeric)).
262
+ host_binding).
263
+ ordered
264
+ autoloader.autoload!
265
+ }
266
+
267
+ specify { expect(autoloader.autoload!).to eq([[:FromOnly,
268
+ 'from_each_source_filename']]) }
269
+ end
270
+
271
+ describe "and both `with' and `only' specifications are provided" do
272
+ before :each do
273
+ allow(with_specification).to receive(:match).and_return(:FromWith)
274
+ allow(only_specification).to receive(:match).and_return(:FromOnly)
275
+ end
276
+
277
+ let(:with_specifications) { [with_specification] }
278
+
279
+ let(:only_specifications) { [only_specification] }
280
+
281
+ specify {
282
+ expect(Kernel).to receive(:eval).
283
+ with('autoload? :FromWith',
284
+ # host_binding,
285
+ # kind_of(String),
286
+ # kind_of(Numeric)).
287
+ host_binding).
288
+ ordered
289
+ expect(Kernel).to receive(:eval).
290
+ with('constants.include? :FromWith',
291
+ # host_binding,
292
+ # kind_of(String),
293
+ # kind_of(Numeric)).
294
+ host_binding).
295
+ ordered
296
+ expect(Kernel).to receive(:eval).
297
+ with('autoload :FromWith, "from_each_source_filename"',
298
+ # host_binding,
299
+ # kind_of(String),
300
+ # kind_of(Numeric)).
301
+ host_binding).
302
+ ordered
303
+ autoloader.autoload!
304
+ }
305
+
306
+ specify { expect(autoloader.autoload!).to eq([[:FromWith,
307
+ 'from_each_source_filename']]) }
308
+ end
309
+ end
310
+
311
+ describe 'where multiple source files are found' do
312
+ before :each do
313
+ allow(directory).to receive(:each_source_filename).
314
+ and_yield('from_each_source_filename1').
315
+ and_yield('from_each_source_filename2').
316
+ and_yield('from_each_source_filename3')
317
+ end
318
+
319
+ describe 'and no specifications are provided' do
320
+ specify {
321
+ expect(Kernel).to receive(:eval).
322
+ with('autoload? :FromInflection1',
323
+ # host_binding,
324
+ # kind_of(String),
325
+ # kind_of(Numeric)).
326
+ host_binding).
327
+ ordered
328
+ expect(Kernel).to receive(:eval).
329
+ with('constants.include? :FromInflection1',
330
+ # host_binding,
331
+ # kind_of(String),
332
+ # kind_of(Numeric)).
333
+ host_binding).
334
+ ordered
335
+ expect(Kernel).to receive(:eval).
336
+ with('autoload :FromInflection1, "from_each_source_filename1"',
337
+ # host_binding,
338
+ # kind_of(String),
339
+ # kind_of(Numeric)).
340
+ host_binding).
341
+ ordered
342
+ expect(Kernel).to receive(:eval).
343
+ with('autoload? :FromInflection2',
344
+ # host_binding,
345
+ # kind_of(String),
346
+ # kind_of(Numeric)).
347
+ host_binding).
348
+ ordered
349
+ expect(Kernel).to receive(:eval).
350
+ with('constants.include? :FromInflection2',
351
+ # host_binding,
352
+ # kind_of(String),
353
+ # kind_of(Numeric)).
354
+ host_binding).
355
+ ordered
356
+ expect(Kernel).to receive(:eval).
357
+ with('autoload :FromInflection2, "from_each_source_filename2"',
358
+ # host_binding,
359
+ # kind_of(String),
360
+ # kind_of(Numeric)).
361
+ host_binding).
362
+ ordered
363
+ expect(Kernel).to receive(:eval).
364
+ with('autoload? :FromInflection3',
365
+ # host_binding,
366
+ # kind_of(String),
367
+ # kind_of(Numeric)).
368
+ host_binding).
369
+ ordered
370
+ expect(Kernel).to receive(:eval).
371
+ with('constants.include? :FromInflection3',
372
+ # host_binding,
373
+ # kind_of(String),
374
+ # kind_of(Numeric)).
375
+ host_binding).
376
+ ordered
377
+ expect(Kernel).to receive(:eval).
378
+ with('autoload :FromInflection3, "from_each_source_filename3"',
379
+ # host_binding,
380
+ # kind_of(String),
381
+ # kind_of(Numeric)).
382
+ host_binding).
383
+ ordered
384
+ autoloader.autoload!
385
+ }
386
+
387
+ specify {
388
+ expect(autoloader.autoload!).to eq([[:FromInflection1,
389
+ 'from_each_source_filename1'],
390
+ [:FromInflection2,
391
+ 'from_each_source_filename2'],
392
+ [:FromInflection3,
393
+ 'from_each_source_filename3']])
394
+ }
395
+ end
396
+
397
+ describe "and a matching `except' specification is provided" do
398
+ before :each do
399
+ allow(except_specification).to receive(:match).
400
+ with('from_each_source_filename1').
401
+ and_return(nil)
402
+ allow(except_specification).to receive(:match).
403
+ with('from_each_source_filename2').
404
+ and_return(:FromExcept)
405
+ allow(except_specification).to receive(:match).
406
+ with('from_each_source_filename3').
407
+ and_return(nil)
408
+ end
409
+
410
+ let(:except_specifications) { [except_specification] }
411
+
412
+ specify {
413
+ expect(Kernel).to receive(:eval).
414
+ with('autoload? :FromInflection1',
415
+ # host_binding,
416
+ # kind_of(String),
417
+ # kind_of(Numeric)).
418
+ host_binding).
419
+ ordered
420
+ expect(Kernel).to receive(:eval).
421
+ with('constants.include? :FromInflection1',
422
+ # host_binding,
423
+ # kind_of(String),
424
+ # kind_of(Numeric)).
425
+ host_binding).
426
+ ordered
427
+ expect(Kernel).to receive(:eval).
428
+ with('autoload :FromInflection1, "from_each_source_filename1"',
429
+ # host_binding,
430
+ # kind_of(String),
431
+ # kind_of(Numeric)).
432
+ host_binding).
433
+ ordered
434
+ expect(Kernel).to receive(:eval).
435
+ with('autoload? :FromInflection2',
436
+ # host_binding,
437
+ # kind_of(String),
438
+ # kind_of(Numeric)).
439
+ host_binding).
440
+ ordered
441
+ expect(Kernel).to receive(:eval).
442
+ with('constants.include? :FromInflection2',
443
+ # host_binding,
444
+ # kind_of(String),
445
+ # kind_of(Numeric)).
446
+ host_binding).
447
+ ordered
448
+ expect(Kernel).to receive(:eval).
449
+ with('autoload :FromInflection2, "from_each_source_filename3"',
450
+ # host_binding,
451
+ # kind_of(String),
452
+ # kind_of(Numeric)).
453
+ host_binding).
454
+ ordered
455
+ autoloader.autoload!
456
+ }
457
+
458
+ specify {
459
+ expect(autoloader.autoload!).to eq([[:FromInflection1,
460
+ 'from_each_source_filename1'],
461
+ [:FromInflection2,
462
+ 'from_each_source_filename3']])
463
+ }
464
+ end
465
+ end
466
+ end
467
+ end
468
+ end
469
+ end