modulation 1.0.1 → 1.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 79d44ad3050dcd57ba2c0ca917d16179197fa4ffe12e12aa7de42a050e8872c3
4
- data.tar.gz: 643f1853f37b82fe0e49f62d99db0120696d5e0fa11b4d93faa5d0b9eed60070
3
+ metadata.gz: 2a279ab2f1b9cad5e4056290d045cd644e7637676e73bfcc8b0d6b2b737a92a2
4
+ data.tar.gz: 616806e62a57b0889aae801ea18d852d79fdd0e5829d45c22aa241656aa8e795
5
5
  SHA512:
6
- metadata.gz: 3df78b0f925e7d2f6ddd5547c46755d51a89a76f6aba84bdd02871e456de7bdbbd1c458e46f92d7cbbd3c782b8051abfac3ace1b60853e97e7fc3694e90b3c7b
7
- data.tar.gz: f7ae45414fca8d849e521efc4980e6a30b9dd1678b9f21a2b8ce438626369e77845bef4cd4be676bd67cdeb39e2b05153d9a9e5b7f9134818d7beba93280bd17
6
+ metadata.gz: f3bf1925ce24c315817907e8ea044a8223238bc03871ea5ada5d3368d3e4daaeae5d978a443a4fdb49ece4e8f4c7530b0dab2dfdf0731b46af63b4f2d18fa976
7
+ data.tar.gz: b69caae7916bac12eb51fb448dc7bab4113058643b29d558a34c0da5bbc2557744bedcecfb5939f06d7d63139c31b016a6ab52fad784e2f0242ddfc6e5784028
data/CHANGELOG.md CHANGED
@@ -1,204 +1,177 @@
1
- 1.0.1 2021-04-21
2
- ----------------
1
+ ## 1.2 2022-11-17
3
2
 
