slack_block_kit 0.1.0 → 0.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 +4 -4
- data/.circleci/config.yml +49 -0
- data/.gitignore +2 -0
- data/.rspec +1 -0
- data/.rubocop.yml +4 -0
- data/.rubocop_todo.yml +23 -6
- data/Gemfile.lock +6 -0
- data/README.md +14 -1
- data/lib/slack/block_kit.rb +13 -2
- data/lib/slack/block_kit/blocks.rb +71 -0
- data/lib/slack/block_kit/composition/confirmation_dialog.rb +33 -5
- data/lib/slack/block_kit/composition/mrkdwn.rb +28 -0
- data/lib/slack/block_kit/composition/option.rb +6 -2
- data/lib/slack/block_kit/composition/option_group.rb +18 -4
- data/lib/slack/block_kit/composition/plain_text.rb +27 -0
- data/lib/slack/block_kit/element/button.rb +19 -3
- data/lib/slack/block_kit/element/channels_select.rb +26 -6
- data/lib/slack/block_kit/element/conversations_select.rb +25 -4
- data/lib/slack/block_kit/element/date_picker.rb +24 -4
- data/lib/slack/block_kit/element/external_select.rb +30 -4
- data/lib/slack/block_kit/element/image.rb +5 -0
- data/lib/slack/block_kit/element/overflow_menu.rb +35 -3
- data/lib/slack/block_kit/element/static_select.rb +55 -6
- data/lib/slack/block_kit/element/users_select.rb +24 -4
- data/lib/slack/block_kit/layout/actions.rb +115 -2
- data/lib/slack/block_kit/layout/context.rb +26 -2
- data/lib/slack/block_kit/layout/divider.rb +4 -0
- data/lib/slack/block_kit/layout/image.rb +12 -3
- data/lib/slack/block_kit/layout/section.rb +148 -4
- data/lib/slack_block_kit.rb +3 -0
- data/slack_block_kit.gemspec +3 -1
- metadata +36 -3
- data/lib/slack/block_kit/composition/text.rb +0 -41
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA256:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: 067c0037a8fd2f3bff99855b8879b6dedb658ac2006b458022d3053b9bca46ca
         | 
| 4 | 
            +
              data.tar.gz: 879d0649e57afa5815c1b16be7c87b41b28d934832eebfdc6d3b36352ad005f1
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: ae170ecd8b12fad81fdf955fc36840295bdef4e1ca4c4b454022571713e610c60c5e6880a0a260bc9b002adbe4423a74f6d871503fe213730f49c04ec04bd4c7
         | 
| 7 | 
            +
              data.tar.gz: 4042f3ab1ac4efa2de8f108a065caea0d6f1334cd19bc24aab6dee4c55d5267e50517c99bbcafc8e8c281eed815697018c04e148ab88ab5729f5d623576cc888
         | 
| @@ -0,0 +1,49 @@ | |
| 1 | 
            +
            version: 2
         | 
| 2 | 
            +
            jobs:
         | 
| 3 | 
            +
              build:
         | 
| 4 | 
            +
                docker:
         | 
| 5 | 
            +
                  - image: circleci/ruby:2.5.3
         | 
| 6 | 
            +
             | 
| 7 | 
            +
                working_directory: ~/repo
         | 
| 8 | 
            +
             | 
| 9 | 
            +
                steps:
         | 
| 10 | 
            +
                  - checkout
         | 
| 11 | 
            +
                  - restore_cache:
         | 
| 12 | 
            +
                      keys:
         | 
| 13 | 
            +
                        - v1-dependencies-{{ checksum "Gemfile.lock" }}
         | 
| 14 | 
            +
                        - v1-dependencies-
         | 
| 15 | 
            +
             | 
| 16 | 
            +
                  - run:
         | 
| 17 | 
            +
                      name: bundle
         | 
| 18 | 
            +
                      command: |
         | 
| 19 | 
            +
                        bundle install --jobs=4 --retry=3 --path vendor/bundle
         | 
| 20 | 
            +
             | 
| 21 | 
            +
                  - save_cache:
         | 
| 22 | 
            +
                      paths:
         | 
| 23 | 
            +
                        - ./vendor/bundle
         | 
