swamp-operation 1.2.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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: a8668d55e3748d742306a0bcff8e809c5311cf76b43ab3d879bba2450069aeac
4
+ data.tar.gz: 6db55a204f893ef269d68bf17262169f0d5790b6920ccd082afebaf55750a536
5
+ SHA512:
6
+ metadata.gz: '089e8cd735e795ac381454549a150f93125ff46df81b246484358f474695cf7f831bea3d332f4648ab979d2b0a0f490950a30e8f3214340948dad18fffd7b936'
7
+ data.tar.gz: 7c96d596de123930d0cded029a510524e191a3f4f4e9f3c9b3f726d73d62af358caf259bbffbf934b8a8d88c18b7b018bfba55c29e57f8a81d9f559e1df22446
@@ -0,0 +1,65 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'dry-validation'
4
+
5
+ module Swamp
6
+ # Operations
7
+ # @example
8
+ # class MyOperation
9
+ # include Swamp::Operation
10
+ #
11
+ # def _call
12
+ # input[:id]
13
+ # end
14
+ #
15
+ # input do
16
+ # required(:id) { int? }
17
+ # end
18
+ # end
19
+ module Operation
20
+ class ValidationError < StandardError; end
21
+
22
+ def self.included(base)
23
+ base.extend ClassMethods
24
+ end
25
+
26
+ attr_reader :input
27
+
28
+ def call(**kwargs)
29
+ before_call!(**kwargs)
30
+ _call
31
+ end
32
+
33
+ def before_call!(**kwargs)
34
+ @input = Hash[]
35
+ return unless self.class.input_processor
36
+
37
+ self.class.input_processor.call(kwargs).tap do |result|
38
+ raise ValidationError, result.messages unless result.success?
39
+
40
+ @input = result.output
41
+ end
42
+ end
43
+
44
+ # Extended module
45
+ module ClassMethods
46
+ attr_reader :input_processor
47
+
48
+ def call(**kwargs)
49
+ new.call(**kwargs)
50
+ end
51
+
52
+ def input(&block)
53
+ @input_processor = Dry::Validation.Schema do
54
+ configure do
55
+ config.input_processor = :sanitizer
56
+ end
57
+
58
+ instance_exec(&block)
59
+ end
60
+ end
61
+ end
62
+ end
63
+ end
64
+
65
+ require 'swamp/operation/result'
@@ -0,0 +1,74 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'dry/core/class_builder'
4
+
5
+ module Swamp::Operation
6
+ # Operations
7
+ # @example
8
+ # class MyOperation
9
+ # include Swamp::Operation
10
+ # include Swamp::Operation::Result[:id]
11
+ #
12
+ # def _call
13
+ # result.id = input[:id]
14
+ # end
15
+ #
16
+ # input do
17
+ # required(:id) { int? }
18
+ # end
19
+ # end
20
+ module Result
21
+ class << self
22
+ def [](*arguments)
23
+ WithResult.new(*arguments)
24
+ end
25
+ end
26
+
27
+ # @private
28
+ class WithResult < Module
29
+ def initialize(*args)
30
+ @result_fields = args
31
+ end
32
+
33
+ def included(base)
34
+ base.extend ClassMethods
35
+ base.include Interface
36
+ base.define_result_klass(*@result_fields)
37
+ end
38
+
39
+ # @private
40
+ module Interface
41
+ def result
42
+ @result ||= self.class.result_klass.new
43
+ end
44
+
45
+ def call(**kwargs)
46
+ before_call!(**kwargs)
47
+ _call
48
+ result
49
+ end
50
+ end
51
+
52
+ # @private
53
+ class ResultKlass
54
+ class << self
55
+ def define_fields(*fields)
56
+ fields.each do |field|
57
+ attr_accessor field
58
+ end
59
+ end
60
+ end
61
+ end
62
+
63
+ # @private
64
+ module ClassMethods
65
+ attr_accessor :result_klass
66
+
67
+ def define_result_klass(*fields)
68
+ self.result_klass = Dry::Core::ClassBuilder.new(name: 'Result', parent: ResultKlass, namespace: self).call
69
+ result_klass.define_fields(*fields)
70
+ end
71
+ end
72
+ end
73
+ end
74
+ end
metadata ADDED
@@ -0,0 +1,100 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: swamp-operation
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.2.0
5
+ platform: ruby
6
+ authors:
7
+ - Marion Duprey
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2020-07-05 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: dry-core
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: dry-validation
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: minitest
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '5'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '5'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rake
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '12'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '12'
69
+ description: Operations for Swamp (or not)
70
+ email: rubycoder@example.com
71
+ executables: []
72
+ extensions: []
73
+ extra_rdoc_files: []
74
+ files:
75
+ - lib/swamp/operation.rb
76
+ - lib/swamp/operation/result.rb
77
+ homepage:
78
+ licenses:
79
+ - MIT
80
+ metadata: {}
81
+ post_install_message:
82
+ rdoc_options: []
83
+ require_paths:
84
+ - lib
85
+ required_ruby_version: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ required_rubygems_version: !ruby/object:Gem::Requirement
91
+ requirements:
92
+ - - ">="
93
+ - !ruby/object:Gem::Version
94
+ version: '0'
95
+ requirements: []
96
+ rubygems_version: 3.0.3
97
+ signing_key:
98
+ specification_version: 4
99
+ summary: Operations for Swamp (or not)
100
+ test_files: []