4
- * Override inspect method for classes defined in modules (#7)
3
+ - Fix `extend_from` to not extend ancestors
5
4
 
6
- 1.0 2019-10-18
5
+ ## 1.1 2021-08-18
6
+
7
+ - Add automatic `to_proc` method for callable modules
8
+
9
+ ## 1.0.1 2021-04-21
10
+
11
+ - Override inspect method for classes defined in modules (#7)
12
+
13
+ ## 1.0 2019-10-18
7
14
  --------------
8
15
 
9
- * Cleanup code
10
- * Obfuscate bootstrap dictionary code in packages
11
- * Move packer, bootstrap, CLI, creator code into stock modules
16
+ - Cleanup code
17
+ - Obfuscate bootstrap dictionary code in packages
18
+ - Move packer, bootstrap, CLI, creator code into stock modules
12
19
 
13
- 0.34 2019-10-14
14
- ---------------
20
+ ## 0.34 2019-10-14
15
21
 
16
- * Improve README
22
+ - Improve README
17
23
 
18
- 0.33 2019-10-02
19
- ---------------
24
+ ## 0.33 2019-10-02
20
25
 
21
- * Add backward compatibility with Ruby 2.4.x
22
- * Add support for creating modules programmatically
23
- * Fix use of tags in import_map, auto_import_map, include_from, extend_from
26
+ - Add backward compatibility with Ruby 2.4.x
27
+ - Add support for creating modules programmatically
28
+ - Fix use of tags in import_map, auto_import_map, include_from, extend_from
24
29
 
25
- 0.32 2019-09-03
26
- ---------------
30
+ ## 0.32 2019-09-03
27
31
 
28
- * Implement export_from_receiver
29
- * Implement additive exports
30
- * Refactor auto_import_map, add not_found option
31
- * Fix backtrace for exports of missing symbols
32
+ - Implement export_from_receiver
33
+ - Implement additive exports
34
+ - Refactor auto_import_map, add not_found option
35
+ - Fix backtrace for exports of missing symbols
32
36
 
33
- 0.31 2019-08-28
34
- ---------------
37
+ ## 0.31 2019-08-28
35
38
 
36
- * Fix error handling when default_export symbol is not found
39
+ - Fix error handling when default_export symbol is not found
37
40
 
38
- 0.30 2019-08-24
39
- ---------------
41
+ ## 0.30 2019-08-24
40
42
 
41
- * Add symbol_keys option to import_map
43
+ - Add symbol_keys option to import_map
42
44
 
43
- 0.29 2019-08-23
44
- ---------------
45
+ ## 0.29 2019-08-23
45
46
 
46
- * Implement auto_import_map
47
- * Add preliminary inline Gemfile to packaged apps
47
+ - Implement auto_import_map
48
+ - Add preliminary inline Gemfile to packaged apps
48
49
 
49
- 0.28 2019-08-23
50
- ---------------
50
+ ## 0.28 2019-08-23
51
51
 
52
- * Implement tagged sources
53
- * Improve application packer
52
+ - Implement tagged sources
53
+ - Improve application packer
54
54
 
55
- 0.27 2019-08-21
56
- ---------------
55
+ ## 0.27 2019-08-21
57
56
 
58
- * Add initial packing functionality
57
+ - Add initial packing functionality
59
58
 
60
- 0.26 2019-08-20
61
- ---------------
59
+ ## 0.26 2019-08-20
62
60
 
63
- * Add Module#alias_method_once for idempotent method aliasing
64
- * Add dependency introspection API
65
- * Add support for hash in `#export`
61
+ - Add Module#alias_method_once for idempotent method aliasing
62
+ - Add dependency introspection API
63
+ - Add support for hash in `#export`
66
64
 
67
- 0.25 2019-06-07
68
- ---------------
65
+ ## 0.25 2019-06-07
69
66
 
70
- * Add `#import_map` method
67
+ - Add `#import_map` method
71
68
 
72
- 0.24 2019-05-22
73
- ---------------
69
+ ## 0.24 2019-05-22
74
70
 
75
- * Fix usage of Modulation in rake tasks
76
- * Fix behavior when referencing missing consts in modules using `#auto_import`
71
+ - Fix usage of Modulation in rake tasks
72
+ - Fix behavior when referencing missing consts in modules using `#auto_import`
77
73
 
78
- 0.23 2019-05-17
79
- ---------------
74
+ ## 0.23 2019-05-17
80
75
 
81
- * Fix regression in `#export_default`
76
+ - Fix regression in `#export_default`
82
77
 
83
- 0.22 2019-05-15
84
- ---------------
78
+ ## 0.22 2019-05-15
85
79
 
86
- * Export_default of a method now exports a proc calling that method
87
- * Raise error on export of undefined symbols
80
+ - Export_default of a method now exports a proc calling that method
81
+ - Raise error on export of undefined symbols
88
82
 
89
- 0.21 2019-02-19
90
- ---------------
83
+ ## 0.21 2019-02-19
91
84
 
92
- * Add support for list of symbols to import in `Kernel#include_from`
85
+ - Add support for list of symbols to import in `Kernel#include_from`
93
86
 
94
- 0.20 2019-01-16
95
- ---------------
87
+ ## 0.20 2019-01-16
96
88
 
97
- * Add import_all method
89
+ - Add import_all method
98
90
 
99
- 0.19 2019-01-05
100
- ---------------
91
+ ## 0.19 2019-01-05
101
92
 
102
- * Move repo to https://github.com/digital-fabric/modulation
93
+ - Move repo to https://github.com/digital-fabric/modulation
103
94
 
104
- 0.18 2018-12-30
105
- ---------------
95
+ ## 0.18 2018-12-30
106
96
 
107
- * Add auto_import feature for lazy loading of modules
97
+ - Add auto_import feature for lazy loading of modules
108
98
 
109
- 0.17 2018-11-22
110
- ---------------
99
+ ## 0.17 2018-11-22
111
100
 
112
- * More documentation
101
+ - More documentation
113
102
 
114
- 0.16 2018-09-24
115
- ---------------
103
+ ## 0.16 2018-09-24
116
104
 
117
- * Add __expose! method for exposing private symbols for testing purposes
105
+ - Add __expose! method for exposing private symbols for testing purposes
118
106
 
119
- 0.15 2018-09-09
120
- ---------------
107
+ ## 0.15 2018-09-09
121
108
 
122
- * Fix include_from to include only exported constants
109
+ - Fix include_from to include only exported constants
123
110
 
124
- 0.14 2018-09-09
125
- ---------------
111
+ ## 0.14 2018-09-09
126
112
 
127
- * Fix include_from, extend_from to add constants to target object
113
+ - Fix include_from, extend_from to add constants to target object
128
114
 
129
- 0.13 2018-09-06
130
- ---------------
115
+ ## 0.13 2018-09-06
131
116
 
132
- * Evaluate module code on singleton_class instead of using `#extend self`
133
- * Fix calling `#include` inside imported module
134
- * Add `rbm` binary for running ruby scripts using `#import`
117
+ - Evaluate module code on singleton_class instead of using `#extend self`
118
+ - Fix calling `#include` inside imported module
119
+ - Add `rbm` binary for running ruby scripts using `#import`
135
120
 
136
- 0.12 2018-08-20
137
- ---------------
121
+ ## 0.12 2018-08-20
138
122
 
139
- * Fix sanitizing of error backtrace
140
- * Fix importing of gems
123
+ - Fix sanitizing of error backtrace
124
+ - Fix importing of gems
141
125
 
142
- 0.11 2018-08-20
143
- ---------------
126
+ ## 0.11 2018-08-20
144
127
 
145
- * Add Modulation.mock for use in testing
128
+ - Add Modulation.mock for use in testing
146
129
 
147
- 0.10 2018-08-19
148
- ---------------
130
+ ## 0.10 2018-08-19
149
131
 
150
- * Refactor and cleanup code
132
+ - Refactor and cleanup code
151
133
 
152
- 0.9.1 2018-08-15
153
- ----------------
134
+ ## 0.9.1 2018-08-15
154
135
 
155
- * Small fixes to README
136
+ - Small fixes to README
156
137
 
157
- 0.9 2018-08-13
158
- --------------
138
+ ## 0.9 2018-08-13
159
139
 
160
- * Add support for module reloading
140
+ - Add support for module reloading
161
141
 
162
- 0.8 2018-08-05
163
- --------------
142
+ ## 0.8 2018-08-05
164
143
 
165
- * Add support for nested namespaces
166
- * Add support for circular dependencies
144
+ - Add support for nested namespaces
145
+ - Add support for circular dependencies
167
146
 
168
- 0.7 2018-07-29
169
- --------------
147
+ ## 0.7 2018-07-29
170
148
 
171
- * Add `MODULE` constant for accessing module from nested namespaces within itself
149
+ - Add `MODULE` constant for accessing module from nested namespaces within itself
172
150
 
173
- 0.6 2018-07-23
174
- --------------
151
+ ## 0.6 2018-07-23
175
152
 
176
- * Add support for using gems as imported modules (experimental feature)
177
- * Add `Modulation.full_trace!` method for getting full backtrace on errors
178
- * Fix `Modulation.transform_export_default_value`
179
- * Change name to *Modulation*
153
+ - Add support for using gems as imported modules (experimental feature)
154
+ - Add `Modulation.full_trace!` method for getting full backtrace on errors
155
+ - Fix `Modulation.transform_export_default_value`
156
+ - Change name to *Modulation*
180
157
 
181
- 0.5.1 2018-07-20
182
- ----------------
158
+ ## 0.5.1 2018-07-20
183
159
 
184
- * Fix `#extend_from`, `#include_from` to work with ruby 2.4
160
+ - Fix `#extend_from`, `#include_from` to work with ruby 2.4
185
161
 
186
- 0.5 2018-07-19
187
- --------------
162
+ ## 0.5 2018-07-19
188
163
 
189
- * Add `#extend_from`, `#include_from` to include imported methods in classes
164
+ - Add `#extend_from`, `#include_from` to include imported methods in classes
190
165
  and modules
191
166
 
192
- 0.4 2018-07-19
193
- --------------
167
+ ## 0.4 2018-07-19
194
168
 
195
- * Refactor code
196
- * Add tests
197
- * Remove namespace feature (owing to the way Ruby handles constants in blocks)
169
+ - Refactor code
170
+ - Add tests
171
+ - Remove namespace feature (owing to the way Ruby handles constants in blocks)
198
172
 
199
- 0.3.3 2018-07-09
200
- ----------------
173
+ ## 0.3.3 2018-07-09
201
174
 
202
- * Switch to explicit exports
203
- * More documentation
204
- * Better error handling
175
+ - Switch to explicit exports
176
+ - More documentation
177
+ - Better error handling
data/README.md CHANGED
@@ -15,7 +15,7 @@
15
15
 
16
16
 
17
17
  Modulation provides an alternative way of organizing your Ruby code. Modulation
18
- lets you explicitly import and export declarations in order to better control
18
+ lets you explicitly import and export declarations in order to better control
19
19
  dependencies in your codebase. Modulation helps you refrain from littering
20
20
  the global namespace with a myriad modules, or complex multi-level nested
21
21
  module hierarchies.
@@ -25,10 +25,10 @@ from, and you'll have full control over which parts of a module's code you wish
25
25
  to expose to the outside world. Modulation can also help you write Ruby code in
26
26
  a functional style, minimizing boilerplate code.
27
27
 
28
- > Note: Modulation is not a replacement for RubyGems. Rather, Modulation is
28
+ > Note: Modulation is not a replacement for RubyGems. Rather, Modulation is
29
29
  > intended for managing dependencies between source files *inside* your Ruby
30
- > applications. Though it does support loading gems that were written using
31
- > Modulation, it is not intended as a comprehensive solution for using
30
+ > applications. Though it does support loading gems that were written using
31
+ > Modulation, it is not intended as a comprehensive solution for using
32
32
  > third-party libraries.
33
33
 
34
34
  ## Features
@@ -61,17 +61,17 @@ issues:
61
61
  to any other file in your codebase. All "globals" (classes, modules,
62
62
  constants) are loaded, well, globally, in a single namespace. Name conflicts
63
63
  are easy in Ruby.
64
- - To avoid class name conflicts, classes need to be nested under a single
64
+ - To avoid class name conflicts, classes need to be nested under a single
65
65
  hierarchical tree, sometime reaching 4 levels or more. Just look at Rails.
66
66
  - Since a `#require`d class or module can be loaded in any file and then made
67
67
  available to all files, it's easy to lose track of where it was loaded, and
68
68
  where it is used.
69
69
  - There's no easy way to hide implementation-specific classes or methods. Yes,
70
- there's `#private`, `#private_constant` etc, but by default everything is
70
+ there's `#private`, `#private_constant` etc, but by default everything is
71
71
  `#public`!
72
72
  - Extracting functionality is harder when modules are namespaced and
73
73
  dependencies are implicit.
74
- - Writing reusable functional code requires wrapping it in modules using
74
+ - Writing reusable functional code requires wrapping it in modules using
75
75
  `class << self`, `def self.foo ...`, `extend self` or `include Singleton`
76
76
  (the pain of implementing singletons in Ruby has been
77
77
  [discussed](https://practicingruby.com/articles/ruby-and-the-singleton-pattern-dont-get-along)
@@ -83,7 +83,7 @@ issues:
83
83
  > "official" API.
84
84
 
85
85
  Personally, I have found that managing dependencies with `#require` in large
86
- codebases is... not as elegant or painfree as I would expect from a
86
+ codebases is... not as elegant or painfree as I would expect from a
87
87
  first-class development environment. I also wanted to have a better solution
88
88
  for writing in a functional style.
89
89
 
@@ -105,12 +105,12 @@ gem 'modulation'
105
105
  Modulation builds on the idea of a Ruby `Module` as a
106
106
  ["collection of methods and constants"](https://ruby-doc.org/core-2.6.5/Module.html).
107
107
  Using modulation, each Ruby source file becomes a module. Modules usually
108
- export method and constant declarations (usually an API for a specific,
108
+ export method and constant declarations (usually an API for a specific,
109
109
  well-defined functionality) to be shared with other modules. Modules can also
110
110
  import declarations from other modules. Anything not exported remains hidden
111
111
  inside the module and normally cannot be accessed from the outside.
112
112
 
113
- Each source file is evaluated in the context of a newly-created `Module`
113
+ Each source file is evaluated in the context of a newly-created `Module`
114
114
  instance, with some additional methods for introspection and miscellaneous
115
115
  operations such as [hot reloading](#reloading-modules).
116
116
 
@@ -136,7 +136,7 @@ class Session
136
136
  end
137
137
  ```
138
138
 
139
- A module may also expose a set of methods without using `class << self`, for
139
+ A module may also expose a set of methods without using `class << self`, for
140
140
  example when writing in a functional style:
141
141
 
142
142
  *seq.rb*
@@ -210,7 +210,7 @@ user = Models::User.new(...)
210
210
  ...
211
211
  ```
212
212
 
213
- Alternatively, a module interested in a single declaration from another module
213
+ Alternatively, a module interested in a single declaration from another module
214
214
  can use the following technique:
215
215
 
216
216
  ```ruby
@@ -319,7 +319,7 @@ end
319
319
 
320
320
  ### Default exports
321
321
 
322
- A module may wish to expose just a single class or constant, in which case it
322
+ A module may wish to expose just a single class or constant, in which case it
323
323
  can use `#export_default`:
324
324
 
325
325
  *user.rb*
@@ -340,7 +340,7 @@ User.new(...)
340
340
 
341
341
  The default exported value can also be defined directly thus:
342
342
 
343
- *config.rb*
343
+ *config.rb*
344
344
  ```ruby
345
345
  export_default(
346
346
  host: 'localhost',
@@ -388,7 +388,7 @@ end
388
388
 
389
389
  ### Accessing the global namespace
390
390
 
391
- If you need to access the global namespace inside a module just prefix the
391
+ If you need to access the global namespace inside a module just prefix the
392
392
  class name with double colons:
393
393
 
394
394
  ```ruby
@@ -449,7 +449,7 @@ gem called [eg](https://github.com/digital-fabric/eg/).
449
449
  ### Unit testing modules
450
450
 
451
451
  Methods and constants that are not exported can be tested using the `#__expose!`
452
- method. Thus you can keep implementation details hidden, while being able to
452
+ method. Thus you can keep implementation details hidden, while being able to
453
453
  easily test them:
454
454
 
455
455
  *parser.rb*
@@ -583,7 +583,7 @@ end
583
583
  > it without even being aware it was reloaded, providing its API has not
584
584
  > changed.
585
585
 
586
- Reloading of modules with default exports is also possible. Modulation will
586
+ Reloading of modules with default exports is also possible. Modulation will
587
587
  extend the exported value with a `#__reload!` method. The value will need to be
588
588
  reassigned:
589
589
 
@@ -65,6 +65,12 @@ module Modulation
65
65
  )
66
66
  else
67
67
  Exports.perform_exports(mod)
68
+ if mod.respond_to?(:call) && !mod.respond_to?(:to_proc)
69
+ def mod.to_proc
70
+ method(:call).to_proc
71
+ end
72
+ end
73
+
68
74
  mod
69
75
  end
70
76
  end
@@ -40,7 +40,7 @@ module Modulation
40
40
 
41
41
  case abs_path
42
42
  when String
43
- @loaded_modules[abs_path] || create_module_from_file(abs_path, caller)
43
+ @loaded_modules[abs_path] || import_module_from_file(abs_path, caller)
44
44
  when :require_gem
45
45
  raise_error(LoadError.new(GEM_REQUIRE_ERROR_MESSAGE), caller)
46
46
  else
@@ -49,20 +49,22 @@ module Modulation
49
49
  end
50
50
 
51
51
  # Imports all source files in given directory
52
- # @ param path [String] relative directory path
52
+ #
53
+ # @param path [String] relative directory path
53
54
  # @param caller_location [String] caller location
54
55
  # @return [Array] array of module objects
55
56
  def import_all(path, caller_location = caller(CALLER_RANGE).first)
56
57
  abs_path = Paths.absolute_dir_path(path, caller_location)
57
58
  Dir["#{abs_path}/**/*.rb"].map do |fn|
58
- @loaded_modules[fn] || create_module_from_file(fn, caller)
59
+ @loaded_modules[fn] || import_module_from_file(fn, caller)
59
60
  end
60
61
  end
61
62
 
62
63
  # Imports all source files in given directory, returning a hash mapping
63
- # filenames to modules
64
- # @ param path [String] relative directory path
65
- # @ param options [Hash] options
64
+ # filenames to modules.
65
+ #
66
+ # @param path [String] relative directory path
67
+ # @param options [Hash] options
66
68
  # @param caller_location [String] caller location
67
69
  # @return [Hash] hash mapping filenames to modules
68
70
  def import_map(path, options = {},
@@ -70,36 +72,48 @@ module Modulation
70
72
  abs_path = Paths.absolute_dir_path(path, caller_location)
71
73
  use_symbols = options[:symbol_keys]
72
74
  Dir["#{abs_path}/*.rb"].each_with_object({}) do |fn, h|
73
- mod = @loaded_modules[fn] || create_module_from_file(fn, caller)
75
+ mod = @loaded_modules[fn] || import_module_from_file(fn, caller)
74
76
  name = File.basename(fn) =~ /^(.+)\.rb$/ && Regexp.last_match(1)
75
77
  h[use_symbols ? name.to_sym : name] = mod
76
78
  end
77
79
  end
78
80
 
79
- def auto_import_map(path, options = {},
80
- caller_location = caller(CALLER_RANGE).first)
81
+ # Returns a hash mapping filenames to modules, with modules being imported upon
82
+ # This allows an application to load dependencies only when they are needed.
83
+ #
84
+ # @param path [String] relative directory path
85
+ # @param options [Hash] options
86
+ # @param caller_location [String] caller location
87
+ # @return [Hash] hash mapping filenames to modules
88
+ def auto_import_map(path, options = {}, caller_location = caller(CALLER_RANGE).first)
81
89
  abs_path = Paths.absolute_dir_path(path, caller_location)
82
90
  Hash.new do |h, k|
83
91
  fn = Paths.check_path(File.join(abs_path, k.to_s))
84
- h[k] = find_auto_import_module(fn, path, options)
92
+ h[k] = find_auto_import_module(fn, options)
85
93
  end
86
94
  end
87
95
 
88
- def find_auto_import_module(filename, path, options)
96
+ # Imports and returns the given filename. If the module does not exist,
97
+ # returns the value in `options[:not_found]`, otherwise raises an error.
98
+ #
99
+ # @param filename [String] filename
100
+ # @param options [Hash] hash of options
101
+ # @return [Module] imported module
102
+ def find_auto_import_module(filename, options)
89
103
  if filename
90
104
  return @loaded_modules[filename] ||
91
- create_module_from_file(filename, caller)
105
+ import_module_from_file(filename, caller)
92
106
  end
93
107
 
94
108
  return options[:not_found] if options.key?(:not_found)
95
109
 
96
- raise "Module not found #{path}"
110
+ raise "Module not found #{filename}"
97
111
  end
98
112
 
99
113
  # Creates a new module from a source file
100
114
  # @param path [String] source file name
101
115
  # @return [Module] module
102
- def create_module_from_file(path, import_caller)
116
+ def import_module_from_file(path, import_caller)
103
117
  Builder.make(location: path, caller: import_caller)
104
118
  end
105
119
 
@@ -64,7 +64,7 @@ class Module
64
64
  # @return [void]
65
65
  def extend_from(path)
66
66
  mod = import(path, caller(CALLER_RANGE).first)
67
- Modulation::Builder.add_module_methods(mod, self.class)
67
+ Modulation::Builder.add_module_methods(mod, self.singleton_class)
68
68
  Modulation::Builder.add_module_constants(mod, self)
69
69
  end
70
70
 
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Modulation
4
- VERSION = '1.0.1'
4
+ VERSION = '1.2'
5
5
  end
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: 1.0.1
4
+ version: '1.2'
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sharon Rosner
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-04-21 00:00:00.000000000 Z
11
+ date: 2022-11-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -66,10 +66,12 @@ dependencies:
66
66
  - - '='
67
67
  - !ruby/object:Gem::Version
68
68
  version: 4.0.1
69
- description: " Modulation provides an alternative way of organizing your Ruby code.
70
- Modulation\nlets you explicitly import and export declarations in order to better
71
- control \ndependencies in your codebase. Modulation helps you refrain from littering\nthe
72
- global namespace with a myriad modules, or complex multi-level nested\nmodule hierarchies.\n"
69
+ description: |2
70
+ Modulation provides an alternative way of organizing your Ruby code. Modulation
71
+ lets you explicitly import and export declarations in order to better control
72
+ dependencies in your codebase. Modulation helps you refrain from littering
73
+ the global namespace with a myriad modules, or complex multi-level nested
74
+ module hierarchies.
73
75
  email: ciconia@gmail.com
74
76
  executables:
75
77
  - mdl
@@ -120,7 +122,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
120
122
  - !ruby/object:Gem::Version
121
123
  version: '0'
122
124
  requirements: []
123
- rubygems_version: 3.0.8
125
+ rubygems_version: 3.3.7
124
126
  signing_key:
125
127
  specification_version: 4
126
128
  summary: 'Modulation: explicit dependency management for Ruby'