massager 0.2.2 → 0.3.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 +4 -4
- data/README.md +7 -50
- data/lib/massager/attributes/attribute_with_multiple_keys.rb +25 -0
- data/lib/massager/attributes/attribute_with_single_key.rb +20 -0
- data/lib/massager/version.rb +1 -1
- data/lib/massager.rb +18 -19
- metadata +3 -3
- data/lib/massager/attributes/attribute.rb +0 -29
- data/lib/massager/attributes/enum_attribute.rb +0 -21
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c76b7d2aefdb4e9d17182759b7c7abcf25793f8b
|
4
|
+
data.tar.gz: eb96295d2ede881cf36fd89540fc16f805269c4b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: aafea83a72a4438db9be150cb8c4c230d1c12b33901214a2cec88f864afaa6c5b77adcd3fde16d75e78303042ca1663eb3ac8d08ace0f84d3775a435841ba3ac
|
7
|
+
data.tar.gz: 9fb64863a5619f31690f6d440e7602f4e1049254b95a2fcbeffb787c7d1fb42d780a8dc50e2f81be3865569481fd8f38348754195788cf86e85abbc78416a47b
|
data/README.md
CHANGED
@@ -28,7 +28,7 @@ end
|
|
28
28
|
```
|
29
29
|
In this scenario, the "bar" key's value will become the result `foo` method
|
30
30
|
```ruby
|
31
|
-
testable = ExampleClass.
|
31
|
+
testable = ExampleClass.call({"bar" => "value"})
|
32
32
|
testable.foo #=> "value"
|
33
33
|
```
|
34
34
|
## Strict schema
|
@@ -41,9 +41,9 @@ end
|
|
41
41
|
```
|
42
42
|
It will raise an error if "bar" is not passed:
|
43
43
|
```ruby
|
44
|
-
testable = ExampleClass.
|
44
|
+
testable = ExampleClass.call({"bar" => "value"})
|
45
45
|
testable.foo #=> "value"
|
46
|
-
testable = ExampleClass.
|
46
|
+
testable = ExampleClass.call({"baz" => "value"}) #=> raises ArgumentError
|
47
47
|
```
|
48
48
|
|
49
49
|
## Type checking
|
@@ -56,9 +56,9 @@ end
|
|
56
56
|
```
|
57
57
|
It will raise an error if the type is not correct:
|
58
58
|
```ruby
|
59
|
-
testable = ExampleClass.
|
59
|
+
testable = ExampleClass.call({"bar" => "value"})
|
60
60
|
testable.foo #=> "value"
|
61
|
-
testable = ExampleClass.
|
61
|
+
testable = ExampleClass.call({"bar" => 123})
|
62
62
|
testable.foo #=> raises Dry::Types::ConstraintError
|
63
63
|
```
|
64
64
|
If you want to define your own types, check the Dry Types library. Type needs to respond to `call` method, so
|
@@ -77,7 +77,7 @@ end
|
|
77
77
|
```
|
78
78
|
And it will have following result
|
79
79
|
```ruby
|
80
|
-
testable = ExampleClass.
|
80
|
+
testable = ExampleClass.call({"bar" => "value"})
|
81
81
|
testable.foo #=> "VALUE"
|
82
82
|
```
|
83
83
|
|
@@ -94,53 +94,10 @@ end
|
|
94
94
|
Note that if you pass multiple keys, the modifier block is mandatory
|
95
95
|
|
96
96
|
```ruby
|
97
|
-
testable = ExampleClass.
|
97
|
+
testable = ExampleClass.call({"bar" => "bar", "baz" => "baz"})
|
98
98
|
testable.foo #=> "bar baz"
|
99
99
|
```
|
100
100
|
|
101
|
-
## Enum attributes
|
102
|
-
If you want to have enum as a result, you will need to use `enum_attribute`
|
103
|
-
```ruby
|
104
|
-
class ExampleClass
|
105
|
-
include Massager
|
106
|
-
enum_attribute :foo, "bar", "baz"
|
107
|
-
end
|
108
|
-
```
|
109
|
-
```ruby
|
110
|
-
testable = ExampleClass.build({"bar" => "bar", "baz" => "baz"})
|
111
|
-
testable.foo #=> ["bar", "baz"]
|
112
|
-
```
|
113
|
-
|
114
|
-
## Enum attribute with modifier
|
115
|
-
You can apply modifications to the collection
|
116
|
-
```ruby
|
117
|
-
class ExampleClass
|
118
|
-
include Massager
|
119
|
-
enum_attribute :foo, "bar", "baz" do |values|
|
120
|
-
values.reverse
|
121
|
-
end
|
122
|
-
end
|
123
|
-
```
|
124
|
-
```ruby
|
125
|
-
testable = ExampleClass.build({"bar" => "bar", "baz" => "baz"})
|
126
|
-
testable.foo #=> ["baz", "bar"]
|
127
|
-
```
|
128
|
-
|
129
|
-
## Enum attribute with type check
|
130
|
-
You can provide type checks as well
|
131
|
-
```ruby
|
132
|
-
class ExampleClass
|
133
|
-
include Massager
|
134
|
-
enum_attribute :foo, "bar", "baz", type: Types::Strict::Array.member(Types::Strict::String)
|
135
|
-
end
|
136
|
-
```
|
137
|
-
```ruby
|
138
|
-
testable = ExampleClass.build({"bar" => "bar", "baz" => "baz"})
|
139
|
-
testable.foo #=> ["bar", "baz"]
|
140
|
-
|
141
|
-
testable = ExampleClass.build({"bar" => 123, "baz" => "baz"}) # Will raise Dry::Types::ConstraintError
|
142
|
-
```
|
143
|
-
|
144
101
|
## License
|
145
102
|
|
146
103
|
The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module Massager
|
2
|
+
class AttributeWithMultipleKeys
|
3
|
+
def initialize(name:, keys:, opts: {}, block: nil)
|
4
|
+
raise ArgumentError, "If you pass multiple keys, you have to use modifier block" if block.nil?
|
5
|
+
@name, @keys, @opts, @block = name, keys, opts, block
|
6
|
+
end
|
7
|
+
|
8
|
+
def call(values)
|
9
|
+
values = values.values_at(*keys)
|
10
|
+
values = block.call(*values)
|
11
|
+
Dry::Monads::Maybe(opts[:type]).fmap {|type| values = type.call(*values)}
|
12
|
+
values
|
13
|
+
end
|
14
|
+
|
15
|
+
def return_result(values)
|
16
|
+
values
|
17
|
+
end
|
18
|
+
|
19
|
+
def match_schema?(attrs)
|
20
|
+
(attrs.keys & keys).any?
|
21
|
+
end
|
22
|
+
|
23
|
+
attr_reader :keys, :block, :opts, :name
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module Massager
|
2
|
+
class AttributeWithSingleKey
|
3
|
+
def initialize(name:, key:, opts: {}, block: nil)
|
4
|
+
@name, @key, @opts, @block = name, key, opts, block
|
5
|
+
end
|
6
|
+
|
7
|
+
def call(values)
|
8
|
+
value = values.fetch(key)
|
9
|
+
Dry::Monads::Maybe(block).fmap {|block| value = block.call(value)}
|
10
|
+
Dry::Monads::Maybe(opts[:type]).fmap {|type| value = type.call(value)}
|
11
|
+
value
|
12
|
+
end
|
13
|
+
|
14
|
+
def match_schema?(attrs)
|
15
|
+
attrs.keys.include?(key)
|
16
|
+
end
|
17
|
+
|
18
|
+
attr_reader :key, :block, :opts, :name
|
19
|
+
end
|
20
|
+
end
|
data/lib/massager/version.rb
CHANGED
data/lib/massager.rb
CHANGED
@@ -4,33 +4,31 @@ require "dry-monads"
|
|
4
4
|
require "dry-container"
|
5
5
|
require "set"
|
6
6
|
|
7
|
-
require "massager/attributes/
|
8
|
-
require "massager/attributes/
|
7
|
+
require "massager/attributes/attribute_with_single_key"
|
8
|
+
require "massager/attributes/attribute_with_multiple_keys"
|
9
9
|
|
10
10
|
module Massager
|
11
11
|
module ClassMethods
|
12
12
|
def attribute(name, *target_keys, **opts, &block)
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
EnumAttribute.new(name: name, target_keys: target_keys, opts: opts, block: block)
|
24
|
-
)
|
13
|
+
case
|
14
|
+
when target_keys.count > 1
|
15
|
+
register_attribute(
|
16
|
+
AttributeWithMultipleKeys.new(name: name, keys: target_keys, opts: opts, block: block)
|
17
|
+
)
|
18
|
+
when target_keys.count == 1
|
19
|
+
register_attribute(
|
20
|
+
AttributeWithSingleKey.new(name: name, key: target_keys.first, opts: opts, block: block)
|
21
|
+
)
|
22
|
+
end
|
25
23
|
add_keys_to_schema(opts, target_keys)
|
26
24
|
define_setter(name)
|
27
25
|
define_getter(name)
|
28
26
|
end
|
29
27
|
|
30
|
-
def
|
28
|
+
def call(attrs)
|
31
29
|
check_schema(attrs)
|
32
30
|
instance = new
|
33
|
-
each_key do |k|
|
31
|
+
_container.each_key.select {|a| a.include?("attributes.")}.each do |k|
|
34
32
|
attribute = resolve(k)
|
35
33
|
instance.public_send("#{attribute.name}=", attrs) if attribute.match_schema?(attrs)
|
36
34
|
end
|
@@ -41,9 +39,10 @@ module Massager
|
|
41
39
|
|
42
40
|
def check_schema(attrs)
|
43
41
|
attr_keys = attrs.keys.to_set
|
44
|
-
if key?(
|
45
|
-
schema = resolve(
|
46
|
-
|
42
|
+
if _container.key?("schema")
|
43
|
+
schema = resolve("schema")
|
44
|
+
attr_keys = attr_keys.find_all {|a| schema.include?(a)}
|
45
|
+
raise ArgumentError, "Missing keys: #{(schema - attr_keys).to_a}" unless schema.subset?(attr_keys.to_set)
|
47
46
|
end
|
48
47
|
end
|
49
48
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: massager
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Janis Miezitis
|
@@ -99,8 +99,8 @@ files:
|
|
99
99
|
- bin/console
|
100
100
|
- bin/setup
|
101
101
|
- lib/massager.rb
|
102
|
-
- lib/massager/attributes/
|
103
|
-
- lib/massager/attributes/
|
102
|
+
- lib/massager/attributes/attribute_with_multiple_keys.rb
|
103
|
+
- lib/massager/attributes/attribute_with_single_key.rb
|
104
104
|
- lib/massager/version.rb
|
105
105
|
- massager.gemspec
|
106
106
|
homepage: http://github.com/janjiss/massager
|
@@ -1,29 +0,0 @@
|
|
1
|
-
module Massager
|
2
|
-
class Attribute
|
3
|
-
def initialize(name:, target_keys:, opts: {}, block: nil)
|
4
|
-
raise ArgumentError, "If you pass multiple keys, you have to use modifier block" if block.nil? && target_keys.count > 1
|
5
|
-
@name, @target_keys, @opts, @block = name, target_keys, opts, block
|
6
|
-
end
|
7
|
-
|
8
|
-
def call(values)
|
9
|
-
begin
|
10
|
-
values = values.values_at(*target_keys)
|
11
|
-
Dry::Monads::Maybe(block).fmap {|block| values = block.call(*values)}
|
12
|
-
Dry::Monads::Maybe(opts[:type]).fmap {|type| values = type.call(*values)}
|
13
|
-
return_result(*values)
|
14
|
-
rescue ArgumentError
|
15
|
-
raise ArgumentError, "The result of modifier block should return single element"
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
def return_result(values)
|
20
|
-
values
|
21
|
-
end
|
22
|
-
|
23
|
-
def match_schema?(attrs)
|
24
|
-
(attrs.keys & target_keys).any?
|
25
|
-
end
|
26
|
-
|
27
|
-
attr_reader :target_keys, :block, :opts, :name
|
28
|
-
end
|
29
|
-
end
|
@@ -1,21 +0,0 @@
|
|
1
|
-
module Massager
|
2
|
-
class EnumAttribute
|
3
|
-
def initialize(name:, target_keys:, opts: {}, block:)
|
4
|
-
@name, @target_keys, @opts, @block = name, target_keys, opts, block
|
5
|
-
end
|
6
|
-
|
7
|
-
def call(values)
|
8
|
-
values = values.values_at(*target_keys)
|
9
|
-
Dry::Monads::Maybe(block).fmap {|block| values = block.call(values)}
|
10
|
-
Dry::Monads::Maybe(opts[:type]).fmap {|type| values = type.call(values)}
|
11
|
-
raise ArgumentError, "The result of modifier block is not an enum" unless values.respond_to? :each
|
12
|
-
values
|
13
|
-
end
|
14
|
-
|
15
|
-
def match_schema?(attrs)
|
16
|
-
(attrs.keys & target_keys).any?
|
17
|
-
end
|
18
|
-
|
19
|
-
attr_reader :target_keys, :block, :opts, :name
|
20
|
-
end
|
21
|
-
end
|