line-message-builder 0.6.1 → 0.7.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: 52b7e6be9fb727e897a17fbdb1d0f657da0716d8173308a66859ec190a1638ae
4
- data.tar.gz: 79074a5e176caa8d71e5f20b1956eab5de2051fb3429b418c3543b2a4ce78862
3
+ metadata.gz: 2e34932b3afe2a1bbe05967e19991c2d1af583094e2b60be909efa9c773296fe
4
+ data.tar.gz: 2c7c94550e9b29a943b517aa5b19a9d03ec213a8779df05b1d0c55a886b8872b
5
5
  SHA512:
6
- metadata.gz: 0bfcfc82dd82c6bb4663e0d85cdfe82951a5b91ecfb025540c4291805af3bbe1adc72c9aee5fb028c48d18a793fa535d4617300d14f88c1dc1aecb543d9389d4
7
- data.tar.gz: 9ffff2de164fefcec345bc896a2093a8248f789ba2948ab6720e6b057cb8b0bd17d2c6eb073aa844b663351bba415b182189dd91c394d2e0f5f2c0465c9d9a9e
6
+ metadata.gz: c60b5ee94ee4e2f8dc658acace8538af12c9ee374f48b5fb5577c4baf43d93d661b2b47e18d8d09ee7f0e99f9fdbd0cdc3ce05e9bfd54c96ad36acd82b7b0cb6
7
+ data.tar.gz: afb292eec260c30163e79d8108471a7a5db4a722d6f44d54de7e25ae884375968addb2b6be9271240a6aae58023539acaca99109eeba95fc016e0e4aae94f0c8
@@ -1 +1 @@
1
- {".":"0.6.1"}
1
+ {".":"0.7.0"}
data/CHANGELOG.md CHANGED
@@ -1,5 +1,14 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.7.0](https://github.com/elct9620/line-message-builder/compare/v0.6.1...v0.7.0) (2025-05-21)
4
+
5
+
6
+ ### Features
7
+
8
+ * add assigns feature to flex partial with context override ([76c1d34](https://github.com/elct9620/line-message-builder/commit/76c1d34569d031ce6ddf64e948d33cd26a12b231))
9
+ * add context with assigns support for flex message partials ([1c4c89f](https://github.com/elct9620/line-message-builder/commit/1c4c89f590dd251fb0def48109961469c136bd86))
10
+ * add partial support for Flex message components ([57ff183](https://github.com/elct9620/line-message-builder/commit/57ff183b173e4c62e7119862df343c9d8a1174bd))
11
+
3
12
  ## [0.6.1](https://github.com/elct9620/line-message-builder/compare/v0.6.0...v0.6.1) (2025-05-13)
4
13
 
5
14
 
data/README.md CHANGED
@@ -99,6 +99,59 @@ builder = Line::MessageBuilder::Builder.with(context) do
99
99
  end
100
100
  ```
101
101
 
102
+ ### Partial
103
+
104
+ > [!WARNING]
105
+ > This is experimental and may change in the future.
106
+
107
+ You can create a partial object to reuse the same structure in the `Carousel`, `Bubble`, or `Box`.
108
+
109
+ ```ruby
110
+ # Reuse the bubble structure in the Carousel
111
+ class CardPartial < Line::Message::Builder::Flex::Partial
112
+ def call
113
+ body do
114
+ text "Hello World!"
115
+ end
116
+ end
117
+ end
118
+
119
+ builder = Line::MessageBuilder::Builder.with do
120
+ carousel do
121
+ 3.times do |i|
122
+ bubble do
123
+ partial! CardPartial
124
+ end
125
+ end
126
+ end
127
+ end
128
+ ```
129
+
130
+ The partial can have `assigns` feature to provide variables to the partial.
131
+
132
+ ```ruby
133
+ class CardPartial < Line::Message::Builder::Flex::Partial
134
+ def call
135
+ body do
136
+ text "Card #{idx}!"
137
+ end
138
+ end
139
+ end
140
+
141
+ builder = Line::MessageBuilder::Builder.with do
142
+ carousel do
143
+ 3.times do |i|
144
+ bubble do
145
+ partial! CardPartial, idx: i
146
+ end
147
+ end
148
+ end
149
+ end
150
+ ```
151
+
152
+ > [!NOTE]
153
+ > The assigns will override the context variables.
154
+
102
155
  ### RSpec Matcher
103
156
 
104
157
  | Matcher | Description |
@@ -35,7 +35,7 @@ module Line
35
35
  attr_reader :context
36
36
 
37
37
  def initialize(context: nil, **options, &block)
38
- @context = context
38
+ @context = Context.new(context)
39
39
  @quick_reply = nil
40
40
 
41
41
  self.class.options.each do |option|
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Line
4
+ module Message
5
+ module Builder
6
+ # The context is wrapper for the context object to provide assigns support.
7
+ class Context
8
+ attr_accessor :assigns
9
+
10
+ def initialize(context)
11
+ @context = context
12
+ @assigns = {}
13
+ end
14
+
15
+ def respond_to_missing?(method_name, include_private = false)
16
+ @assigns.key?(method_name) ||
17
+ @context.respond_to?(method_name, include_private) ||
18
+ super
19
+ end
20
+
21
+ def method_missing(method_name, ...)
22
+ return @assigns[method_name] if @assigns.key?(method_name)
23
+ return @context.public_send(method_name, ...) if @context.respond_to?(method_name)
24
+
25
+ super
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -6,6 +6,7 @@ module Line
6
6
  module Flex
7
7
  # The box is a component for the Flex message.
8
8
  class Box < Line::Message::Builder::Base
9
+ include HasPartial
9
10
  include Actionable
10
11
  include Position::Padding
11
12
  include Position::Margin
@@ -6,6 +6,8 @@ module Line
6
6
  module Flex
7
7
  # The bubble is container for the Flex message.
8
8
  class Bubble < Line::Message::Builder::Base
9
+ include HasPartial
10
+
9
11
  option :size, default: nil
10
12
  option :styles, default: nil
11
13
 
@@ -6,6 +6,8 @@ module Line
6
6
  module Flex
7
7
  # The carousel is multiple bubbles in a single Flex message.
8
8
  class Carousel < Line::Message::Builder::Base
9
+ include HasPartial
10
+
9
11
  def initialize(context: nil, **options, &)
10
12
  @contents = []
11
13
 
@@ -0,0 +1,44 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Line
4
+ module Message
5
+ module Builder
6
+ module Flex
7
+ # Define a partial that can be reused in flex message.
8
+ module HasPartial
9
+ def partial!(partial, **assigns)
10
+ raise ArgumentError, "Not a partial" unless partial < Partial
11
+
12
+ prev = context.assigns
13
+ context.assigns = assigns
14
+ partial.new(context: self).call
15
+ context.assigns = prev
16
+ end
17
+ end
18
+
19
+ # The partial designed to be reused in flex message.
20
+ class Partial
21
+ def initialize(context:)
22
+ @context = context
23
+ end
24
+
25
+ def call(*)
26
+ raise NotImplementedError, "The #{self.class} class must implement the call method"
27
+ end
28
+
29
+ def respond_to_missing?(method_name, include_private = false)
30
+ @context.respond_to?(method_name, include_private) || super
31
+ end
32
+
33
+ def method_missing(method_name, ...)
34
+ if @context.respond_to?(method_name)
35
+ @context.public_send(method_name, ...)
36
+ else
37
+ super
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
@@ -10,6 +10,9 @@ module Line
10
10
  require_relative "flex/position"
11
11
  require_relative "flex/size"
12
12
 
13
+ # Partial
14
+ require_relative "flex/partial"
15
+
13
16
  # Container
14
17
  require_relative "flex/bubble"
15
18
  require_relative "flex/carousel"
@@ -3,7 +3,7 @@
3
3
  module Line
4
4
  module Message
5
5
  module Builder
6
- VERSION = "0.6.1"
6
+ VERSION = "0.7.0"
7
7
  end
8
8
  end
9
9
  end
@@ -10,6 +10,7 @@ module Line
10
10
  class RequiredError < Error; end
11
11
  class ValidationError < Error; end
12
12
 
13
+ require_relative "builder/context"
13
14
  require_relative "builder/base"
14
15
  require_relative "builder/validators"
15
16
  require_relative "builder/actions"
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: line-message-builder
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.1
4
+ version: 0.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Aotokitsuruya
@@ -30,6 +30,7 @@ files:
30
30
  - lib/line/message/builder/actions/postback.rb
31
31
  - lib/line/message/builder/base.rb
32
32
  - lib/line/message/builder/container.rb
33
+ - lib/line/message/builder/context.rb
33
34
  - lib/line/message/builder/flex.rb
34
35
  - lib/line/message/builder/flex/actionable.rb
35
36
  - lib/line/message/builder/flex/box.rb
@@ -38,6 +39,7 @@ files:
38
39
  - lib/line/message/builder/flex/button.rb
39
40
  - lib/line/message/builder/flex/carousel.rb
40
41
  - lib/line/message/builder/flex/image.rb
42
+ - lib/line/message/builder/flex/partial.rb
41
43
  - lib/line/message/builder/flex/position.rb
42
44
  - lib/line/message/builder/flex/size.rb
43
45
  - lib/line/message/builder/flex/text.rb