modulation 0.17 → 0.18
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/CHANGELOG.md +5 -0
- data/README.md +46 -2
- data/lib/modulation/ext.rb +25 -0
- data/lib/modulation/version.rb +1 -1
- metadata +8 -11
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 69a7acdf23627c8484110710afefe863049dec51ddf433d1dd607bd9ee9d4a56
|
4
|
+
data.tar.gz: fcef74b2bd0a0fd7450ab0d91b837c341d7c9dfd7b3964afa6bb4e15132ca974
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8e102e59feae6d84de4da96ce88ad45f389c678c883446e03db74d327c09045d7f0d22fca14e03aff5884f85cea56d8d2f6240335c7a75379f80fbc94df5c1c9
|
7
|
+
data.tar.gz: 3821d9bfc8d48939b24e3f7d94b134a28faabd595978747eae8628d50f9e5744015df7d1092576dfcaa377ce3911d28d11f1ede13d20492700d84ff754eba657
|
data/CHANGELOG.md
CHANGED
data/README.md
CHANGED
@@ -1,5 +1,8 @@
|
|
1
1
|
# Modulation - Explicit Dependency Management for Ruby
|
2
2
|
|
3
|
+
> Modulation | mɒdjʊˈleɪʃ(ə)n | *Music* - a change from one key to another in a
|
4
|
+
> piece of music.
|
5
|
+
|
3
6
|
[INSTALL](#installing-modulation) |
|
4
7
|
[GUIDE](#organizing-your-code-with-modulation) |
|
5
8
|
[EXAMPLES](examples) |
|
@@ -31,11 +34,14 @@ a functional style, minimizing boilerplate code.
|
|
31
34
|
- Supports circular dependencies.
|
32
35
|
- Supports [default exports](#default-exports) for modules exporting a single
|
33
36
|
class or value.
|
34
|
-
-
|
37
|
+
- Modules can be [reloaded](#reloading-modules) at runtime without breaking your
|
35
38
|
code in wierd ways.
|
39
|
+
- Modules can be [lazy loaded](#lazy-loading) to improve start up time and
|
40
|
+
memory consumption.
|
36
41
|
- Allows [mocking of dependencies](#mocking-dependencies) for testing purposes.
|
37
42
|
- Can be used to [write gems](#writing-gems-using-modulation).
|
38
|
-
- Facilitates [unit-testing](#unit-testing-modules) of private methods and
|
43
|
+
- Facilitates [unit-testing](#unit-testing-modules) of private methods and
|
44
|
+
constants.
|
39
45
|
|
40
46
|
## Rationale
|
41
47
|
|
@@ -373,6 +379,44 @@ settings = import('settings')
|
|
373
379
|
settings = settings.__reload!
|
374
380
|
```
|
375
381
|
|
382
|
+
## Lazy Loading
|
383
|
+
|
384
|
+
Modulation allows the use of lazy-loaded modules - loading of modules only once
|
385
|
+
they're needed by the application, in similar fashion to `Module#auto_load`. To
|
386
|
+
lazy load modules use the `#auto_import` method, which takes a constant name and
|
387
|
+
a path:
|
388
|
+
|
389
|
+
```ruby
|
390
|
+
export :foo
|
391
|
+
|
392
|
+
auto_import :BAR, './bar'
|
393
|
+
|
394
|
+
def foo
|
395
|
+
# the bar module will only be loaded once this method is called
|
396
|
+
MODULE::BAR
|
397
|
+
end
|
398
|
+
```
|
399
|
+
|
400
|
+
> Lazy-loaded constants must always be qualified. When referring to a
|
401
|
+
> lazy-loaded constant from the module's top namespace, use the `MODULE`
|
402
|
+
> namespace, as shown above.
|
403
|
+
|
404
|
+
The `auto_import` method can also take a hash mapping constant names to paths.
|
405
|
+
This is especially useful when multiple concerns are grouped under a single
|
406
|
+
namespace:
|
407
|
+
|
408
|
+
```ruby
|
409
|
+
export_default :SuperNet
|
410
|
+
|
411
|
+
module SuperNet
|
412
|
+
auto_import(
|
413
|
+
HTTP1: './http1',
|
414
|
+
HTTP2: './http2',
|
415
|
+
WebSockets: './websockets'
|
416
|
+
)
|
417
|
+
end
|
418
|
+
```
|
419
|
+
|
376
420
|
## Writing gems using Modulation
|
377
421
|
|
378
422
|
Modulation can be used to write gems, providing fine-grained control over your
|
data/lib/modulation/ext.rb
CHANGED
@@ -13,6 +13,22 @@ end
|
|
13
13
|
|
14
14
|
# Module extensions
|
15
15
|
class Module
|
16
|
+
# Registers a constant to be lazy-loaded upon lookup
|
17
|
+
# @param sym [Symbol, Hash] constant name or hash mapping names to paths
|
18
|
+
# @param path [String] path if sym is Symbol
|
19
|
+
# @return [void]
|
20
|
+
def auto_import(sym, path = nil, caller_location = caller(1..1).first)
|
21
|
+
unless @__auto_import_registry
|
22
|
+
a = @__auto_import_registry = {}
|
23
|
+
define_auto_import_const_missing_method(@__auto_import_registry)
|
24
|
+
end
|
25
|
+
if path
|
26
|
+
@__auto_import_registry[sym] = [path, caller_location]
|
27
|
+
else
|
28
|
+
sym.each { |k, v| @__auto_import_registry[k] = [v, caller_location] }
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
16
32
|
# Extends the receiver with exported methods from the given file name
|
17
33
|
# @param path [String] module filename
|
18
34
|
# @return [void]
|
@@ -32,6 +48,15 @@ class Module
|
|
32
48
|
add_module_constants(mod, self)
|
33
49
|
end
|
34
50
|
|
51
|
+
private
|
52
|
+
|
53
|
+
def define_auto_import_const_missing_method(auto_import_hash)
|
54
|
+
singleton_class.define_method(:const_missing) do |sym|
|
55
|
+
(path, caller_location) = auto_import_hash[sym]
|
56
|
+
path ? const_set(sym, import(path, caller_location)) : super
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
35
60
|
def add_module_methods(mod, target)
|
36
61
|
mod.singleton_class.instance_methods(false).each do |sym|
|
37
62
|
target.send(:define_method, sym, &mod.method(sym))
|
data/lib/modulation/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: modulation
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: '0.
|
4
|
+
version: '0.18'
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sharon Rosner
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-
|
11
|
+
date: 2018-12-30 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: minitest
|
@@ -38,12 +38,10 @@ dependencies:
|
|
38
38
|
- - '='
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: 4.0.1
|
41
|
-
description:
|
42
|
-
Modulation
|
43
|
-
|
44
|
-
|
45
|
-
the global namespace with a myriad modules, or declaring complex nested
|
46
|
-
class hierarchies.
|
41
|
+
description: " Modulation provides an alternative way of organizing your Ruby code.
|
42
|
+
Modulation\nlets you explicitly import and export declarations in order to better
|
43
|
+
control \ndependencies in your codebase. Modulation helps you refrain from littering\nthe
|
44
|
+
global namespace with a myriad modules, or complex multi-level nested\nmodule hierarchies.\n"
|
47
45
|
email: ciconia@gmail.com
|
48
46
|
executables:
|
49
47
|
- rbm
|
@@ -87,9 +85,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
87
85
|
- !ruby/object:Gem::Version
|
88
86
|
version: '0'
|
89
87
|
requirements: []
|
90
|
-
|
91
|
-
rubygems_version: 2.7.3
|
88
|
+
rubygems_version: 3.0.1
|
92
89
|
signing_key:
|
93
90
|
specification_version: 4
|
94
|
-
summary: 'Modulation:
|
91
|
+
summary: 'Modulation: explicit dependency management for Ruby'
|
95
92
|
test_files: []
|