swamp-operation 1.2.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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: []