massager 0.2.0 → 0.2.1

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 53f2c10f9317523283972f8951006e762166f9c9
4
- data.tar.gz: ce31aa5c501efde93d6b7fa5ad2787690e502689
3
+ metadata.gz: cbe0172b4b689156c4e488c3860b272c096b3c7c
4
+ data.tar.gz: 4ee1813aa3fdf68ea08f431eb1a66910d8c61347
5
5
  SHA512:
6
- metadata.gz: 738f93609dbd29d766e922f239d2da48aab11404b449e7a0041263f8f3af7dd493c83acb3120e7a208c134ad9627d3244d9f793dbf89316cc44b6ea7cad9aa6d
7
- data.tar.gz: b5e655c41a1a8623a006c4f09190508a22e648c2ce79f7b29f26a2af6fa21206562d26db128042faa8ea5f1e785492a42eb33dedfc7da0ddfcf90d42e6d28ba1
6
+ metadata.gz: d8704155886d7bf79ca08f2f3a73032a9a49b25fba6a7e65c65e37b12d270999acd0eddc49c6eac43f8a10ea2dda30cac26a129045f1d4d7edfb0d227e99ac07
7
+ data.tar.gz: d2b8547a4d30459cf7346f0055e87ad529e07d616f44042e6dd72a01681da788934e46e03ff7f93f741b68de0495015254180e734a888da83bf3aae0fdaeb671
data/README.md CHANGED
@@ -31,6 +31,20 @@ In this scenario, the "bar" key's value will become the result `foo` method
31
31
  testable = ExampleClass.build({"bar" => "value"})
32
32
  testable.foo #=> "value"
33
33
  ```
34
+ ## Strict schema
35
+ You can have required keys defined with `strict: true`
36
+ ```ruby
37
+ class ExampleClass
38
+ include Massager
39
+ attribute :foo, "bar", strict: true
40
+ end
41
+ ```
42
+ It will raise an error if "bar" is not passed:
43
+ ```ruby
44
+ testable = ExampleClass.build({"bar" => "value"})
45
+ testable.foo #=> "value"
46
+ testable = ExampleClass.build({"baz" => "value"}) #=> raises ArgumentError
47
+ ```
34
48
 
35
49
  ## Type checking
36
50
  You can also pass type checks using dry-types library:
@@ -1,3 +1,3 @@
1
1
  module Massager
2
- VERSION = "0.2.0"
2
+ VERSION = "0.2.1"
3
3
  end
data/lib/massager.rb CHANGED
@@ -2,6 +2,7 @@ require "massager/version"
2
2
  require "dry-types"
3
3
  require "dry-monads"
4
4
  require "dry-container"
5
+ require "set"
5
6
 
6
7
  require "massager/attributes/attribute"
7
8
  require "massager/attributes/enum_attribute"
@@ -9,41 +10,63 @@ require "massager/attributes/enum_attribute"
9
10
  module Massager
10
11
  module ClassMethods
11
12
  def attribute(name, *target_keys, **opts, &block)
12
- set_container
13
13
  register_attribute(
14
14
  Attribute.new(name: name, target_keys: target_keys, opts: opts, block: block)
15
15
  )
16
+ add_to_schema(opts, target_keys)
16
17
  define_setter(name)
17
18
  define_getter(name)
18
19
  end
19
20
 
20
21
  def enum_attribute(name, *target_keys, **opts, &block)
21
- set_container
22
22
  register_attribute(
23
23
  EnumAttribute.new(name: name, target_keys: target_keys, opts: opts, block: block)
24
24
  )
25
+ add_to_schema(opts, target_keys)
25
26
  define_setter(name)
26
27
  define_getter(name)
27
28
  end
28
29
 
29
30
  def build(attrs)
31
+ check_schema(attrs)
30
32
  instance = new
31
- container.each_key do |k|
32
- attribute = container.resolve(k)
33
- instance.public_send("#{k}=", attrs) if attribute.match_schema?(attrs)
33
+ each_key do |k|
34
+ attribute = resolve(k)
35
+ instance.public_send("#{attribute.name}=", attrs) if attribute.match_schema?(attrs)
34
36
  end
35
37
  instance
36
38
  end
37
39
 
38
40
  private
39
41
 
42
+ def check_schema(attrs)
43
+ attr_keys = attrs.keys.to_set
44
+ if key?(:schema)
45
+ schema = resolve(:schema)
46
+ raise ArgumentError, "Missing keys: #{(schema - attr_keys).to_a}" unless schema.superset?(attr_keys)
47
+ end
48
+ end
49
+
50
+ def add_keys_to_schema(opts, target_keys)
51
+ Dry::Monads::Maybe(opts[:strict]).fmap {
52
+ unless key?(:schema)
53
+ register(:schema, Set.new)
54
+ end
55
+ target_keys.each do |k|
56
+ resolve(:schema) << k
57
+ end
58
+ }
59
+ end
60
+
40
61
  def register_attribute(attribute)
41
- container.register(attribute.name) {attribute}
62
+ namespace(:attributes) do
63
+ register(attribute.name, attribute)
64
+ end
42
65
  end
43
66
 
44
67
  def define_setter(name)
45
68
  define_method "#{name}=", Proc.new {|values|
46
- attribute = self.class.container.resolve(name)
69
+ attribute = self.class.resolve("attributes.#{name}")
47
70
  instance_variable_set(:"@#{name}", attribute.call(values))
48
71
  }
49
72
  end
@@ -53,15 +76,10 @@ module Massager
53
76
  instance_variable_get(:"@#{name}")
54
77
  }
55
78
  end
56
-
57
- def set_container
58
- self.define_singleton_method(:container) do
59
- @container ||= Dry::Container.new
60
- end
61
- end
62
79
  end
63
80
 
64
81
  def self.included(base)
65
82
  base.extend(ClassMethods)
83
+ base.extend(Dry::Container::Mixin)
66
84
  end
67
85
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: massager
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Janis Miezitis
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2016-09-16 00:00:00.000000000 Z
11
+ date: 2016-09-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: dry-types