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.
- 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"
|