fredjean/simpler_workflow

View on GitHub
lib/simpler_workflow/activity_registry.rb

Summary

Maintainability
A
0 mins
Test Coverage
module SimplerWorkflow
  class ActivityRegistry
    def register(*activity_tuple)
      domain = activity_tuple.shift
      activity = activity_tuple.pop if activity_tuple.last.is_a?(Activity)
      raise "Activity missing from registration" unless activity

      registry_for_domain(domain)[activity_tuple] = activity
    end

    alias :[]= :register

    def get(*activity_tuple)
      domain = activity_tuple.shift
      
      if AWS::SimpleWorkflow::ActivityType === domain
        name = domain.name.to_sym
        version = domain.version
        domain = domain.domain
      else
        name = activity_tuple.first
        
        case name
        when Hash
          version = name[:version]
          name = name[:name].to_sym
        when String, Symbol
          name = name.to_sym
          version = activity_tuple.last
        end
      end

      registry_for_domain(domain)[[name, version]]
    end

    alias :[] :get

    def persist_attributes(activity)
      domain = Domain.for(activity.domain)

      sdb_domain(domain).items.create(activity.simple_db_name, activity.simple_db_attributes)
    end

    protected
    def registries
      @registries ||= {}
    end

    def registry_for_domain(domain)
      domain = Domain.for(domain)

      unless sdb_domain(domain).exists?
        sdb.domains.create(sdb_domain_name(domain))
      end

      registries[domain.name.to_sym] ||= Hash.new do |registry, (name, version)|
        activity = Activity.new(domain, name, version)
        attributes = sdb_attributes(domain, activity.simple_db_name)
        
        unless attributes.empty? 
          activity.on_fail(attributes[:failure_policy]) if attributes.has_key?(:failure_policy)
          activity.on_fail(attributes['failure_policy']) if attributes.has_key?('failure_policy')
          activity.on_success(name: attributes[:next_activity_name], version: attributes[:next_activity_version]) if attributes.has_key?(:next_activity_name)
          activity.on_success(name: attributes['next_activity_name'], version: attributes['next_activity_version']) if attributes.has_key?('next_activity_name')
        end
        registry[[name, version]] = activity
      end
    end

    def sdb_domain_name(domain)
      "swf-#{domain.name}-activities"
    end

    def sdb_domain(domain)
      sdb.domains[sdb_domain_name(domain)]
    end

    def sdb_attributes(domain, sdb_name)
      if item = sdb_domain(domain).items[sdb_name]
        h = item.attributes.to_h
        h.each { |k, v| h[k] = v.first }
      else
        {}
      end
    end

    def self.sdb
      @sdb ||= AWS::SimpleDB.new
    end

    def sdb
      self.class.sdb
    end
  end
end