composable_decorator 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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 2135a3c4a581123c60cddd695143272d269214a3
4
- data.tar.gz: 19fdc6f5d95b0a2ecc601edd12020a533c7b21e4
3
+ metadata.gz: 339be8c69b309eb18dfa6fce7c507ac267378f2f
4
+ data.tar.gz: 90efef0f24844e535c44f6001855492e16a3d5bd
5
5
  SHA512:
6
- metadata.gz: 3964c582e98ba1a5b2a233369580c2f0102b3b12f7d7cbd4afa57bfc5f087bd94b9ecd3bc374fe1cb9aeaa907154949d01486b7593a1591551d62430e4c1d981
7
- data.tar.gz: 70e9f2e657000046f24523c3ff68fc93bd4bc6ab4fad230159628a68152ef2bcd452eaab2ddad5cc06d6d5f8d5af1f0f51c8c0698f88150f39de9508234d0b9e
6
+ metadata.gz: c87d91aacc84de01256031ab4ac45b3293d36596048d1ede50e4b5b57ab08284670052f702f64807b34f84a5488d3e6ddbe30e78c883f3d4ca18c31fbe4920b6
7
+ data.tar.gz: 17cf2b556842084a8c9a153bc02fe9d69b07bece72ce0c6389e255f41428eaad9d07f70a40d01185fd2e0ad733131ff6150d7fb801d644b0a4f9867a579ae9ba
data/README.md CHANGED
@@ -7,6 +7,9 @@ A simple, composable decorator for Rails models.
7
7
  class User < ActiveRecord::Base
8
8
  decorate_with NameDecorator, PhoneNumberDecorator
9
9
  end
10
+
11
+ @user = User.find(1).decorate
12
+ @user.full_name # => "Jane Smith"
10
13
  ```
11
14
 
12
15
  ## Installation
@@ -27,40 +30,37 @@ Or install it yourself as:
27
30
 
28
31
  ## Usage
29
32
 
33
+ Decorators are declared as modules.
34
+
30
35
  ```ruby
31
- # Decorators are declared in the /decorators folder
32
- #
33
- # app/decorators/name.rb
34
- module Name
36
+ module NameDecorator
35
37
  def full_name
36
38
  "#{first_Name} #{last_name}"
37
39
  end
38
40
  end
41
+ ```
39
42
 
40
- module PhoneNumber
41
- def full_phone_number
42
- "(#{area_code}) #{phone_number}"
43
- end
44
- end
43
+ A `#decorate_with` method is called in the model that lists the order of decorators to be added to the instance.
45
44
 
46
- # a #decorate method is declared in the model, that lists the order of decorators
47
- # to be called on the instance. The name of this method must be the same across
48
- # multiple models in order to decorate the AR relationships
49
- #
45
+ ```ruby
50
46
  # /app/models/user.rb
51
47
  class User < ActiveRecord::Base
52
- decorate_with Name, PhoneNumber
48
+ decorate_with NameDecorator, PhoneNumberDecorator
53
49
  end
50
+ ```
51
+
52
+ This is roughly the equivalent of wrapping the instance in first the Name decorator, then the PhoneNumber decorator, i.e.:
54
53
 
55
- # this is roughly the equivalent of wrapping the instance in first the Name decorator,
56
- # then the PhoneNumber decorator, i.e.
54
+ ```ruby
57
55
  class User < ActiveRecord::Base
58
- extend Name
59
- extend PhoneNumber
56
+ extend NameDecorator
57
+ extend PhoneNumberDecorator
60
58
  end
59
+ ```
60
+
61
+ We can then decorate the model in the controller and access the decorated methods in the view.
61
62
 
62
- # we can then decorate the model in the controller
63
- #
63
+ ```ruby
64
64
  # /app/controllers/users_controller.rb
65
65
  class UsersController
66
66
  def show
@@ -69,15 +69,15 @@ class UsersController
69
69
  end
70
70
  end
71
71
 
72
- # and we can access the decorated methods in the view
73
- #
74
72
  # /app/views/users/show.html.slim
75
73
  @user.full_name
76
74
  @user.full_phone_number
77
75
 
78
- # decorators are inherited
79
- #
80
- #
76
+ ```
77
+
78
+ Decorators are inherited
79
+
80
+ ```ruby
81
81
  module HatDecorator
82
82
  def hat_decorated_method
83
83
  "hat decorator method"
@@ -92,10 +92,20 @@ class Stetson < Hat
92
92
  end
93
93
 
94
94
  Stetson.new.decorate.hat_decorator_method #=> "hat decorator method"
95
+ ```
96
+
97
+
98
+ ### Delegating an association's decorated methods
99
+
100
+ We can delegate the association's decorated methods to the instance all at once.
101
+
102
+ ```ruby
103
+ module AddressDecorator
104
+ def simple_format
105
+ "#{street}, #{city}"
106
+ end
107
+ end
95
108
 
96
- # DELEGATIONS
97
- #
98
- # We can delegate the association's decorated methods to the model
99
109
  class Address < ActiveRecord::Base
100
110
  decorate_with AddressDecorator
101
111
  end
@@ -104,10 +114,8 @@ class User
104
114
  delegate_decorated_to :address
105
115
  end
106
116
 
107
- # which delegates all the decorated methods created in Address#decorate to User
108
- #
109
117
  # /app/views/users/show.html.slim
110
- @user.address_simple_format
118
+ User.find(1).decorate.address_simple_format
111
119
  ```