| 24 | 
            +
                      key: v1-dependencies-{{ checksum "Gemfile.lock" }}
         | 
| 25 | 
            +
             | 
| 26 | 
            +
                  - run:
         | 
| 27 | 
            +
                      name: rspec
         | 
| 28 | 
            +
                      command: |
         | 
| 29 | 
            +
                        mkdir /tmp/test-results
         | 
| 30 | 
            +
                        TEST_FILES="$(circleci tests glob "spec/**/*_spec.rb" | \
         | 
| 31 | 
            +
                          circleci tests split --split-by=timings)"
         | 
| 32 | 
            +
             | 
| 33 | 
            +
                        bundle exec rspec \
         | 
| 34 | 
            +
                          --format progress \
         | 
| 35 | 
            +
                          --format RspecJunitFormatter \
         | 
| 36 | 
            +
                          --out /tmp/test-results/rspec.xml \
         | 
| 37 | 
            +
                          --format progress \
         | 
| 38 | 
            +
                          $TEST_FILES
         | 
| 39 | 
            +
             | 
| 40 | 
            +
                  # collect reports
         | 
| 41 | 
            +
                  - store_test_results:
         | 
| 42 | 
            +
                      path: /tmp/test-results
         | 
| 43 | 
            +
                  - store_artifacts:
         | 
| 44 | 
            +
                      path: /tmp/test-results
         | 
| 45 | 
            +
                      destination: test-results
         | 
| 46 | 
            +
             | 
| 47 | 
            +
                  - run:
         | 
| 48 | 
            +
                      name: rubocop
         | 
| 49 | 
            +
                      command: bundle exec rubocop -p
         | 
    
        data/.gitignore
    CHANGED
    
    
    
        data/.rspec
    ADDED
    
    | @@ -0,0 +1 @@ | |
| 1 | 
            +
            --require spec_helper
         | 
    
        data/.rubocop.yml
    CHANGED
    
    
    
        data/.rubocop_todo.yml
    CHANGED
    
    | @@ -1,16 +1,33 @@ | |
| 1 1 | 
             
            # This configuration was generated by
         | 
| 2 2 | 
             
            # `rubocop --auto-gen-config`
         | 
| 3 | 
            -
            # on 2019-03- | 
| 3 | 
            +
            # on 2019-03-05 20:45:28 +0000 using RuboCop version 0.63.1.
         | 
| 4 4 | 
             
            # The point is for the user to remove these configuration records
         | 
| 5 5 | 
             
            # one by one as the offenses are removed from the code base.
         | 
| 6 6 | 
             
            # Note that changes in the inspected code, or installation of new
         | 
| 7 7 | 
             
            # versions of RuboCop, may require this file to be generated again.
         | 
| 8 8 |  | 
| 9 | 
            +
            # Offense count: 5
         | 
| 10 | 
            +
            # Configuration parameters: CountComments, ExcludedMethods.
         | 
| 11 | 
            +
            # ExcludedMethods: refine
         | 
| 12 | 
            +
            Metrics/BlockLength:
         | 
| 13 | 
            +
              Max: 63
         | 
| 14 | 
            +
             | 
| 9 15 | 
             
            # Offense count: 1
         | 
| 10 | 
            -
            # Configuration parameters:  | 
| 11 | 
            -
            Metrics/ | 
| 12 | 
            -
              Max:  | 
| 16 | 
            +
            # Configuration parameters: CountComments.
         | 
| 17 | 
            +
            Metrics/ClassLength:
         | 
| 18 | 
            +
              Max: 116
         | 
| 19 | 
            +
             | 
| 20 | 
            +
            # Offense count: 5
         | 
| 21 | 
            +
            # Configuration parameters: Max.
         | 
| 22 | 
            +
            RSpec/ExampleLength:
         | 
| 23 | 
            +
              Exclude:
         | 
| 24 | 
            +
                - 'spec/lib/slack/block_kit/composition/confirmation_dialog_spec.rb'
         | 
| 25 | 
            +
                - 'spec/lib/slack/block_kit/composition/option_group_spec.rb'
         | 
| 26 | 
            +
                - 'spec/lib/slack/block_kit/composition/option_spec.rb'
         | 
