swamp-operation 1.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/lib/swamp/operation.rb +65 -0
- data/lib/swamp/operation/result.rb +74 -0
- metadata +100 -0
checksums.yaml
ADDED
@@ -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: []
|