magic-decorator 0.2.0 → 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/CHANGELOG.md +13 -0
- data/README.md +32 -1
- data/lib/magic/decoratable.rb +16 -2
- data/lib/magic/decorator/base.rb +2 -1
- data/lib/magic/decorator/version.rb +1 -1
- data/sig/magic/decoratable.rbs +8 -5
- metadata +17 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 673fe3ecf73066b97e1076dfb9a41e7fb31732396e9c39a5f97561d1ec2e616f
|
4
|
+
data.tar.gz: 44c33204523d4022f8b2b1c1eb28dd51f5a3499d5001cdfae97fff59568d89d1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 309f3a70d8ce2ae726375e59e152a77d044b7ffe52d8f7064e4baefe964aecc90c4a835dbf3e5474a56e0c7de08e0cb0e975e3e65bc3872a2cc2a18f2a401885
|
7
|
+
data.tar.gz: 595d311692d8db65bb29e0adc44222a48abea98b7b869a62d6b823cb436801be1317cddfc9c4caacf9a6514ec8cc0a1182a1b26c005f9efe2c52fa0d48cca2fc
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,15 @@
|
|
1
|
+
## [0.3.0] — 2024-10-27
|
2
|
+
|
3
|
+
### Added
|
4
|
+
|
5
|
+
- Improved extendability: one may override `Magic::Decoratable#decorator_base` to be used for lookups.
|
6
|
+
- `Magic::Decoratable.classes` for all the decoratables.
|
7
|
+
|
8
|
+
### Fixed
|
9
|
+
|
10
|
+
- Failures on double decoration attempts.
|
11
|
+
|
12
|
+
|
1
13
|
## [0.2.0] — 2024-10-17
|
2
14
|
|
3
15
|
### Changed
|
@@ -19,6 +31,7 @@
|
|
19
31
|
- enables _double-splat_ operator: `**decorated`,
|
20
32
|
- enumerating methods yield decorated items.
|
21
33
|
|
34
|
+
|
22
35
|
## [0.1.0] — 2024-10-13
|
23
36
|
|
24
37
|
### Added
|
data/README.md
CHANGED
@@ -1,5 +1,8 @@
|
|
1
1
|
# 🪄 Magic Decorator
|
2
2
|
|
3
|
+

|
3
6
|