112
120
 
113
121
  ## Contributing
@@ -6,14 +6,13 @@ module ComposableDecorator
6
6
  def self.included(mod)
7
7
  mod.extend DSL
8
8
 
9
- mod.__define_delegation
10
- mod.__initialize_decorators
9
+ mod.__initialize
11
10
  end
12
11
 
13
12
  def decorate
14
13
  __add_decorators
15
14
  __decorate_associations
16
- __delegate_decorated_association_methods
15
+ __delegate_decorated_associations
17
16
 
18
17
  self
19
18
  end
@@ -30,15 +29,21 @@ module ComposableDecorator
30
29
  end
31
30
  end
32
31
 
33
- private def __delegate_decorated_association_methods
34
- __associations.each do |assoc|
32
+ private def __delegate_decorated_associations
33
+ __delegations.each do |delegation|
34
+ __delegate_decorated_association_group(delegation)
35
+ end
36
+ end
37
+
38
+ private def __delegate_decorated_association_group(delegation)
39
+ delegation[:associations].each do |assoc|
35
40
  methods = __decorator_methods(assoc)
36
41
 
37
42
  self.class.delegate(
38
43
  *methods,
39
44
  to: assoc,
40
- prefix: __prefix,
41
- allow_nil: __allow_nil)
45
+ prefix: delegation[:prefix],
46
+ allow_nil: delegation[:allow_nil])
42
47
  end
43
48
  end
44
49
 
@@ -50,6 +55,10 @@ module ComposableDecorator
50
55
  self.class.__associations
51
56
  end
52
57
 
58
+ private def __delegations
59
+ self.class.__delegations
60
+ end
61
+
53
62
  private def __decorator_methods(assoc)
54
63
  __association_class(assoc).__decorators.map(&:instance_methods).flatten
55
64
  end
@@ -17,8 +17,10 @@ module ComposableDecorator
17
17
  define_singleton_method(:__decorators) { decorators + existing_decorators }
18
18
  end
19
19
 
20
- def __initialize_decorators
20
+ def __initialize
21
21
  define_singleton_method(:__decorators) { [] }
22
+ define_singleton_method(:__associations) { [] }
23
+ define_singleton_method(:__delegations) { [] }
22
24
  end
23
25
 
24
26
  # # delegates all of the decorated methods for each has_one or belongs_to association.
@@ -46,16 +48,26 @@ module ComposableDecorator
46
48
  existing_associations = __associations
47
49
 
48
50
  __define_delegation(
49
- associations: associations + existing_associations,
51
+ associations: associations,
50
52
  prefix: prefix,
51
53
  allow_nil: allow_nil,
52
54
  handle_nil_with: handle_nil_with)
55
+
56
+ define_singleton_method(:__associations) { associations + existing_associations }
53
57
  end
54
58
 
55
59
  def __define_delegation(associations: [], prefix: true, allow_nil: true, handle_nil_with: '')
56
- define_singleton_method(:__associations) { associations }
57
- define_method(:__prefix) { prefix }
58
- define_method(:__allow_nil) { allow_nil }
60
+ existing_delegations = __delegations
61
+
62
+ define_singleton_method(:__delegations) {
63
+ [
64
+ {
65
+ associations: associations,
66
+ prefix: prefix,
67
+ allow_nil: allow_nil
68
+ }
69
+ ] + existing_delegations
70
+ }
59
71
  end
60
72
  end
61
73
  end
@@ -1,3 +1,3 @@
1
1
  module ComposableDecorator
2
- VERSION = "0.2.2"
2
+ VERSION = "0.3.0"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: composable_decorator
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.2
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Adam Steel
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2015-12-24 00:00:00.000000000 Z
11
+ date: 2016-05-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails