hexx-entities 0.0.1 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 0cfb1586f444fcffc282f8875fc0f158e93e190e
4
- data.tar.gz: b7ed4909ae9aeb7cd0e91969d418e852dd80f063
3
+ metadata.gz: 5c93ee8a3d4271e91a696427b35b8a6ba05da2a0
4
+ data.tar.gz: 6f69ca96cbb85cbafbf36a9b8946552f3cdc69b2
5
5
  SHA512:
6
- metadata.gz: f4b9a371d643448b7a762f2797a1666ad10401d2f006de90250000fe869b03d28475c86b26d67bed7785a959e6ae65cf04cad84e090e785c42d1b434a7cfaeda
7
- data.tar.gz: d4b415a67d586bd3fa957db482344a04b6713ac5e20d918c77864ff64c4b10445d68595be294fc3d1f18dfe02c628e6c2ba8aaf49eb5ffe7d56fb05d677ed4e5
6
+ metadata.gz: 10b1cdf1f6695351854f948df670eb34104ae9e6bce235619847d559d4a15454ad58085039fbd565d428f0ce6b0633e53252c718f9bc6d425ae19fa122d9cb3b
7
+ data.tar.gz: 417fe608dfa733f29eb8a198698cc5e2b730c07fb0af8a91bffa757a285d85d5ed7f259073a724cff8f0f9276d27254018af1c5cfd48e3985d247bba2940a6ee
data/README.md CHANGED
@@ -52,12 +52,18 @@ class Item < Hexx::Entities::Base
52
52
  end # class Item
53
53
 
54
54
  item = Item.new foo: 1
55
+
56
+ item.frozen?
57
+ # => true
55
58
  item.attributes
56
59
  # => { uuids: ["31a840f4-71e2-4de1-3a6f-04d2103aa2e8"], foo: "1", bar: nil }
57
60
  item.validate!
58
61
  # <Attestor::InvalidError> because bar is nil
