template_class 1.1.0 → 1.2.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
  SHA256:
3
- metadata.gz: d10dcbdc76cd1f1ffddb70a98ee133e5686acb67ce73583715aeeaa9b10d4e70
4
- data.tar.gz: 5f293dcd3eaf2e54882052e83f2eef8abd2c1fa71792a38f27cd688cbb641072
3
+ metadata.gz: e4c0985a84c4d73b07449fea319cd108c0a78477fa0975a0a946dcb82d05dbda
4
+ data.tar.gz: 35cc326a7341985c9d3a416fcad8b58a9465f4e72a083d7c4e9d153ed4f312d4
5
5
  SHA512:
6
- metadata.gz: d536399259e30cc20e4c6352410092aed9b4044a7ab42d4fcfab77b82589d25e64a66a9cccd073da9fbf01a022276e05c4b0acf5afa46dc9e94dc5c04ab94f3d
7
- data.tar.gz: 3ba7a56886ab200f11f827b2078ffb8994b01456215cc6ff8c0c3d45475da06a2d2c19018d1f1f9af6005d190c1c326e1d3a29846b168b2e847a4b7888ad8a71
6
+ metadata.gz: 1cc67fea8a072fd2fcf64a7bb7b17d22ae801b1547dd92cccd27a0e6f4c939870b032112bf845dc0974d8860d797f4e12c104f19437be369de70e8d0009ff21a
7
+ data.tar.gz: f756b227610d4503557b949dde1ed5f908fac9da1f3353a7dd55a7772f84e145eb419a1fad568f0a497d08d772a29a340b20fc839910ceee92baeedda9cc8065
data/CHANGELOG.md CHANGED
@@ -8,6 +8,12 @@
8
8
  ### Bug fixes
9
9
  )-->
10
10
 
11
+ ## 1.2.0 2024-08-19
12
+
13
+ ### New features
14
+
15
+ - Bulk instantiation
16
+
11
17
  ## 1.1.0 2023-08-31
12
18
 
13
19
  ### New features
data/README.md CHANGED
@@ -82,6 +82,32 @@ List[:any] = Array
82
82
 
83
83
  Notice that the parameter isn't constrained to classes: you can use any object.
84
84
 
85
+ ### Bulk Instantiation
86
+
87
+ A module (or class) containing multiple templates can include `TemplateClass::BulkInstanceable` to be able to instantiate them in bulk using the same parameter.
88
+
89
+ ```ruby
90
+ module Templates
91
+ include TemplateClass::BulkInstantiable
92
+
93
+ class Template1
94
+ ...
95
+ end
96
+
97
+ class Template2
98
+ ...
99
+ end
100
+ end
101
+
102
+ module Instances
103
+ Templates.bulk_instance Integer, into: self
104
+ end
105
+ ```
106
+
107
+ The new constants `Instances::Template1` and `Instances::Template2` are now defined, and they point respectively to `Templates::Template1[Integer]` and `Templates::Template2[Integer]`.
108
+
109
+ The optional keyword argument `with_overrides`, which defaults to `true` if `Zeitwerk` is defined and to `false` otherwise, allows you to automatically access and reopen the instances in files that follow the Zeitwerk naming conventions (eg. you can reopen `Instances::Template1` in the file `instances/template1.rb`). If `with_overrides` is `false`, you can still reopen the instances, but you need to manually handle the appropriate `requires` in the appropriate order.
110
+
85
111
  ## Plans for future development
86
112
 
87
113
  - Multiple specialization parameters
@@ -0,0 +1,21 @@
1
+ module TemplateClass
2
+ module BulkInstantiable
3
+ extend ActiveSupport::Concern
4
+
5
+ class_methods do
6
+ def bulk_instantiate(*args, into:, with_overrides: defined?(Zeitwerk))
7
+ constants(false)
8
+ .map { |constant_name| const_get(constant_name) }
9
+ .map do |constant|
10
+ into.const_set constant.name.demodulize.to_sym, constant[*args]
11
+ end
12
+ .tap { return unless with_overrides } # rubocop:disable Lint/NonLocalExitFromIterator
13
+ .each do |instance|
14
+ require instance.name.underscore
15
+ rescue LoadError
16
+ nil
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module TemplateClass
4
- VERSION = '1.1.0'
4
+ VERSION = '1.2.0'
5
5
  end
@@ -1,2 +1,3 @@
1
1
  require_relative 'template_class/version'
2
2
  require_relative 'template_class/template'
3
+ require_relative 'template_class/bulk_instantiable'
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.1.0
4
+ version: 1.2.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-08-31 00:00:00.000000000 Z
12
+ date: 2024-08-19 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activesupport
@@ -47,6 +47,7 @@ files:
47
47
  - README.md
48
48
  - Rakefile
49
49
  - lib/template_class.rb
50
+ - lib/template_class/bulk_instantiable.rb
50
51
  - lib/template_class/template.rb
51
52
  - lib/template_class/version.rb
52
53
  - sig/lib/template_class/template.rbs
@@ -72,7 +73,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
72
73
  - !ruby/object:Gem::Version
73
74
  version: '0'
74
75
  requirements: []
75
- rubygems_version: 3.4.6
76
+ rubygems_version: 3.5.11
76
77
  signing_key:
77
78
  specification_version: 4
78
79
  summary: A way to define templated classes, in a similar fashion to C++ templates.