Skip to content

Commit

Permalink
Class Signature
Browse files Browse the repository at this point in the history
  • Loading branch information
Rustam Ibragimov committed Nov 12, 2017
1 parent 1b16208 commit d69d7ed
Show file tree
Hide file tree
Showing 5 changed files with 169 additions and 0 deletions.
3 changes: 3 additions & 0 deletions lib/evil_events/core/events.rb
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,9 @@ module Events
require_relative 'events/event_extensions/metadata_extendable'
require_relative 'events/event_extensions/metadata_extendable/abstract_metadata'
require_relative 'events/event_extensions/emittable'
require_relative 'events/event_extensions/class_signature'
require_relative 'events/event_extensions/class_signature/signature'
require_relative 'events/event_extensions/class_signature/equalizer'
require_relative 'events/abstract_event'
require_relative 'events/manager'
require_relative 'events/manager/notifier'
Expand Down
2 changes: 2 additions & 0 deletions lib/evil_events/core/events/abstract_event.rb
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@ class AbstractEvent
include EventExtensions::Emittable
# @since 0.1.0
include EventExtensions::MetadataExtendable
# @sicne 0.2.0
include EventExtensions::ClassSignature
# @since 0.1.0
extend EvilEvents::Shared::CombinedContext::Mixin

Expand Down
17 changes: 17 additions & 0 deletions lib/evil_events/core/events/event_extensions/class_signature.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
# frozen_string_literal: true

module EvilEvents::Core::Events::EventExtensions
module ClassSignature
class << self
def included(base_class)
base_class.extend(ClassMethods)
end
end

module ClassMethods
def signature
Signature.new(self)
end
end
end
end
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
# frozen_string_literal: true

module EvilEvents::Core::Events::EventExtensions::ClassSignature
# @api private
# @since 0.2.0
class Equalizer
# @rreturn [Signature]
#
# @since 0.2.0
attr_reader :signature_a
# @rreturn [Signature]
#
# @since 0.2.0
attr_reader :signature_b

# @param signature_a [Signature]
# @param signature_b [Signature]
#
# @since 0.2.0
def initialize(signature_a, signature_b)
@signature_a = signature_a
@signature_b = signature_b
end

# @return [Boolean]
#
# @since 0.2.0
def equal_payload?
signature_a.payload_stamp == signature_b.payload_stamp
end

# @return [Boolean]
#
# @since 0.2.0
def equal_metadata?
signature_a.metadata_stamp == signature_b.metadata_stamp
end

# @return [Boolean]
#
# @since 0.2.0
def equal_delegator?
signature_a.delegator_stamp == signature_b.delegator_stamp
end

# @return [Boolean]
#
# @since 0.2.0
def equal_adapter?
signature_a.adapter_stamp == signature_b.adapter_stamp
end

# @return [Boolean]
#
# @since 0.2.0
def equal_type_alias?
signature_a.type_alias_stamp == signature_b.type_alias_stamp
end

# @return [Boolean]
#
# @since 0.2.0
def equal_class?
signature_a.class_stamp == signature_b.class_stamp
end

# @option strict [Boolean]
# @return [Boolean]
#
# @since 0.2.0
def similar_signatures?(strict: false)
equal_payload? &&
equal_metadata? &&
equal_delegator? &&
equal_adapter? &&
(strict ? (equal_class? && equal_type_alias?)
: (equal_class? || equal_type_alias?))
end
end
end
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
# frozen_string_literal: true

module EvilEvents::Core::Events::EventExtensions::ClassSignature
# @api private
# @since 0.2.0
class Signature
# @return [EvilEvents::Core::Events::AbstractEvent]
attr_reader :event_class

# @param event_calass [EvilEvents::Core::Events::AbstractEvent]
#
# @since 0.2.0
def initialize(event_class)
@event_class = event_class
end

# @return [Hash]
#
# @since 0.2.0
def payload_stamp
event_class::Payload.schema
end

# @return [Hash]
#
# @since 0.2.0
def metadata_stamp
event_class::Metadata.schema
end

# @return [String]
#
# @since 0.2.0
def class_stamp
event_class.name
end

# @return [String]
#
# @since 0.2.0
def type_alias_stamp
event_class.type
end

# @return [Symbol,String]
#
# @since 0.2.0
def delegator_stamp
event_class.default_delegator
end

# @return [Hash]
#
# @since 0.2.0
def adapter_stamp
{ event_class.adapter_name => event_class.adapter }
end

# @return [Boolean]
#
# @since 0.2.0
def ==(signature)
Equalizer.new(self, signature).similar_signatures?
end
alias_method :eql?, :==
end
end

0 comments on commit d69d7ed

Please sign in to comment.