| 13 27 |  | 
| 14 | 
            -
            # Offense count:  | 
| 28 | 
            +
            # Offense count: 4
         | 
| 15 29 | 
             
            Style/Documentation:
         | 
| 16 | 
            -
               | 
| 30 | 
            +
              Exclude:
         | 
| 31 | 
            +
                - 'spec/**/*'
         | 
| 32 | 
            +
                - 'test/**/*'
         | 
| 33 | 
            +
                - 'lib/slack/block_kit.rb'
         | 
    
        data/Gemfile.lock
    CHANGED
    
    | @@ -28,6 +28,8 @@ GEM | |
| 28 28 | 
             
                  diff-lcs (>= 1.2.0, < 2.0)
         | 
| 29 29 | 
             
                  rspec-support (~> 3.8.0)
         | 
| 30 30 | 
             
                rspec-support (3.8.0)
         | 
| 31 | 
            +
                rspec_junit_formatter (0.4.1)
         | 
| 32 | 
            +
                  rspec-core (>= 2, < 4, != 2.12.0)
         | 
| 31 33 | 
             
                rubocop (0.63.1)
         | 
| 32 34 | 
             
                  jaro_winkler (~> 1.5.1)
         | 
| 33 35 | 
             
                  parallel (~> 1.10)
         | 
| @@ -36,6 +38,8 @@ GEM | |
| 36 38 | 
             
                  rainbow (>= 2.2.2, < 4.0)
         | 
| 37 39 | 
             
                  ruby-progressbar (~> 1.7)
         | 
| 38 40 | 
             
                  unicode-display_width (~> 1.4.0)
         | 
| 41 | 
            +
                rubocop-rspec (1.32.0)
         | 
| 42 | 
            +
                  rubocop (>= 0.60.0)
         | 
| 39 43 | 
             
                ruby-progressbar (1.10.0)
         | 
| 40 44 | 
             
                unicode-display_width (1.4.1)
         | 
| 41 45 |  | 
| @@ -46,7 +50,9 @@ DEPENDENCIES | |
| 46 50 | 
             
              bundler (< 2.0)
         | 
| 47 51 | 
             
              rake
         | 
| 48 52 | 
             
              rspec
         | 
| 53 | 
            +
              rspec_junit_formatter
         | 
| 49 54 | 
             
              rubocop
         | 
| 55 | 
            +
              rubocop-rspec
         | 
| 50 56 | 
             
              slack_block_kit!
         | 
| 51 57 |  | 
| 52 58 | 
             
            BUNDLED WITH
         | 
    
        data/README.md
    CHANGED
    
    | @@ -1,6 +1,17 @@ | |
