zactor 0.0.5 → 0.0.6
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.
- data/.rake_tasks~ +19 -0
- data/.yardopts +1 -0
- data/Gemfile +6 -2
- data/Gemfile.lock +66 -16
- data/Guardfile +12 -0
- data/README.md +147 -73
- data/Rakefile +0 -2
- data/VERSION +1 -0
- data/examples/chat/client.rb +88 -0
- data/examples/chat/server.rb +59 -0
- data/examples/ping/inproc.rb +50 -0
- data/lib/zactor.rb +263 -0
- data/lib/zactor/actor_pub.rb +19 -0
- data/lib/zactor/actor_sub.rb +46 -0
- data/lib/zactor/broker.rb +71 -0
- data/lib/zactor/log_subscriber.rb +25 -0
- data/lib/zactor/message.rb +23 -0
- data/lib/zactor/version.rb +3 -0
- data/spec/lib/actor_spec.rb +136 -0
- data/spec/lib/exchange_spec.rb +81 -0
- data/spec/lib/link_spec.rb +67 -0
- data/spec/lib/zactor_spec.rb +40 -0
- data/spec/spec_helper.rb +1 -1
- data/{ruby-interface.gemspec → zactor.gemspec} +13 -7
- metadata +100 -15
- data/lib/ruby-interface/version.rb +0 -3
- data/lib/ruby-interface/yard.rb +0 -8
- data/lib/ruby_interface.rb +0 -71
- data/spec/ruby_interface_spec.rb +0 -127
    
        data/lib/ruby-interface/yard.rb
    DELETED
    
    
    
        data/lib/ruby_interface.rb
    DELETED
    
    | @@ -1,71 +0,0 @@ | |
| 1 | 
            -
            # -*- coding: utf-8 -*-
         | 
| 2 | 
            -
            require 'active_support/core_ext/class/attribute'
         | 
| 3 | 
            -
            require 'active_support/core_ext/string/inflections'
         | 
| 4 | 
            -
             | 
| 5 | 
            -
            module RubyInterface
         | 
| 6 | 
            -
              def interface(method_name, &interface_body)
         | 
| 7 | 
            -
                mod_inst = self.const_set("#{method_name.to_s.camelize}InstanceMethods", Module.new)
         | 
| 8 | 
            -
                mod_inst.module_eval <<-EOT, __FILE__, __LINE__ + 1
         | 
| 9 | 
            -
                  def #{method_name}
         | 
| 10 | 
            -
                    @#{method_name}_interface ||= self.class.#{method_name}_interface.new(self)
         | 
| 11 | 
            -
                  end                                                             
         | 
| 12 | 
            -
                  EOT
         | 
| 13 | 
            -
             | 
| 14 | 
            -
             | 
| 15 | 
            -
                mod_class = self.const_set("#{method_name.to_s.camelize}ClassMethods", Module.new)
         | 
| 16 | 
            -
                mod_class.module_eval <<-EOT, __FILE__, __LINE__ + 1
         | 
| 17 | 
            -
                  def #{method_name}(&blk)
         | 
| 18 | 
            -
                    self.#{method_name}_interface.class_eval(&blk) if blk
         | 
| 19 | 
            -
                    self.#{method_name}_interface
         | 
| 20 | 
            -
                  end
         | 
| 21 | 
            -
             | 
| 22 | 
            -
                  def inherited(subclass)
         | 
| 23 | 
            -
                    new_class = subclass.const_set("#{method_name.to_s.camelize}InterfaceClass", Class.new(self.#{method_name}_interface))
         | 
| 24 | 
            -
                    new_class.interface_base = subclass
         | 
| 25 | 
            -
                    subclass.#{method_name}_interface = new_class
         | 
| 26 | 
            -
                    super
         | 
| 27 | 
            -
                  end
         | 
| 28 | 
            -
                  EOT
         | 
| 29 | 
            -
             | 
| 30 | 
            -
                interface_module = self
         | 
| 31 | 
            -
                
         | 
| 32 | 
            -
                add_interface do |base|
         | 
| 33 | 
            -
                  base.send(:class_attribute, "#{method_name}_interface")
         | 
| 34 | 
            -
                  interface_class = base.const_set("#{method_name.to_s.camelize}InterfaceClass", Class.new(RubyInterface::InterfaceClass))
         | 
| 35 | 
            -
                  interface_class.interface_base = base
         | 
| 36 | 
            -
                  interface_class.class_eval(&interface_body) if interface_body
         | 
| 37 | 
            -
                  base.send("#{method_name}_interface=", interface_class)
         | 
| 38 | 
            -
                  base.extend mod_class
         | 
| 39 | 
            -
                  base.send :include, mod_inst
         | 
| 40 | 
            -
                  base.class_eval(&interface_class.interfaced) if interface_class.interfaced
         | 
| 41 | 
            -
                end
         | 
| 42 | 
            -
             | 
| 43 | 
            -
                interface_module.define_singleton_method(:included) do |base|
         | 
| 44 | 
            -
                  @_deps.each {|d| d.call(base)}
         | 
| 45 | 
            -
                end
         | 
| 46 | 
            -
              end
         | 
| 47 | 
            -
             | 
| 48 | 
            -
              private
         | 
| 49 | 
            -
              def add_interface &block
         | 
| 50 | 
            -
                @_deps ||= []
         | 
| 51 | 
            -
                @_deps << block
         | 
| 52 | 
            -
              end
         | 
| 53 | 
            -
             | 
| 54 | 
            -
              class InterfaceClass
         | 
| 55 | 
            -
                class_attribute :interface_base
         | 
| 56 | 
            -
                attr_accessor :owner      
         | 
| 57 | 
            -
                def initialize(owner)
         | 
| 58 | 
            -
                  @owner = owner
         | 
| 59 | 
            -
                end
         | 
| 60 | 
            -
             | 
| 61 | 
            -
                class << self
         | 
| 62 | 
            -
                  def interfaced(&block)
         | 
| 63 | 
            -
                    if block_given?
         | 
| 64 | 
            -
                      @_interfaced_block = block
         | 
| 65 | 
            -
                    else
         | 
| 66 | 
            -
                      @_interfaced_block
         | 
| 67 | 
            -
                    end
         | 
| 68 | 
            -
                  end
         | 
| 69 | 
            -
                end
         | 
| 70 | 
            -
              end
         | 
| 71 | 
            -
            end
         | 
    
        data/spec/ruby_interface_spec.rb
    DELETED
    
    | @@ -1,127 +0,0 @@ | |
| 1 | 
            -
            # -*- coding: utf-8 -*-
         | 
| 2 | 
            -
            require 'spec_helper'
         | 
| 3 | 
            -
             | 
| 4 | 
            -
            describe RubyInterface do
         | 
| 5 | 
            -
              def make_interface
         | 
| 6 | 
            -
                mod = Module.new
         | 
| 7 | 
            -
                mod.extend(RubyInterface)
         | 
| 8 | 
            -
                mod
         | 
| 9 | 
            -
              end
         | 
| 10 | 
            -
              
         | 
| 11 | 
            -
              describe "Создание интерфейса" do
         | 
| 12 | 
            -
                let(:mod) { make_interface.tap { |v| v.interface(:test) } }
         | 
| 13 | 
            -
                
         | 
| 14 | 
            -
                it "должен вызываться interfaced, если определен" do
         | 
| 15 | 
            -
                  @proc = proc {}
         | 
| 16 | 
            -
                  klass = Class.new
         | 
| 17 | 
            -
                  mod.interface :int do
         | 
| 18 | 
            -
                    interfaced(&@proc)
         | 
| 19 | 
            -
                  end
         | 
| 20 | 
            -
                  mock(klass).class_eval(&@proc)
         | 
| 21 | 
            -
                  mock(klass).class_eval(&@proc)
         | 
| 22 | 
            -
                  klass.send :include, mod
         | 
| 23 | 
            -
                end
         | 
| 24 | 
            -
                
         | 
| 25 | 
            -
                describe "Класс с интерфейсом" do
         | 
| 26 | 
            -
                  subject { klass }
         | 
| 27 | 
            -
                  let(:klass) { Class.new.tap { |v| v.send :include, mod } }
         | 
| 28 | 
            -
                  let(:interface_klass) { klass.test_interface }
         | 
| 29 | 
            -
                  its(:test) { should eq(interface_klass) }
         | 
| 30 | 
            -
                  
         | 
| 31 | 
            -
                  it "может дополнять класс интерфейса" do
         | 
| 32 | 
            -
                    interface_klass.respond_to?(:test).should be_false
         | 
| 33 | 
            -
                    klass.test do
         | 
| 34 | 
            -
                      mattr_accessor :test
         | 
| 35 | 
            -
                    end
         | 
| 36 | 
            -
                    interface_klass.respond_to?(:test).should be_true
         | 
| 37 | 
            -
                  end
         | 
| 38 | 
            -
                  
         | 
| 39 | 
            -
                  it "должен содержать класс интерфейса" do
         | 
| 40 | 
            -
                    klass::TestInterfaceClass.ancestors.should include(RubyInterface::InterfaceClass)
         | 
| 41 | 
            -
                    klass.test_interface.should eq(klass::TestInterfaceClass)
         | 
| 42 | 
            -
                  end
         | 
| 43 | 
            -
                  
         | 
| 44 | 
            -
                  describe "Класс интерфейса" do
         | 
| 45 | 
            -
                    subject { interface_klass }
         | 
| 46 | 
            -
                    its(:interface_base) { should eq(klass) }
         | 
| 47 | 
            -
                    
         | 
| 48 | 
            -
                    describe "Объект с интерфейсом" do
         | 
| 49 | 
            -
                      subject { obj }
         | 
| 50 | 
            -
                      let(:obj) { klass.new }
         | 
| 51 | 
            -
                      its(:test) { should be_kind_of(interface_klass)}
         | 
| 52 | 
            -
                      describe "Объект интерфейса" do
         | 
| 53 | 
            -
                        subject { interface_obj }
         | 
| 54 | 
            -
                        let(:interface_obj) { obj.test }
         | 
| 55 | 
            -
                        its(:owner) { should eq(obj) }
         | 
| 56 | 
            -
                        let(:mod) do 
         | 
| 57 | 
            -
                          make_interface.tap do |v| 
         | 
| 58 | 
            -
                            v.interface(:test) do
         | 
| 59 | 
            -
                              def foo
         | 
| 60 | 
            -
                                "bar"
         | 
| 61 | 
            -
                              end
         | 
| 62 | 
            -
                            end
         | 
| 63 | 
            -
                          end              
         | 
| 64 | 
            -
                        end
         | 
| 65 | 
            -
                        
         | 
| 66 | 
            -
                        it "должен поддерживать методы определенные в интерфейсе" do
         | 
| 67 | 
            -
                          interface_obj.foo.should eq('bar')
         | 
| 68 | 
            -
                        end
         | 
| 69 | 
            -
                      end
         | 
| 70 | 
            -
                    end
         | 
| 71 | 
            -
                    
         | 
| 72 | 
            -
                    describe "при наследовании" do
         | 
| 73 | 
            -
                      let(:klass2) { Class.new(klass) }
         | 
| 74 | 
            -
                      it "должен создавать новый интерфейс-класс, наследуя старый" do
         | 
| 75 | 
            -
                        klass2.test.ancestors.should include(interface_klass)
         | 
| 76 | 
            -
                      end
         | 
| 77 | 
            -
                      it "новый интерфейс-класс должен ссылаться на новый класс" do
         | 
| 78 | 
            -
                        klass2.test.interface_base.should eq(klass2)
         | 
| 79 | 
            -
                      end
         | 
| 80 | 
            -
                    end
         | 
| 81 | 
            -
                  end
         | 
| 82 | 
            -
                  
         | 
| 83 | 
            -
             | 
| 84 | 
            -
                end
         | 
| 85 | 
            -
              end
         | 
| 86 | 
            -
             | 
| 87 | 
            -
              describe "Модуль с двумя интерфейсами" do
         | 
| 88 | 
            -
                before(:each) do
         | 
| 89 | 
            -
                  @mod = Module.new
         | 
| 90 | 
            -
                  @mod.send :extend, RubyInterface
         | 
| 91 | 
            -
                  @mod.interface :first do
         | 
| 92 | 
            -
                    interfaced do
         | 
| 93 | 
            -
                      def baz
         | 
| 94 | 
            -
                        first.foo
         | 
| 95 | 
            -
                      end
         | 
| 96 | 
            -
                    end
         | 
| 97 | 
            -
                  
         | 
| 98 | 
            -
                    def foo
         | 
| 99 | 
            -
                      "bar"
         | 
| 100 | 
            -
                    end
         | 
| 101 | 
            -
                  end
         | 
| 102 | 
            -
             | 
| 103 | 
            -
                  @mod.interface :second do
         | 
| 104 | 
            -
                    interfaced do
         | 
| 105 | 
            -
                      self.second_interface.foo
         | 
| 106 | 
            -
                    end
         | 
| 107 | 
            -
             | 
| 108 | 
            -
                    def self.foo
         | 
| 109 | 
            -
                      "baz"
         | 
| 110 | 
            -
                    end
         | 
| 111 | 
            -
                  end
         | 
| 112 | 
            -
                end
         | 
| 113 | 
            -
             | 
| 114 | 
            -
                it "не должно происходить ошибок при подключении модуля с двумя интерфейсами" do
         | 
| 115 | 
            -
                  b = Class.new
         | 
| 116 | 
            -
                  lambda { b.send :include, @mod }.should_not raise_error
         | 
| 117 | 
            -
                end
         | 
| 118 | 
            -
             | 
| 119 | 
            -
                it "должны появиться интерфейсы с методами" do
         | 
| 120 | 
            -
                  b = Class.new
         | 
| 121 | 
            -
                  b.send :include, @mod
         | 
| 122 | 
            -
                  bb = b.new
         | 
| 123 | 
            -
                  bb.baz.should eq("bar")
         | 
| 124 | 
            -
                  bb.second_interface.foo.should eq("baz")
         | 
| 125 | 
            -
                end
         | 
| 126 | 
            -
              end
         | 
| 127 | 
            -
            end
         |