autoloaded 1.2.0 → 1.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +1 -1
- data/History.md +4 -0
- data/README.md +411 -60
- data/autoloaded.gemspec +19 -14
- data/lib/autoloaded.rb +104 -91
- data/lib/autoloaded/autoloader.rb +260 -0
- data/lib/autoloaded/compatibility/refine_and_using.rb +2 -0
- data/lib/autoloaded/constant.rb +5 -2
- data/lib/autoloaded/deprecation.rb +50 -0
- data/lib/autoloaded/inflection.rb +71 -0
- data/lib/autoloaded/load_pathed_directory.rb +112 -0
- data/lib/autoloaded/refine.rb +7 -1
- data/lib/autoloaded/refine/string.rb +7 -0
- data/lib/autoloaded/refine/string/to_source_filename.rb +12 -0
- data/lib/autoloaded/specification.rb +97 -0
- data/lib/autoloaded/specifications.rb +66 -0
- data/lib/autoloaded/version.rb +3 -1
- data/lib/autoloaded/warning.rb +125 -0
- data/spec/autoloaded/autoloader_spec.rb +469 -0
- data/spec/autoloaded/constant_spec.rb +0 -2
- data/spec/autoloaded/deprecation_spec.rb +23 -0
- data/spec/autoloaded/inflection_spec.rb +30 -0
- data/spec/autoloaded/load_pathed_directory_spec.rb +120 -0
- data/spec/autoloaded/refine/string/to_source_filename_spec.rb +0 -2
- data/spec/autoloaded/specification_spec.rb +98 -0
- data/spec/autoloaded/specifications_spec.rb +191 -0
- data/spec/autoloaded/version_spec.rb +0 -2
- data/spec/autoloaded/warning_spec.rb +115 -0
- data/spec/autoloaded_macro_sharedspec.rb +24 -0
- data/spec/autoloaded_spec.rb +277 -95
- data/spec/fixtures/autoloaded_with_conventional_filename.rb +3 -1
- data/spec/fixtures/autoloaded_with_conventional_filename/nested.rb +12 -1
- data/spec/fixtures/autoloaded_with_conventional_filename/nested/doubly_nested.rb +9 -0
- data/spec/fixtures/autoloaded_with_unconventional_filename.rb +12 -0
- data/spec/fixtures/autoloaded_with_unconventional_filename/N-est-ed.rb +7 -0
- data/spec/fixtures/autoloaded_with_unconventional_filename/nest_ed.rb +1 -0
- data/spec/fixtures/autoloaded_with_unconventional_filename/old_school_autoload.rb +5 -0
- data/spec/fixtures/not_autoloaded/nested.rb +1 -0
- data/spec/fixtures/old_api/autoloaded_with_conventional_filename.rb +10 -0
- data/spec/fixtures/old_api/autoloaded_with_conventional_filename/N-est-ed.rb +1 -0
- data/spec/fixtures/old_api/autoloaded_with_conventional_filename/nest_ed.rb +1 -0
- data/spec/fixtures/old_api/autoloaded_with_conventional_filename/nested.rb +5 -0
- data/spec/fixtures/old_api/autoloaded_with_conventional_filename/old_school_autoload.rb +5 -0
- data/spec/fixtures/{autoloaded_with_conventional_filename_only.rb → old_api/autoloaded_with_conventional_filename_only.rb} +1 -1
- data/spec/fixtures/{autoloaded_with_conventional_filename_only → old_api/autoloaded_with_conventional_filename_only}/nested.rb +0 -0
- data/spec/fixtures/{autoloaded_with_conventional_filename_only → old_api/autoloaded_with_conventional_filename_only}/old_school_autoload.rb +0 -0
- data/spec/fixtures/{autoloaded_with_unconventional_filenames.rb → old_api/autoloaded_with_unconventional_filenames.rb} +1 -1
- data/spec/fixtures/{autoloaded_with_unconventional_filenames → old_api/autoloaded_with_unconventional_filenames}/N-est-ed.rb +0 -0
- data/spec/fixtures/{autoloaded_with_unconventional_filenames → old_api/autoloaded_with_unconventional_filenames}/nest_ed.rb +0 -0
- data/spec/fixtures/{autoloaded_with_unconventional_filenames → old_api/autoloaded_with_unconventional_filenames}/old_school_autoload.rb +0 -0
- data/spec/fixtures/old_api/not_autoloaded.rb +6 -0
- data/spec/fixtures/old_api/not_autoloaded/nested.rb +1 -0
- data/spec/fixtures/old_api/not_autoloaded/old_school_autoload.rb +5 -0
- data/spec/matchers.rb +4 -33
- data/spec/spec_helper.rb +2 -0
- metadata +95 -41
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d675263480f333ea77af9172b0350774ce55a4e3
|
4
|
+
data.tar.gz: 167f64690ba5c4d7c1620859c363dad0b561cd38
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: adade785b5342753a9561d3c0a6e1efcda22cf9ce8ef20ab13313b98532cf9db8ff9bb7ac43dd776cbbb0b29813c4b69cd711eae5278e93b14a0ac38567f71b6
|
7
|
+
data.tar.gz: aff0f5212fd8a289acaddc73e69275e7c1da5225be45f956f0094d3ac37e3e9393533a9802c08e2ab0eeec110e5c79e2fe599521e09c5b0782e430ec73190f7b
|
data/.travis.yml
CHANGED
data/History.md
CHANGED
@@ -1,5 +1,9 @@
|
|
1
1
|
# Version history for the _Autoloaded_ project
|
2
2
|
|
3
|
+
## <a name="v1.3.0"></a>v1.3.0, Fri 12/26/2013
|
4
|
+
|
5
|
+
* Add support for relative class references with a new API
|
6
|
+
|
3
7
|
## <a name="v1.2.0"></a>v1.2.0, Fri 11/28/2013
|
4
8
|
|
5
9
|
* Add support for [JRuby][JRuby] (Ruby v2.x-compatible versions)
|
data/README.md
CHANGED
@@ -5,19 +5,21 @@
|
|
5
5
|
[![Travis CI build status] ][Travis-CI-build-status]
|
6
6
|
[![Code Climate quality report] ][Code-Climate-report]
|
7
7
|
[![Code Climate coverage report]][Code-Climate-report]
|
8
|
+
|
8
9
|
[![Gemnasium build status] ][Gemnasium-build-status]
|
9
10
|
[![Inch CI build status] ][Inch-CI-build-status]
|
10
11
|
[![RubyGems release] ][RubyGems-release]
|
11
12
|
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
[ActiveSupport][ActiveSupport-Autoload]
|
13
|
+
If you like the [_Module#autoload_][Ruby-Core-Module-autoload] feature of the
|
14
|
+
Ruby Core library, you may have wished for _Autoloaded_. It eliminates the
|
15
|
+
drudgery of handcrafting an `autoload` statement for each Ruby source code file
|
16
|
+
in your project. It also avoids the limitations of rigid convention-driven
|
17
|
+
facilities such as those provided by the [ActiveSupport][ActiveSupport-Autoload]
|
18
|
+
RubyGem.
|
17
19
|
|
18
|
-
|
19
|
-
|
20
|
-
|
20
|
+
_Autoloaded_ assumes, but does not enforce, `CamelCase`-to-`snake_case`
|
21
|
+
correspondence between the names of constants and source files. You can combine
|
22
|
+
conventions, even putting multiple autoloaded constants in a single source file.
|
21
23
|
|
22
24
|
## Installation
|
23
25
|
|
@@ -25,8 +27,20 @@ Install [the RubyGem][RubyGems-release].
|
|
25
27
|
|
26
28
|
$ gem install autoloaded
|
27
29
|
|
28
|
-
|
29
|
-
|
30
|
+
Use _Autoloaded_ in your RubyGem project by making it a runtime dependency.
|
31
|
+
|
32
|
+
```ruby
|
33
|
+
# my_awesome_gem.gemspec
|
34
|
+
|
35
|
+
Gem::Specification.new do |spec|
|
36
|
+
# ...
|
37
|
+
spec.add_dependency 'autoloaded', '~> 1'
|
38
|
+
# ...
|
39
|
+
end
|
40
|
+
```
|
41
|
+
|
42
|
+
Or you may want to make _Autoloaded_ a dependency of your project by using
|
43
|
+
[Bundler][Bundler].
|
30
44
|
|
31
45
|
```ruby
|
32
46
|
# Gemfile
|
@@ -38,99 +52,435 @@ gem 'autoloaded', '~> 1'
|
|
38
52
|
|
39
53
|
## Usage
|
40
54
|
|
41
|
-
Suppose you have the following source files
|
55
|
+
Suppose you have the following source files.
|
56
|
+
|
57
|
+
lib/
|
58
|
+
├─ my_awesome_gem/
|
59
|
+
│ ├─ db/
|
60
|
+
│ │ ├─ MicroSoft.rb
|
61
|
+
│ │ ├─ SELF-DESTRUCT!.rb
|
62
|
+
│ │ ├─ mysql.rb
|
63
|
+
│ │ ├─ oracle.rb
|
64
|
+
│ │ └─ postgre_sql.rb
|
65
|
+
│ ├─ db.rb
|
66
|
+
│ └─ version.rb
|
67
|
+
└─ my_awesome_gem.rb
|
68
|
+
|
69
|
+
### The _Autoloaded.module_ or _Autoloaded.class_ method
|
42
70
|
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
* postgresql.rb
|
48
|
-
* sql_server.rb
|
49
|
-
* db.rb
|
50
|
-
* my_awesome_gem.rb
|
71
|
+
The _Autoloaded.module_ and _Autoloaded.class_ method calls below invoke
|
72
|
+
[_Module#autoload_][Ruby-Core-Module-autoload] for each source file in the
|
73
|
+
calling module’s corresponding directory. Note that these methods must receive a
|
74
|
+
block, even if it’s an empty block.
|
51
75
|
|
52
|
-
The
|
76
|
+
The file paths used are abbreviated, if possible, using a directory of the Ruby
|
77
|
+
load path (`$:`). They are also rendered without their _.rb_ extension.
|
53
78
|
|
54
79
|
```ruby
|
55
80
|
# lib/my_awesome_gem.rb
|
56
81
|
module MyAwesomeGem
|
57
82
|
|
58
|
-
|
83
|
+
Autoloaded.module { }
|
84
|
+
|
85
|
+
# The above is the equivalent of:
|
86
|
+
#
|
87
|
+
# autoload :Db, 'my_awesome_gem/db'
|
88
|
+
# autoload :Version, 'my_awesome_gem/version'
|
59
89
|
|
60
90
|
end
|
61
91
|
|
62
92
|
# lib/my_awesome_gem/db.rb
|
63
93
|
module MyAwesomeGem
|
64
94
|
|
65
|
-
|
95
|
+
class DB
|
96
|
+
|
97
|
+
# The 'class' and 'module' methods are aliases -- use either one.
|
98
|
+
Autoloaded.class { }
|
66
99
|
|
67
|
-
|
100
|
+
# The above is the equivalent of:
|
101
|
+
#
|
102
|
+
# autoload :MicroSoft, 'my_awesome_gem/db/MicroSoft'
|
103
|
+
# autoload :SELF_DESTRUCT_, 'my_awesome_gem/db/SELF-DESTRUCT!'
|
104
|
+
# autoload :Mysql, 'my_awesome_gem/db/mysql'
|
105
|
+
# autoload :Oracle, 'my_awesome_gem/db/oracle'
|
106
|
+
# autoload :PostgreSql, 'my_awesome_gem/db/postgre_sql'
|
68
107
|
|
69
108
|
end
|
70
109
|
|
71
110
|
end
|
72
111
|
```
|
73
112
|
|
74
|
-
|
113
|
+
The code above is succinct, but it’s not exactly correct. The constants
|
114
|
+
`MyAwesomeGem::DB`, `MyAwesomeGem::DB::MySQL`, and others are not set up to
|
115
|
+
autoload properly because they are misspelled (case-sensitively speaking).
|
75
116
|
|
76
117
|
```ruby
|
77
|
-
|
78
|
-
#
|
79
|
-
MyAwesomeGem
|
80
|
-
|
81
|
-
#
|
82
|
-
#
|
83
|
-
|
84
|
-
MyAwesomeGem
|
85
|
-
MyAwesomeGem
|
86
|
-
MyAwesomeGem
|
87
|
-
|
88
|
-
|
89
|
-
MyAwesomeGem::DB::
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
118
|
+
MyAwesomeGem.autoload? :DB # => nil
|
119
|
+
MyAwesomeGem.const_defined? :DB # => false
|
120
|
+
MyAwesomeGem.constants.include? :DB # => false
|
121
|
+
|
122
|
+
MyAwesomeGem::DB # Raises NameError because lib/my_awesome_gem/db.rb does not
|
123
|
+
# get autoloaded!
|
124
|
+
|
125
|
+
MyAwesomeGem.autoload? :Db # => 'my_awesome_gem/db' (a lie!)
|
126
|
+
MyAwesomeGem.const_defined? :Db # => true (a lie!)
|
127
|
+
MyAwesomeGem.constants.include? :Db # => true (a lie!)
|
128
|
+
|
129
|
+
MyAwesomeGem::Db # Raises NameError because lib/my_awesome_gem/db.rb defines
|
130
|
+
# MyAwesomeGem::DB, not MyAwesomeGem::Db!
|
131
|
+
|
132
|
+
#################################################################################
|
133
|
+
|
134
|
+
require 'my_awesome_gem/db'
|
135
|
+
|
136
|
+
MyAwesomeGem::DB.autoload? :MySQL # => nil
|
137
|
+
MyAwesomeGem::DB.const_defined? :MySQL # => false
|
138
|
+
MyAwesomeGem::DB.constants.include? :MySQL # => false
|
139
|
+
|
140
|
+
MyAwesomeGem::DB::MySQL # Raises NameError because
|
141
|
+
# lib/my_awesome_gem/db/mysql.rb does not get
|
142
|
+
# autoloaded!
|
143
|
+
|
144
|
+
MyAwesomeGem::DB.autoload? :Mysql # => 'my_awesome_gem/db/mysql' (a lie!)
|
145
|
+
MyAwesomeGem::DB.const_defined? :Mysql # => true (a lie!)
|
146
|
+
MyAwesomeGem::DB.constants.include? :Mysql # => true (a lie!)
|
147
|
+
|
148
|
+
MyAwesomeGem::DB::Mysql # Raises NameError because
|
149
|
+
# lib/my_awesome_gem/db/mysql.rb defines
|
150
|
+
# MyAwesomeGem::DB::MySQL, not MyAwesomeGem::DB::Mysql!
|
95
151
|
```
|
96
152
|
|
97
|
-
|
98
|
-
|
153
|
+
### The `with` specification
|
154
|
+
|
155
|
+
_Autoloaded_ needs hints from you concerning unpredictable spellings,
|
156
|
+
stylization, and organization of constant names and/or source file names. You can
|
157
|
+
specify `with` as:
|
99
158
|
|
100
|
-
|
159
|
+
* A symbol or array of symbols representing constants to autoload
|
160
|
+
* A hash of symbols and strings representing constants and the source filename(s)
|
161
|
+
from which to autoload them
|
162
|
+
* A combination of the above
|
101
163
|
|
102
|
-
|
103
|
-
|
104
|
-
path of the namespace to establish which directory will be autoloaded. That path
|
105
|
-
is discoverable only via the stack trace of `extend Autoloaded`.
|
164
|
+
A symbol provided to `with` signifies the name of a constant, and a string
|
165
|
+
signifies the name of a source file.
|
106
166
|
|
107
|
-
|
108
|
-
|
109
|
-
|
167
|
+
Specifying `with` does not filter the source files; it maps the source files to
|
168
|
+
different constants, or tweaks the names of constants.
|
169
|
+
|
170
|
+
You can specify `with` multiple times, and its effects are cumulative.
|
110
171
|
|
111
172
|
```ruby
|
112
173
|
# lib/my_awesome_gem.rb
|
113
|
-
module MyAwesomeGem
|
174
|
+
module MyAwesomeGem
|
175
|
+
|
176
|
+
Autoloaded.module do |autoloaded|
|
177
|
+
autoloaded.with :DB, :VERSION
|
178
|
+
# Or:
|
179
|
+
# autoloaded.with :DB
|
180
|
+
# autoloaded.with :VERSION
|
181
|
+
# Or:
|
182
|
+
# autoloaded.with DB: 'db', VERSION: 'version'
|
183
|
+
# Or:
|
184
|
+
# autoloaded.with DB: 'db'
|
185
|
+
# autoloaded.with VERSION: 'version'
|
186
|
+
# Or:
|
187
|
+
# autoloaded.with 'db' => :DB, 'version' => :VERSION
|
188
|
+
# Or:
|
189
|
+
# autoloaded.with 'db' => :DB
|
190
|
+
# autoloaded.with 'version' => :VERSION
|
191
|
+
end
|
192
|
+
|
193
|
+
# The above is the equivalent of:
|
194
|
+
#
|
195
|
+
# autoload :DB, 'my_awesome_gem/db'
|
196
|
+
# autoload :VERSION, 'my_awesome_gem/version'
|
197
|
+
|
198
|
+
end
|
199
|
+
|
200
|
+
# lib/my_awesome_gem/db.rb
|
201
|
+
module MyAwesomeGem
|
202
|
+
|
203
|
+
class DB
|
204
|
+
|
205
|
+
Autoloaded.class do |autoloaded|
|
206
|
+
autoloaded.with :MySQL, :PostgreSQL, [:Access, :SQLServer] => 'MicroSoft'
|
207
|
+
# Or:
|
208
|
+
# autoloaded.with :MySQL,
|
209
|
+
# :PostgreSQL,
|
210
|
+
# Access: 'MicroSoft',
|
211
|
+
# SQLServer: 'MicroSoft'
|
212
|
+
# Or:
|
213
|
+
# autoloaded.with :MySQL, :PostgreSQL, 'MicroSoft' => [:Access, :SQLServer]
|
214
|
+
# Or:
|
215
|
+
# autoloaded.with :MySQL,
|
216
|
+
# :PostgreSQL,
|
217
|
+
# 'MicroSoft' => :Access,
|
218
|
+
# 'MicroSoft' => :SQLServer
|
219
|
+
# Or ...
|
220
|
+
end
|
221
|
+
|
222
|
+
# The above is the equivalent of:
|
223
|
+
#
|
224
|
+
# autoload :Access, 'my_awesome_gem/db/MicroSoft'
|
225
|
+
# autoload :SQLServer, 'my_awesome_gem/db/MicroSoft'
|
226
|
+
# autoload :SELF_DESTRUCT_, 'my_awesome_gem/db/SELF-DESTRUCT!'
|
227
|
+
# autoload :MySQL, 'my_awesome_gem/db/mysql'
|
228
|
+
# autoload :Oracle, 'my_awesome_gem/db/oracle'
|
229
|
+
# autoload :PostgreSQL, 'my_awesome_gem/db/postgre_sql'
|
230
|
+
|
231
|
+
end
|
232
|
+
|
233
|
+
end
|
234
|
+
```
|
235
|
+
|
236
|
+
Now you’re autoloading all the constants you want to be autoloading.
|
237
|
+
|
238
|
+
```ruby
|
239
|
+
MyAwesomeGem.autoload? :DB # => 'my_awesome_gem/db'
|
240
|
+
MyAwesomeGem.const_defined? :DB # => true
|
241
|
+
MyAwesomeGem.constants.include? :DB # => true
|
242
|
+
|
243
|
+
MyAwesomeGem::DB # => MyAwesomeGem::DB
|
244
|
+
|
245
|
+
MyAwesomeGem.autoload? :Db # => nil
|
246
|
+
MyAwesomeGem.const_defined? :Db # => false
|
247
|
+
MyAwesomeGem.constants.include? :Db # => false
|
248
|
+
|
249
|
+
MyAwesomeGem::Db # Raises NameError as expected.
|
250
|
+
|
251
|
+
#################################################################################
|
252
|
+
|
253
|
+
MyAwesomeGem::DB.autoload? :MySQL # => 'my_awesome_gem/db/mysql'
|
254
|
+
MyAwesomeGem::DB.const_defined? :MySQL # => true
|
255
|
+
MyAwesomeGem::DB.constants.include? :MySQL # => true
|
256
|
+
|
257
|
+
MyAwesomeGem::DB::MySQL # => MyAwesomeGem::DB::MySQL
|
258
|
+
|
259
|
+
MyAwesomeGem::DB.autoload? :Mysql # => nil
|
260
|
+
MyAwesomeGem::DB.const_defined? :Mysql # => false
|
261
|
+
MyAwesomeGem::DB.constants.include? :Mysql # => false
|
262
|
+
|
263
|
+
MyAwesomeGem::DB::Mysql # Raises NameError as expected.
|
264
|
+
```
|
265
|
+
|
266
|
+
### The `except` and `only` specifications
|
267
|
+
|
268
|
+
What about source files you **don’t** want to be autoloaded?
|
269
|
+
|
270
|
+
```ruby
|
271
|
+
MyAwesomeGem::DB::SELF_DESTRUCT_ # Loading this file does something bad, so
|
272
|
+
# let's not.
|
273
|
+
```
|
274
|
+
|
275
|
+
If you really want to avoid loading *lib/my_awesome_gem/db/SELF-DESTRUCT!.rb*, so
|
276
|
+
much so that you don’t want an `autoload` statement made for it, specify
|
277
|
+
`except`.
|
278
|
+
|
279
|
+
```ruby
|
280
|
+
# lib/my_awesome_gem/db.rb
|
281
|
+
|
282
|
+
module MyAwesomeGem
|
283
|
+
|
284
|
+
class DB
|
285
|
+
|
286
|
+
Autoloaded.class do |autoloaded|
|
287
|
+
autoloaded.with :MySQL, :PostgreSQL, [:Access, :SQLServer] => 'MicroSoft'
|
288
|
+
|
289
|
+
autoloaded.except 'SELF-DESTRUCT!'
|
290
|
+
# Or:
|
291
|
+
# autoloaded.except :SELF_DESTRUCT_
|
292
|
+
# Or ...
|
293
|
+
end
|
294
|
+
|
295
|
+
# The above is the equivalent of:
|
296
|
+
#
|
297
|
+
# autoload :Access, 'my_awesome_gem/db/MicroSoft'
|
298
|
+
# autoload :SQLServer, 'my_awesome_gem/db/MicroSoft'
|
299
|
+
# autoload :MySQL, 'my_awesome_gem/db/mysql'
|
300
|
+
# autoload :Oracle, 'my_awesome_gem/db/oracle'
|
301
|
+
# autoload :PostgreSQL, 'my_awesome_gem/db/postgre_sql'
|
302
|
+
|
303
|
+
end
|
304
|
+
|
305
|
+
end
|
306
|
+
```
|
114
307
|
|
308
|
+
```ruby
|
309
|
+
MyAwesomeGem::DB.autoload? :SELF_DESTRUCT_ # => nil
|
310
|
+
MyAwesomeGem::DB.const_defined? :SELF_DESTRUCT_ # => false
|
311
|
+
MyAwesomeGem::DB.constants.include? :SELF_DESTRUCT_ # => false
|
312
|
+
|
313
|
+
MyAwesomeGem::DB::SELF_DESTRUCT_ # Raises NameError as expected.
|
314
|
+
```
|
315
|
+
|
316
|
+
You can specify `except` as:
|
317
|
+
|
318
|
+
* A symbol or array of symbols representing constants to avoid autoloading
|
319
|
+
* A string or array of strings representing source filenames to avoid autoloading
|
320
|
+
* A hash of symbols and/or strings representing constants and/or source filenames
|
321
|
+
to avoid autoloading
|
322
|
+
* A combination of the above
|
323
|
+
|
324
|
+
The `only` specification is like `except` but it has the opposite effect, namely,
|
325
|
+
that **only** specified constants and/or source files will be autoloaded.
|
326
|
+
|
327
|
+
You can specify `only` as:
|
328
|
+
|
329
|
+
* A symbol or array of symbols representing constants to autoload
|
330
|
+
* A string or array of strings representing source filenames to autoload
|
331
|
+
* A hash of symbols and/or strings representing constants and the source
|
332
|
+
filename(s) from which to autoload them
|
333
|
+
* A combination of the above
|
334
|
+
|
335
|
+
A symbol provided to `except` or `only` signifies the name of a constant, and a
|
336
|
+
string signifies the name of a source file.
|
337
|
+
|
338
|
+
You can specify `except` and `only` multiple times, and their effects are
|
339
|
+
cumulative.
|
340
|
+
|
341
|
+
### The `from` specification
|
342
|
+
|
343
|
+
It’s recommended that you call _Autoloaded.module_ or _Autoloaded.class_ from
|
344
|
+
within the source file where your module or class is defined. This practice
|
345
|
+
allows _Autoloaded_ to assume that the source files to be autoloaded are in a
|
346
|
+
directory of the same name (and in the same location) as the module’s defining
|
347
|
+
source file.
|
348
|
+
|
349
|
+
There are circumstances, however, in which you cannot rely on the computed
|
350
|
+
directory for autoloading. Perhaps the directory has a different name from the
|
351
|
+
module’s defining source file. Or perhaps you are autoloading a library that you
|
352
|
+
didn’t author. In these situations you can specify `from` with the path from
|
353
|
+
which source files should be autoloaded.
|
354
|
+
|
355
|
+
```ruby
|
356
|
+
# somewhere_else.rb
|
357
|
+
|
358
|
+
module MyAwesomeGem
|
359
|
+
|
360
|
+
Autoloaded.module do |autoloaded|
|
361
|
+
# The following code is not actually very useful since the installed location
|
362
|
+
# of a RubyGem varies with the operating system and user preferences. How to
|
363
|
+
# compute the path properly is outside the scope of this readme and is left
|
364
|
+
# as an exercise for the reader.
|
365
|
+
autoloaded.from '/absolute/path/to/my_awesome_gem'
|
366
|
+
end
|
367
|
+
|
368
|
+
end
|
369
|
+
```
|
370
|
+
|
371
|
+
A path provided to `from` cannot be relative; it must start with the filesystem
|
372
|
+
root.
|
373
|
+
|
374
|
+
If you specify `from` multiple times in an _Autoloaded_ block, only the last one
|
375
|
+
takes effect.
|
376
|
+
|
377
|
+
### The _Autoloaded.warn_ method
|
378
|
+
|
379
|
+
There are two circumstances under which _Autoloaded_ by default will write
|
380
|
+
warnings to stderr:
|
381
|
+
|
382
|
+
* Overriding an established autoload
|
383
|
+
* Establishing an autoload for a defined constant
|
384
|
+
|
385
|
+
You can silence these warnings by passing `false` to _Autoloaded.warn_. (Passing
|
386
|
+
`true` turns warnings on if they are off.)
|
387
|
+
|
388
|
+
```ruby
|
115
389
|
# lib/my_awesome_gem/db.rb
|
390
|
+
|
116
391
|
module MyAwesomeGem
|
117
392
|
|
118
|
-
|
119
|
-
|
393
|
+
class DB
|
394
|
+
|
395
|
+
Autoloaded.warn false # Turn off Autoloaded warnings.
|
120
396
|
|
121
|
-
|
397
|
+
autoload :SQLServer, 'my_awesome_gem/db/MicroSoft'
|
122
398
|
|
123
|
-
|
399
|
+
class Oracle; end
|
400
|
+
|
401
|
+
Autoloaded.class { } # This duplicates the 'autoload' statement and class
|
402
|
+
# definition above, but no Autoloaded warnings will be
|
403
|
+
# displayed.
|
404
|
+
|
405
|
+
Autoloaded.warn true # Turn on Autoloaded warnings again.
|
124
406
|
|
125
407
|
end
|
126
408
|
|
127
409
|
end
|
410
|
+
```
|
411
|
+
|
412
|
+
Use the block form if you want to ensure warnings get toggled on or off for a
|
413
|
+
series of statements.
|
128
414
|
|
129
|
-
|
130
|
-
|
131
|
-
|
415
|
+
```ruby
|
416
|
+
# lib/my_awesome_gem/db.rb
|
417
|
+
|
418
|
+
module MyAwesomeGem
|
419
|
+
|
420
|
+
class DB
|
421
|
+
|
422
|
+
autoload :SQLServer, 'my_awesome_gem/db/MicroSoft'
|
423
|
+
|
424
|
+
class Oracle; end
|
425
|
+
|
426
|
+
Autoloaded.warn false do
|
427
|
+
Autoloaded.class { } # This duplicates the 'autoload' statement and class
|
428
|
+
# definition above, but no Autoloaded warnings will
|
429
|
+
# be displayed.
|
430
|
+
end
|
431
|
+
|
432
|
+
# Autoloaded warnings are turned on again automatically.
|
433
|
+
|
434
|
+
end
|
435
|
+
|
436
|
+
end
|
132
437
|
```
|
133
438
|
|
439
|
+
### How to debug autoloading
|
440
|
+
|
441
|
+
The _Autoloaded.module_ or _Autoloaded.class_ method returns an ordered list of
|
442
|
+
arguments it has passed to `autoload`.
|
443
|
+
|
444
|
+
```ruby
|
445
|
+
# lib/my_awesome_gem/db.rb
|
446
|
+
|
447
|
+
module MyAwesomeGem
|
448
|
+
|
449
|
+
class DB
|
450
|
+
|
451
|
+
results = Autoloaded.class do |autoloaded|
|
452
|
+
autoloaded.with :MySQL, :PostgreSQL, [:Access, :SQLServer] => 'MicroSoft'
|
453
|
+
autoloaded.except 'SELF-DESTRUCT!'
|
454
|
+
end
|
455
|
+
STDOUT.puts results.inspect # See output below.
|
456
|
+
|
457
|
+
end
|
458
|
+
|
459
|
+
end
|
460
|
+
|
461
|
+
# [[:Access, 'my_awesome_gem/db/MicroSoft' ],
|
462
|
+
# [:SQLServer, 'my_awesome_gem/db/MicroSoft' ],
|
463
|
+
# [:MySQL, 'my_awesome_gem/db/mysql' ],
|
464
|
+
# [:Oracle, 'my_awesome_gem/db/oracle' ],
|
465
|
+
# [:PostgreSQL, 'my_awesome_gem/db/postgre_sql']]
|
466
|
+
```
|
467
|
+
|
468
|
+
You can also hook [_Module#autoload_][Ruby-Core-Module-autoload] and
|
469
|
+
[_Kernel#autoload_][Ruby-Core-Kernel-autoload] via monkeypatching or other means
|
470
|
+
in order to see what’s happening.
|
471
|
+
|
472
|
+
### Source filenames are relative to the `from` specification
|
473
|
+
|
474
|
+
You may have noticed that source filenames in the above examples are not
|
475
|
+
absolute. They are relative to the _Autoloaded_ block’s `from` specification
|
476
|
+
(which I recommend that you allow to be computed for you —
|
477
|
+
[see above](#the-from-specification)).
|
478
|
+
|
479
|
+
### Recursive autoloading not supported
|
480
|
+
|
481
|
+
_Autoloaded_ does not perform deep autoloading of nested namespaces and
|
482
|
+
directories. This is by design.
|
483
|
+
|
134
484
|
## Contributing
|
135
485
|
|
136
486
|
1. [Fork][fork-Autoloaded] the official repository.
|
@@ -160,6 +510,7 @@ Released under the [MIT License][MIT-License].
|
|
160
510
|
[Ruby-Core-Module-autoload]: http://ruby-doc.org/core/Module.html#method-i-autoload "‘Module#autoload’ method in the Ruby Core Library"
|
161
511
|
[ActiveSupport-Autoload]: http://api.rubyonrails.org/classes/ActiveSupport/Autoload.html "‘ActiveSupport::Autoload’ module in the Rails API"
|
162
512
|
[Bundler]: http://bundler.io
|
513
|
+
[Ruby-Core-Kernel-autoload]: http://ruby-doc.org/core/Kernel.html#method-i-autoload "‘Kernel#autoload’ method in the Ruby Core Library"
|
163
514
|
[fork-Autoloaded]: https://github.com/njonsson/autoloaded/fork "Fork the official repository of Autoloaded"
|
164
515
|
[compare-Autoloaded-branches]: https://github.com/njonsson/autoloaded/compare "Compare branches of Autoloaded repositories"
|
165
516
|
[MIT-License]: http://github.com/njonsson/autoloaded/blob/master/License.md "MIT License claim for Autoloaded"
|