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.
- 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: []
|