cyclone_lariat 1.0.0.rc1 → 1.0.0.rc3
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/CHANGELOG.md +11 -1
- data/Gemfile.lock +5 -5
- data/README.md +18 -18
- data/lib/cyclone_lariat/messages/abstract.rb +138 -0
- data/lib/cyclone_lariat/messages/builder.rb +83 -0
- data/lib/cyclone_lariat/messages/common.rb +39 -0
- data/lib/cyclone_lariat/messages/v1/command.rb +3 -3
- data/lib/cyclone_lariat/messages/v1/event.rb +3 -3
- data/lib/cyclone_lariat/messages/v2/command.rb +27 -3
- data/lib/cyclone_lariat/messages/v2/event.rb +27 -3
- data/lib/cyclone_lariat/middleware.rb +2 -1
- data/lib/cyclone_lariat/repo/active_record/messages.rb +2 -5
- data/lib/cyclone_lariat/repo/sequel/messages.rb +2 -5
- data/lib/cyclone_lariat/version.rb +1 -1
- data/lib/cyclone_lariat.rb +1 -0
- metadata +5 -4
- data/lib/cyclone_lariat/messages/v1/abstract.rb +0 -139
- data/lib/cyclone_lariat/messages/v2/abstract.rb +0 -149
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA1:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: c2611c13c5fb86d9aa353ae3df16d5c216fb02be
         | 
| 4 | 
            +
              data.tar.gz: b90c6880d34961111dc73cb9f794561fa2a42630
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: '092ed1050daccad64005c8c91d586057f011881ddc3564f60892f27951b67b5e4f038730143273dd724e7792310206aab0c77ab09500f13933573fb0b03590b9'
         | 
| 7 | 
            +
              data.tar.gz: 8b2b9d21456541871afd95dfd0b20057bdcdea543dce49b5ad34a66eb026067ef3869ae785b3962334783e371b293d8f3daf0eec9b7766ce112cbb43235e6d12
         | 
    
        data/CHANGELOG.md
    CHANGED
    
    | @@ -4,6 +4,16 @@ All notable changes to this project will be documented in this file. | |
| 4 4 | 
             
            The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
         | 
| 5 5 | 
             
            and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
         | 
| 6 6 |  | 
| 7 | 
            +
            ## [1.0.0.rc3]
         | 
| 8 | 
            +
            Added
         | 
| 9 | 
            +
            - `CycloneLariat::Messages::Builder` for building messages
         | 
| 10 | 
            +
             | 
| 11 | 
            +
            ## [1.0.0.rc2]
         | 
| 12 | 
            +
            Changed
         | 
| 13 | 
            +
            - README.md file
         | 
| 14 | 
            +
            Added
         | 
| 15 | 
            +
            - require version file, fixed `bundle exec cyclone_lariat -v`
         | 
| 16 | 
            +
             | 
| 7 17 | 
             
            ## [0.4.0]
         | 
| 8 18 | 
             
            Changed
         | 
| 9 19 | 
             
            - rename `topic` to `queue` for SQS operations, in fact it changed only in methods `publish_event`, `publish_command`
         | 
| @@ -19,7 +29,7 @@ Added | |
| 19 29 | 
             
            Added
         | 
| 20 30 | 
             
            - Added aws_client_od options
         | 
| 21 31 | 
             
            Changed:
         | 
| 22 | 
            -
            - Renamed all AWS options with prefix _aws | 
| 32 | 
            +
            - Renamed all AWS options with prefix _aws
         | 
| 23 33 |  | 
| 24 34 | 
             
            ## [0.3.9] - 2022-10-05 Depricated
         | 
| 25 35 | 
             
            Added
         | 
    
        data/Gemfile.lock
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            PATH
         | 
| 2 2 | 
             
              remote: .
         | 
| 3 3 | 
             
              specs:
         | 
