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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e0e1fea1a0c6d0cf6f8804325d01e1d29f0569db7090b659eeaceb5ee00f83cf
4
- data.tar.gz: d428f22186c6d9130ee76245efc58181c708656ef0e7f8e265ba0d817357e9b1
3
+ metadata.gz: 333357254e8d4007eecc70d2a82a40a6319652b2f642443eb8b974429b385275
4
+ data.tar.gz: e66cd3f53fe5e73550f7f3969ab78902e8f84249293955bc5702e11808041785
5
5
  SHA512:
6
- metadata.gz: 23103f62225bff2207d1d3a15a06d1da1b64c82491ba0c97c85f72b8ef62c547d83cc817cc6db0a2014b9835e0de94eb73e2d58f8314bf4949b3ece650ee1a8e
7
- data.tar.gz: 7f962005ba8ce5d78304726bfd7ec8c8d8fa28f36fe2363f6246785d44a21fe794322c6c3a62d53901720e85c9066c2165ec6b7c7e0fe7dce278a5774ff03139
6
+ metadata.gz: ec889f277f4ffe74f2ea00f74d22158ce173047172e16850e9b5131a20c91d18b468949f43b4325e46d4cd2ae22a402c868fccb404bc2d78cdcbb7cb4f3a08cd
7
+ data.tar.gz: 64cf84f5785e6d9d65c92aa2a0c70740e14a16448da4b097699c9d7da86bbb4361b57d4535cca39e0f144e26bd00b7d126f62b05fc03d91fb7409500248e0e20
data/CHANGELOG.md CHANGED
@@ -0,0 +1,13 @@
1
+ # CHANGELOG
2
+
3
+ ## 0.4.0 - 2021-08-22
4
+
5
+ Add bang! methods that suppress tuples
6
+
7
+ ## 0.2.0 - 2021-08-13
8
+
9
+ Autogenerated includable modules got unique names.
10
+
11
+ ## 0.1.0 - 2021-08-01
12
+
13
+ Initial implementation
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- vg-service_object (0.1.0)
4
+ vg-service_object (0.5.0)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
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/lib/#{m[1]}_spec.rb" }
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
@@ -5,7 +5,7 @@
5
5
  Add this line to your application's Gemfile:
6
6
 
7
7
  ```ruby
8
- gem 'vg-service_object'
8
+ gem "vg-service_object"
9
9
  ```
10
10
 
11
11
  And then execute:
@@ -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(so_module_name, as: nil)
8
- method_name = as || GenerateSlugFromModuleName.call(so_module_name)
9
- Module.new do
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
- def #{method_name}_fn
17
- self.class.registered_service_objects[:#{method_name}].callable
18
- end
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
- def #{method_name}(...)
21
- send("#{method_name}_fn").call(...)
22
- end
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
- def self.extended(_base)
25
- raise "Do not extend ::#{so_module_name}, use include!"
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
- regex = /(?:::)*([A-Za-z0-9]+)$/
9
- module_name.match(regex)[1]
10
- .gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2')
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
 
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module VG
4
+ module SO
5
+ module GetModuleNameWithoutNamespace
6
+
7
+ def self.call(string)
8
+ string.match(/(?:::)*([A-Za-z0-9]+)$/)[1]
9
+ end
10
+
11
+ end # ... GetModuleNameWithoutNamespace
12
+ end # ... SO
13
+ end # ... VG
@@ -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(:GenerateIncludableModule, 'vg/s_o/generate_includable_module')
6
- autoload(:GenerateSlugFromModuleName, 'vg/s_o/generate_slug_from_module_name')
7
- autoload(:InjectRegistrationMethods, 'vg/s_o/inject_registration_methods')
8
- autoload(:ServiceObjectModuleInheritance, 'vg/s_o/service_object_module_inheritance')
9
- autoload(:ServiceObjectRegistrationMethods, 'vg/s_o/service_object_registration_methods')
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
@@ -1,5 +1,5 @@
1
1
  module VG
2
2
  module ServiceObject
3
- VERSION = "0.1.0"
3
+ VERSION = "0.6.0"
4
4
  end
5
5
  end
@@ -3,41 +3,43 @@
3
3
  module VG
4
4
  module ServiceObject
5
5
 
6
- module ClassSingletonMethods
6
+ module CommonSingletonMethods
7
7
  def call(...)
8
8
  callable.call(...)
9
9
  end
10
10
 
11
- def callable
12
- @callable ||= self.new
11
+ def as_method(name = nil)
12
+ ::VG::SO::GenerateIncludableModule.call(self.name, as: name)
13
13
  end
14
14
 
15
- def as_so(method_name = nil)
16
- ::VG::SO::GenerateIncludableModule.call(self.name, as: method_name)
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
- def call(...)
22
- callable.call(...)
23
- end
24
-
27
+
25
28
  def callable
26
- @callable ||= self::Action.new
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
- methods = so.is_a?(Class) ? ClassSingletonMethods : ModuleSingletonMethods
36
- return if so.singleton_class.included_modules.include?(methods)
37
- so.extend methods
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 #as_so method instead" }
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
@@ -3,6 +3,4 @@
3
3
  module VG
4
4
  require_relative "vg/service_object"
5
5
  require_relative "vg/s_o"
6
- #autoload(:ServiceObject, 'v_g/service_object')
7
- #autoload(:SO, 'v_g/s_o')
8
6
  end
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.1.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-08-04 00:00:00.000000000 Z
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