template_class 1.0.0 → 1.1.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 -2
- data/README.md +11 -1
- data/lib/template_class/template.rb +32 -2
- data/lib/template_class/version.rb +1 -1
- data/lib/template_class.rb +0 -7
- data/sig/lib/template_class/template.rbs +13 -0
- metadata +3 -4
- data/Gemfile.lock +0 -57
- data/sig/template_class.rbs +0 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d10dcbdc76cd1f1ffddb70a98ee133e5686acb67ce73583715aeeaa9b10d4e70
|
4
|
+
data.tar.gz: 5f293dcd3eaf2e54882052e83f2eef8abd2c1fa71792a38f27cd688cbb641072
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d536399259e30cc20e4c6352410092aed9b4044a7ab42d4fcfab77b82589d25e64a66a9cccd073da9fbf01a022276e05c4b0acf5afa46dc9e94dc5c04ab94f3d
|
7
|
+
data.tar.gz: 3ba7a56886ab200f11f827b2078ffb8994b01456215cc6ff8c0c3d45475da06a2d2c19018d1f1f9af6005d190c1c326e1d3a29846b168b2e847a4b7888ad8a71
|
data/CHANGELOG.md
CHANGED
@@ -1,12 +1,23 @@
|
|
1
1
|
# Changelog
|
2
2
|
|
3
|
-
[//]: # (
|
3
|
+
<!--[//]: # (
|
4
4
|
## <Release number> <Date YYYY-MM-DD>
|
5
5
|
### Breaking changes
|
6
6
|
### Deprecations
|
7
7
|
### New features
|
8
8
|
### Bug fixes
|
9
|
-
)
|
9
|
+
)-->
|
10
|
+
|
11
|
+
## 1.1.0 2023-08-31
|
12
|
+
|
13
|
+
### New features
|
14
|
+
|
15
|
+
- Added support for caching modules.
|
16
|
+
- Added RBS type signatures.
|
17
|
+
|
18
|
+
### Bug fixes
|
19
|
+
|
20
|
+
- Removed the `Error` class.
|
10
21
|
|
11
22
|
## 1.0.0 2023-04-07
|
12
23
|
|
data/README.md
CHANGED
@@ -58,7 +58,17 @@ end
|
|
58
58
|
|
59
59
|
`klass.new` behaves like `Class.new`, with the key difference that it saves the new class in the internal cache *before* it executes the block in the class scope. If you use `Class.new` the specialization still works as expected, but the class is cached *after* the block is executed, so a loop will be created if the code inside the block references the same specialization it is defining.
|
60
60
|
|
61
|
-
|
61
|
+
A module analogue to `klass` is passed as third parameter to the block:
|
62
|
+
|
63
|
+
```ruby
|
64
|
+
resolve_template_specialization do |item_type, _, mod|
|
65
|
+
mod.new do
|
66
|
+
...
|
67
|
+
end
|
68
|
+
end
|
69
|
+
```
|
70
|
+
|
71
|
+
`klass.new` and `mod.new` also redefine `inspect` and `to_s` for the new class/module, so in strings it will appear with the usual C++ style:
|
62
72
|
|
63
73
|
```ruby
|
64
74
|
List[Integer].to_s # => List<Integer>
|
@@ -46,13 +46,43 @@ module TemplateClass
|
|
46
46
|
klass
|
47
47
|
end
|
48
48
|
end
|
49
|
-
|
49
|
+
|
50
|
+
class CacheModuleConstructor
|
51
|
+
attr_reader :key
|
52
|
+
attr_reader :owner
|
53
|
+
|
54
|
+
delegate_missing_to :owner
|
55
|
+
|
56
|
+
def initialize key, owner
|
57
|
+
@key = key
|
58
|
+
@owner = owner
|
59
|
+
end
|
60
|
+
|
61
|
+
def new &block
|
62
|
+
mod = Module.new
|
63
|
+
owner[key] = mod
|
64
|
+
|
65
|
+
outer_self = self
|
66
|
+
|
67
|
+
mod.define_singleton_method :to_s do
|
68
|
+
"#{outer_self.owner}<#{outer_self.key}>"
|
69
|
+
end
|
70
|
+
|
71
|
+
mod.singleton_class.alias_method :inspect, :to_s
|
72
|
+
|
73
|
+
mod.module_exec(&block)
|
74
|
+
mod
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
private_constant :CacheClassConstructor, :CacheModuleConstructor
|
50
79
|
|
51
80
|
class_methods do
|
52
81
|
def resolve_template_specialization &block
|
53
82
|
cache.default_proc = proc do |h, k|
|
54
83
|
class_constructor = CacheClassConstructor.new k, self
|
55
|
-
|
84
|
+
module_constructor = CacheModuleConstructor.new k, self
|
85
|
+
result = block.call k, class_constructor, module_constructor
|
56
86
|
|
57
87
|
h[k] = result unless h.key? k
|
58
88
|
|
data/lib/template_class.rb
CHANGED
@@ -0,0 +1,13 @@
|
|
1
|
+
module TemplateClass
|
2
|
+
module Template[T]
|
3
|
+
interface _CacheClassConstructor
|
4
|
+
def new: (?Class base_class) { () [self: Class] -> void } -> Class
|
5
|
+
end
|
6
|
+
|
7
|
+
interface _CacheModuleConstructor
|
8
|
+
def new: () { () [self: Module] -> void } -> Module
|
9
|
+
end
|
10
|
+
|
11
|
+
def resolve_template_specialization: () { (T key, _CacheClassConstructor klass, _CacheModuleConstructor mod) -> Class } -> void
|
12
|
+
end
|
13
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: template_class
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Moku S.r.l.
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: exe
|
11
11
|
cert_chain: []
|
12
|
-
date: 2023-
|
12
|
+
date: 2023-08-31 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: activesupport
|
@@ -43,14 +43,13 @@ files:
|
|
43
43
|
- ".rubocop.yml"
|
44
44
|
- CHANGELOG.md
|
45
45
|
- Gemfile
|
46
|
-
- Gemfile.lock
|
47
46
|
- LICENSE
|
48
47
|
- README.md
|
49
48
|
- Rakefile
|
50
49
|
- lib/template_class.rb
|
51
50
|
- lib/template_class/template.rb
|
52
51
|
- lib/template_class/version.rb
|
53
|
-
- sig/template_class.rbs
|
52
|
+
- sig/lib/template_class/template.rbs
|
54
53
|
homepage: https://github.com/moku-io/template_class
|
55
54
|
licenses:
|
56
55
|
- MIT
|
data/Gemfile.lock
DELETED
@@ -1,57 +0,0 @@
|
|
1
|
-
PATH
|
2
|
-
remote: .
|
3
|
-
specs:
|
4
|
-
template_class (1.0.0)
|
5
|
-
|
6
|
-
GEM
|
7
|
-
remote: https://rubygems.org/
|
8
|
-
specs:
|
9
|
-
ast (2.4.2)
|
10
|
-
diff-lcs (1.5.0)
|
11
|
-
json (2.6.3)
|
12
|
-
parallel (1.22.1)
|
13
|
-
parser (3.2.1.1)
|
14
|
-
ast (~> 2.4.1)
|
15
|
-
rainbow (3.1.1)
|
16
|
-
rake (13.0.6)
|
17
|
-
regexp_parser (2.7.0)
|
18
|
-
rexml (3.2.5)
|
19
|
-
rspec (3.12.0)
|
20
|
-
rspec-core (~> 3.12.0)
|
21
|
-
rspec-expectations (~> 3.12.0)
|
22
|
-
rspec-mocks (~> 3.12.0)
|
23
|
-
rspec-core (3.12.1)
|
24
|
-
rspec-support (~> 3.12.0)
|
25
|
-
rspec-expectations (3.12.2)
|
26
|
-
diff-lcs (>= 1.2.0, < 2.0)
|
27
|
-
rspec-support (~> 3.12.0)
|
28
|
-
rspec-mocks (3.12.4)
|
29
|
-
diff-lcs (>= 1.2.0, < 2.0)
|
30
|
-
rspec-support (~> 3.12.0)
|
31
|
-
rspec-support (3.12.0)
|
32
|
-
rubocop (1.48.1)
|
33
|
-
json (~> 2.3)
|
34
|
-
parallel (~> 1.10)
|
35
|
-
parser (>= 3.2.0.0)
|
36
|
-
rainbow (>= 2.2.2, < 4.0)
|
37
|
-
regexp_parser (>= 1.8, < 3.0)
|
38
|
-
rexml (>= 3.2.5, < 4.0)
|
39
|
-
rubocop-ast (>= 1.26.0, < 2.0)
|
40
|
-
ruby-progressbar (~> 1.7)
|
41
|
-
unicode-display_width (>= 2.4.0, < 3.0)
|
42
|
-
rubocop-ast (1.27.0)
|
43
|
-
parser (>= 3.2.1.0)
|
44
|
-
ruby-progressbar (1.13.0)
|
45
|
-
unicode-display_width (2.4.2)
|
46
|
-
|
47
|
-
PLATFORMS
|
48
|
-
arm64-darwin-22
|
49
|
-
|
50
|
-
DEPENDENCIES
|
51
|
-
rake (~> 13.0)
|
52
|
-
rspec (~> 3.0)
|
53
|
-
rubocop (~> 1.21)
|
54
|
-
template_class!
|
55
|
-
|
56
|
-
BUNDLED WITH
|
57
|
-
2.4.6
|
data/sig/template_class.rbs
DELETED