magical-service 0.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 3a040a05f30209e49ae39fbc07f975b38e8bb3338b8a6bdbfd689fc26ed3a79d
4
+ data.tar.gz: ec7f416f17be7b1ac1ebf10a67f845c7237833e94783a6148125d9a204c2b571
5
+ SHA512:
6
+ metadata.gz: bcac906045a938dfbf05247eb15e65f1c883c52063ac7b5f7e80d48469084a98f5cfc3a0677a3a0fb45a5dbfaa9c0149eff315b12ef1c818e3d7a8ad93d3f400
7
+ data.tar.gz: 79791bca59bb5bbd285e588d316b6bab96d983568b491f23af6087f826e21c8e9c53af3129bd5e6a5084f110834a5cc1b4033814af88a2f496e04c3465d7927b
data/MIT-LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ Copyright 2018 Magica Azula
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,3 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'magical/service/action_service'
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'action_service/base'
4
+
5
+ # action service module
6
+ module ActionService
7
+ # # a service example:
8
+ #
9
+ # class BarService < ActionService::Base
10
+ # before_confection do
11
+ # define_params :default_param # optional
12
+ # define_options :default_option # optional
13
+ # define_stages %i[one two three] # optional
14
+ # define_delivery :four
15
+ # end
16
+ #
17
+ # stage :one do
18
+ # # body omitted
19
+ # end
20
+ #
21
+ # stage :two do
22
+ # stage_helper(foo, bar)
23
+ # # body omitted
24
+ # end
25
+ #
26
+ # stage :three do
27
+ # # body omitted
28
+ # stage_helper2(baz)
29
+ # end
30
+ #
31
+ # stage :four do
32
+ # # body omitted
33
+ # end
34
+ #
35
+ # # one-line support action
36
+ # mainstay(:stage_helper) { |foo, bar| # body omitted }
37
+ #
38
+ # # multi-line support action
39
+ # mainstay(:stage_helper2) do |baz|
40
+ # # body omitted
41
+ # end
42
+ # end
43
+ end
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'magical/service/core/gears'
4
+ require 'magical/service/core/machinery'
5
+
6
+ module ActionService
7
+ # Service base conveniences for your service objects.
8
+ #
9
+ # This class allows you to define services based on a
10
+ # suggested convention, with will execute through a single action.
11
+ # Then your service can define stages of forced void return and a
12
+ # delivery method, which will process data and return it
13
+ #
14
+ # class MyService < ActionService::Base
15
+ # before_confection do
16
+ # define_stages %i[one two] # optional
17
+ # define_delivery :three
18
+ # end
19
+ #
20
+ # stage :one do { # body omitted }
21
+ # stage :two do { # body omitted }
22
+ # stage :three do { # body omitted }
23
+ # end
24
+ #
25
+ # Then your service can do all the process by simply calling:
26
+ #
27
+ # MyService.provide(params: {}, options: {})
28
+ #
29
+ class Base
30
+ extend Core::Gears
31
+ extend Core::Machinery
32
+ end
33
+ end
@@ -0,0 +1,76 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'gears/control_panel'
4
+ require_relative 'gears/no_assignment_error'
5
+
6
+ module Core
7
+ # service gears
8
+ module Gears
9
+ def provide(params: {}, options: {})
10
+ validates_confection do
11
+ @params = params unless default_attribute?(:params, params)
12
+ @options = options unless default_attribute?(:options, options)
13
+ end
14
+
15
+ chain do
16
+ clear_virtual_instance_variables
17
+ end
18
+ end
19
+
20
+ def before_confection(&block)
21
+ config.instance_eval(&block)
22
+ end
23
+
24
+ def chain
25
+ config.stages.each { |method| send(*method) } if stages?
26
+
27
+ result = send(*config.delivery)
28
+ yield
29
+ result
30
+ end
31
+
32
+ def clear_virtual_instance_variables
33
+ remove_instance_variable(:@params) if defined?(@params)
34
+ remove_instance_variable(:@options) if defined?(@options)
35
+ end
36
+
37
+ def config
38
+ @config ||= ControlPanel.new
39
+ end
40
+
41
+ def default_attribute?(attribute, value)
42
+ !config.send(attribute).nil? && value.is_a?(Hash) && value.empty?
43
+ end
44
+
45
+ def defined_stages?
46
+ config.stages.all? { |phase| respond_to?(phase) }
47
+ end
48
+
49
+ def delivery?
50
+ defined?(@config) && !config.delivery.nil? && respond_to?(config.delivery)
51
+ end
52
+
53
+ def not_defined_error(action)
54
+ NoAssignmentError.new(action, self)
55
+ end
56
+
57
+ def options
58
+ defined?(@options) ? @options : (@options = config.options)
59
+ end
60
+
61
+ def params
62
+ defined?(@params) ? @params : (@params = config.params)
63
+ end
64
+
65
+ def stages?
66
+ defined?(@config) && !config.stages.nil?
67
+ end
68
+
69
+ def validates_confection
70
+ raise not_defined_error('some :stages') if stages? && !defined_stages?
71
+ raise not_defined_error(':delivery') unless delivery?
72
+
73
+ yield
74
+ end
75
+ end
76
+ end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Core
4
+ module Gears
5
+ # Gears Control Panel which handles the basic services configuration
6
+ class ControlPanel
7
+ ATTRIBUTES = %i[stages delivery params options].freeze
8
+
9
+ attr_accessor(*ATTRIBUTES)
10
+
11
+ ATTRIBUTES.each do |attr|
12
+ define_method attr do
13
+ instance_variable_get("@#{attr}")
14
+ end
15
+
16
+ define_method "define_#{attr}" do |value|
17
+ instance_variable_set("@#{attr}", value)
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Core
4
+ module Gears
5
+ # error of action not assigned
6
+ class NoAssignmentError < StandardError
7
+ def initialize(action, service)
8
+ super("#{action} wasn't assign for the service: #{service}")
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Core
4
+ # Machinery which possibility the services stages attribution
5
+ module Machinery
6
+ def stage(name)
7
+ define_singleton_method(name, &Proc.new)
8
+ end
9
+
10
+ alias mainstay stage
11
+ end
12
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Magical
4
+ module Service
5
+ VERSION = '0.0.0'
6
+ end
7
+ end
metadata ADDED
@@ -0,0 +1,95 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: magical-service
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Heirian
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2018-12-27 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rspec
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '3.8'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '3.8'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rubocop
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: 0.61.1
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: 0.61.1
41
+ - !ruby/object:Gem::Dependency
42
+ name: simplecov
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: 0.16.1
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: 0.16.1
55
+ description: Magical Service is an experiment that aims to assist the construction
56
+ of service objects through stages as a single action.
57
+ email: shinkcc@gmail.com
58
+ executables: []
59
+ extensions: []
60
+ extra_rdoc_files: []
61
+ files:
62
+ - MIT-LICENSE
63
+ - lib/magical/service.rb
64
+ - lib/magical/service/action_service.rb
65
+ - lib/magical/service/action_service/base.rb
66
+ - lib/magical/service/core/gears.rb
67
+ - lib/magical/service/core/gears/control_panel.rb
68
+ - lib/magical/service/core/gears/no_assignment_error.rb
69
+ - lib/magical/service/core/machinery.rb
70
+ - lib/magical/service/version.rb
71
+ homepage: https://github.com/magica-azula/magical-service
72
+ licenses:
73
+ - MIT
74
+ metadata: {}
75
+ post_install_message:
76
+ rdoc_options: []
77
+ require_paths:
78
+ - lib
79
+ required_ruby_version: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - ">="
82
+ - !ruby/object:Gem::Version
83
+ version: '2.5'
84
+ required_rubygems_version: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - ">="
87
+ - !ruby/object:Gem::Version
88
+ version: '0'
89
+ requirements: []
90
+ rubyforge_project:
91
+ rubygems_version: 2.7.8
92
+ signing_key:
93
+ specification_version: 4
94
+ summary: Magical Service helps build a service object through a single action
95
+ test_files: []