| 4 | 
            -
                cyclone_lariat (1.0.0. | 
| 4 | 
            +
                cyclone_lariat (1.0.0.rc3)
         | 
| 5 5 | 
             
                  aws-sdk-sns
         | 
| 6 6 | 
             
                  aws-sdk-sqs
         | 
| 7 7 | 
             
                  dry-cli (~> 0.6)
         | 
| @@ -28,16 +28,16 @@ GEM | |
| 28 28 | 
             
                arel (9.0.0)
         | 
| 29 29 | 
             
                ast (2.4.2)
         | 
| 30 30 | 
             
                aws-eventstream (1.2.0)
         | 
| 31 | 
            -
                aws-partitions (1. | 
| 32 | 
            -
                aws-sdk-core (3. | 
| 31 | 
            +
                aws-partitions (1.703.0)
         | 
| 32 | 
            +
                aws-sdk-core (3.170.0)
         | 
| 33 33 | 
             
                  aws-eventstream (~> 1, >= 1.0.2)
         | 
| 34 34 | 
             
                  aws-partitions (~> 1, >= 1.651.0)
         | 
| 35 35 | 
             
                  aws-sigv4 (~> 1.5)
         | 
| 36 36 | 
             
                  jmespath (~> 1, >= 1.6.1)
         | 
| 37 | 
            -
                aws-sdk-sns (1. | 
| 37 | 
            +
                aws-sdk-sns (1.59.0)
         | 
| 38 38 | 
             
                  aws-sdk-core (~> 3, >= 3.165.0)
         | 
| 39 39 | 
             
                  aws-sigv4 (~> 1.1)
         | 
| 40 | 
            -
                aws-sdk-sqs (1. | 
| 40 | 
            +
                aws-sdk-sqs (1.53.0)
         | 
| 41 41 | 
             
                  aws-sdk-core (~> 3, >= 3.165.0)
         | 
| 42 42 | 
             
                  aws-sigv4 (~> 1.1)
         | 
| 43 43 | 
             
                aws-sigv4 (1.5.2)
         | 
    
        data/README.md
    CHANGED
    
    | @@ -24,7 +24,7 @@ This gem work in few scenarios: | |
| 24 24 | 
             
              And run in console:
         | 
| 25 25 | 
             
              ```bash
         | 
| 26 26 | 
             
              $ bundle install
         | 
| 27 | 
            -
              $ cyclone_lariat install
         | 
| 27 | 
            +
              $ bundle exec cyclone_lariat install
         | 
| 28 28 | 
             
              ```
         | 
| 29 29 | 
             
            </details>
         | 
| 30 30 | 
             
            <details>
         | 
| @@ -40,7 +40,7 @@ This gem work in few scenarios: | |
| 40 40 | 
             
              And run in console:
         | 
| 41 41 | 
             
              ```bash
         | 
| 42 42 | 
             
              $ bundle install
         | 
| 43 | 
            -
              $ cyclone_lariat install --adapter=active_record
         | 
| 43 | 
            +
              $ bundle exec cyclone_lariat install --adapter=active_record
         | 
| 44 44 | 
             
              ```
         | 
| 45 45 | 
             
            </details>
         | 
| 46 46 |  | 
| @@ -344,7 +344,7 @@ class Publisher < CycloneLariat::Publisher | |
| 344 344 | 
             
              def delete_user(mail)
         | 
| 345 345 | 
             
                sns.publish command('delete_user', data: { mail: mail }), fifo: false
         | 
| 346 346 | 
             
              end
         | 
| 347 | 
            -
             | 
| 347 | 
            +
             | 
| 348 348 | 
             
              def welcome_message(mail, text)
         | 
| 349 349 | 
             
                sqs.publish command('welcome', data: {mail: mail, txt: text}), fifo: false
         | 
| 350 350 | 
             
              end
         | 
| @@ -408,13 +408,13 @@ CycloneLariat::Clients::Sns.new.publish_command( | |
| 408 408 | 
             
            class Publisher < CycloneLariat::Publisher
         | 
| 409 409 | 
             
              def register_user(first:, last:, mail:)
         | 
| 410 410 | 
             
                sns.publish command(
         | 
| 411 | 
            -
                  'register_user', | 
| 412 | 
            -
                  data: { | 
| 413 | 
            -
                    mail: mail, | 
| 411 | 
            +
                  'register_user',
         | 
| 412 | 
            +
                  data: {
         | 
| 413 | 
            +
                    mail: mail,
         | 
| 414 414 | 
             
                    name: {
         | 
| 415 | 
            -
                      first: first, | 
| 415 | 
            +
                      first: first,
         | 
| 416 416 | 
             
                      last: last
         | 
| 417 | 
            -
                    } | 
| 417 | 
            +
                    }
         | 
| 418 418 | 
             
                  }
         | 
| 419 419 | 
             
                ), fifo: false
         | 
| 420 420 | 
             
              end
         | 
| @@ -482,16 +482,16 @@ end | |
| 482 482 | 
             
            Will publish message on queue: `custom_topic_name`
         | 
| 483 483 |  | 
| 484 484 |  | 
| 485 | 
            -
            ### FIFO and no FIFO | 
| 485 | 
            +
            ### FIFO and no FIFO
         | 
| 486 486 | 
             
            The main idea you can read on [AWS Docs](https://aws.amazon.com/blogs/aws/introducing-amazon-sns-fifo-first-in-first-out-pub-sub-messaging/).
         | 
| 487 487 |  | 
| 488 488 | 
             
            FIFO message should consist two fields:
         | 
| 489 | 
            -
            - `group_id` - In each topic, the FIFO sequence is defined only within one group. | 
| 489 | 
            +
            - `group_id` - In each topic, the FIFO sequence is defined only within one group.
         | 
| 490 490 | 
             
             [AWS Docs](https://docs.aws.amazon.com/sns/latest/dg/fifo-message-grouping.html)
         | 
| 491 | 
            -
            - `deduplication_id` - Within the same group, a unique identifier must be defined for each message. | 
| 491 | 
            +
            - `deduplication_id` - Within the same group, a unique identifier must be defined for each message.
         | 
| 492 492 | 
             
             [AWS Docs](https://docs.aws.amazon.com/sns/latest/dg/fifo-message-dedup.html)
         | 
| 493 | 
            -
             | 
| 494 | 
            -
             The unique identifier can definitely be the entire message. In this case, you | 
| 493 | 
            +
             | 
| 494 | 
            +
             The unique identifier can definitely be the entire message. In this case, you
         | 
| 495 495 | 
             
             do not need to pass the deduplication_id parameter. But you must create a queue
         | 
| 496 496 | 
             
               with the `content_based_deduplication` parameter in migration.
         | 
| 497 497 |  | 
| @@ -516,7 +516,7 @@ class Publisher < CycloneLariat::Publisher | |
| 516 516 | 
             
                      uuid: uuid,
         | 
| 517 517 | 
             
                      mail: mail
         | 
| 518 518 | 
             
                    },
         | 
| 519 | 
            -
                  }, | 
| 519 | 
            +
                  },
         | 
| 520 520 | 
             
                  deduplication_id: mail,
         | 
| 521 521 | 
             
                  group_id: uuid),
         | 
| 522 522 | 
             
                fifo: true
         | 
| @@ -541,7 +541,7 @@ With **cyclone_lariat** you can use migrations that can create, delete, and subs | |
| 541 541 | 
             
            Before using this function, you must complete the **cyclone_lariat** [configuration](#Configuration).
         | 
| 542 542 |  | 
| 543 543 | 
             
            ```bash
         | 
| 544 | 
            -
            $ cyclone_lariat generate migration user_created
         | 
| 544 | 
            +
            $ bundle exec cyclone_lariat generate migration user_created
         | 
| 545 545 | 
             
            ```
         | 
| 546 546 |  | 
| 547 547 | 
             
            This command should create a migration file, let's edit it.
         | 
| @@ -561,7 +561,7 @@ class UserCreatedQueue < CycloneLariat::Migration | |
| 561 561 | 
             
              end
         | 
| 562 562 | 
             
            end
         | 
| 563 563 | 
             
            ```
         | 
| 564 | 
            -
            The `content_based_dedupplication` parameter can only be specified for FIFO resources. When true, the whole message is | 
| 564 | 
            +
            The `content_based_dedupplication` parameter can only be specified for FIFO resources. When true, the whole message is
         | 
| 565 565 | 
             
            used as the unique message identifier instead of the `deduplication_id` key.
         | 
| 566 566 |  | 
| 567 567 | 
             
            To apply migration use:
         | 
| @@ -720,8 +720,8 @@ We recommend locate migration on: | |
| 720 720 | 
             
            ## Console tasks
         | 
| 721 721 |  | 
| 722 722 | 
             
            ```bash
         | 
| 723 | 
            -
            $ cyclone_lariat install - install cyclone_lariat
         | 
| 724 | 
            -
            $ cyclone_lariat generate migration - generate new migration
         | 
| 723 | 
            +
            $ bundle exec cyclone_lariat install - install cyclone_lariat
         | 
| 724 | 
            +
            $ bundle exec cyclone_lariat generate migration - generate new migration
         | 
| 725 725 |  | 
| 726 726 | 
             
            $ rake cyclone_lariat:list:queues         # List all queues
         | 
| 727 727 | 
             
            $ rake cyclone_lariat:list:subscriptions  # List all subscriptions
         | 
| @@ -0,0 +1,138 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            require 'luna_park/entities/attributable'
         | 
| 4 | 
            +
            require 'luna_park/extensions/validatable'
         | 
| 5 | 
            +
            require 'cyclone_lariat/errors'
         | 
| 6 | 
            +
             | 
| 7 | 
            +
            module CycloneLariat
         | 
| 8 | 
            +
              module Messages
         | 
| 9 | 
            +
                class Abstract < LunaPark::Entities::Attributable
         | 
| 10 | 
            +
                  include LunaPark::Extensions::Validatable
         | 
| 11 | 
            +
             | 
| 12 | 
            +
                  KIND = 'unknown'
         | 
| 13 | 
            +
             | 
| 14 | 
            +
                  attr :uuid,      String, :new
         | 
| 15 | 
            +
                  attr :publisher, String, :new
         | 
| 16 | 
            +
                  attr :type,      String, :new
         | 
| 17 | 
            +
             | 
| 18 | 
            +
                  attrs :client_error, :version, :data, :request_id, :sent_at,
         | 
| 19 | 
            +
                        :deduplication_id, :group_id, :processed_at, :received_at
         | 
| 20 | 
            +
             | 
| 21 | 
            +
                  # Make validation public
         | 
| 22 | 
            +
                  def validation
         | 
| 23 | 
            +
                    super
         | 
| 24 | 
            +
                  end
         | 
| 25 | 
            +
             | 
| 26 | 
            +
                  def kind
         | 
| 27 | 
            +
                    KIND
         | 
| 28 | 
            +
                  end
         | 
| 29 | 
            +
             | 
| 30 | 
            +
                  def serialize
         | 
| 31 | 
            +
                    {
         | 
| 32 | 
            +
                      uuid: uuid,
         | 
| 33 | 
            +
                      publisher: publisher,
         | 
| 34 | 
            +
                      type: [kind, type].join('_'),
         | 
| 35 | 
            +
                      version: version,
         | 
| 36 | 
            +
                      data: data,
         | 
| 37 | 
            +
                      request_id: request_id,
         | 
| 38 | 
            +
                      sent_at: sent_at&.iso8601(3)
         | 
| 39 | 
            +
                    }.compact
         | 
| 40 | 
            +
                  end
         | 
| 41 | 
            +
             | 
| 42 | 
            +
                  def to_json(*args)
         | 
| 43 | 
            +
                    serialize.to_json(*args)
         | 
| 44 | 
            +
                  end
         | 
| 45 | 
            +
             | 
| 46 | 
            +
                  def params
         | 
| 47 | 
            +
                    serialize
         | 
| 48 | 
            +
                  end
         | 
| 49 | 
            +
             | 
| 50 | 
            +
                  def data
         | 
| 51 | 
            +
                    @data ||= {}
         | 
| 52 | 
            +
                  end
         | 
| 53 | 
            +
             | 
| 54 | 
            +
                  def version=(value)
         | 
| 55 | 
            +
                    @version = Integer(value)
         | 
| 56 | 
            +
                  end
         | 
| 57 | 
            +
             | 
| 58 | 
            +
                  def sent_at=(value)
         | 
| 59 | 
            +
                    @sent_at = wrap_time(value)
         | 
| 60 | 
            +
                  end
         | 
| 61 | 
            +
             | 
| 62 | 
            +
                  def received_at=(value)
         | 
| 63 | 
            +
                    @received_at = wrap_time(value)
         | 
| 64 | 
            +
                  end
         | 
| 65 | 
            +
             | 
| 66 | 
            +
                  def processed_at=(value)
         | 
| 67 | 
            +
                    @processed_at = wrap_time(value)
         | 
| 68 | 
            +
                  end
         | 
| 69 | 
            +
             | 
| 70 | 
            +
                  def request_id=(value)
         | 
| 71 | 
            +
                    @request_id = wrap_string(value)
         | 
| 72 | 
            +
                  end
         | 
| 73 | 
            +
             | 
| 74 | 
            +
                  def group_id=(value)
         | 
| 75 | 
            +
                    @group_id = wrap_string(value)
         | 
| 76 | 
            +
                  end
         | 
| 77 | 
            +
             | 
| 78 | 
            +
                  def deduplication_id=(value)
         | 
| 79 | 
            +
                    @deduplication_id = wrap_string(value)
         | 
| 80 | 
            +
                  end
         | 
| 81 | 
            +
             | 
| 82 | 
            +
                  def processed?
         | 
| 83 | 
            +
                    !@processed_at.nil?
         | 
| 84 | 
            +
                  end
         | 
| 85 | 
            +
             | 
| 86 | 
            +
                  def client_error_message=(txt)
         | 
| 87 | 
            +
                    return unless txt
         | 
| 88 | 
            +
             | 
| 89 | 
            +
                    @client_error ||= Errors::ClientError.new
         | 
| 90 | 
            +
                    @client_error.message = txt
         | 
| 91 | 
            +
                  end
         | 
| 92 | 
            +
             | 
| 93 | 
            +
                  def client_error_details=(details)
         | 
| 94 | 
            +
                    return unless details
         | 
| 95 | 
            +
             | 
| 96 | 
            +
                    @client_error ||= Errors::ClientError.new
         | 
| 97 | 
            +
                    @client_error.details = details
         | 
| 98 | 
            +
                  end
         | 
| 99 | 
            +
             | 
| 100 | 
            +
                  def fifo?
         | 
| 101 | 
            +
                    !@group_id.nil?
         | 
| 102 | 
            +
                  end
         | 
| 103 | 
            +
             | 
| 104 | 
            +
                  def ==(other)
         | 
| 105 | 
            +
                    kind == other.kind &&
         | 
| 106 | 
            +
                      uuid == other.uuid &&
         | 
| 107 | 
            +
                      publisher == other.publisher &&
         | 
| 108 | 
            +
                      type == other.type &&
         | 
| 109 | 
            +
                      client_error&.message == other.client_error&.message &&
         | 
| 110 | 
            +
                      version == other.version &&
         | 
| 111 | 
            +
                      sent_at.to_i == other.sent_at.to_i &&
         | 
| 112 | 
            +
                      received_at.to_i == other.received_at.to_i &&
         | 
| 113 | 
            +
                      processed_at.to_i == other.processed_at.to_i
         | 
| 114 | 
            +
                  end
         | 
| 115 | 
            +
             | 
| 116 | 
            +
                  private
         | 
| 117 | 
            +
             | 
| 118 | 
            +
                  def wrap_time(value)
         | 
| 119 | 
            +
                    case value
         | 
| 120 | 
            +
                    when String   then Time.parse(value)
         | 
| 121 | 
            +
                    when Time     then value
         | 
| 122 | 
            +
                    when NilClass then nil
         | 
| 123 | 
            +
                    else raise ArgumentError, "Unknown type `#{value.class}`"
         | 
| 124 | 
            +
                    end
         | 
| 125 | 
            +
                  end
         | 
| 126 | 
            +
             | 
| 127 | 
            +
                  def wrap_string(value)
         | 
| 128 | 
            +
                    case value
         | 
| 129 | 
            +
                    when String then String(value)
         | 
| 130 | 
            +
                    when Integer then String(value)
         | 
| 131 | 
            +
                    when NilClass then nil
         | 
| 132 | 
            +
                    when FalseClass then nil
         | 
| 133 | 
            +
                    else raise ArgumentError, "Unknown type `#{value.class}`"
         | 
| 134 | 
            +
                    end
         | 
| 135 | 
            +
                  end
         | 
| 136 | 
            +
                end
         | 
| 137 | 
            +
              end
         | 
| 138 | 
            +
            end
         | 
| @@ -0,0 +1,83 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            require 'cyclone_lariat/messages/v1/event'
         | 
| 4 | 
            +
            require 'cyclone_lariat/messages/v1/command'
         | 
| 5 | 
            +
            require 'cyclone_lariat/messages/v2/event'
         | 
| 6 | 
            +
            require 'cyclone_lariat/messages/v2/command'
         | 
| 7 | 
            +
            require 'cyclone_lariat/messages/common'
         | 
| 8 | 
            +
             | 
| 9 | 
            +
            module CycloneLariat
         | 
| 10 | 
            +
              module Messages
         | 
| 11 | 
            +
                class Builder
         | 
| 12 | 
            +
                  attr_reader :raw_message
         | 
| 13 | 
            +
             | 
| 14 | 
            +
                  def initialize(raw_message:)
         | 
| 15 | 
            +
                    @raw_message = raw_message
         | 
| 16 | 
            +
                    @kind = kind
         | 
| 17 | 
            +
                    @raw_message[:type] = message_type
         | 
| 18 | 
            +
                  end
         | 
| 19 | 
            +
             | 
| 20 | 
            +
                  def call
         | 
| 21 | 
            +
                    case @kind
         | 
| 22 | 
            +
                    when 'event' then event_builder
         | 
| 23 | 
            +
                    when 'command' then command_builder
         | 
| 24 | 
            +
                    else Messages::Common.wrap(message_without_kind)
         | 
| 25 | 
            +
                    end
         | 
| 26 | 
            +
                  end
         | 
| 27 | 
            +
             | 
| 28 | 
            +
                  private
         | 
| 29 | 
            +
             | 
| 30 | 
            +
                  def event_builder
         | 
| 31 | 
            +
                    case message_version
         | 
| 32 | 
            +
                    when 1 then event_v1
         | 
| 33 | 
            +
                    when 2 then event_v2
         | 
| 34 | 
            +
                    else raise ArgumentError, "Unknown event message version #{message_version}"
         | 
| 35 | 
            +
                    end
         | 
| 36 | 
            +
                  end
         | 
| 37 | 
            +
             | 
| 38 | 
            +
                  def command_builder
         | 
| 39 | 
            +
                    case message_version
         | 
| 40 | 
            +
                    when 1 then command_v1
         | 
| 41 | 
            +
                    when 2 then command_v2
         | 
| 42 | 
            +
                    else raise ArgumentError, "Unknown command message version #{message_version}"
         | 
| 43 | 
            +
                    end
         | 
| 44 | 
            +
                  end
         | 
| 45 | 
            +
             | 
| 46 | 
            +
                  def event_v1
         | 
| 47 | 
            +
                    Messages::V1::Event.wrap(message_without_kind)
         | 
| 48 | 
            +
                  end
         | 
| 49 | 
            +
             | 
| 50 | 
            +
                  def event_v2
         | 
| 51 | 
            +
                    Messages::V2::Event.wrap(message_without_kind)
         | 
| 52 | 
            +
                  end
         | 
| 53 | 
            +
             | 
| 54 | 
            +
                  def command_v1
         | 
| 55 | 
            +
                    Messages::V1::Command.wrap(message_without_kind)
         | 
| 56 | 
            +
                  end
         | 
| 57 | 
            +
             | 
| 58 | 
            +
                  def command_v2
         | 
| 59 | 
            +
                    Messages::V2::Command.wrap(message_without_kind)
         | 
| 60 | 
            +
                  end
         | 
| 61 | 
            +
             | 
| 62 | 
            +
                  def message_version
         | 
| 63 | 
            +
                    Integer(@raw_message[:version])
         | 
| 64 | 
            +
                  end
         | 
| 65 | 
            +
             | 
| 66 | 
            +
                  def message_without_kind
         | 
| 67 | 
            +
                    @raw_message.except(:kind)
         | 
| 68 | 
            +
                  end
         | 
| 69 | 
            +
             | 
| 70 | 
            +
                  def kind
         | 
| 71 | 
            +
                    return @raw_message[:kind] if @raw_message[:kind]
         | 
| 72 | 
            +
             | 
| 73 | 
            +
                    @raw_message[:type].split('_').first
         | 
| 74 | 
            +
                  end
         | 
| 75 | 
            +
             | 
| 76 | 
            +
                  def message_type
         | 
| 77 | 
            +
                    return @raw_message[:type] if @raw_message[:kind]
         | 
| 78 | 
            +
             | 
| 79 | 
            +
                    @raw_message[:type].gsub(/^(event_|command_)/, '')
         | 
| 80 | 
            +
                  end
         | 
| 81 | 
            +
                end
         | 
| 82 | 
            +
              end
         | 
| 83 | 
            +
            end
         | 
| @@ -0,0 +1,39 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            require 'cyclone_lariat/messages/abstract'
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            module CycloneLariat
         | 
| 6 | 
            +
              module Messages
         | 
| 7 | 
            +
                class Common < Abstract
         | 
| 8 | 
            +
                  KIND = 'unknown'
         | 
| 9 | 
            +
             | 
| 10 | 
            +
                  attrs :subject, :object
         | 
| 11 | 
            +
             | 
| 12 | 
            +
                  def kind
         | 
| 13 | 
            +
                    KIND
         | 
| 14 | 
            +
                  end
         | 
| 15 | 
            +
             | 
| 16 | 
            +
                  def serialize
         | 
| 17 | 
            +
                    {
         | 
| 18 | 
            +
                      uuid: uuid,
         | 
| 19 | 
            +
                      publisher: publisher,
         | 
| 20 | 
            +
                      type: [kind, type].join('_'),
         | 
| 21 | 
            +
                      version: version,
         | 
| 22 | 
            +
                      data: data,
         | 
| 23 | 
            +
                      request_id: request_id,
         | 
| 24 | 
            +
                      sent_at: sent_at&.iso8601(3),
         | 
| 25 | 
            +
                      subject: subject,
         | 
| 26 | 
            +
                      object: object
         | 
| 27 | 
            +
                    }.compact
         | 
| 28 | 
            +
                  end
         | 
| 29 | 
            +
             | 
| 30 | 
            +
                  def subject
         | 
| 31 | 
            +
                    @subject ||= {}
         | 
| 32 | 
            +
                  end
         | 
| 33 | 
            +
             | 
| 34 | 
            +
                  def object
         | 
| 35 | 
            +
                    @object ||= {}
         | 
| 36 | 
            +
                  end
         | 
| 37 | 
            +
                end
         | 
| 38 | 
            +
              end
         | 
| 39 | 
            +
            end
         | 
| @@ -1,13 +1,13 @@ | |
| 1 1 | 
             
            # frozen_string_literal: true
         | 
| 2 2 |  | 
| 3 | 
            -
            require 'cyclone_lariat/messages/ | 
| 3 | 
            +
            require 'cyclone_lariat/messages/abstract'
         | 
| 4 | 
            +
            require 'cyclone_lariat/messages/v1/validator'
         | 
| 4 5 |  | 
| 5 6 | 
             
            module CycloneLariat
         | 
| 6 7 | 
             
              module Messages
         | 
| 7 8 | 
             
                module V1
         | 
| 8 9 | 
             
                  class Command < Abstract
         | 
| 9 | 
            -
                     | 
| 10 | 
            -
                    validator Messages::V1::Validator
         | 
| 10 | 
            +
                    validator Validator
         | 
| 11 11 |  | 
| 12 12 | 
             
                    KIND = 'command'
         | 
| 13 13 |  | 
| @@ -1,13 +1,13 @@ | |
| 1 1 | 
             
            # frozen_string_literal: true
         | 
| 2 2 |  | 
| 3 | 
            -
            require 'cyclone_lariat/messages/ | 
| 3 | 
            +
            require 'cyclone_lariat/messages/abstract'
         | 
| 4 | 
            +
            require 'cyclone_lariat/messages/v1/validator'
         | 
| 4 5 |  | 
| 5 6 | 
             
            module CycloneLariat
         | 
| 6 7 | 
             
              module Messages
         | 
| 7 8 | 
             
                module V1
         | 
| 8 9 | 
             
                  class Event < Abstract
         | 
| 9 | 
            -
                     | 
| 10 | 
            -
                    validator Messages::V1::Validator
         | 
| 10 | 
            +
                    validator Validator
         | 
| 11 11 |  | 
| 12 12 | 
             
                    KIND = 'event'
         | 
| 13 13 |  | 
| @@ -1,19 +1,43 @@ | |
| 1 1 | 
             
            # frozen_string_literal: true
         | 
| 2 2 |  | 
| 3 | 
            -
            require 'cyclone_lariat/messages/ | 
| 3 | 
            +
            require 'cyclone_lariat/messages/abstract'
         | 
| 4 | 
            +
            require 'cyclone_lariat/messages/v2/validator'
         | 
| 4 5 |  | 
| 5 6 | 
             
            module CycloneLariat
         | 
| 6 7 | 
             
              module Messages
         | 
| 7 8 | 
             
                module V2
         | 
| 8 9 | 
             
                  class Command < Abstract
         | 
| 9 | 
            -
                     | 
| 10 | 
            -
             | 
| 10 | 
            +
                    validator Validator
         | 
| 11 | 
            +
             | 
| 12 | 
            +
                    attrs :subject, :object
         | 
| 11 13 |  | 
| 12 14 | 
             
                    KIND = 'command'
         | 
| 13 15 |  | 
| 14 16 | 
             
                    def kind
         | 
| 15 17 | 
             
                      KIND
         | 
| 16 18 | 
             
                    end
         | 
| 19 | 
            +
             | 
| 20 | 
            +
                    def serialize
         | 
| 21 | 
            +
                      {
         | 
| 22 | 
            +
                        uuid: uuid,
         | 
| 23 | 
            +
                        publisher: publisher,
         | 
| 24 | 
            +
                        type: [kind, type].join('_'),
         | 
| 25 | 
            +
                        version: version,
         | 
| 26 | 
            +
                        data: data,
         | 
| 27 | 
            +
                        request_id: request_id,
         | 
| 28 | 
            +
                        sent_at: sent_at&.iso8601(3),
         | 
| 29 | 
            +
                        subject: subject,
         | 
| 30 | 
            +
                        object: object
         | 
| 31 | 
            +
                      }.compact
         | 
| 32 | 
            +
                    end
         | 
| 33 | 
            +
             | 
| 34 | 
            +
                    def subject
         | 
| 35 | 
            +
                      @subject ||= {}
         | 
| 36 | 
            +
                    end
         | 
| 37 | 
            +
             | 
| 38 | 
            +
                    def object
         | 
| 39 | 
            +
                      @object ||= {}
         | 
| 40 | 
            +
                    end
         | 
| 17 41 | 
             
                  end
         | 
| 18 42 | 
             
                end
         | 
| 19 43 | 
             
              end
         | 
| @@ -1,19 +1,43 @@ | |
| 1 1 | 
             
            # frozen_string_literal: true
         | 
| 2 2 |  | 
| 3 | 
            -
            require 'cyclone_lariat/messages/ | 
| 3 | 
            +
            require 'cyclone_lariat/messages/abstract'
         | 
| 4 | 
            +
            require 'cyclone_lariat/messages/v2/validator'
         | 
| 4 5 |  | 
| 5 6 | 
             
            module CycloneLariat
         | 
| 6 7 | 
             
              module Messages
         | 
| 7 8 | 
             
                module V2
         | 
| 8 9 | 
             
                  class Event < Abstract
         | 
| 9 | 
            -
                     | 
| 10 | 
            -
             | 
| 10 | 
            +
                    validator Validator
         | 
| 11 | 
            +
             | 
| 12 | 
            +
                    attrs :subject, :object
         | 
| 11 13 |  | 
| 12 14 | 
             
                    KIND = 'event'
         | 
| 13 15 |  | 
| 14 16 | 
             
                    def kind
         | 
| 15 17 | 
             
                      KIND
         | 
| 16 18 | 
             
                    end
         | 
| 19 | 
            +
             | 
| 20 | 
            +
                    def serialize
         | 
| 21 | 
            +
                      {
         | 
| 22 | 
            +
                        uuid: uuid,
         | 
| 23 | 
            +
                        publisher: publisher,
         | 
| 24 | 
            +
                        type: [kind, type].join('_'),
         | 
| 25 | 
            +
                        version: version,
         | 
| 26 | 
            +
                        data: data,
         | 
| 27 | 
            +
                        request_id: request_id,
         | 
| 28 | 
            +
                        sent_at: sent_at&.iso8601(3),
         | 
| 29 | 
            +
                        subject: subject,
         | 
| 30 | 
            +
                        object: object
         | 
| 31 | 
            +
                      }.compact
         | 
| 32 | 
            +
                    end
         | 
| 33 | 
            +
             | 
| 34 | 
            +
                    def subject
         | 
| 35 | 
            +
                      @subject ||= {}
         | 
| 36 | 
            +
                    end
         | 
| 37 | 
            +
             | 
| 38 | 
            +
                    def object
         | 
| 39 | 
            +
                      @object ||= {}
         | 
| 40 | 
            +
                    end
         | 
| 17 41 | 
             
                  end
         | 
| 18 42 | 
             
                end
         | 
| 19 43 | 
             
              end
         | 
| @@ -3,6 +3,7 @@ | |
| 3 3 | 
             
            require 'cyclone_lariat/repo/messages'
         | 
| 4 4 | 
             
            require 'cyclone_lariat/core'
         | 
| 5 5 | 
             
            require 'luna_park/errors'
         | 
| 6 | 
            +
            require 'cyclone_lariat/messages/builder'
         | 
| 6 7 | 
             
            require 'json'
         | 
| 7 8 |  | 
| 8 9 | 
             
            module CycloneLariat
         | 
| @@ -23,7 +24,7 @@ module CycloneLariat | |
| 23 24 | 
             
                  return if msg.is_a? String
         | 
| 24 25 |  | 
| 25 26 | 
             
                  catch_standard_error(queue, msg) do
         | 
| 26 | 
            -
                    event = Messages:: | 
| 27 | 
            +
                    event = Messages::Builder.new(raw_message: msg).call
         | 
| 27 28 |  | 
| 28 29 | 
             
                    store_in_dataset(event) do
         | 
| 29 30 | 
             
                      catch_business_error(event, &block)
         | 
| @@ -3,6 +3,7 @@ | |
| 3 3 | 
             
            require 'cyclone_lariat/messages/v1/event'
         | 
| 4 4 | 
             
            require 'cyclone_lariat/messages/v1/command'
         | 
| 5 5 | 
             
            require 'cyclone_lariat/repo/messages_mapper'
         | 
| 6 | 
            +
            require 'cyclone_lariat/messages/builder'
         | 
| 6 7 |  | 
| 7 8 | 
             
            module CycloneLariat
         | 
| 8 9 | 
             
              module Repo
         | 
| @@ -80,11 +81,7 @@ module CycloneLariat | |
| 80 81 | 
             
                    end
         | 
| 81 82 |  | 
| 82 83 | 
             
                    def build(raw)
         | 
| 83 | 
            -
                       | 
| 84 | 
            -
                      when 'event'   then CycloneLariat::Messages::V1::Event.wrap raw
         | 
| 85 | 
            -
                      when 'command' then CycloneLariat::Messages::V1::Command.wrap raw
         | 
| 86 | 
            -
                      else raise ArgumentError, "Unknown kind `#{kind}` of message"
         | 
| 87 | 
            -
                      end
         | 
| 84 | 
            +
                      CycloneLariat::Messages::Builder.new(raw_message: raw).call
         | 
| 88 85 | 
             
                    end
         | 
| 89 86 | 
             
                  end
         | 
| 90 87 | 
             
                end
         | 
| @@ -3,6 +3,7 @@ | |
| 3 3 | 
             
            require 'cyclone_lariat/messages/v1/event'
         | 
| 4 4 | 
             
            require 'cyclone_lariat/messages/v1/command'
         | 
| 5 5 | 
             
            require 'cyclone_lariat/repo/messages_mapper'
         | 
| 6 | 
            +
            require 'cyclone_lariat/messages/builder'
         | 
| 6 7 |  | 
| 7 8 | 
             
            module CycloneLariat
         | 
| 8 9 | 
             
              module Repo
         | 
| @@ -61,11 +62,7 @@ module CycloneLariat | |
| 61 62 | 
             
                    private
         | 
| 62 63 |  | 
| 63 64 | 
             
                    def build(raw)
         | 
| 64 | 
            -
                       | 
| 65 | 
            -
                      when 'event'   then CycloneLariat::Messages::V1::Event.wrap raw
         | 
| 66 | 
            -
                      when 'command' then CycloneLariat::Messages::V1::Command.wrap raw
         | 
| 67 | 
            -
                      else raise ArgumentError, "Unknown kind `#{kind}` of message"
         | 
| 68 | 
            -
                      end
         | 
| 65 | 
            +
                      CycloneLariat::Messages::Builder.new(raw_message: raw).call
         | 
| 69 66 | 
             
                    end
         | 
| 70 67 | 
             
                  end
         | 
| 71 68 | 
             
                end
         | 
    
        data/lib/cyclone_lariat.rb
    CHANGED
    
    
    
        metadata
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: cyclone_lariat
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 1.0.0. | 
| 4 | 
            +
              version: 1.0.0.rc3
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Alexander Kudrin
         | 
| @@ -11,7 +11,7 @@ authors: | |
| 11 11 | 
             
            autorequire: 
         | 
| 12 12 | 
             
            bindir: bin
         | 
| 13 13 | 
             
            cert_chain: []
         | 
| 14 | 
            -
            date: 2023- | 
| 14 | 
            +
            date: 2023-02-02 00:00:00.000000000 Z
         | 
| 15 15 | 
             
            dependencies:
         | 
| 16 16 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 17 17 | 
             
              name: aws-sdk-sns
         | 
| @@ -388,11 +388,12 @@ files: | |
| 388 388 | 
             
            - lib/cyclone_lariat/generators/event.rb
         | 
| 389 389 | 
             
            - lib/cyclone_lariat/generators/queue.rb
         | 
| 390 390 | 
             
            - lib/cyclone_lariat/generators/topic.rb
         | 
| 391 | 
            -
            - lib/cyclone_lariat/messages/ | 
| 391 | 
            +
            - lib/cyclone_lariat/messages/abstract.rb
         | 
| 392 | 
            +
            - lib/cyclone_lariat/messages/builder.rb
         | 
| 393 | 
            +
            - lib/cyclone_lariat/messages/common.rb
         | 
| 392 394 | 
             
            - lib/cyclone_lariat/messages/v1/command.rb
         | 
| 393 395 | 
             
            - lib/cyclone_lariat/messages/v1/event.rb
         | 
| 394 396 | 
             
            - lib/cyclone_lariat/messages/v1/validator.rb
         | 
| 395 | 
            -
            - lib/cyclone_lariat/messages/v2/abstract.rb
         | 
| 396 397 | 
             
            - lib/cyclone_lariat/messages/v2/command.rb
         | 
| 397 398 | 
             
            - lib/cyclone_lariat/messages/v2/event.rb
         | 
| 398 399 | 
             
            - lib/cyclone_lariat/messages/v2/validator.rb
         | 
| @@ -1,139 +0,0 @@ | |
| 1 | 
            -
            # frozen_string_literal: true
         | 
| 2 | 
            -
             | 
| 3 | 
            -
            require 'luna_park/entities/attributable'
         | 
| 4 | 
            -
            require 'luna_park/extensions/validatable'
         | 
| 5 | 
            -
            require 'cyclone_lariat/messages/v1/validator'
         | 
| 6 | 
            -
            require 'cyclone_lariat/errors'
         | 
| 7 | 
            -
             | 
| 8 | 
            -
            module CycloneLariat
         | 
| 9 | 
            -
              module Messages
         | 
| 10 | 
            -
                module V1
         | 
| 11 | 
            -
                  class Abstract < LunaPark::Entities::Attributable
         | 
| 12 | 
            -
                    include LunaPark::Extensions::Validatable
         | 
| 13 | 
            -
             | 
| 14 | 
            -
                    attr :uuid,      String, :new
         | 
| 15 | 
            -
                    attr :publisher, String, :new
         | 
| 16 | 
            -
                    attr :type,      String, :new
         | 
| 17 | 
            -
             | 
| 18 | 
            -
                    attrs :client_error, :version, :data, :request_id, :sent_at,
         | 
| 19 | 
            -
                          :deduplication_id, :group_id, :processed_at, :received_at
         | 
| 20 | 
            -
             | 
| 21 | 
            -
                    validator Validator
         | 
| 22 | 
            -
             | 
| 23 | 
            -
                    # Make validation public
         | 
| 24 | 
            -
                    def validation
         | 
| 25 | 
            -
                      super
         | 
| 26 | 
            -
                    end
         | 
| 27 | 
            -
             | 
| 28 | 
            -
                    def serialize
         | 
| 29 | 
            -
                      {
         | 
| 30 | 
            -
                        uuid: uuid,
         | 
| 31 | 
            -
                        publisher: publisher,
         | 
| 32 | 
            -
                        type: [kind, type].join('_'),
         | 
| 33 | 
            -
                        version: version,
         | 
| 34 | 
            -
                        data: data,
         | 
| 35 | 
            -
                        request_id: request_id,
         | 
| 36 | 
            -
                        sent_at: sent_at&.iso8601(3)
         | 
| 37 | 
            -
                      }.compact
         | 
| 38 | 
            -
                    end
         | 
| 39 | 
            -
             | 
| 40 | 
            -
                    def to_json(*args)
         | 
| 41 | 
            -
                      serialize.to_json(*args)
         | 
| 42 | 
            -
                    end
         | 
| 43 | 
            -
             | 
| 44 | 
            -
                    alias params serialize
         | 
| 45 | 
            -
             | 
| 46 | 
            -
                    def kind
         | 
| 47 | 
            -
                      raise LunaPark::Errors::AbstractMethod
         | 
| 48 | 
            -
                    end
         | 
| 49 | 
            -
             | 
| 50 | 
            -
                    def data
         | 
| 51 | 
            -
                      @data ||= {}
         | 
| 52 | 
            -
                    end
         | 
| 53 | 
            -
             | 
| 54 | 
            -
                    def version=(value)
         | 
| 55 | 
            -
                      @version = Integer(value)
         | 
| 56 | 
            -
                    end
         | 
| 57 | 
            -
             | 
| 58 | 
            -
                    def sent_at=(value)
         | 
| 59 | 
            -
                      @sent_at = wrap_time(value)
         | 
| 60 | 
            -
                    end
         | 
| 61 | 
            -
             | 
| 62 | 
            -
                    def received_at=(value)
         | 
| 63 | 
            -
                      @received_at = wrap_time(value)
         | 
| 64 | 
            -
                    end
         | 
| 65 | 
            -
             | 
| 66 | 
            -
                    def processed_at=(value)
         | 
| 67 | 
            -
                      @processed_at = wrap_time(value)
         | 
| 68 | 
            -
                    end
         | 
| 69 | 
            -
             | 
| 70 | 
            -
                    def request_id=(value)
         | 
| 71 | 
            -
                      @request_id = wrap_string(value)
         | 
| 72 | 
            -
                    end
         | 
| 73 | 
            -
             | 
| 74 | 
            -
                    def group_id=(value)
         | 
| 75 | 
            -
                      @group_id = wrap_string(value)
         | 
| 76 | 
            -
                    end
         | 
| 77 | 
            -
             | 
| 78 | 
            -
                    def deduplication_id=(value)
         | 
| 79 | 
            -
                      @deduplication_id = wrap_string(value)
         | 
| 80 | 
            -
                    end
         | 
| 81 | 
            -
             | 
| 82 | 
            -
                    def processed?
         | 
| 83 | 
            -
                      !@processed_at.nil?
         | 
| 84 | 
            -
                    end
         | 
| 85 | 
            -
             | 
| 86 | 
            -
                    def client_error_message=(txt)
         | 
| 87 | 
            -
                      return unless txt
         | 
| 88 | 
            -
             | 
| 89 | 
            -
                      @client_error ||= Errors::ClientError.new
         | 
| 90 | 
            -
                      @client_error.message = txt
         | 
| 91 | 
            -
                    end
         | 
| 92 | 
            -
             | 
| 93 | 
            -
                    def client_error_details=(details)
         | 
| 94 | 
            -
                      return unless details
         | 
| 95 | 
            -
             | 
| 96 | 
            -
                      @client_error ||= Errors::ClientError.new
         | 
| 97 | 
            -
                      @client_error.details = details
         | 
| 98 | 
            -
                    end
         | 
| 99 | 
            -
             | 
| 100 | 
            -
                    def fifo?
         | 
| 101 | 
            -
                      !@group_id.nil?
         | 
| 102 | 
            -
                    end
         | 
| 103 | 
            -
             | 
| 104 | 
            -
                    def ==(other)
         | 
| 105 | 
            -
                      kind == other.kind &&
         | 
| 106 | 
            -
                        uuid == other.uuid &&
         | 
| 107 | 
            -
                        publisher == other.publisher &&
         | 
| 108 | 
            -
                        type == other.type &&
         | 
| 109 | 
            -
                        client_error&.message == other.client_error&.message &&
         | 
| 110 | 
            -
                        version == other.version &&
         | 
| 111 | 
            -
                        sent_at.to_i == other.sent_at.to_i &&
         | 
| 112 | 
            -
                        received_at.to_i == other.received_at.to_i &&
         | 
| 113 | 
            -
                        processed_at.to_i == other.processed_at.to_i
         | 
| 114 | 
            -
                    end
         | 
| 115 | 
            -
             | 
| 116 | 
            -
                    private
         | 
| 117 | 
            -
             | 
| 118 | 
            -
                    def wrap_time(value)
         | 
| 119 | 
            -
                      case value
         | 
| 120 | 
            -
                      when String   then Time.parse(value)
         | 
| 121 | 
            -
                      when Time     then value
         | 
| 122 | 
            -
                      when NilClass then nil
         | 
| 123 | 
            -
                      else raise ArgumentError, "Unknown type `#{value.class}`"
         | 
| 124 | 
            -
                      end
         | 
| 125 | 
            -
                    end
         | 
| 126 | 
            -
             | 
| 127 | 
            -
                    def wrap_string(value)
         | 
| 128 | 
            -
                      case value
         | 
| 129 | 
            -
                      when String then String(value)
         | 
| 130 | 
            -
                      when Integer then String(value)
         | 
| 131 | 
            -
                      when NilClass then nil
         | 
| 132 | 
            -
                      when FalseClass then nil
         | 
| 133 | 
            -
                      else raise ArgumentError, "Unknown type `#{value.class}`"
         | 
| 134 | 
            -
                      end
         | 
| 135 | 
            -
                    end
         | 
| 136 | 
            -
                  end
         | 
| 137 | 
            -
                end
         | 
| 138 | 
            -
              end
         | 
| 139 | 
            -
            end
         | 
| @@ -1,149 +0,0 @@ | |
| 1 | 
            -
            # frozen_string_literal: true
         | 
| 2 | 
            -
             | 
| 3 | 
            -
            require 'luna_park/entities/attributable'
         | 
| 4 | 
            -
            require 'luna_park/extensions/validatable'
         | 
| 5 | 
            -
            require 'cyclone_lariat/messages/v2/validator'
         | 
| 6 | 
            -
            require 'cyclone_lariat/errors'
         | 
| 7 | 
            -
             | 
| 8 | 
            -
            module CycloneLariat
         | 
| 9 | 
            -
              module Messages
         | 
| 10 | 
            -
                module V2
         | 
| 11 | 
            -
                  class Abstract < LunaPark::Entities::Attributable
         | 
| 12 | 
            -
                    include LunaPark::Extensions::Validatable
         | 
| 13 | 
            -
             | 
| 14 | 
            -
                    attr :uuid,      String, :new
         | 
| 15 | 
            -
                    attr :publisher, String, :new
         | 
| 16 | 
            -
                    attr :type,      String, :new
         | 
| 17 | 
            -
                    attrs :client_error, :version, :data, :request_id, :sent_at,
         | 
| 18 | 
            -
                      :deduplication_id, :group_id, :processed_at, :received_at,
         | 
| 19 | 
            -
                      :subject, :object
         | 
| 20 | 
            -
             | 
| 21 | 
            -
                    validator Validator
         | 
| 22 | 
            -
             | 
| 23 | 
            -
                    # Make validation public
         | 
| 24 | 
            -
                    def validation
         | 
| 25 | 
            -
                      super
         | 
| 26 | 
            -
                    end
         | 
| 27 | 
            -
             | 
| 28 | 
            -
                    def serialize
         | 
| 29 | 
            -
                      {
         | 
| 30 | 
            -
                        uuid: uuid,
         | 
| 31 | 
            -
                        publisher: publisher,
         | 
| 32 | 
            -
                        type: [kind, type].join('_'),
         | 
| 33 | 
            -
                        version: version,
         | 
| 34 | 
            -
                        data: data,
         | 
| 35 | 
            -
                        request_id: request_id,
         | 
| 36 | 
            -
                        sent_at: sent_at&.iso8601(3),
         | 
| 37 | 
            -
                        subject: subject,
         | 
| 38 | 
            -
                        object: object
         | 
| 39 | 
            -
                      }.compact
         | 
| 40 | 
            -
                    end
         | 
| 41 | 
            -
             | 
| 42 | 
            -
                    def to_json(*args)
         | 
| 43 | 
            -
                      serialize.to_json(*args)
         | 
| 44 | 
            -
                    end
         | 
| 45 | 
            -
             | 
| 46 | 
            -
                    alias params serialize
         | 
| 47 | 
            -
             | 
| 48 | 
            -
                    def kind
         | 
| 49 | 
            -
                      raise LunaPark::Errors::AbstractMethod
         | 
| 50 | 
            -
                    end
         | 
| 51 | 
            -
             | 
| 52 | 
            -
                    def data
         | 
| 53 | 
            -
                      @data ||= {}
         | 
| 54 | 
            -
                    end
         | 
| 55 | 
            -
             | 
| 56 | 
            -
                    def subject
         | 
| 57 | 
            -
                      @subject ||= {}
         | 
| 58 | 
            -
                    end
         | 
| 59 | 
            -
             | 
| 60 | 
            -
                    def object
         | 
| 61 | 
            -
                      @object ||= {}
         | 
| 62 | 
            -
                    end
         | 
| 63 | 
            -
             | 
| 64 | 
            -
                    def version=(value)
         | 
| 65 | 
            -
                      @version = Integer(value)
         | 
| 66 | 
            -
                    end
         | 
| 67 | 
            -
             | 
| 68 | 
            -
                    def sent_at=(value)
         | 
| 69 | 
            -
                      @sent_at = wrap_time(value)
         | 
| 70 | 
            -
                    end
         | 
| 71 | 
            -
             | 
| 72 | 
            -
                    def received_at=(value)
         | 
| 73 | 
            -
                      @received_at = wrap_time(value)
         | 
| 74 | 
            -
                    end
         | 
| 75 | 
            -
             | 
| 76 | 
            -
                    def processed_at=(value)
         | 
| 77 | 
            -
                      @processed_at = wrap_time(value)
         | 
| 78 | 
            -
                    end
         | 
| 79 | 
            -
             | 
| 80 | 
            -
                    def request_id=(value)
         | 
| 81 | 
            -
                      @request_id = wrap_string(value)
         | 
| 82 | 
            -
                    end
         | 
| 83 | 
            -
             | 
| 84 | 
            -
                    def group_id=(value)
         | 
| 85 | 
            -
                      @group_id = wrap_string(value)
         | 
| 86 | 
            -
                    end
         | 
| 87 | 
            -
             | 
| 88 | 
            -
                    def deduplication_id=(value)
         | 
| 89 | 
            -
                      @deduplication_id = wrap_string(value)
         | 
| 90 | 
            -
                    end
         | 
| 91 | 
            -
             | 
| 92 | 
            -
                    def processed?
         | 
| 93 | 
            -
                      !@processed_at.nil?
         | 
| 94 | 
            -
                    end
         | 
| 95 | 
            -
             | 
| 96 | 
            -
                    def client_error_message=(txt)
         | 
| 97 | 
            -
                      return unless txt
         | 
| 98 | 
            -
             | 
| 99 | 
            -
                      @client_error ||= Errors::ClientError.new
         | 
| 100 | 
            -
                      @client_error.message = txt
         | 
| 101 | 
            -
                    end
         | 
| 102 | 
            -
             | 
| 103 | 
            -
                    def client_error_details=(details)
         | 
| 104 | 
            -
                      return unless details
         | 
| 105 | 
            -
             | 
| 106 | 
            -
                      @client_error ||= Errors::ClientError.new
         | 
| 107 | 
            -
                      @client_error.details = details
         | 
| 108 | 
            -
                    end
         | 
| 109 | 
            -
             | 
| 110 | 
            -
                    def fifo?
         | 
| 111 | 
            -
                      !@group_id.nil?
         | 
| 112 | 
            -
                    end
         | 
| 113 | 
            -
             | 
| 114 | 
            -
                    def ==(other)
         | 
| 115 | 
            -
                      kind == other.kind &&
         | 
| 116 | 
            -
                        uuid == other.uuid &&
         | 
| 117 | 
            -
                        publisher == other.publisher &&
         | 
| 118 | 
            -
                        type == other.type &&
         | 
| 119 | 
            -
                        client_error&.message == other.client_error&.message &&
         | 
| 120 | 
            -
                        version == other.version &&
         | 
| 121 | 
            -
                        sent_at.to_i == other.sent_at.to_i &&
         | 
| 122 | 
            -
                        received_at.to_i == other.received_at.to_i &&
         | 
| 123 | 
            -
                        processed_at.to_i == other.processed_at.to_i
         | 
| 124 | 
            -
                    end
         | 
| 125 | 
            -
             | 
| 126 | 
            -
                    private
         | 
| 127 | 
            -
             | 
| 128 | 
            -
                    def wrap_time(value)
         | 
| 129 | 
            -
                      case value
         | 
| 130 | 
            -
                      when String   then Time.parse(value)
         | 
| 131 | 
            -
                      when Time     then value
         | 
| 132 | 
            -
                      when NilClass then nil
         | 
| 133 | 
            -
                      else raise ArgumentError, "Unknown type `#{value.class}`"
         | 
| 134 | 
            -
                      end
         | 
| 135 | 
            -
                    end
         | 
| 136 | 
            -
             | 
| 137 | 
            -
                    def wrap_string(value)
         | 
| 138 | 
            -
                      case value
         | 
| 139 | 
            -
                      when String then String(value)
         | 
| 140 | 
            -
                      when Integer then String(value)
         | 
| 141 | 
            -
                      when NilClass then nil
         | 
| 142 | 
            -
                      when FalseClass then nil
         | 
| 143 | 
            -
                      else raise ArgumentError, "Unknown type `#{value.class}`"
         | 
| 144 | 
            -
                      end
         | 
| 145 | 
            -
                    end
         | 
| 146 | 
            -
                  end
         | 
| 147 | 
            -
                end
         | 
| 148 | 
            -
              end
         | 
| 149 | 
            -
            end
         |