| 1 | 
            +
            [](https://circleci.com/gh/CGA1123/slack_block_kit-ruby/tree/master)
         | 
| 2 | 
            +
            [](https://badge.fury.io/rb/slack_block_kit)
         | 
| 3 | 
            +
             | 
| 1 4 | 
             
            # Slack::BlockKit
         | 
| 2 5 |  | 
| 3 | 
            -
             | 
| 6 | 
            +
            A collection of ruby objects that represent Slack's block kit.
         | 
| 7 | 
            +
             | 
| 8 | 
            +
            You can play around with the block kit using [Slack's block kit builder!](https://api.slack.com/tools/block-kit-builder)
         | 
| 9 | 
            +
             | 
| 10 | 
            +
            The 'blocks' availables are split in line with how Slack documents them, that is:
         | 
| 11 | 
            +
             | 
| 12 | 
            +
            - `Slack::BlockKit::Layout` contains the [Layout blocks](https://api.slack.com/reference/messaging/blocks)
         | 
| 13 | 
            +
            - `Slack::BlockKit::Element` contains the [Block elements](https://api.slack.com/reference/messaging/block-elements)
         | 
| 14 | 
            +
            - `Slack::BlockKit::Composition` contains the [Message composition objects](https://api.slack.com/reference/messaging/composition-objects)
         | 
| 4 15 |  | 
| 5 16 | 
             
            ## Installation
         | 
| 6 17 |  | 
| @@ -30,6 +41,8 @@ require 'slack/block_kit' | |
| 30 41 |  | 
| 31 42 | 
             
            Bug reports and pull requests are welcome on GitHub at https://github.com/CGA1123/slack_block_kit-ruby
         | 
| 32 43 |  | 
| 44 | 
            +
            See [issues](https://github.com/CGA1123/slack_block_kit-ruby/issues) if you want any inspiration as to what to help with!
         | 
| 45 | 
            +
             | 
| 33 46 | 
             
            ## License
         | 
| 34 47 |  | 
| 35 48 | 
             
            The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
         | 
    
        data/lib/slack/block_kit.rb
    CHANGED
    
    | @@ -4,12 +4,23 @@ module Slack | |
| 4 4 | 
             
              module BlockKit
         | 
| 5 5 | 
             
                module Composition; end
         | 
| 6 6 | 
             
                module Element; end
         | 
| 7 | 
            -
                module Layout;end
         | 
| 7 | 
            +
                module Layout; end
         | 
| 8 8 |  | 
| 9 | 
            -
                VERSION = '0. | 
| 9 | 
            +
                VERSION = '0.2.0'
         | 
| 10 10 |  | 
| 11 11 | 
             
                Dir[File.join(__dir__, 'block_kit', 'composition', '*.rb')].each { |file| require file }
         | 
| 12 12 | 
             
                Dir[File.join(__dir__, 'block_kit', 'element', '*.rb')].each { |file| require file }
         | 
| 13 13 | 
             
                Dir[File.join(__dir__, 'block_kit', 'layout', '*.rb')].each { |file| require file }
         | 
| 14 | 
            +
                Dir[File.join(__dir__, 'block_kit', '*.rb')].each { |file| require file }
         | 
| 15 | 
            +
             | 
| 16 | 
            +
                module_function
         | 
| 17 | 
            +
             | 
| 18 | 
            +
                def blocks
         | 
| 19 | 
            +
                  blocks = Blocks.new
         | 
| 20 | 
            +
             | 
| 21 | 
            +
                  yield(blocks) if block_given?
         | 
| 22 | 
            +
             | 
| 23 | 
            +
                  blocks
         | 
| 24 | 
            +
                end
         | 
| 14 25 | 
             
              end
         | 
| 15 26 | 
             
            end
         | 
| @@ -0,0 +1,71 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            module Slack
         | 
| 4 | 
            +
              module BlockKit
         | 
| 5 | 
            +
                # Blocks are a series of components that can be combined to create visually
         | 
| 6 | 
            +
                # rich and compellingly interactive messages.
         | 
| 7 | 
            +
                #
         | 
| 8 | 
            +
                # https://api.slack.com/reference/messaging/blocks
         | 
| 9 | 
            +
                class Blocks
         | 
| 10 | 
            +
                  attr_accessor :blocks
         | 
| 11 | 
            +
             | 
| 12 | 
            +
                  def initialize
         | 
| 13 | 
            +
                    @blocks = []
         | 
| 14 | 
            +
             | 
| 15 | 
            +
                    yield(self) if block_given?
         | 
| 16 | 
            +
                  end
         | 
| 17 | 
            +
             | 
| 18 | 
            +
                  def actions(block_id: nil)
         | 
| 19 | 
            +
                    block = Layout::Actions.new(block_id: block_id)
         | 
| 20 | 
            +
             | 
| 21 | 
            +
                    yield(block) if block_given?
         | 
| 22 | 
            +
             | 
| 23 | 
            +
                    append(block)
         | 
| 24 | 
            +
                  end
         | 
| 25 | 
            +
             | 
| 26 | 
            +
                  def context(block_id: nil)
         | 
| 27 | 
            +
                    block = Layout::Context.new(block_id: block_id)
         | 
| 28 | 
            +
             | 
| 29 | 
            +
                    yield(block) if block_given?
         | 
| 30 | 
            +
             | 
| 31 | 
            +
                    append(block)
         | 
| 32 | 
            +
                  end
         | 
| 33 | 
            +
             | 
| 34 | 
            +
                  def divider(block_id: nil)
         | 
| 35 | 
            +
                    block = Layout::Divider.new(block_id: block_id)
         | 
| 36 | 
            +
             | 
| 37 | 
            +
                    append(block)
         | 
| 38 | 
            +
                  end
         | 
| 39 | 
            +
             | 
| 40 | 
            +
                  def image(url:, alt_text:, title: nil, block_id: nil, emoji: nil)
         | 
| 41 | 
            +
                    block = Layout::Image.new(
         | 
| 42 | 
            +
                      url: url,
         | 
| 43 | 
            +
                      alt_text: alt_text,
         | 
| 44 | 
            +
                      title: title,
         | 
| 45 | 
            +
                      block_id: block_id,
         | 
| 46 | 
            +
                      emoji: emoji
         | 
| 47 | 
            +
                    )
         | 
| 48 | 
            +
             | 
| 49 | 
            +
                    append(block)
         | 
| 50 | 
            +
                  end
         | 
| 51 | 
            +
             | 
| 52 | 
            +
                  def section(block_id: nil)
         | 
| 53 | 
            +
                    block = Layout::Section.new(block_id: block_id)
         | 
| 54 | 
            +
             | 
| 55 | 
            +
                    yield(block) if block_given?
         | 
| 56 | 
            +
             | 
| 57 | 
            +
                    append(block)
         | 
| 58 | 
            +
                  end
         | 
| 59 | 
            +
             | 
| 60 | 
            +
                  def append(block)
         | 
| 61 | 
            +
                    @blocks << block
         | 
| 62 | 
            +
             | 
| 63 | 
            +
                    self
         | 
| 64 | 
            +
                  end
         | 
| 65 | 
            +
             | 
| 66 | 
            +
                  def as_json(*)
         | 
| 67 | 
            +
                    @blocks.map(&:as_json)
         | 
| 68 | 
            +
                  end
         | 
| 69 | 
            +
                end
         | 
| 70 | 
            +
              end
         | 
| 71 | 
            +
            end
         | 
| @@ -3,12 +3,40 @@ | |
| 3 3 | 
             
            module Slack
         | 
| 4 4 | 
             
              module BlockKit
         | 
| 5 5 | 
             
                module Composition
         | 
| 6 | 
            +
                  # An object that defines a dialog that provides a confirmation step to any
         | 
| 7 | 
            +
                  # interactive element. This dialog will ask the user to confirm their
         | 
| 8 | 
            +
                  # action by offering confirm and deny buttons.
         | 
| 9 | 
            +
                  #
         | 
| 10 | 
            +
                  # https://api.slack.com/reference/messaging/composition-objects#confirm
         | 
| 6 11 | 
             
                  class ConfirmationDialog
         | 
| 7 | 
            -
                    def  | 
| 8 | 
            -
                      @title =  | 
| 9 | 
            -
             | 
| 10 | 
            -
                       | 
| 11 | 
            -
             | 
| 12 | 
            +
                    def title(text:, emoji: nil)
         | 
| 13 | 
            +
                      @title = PlainText.new(text: text, emoji: emoji)
         | 
| 14 | 
            +
             | 
| 15 | 
            +
                      self
         | 
| 16 | 
            +
                    end
         | 
| 17 | 
            +
             | 
| 18 | 
            +
                    def confirm(text:, emoji: nil)
         | 
| 19 | 
            +
                      @confirm = PlainText.new(text: text, emoji: emoji)
         | 
| 20 | 
            +
             | 
| 21 | 
            +
                      self
         | 
| 22 | 
            +
                    end
         | 
| 23 | 
            +
             | 
| 24 | 
            +
                    def deny(text:, emoji: nil)
         | 
| 25 | 
            +
                      @deny = PlainText.new(text: text, emoji: emoji)
         | 
| 26 | 
            +
             | 
| 27 | 
            +
                      self
         | 
| 28 | 
            +
                    end
         | 
| 29 | 
            +
             | 
| 30 | 
            +
                    def plain_text(text:, emoji: nil)
         | 
| 31 | 
            +
                      @text = PlainText.new(text: text, emoji: emoji)
         | 
| 32 | 
            +
             | 
| 33 | 
            +
                      self
         | 
| 34 | 
            +
                    end
         | 
| 35 | 
            +
             | 
| 36 | 
            +
                    def mrkdwn(text:, verbatim: nil)
         | 
| 37 | 
            +
                      @text = Mrkdwn.new(text: text, verbatim: verbatim)
         | 
| 38 | 
            +
             | 
| 39 | 
            +
                      self
         | 
| 12 40 | 
             
                    end
         | 
| 13 41 |  | 
| 14 42 | 
             
                    def as_json(*)
         | 
| @@ -0,0 +1,28 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            module Slack
         | 
| 4 | 
            +
              module BlockKit
         | 
| 5 | 
            +
                module Composition
         | 
| 6 | 
            +
                  # An object containing some text, formatted using Slack's "mrkdwn".
         | 
| 7 | 
            +
                  #
         | 
| 8 | 
            +
                  # https://api.slack.com/reference/messaging/composition-objects#text
         | 
| 9 | 
            +
                  # https://api.slack.com/messaging/composing/formatting
         | 
| 10 | 
            +
                  class Mrkdwn
         | 
| 11 | 
            +
                    TYPE = 'mrkdwn'
         | 
| 12 | 
            +
             | 
| 13 | 
            +
                    def initialize(text:, verbatim: nil)
         | 
| 14 | 
            +
                      @text = text
         | 
| 15 | 
            +
                      @verbatim = verbatim
         | 
| 16 | 
            +
                    end
         | 
| 17 | 
            +
             | 
| 18 | 
            +
                    def as_json(*)
         | 
| 19 | 
            +
                      {
         | 
| 20 | 
            +
                        type: TYPE,
         | 
| 21 | 
            +
                        text: @text,
         | 
| 22 | 
            +
                        verbatim: @verbatim
         | 
| 23 | 
            +
                      }.compact
         | 
| 24 | 
            +
                    end
         | 
| 25 | 
            +
                  end
         | 
| 26 | 
            +
                end
         | 
| 27 | 
            +
              end
         | 
| 28 | 
            +
            end
         | 
| @@ -3,9 +3,13 @@ | |
| 3 3 | 
             
            module Slack
         | 
| 4 4 | 
             
              module BlockKit
         | 
| 5 5 | 
             
                module Composition
         | 
| 6 | 
            +
                  # An object that represents a single selectable item in a select menu.
         | 
| 7 | 
            +
                  #
         | 
| 8 | 
            +
                  # https://api.slack.com/reference/messaging/composition-objects#option
         | 
| 9 | 
            +
                  # https://api.slack.com/reference/messaging/block-elements#select
         | 
| 6 10 | 
             
                  class Option
         | 
| 7 | 
            -
                    def initialize(text:,  | 
| 8 | 
            -
                      @text = text
         | 
| 11 | 
            +
                    def initialize(value:, text:, emoji: nil)
         | 
| 12 | 
            +
                      @text = PlainText.new(text: text, emoji: emoji)
         | 
| 9 13 | 
             
                      @value = value
         | 
| 10 14 | 
             
                    end
         | 
| 11 15 |  | 
| @@ -3,16 +3,30 @@ | |
| 3 3 | 
             
            module Slack
         | 
| 4 4 | 
             
              module BlockKit
         | 
| 5 5 | 
             
                module Composition
         | 
| 6 | 
            +
                  # Provides a way to group options in a select menu.
         | 
| 7 | 
            +
                  #
         | 
| 8 | 
            +
                  # https://api.slack.com/reference/messaging/composition-objects#option-group
         | 
| 9 | 
            +
                  # https://api.slack.com/reference/messaging/block-elements#select
         | 
| 6 10 | 
             
                  class OptionGroup
         | 
| 7 | 
            -
                     | 
| 8 | 
            -
             | 
| 9 | 
            -
             | 
| 11 | 
            +
                    attr_accessor :options
         | 
| 12 | 
            +
             | 
| 13 | 
            +
                    def initialize(label:, emoji: nil)
         | 
| 14 | 
            +
                      @label = PlainText.new(text: label, emoji: emoji)
         | 
| 15 | 
            +
                      @options = []
         | 
| 16 | 
            +
             | 
| 17 | 
            +
                      yield(self) if block_given?
         | 
| 18 | 
            +
                    end
         | 
| 19 | 
            +
             | 
| 20 | 
            +
                    def option(text:, value:, emoji: nil)
         | 
| 21 | 
            +
                      @options << Option.new(text: text, value: value, emoji: emoji)
         | 
| 22 | 
            +
             | 
| 23 | 
            +
                      self
         | 
| 10 24 | 
             
                    end
         | 
| 11 25 |  | 
| 12 26 | 
             
                    def as_json(*)
         | 
| 13 27 | 
             
                      {
         | 
| 14 28 | 
             
                        label: @label.as_json,
         | 
| 15 | 
            -
                        options: options.map(&:as_json)
         | 
| 29 | 
            +
                        options: @options.map(&:as_json)
         | 
| 16 30 | 
             
                      }
         | 
| 17 31 | 
             
                    end
         | 
| 18 32 | 
             
                  end
         | 
| @@ -0,0 +1,27 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            module Slack
         | 
| 4 | 
            +
              module BlockKit
         | 
| 5 | 
            +
                module Composition
         | 
| 6 | 
            +
                  # An object containing some text, formatted using plain text.
         | 
| 7 | 
            +
                  #
         | 
| 8 | 
            +
                  # https://api.slack.com/reference/messaging/composition-objects#text
         | 
| 9 | 
            +
                  class PlainText
         | 
| 10 | 
            +
                    TYPE = 'plain_text'
         | 
| 11 | 
            +
             | 
| 12 | 
            +
                    def initialize(text:, emoji: nil)
         | 
| 13 | 
            +
                      @text = text
         | 
| 14 | 
            +
                      @emoji = emoji
         | 
| 15 | 
            +
                    end
         | 
| 16 | 
            +
             | 
| 17 | 
            +
                    def as_json(*)
         | 
| 18 | 
            +
                      {
         | 
| 19 | 
            +
                        type: TYPE,
         | 
| 20 | 
            +
                        text: @text,
         | 
| 21 | 
            +
                        emoji: @emoji
         | 
| 22 | 
            +
                      }.compact
         | 
| 23 | 
            +
                    end
         | 
| 24 | 
            +
                  end
         | 
| 25 | 
            +
                end
         | 
| 26 | 
            +
              end
         | 
| 27 | 
            +
            end
         | 
| @@ -3,15 +3,31 @@ | |
| 3 3 | 
             
            module Slack
         | 
| 4 4 | 
             
              module BlockKit
         | 
| 5 5 | 
             
                module Element
         | 
| 6 | 
            +
                  # An interactive element that inserts a button.
         | 
| 7 | 
            +
                  # The button can be a trigger for anything from opening a simple link
         | 
| 8 | 
            +
                  # to starting a complex workflow.
         | 
| 9 | 
            +
                  #
         | 
| 10 | 
            +
                  # https://api.slack.com/reference/messaging/block-elements#button
         | 
| 6 11 | 
             
                  class Button
         | 
| 7 12 | 
             
                    TYPE = 'button'
         | 
| 8 13 |  | 
| 9 | 
            -
                     | 
| 10 | 
            -
             | 
| 14 | 
            +
                    attr_accessor :confirm
         | 
| 15 | 
            +
             | 
| 16 | 
            +
                    def initialize(text:, action_id:, emoji: nil, url: nil, value: nil)
         | 
| 17 | 
            +
                      @text = Composition::PlainText.new(text: text, emoji: emoji)
         | 
| 11 18 | 
             
                      @action_id = action_id
         | 
| 12 19 | 
             
                      @url = url
         | 
| 13 20 | 
             
                      @value = value
         | 
| 14 | 
            -
             | 
| 21 | 
            +
             | 
| 22 | 
            +
                      yield(self) if block_given?
         | 
| 23 | 
            +
                    end
         | 
| 24 | 
            +
             | 
| 25 | 
            +
                    def confirmation_dialog
         | 
| 26 | 
            +
                      @confirm = Composition::ConfirmationDialog.new
         | 
| 27 | 
            +
             | 
| 28 | 
            +
                      yield(@confirm) if block_given?
         | 
| 29 | 
            +
             | 
| 30 | 
            +
                      @confirm
         | 
| 15 31 | 
             
                    end
         | 
| 16 32 |  | 
| 17 33 | 
             
                    def as_json(*)
         |