aux 0.0.3 → 0.0.5
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/lib/aux/pluggable/class_methods.rb +16 -33
- data/lib/aux/pluggable/utilities.rb +31 -0
- data/lib/aux/pluggable.rb +1 -1
- data/lib/aux/version.rb +1 -1
- metadata +3 -4
- data/lib/aux/pluggable/registration.rb +0 -25
- data/lib/aux/utilities.rb +0 -12
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4b5ace631919c60e6e5204bfb33dad68a6b8583c98d26206b613811b15b2fe29
|
4
|
+
data.tar.gz: 77bb7c2c22c97181fc1e5d10ecf77dba3296f0b188c38ede324d221777613f02
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7edf473b2d627ca0fb4c9f16197177eb3de5d98a042b269097d1f5317e440dac298cac592aede48e8ecf42855f9bb78c86887f0611fee770f5fb164bf871b164
|
7
|
+
data.tar.gz: 2aa2ffbe10186145ce53a5e54a9759169883d789c618575798eba40f056cc4107add3abc942ce105280a5feef7ef9befe93f326d05764b75d558aa9149489d91
|
@@ -1,13 +1,10 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require 'aux/utilities'
|
4
|
-
|
5
3
|
module Aux
|
6
4
|
module Pluggable
|
7
5
|
# Describes methods that would be inherited by pluggable classes
|
8
6
|
module ClassMethods
|
9
7
|
# @param dependencies [Hash{Symbol => Object}]
|
10
|
-
# @return [self]
|
11
8
|
def new(**dependencies)
|
12
9
|
instance = allocate
|
13
10
|
|
@@ -18,9 +15,12 @@ module Aux
|
|
18
15
|
|
19
16
|
# Configure dependencies that come from the customized initialization procedure
|
20
17
|
dependencies.each do |name, dependency|
|
21
|
-
instance.instance_variable_set("@#{name}", dependency)
|
18
|
+
instance.instance_variable_set("@#{name}", dependency) if @_dependencies.include?(name)
|
22
19
|
end
|
23
20
|
|
21
|
+
# Run the rest of customized initialization procedure
|
22
|
+
instance.send(:initialize, **dependencies)
|
23
|
+
|
24
24
|
instance
|
25
25
|
end
|
26
26
|
|
@@ -28,38 +28,27 @@ module Aux
|
|
28
28
|
|
29
29
|
# @param initialize [TrueClass, FalseClass]
|
30
30
|
# @param memoize [TrueClass, FalseClass]
|
31
|
+
# @param scope [TrueClass, Symbol, String, nil]
|
31
32
|
# @param as [Symbol, String, nil]
|
32
|
-
def register(initialize: false, memoize: false, as: nil)
|
33
|
-
|
34
|
-
|
35
|
-
@_registry.register(@_registration.name, memoize: @_registration.memoization_required) do
|
36
|
-
@_registration.initialization_required ? new : self
|
37
|
-
end
|
33
|
+
def register(initialize: false, memoize: false, scope: true, as: nil)
|
34
|
+
dependency_cipher = Utilities.dependency_cipher(name, scope: scope, code: as)
|
35
|
+
@_registry.register(dependency_cipher, memoize: memoize) { initialize ? new : self }
|
38
36
|
end
|
39
37
|
|
40
38
|
# @param code [Symbol, String]
|
41
39
|
# @param initialization_block [Proc, nil]
|
42
|
-
# @param scope [TrueClass, Symbol, String]
|
40
|
+
# @param scope [TrueClass, Symbol, String, nil]
|
43
41
|
# @param as [Symbol, String]
|
44
|
-
# rubocop:disable Metrics/AbcSize, Metrics/
|
42
|
+
# rubocop:disable Metrics/AbcSize, Metrics/MethodLength
|
45
43
|
def resolve(code, initialization_block = nil, scope: true, as: nil)
|
46
|
-
|
47
|
-
|
48
|
-
# referencing class. Another approach is to allow developers to set the correct scope themselves.
|
49
|
-
scope =
|
50
|
-
case scope
|
51
|
-
when TrueClass
|
52
|
-
Aux::Utilities.underscore(name).rpartition('.').first
|
53
|
-
when Symbol, String
|
54
|
-
scope
|
55
|
-
end
|
44
|
+
dependency_cipher = Utilities.dependency_cipher(name, scope: scope, code: code)
|
45
|
+
dependency_alias = as || code
|
56
46
|
|
57
47
|
# The process of preloading classes is a bit messy. Therefore, why we wrap the dependency in a Proc.
|
58
48
|
# This allows us not to worry about the absence of the referenced class in the registry during assembly.
|
59
49
|
# Using an initialization block can be convenient in some cases, for example, to resolve some
|
60
50
|
# of the global settings without accessing the whole thing.
|
61
|
-
|
62
|
-
dependency =
|
51
|
+
@_dependencies[dependency_alias] =
|
63
52
|
if initialization_block
|
64
53
|
-> { initialization_block.call(@_registry.resolve(dependency_cipher)) }
|
65
54
|
else
|
@@ -67,16 +56,10 @@ module Aux
|
|
67
56
|
end
|
68
57
|
|
69
58
|
# The final step is to declare instance variables and methods to access them.
|
70
|
-
dependency_alias = as || code
|
71
|
-
|
72
|
-
if defined?(@_registration) && @_registration&.initialization_required
|
73
|
-
@_dependencies[dependency_alias] = dependency
|
74
|
-
end
|
75
|
-
|
76
59
|
instance_eval do
|
77
60
|
define_method(dependency_alias) do
|
78
61
|
if instance_variable_get("@#{dependency_alias}").is_a?(Proc)
|
79
|
-
|
62
|
+
instance_variable_get("@#{dependency_alias}").call
|
80
63
|
else
|
81
64
|
instance_variable_get("@#{dependency_alias}")
|
82
65
|
end
|
@@ -86,11 +69,11 @@ module Aux
|
|
86
69
|
end
|
87
70
|
|
88
71
|
singleton_class.class_eval do
|
89
|
-
define_method(dependency_alias) {
|
72
|
+
define_method(dependency_alias) { @_dependencies[dependency_alias].call }
|
90
73
|
private dependency_alias
|
91
74
|
end
|
92
75
|
end
|
93
|
-
# rubocop:enable Metrics/AbcSize, Metrics/
|
76
|
+
# rubocop:enable Metrics/AbcSize, Metrics/MethodLength
|
94
77
|
end
|
95
78
|
end
|
96
79
|
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Aux
|
4
|
+
module Pluggable
|
5
|
+
# Random methods for internal usage
|
6
|
+
module Utilities
|
7
|
+
# First, we need to determine the appropriate namespace (also called the scope) in which to resolve something.
|
8
|
+
# By default, we assume that the developers want to resolve a dependency from the same namespace as the
|
9
|
+
# referencing class. Another approach is to allow developers to set the correct scope themselves.
|
10
|
+
#
|
11
|
+
# @param class_name [Class]
|
12
|
+
# @param scope [TrueClass, Symbol, String, nil]
|
13
|
+
# @param code [TrueClass, Symbol, String, nil]
|
14
|
+
# @return [String]
|
15
|
+
def self.dependency_cipher(class_name, scope: nil, code: nil)
|
16
|
+
native_cipher = dependency_native_cipher(class_name)
|
17
|
+
native_cipher_partitions = native_cipher.rpartition('.')
|
18
|
+
scope = scope.is_a?(TrueClass) ? native_cipher_partitions.first : scope
|
19
|
+
code = code.nil? ? native_cipher_partitions.last : code
|
20
|
+
|
21
|
+
[scope, code].reject { |part| part.nil? || part.empty? }.join('.')
|
22
|
+
end
|
23
|
+
|
24
|
+
# @param class_name [Class]
|
25
|
+
# @return [String]
|
26
|
+
def self.dependency_native_cipher(class_name)
|
27
|
+
class_name.dup.gsub(/::/, '.').gsub(/([A-Z]+)([A-Z][a-z])/, '\1_\2').gsub(/([a-z\d])([A-Z])/, '\1_\2').downcase
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
data/lib/aux/pluggable.rb
CHANGED
data/lib/aux/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: aux
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Evgeny Boyko
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-
|
11
|
+
date: 2023-03-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activemodel
|
@@ -64,8 +64,7 @@ files:
|
|
64
64
|
- lib/aux.rb
|
65
65
|
- lib/aux/pluggable.rb
|
66
66
|
- lib/aux/pluggable/class_methods.rb
|
67
|
-
- lib/aux/pluggable/
|
68
|
-
- lib/aux/utilities.rb
|
67
|
+
- lib/aux/pluggable/utilities.rb
|
69
68
|
- lib/aux/validations.rb
|
70
69
|
- lib/aux/validations/error.rb
|
71
70
|
- lib/aux/validations/errors.rb
|
@@ -1,25 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Aux
|
4
|
-
module Pluggable
|
5
|
-
# Describes a wrapper for registry data
|
6
|
-
class Registration
|
7
|
-
# @!attribute [r] name
|
8
|
-
# @return [Symbol, String]
|
9
|
-
# @!attribute [r] initialization_required
|
10
|
-
# @return [TrueClass, FalseClass]
|
11
|
-
# @!attribute [r] memoization_required
|
12
|
-
# @return [TrueClass, FalseClass]
|
13
|
-
attr_reader :name, :initialization_required, :memoization_required
|
14
|
-
|
15
|
-
# @param name [Symbol, String]
|
16
|
-
# @param initialization_required [TrueClass, FalseClass]
|
17
|
-
# @param memoization_required [TrueClass, FalseClass]
|
18
|
-
def initialize(name, initialization_required, memoization_required)
|
19
|
-
@name = name
|
20
|
-
@initialization_required = initialization_required
|
21
|
-
@memoization_required = memoization_required
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|
data/lib/aux/utilities.rb
DELETED
@@ -1,12 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Aux
|
4
|
-
# Random methods for internal usage
|
5
|
-
module Utilities
|
6
|
-
# @param class_name [String]
|
7
|
-
# @return [String]
|
8
|
-
def self.underscore(class_name)
|
9
|
-
class_name.dup.gsub(/::/, '.').gsub(/([A-Z]+)([A-Z][a-z])/, '\1_\2').gsub(/([a-z\d])([A-Z])/, '\1_\2').downcase
|
10
|
-
end
|
11
|
-
end
|
12
|
-
end
|