vg-service_object 0.1.0 → 0.6.0

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: 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