telegram-bot-ruby 2.0.0 → 2.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +6 -0
- data/Gemfile +6 -2
- data/Rakefile +0 -45
- data/lib/telegram/bot/api/endpoints.rb +12 -2
- data/lib/telegram/bot/client.rb +1 -1
- data/lib/telegram/bot/exceptions/response_error.rb +1 -1
- data/lib/telegram/bot/types/background_fill.rb +16 -0
- data/lib/telegram/bot/types/background_fill_freeform_gradient.rb +12 -0
- data/lib/telegram/bot/types/background_fill_gradient.rb +14 -0
- data/lib/telegram/bot/types/background_fill_solid.rb +12 -0
- data/lib/telegram/bot/types/background_type.rb +17 -0
- data/lib/telegram/bot/types/background_type_chat_theme.rb +12 -0
- data/lib/telegram/bot/types/background_type_fill.rb +13 -0
- data/lib/telegram/bot/types/background_type_pattern.rb +16 -0
- data/lib/telegram/bot/types/background_type_wallpaper.rb +15 -0
- data/lib/telegram/bot/types/birthdate.rb +13 -0
- data/lib/telegram/bot/types/bot_command.rb +2 -2
- data/lib/telegram/bot/types/bot_command_scope.rb +20 -0
- data/lib/telegram/bot/types/business_connection.rb +16 -0
- data/lib/telegram/bot/types/business_intro.rb +13 -0
- data/lib/telegram/bot/types/business_location.rb +12 -0
- data/lib/telegram/bot/types/business_messages_deleted.rb +13 -0
- data/lib/telegram/bot/types/business_opening_hours.rb +12 -0
- data/lib/telegram/bot/types/business_opening_hours_interval.rb +12 -0
- data/lib/telegram/bot/types/chat.rb +0 -28
- data/lib/telegram/bot/types/chat_administrator_rights.rb +3 -3
- data/lib/telegram/bot/types/chat_background.rb +11 -0
- data/lib/telegram/bot/types/chat_boost_added.rb +11 -0
- data/lib/telegram/bot/types/chat_boost_source.rb +4 -1
- data/lib/telegram/bot/types/chat_boost_source_giveaway.rb +1 -0
- data/lib/telegram/bot/types/chat_full_info.rb +54 -0
- data/lib/telegram/bot/types/chat_invite_link.rb +2 -0
- data/lib/telegram/bot/types/chat_location.rb +1 -1
- data/lib/telegram/bot/types/chat_member.rb +4 -4
- data/lib/telegram/bot/types/chat_member_administrator.rb +3 -3
- data/lib/telegram/bot/types/chat_member_member.rb +1 -0
- data/lib/telegram/bot/types/chat_member_updated.rb +1 -0
- data/lib/telegram/bot/types/chat_shared.rb +3 -0
- data/lib/telegram/bot/types/copy_text_button.rb +11 -0
- data/lib/telegram/bot/types/error.rb +14 -0
- data/lib/telegram/bot/types/external_reply_info.rb +1 -0
- data/lib/telegram/bot/types/force_reply.rb +2 -2
- data/lib/telegram/bot/types/gift.rb +15 -0
- data/lib/telegram/bot/types/gifts.rb +11 -0
- data/lib/telegram/bot/types/giveaway.rb +1 -0
- data/lib/telegram/bot/types/giveaway_completed.rb +1 -0
- data/lib/telegram/bot/types/giveaway_created.rb +1 -0
- data/lib/telegram/bot/types/giveaway_winners.rb +1 -0
- data/lib/telegram/bot/types/inline_keyboard_button.rb +2 -1
- data/lib/telegram/bot/types/inline_query_result.rb +33 -0
- data/lib/telegram/bot/types/inline_query_result_cached_gif.rb +1 -0
- data/lib/telegram/bot/types/inline_query_result_cached_mpeg4_gif.rb +1 -0
- data/lib/telegram/bot/types/inline_query_result_cached_photo.rb +1 -0
- data/lib/telegram/bot/types/inline_query_result_cached_video.rb +1 -0
- data/lib/telegram/bot/types/inline_query_result_gif.rb +2 -1
- data/lib/telegram/bot/types/inline_query_result_mpeg4_gif.rb +2 -1
- data/lib/telegram/bot/types/inline_query_result_photo.rb +1 -0
- data/lib/telegram/bot/types/inline_query_result_video.rb +1 -0
- data/lib/telegram/bot/types/inline_query_results_button.rb +13 -0
- data/lib/telegram/bot/types/input_contact_message_content.rb +1 -1
- data/lib/telegram/bot/types/input_invoice_message_content.rb +5 -5
- data/lib/telegram/bot/types/input_location_message_content.rb +1 -1
- data/lib/telegram/bot/types/input_media.rb +18 -0
- data/lib/telegram/bot/types/input_media_animation.rb +1 -0
- data/lib/telegram/bot/types/input_media_photo.rb +1 -0
- data/lib/telegram/bot/types/input_media_video.rb +1 -0
- data/lib/telegram/bot/types/input_message_content.rb +10 -2
- data/lib/telegram/bot/types/input_paid_media.rb +15 -0
- data/lib/telegram/bot/types/input_paid_media_photo.rb +12 -0
- data/lib/telegram/bot/types/input_paid_media_video.rb +17 -0
- data/lib/telegram/bot/types/input_poll_option.rb +13 -0
- data/lib/telegram/bot/types/input_sticker.rb +15 -0
- data/lib/telegram/bot/types/input_text_message_content.rb +2 -2
- data/lib/telegram/bot/types/input_venue_message_content.rb +1 -1
- data/lib/telegram/bot/types/keyboard_button_request_chat.rb +3 -0
- data/lib/telegram/bot/types/keyboard_button_request_users.rb +3 -0
- data/lib/telegram/bot/types/location.rb +1 -1
- data/lib/telegram/bot/types/maybe_inaccessible_message.rb +4 -1
- data/lib/telegram/bot/types/menu_button.rb +16 -0
- data/lib/telegram/bot/types/message.rb +11 -0
- data/lib/telegram/bot/types/message_origin.rb +4 -1
- data/lib/telegram/bot/types/paid_media.rb +16 -0
- data/lib/telegram/bot/types/paid_media_info.rb +12 -0
- data/lib/telegram/bot/types/paid_media_photo.rb +12 -0
- data/lib/telegram/bot/types/paid_media_preview.rb +14 -0
- data/lib/telegram/bot/types/paid_media_purchased.rb +12 -0
- data/lib/telegram/bot/types/paid_media_video.rb +12 -0
- data/lib/telegram/bot/types/passport_element_error.rb +22 -0
- data/lib/telegram/bot/types/poll.rb +2 -1
- data/lib/telegram/bot/types/poll_option.rb +2 -1
- data/lib/telegram/bot/types/prepared_inline_message.rb +12 -0
- data/lib/telegram/bot/types/reaction_type.rb +6 -2
- data/lib/telegram/bot/types/reaction_type_paid.rb +11 -0
- data/lib/telegram/bot/types/refunded_payment.rb +15 -0
- data/lib/telegram/bot/types/reply_keyboard_markup.rb +2 -2
- data/lib/telegram/bot/types/reply_keyboard_remove.rb +1 -1
- data/lib/telegram/bot/types/response_parameters.rb +12 -0
- data/lib/telegram/bot/types/revenue_withdrawal_state.rb +16 -0
- data/lib/telegram/bot/types/revenue_withdrawal_state_failed.rb +11 -0
- data/lib/telegram/bot/types/revenue_withdrawal_state_pending.rb +11 -0
- data/lib/telegram/bot/types/revenue_withdrawal_state_succeeded.rb +13 -0
- data/lib/telegram/bot/types/shared_user.rb +15 -0
- data/lib/telegram/bot/types/star_transaction.rb +15 -0
- data/lib/telegram/bot/types/star_transactions.rb +11 -0
- data/lib/telegram/bot/types/sticker_set.rb +0 -2
- data/lib/telegram/bot/types/story.rb +4 -1
- data/lib/telegram/bot/types/successful_payment.rb +3 -0
- data/lib/telegram/bot/types/transaction_partner.rb +18 -0
- data/lib/telegram/bot/types/transaction_partner_fragment.rb +12 -0
- data/lib/telegram/bot/types/transaction_partner_other.rb +11 -0
- data/lib/telegram/bot/types/transaction_partner_telegram_ads.rb +11 -0
- data/lib/telegram/bot/types/transaction_partner_telegram_api.rb +12 -0
- data/lib/telegram/bot/types/transaction_partner_user.rb +17 -0
- data/lib/telegram/bot/types/update.rb +5 -0
- data/lib/telegram/bot/types/user.rb +2 -0
- data/lib/telegram/bot/types/users_shared.rb +1 -1
- data/lib/telegram/bot/version.rb +1 -1
- data/rakelib/parse_schema.rake +73 -0
- data/rakelib/rebuild_types.rake +90 -0
- data/utility/empty_type.erb +14 -0
- data/utility/type.erb +13 -0
- data/utility/type_attributes.json +5138 -0
- metadata +65 -3
@@ -0,0 +1,12 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Telegram
|
4
|
+
module Bot
|
5
|
+
module Types
|
6
|
+
class PaidMediaPhoto < Base
|
7
|
+
attribute :type, Types::String.constrained(eql: 'photo').default('photo')
|
8
|
+
attribute :photo, Types::Array.of(PhotoSize)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Telegram
|
4
|
+
module Bot
|
5
|
+
module Types
|
6
|
+
class PaidMediaPreview < Base
|
7
|
+
attribute :type, Types::String.constrained(eql: 'preview').default('preview')
|
8
|
+
attribute? :width, Types::Integer
|
9
|
+
attribute? :height, Types::Integer
|
10
|
+
attribute? :duration, Types::Integer
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Telegram
|
4
|
+
module Bot
|
5
|
+
module Types
|
6
|
+
## Just for classes consistency
|
7
|
+
# rubocop:disable Naming/ConstantName
|
8
|
+
PassportElementError = (
|
9
|
+
PassportElementErrorDataField |
|
10
|
+
PassportElementErrorFrontSide |
|
11
|
+
PassportElementErrorReverseSide |
|
12
|
+
PassportElementErrorSelfie |
|
13
|
+
PassportElementErrorFile |
|
14
|
+
PassportElementErrorFiles |
|
15
|
+
PassportElementErrorTranslationFile |
|
16
|
+
PassportElementErrorTranslationFiles |
|
17
|
+
PassportElementErrorUnspecified
|
18
|
+
)
|
19
|
+
# rubocop:enable Naming/ConstantName
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -5,7 +5,8 @@ module Telegram
|
|
5
5
|
module Types
|
6
6
|
class Poll < Base
|
7
7
|
attribute :id, Types::String
|
8
|
-
attribute :question, Types::String
|
8
|
+
attribute :question, Types::String.constrained(min_size: 1, max_size: 300)
|
9
|
+
attribute? :question_entities, Types::Array.of(MessageEntity)
|
9
10
|
attribute :options, Types::Array.of(PollOption)
|
10
11
|
attribute :total_voter_count, Types::Integer
|
11
12
|
attribute :is_closed, Types::Bool
|
@@ -4,7 +4,8 @@ module Telegram
|
|
4
4
|
module Bot
|
5
5
|
module Types
|
6
6
|
class PollOption < Base
|
7
|
-
attribute :text, Types::String
|
7
|
+
attribute :text, Types::String.constrained(min_size: 1, max_size: 100)
|
8
|
+
attribute? :text_entities, Types::Array.of(MessageEntity)
|
8
9
|
attribute :voter_count, Types::Integer
|
9
10
|
end
|
10
11
|
end
|
@@ -3,10 +3,14 @@
|
|
3
3
|
module Telegram
|
4
4
|
module Bot
|
5
5
|
module Types
|
6
|
-
|
6
|
+
## Just for classes consistency
|
7
|
+
# rubocop:disable Naming/ConstantName
|
8
|
+
ReactionType = (
|
7
9
|
ReactionTypeEmoji |
|
8
|
-
ReactionTypeCustomEmoji
|
10
|
+
ReactionTypeCustomEmoji |
|
11
|
+
ReactionTypePaid
|
9
12
|
)
|
13
|
+
# rubocop:enable Naming/ConstantName
|
10
14
|
end
|
11
15
|
end
|
12
16
|
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Telegram
|
4
|
+
module Bot
|
5
|
+
module Types
|
6
|
+
class RefundedPayment < Base
|
7
|
+
attribute :currency, Types::String.constrained(eql: 'XTR').default('XTR')
|
8
|
+
attribute :total_amount, Types::Integer
|
9
|
+
attribute :invoice_payload, Types::String
|
10
|
+
attribute :telegram_payment_charge_id, Types::String
|
11
|
+
attribute? :provider_payment_charge_id, Types::String
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -8,8 +8,8 @@ module Telegram
|
|
8
8
|
attribute? :is_persistent, Types::Bool.default(false)
|
9
9
|
attribute? :resize_keyboard, Types::Bool.default(false)
|
10
10
|
attribute? :one_time_keyboard, Types::Bool.default(false)
|
11
|
-
attribute? :input_field_placeholder, Types::String
|
12
|
-
attribute? :selective, Types::Bool
|
11
|
+
attribute? :input_field_placeholder, Types::String.constrained(min_size: 1, max_size: 64)
|
12
|
+
attribute? :selective, Types::Bool
|
13
13
|
|
14
14
|
def to_compact_hash
|
15
15
|
hsh = super
|
@@ -0,0 +1,16 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Telegram
|
4
|
+
module Bot
|
5
|
+
module Types
|
6
|
+
## Just for classes consistency
|
7
|
+
# rubocop:disable Naming/ConstantName
|
8
|
+
RevenueWithdrawalState = (
|
9
|
+
RevenueWithdrawalStatePending |
|
10
|
+
RevenueWithdrawalStateSucceeded |
|
11
|
+
RevenueWithdrawalStateFailed
|
12
|
+
)
|
13
|
+
# rubocop:enable Naming/ConstantName
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Telegram
|
4
|
+
module Bot
|
5
|
+
module Types
|
6
|
+
class RevenueWithdrawalStateSucceeded < Base
|
7
|
+
attribute :type, Types::String.constrained(eql: 'succeeded').default('succeeded')
|
8
|
+
attribute :date, Types::Integer
|
9
|
+
attribute :url, Types::String
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Telegram
|
4
|
+
module Bot
|
5
|
+
module Types
|
6
|
+
class SharedUser < Base
|
7
|
+
attribute :user_id, Types::Integer
|
8
|
+
attribute? :first_name, Types::String
|
9
|
+
attribute? :last_name, Types::String
|
10
|
+
attribute? :username, Types::String
|
11
|
+
attribute? :photo, Types::Array.of(PhotoSize)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Telegram
|
4
|
+
module Bot
|
5
|
+
module Types
|
6
|
+
class StarTransaction < Base
|
7
|
+
attribute :id, Types::String
|
8
|
+
attribute :amount, Types::Integer
|
9
|
+
attribute :date, Types::Integer
|
10
|
+
attribute? :source, TransactionPartner
|
11
|
+
attribute? :receiver, TransactionPartner
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -7,8 +7,6 @@ module Telegram
|
|
7
7
|
attribute :name, Types::String
|
8
8
|
attribute :title, Types::String
|
9
9
|
attribute :sticker_type, Types::String
|
10
|
-
attribute :is_animated, Types::Bool
|
11
|
-
attribute :is_video, Types::Bool
|
12
10
|
attribute :stickers, Types::Array.of(Sticker)
|
13
11
|
attribute? :thumbnail, PhotoSize
|
14
12
|
end
|
@@ -7,6 +7,9 @@ module Telegram
|
|
7
7
|
attribute :currency, Types::String
|
8
8
|
attribute :total_amount, Types::Integer
|
9
9
|
attribute :invoice_payload, Types::String
|
10
|
+
attribute? :subscription_expiration_date, Types::Integer
|
11
|
+
attribute? :is_recurring, Types::True
|
12
|
+
attribute? :is_first_recurring, Types::True
|
10
13
|
attribute? :shipping_option_id, Types::String
|
11
14
|
attribute? :order_info, OrderInfo
|
12
15
|
attribute :telegram_payment_charge_id, Types::String
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Telegram
|
4
|
+
module Bot
|
5
|
+
module Types
|
6
|
+
## Just for classes consistency
|
7
|
+
# rubocop:disable Naming/ConstantName
|
8
|
+
TransactionPartner = (
|
9
|
+
TransactionPartnerUser |
|
10
|
+
TransactionPartnerFragment |
|
11
|
+
TransactionPartnerTelegramAds |
|
12
|
+
TransactionPartnerTelegramApi |
|
13
|
+
TransactionPartnerOther
|
14
|
+
)
|
15
|
+
# rubocop:enable Naming/ConstantName
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Telegram
|
4
|
+
module Bot
|
5
|
+
module Types
|
6
|
+
class TransactionPartnerFragment < Base
|
7
|
+
attribute :type, Types::String.constrained(eql: 'fragment').default('fragment')
|
8
|
+
attribute? :withdrawal_state, RevenueWithdrawalState
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Telegram
|
4
|
+
module Bot
|
5
|
+
module Types
|
6
|
+
class TransactionPartnerTelegramApi < Base
|
7
|
+
attribute :type, Types::String.constrained(eql: 'telegram_api').default('telegram_api')
|
8
|
+
attribute :request_count, Types::Integer
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Telegram
|
4
|
+
module Bot
|
5
|
+
module Types
|
6
|
+
class TransactionPartnerUser < Base
|
7
|
+
attribute :type, Types::String.constrained(eql: 'user').default('user')
|
8
|
+
attribute :user, User
|
9
|
+
attribute? :invoice_payload, Types::String
|
10
|
+
attribute? :subscription_period, Types::Integer
|
11
|
+
attribute? :paid_media, Types::Array.of(PaidMedia)
|
12
|
+
attribute? :paid_media_payload, Types::String
|
13
|
+
attribute? :gift, Gift
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -9,6 +9,10 @@ module Telegram
|
|
9
9
|
attribute? :edited_message, Message
|
10
10
|
attribute? :channel_post, Message
|
11
11
|
attribute? :edited_channel_post, Message
|
12
|
+
attribute? :business_connection, BusinessConnection
|
13
|
+
attribute? :business_message, Message
|
14
|
+
attribute? :edited_business_message, Message
|
15
|
+
attribute? :deleted_business_messages, BusinessMessagesDeleted
|
12
16
|
attribute? :message_reaction, MessageReactionUpdated
|
13
17
|
attribute? :message_reaction_count, MessageReactionCountUpdated
|
14
18
|
attribute? :inline_query, InlineQuery
|
@@ -16,6 +20,7 @@ module Telegram
|
|
16
20
|
attribute? :callback_query, CallbackQuery
|
17
21
|
attribute? :shipping_query, ShippingQuery
|
18
22
|
attribute? :pre_checkout_query, PreCheckoutQuery
|
23
|
+
attribute? :purchased_paid_media, PaidMediaPurchased
|
19
24
|
attribute? :poll, Poll
|
20
25
|
attribute? :poll_answer, PollAnswer
|
21
26
|
attribute? :my_chat_member, ChatMemberUpdated
|
@@ -15,6 +15,8 @@ module Telegram
|
|
15
15
|
attribute? :can_join_groups, Types::Bool
|
16
16
|
attribute? :can_read_all_group_messages, Types::Bool
|
17
17
|
attribute? :supports_inline_queries, Types::Bool
|
18
|
+
attribute? :can_connect_to_business, Types::Bool
|
19
|
+
attribute? :has_main_web_app, Types::Bool
|
18
20
|
end
|
19
21
|
end
|
20
22
|
end
|
data/lib/telegram/bot/version.rb
CHANGED
@@ -0,0 +1,73 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'openapi3_parser'
|
4
|
+
|
5
|
+
desc 'Parse types from public json, should be up to date https://github.com/ark0f/tg-bot-api'
|
6
|
+
task :parse_schema do
|
7
|
+
document = Openapi3Parser.load_url('https://ark0f.github.io/tg-bot-api/openapi.json')
|
8
|
+
|
9
|
+
result = document.components.schemas.to_h do |type_name, schema|
|
10
|
+
type_schema = schema.properties.to_h do |property_name, property_schema|
|
11
|
+
attribute = { type: parse_initial_type(property_schema, property_name) }
|
12
|
+
|
13
|
+
unless property_schema.any_of.nil?
|
14
|
+
attribute[:type] = property_schema.any_of.map { |item| property_schema.name || item.name || item.type }.uniq
|
15
|
+
end
|
16
|
+
|
17
|
+
# Input File is literally just a string for our purpose
|
18
|
+
attribute[:type]&.delete('InputFile')
|
19
|
+
attribute[:type] = attribute[:type].join if attribute[:type]&.length == 1
|
20
|
+
|
21
|
+
attribute[:required] = true if required_keys(schema).include?(property_name)
|
22
|
+
|
23
|
+
# getting required values from the description, no values in json 😔
|
24
|
+
required_value = property_schema.description&.match(/always “(.+)”|must be \*(.+)\*/)
|
25
|
+
attribute[:required_value] = (required_value[1] || required_value[2]).delete('\\') if required_value
|
26
|
+
|
27
|
+
# for some reason every property's minLength is 0 by default, probably parser bug, had to ignore that
|
28
|
+
attribute[:min_size] = property_schema[:minLength] if property_schema[:minLength] != 0
|
29
|
+
attribute[:max_size] = property_schema[:maxLength] if property_schema[:maxLength]
|
30
|
+
|
31
|
+
attribute[:items] = property_schema.items.type if property_schema&.items
|
32
|
+
if property_schema&.type == 'array' && property_schema&.items&.type.nil?
|
33
|
+
attribute[:items] = property_schema&.items&.name
|
34
|
+
end
|
35
|
+
|
36
|
+
attribute[:items] = property_schema.items.name if property_schema&.items&.type == 'object'
|
37
|
+
|
38
|
+
# array of arrays
|
39
|
+
if property_schema&.items&.type == 'array'
|
40
|
+
attribute[:items] = { type: 'array', items: property_schema.items.items.name }
|
41
|
+
end
|
42
|
+
|
43
|
+
attribute = apply_default_schema(attribute, property_schema)
|
44
|
+
[property_name, attribute]
|
45
|
+
end
|
46
|
+
|
47
|
+
# find empty classes
|
48
|
+
type_schema[:type] = schema.any_of.map(&:name) if schema.properties.empty? && schema.any_of
|
49
|
+
[type_name, type_schema]
|
50
|
+
end
|
51
|
+
|
52
|
+
# Input File is literally just a string for our purpose
|
53
|
+
File.write "#{__dir__}/../utility/type_attributes.json", JSON.pretty_generate(result.except('InputFile'))
|
54
|
+
end
|
55
|
+
|
56
|
+
def required_keys(schema)
|
57
|
+
schema.required.to_a || []
|
58
|
+
end
|
59
|
+
|
60
|
+
def apply_default_schema(attribute, property_schema)
|
61
|
+
attribute[:default] = property_schema.default unless property_schema.default.nil?
|
62
|
+
# previous line would have been enough, but had to check the description due to issue: https://github.com/kevindew/openapi3_parser/issues/28
|
63
|
+
attribute[:default] = false if property_schema.description&.include?('Defaults to *false*')
|
64
|
+
attribute
|
65
|
+
end
|
66
|
+
|
67
|
+
def parse_initial_type(property_schema, property_name)
|
68
|
+
case property_schema.type
|
69
|
+
when nil then property_name.capitalize.gsub(/_(\w)/) { Regexp.last_match(1).upcase }
|
70
|
+
when 'object' then property_schema.name
|
71
|
+
else property_schema.type
|
72
|
+
end
|
73
|
+
end
|
@@ -0,0 +1,90 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'json'
|
4
|
+
require 'erb'
|
5
|
+
DRY_TYPES = %w[string integer float decimal array hash symbol boolean date date_time time range].freeze
|
6
|
+
|
7
|
+
desc 'Rebuild types'
|
8
|
+
task :rebuild_types do
|
9
|
+
types = JSON.parse(File.read("#{__dir__}/../utility/type_attributes.json"), symbolize_names: true)
|
10
|
+
|
11
|
+
types.each_pair do |name, attributes|
|
12
|
+
next build_empty_type(name, attributes) if attributes[:type].instance_of?(Array)
|
13
|
+
|
14
|
+
attributes.each_pair do |attr_name, properties|
|
15
|
+
attributes[attr_name][:type] = add_module_types(properties[:type]) unless properties[:type].is_a?(Array)
|
16
|
+
if properties[:type].is_a?(Array)
|
17
|
+
attributes[attr_name][:type] = properties[:type].map do |type|
|
18
|
+
add_module_types(type)
|
19
|
+
end.join(' | ')
|
20
|
+
end
|
21
|
+
|
22
|
+
if properties[:items].instance_of?(String)
|
23
|
+
attributes[attr_name][:type] += ".of(#{add_module_types(properties[:items])})"
|
24
|
+
elsif properties[:items] && properties[:items][:type] == 'array'
|
25
|
+
attributes[attr_name][:type] += ".of(Types::Array.of(#{properties[:items][:items]}))"
|
26
|
+
end
|
27
|
+
original_type = properties[:type]
|
28
|
+
|
29
|
+
attributes = apply_required(attributes, attr_name, properties, original_type)
|
30
|
+
attributes = apply_min_max(attributes, attr_name, properties)
|
31
|
+
attributes = apply_default(attributes, attr_name, properties, original_type)
|
32
|
+
|
33
|
+
attributes[attr_name][:type] = 'Types::True' if attributes[attr_name][:type] == 'Types::Boolean.default(true)'
|
34
|
+
attributes[attr_name][:type] = attributes[attr_name][:type].gsub('Types::Boolean', 'Types::Bool')
|
35
|
+
end
|
36
|
+
|
37
|
+
File.write "#{__dir__}/../lib/telegram/bot/types/#{underscore(name)}.rb",
|
38
|
+
ERB.new(File.read("#{__dir__}/../utility/type.erb")).result(binding).gsub(" \n", '')
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def build_empty_type(name, attributes)
|
43
|
+
attributes = attributes[:type].join(" |\n ")
|
44
|
+
File.write "#{__dir__}/../lib/telegram/bot/types/#{underscore(name)}.rb",
|
45
|
+
ERB.new(File.read("#{__dir__}/../utility/empty_type.erb")).result(binding).gsub(" \n", '')
|
46
|
+
end
|
47
|
+
|
48
|
+
def apply_default(attributes, attr_name, properties, original_type)
|
49
|
+
return attributes if properties[:default].nil?
|
50
|
+
|
51
|
+
attributes[attr_name][:type] += ".default(#{typecast(original_type,
|
52
|
+
properties[:default])})"
|
53
|
+
attributes
|
54
|
+
end
|
55
|
+
|
56
|
+
def apply_required(attributes, attr_name, properties, original_type)
|
57
|
+
return attributes unless properties[:required_value]
|
58
|
+
|
59
|
+
attributes[attr_name][:type] += ".constrained(eql: #{typecast(original_type,
|
60
|
+
properties[:required_value])})"
|
61
|
+
attributes
|
62
|
+
end
|
63
|
+
|
64
|
+
def apply_min_max(attributes, attr_name, properties)
|
65
|
+
return attributes unless properties[:min_size] || properties[:max_size]
|
66
|
+
|
67
|
+
constrain = '.constrained(minmax)'
|
68
|
+
constrain = properties[:min_size] ? constrain.gsub('min', "min_size: #{properties[:min_size]}, ") : ''
|
69
|
+
constrain = constrain.gsub('max', "max_size: #{properties[:max_size]}") if properties[:max_size]
|
70
|
+
attributes[attr_name][:type] += constrain
|
71
|
+
attributes
|
72
|
+
end
|
73
|
+
|
74
|
+
def add_module_types(type)
|
75
|
+
return 'Types::Float' if type == 'number'
|
76
|
+
|
77
|
+
DRY_TYPES.include?(type) ? "Types::#{type.capitalize}" : type
|
78
|
+
end
|
79
|
+
|
80
|
+
def underscore(camel_cased_word)
|
81
|
+
camel_cased_word.to_s.gsub('::', '/')
|
82
|
+
.gsub(/([A-Z]+)([A-Z][a-z])/, '\1_\2')
|
83
|
+
.gsub(/([a-z\d])([A-Z])/, '\1_\2')
|
84
|
+
.tr('-', '_')
|
85
|
+
.downcase
|
86
|
+
end
|
87
|
+
|
88
|
+
def typecast(type, obj)
|
89
|
+
type == 'Types::String' ? "'#{obj}'" : obj
|
90
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Telegram
|
4
|
+
module Bot
|
5
|
+
module Types
|
6
|
+
## Just for classes consistency
|
7
|
+
# rubocop:disable Naming/ConstantName
|
8
|
+
<%= name %> = (
|
9
|
+
<%= attributes %>
|
10
|
+
)
|
11
|
+
# rubocop:enable Naming/ConstantName
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|