bountiful_blocks 1.0.0 → 1.1.0

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
  SHA256:
3
- metadata.gz: 931ac5652dcb409ecd827ff2f7adb6daf3e102b344fe8d382ac636641bff7312
4
- data.tar.gz: 7f3ad476b417b2fc042491d103943a5ccb57fbe8da3b4b1b39c0cc44617382bc
3
+ metadata.gz: 107bca67d5b0f9fe089a8e67a701d349262fb64941d56b0cf8a721d0d99f0512
4
+ data.tar.gz: 17bc58e18db0cdff78e8bcfe32b7bd4cb51d3b385a79a65d2cb0c40d4edac69b
5
5
  SHA512:
6
- metadata.gz: 563b2ed6adb3987cd598edbf28affcc7b72b143867110ebe52a64a5f6604fc5f8daff13460d067c566452764cf8d625d7dc4400d5486da73a24f0f40a21febf2
7
- data.tar.gz: 5136107120ac4e8b8d8f4e7fd244d8e18594da36aa6dfa2b6eee40a00ebaf2ee15ce9b8ac9c9c4c067ae10a70aa23564a728c6cbdc3b07085f4662f617b870bd
6
+ metadata.gz: f53522d03a12b7b0aaa9ddd0536de017657ee4534da05c059a4248004bfe6f940e3437ffaee03af7641c7e9b43596818ae0d796fcff377e50444528331146628
7
+ data.tar.gz: 8ecaca17d07af11ed7bd3cf31ace24d9cb808f40b6249d65bb21f4af0ee631ee9301658de034c05807d6f9a18b38c9f918ae4b57acf0eb651a940c604aac8e95
data/CHANGELOG.md CHANGED
@@ -1,5 +1,26 @@
1
1
  # Changelog
2
2
 
3
+ <!--[//]: # (
4
+ ## <Release number> <Date YYYY-MM-DD>
5
+ ### Breaking changes
6
+ ### Deprecations
7
+ ### New features
8
+ ### Bug fixes
9
+ )-->
10
+
11
+ ## 1.1.0 2023-09-07
12
+
13
+ ### New features
14
+
15
+ - Added `raw!`, `given!`, and `call_all!` utility methods.
16
+ - Now multiblocks are always frozen after construction.
17
+ - Added RBS type signatures.
18
+
19
+ ### Bug fixes
20
+
21
+ - Fixed enforcing of block names limitations.
22
+ - Removed the `Error` class.
23
+
3
24
  ## 1.0.0 2023-05-30
4
25
 
5
26
  First release. Refer to [README.md](README.md) for the full documentation.
data/README.md CHANGED
@@ -94,6 +94,19 @@ def deliver message, &block
94
94
  end
95
95
  ```
96
96
 
97
+ ### Names
98
+
99
+ Block names follow the same rules as method names, with the exception that they can't end in `!`, `?`, or `=`.
100
+
101
+ ### Utility methods
102
+
103
+ To avoid conflicts, all utility method names will end in either `!`, `?`, or `=`.
104
+
105
+ - `raw!` returns the value returned by the block, which can be useful to allow a block to work both as a regular block and a multiblock.
106
+ - `given?(name)` returns `true` if a block named `name` was provided.
107
+ - `given!` returns the names of all the provided blocks.
108
+ - `call_all!` returns a Hash that maps all block names to their results. Notice that since multiblocks are frozen, `call_all!` can't cache the Hash and must create a new one on every invocation.
109
+
97
110
  ## Version numbers
98
111
 
99
112
  BountifulBlocks loosely follows [Semantic Versioning](https://semver.org/), with a hard guarantee that breaking changes to the public API will always coincide with an increase to the `MAJOR` number.
@@ -1,22 +1,27 @@
1
1
  module BountifulBlocks
2
2
  class Multiblock
3
3
  def initialize *required_blocks, &block
4
- instance_exec(&block)
4
+ @raw = instance_exec(&block)
5
5
 
6
6
  missing_blocks = required_blocks.reject { |method_name| given? method_name }
7
7
 
8
8
  raise ArgumentError, "Block required for #{missing_blocks.join ', '}" unless missing_blocks.empty?
9
+
10
+ given!.freeze
11
+ freeze
9
12
  end
10
13
 
11
14
  def method_missing(name, *args, **kwargs, &block)
12
- super unless args.empty? && kwargs.empty?
13
- super if name.end_with? '!', '?', '='
15
+ return super unless args.empty? && kwargs.empty?
16
+ return super if name.end_with? '!', '?', '='
14
17
 
15
18
  define_singleton_method name, &block
19
+
20
+ nil
16
21
  end
17
22
 
18
23
  def respond_to_missing?(name, *args, **kwargs, &block)
19
- super if name.end_with? '!', '?', '='
24
+ return super if name.end_with? '!', '?', '='
20
25
 
21
26
  true
22
27
  end
@@ -24,5 +29,19 @@ module BountifulBlocks
24
29
  def given? name
25
30
  singleton_class.method_defined? name
26
31
  end
32
+
33
+ def given!
34
+ @given = [] unless defined?(@given)
35
+
36
+ @given
37
+ end
38
+
39
+ def raw!
40
+ @raw
41
+ end
42
+
43
+ def call_all!
44
+ given!.to_h { |name| [name, public_send(name)] }
45
+ end
27
46
  end
28
47
  end
@@ -1,3 +1,3 @@
1
1
  module BountifulBlocks
2
- VERSION = '1.0.0'.freeze
2
+ VERSION = '1.1.0'.freeze
3
3
  end
@@ -1,8 +1,4 @@
1
1
  require_relative 'bountiful_blocks/version'
2
2
 
3
- module BountifulBlocks
4
- class Error < StandardError; end
5
- end
6
-
7
3
  require_relative 'bountiful_blocks/multiblock'
8
4
  require_relative 'bountiful_blocks/kernel_patch'
@@ -0,0 +1,3 @@
1
+ module Kernel
2
+ def Multiblock: (*Symbol required_blocks) { () -> untyped } -> BountifulBlocks::Multiblock
3
+ end
@@ -0,0 +1,9 @@
1
+ module BountifulBlocks
2
+ class Multiblock
3
+ def initialize: (*Symbol required_blocks) { () -> untyped } -> void
4
+ def given?: (Symbol name) -> bool
5
+ def given!: () -> Array[Symbol]
6
+ def raw!: () -> untyped
7
+ def call_all!: () -> Hash[Symbol, untyped]
8
+ end
9
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bountiful_blocks
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
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-05-30 00:00:00.000000000 Z
12
+ date: 2023-09-07 00:00:00.000000000 Z
13
13
  dependencies: []
14
14
  description: A simple and idiomatic way to pass multiple blocks to a method.
15
15
  email:
@@ -28,6 +28,8 @@ files:
28
28
  - lib/bountiful_blocks/kernel_patch.rb
29
29
  - lib/bountiful_blocks/multiblock.rb
30
30
  - lib/bountiful_blocks/version.rb
31
+ - sig/lib/bountiful_blocks/kernel_patch.rbs
32
+ - sig/lib/bountiful_blocks/multiblock.rbs
31
33
  homepage: https://github.com/moku-io/bountiful_blocks
32
34
  licenses:
33
35
  - MIT
@@ -50,7 +52,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
50
52
  - !ruby/object:Gem::Version
51
53
  version: '0'
52
54
  requirements: []
53
- rubygems_version: 3.1.6
55
+ rubygems_version: 3.4.6
54
56
  signing_key:
55
57
  specification_version: 4
56
58
  summary: A simple and idiomatic way to pass multiple blocks to a method.