vg-service_object 0.1.0 → 0.6.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/CHANGELOG.md +13 -0
- data/Gemfile.lock +1 -1
- data/Guardfile +1 -1
- data/README.md +1 -1
- data/lib/vg/s_o/generate_camelized_name.rb +13 -0
- data/lib/vg/s_o/generate_includable_module.rb +65 -17
- data/lib/vg/s_o/generate_slug_from_module_name.rb +3 -4
- data/lib/vg/s_o/get_module_name_without_namespace.rb +13 -0
- data/lib/vg/s_o/service_object_module_inheritance.rb +2 -2
- data/lib/vg/s_o/service_object_registration_methods.rb +2 -2
- data/lib/vg/s_o.rb +7 -5
- data/lib/vg/service_object/version.rb +1 -1
- data/lib/vg/service_object.rb +19 -17
- data/lib/vg.rb +0 -2
- metadata +4 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 333357254e8d4007eecc70d2a82a40a6319652b2f642443eb8b974429b385275
|
|
4
|
+
data.tar.gz: e66cd3f53fe5e73550f7f3969ab78902e8f84249293955bc5702e11808041785
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: ec889f277f4ffe74f2ea00f74d22158ce173047172e16850e9b5131a20c91d18b468949f43b4325e46d4cd2ae22a402c868fccb404bc2d78cdcbb7cb4f3a08cd
|
|
7
|
+
data.tar.gz: 64cf84f5785e6d9d65c92aa2a0c70740e14a16448da4b097699c9d7da86bbb4361b57d4535cca39e0f144e26bd00b7d126f62b05fc03d91fb7409500248e0e20
|
data/CHANGELOG.md
CHANGED
data/Gemfile.lock
CHANGED
data/Guardfile
CHANGED
|
@@ -5,7 +5,7 @@ directories %w(lib config spec)
|
|
|
5
5
|
|
|
6
6
|
guard :rspec, cmd: "rspec --format d" do
|
|
7
7
|
watch(%r{^spec/.+_spec\.rb$})
|
|
8
|
-
watch(%r{^lib/(.+)\.rb$}) { |m| "spec
|
|
8
|
+
watch(%r{^lib/(.+)\.rb$}) { |m| "spec/#{m[1]}_spec.rb" }
|
|
9
9
|
watch("spec/spec_helper.rb") { "spec" }
|
|
10
10
|
watch("spec/dummy_objects.rb") { "spec" }
|
|
11
11
|
watch("spec/shared_examples.rb") { "spec" }
|
data/README.md
CHANGED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module VG
|
|
4
|
+
module SO
|
|
5
|
+
module GenerateCamelizedName
|
|
6
|
+
|
|
7
|
+
def self.call(string)
|
|
8
|
+
string.to_s.gsub(/(?:_|(^))([a-z\d]*)/) { "#{$1}#{$2.capitalize}" }
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
end # ... GenerateCamelizedName
|
|
12
|
+
end # ... SO
|
|
13
|
+
end # ... VG
|
|
@@ -4,30 +4,78 @@ module VG
|
|
|
4
4
|
module SO
|
|
5
5
|
module GenerateIncludableModule
|
|
6
6
|
|
|
7
|
-
def self.call(
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
class_eval <<~RUBY
|
|
11
|
-
def self.included(base)
|
|
12
|
-
InjectRegistrationMethods.call(base)
|
|
13
|
-
base.register_service_object(:#{method_name}, ::#{so_module_name})
|
|
14
|
-
end
|
|
7
|
+
def self.call(...)
|
|
8
|
+
self::Action.new.call(...)
|
|
9
|
+
end
|
|
15
10
|
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
11
|
+
class Action
|
|
12
|
+
|
|
13
|
+
def call(so_module_name, as: nil)
|
|
14
|
+
self.desired_method_name = as
|
|
15
|
+
self.so_module_name = so_module_name
|
|
16
|
+
find_or_define_module
|
|
17
|
+
end
|
|
19
18
|
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
19
|
+
private
|
|
20
|
+
|
|
21
|
+
attr_accessor :so_module_name
|
|
22
|
+
attr_reader :desired_method_name
|
|
23
|
+
|
|
24
|
+
def desired_method_name=(name)
|
|
25
|
+
# TODO: ensure name is a string in snake case; no bangs;
|
|
26
|
+
@desired_method_name = name.nil? ? nil : name.to_s
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def find_or_define_module
|
|
30
|
+
return Object.const_get(module_name) if Object.const_defined?(module_name)
|
|
31
|
+
|
|
32
|
+
define_module
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def define_module
|
|
36
|
+
instance_eval <<~RUBY
|
|
37
|
+
module #{module_name}
|
|
38
|
+
def self.included(base)
|
|
39
|
+
InjectRegistrationMethods.call(base)
|
|
40
|
+
base.register_service_object(:#{method_name}, ::#{so_module_name})
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def #{method_name}_fn
|
|
44
|
+
self.class.registered_service_objects[:#{method_name}]
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def #{method_name}(...)
|
|
48
|
+
send("#{method_name}_fn").call(...)
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def #{method_name}!(...)
|
|
52
|
+
result = send("#{method_name}_fn").call(...)
|
|
53
|
+
return result unless result.respond_to?(:error) && result.respond_to?(:value)
|
|
54
|
+
raise result.error if result.error
|
|
55
|
+
result.value
|
|
56
|
+
end
|
|
23
57
|
|
|
24
|
-
|
|
25
|
-
|
|
58
|
+
def self.extended(_base)
|
|
59
|
+
raise "Do not extend ::#{so_module_name}, use include!"
|
|
60
|
+
end
|
|
26
61
|
end
|
|
27
62
|
RUBY
|
|
63
|
+
Object.const_get(module_name)
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
def method_name
|
|
67
|
+
@method_name ||= desired_method_name || GenerateSlugFromModuleName.call(so_module_name)
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
def module_name
|
|
71
|
+
"::#{so_module_name}::IncludableAs%sMethod" % (
|
|
72
|
+
desired_method_name \
|
|
73
|
+
? GenerateCamelizedName.call(desired_method_name)
|
|
74
|
+
: GetModuleNameWithoutNamespace.call(so_module_name)
|
|
75
|
+
)
|
|
28
76
|
end
|
|
29
|
-
end
|
|
30
77
|
|
|
78
|
+
end # ... Action
|
|
31
79
|
end # ... GenerateIncludableModule
|
|
32
80
|
end # ... SO
|
|
33
81
|
end # ... VG
|
|
@@ -5,10 +5,9 @@ module VG
|
|
|
5
5
|
module GenerateSlugFromModuleName
|
|
6
6
|
|
|
7
7
|
def self.call(module_name)
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
.gsub(/([
|
|
11
|
-
.gsub(/([a-z\d])([A-Z])/,'\1_\2')
|
|
8
|
+
GetModuleNameWithoutNamespace.call(module_name)
|
|
9
|
+
.gsub(/([A-Z]+)([A-Z][a-z])/, '\1_\2')
|
|
10
|
+
.gsub(/([a-z\d])([A-Z])/, '\1_\2')
|
|
12
11
|
.downcase.to_sym
|
|
13
12
|
end
|
|
14
13
|
|
|
@@ -6,7 +6,7 @@ module VG
|
|
|
6
6
|
|
|
7
7
|
module ClassMethods
|
|
8
8
|
def included(base)
|
|
9
|
-
puts "-- #{self.name}#included call (including into #{base})"
|
|
9
|
+
# puts "-- #{self.name}#included call (including into #{base})"
|
|
10
10
|
InjectRegistrationMethods.call(base)
|
|
11
11
|
base.register_service_objects(registered_service_objects)
|
|
12
12
|
|
|
@@ -18,7 +18,7 @@ module VG
|
|
|
18
18
|
return unless base.instance_of?(Module)
|
|
19
19
|
return if base.singleton_class.included_modules.include?(ClassMethods)
|
|
20
20
|
|
|
21
|
-
puts "-- prepend #{base.name}#included with ServiceObjectModuleInheritance#included"
|
|
21
|
+
# puts "-- prepend #{base.name}#included with ServiceObjectModuleInheritance#included"
|
|
22
22
|
base.singleton_class.prepend ClassMethods
|
|
23
23
|
end
|
|
24
24
|
|
|
@@ -18,7 +18,7 @@ module VG
|
|
|
18
18
|
raise "#{so} clashes with #{registered_so} in #{self}" if so != registered_so
|
|
19
19
|
end
|
|
20
20
|
|
|
21
|
-
puts "--- register #{self.name}##{name} => #{so}#call"
|
|
21
|
+
# puts "--- register #{self.name}##{name} => #{so}#call"
|
|
22
22
|
registered_service_objects[name.to_sym] = so
|
|
23
23
|
end
|
|
24
24
|
end
|
|
@@ -26,7 +26,7 @@ module VG
|
|
|
26
26
|
def self.included(base)
|
|
27
27
|
return if base.singleton_class.included_modules.include?(ClassMethods)
|
|
28
28
|
|
|
29
|
-
puts "-- #{base.name}: extend with ServiceObjectRegistrationMethods"
|
|
29
|
+
# puts "-- #{base.name}: extend with ServiceObjectRegistrationMethods"
|
|
30
30
|
base.extend ClassMethods
|
|
31
31
|
end
|
|
32
32
|
|
data/lib/vg/s_o.rb
CHANGED
|
@@ -2,10 +2,12 @@
|
|
|
2
2
|
|
|
3
3
|
module VG
|
|
4
4
|
module SO
|
|
5
|
-
autoload(:
|
|
6
|
-
autoload(:
|
|
7
|
-
autoload(:
|
|
8
|
-
autoload(:
|
|
9
|
-
autoload(:
|
|
5
|
+
autoload(:GenerateCamelizedName, "vg/s_o/generate_camelized_name")
|
|
6
|
+
autoload(:GenerateIncludableModule, "vg/s_o/generate_includable_module")
|
|
7
|
+
autoload(:GenerateSlugFromModuleName, "vg/s_o/generate_slug_from_module_name")
|
|
8
|
+
autoload(:GetModuleNameWithoutNamespace, "vg/s_o/get_module_name_without_namespace")
|
|
9
|
+
autoload(:InjectRegistrationMethods, "vg/s_o/inject_registration_methods")
|
|
10
|
+
autoload(:ServiceObjectModuleInheritance, "vg/s_o/service_object_module_inheritance")
|
|
11
|
+
autoload(:ServiceObjectRegistrationMethods, "vg/s_o/service_object_registration_methods")
|
|
10
12
|
end
|
|
11
13
|
end
|
data/lib/vg/service_object.rb
CHANGED
|
@@ -3,41 +3,43 @@
|
|
|
3
3
|
module VG
|
|
4
4
|
module ServiceObject
|
|
5
5
|
|
|
6
|
-
module
|
|
6
|
+
module CommonSingletonMethods
|
|
7
7
|
def call(...)
|
|
8
8
|
callable.call(...)
|
|
9
9
|
end
|
|
10
10
|
|
|
11
|
-
def
|
|
12
|
-
|
|
11
|
+
def as_method(name = nil)
|
|
12
|
+
::VG::SO::GenerateIncludableModule.call(self.name, as: name)
|
|
13
13
|
end
|
|
14
14
|
|
|
15
|
-
|
|
16
|
-
|
|
15
|
+
alias_method :as_so, :as_method
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
module ClassSingletonMethods
|
|
19
|
+
|
|
20
|
+
def callable
|
|
21
|
+
self.new
|
|
17
22
|
end
|
|
23
|
+
|
|
18
24
|
end
|
|
19
25
|
|
|
20
26
|
module ModuleSingletonMethods
|
|
21
|
-
|
|
22
|
-
callable.call(...)
|
|
23
|
-
end
|
|
24
|
-
|
|
27
|
+
|
|
25
28
|
def callable
|
|
26
|
-
|
|
29
|
+
self::Action.new
|
|
27
30
|
end
|
|
28
31
|
|
|
29
|
-
def as_so(method_name = nil)
|
|
30
|
-
::VG::SO::GenerateIncludableModule.call(self.name, as: method_name)
|
|
31
|
-
end
|
|
32
32
|
end
|
|
33
33
|
|
|
34
34
|
def self.included(so)
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
35
|
+
so.singleton_class.included_modules.tap do |included|
|
|
36
|
+
[CommonSingletonMethods, so.is_a?(Class) ? ClassSingletonMethods : ModuleSingletonMethods].each do |methods|
|
|
37
|
+
so.extend methods unless included.include?(methods)
|
|
38
|
+
end
|
|
39
|
+
end
|
|
38
40
|
|
|
39
41
|
so.singleton_class.instance_eval do
|
|
40
|
-
define_method(:included) { |_base| raise "Can't be included. Use #
|
|
42
|
+
define_method(:included) { |_base| raise "Can't be included. Use #as_method method instead" }
|
|
41
43
|
end if so.instance_of?(Module)
|
|
42
44
|
end
|
|
43
45
|
|
data/lib/vg.rb
CHANGED
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: vg-service_object
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.6.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Vladimir Gorodulin
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2021-
|
|
11
|
+
date: 2021-10-05 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: rspec
|
|
@@ -71,8 +71,10 @@ files:
|
|
|
71
71
|
- Rakefile
|
|
72
72
|
- lib/vg.rb
|
|
73
73
|
- lib/vg/s_o.rb
|
|
74
|
+
- lib/vg/s_o/generate_camelized_name.rb
|
|
74
75
|
- lib/vg/s_o/generate_includable_module.rb
|
|
75
76
|
- lib/vg/s_o/generate_slug_from_module_name.rb
|
|
77
|
+
- lib/vg/s_o/get_module_name_without_namespace.rb
|
|
76
78
|
- lib/vg/s_o/inject_registration_methods.rb
|
|
77
79
|
- lib/vg/s_o/service_object_module_inheritance.rb
|
|
78
80
|
- lib/vg/s_o/service_object_registration_methods.rb
|