59
62
  ```
60
63
 
64
+ To model parts of aggregate entities, that have no identity by themselves,
65
+ use `Hexx::Entitites::Part`. The part is just the entity without `uuids`.
66
+
61
67
  Installation
62
68
  ------------
63
69
 
data/lib/hexx-entities.rb CHANGED
@@ -10,6 +10,7 @@ require "securerandom" # for uuids
10
10
  module Hexx
11
11
 
12
12
  require_relative "hexx/entities" # for namespace
13
+ require_relative "hexx/entities/part"
13
14
  require_relative "hexx/entities/uuid"
14
15
  require_relative "hexx/entities/uuids"
15
16
  require_relative "hexx/entities/base"
@@ -2,7 +2,7 @@
2
2
 
3
3
  module Hexx::Entities
4
4
 
5
- # Class Base provides a common interface for entities
5
+ # Class Base provides a common interface for entities, that have identity
6
6
  #
7
7
  # @example
8
8
  # require "hexx-entities"
@@ -20,10 +20,7 @@ module Hexx::Entities
20
20
  # @author Andrew Kozin <Andrew.Kozin@gmail.com>
21
21
  #
22
22
  # @api public
23
- class Base
24
- include Attestor::Validations
25
- include Comparable
26
- include Eigindir
23
+ class Base < Part
27
24
 
28
25
  # @!scope class
29
26
  # @!method new(attributes)
@@ -36,7 +33,7 @@ module Hexx::Entities
36
33
  # @private
37
34
  def initialize(uuids: nil, **attributes)
38
35
  @uuids = UUIDs.build Array(uuids)
39
- self.attributes = attributes
36
+ super attributes
40
37
  end
41
38
 
42
39
  # @!attribute [rw] uuids
@@ -58,19 +55,6 @@ module Hexx::Entities
58
55
  (other.uuids & uuids).any?
59
56
  end
60
57
 
61
- # Recursively serializes the entity to the hash
62
- #
63
- # Returns the hash of entity attributes, where every attribute
64
- # that responds to `serialize` is serialized in its turn.
65
- #
66
- # @return [Hash]
67
- def serialize
68
- values = attributes.values.map do |item|
69
- item.respond_to?(:serialize) ? item.serialize : item
70
- end
71
- attributes.keys.zip(values).to_h
72
- end
73
-
74
58
  end # class Base
75
59
 
76
60
  end # module Hexx::Entities
@@ -0,0 +1,57 @@
1
+ # encoding: utf-8
2
+
3
+ module Hexx::Entities
4
+
5
+ # Class Part provides a common interface for parts of aggregate entities
6
+ #
7
+ # @example
8
+ # require "hexx-entities"
9
+ #
10
+ # class Item < Hexx::Entities::Part
11
+ #
12
+ # # Defines attributes with their coercers
13
+ # attribute :foo, coerce: ->(value) { value.to_s }
14
+ #
15
+ # # Defines validation for the entity
16
+ # validate { invalid :blank_foo unless foo }
17
+ #
18
+ # end # class Item
19
+ #
20
+ # @author Andrew Kozin <Andrew.Kozin@gmail.com>
21
+ #
22
+ # @api public
23
+ class Part
24
+ include Attestor::Validations
25
+ include Comparable
26
+ include Eigindir
27
+
28
+ # @!scope class
29
+ # @!method new(attributes)
30
+ # Creates the immutable object
31
+ #
32
+ # @param [Hash] attributes
33
+ #
34
+ # @return [Hexx::Entities::Part]
35
+
36
+ # @private
37
+ def initialize(**attributes)
38
+ self.attributes = attributes
39
+ freeze
40
+ end
41
+
42
+ # Recursively serializes the part to the hash
43
+ #
44
+ # Returns the hash of attributes, where every attribute
45
+ # that responds to `serialize` is serialized in its turn.
46
+ #
47
+ # @return [Hash]
48
+ def serialize
49
+ values = attributes.values.map do |item|
50
+ item.respond_to?(:serialize) ? item.serialize : item
51
+ end
52
+ attributes.keys.zip(values).to_h
53
+ end
54
+
55
+ end # class Part
56
+
57
+ end # module Hexx::Entities
@@ -6,7 +6,7 @@ module Hexx
6
6
 
7
7
  # The semantic version of the module.
8
8
  # @see http://semver.org/ Semantic versioning 2.0
9
- VERSION = "0.0.1".freeze
9
+ VERSION = "0.1.1".freeze
10
10
 
11
11
  end # module Entities
12
12
 
@@ -11,22 +11,8 @@ describe Hexx::Entities::Base do
11
11
 
12
12
  describe ".new" do
13
13
 
14
- it "creates validatable object" do
15
- expect(subject).to be_kind_of Attestor::Validations
16
- end
17
-
18
- it "creates attributable object" do
19
- expect(subject).to be_kind_of Eigindir
20
- end
21
-
22
- it "creates comparable object" do
23
- expect(subject).to be_kind_of Comparable
24
- end
25
-
26
- it "initializes attributes from hash" do
27
- klass.attribute :foo
28
- subject = klass.new foo: :bar
29
- expect(subject.foo).to eq :bar
14
+ it "creates a part" do
15
+ expect(subject).to be_kind_of Hexx::Entities::Part
30
16
  end
31
17
 
32
18
  end # describe .new
@@ -0,0 +1,55 @@
1
+ # encoding: utf-8
2
+
3
+ require "attestor/rspec"
4
+
5
+ describe Hexx::Entities::Part do
6
+ include Attestor::RSpec # helpers and matchers for validations
7
+
8
+ let(:klass) { Class.new(described_class) }
9
+
10
+ subject(:entity) { klass.new }
11
+
12
+ describe ".new" do
13
+
14
+ it "creates validatable object" do
15
+ expect(subject).to be_kind_of Attestor::Validations
16
+ end
17
+
18
+ it "creates attributable object" do
19
+ expect(subject).to be_kind_of Eigindir
20
+ end
21
+
22
+ it "creates comparable object" do
23
+ expect(subject).to be_kind_of Comparable
24
+ end
25
+
26
+ it "initializes attributes from hash" do
27
+ klass.attribute :foo
28
+ subject = klass.new foo: :bar
29
+ expect(subject.foo).to eq :bar
30
+ end
31
+
32
+ it "creates immutable object" do
33
+ expect(subject).to be_frozen
34
+ end
35
+
36
+ end # describe .new
37
+
38
+ describe "#serialize" do
39
+
40
+ before { klass.attribute :foo }
41
+ before { klass.attribute :bar }
42
+
43
+ let(:bar) { double }
44
+ let(:baz) { double serialize: { baz: :baz } }
45
+ let(:uuids) { [SecureRandom.uuid] }
46
+
47
+ subject(:entity) { klass.new(foo: bar, bar: baz) }
48
+
49
+ it "returns a nested hash" do
50
+ expect(entity.serialize).to eq(foo: bar, bar: { baz: :baz })
51
+ end
52
+
53
+ end # describe #to_hash
54
+
55
+ end # describe Hexx::Entities::Part
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hexx-entities
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrew Kozin
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-04-29 00:00:00.000000000 Z
11
+ date: 2015-05-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: attestor
@@ -87,11 +87,13 @@ files:
87
87
  - lib/hexx-entities.rb
88
88
  - lib/hexx/entities.rb
89
89
  - lib/hexx/entities/base.rb
90
+ - lib/hexx/entities/part.rb
90
91
  - lib/hexx/entities/uuid.rb
91
92
  - lib/hexx/entities/uuids.rb
92
93
  - lib/hexx/entities/version.rb
93
94
  - spec/spec_helper.rb
94
95
  - spec/tests/base_spec.rb
96
+ - spec/tests/part_spec.rb
95
97
  - spec/tests/uuid_spec.rb
96
98
  - spec/tests/uuids_spec.rb
97
99
  homepage: https://github.com/nepalez/hexx-entities
@@ -120,6 +122,7 @@ specification_version: 4
120
122
  summary: Base class for domain entities
121
123
  test_files:
122
124
  - spec/spec_helper.rb
125
+ - spec/tests/part_spec.rb
123
126
  - spec/tests/uuid_spec.rb
124
127
  - spec/tests/uuids_spec.rb
125
128
  - spec/tests/base_spec.rb