redress 0.3.1 → 0.5.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 +5 -5
- data/README.md +31 -4
- data/lib/redress.rb +9 -4
- data/lib/redress/command.rb +1 -1
- data/lib/redress/form.rb +17 -21
- data/lib/redress/hooks/active_model.rb +21 -0
- data/lib/redress/identity.rb +3 -3
- data/lib/redress/types.rb +6 -2
- data/lib/redress/utils/attributes_hash.rb +1 -1
- data/lib/redress/utils/model_name_string.rb +39 -0
- data/lib/redress/utils/parse_attributes_from_params.rb +6 -3
- metadata +26 -24
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: dcc21824a6395eda1bf8c8c9dab35e5ff6e87e458d3d696ec5ebf59a03c26217
|
4
|
+
data.tar.gz: 12969e57fc763d657da28fb4f74cc923e7932282a034741f944dc3f6664b252c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cc0980ae192ae4bffe7ca1f96f2a7eea931a9120d72d3a94a90d4578f1cbfa234fb45661705bc79fa312c0724b8a61c8501a2a4fb2180cce1947337654701195
|
7
|
+
data.tar.gz: 026f35ad1df1922b4bb2ca06da41c0a2d158be430e85c3fda2b9eeab0231e17a82a9bd51c55a914c9a7541221797590cea696581262d0a91f86fac9af8488441
|
data/README.md
CHANGED
@@ -32,6 +32,11 @@ The command pattern is sometimes called a service object, an operation, an actio
|
|
32
32
|
1. wisper
|
33
33
|
2. dry-struct
|
34
34
|
3. hashie
|
35
|
+
|
36
|
+
### Optional
|
37
|
+
|
38
|
+
To support validations just add activemodel to your project
|
39
|
+
|
35
40
|
4. activemodel
|
36
41
|
|
37
42
|
## Setup
|
@@ -56,18 +61,19 @@ class ApplicationForm < Redress::Form
|
|
56
61
|
end
|
57
62
|
```
|
58
63
|
|
59
|
-
Let's define simple form:
|
64
|
+
Let's define simple form (Built-in Types https://dry-rb.org/gems/dry-types/built-in-types/):
|
60
65
|
|
61
66
|
```ruby
|
62
67
|
class SimpleForm < ApplicationForm
|
63
68
|
mimic :user
|
64
69
|
|
65
70
|
define_schema do
|
66
|
-
attribute :nickname, Redress::Types::Strict::String.default(
|
67
|
-
attribute :name,
|
68
|
-
attribute :email,
|
71
|
+
attribute :nickname, Redress::Types::Strict::String.default('superman')
|
72
|
+
attribute :name, Redress::Types::StrippedString
|
73
|
+
attribute :email, Redress::Types::StrippedString
|
69
74
|
attribute :name_with_email, String
|
70
75
|
attribute :age, Redress::Types::Coercible::Integer
|
76
|
+
atttibute :terms_of_service, Redress::Types::Bool
|
71
77
|
end
|
72
78
|
|
73
79
|
validates :name, presence: true
|
@@ -116,6 +122,27 @@ class OrderForm < Redress::Form
|
|
116
122
|
end
|
117
123
|
```
|
118
124
|
|
125
|
+
Form with context:
|
126
|
+
|
127
|
+
```ruby
|
128
|
+
class CommentForm < Redress::Form
|
129
|
+
define_schema do
|
130
|
+
attribute :id, Redress::Types::Coercible::Integer
|
131
|
+
attribute :content, Redress::Types::String
|
132
|
+
end
|
133
|
+
|
134
|
+
validates :content, presence: true
|
135
|
+
validate :unsure_order_state_waiting
|
136
|
+
|
137
|
+
private
|
138
|
+
|
139
|
+
def unsure_order_state_waiting
|
140
|
+
context.order.state?(:waiting)
|
141
|
+
end
|
142
|
+
end
|
143
|
+
|
144
|
+
CommentForm.new(content: 'Hi').with_context(order: order)
|
145
|
+
```
|
119
146
|
|
120
147
|
### Commands
|
121
148
|
|
data/lib/redress.rb
CHANGED
@@ -1,10 +1,15 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
3
|
+
require 'redress/identity'
|
4
4
|
|
5
5
|
module Redress
|
6
6
|
end
|
7
7
|
|
8
|
-
require
|
9
|
-
require
|
10
|
-
require
|
8
|
+
require 'redress/types'
|
9
|
+
require 'redress/form'
|
10
|
+
require 'redress/command'
|
11
|
+
|
12
|
+
if defined?(ActiveModel)
|
13
|
+
require 'redress/hooks/active_model'
|
14
|
+
Redress::Form.include(Redress::Hooks::ActiveModel)
|
15
|
+
end
|
data/lib/redress/command.rb
CHANGED
data/lib/redress/form.rb
CHANGED
@@ -1,32 +1,25 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
4
|
-
require
|
5
|
-
require "dry-struct"
|
3
|
+
require 'hashie/mash'
|
4
|
+
require 'dry-struct'
|
6
5
|
|
7
|
-
require
|
8
|
-
require
|
9
|
-
require
|
6
|
+
require 'redress/utils/parse_attributes_from_params'
|
7
|
+
require 'redress/utils/build_form_from_model'
|
8
|
+
require 'redress/utils/attributes_hash'
|
9
|
+
require 'redress/utils/model_name_string'
|
10
10
|
|
11
11
|
module Redress
|
12
12
|
class Form < Dry::Struct
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
DEFAULT_NAME = "Form"
|
17
|
-
SPLITTER = "::"
|
13
|
+
DEFAULT_NAME = 'Form'
|
14
|
+
SPLITTER = '::'
|
18
15
|
|
19
16
|
attr_reader :context
|
20
17
|
|
21
18
|
transform_keys(&:to_sym)
|
22
|
-
transform_types
|
23
|
-
|
24
|
-
def self.model_name
|
25
|
-
ActiveModel::Name.new(self, nil, mimicked_model_name.to_s.camelize)
|
26
|
-
end
|
19
|
+
transform_types(&:omittable)
|
27
20
|
|
28
21
|
def self.mimic(model_name)
|
29
|
-
@model_name = model_name.
|
22
|
+
@model_name = Redress::Utils::ModelNameString.new(model_name).to_sym
|
30
23
|
end
|
31
24
|
|
32
25
|
def self.mimicked_model_name
|
@@ -37,7 +30,7 @@ module Redress
|
|
37
30
|
class_name = name.split(SPLITTER).last
|
38
31
|
return :form if class_name == DEFAULT_NAME
|
39
32
|
|
40
|
-
class_name.chomp(DEFAULT_NAME).
|
33
|
+
Redress::Utils::ModelNameString.new(class_name.chomp(DEFAULT_NAME)).to_sym
|
41
34
|
end
|
42
35
|
|
43
36
|
def self.from_params(params, options = nil)
|
@@ -82,14 +75,17 @@ module Redress
|
|
82
75
|
protected
|
83
76
|
|
84
77
|
def write_attribute(name, value)
|
85
|
-
return unless self.class.
|
78
|
+
return unless self.class.has_attribute?(name)
|
79
|
+
|
86
80
|
@attributes[name] = safe_coercion(name, value)
|
87
81
|
end
|
88
82
|
|
83
|
+
private
|
84
|
+
|
89
85
|
def safe_coercion(name, value)
|
90
|
-
type = self.class.schema
|
86
|
+
type = self.class.schema.key(name)
|
91
87
|
type[value]
|
92
|
-
rescue
|
88
|
+
rescue Dry::Types::CoercionError
|
93
89
|
nil
|
94
90
|
end
|
95
91
|
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'active_model'
|
4
|
+
|
5
|
+
module Redress
|
6
|
+
module Hooks
|
7
|
+
module ActiveModel
|
8
|
+
def self.included(base)
|
9
|
+
base.extend(ClassMethods)
|
10
|
+
base.include(::ActiveModel::Validations)
|
11
|
+
base.include(::ActiveModel::Conversion)
|
12
|
+
end
|
13
|
+
|
14
|
+
module ClassMethods
|
15
|
+
def model_name
|
16
|
+
::ActiveModel::Name.new(self, nil, mimicked_model_name.to_s.camelize)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
data/lib/redress/identity.rb
CHANGED
@@ -4,15 +4,15 @@ module Redress
|
|
4
4
|
# Gem identity information.
|
5
5
|
module Identity
|
6
6
|
def self.name
|
7
|
-
|
7
|
+
'redress'
|
8
8
|
end
|
9
9
|
|
10
10
|
def self.label
|
11
|
-
|
11
|
+
'Redress'
|
12
12
|
end
|
13
13
|
|
14
14
|
def self.version
|
15
|
-
|
15
|
+
'0.5.0'
|
16
16
|
end
|
17
17
|
|
18
18
|
def self.version_label
|
data/lib/redress/types.rb
CHANGED
@@ -1,9 +1,13 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
3
|
+
require 'dry-types'
|
4
4
|
|
5
5
|
module Redress
|
6
6
|
module Types
|
7
|
-
include Dry::Types
|
7
|
+
include Dry::Types()
|
8
|
+
|
9
|
+
StrippedString = Coercible::String.constructor do |value|
|
10
|
+
value.to_s.strip.empty? ? nil : value.to_s.strip
|
11
|
+
end
|
8
12
|
end
|
9
13
|
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Redress
|
4
|
+
module Utils
|
5
|
+
class ModelNameString
|
6
|
+
attr_reader :original
|
7
|
+
|
8
|
+
def initialize(original)
|
9
|
+
@original = original.to_s
|
10
|
+
end
|
11
|
+
|
12
|
+
def to_sym
|
13
|
+
underscore_original.to_sym
|
14
|
+
end
|
15
|
+
|
16
|
+
private
|
17
|
+
|
18
|
+
def underscore_original
|
19
|
+
if original.respond_to?(:underscore)
|
20
|
+
original.underscore
|
21
|
+
else
|
22
|
+
underscore(original)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
# File activesupport/lib/active_support/inflector/methods.rb, line 92
|
27
|
+
def underscore(camel_cased_word)
|
28
|
+
return camel_cased_word unless /[A-Z-]|::/.match?(camel_cased_word)
|
29
|
+
|
30
|
+
word = camel_cased_word.to_s.gsub('::', '/')
|
31
|
+
word.gsub!(/([A-Z\d]+)([A-Z][a-z])/, '\1_\2')
|
32
|
+
word.gsub!(/([a-z\d])([A-Z])/, '\1_\2')
|
33
|
+
word.tr!('-', '_')
|
34
|
+
word.downcase!
|
35
|
+
word
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
3
|
+
require 'redress/utils/attributes_hash'
|
4
4
|
|
5
5
|
module Redress
|
6
6
|
module Utils
|
@@ -22,6 +22,7 @@ module Redress
|
|
22
22
|
|
23
23
|
def prefix
|
24
24
|
return if @options[:prefix].blank?
|
25
|
+
|
25
26
|
@prefix ||= @options[:prefix].to_s
|
26
27
|
end
|
27
28
|
|
@@ -29,11 +30,13 @@ module Redress
|
|
29
30
|
@full_prefix ||= "#{prefix}_"
|
30
31
|
end
|
31
32
|
|
32
|
-
|
33
|
+
private
|
33
34
|
|
34
35
|
def extract_attributes
|
35
36
|
hash = model_attributes.merge!(prefix_attibutes)
|
36
|
-
|
37
|
+
declared_keys = @klass.schema.keys.map(&:name)
|
38
|
+
|
39
|
+
AttributesHash.new(hash).extract!(*declared_keys)
|
37
40
|
end
|
38
41
|
|
39
42
|
def prefix_attibutes
|
metadata
CHANGED
@@ -1,57 +1,43 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: redress
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Igor Galeta
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-02-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
-
- !ruby/object:Gem::Dependency
|
14
|
-
name: activemodel
|
15
|
-
requirement: !ruby/object:Gem::Requirement
|
16
|
-
requirements:
|
17
|
-
- - ">="
|
18
|
-
- !ruby/object:Gem::Version
|
19
|
-
version: 4.2.0
|
20
|
-
type: :runtime
|
21
|
-
prerelease: false
|
22
|
-
version_requirements: !ruby/object:Gem::Requirement
|
23
|
-
requirements:
|
24
|
-
- - ">="
|
25
|
-
- !ruby/object:Gem::Version
|
26
|
-
version: 4.2.0
|
27
13
|
- !ruby/object:Gem::Dependency
|
28
14
|
name: dry-struct
|
29
15
|
requirement: !ruby/object:Gem::Requirement
|
30
16
|
requirements:
|
31
17
|
- - "~>"
|
32
18
|
- !ruby/object:Gem::Version
|
33
|
-
version:
|
19
|
+
version: '1.0'
|
34
20
|
type: :runtime
|
35
21
|
prerelease: false
|
36
22
|
version_requirements: !ruby/object:Gem::Requirement
|
37
23
|
requirements:
|
38
24
|
- - "~>"
|
39
25
|
- !ruby/object:Gem::Version
|
40
|
-
version:
|
26
|
+
version: '1.0'
|
41
27
|
- !ruby/object:Gem::Dependency
|
42
28
|
name: dry-types
|
43
29
|
requirement: !ruby/object:Gem::Requirement
|
44
30
|
requirements:
|
45
31
|
- - "~>"
|
46
32
|
- !ruby/object:Gem::Version
|
47
|
-
version:
|
33
|
+
version: '1.1'
|
48
34
|
type: :runtime
|
49
35
|
prerelease: false
|
50
36
|
version_requirements: !ruby/object:Gem::Requirement
|
51
37
|
requirements:
|
52
38
|
- - "~>"
|
53
39
|
- !ruby/object:Gem::Version
|
54
|
-
version:
|
40
|
+
version: '1.1'
|
55
41
|
- !ruby/object:Gem::Dependency
|
56
42
|
name: hashie
|
57
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -86,14 +72,28 @@ dependencies:
|
|
86
72
|
requirements:
|
87
73
|
- - "~>"
|
88
74
|
- !ruby/object:Gem::Version
|
89
|
-
version: 5.
|
75
|
+
version: '5.2'
|
90
76
|
type: :development
|
91
77
|
prerelease: false
|
92
78
|
version_requirements: !ruby/object:Gem::Requirement
|
93
79
|
requirements:
|
94
80
|
- - "~>"
|
95
81
|
- !ruby/object:Gem::Version
|
96
|
-
version: 5.
|
82
|
+
version: '5.2'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: activemodel
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: 4.2.0
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ">="
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: 4.2.0
|
97
97
|
- !ruby/object:Gem::Dependency
|
98
98
|
name: coveralls
|
99
99
|
requirement: !ruby/object:Gem::Requirement
|
@@ -234,10 +234,12 @@ files:
|
|
234
234
|
- lib/redress.rb
|
235
235
|
- lib/redress/command.rb
|
236
236
|
- lib/redress/form.rb
|
237
|
+
- lib/redress/hooks/active_model.rb
|
237
238
|
- lib/redress/identity.rb
|
238
239
|
- lib/redress/types.rb
|
239
240
|
- lib/redress/utils/attributes_hash.rb
|
240
241
|
- lib/redress/utils/build_form_from_model.rb
|
242
|
+
- lib/redress/utils/model_name_string.rb
|
241
243
|
- lib/redress/utils/parse_attributes_from_params.rb
|
242
244
|
homepage: https://github.com/galetahub/redress
|
243
245
|
licenses:
|
@@ -251,7 +253,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
251
253
|
requirements:
|
252
254
|
- - "~>"
|
253
255
|
- !ruby/object:Gem::Version
|
254
|
-
version: '2.
|
256
|
+
version: '2.5'
|
255
257
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
256
258
|
requirements:
|
257
259
|
- - ">="
|
@@ -259,7 +261,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
259
261
|
version: '0'
|
260
262
|
requirements: []
|
261
263
|
rubyforge_project:
|
262
|
-
rubygems_version: 2.6
|
264
|
+
rubygems_version: 2.7.6
|
263
265
|
signing_key:
|
264
266
|
specification_version: 4
|
265
267
|
summary: Build maintainable Ruby apps
|