|
@@ -60,12 +63,40 @@ One can test for the object is actually decorated with `#decorated?`.
|
|
60
63
|
.decorated? # => true
|
61
64
|
```
|
62
65
|
|
63
|
-
|
66
|
+
### Extending decorator logic
|
67
|
+
|
68
|
+
When extending `Magic::Decoratable`, one may override `#decorator_base` to be used for lookup.
|
69
|
+
|
70
|
+
```ruby
|
71
|
+
class Special::Decorator < Magic::Decorator::Base
|
72
|
+
def self.name_for object_class
|
73
|
+
"Special::#{object_class}Decorator"
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
module Special::Decoratable
|
78
|
+
include Magic::Decoratable
|
79
|
+
|
80
|
+
private
|
81
|
+
|
82
|
+
def decorator_base = Special::Decorator
|
83
|
+
end
|
84
|
+
|
85
|
+
class Special::Model
|
86
|
+
include Special::Decoratable
|
87
|
+
end
|
88
|
+
|
89
|
+
Special::Model.new.decorate # looks for Special::Decorator descendants
|
90
|
+
```
|
91
|
+
|
92
|
+
## 🪄 Magic
|
64
93
|
|
65
94
|
### Decoratable scope
|
66
95
|
|
67
96
|
`Magic::Decoratable` is mixed into `Object` by default. It means that effectively any object is _magically decoratable_.
|
68
97
|
|
98
|
+
One can use `Magic::Decoratable.classes` to see all the decoratable classes.
|
99
|
+
|
69
100
|
### Decoration expansion
|
70
101
|
|
71
102
|
For almost any method called on a decorated object, both its result and `yield`ed arguments get decorated.
|
data/lib/magic/decoratable.rb
CHANGED
@@ -1,14 +1,28 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require 'active_support/concern'
|
4
|
+
|
3
5
|
module Magic
|
4
6
|
module Decoratable
|
7
|
+
extend ActiveSupport::Concern
|
8
|
+
|
9
|
+
class_methods do
|
10
|
+
def classes
|
11
|
+
ObjectSpace.each_object(Class)
|
12
|
+
.select { _1 < self }
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
extend ClassMethods
|
17
|
+
|
5
18
|
def decorate = decorator&.new self
|
6
|
-
def decorate! = decorate || raise(Lookup::Error.for self,
|
19
|
+
def decorate! = decorate || raise(Lookup::Error.for self, decorator_base)
|
7
20
|
def decorated = decorate || self
|
8
21
|
def decorated? = false
|
9
22
|
|
10
23
|
private
|
11
24
|
|
12
|
-
def decorator
|
25
|
+
def decorator = decorator_base.for self.class
|
26
|
+
def decorator_base = Decorator
|
13
27
|
end
|
14
28
|
end
|
data/lib/magic/decorator/base.rb
CHANGED
data/sig/magic/decoratable.rbs
CHANGED
@@ -1,13 +1,16 @@
|
|
1
1
|
module Magic
|
2
2
|
module Decoratable
|
3
|
-
def
|
4
|
-
def decorate!: -> Decorator
|
5
|
-
def decorated: -> (Decorator | self)
|
3
|
+
def self.classes: () -> Array[Class]
|
6
4
|
|
7
|
-
def
|
5
|
+
def decorate: () -> Decorator?
|
6
|
+
def decorate!: () -> Decorator
|
7
|
+
def decorated: () -> (Decorator | self)
|
8
|
+
|
9
|
+
def decorated?: () -> bool
|
8
10
|
|
9
11
|
private
|
10
12
|
|
11
|
-
def decorator: -> Class?
|
13
|
+
def decorator: () -> Class?
|
14
|
+
def decorator_base: () -> Module
|
12
15
|
end
|
13
16
|
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: magic-decorator
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Alexander Senko
|
8
8
|
bindir: bin
|
9
9
|
cert_chain: []
|
10
|
-
date: 2024-10-
|
10
|
+
date: 2024-10-27 00:00:00.000000000 Z
|
11
11
|
dependencies:
|
12
12
|
- !ruby/object:Gem::Dependency
|
13
13
|
name: magic-lookup
|
@@ -23,6 +23,20 @@ dependencies:
|
|
23
23
|
- - ">="
|
24
24
|
- !ruby/object:Gem::Version
|
25
25
|
version: '0'
|
26
|
+
- !ruby/object:Gem::Dependency
|
27
|
+
name: activesupport
|
28
|
+
requirement: !ruby/object:Gem::Requirement
|
29
|
+
requirements:
|
30
|
+
- - ">="
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '0'
|
33
|
+
type: :runtime
|
34
|
+
prerelease: false
|
35
|
+
version_requirements: !ruby/object:Gem::Requirement
|
36
|
+
requirements:
|
37
|
+
- - ">="
|
38
|
+
- !ruby/object:Gem::Version
|
39
|
+
version: '0'
|
26
40
|
description: 'SimpleDelegator on steroids: automatic delegation, decorator class inference,
|
27
41
|
etc.'
|
28
42
|
email:
|
@@ -55,7 +69,7 @@ licenses:
|
|
55
69
|
metadata:
|
56
70
|
homepage_uri: https://github.com/Alexander-Senko/magic-decorator
|
57
71
|
source_code_uri: https://github.com/Alexander-Senko/magic-decorator
|
58
|
-
changelog_uri: https://github.com/Alexander-Senko/magic-decorator/blob/v0.
|
72
|
+
changelog_uri: https://github.com/Alexander-Senko/magic-decorator/blob/v0.3.0/CHANGELOG.md
|
59
73
|
rdoc_options: []
|
60
74
|
require_paths:
|
61
75
|
- lib
|