slack_builder 0.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.
Files changed (36) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +5 -0
  3. data/LICENSE.txt +21 -0
  4. data/README.md +204 -0
  5. data/lib/slack_builder/attachment.rb +60 -0
  6. data/lib/slack_builder/elements/actions.rb +19 -0
  7. data/lib/slack_builder/elements/base/concerns/has_elements.rb +62 -0
  8. data/lib/slack_builder/elements/base/element.rb +31 -0
  9. data/lib/slack_builder/elements/base/text.rb +20 -0
  10. data/lib/slack_builder/elements/context.rb +29 -0
  11. data/lib/slack_builder/elements/divider.rb +11 -0
  12. data/lib/slack_builder/elements/header.rb +21 -0
  13. data/lib/slack_builder/elements/image.rb +25 -0
  14. data/lib/slack_builder/elements/interactive_elements/button.rb +31 -0
  15. data/lib/slack_builder/elements/rich_text.rb +133 -0
  16. data/lib/slack_builder/elements/rich_text_elements/broadcast.rb +22 -0
  17. data/lib/slack_builder/elements/rich_text_elements/channel.rb +29 -0
  18. data/lib/slack_builder/elements/rich_text_elements/color.rb +22 -0
  19. data/lib/slack_builder/elements/rich_text_elements/concerns/has_highlight_style.rb +16 -0
  20. data/lib/slack_builder/elements/rich_text_elements/concerns/has_style.rb +30 -0
  21. data/lib/slack_builder/elements/rich_text_elements/concerns/has_text_style.rb +16 -0
  22. data/lib/slack_builder/elements/rich_text_elements/date.rb +28 -0
  23. data/lib/slack_builder/elements/rich_text_elements/emoji.rb +22 -0
  24. data/lib/slack_builder/elements/rich_text_elements/link.rb +23 -0
  25. data/lib/slack_builder/elements/rich_text_elements/text.rb +23 -0
  26. data/lib/slack_builder/elements/rich_text_elements/user.rb +29 -0
  27. data/lib/slack_builder/elements/rich_text_elements/usergroup.rb +29 -0
  28. data/lib/slack_builder/elements/section.rb +62 -0
  29. data/lib/slack_builder/elements/text_elements/markdown.rb +22 -0
  30. data/lib/slack_builder/elements/text_elements/plain_text.rb +22 -0
  31. data/lib/slack_builder/elements/video.rb +29 -0
  32. data/lib/slack_builder/message.rb +72 -0
  33. data/lib/slack_builder/version.rb +5 -0
  34. data/lib/slack_builder.rb +15 -0
  35. data/slack_builder.gemspec +40 -0
  36. metadata +85 -0
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../base/element'
4
+
5
+ module SlackBuilder
6
+ module Elements
7
+ module RichTextElements
8
+ class Broadcast < Base::Element
9
+ TYPE = 'broadcast'
10
+
11
+ def initialize(range, ...)
12
+ @range = range&.to_s
13
+ super(...)
14
+ end
15
+
16
+ def to_h
17
+ super.merge(range: @range)
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../base/element'
4
+ require_relative 'concerns/has_highlight_style'
5
+ require_relative 'concerns/has_style'
6
+ require_relative 'concerns/has_text_style'
7
+
8
+ module SlackBuilder
9
+ module Elements
10
+ module RichTextElements
11
+ class Channel < Base::Element
12
+ include Concerns::HasStyle
13
+ include Concerns::HasTextStyle
14
+ include Concerns::HasHighlightStyle
15
+
16
+ TYPE = 'channel'
17
+
18
+ def initialize(channel_id, ...)
19
+ @channel_id = channel_id
20
+ super(...)
21
+ end
22
+
23
+ def to_h
24
+ super.merge(channel_id: @channel_id)
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../base/element'
4
+
5
+ module SlackBuilder
6
+ module Elements
7
+ module RichTextElements
8
+ class Color < Base::Element
9
+ TYPE = 'color'
10
+
11
+ def initialize(value, ...)
12
+ @value = value&.to_s
13
+ super(...)
14
+ end
15
+
16
+ def to_h
17
+ super.merge(value: @value)
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SlackBuilder
4
+ module Elements
5
+ module RichTextElements
6
+ module Concerns
7
+ module HasHighlightStyle
8
+ def initialize(*args, highlight: false, client_highlight: false, unlink: false, **kwargs)
9
+ super(*args, **kwargs)
10
+ style.merge!(highlight: highlight, client_highlight: client_highlight, unlink: unlink)
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SlackBuilder
4
+ module Elements
5
+ module RichTextElements
6
+ module Concerns
7
+ module HasStyle
8
+ def initialize(...)
9
+ @style = {}
10
+ super
11
+ end
12
+
13
+ def to_h
14
+ filtered_style.then do |style|
15
+ style.empty? ? super : super.merge(style: style)
16
+ end
17
+ end
18
+
19
+ private
20
+
21
+ attr_reader :style
22
+
23
+ def filtered_style
24
+ style.select { |_, v| v }
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SlackBuilder
4
+ module Elements
5
+ module RichTextElements
6
+ module Concerns
7
+ module HasTextStyle
8
+ def initialize(*args, bold: false, italic: false, strike: false, **kwargs)
9
+ super(*args, **kwargs)
10
+ style.merge!(bold: bold, italic: italic, strike: strike)
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../base/element'
4
+
5
+ module SlackBuilder
6
+ module Elements
7
+ module RichTextElements
8
+ class Date < Base::Element
9
+ TYPE = 'date'
10
+
11
+ def initialize(timestamp, format:, url: nil, fallback: nil, **kwargs)
12
+ @timestamp = timestamp
13
+ @format = format
14
+ @url = url unless url.nil?
15
+ @fallback = fallback unless fallback.nil?
16
+ super(**kwargs)
17
+ end
18
+
19
+ def to_h
20
+ super.merge(timestamp: @timestamp, format: @format).tap do |h|
21
+ h[:url] = @url if defined?(@url)
22
+ h[:fallback] = @fallback if defined?(@fallback)
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../base/element'
4
+
5
+ module SlackBuilder
6
+ module Elements
7
+ module RichTextElements
8
+ class Emoji < Base::Element
9
+ TYPE = 'emoji'
10
+
11
+ def initialize(name, ...)
12
+ @name = name&.to_s
13
+ super(...)
14
+ end
15
+
16
+ def to_h
17
+ super.merge(name: @name)
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'text'
4
+
5
+ module SlackBuilder
6
+ module Elements
7
+ module RichTextElements
8
+ class Link < Text
9
+ TYPE = 'link'
10
+
11
+ def initialize(*args, url:, unsafe: false, **kwargs)
12
+ @url = url
13
+ @unsafe = unsafe
14
+ super(*args, **kwargs)
15
+ end
16
+
17
+ def to_h
18
+ super.merge(url: @url, unsafe: @unsafe)
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../base/text'
4
+ require_relative 'concerns/has_style'
5
+ require_relative 'concerns/has_text_style'
6
+
7
+ module SlackBuilder
8
+ module Elements
9
+ module RichTextElements
10
+ class Text < Base::Text
11
+ include Concerns::HasStyle
12
+ include Concerns::HasTextStyle
13
+
14
+ TYPE = 'text'
15
+
16
+ def initialize(*args, code: false, **kwargs)
17
+ super(*args, **kwargs)
18
+ style.merge!(code: code)
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../base/element'
4
+ require_relative 'concerns/has_highlight_style'
5
+ require_relative 'concerns/has_style'
6
+ require_relative 'concerns/has_text_style'
7
+
8
+ module SlackBuilder
9
+ module Elements
10
+ module RichTextElements
11
+ class User < Base::Element
12
+ include Concerns::HasStyle
13
+ include Concerns::HasTextStyle
14
+ include Concerns::HasHighlightStyle
15
+
16
+ TYPE = 'user'
17
+
18
+ def initialize(user_id, ...)
19
+ @user_id = user_id
20
+ super(...)
21
+ end
22
+
23
+ def to_h
24
+ super.merge(user_id: @user_id)
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../base/element'
4
+ require_relative 'concerns/has_highlight_style'
5
+ require_relative 'concerns/has_style'
6
+ require_relative 'concerns/has_text_style'
7
+
8
+ module SlackBuilder
9
+ module Elements
10
+ module RichTextElements
11
+ class Usergroup < Base::Element
12
+ include Concerns::HasStyle
13
+ include Concerns::HasTextStyle
14
+ include Concerns::HasHighlightStyle
15
+
16
+ TYPE = 'usergroup'
17
+
18
+ def initialize(usergroup_id, ...)
19
+ @usergroup_id = usergroup_id
20
+ super(...)
21
+ end
22
+
23
+ def to_h
24
+ super.merge(usergroup_id: @usergroup_id)
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,62 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'base/element'
4
+ require_relative 'base/concerns/has_elements'
5
+ require_relative 'interactive_elements/button'
6
+ require_relative 'text_elements/markdown'
7
+ require_relative 'text_elements/plain_text'
8
+ require_relative 'image'
9
+
10
+ module SlackBuilder
11
+ module Elements
12
+ class Section < Base::Element
13
+ include Base::Concerns::HasElements
14
+
15
+ TYPE = 'section'
16
+ ELEMENTS_KEY_NAME = :fields
17
+
18
+ class Accessory
19
+ private_class_method :new
20
+
21
+ def self.build(&blk)
22
+ new.instance_exec(&blk)
23
+ end
24
+
25
+ private
26
+
27
+ def button(...)
28
+ InteractiveElements::Button.new(...)
29
+ end
30
+
31
+ def image(...)
32
+ Image.new(...)
33
+ end
34
+ end
35
+
36
+ def initialize(text = nil, verbatim: false, **kwargs, &blk)
37
+ @text = TextElements::Markdown.new(text, verbatim: verbatim) unless text.nil?
38
+ super(**kwargs, &blk)
39
+ end
40
+
41
+ def to_h
42
+ super.tap do |h|
43
+ h.delete(ELEMENTS_KEY_NAME) if empty?
44
+ h[:text] = @text.to_h if defined?(@text)
45
+ h[:accessory] = @accessory.to_h if defined?(@accessory)
46
+ end
47
+ end
48
+
49
+ def accessory(...)
50
+ @accessory = Accessory.build(...) if block_given?
51
+ end
52
+
53
+ def mrkdwn(...)
54
+ add TextElements::Markdown.new(...)
55
+ end
56
+
57
+ def plain_text(...)
58
+ add TextElements::PlainText.new(...)
59
+ end
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../base/text'
4
+
5
+ module SlackBuilder
6
+ module Elements
7
+ module TextElements
8
+ class Markdown < Base::Text
9
+ TYPE = 'mrkdwn'
10
+
11
+ def initialize(*args, verbatim: false, **kwargs)
12
+ @verbatim = verbatim
13
+ super(*args, **kwargs)
14
+ end
15
+
16
+ def to_h
17
+ super.merge(verbatim: @verbatim)
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../base/text'
4
+
5
+ module SlackBuilder
6
+ module Elements
7
+ module TextElements
8
+ class PlainText < Base::Text
9
+ TYPE = 'plain_text'
10
+
11
+ def initialize(*args, emoji: true, **kwargs)
12
+ @emoji = emoji
13
+ super(*args, **kwargs)
14
+ end
15
+
16
+ def to_h
17
+ super.merge(emoji: @emoji)
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'base/element'
4
+ require_relative 'text_elements/plain_text'
5
+
6
+ module SlackBuilder
7
+ module Elements
8
+ class Video < Base::Element
9
+ TYPE = 'video'
10
+
11
+ def initialize(video_url, thumbnail_url:, alt_text:, title:, emoji: true, **kwargs)
12
+ @video_url = video_url
13
+ @thumbnail_url = thumbnail_url
14
+ @alt_text = alt_text
15
+ @title = TextElements::PlainText.new(title, emoji: emoji)
16
+ super(**kwargs)
17
+ end
18
+
19
+ def to_h
20
+ super.merge(
21
+ video_url: @video_url,
22
+ thumbnail_url: @thumbnail_url,
23
+ alt_text: @alt_text,
24
+ title: @title.to_h
25
+ )
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,72 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'attachment'
4
+ require_relative 'elements/actions'
5
+ require_relative 'elements/divider'
6
+ require_relative 'elements/header'
7
+ require_relative 'elements/image'
8
+ require_relative 'elements/context'
9
+ require_relative 'elements/rich_text'
10
+ require_relative 'elements/section'
11
+ require_relative 'elements/video'
12
+ require_relative 'elements/base/concerns/has_elements'
13
+
14
+ module SlackBuilder
15
+ class Message
16
+ include Elements::Base::Concerns::HasElements
17
+
18
+ def initialize(text = nil, &blk)
19
+ @text = text unless text.nil?
20
+ @attachments = []
21
+ super(&blk)
22
+ end
23
+
24
+ def to_h
25
+ {}.tap do |h|
26
+ h[:text] = @text if @text
27
+ h[:blocks] = to_a if any?
28
+ h[:attachments] = @attachments.map(&:to_h) if @attachments.any?
29
+ end
30
+ end
31
+
32
+ def attachment(...)
33
+ return unless block_given?
34
+
35
+ Attachment.new(...).tap do |a|
36
+ @attachments << a
37
+ end
38
+ end
39
+
40
+ def actions(...)
41
+ add Elements::Actions.new(...) if block_given?
42
+ end
43
+
44
+ def context(...)
45
+ add Elements::Context.new(...) if block_given?
46
+ end
47
+
48
+ def divider(...)
49
+ add Elements::Divider.new(...)
50
+ end
51
+
52
+ def header(...)
53
+ add Elements::Header.new(...)
54
+ end
55
+
56
+ def image(...)
57
+ add Elements::Image.new(...)
58
+ end
59
+
60
+ def rich_text(...)
61
+ add Elements::RichText.new(...) if block_given?
62
+ end
63
+
64
+ def section(...)
65
+ add Elements::Section.new(...)
66
+ end
67
+
68
+ def video(...)
69
+ add Elements::Video.new(...)
70
+ end
71
+ end
72
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SlackBuilder
4
+ VERSION = '0.1.0'
5
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'slack_builder/attachment'
4
+ require_relative 'slack_builder/message'
5
+ require_relative 'slack_builder/version'
6
+
7
+ module SlackBuilder
8
+ def self.attachment(...)
9
+ Attachment.new(...)
10
+ end
11
+
12
+ def self.message(...)
13
+ Message.new(...)
14
+ end
15
+ end
@@ -0,0 +1,40 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'lib/slack_builder/version'
4
+
5
+ Gem::Specification.new do |spec|
6
+ spec.name = 'slack_builder'
7
+ spec.version = SlackBuilder::VERSION
8
+ spec.required_ruby_version = '>= 3.0.0'
9
+
10
+ spec.authors = ['cyb-']
11
+ spec.email = ['gchateau@student.42.fr']
12
+
13
+ spec.summary = 'Slack API payload builder DSL'
14
+ spec.description = 'Slack API builder to easily build blocks message payloads with a comfortable DSL'
15
+ spec.homepage = 'https://github.com/cyb-/slack-builder'
16
+ spec.license = 'MIT'
17
+
18
+ spec.metadata = {
19
+ 'bug_tracker_uri' => 'https://github.com/cyb-/slack-builder/issues',
20
+ 'changelog_uri' => 'https://github.com/cyb-/slack-builder/blob/main/CHANGELOG.md',
21
+ 'documentation_uri' => 'https://github.com/cyb-/slack-builder/blob/main/README.md',
22
+ 'github_repo' => 'ssh://github.com/cyb-/slack-builder',
23
+ 'homepage_uri' => spec.homepage,
24
+ 'source_code_uri' => 'https://github.com/cyb-/slack-builder',
25
+ 'rubygems_mfa_required' => 'true',
26
+ }
27
+
28
+ ignored = Regexp.union(
29
+ /\A\.circleci/,
30
+ /\A\.git/,
31
+ /\A\.rubocop/,
32
+ /\A\.rspec/,
33
+ /\Abin/,
34
+ /\Aspec/,
35
+ /\AGemfile/,
36
+ /\ARakefile/
37
+ )
38
+ spec.files = `git ls-files`.split("\n").grep_v(ignored)
39
+ spec.require_paths = ['lib']
40
+ end
metadata ADDED
@@ -0,0 +1,85 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: slack_builder
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - cyb-
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2024-08-15 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: Slack API builder to easily build blocks message payloads with a comfortable
14
+ DSL
15
+ email:
16
+ - gchateau@student.42.fr
17
+ executables: []
18
+ extensions: []
19
+ extra_rdoc_files: []
20
+ files:
21
+ - CHANGELOG.md
22
+ - LICENSE.txt
23
+ - README.md
24
+ - lib/slack_builder.rb
25
+ - lib/slack_builder/attachment.rb
26
+ - lib/slack_builder/elements/actions.rb
27
+ - lib/slack_builder/elements/base/concerns/has_elements.rb
28
+ - lib/slack_builder/elements/base/element.rb
29
+ - lib/slack_builder/elements/base/text.rb
30
+ - lib/slack_builder/elements/context.rb
31
+ - lib/slack_builder/elements/divider.rb
32
+ - lib/slack_builder/elements/header.rb
33
+ - lib/slack_builder/elements/image.rb
34
+ - lib/slack_builder/elements/interactive_elements/button.rb
35
+ - lib/slack_builder/elements/rich_text.rb
36
+ - lib/slack_builder/elements/rich_text_elements/broadcast.rb
37
+ - lib/slack_builder/elements/rich_text_elements/channel.rb
38
+ - lib/slack_builder/elements/rich_text_elements/color.rb
39
+ - lib/slack_builder/elements/rich_text_elements/concerns/has_highlight_style.rb
40
+ - lib/slack_builder/elements/rich_text_elements/concerns/has_style.rb
41
+ - lib/slack_builder/elements/rich_text_elements/concerns/has_text_style.rb
42
+ - lib/slack_builder/elements/rich_text_elements/date.rb
43
+ - lib/slack_builder/elements/rich_text_elements/emoji.rb
44
+ - lib/slack_builder/elements/rich_text_elements/link.rb
45
+ - lib/slack_builder/elements/rich_text_elements/text.rb
46
+ - lib/slack_builder/elements/rich_text_elements/user.rb
47
+ - lib/slack_builder/elements/rich_text_elements/usergroup.rb
48
+ - lib/slack_builder/elements/section.rb
49
+ - lib/slack_builder/elements/text_elements/markdown.rb
50
+ - lib/slack_builder/elements/text_elements/plain_text.rb
51
+ - lib/slack_builder/elements/video.rb
52
+ - lib/slack_builder/message.rb
53
+ - lib/slack_builder/version.rb
54
+ - slack_builder.gemspec
55
+ homepage: https://github.com/cyb-/slack-builder
56
+ licenses:
57
+ - MIT
58
+ metadata:
59
+ bug_tracker_uri: https://github.com/cyb-/slack-builder/issues
60
+ changelog_uri: https://github.com/cyb-/slack-builder/blob/main/CHANGELOG.md
61
+ documentation_uri: https://github.com/cyb-/slack-builder/blob/main/README.md
62
+ github_repo: ssh://github.com/cyb-/slack-builder
63
+ homepage_uri: https://github.com/cyb-/slack-builder
64
+ source_code_uri: https://github.com/cyb-/slack-builder
65
+ rubygems_mfa_required: 'true'
66
+ post_install_message:
67
+ rdoc_options: []
68
+ require_paths:
69
+ - lib
70
+ required_ruby_version: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - ">="
73
+ - !ruby/object:Gem::Version
74
+ version: 3.0.0
75
+ required_rubygems_version: !ruby/object:Gem::Requirement
76
+ requirements:
77
+ - - ">="
78
+ - !ruby/object:Gem::Version
79
+ version: '0'
80
+ requirements: []
81
+ rubygems_version: 3.4.19
82
+ signing_key:
83
+ specification_version: 4
84
+ summary: Slack API payload builder DSL
85
+ test_files: []