diff options
| author | Jérémy Zurcher <jeremy@asynk.ch> | 2012-06-13 00:19:12 +0200 | 
|---|---|---|
| committer | Jérémy Zurcher <jeremy@asynk.ch> | 2012-06-13 00:19:12 +0200 | 
| commit | 8724b1424c81e62dd94ad71d39c7f73d7a33f2c8 (patch) | |
| tree | b4e1c17f6823853b0cacd784f7a8095710fd7044 | |
| parent | 74d45762846ea7e6ac09f65fb31672b822f7a349 (diff) | |
| download | edoors-ruby-8724b1424c81e62dd94ad71d39c7f73d7a33f2c8.zip edoors-ruby-8724b1424c81e62dd94ad71d39c7f73d7a33f2c8.tar.gz  | |
iotas release 0.0.5v0.0.5
| -rw-r--r-- | Changelog | 18 | ||||
| -rw-r--r-- | Gemfile.lock | 2 | ||||
| -rw-r--r-- | README.md | 18 | ||||
| -rw-r--r-- | iotas.gemspec | 2 | ||||
| -rw-r--r-- | lib/iotas.rb | 51 | ||||
| -rw-r--r-- | lib/iotas/board.rb | 69 | ||||
| -rw-r--r-- | lib/iotas/door.rb | 94 | ||||
| -rw-r--r-- | lib/iotas/iota.rb | 67 | ||||
| -rw-r--r-- | lib/iotas/link.rb | 70 | ||||
| -rw-r--r-- | lib/iotas/particle.rb | 231 | ||||
| -rw-r--r-- | lib/iotas/room.rb | 190 | ||||
| -rw-r--r-- | lib/iotas/spin.rb | 159 | ||||
| -rw-r--r-- | lib/version.rb | 2 | ||||
| -rw-r--r-- | spec/board_spec.rb | 92 | ||||
| -rw-r--r-- | spec/door_spec.rb | 95 | ||||
| -rw-r--r-- | spec/link_spec.rb | 38 | ||||
| -rw-r--r-- | spec/particle_spec.rb | 257 | ||||
| -rw-r--r-- | spec/room_spec.rb | 315 | ||||
| -rw-r--r-- | spec/spec_helper.rb | 38 | ||||
| -rw-r--r-- | spec/spin_spec.rb | 129 | ||||
| -rw-r--r-- | spec/spot_spec.rb | 26 | ||||
| -rw-r--r-- | test/test_iotas.rb | 168 | 
22 files changed, 11 insertions, 2120 deletions
@@ -1,14 +1,4 @@ -2012-06-02 Jérémy Zurcher <jeremy@asynk.ch> -	* release : 0.0.4 -	* simplify routing algorithm -	* allow direct routing through Door#send_p action parameter - -2012-05-24 Jérémy Zurcher <jeremy@asynk.ch> -	* release : 0.0.3 -	* change routing algo, use Spin@world hash when door is not found locally - -2012-05-18 Jérémy Zurcher <jeremy@asynk.ch> -	* first release : v0.0.2 - -2012-05-01 Jérémy Zurcher <jeremy@asynk.ch> -	* Project creation +2012-06-13 Jérémy Zurcher <jeremy@asynk.ch> +	* this project has been renamed edoors-ruby +	* https://github.com/jeremyz/edoors-ruby +	* https://github.com/jeremyz/edoors C/efl WIP diff --git a/Gemfile.lock b/Gemfile.lock index 9aa3532..755b46c 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,7 +1,7 @@  PATH    remote: .    specs: -    iotas (0.0.1) +    iotas (0.0.5)        json  GEM @@ -2,17 +2,7 @@      by Jérémy Zurcher      http://asynk.ch -## DESCRIPTION: - -* a ruby rewrite of [evenja](http://www.revena.com/evenja) C++ application framework concept - -## FEATURES/PROBLEMS: -[](http://travis-ci.org/jeremyz/iotas) - -## SYNOPSIS: - -* experimental material, we'll see where it leads - -## LICENSE: - -[AGPL](http://www.gnu.org/licenses/agpl-3.0.html) +2012-06-13 +	* this project has been renamed edoors-ruby +	* https://github.com/jeremyz/edoors-ruby +	* https://github.com/jeremyz/edoors C/efl WIP diff --git a/iotas.gemspec b/iotas.gemspec index e9afddf..cbec0da 100644 --- a/iotas.gemspec +++ b/iotas.gemspec @@ -9,7 +9,7 @@ Gem::Specification.new do |s|      s.version = Iotas::VERSION      s.authors = ["Jérémy Zurcher"]      s.email = ["jeremy@asynk.ch"] -    s.homepage = "http://github.com/jeremyz/iotas" +    s.homepage = "http://github.com/jeremyz/edoors-ruby"      s.summary = %q{ruby rewrite of C++ application framework evenja (http://www.revena.com/evenja)}      s.description = %q{Evenja propose a data centric paradigm. A traditional programm composed of many functions      is decomposed into small autonomous modifications applied on the data implemented in different instances of Door base class. diff --git a/lib/iotas.rb b/lib/iotas.rb deleted file mode 100644 index fe837b4..0000000 --- a/lib/iotas.rb +++ /dev/null @@ -1,51 +0,0 @@ -#! /usr/bin/env ruby -# -*- coding: UTF-8 -*- -# -# Copyright 2012 Jérémy Zurcher <jeremy@asynk.ch> -# -# This file is part of iotas. -# -# iotas is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# iotas is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the -# GNU Affero General Public License for more details. -# -# You should have received a copy of the GNU Affero General Public License -# along with iotas.  If not, see <http://www.gnu.org/licenses/>. - -require 'version' -# -module Iotas -    # -    PATH_SEP = '/'.freeze -    LINK_SEP = ','.freeze -    ACT_SEP = '?'.freeze -    # -    ACT_GET = 'get'.freeze -    ACT_ERROR = 'error'.freeze -    # -    SYS_ACT_HIBERNATE = 'hibernate'.freeze -    SYS_ACT_ADD_LINK = 'sys_add_link'.freeze -    # -    FIELD_ERROR_MSG     = 'edoors_error'.freeze -    FIELD_HIBERNATE_PATH= 'hibernate_path'.freeze -    # -    class Exception < ::Exception; end -    # -end -# -require 'json' -require 'iotas/particle' -require 'iotas/iota' -require 'iotas/room' -require 'iotas/spin' -require 'iotas/door' -require 'iotas/board' -require 'iotas/link' -# -# EOF diff --git a/lib/iotas/board.rb b/lib/iotas/board.rb deleted file mode 100644 index 9371354..0000000 --- a/lib/iotas/board.rb +++ /dev/null @@ -1,69 +0,0 @@ -#! /usr/bin/env ruby -# -*- coding: UTF-8 -*- -# -# Copyright 2012 Jérémy Zurcher <jeremy@asynk.ch> -# -# This file is part of iotas. -# -# iotas is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# iotas is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the -# GNU Affero General Public License for more details. -# -# You should have received a copy of the GNU Affero General Public License -# along with iotas.  If not, see <http://www.gnu.org/licenses/>. - -# -module Iotas -    # -    ACT_FOLLOW = 'follow'.freeze -    # -    class Board < Door -        # -        def initialize n, p -            super n, p -            @postponed = {} -        end -        # -        def to_json *a -            { -                'kls'       => self.class.name, -                'name'      => @name, -                'postponed' => @postponed -            }.merge(hibernate!).to_json *a -        end -        # -        def self.json_create o -            raise Iotas::Exception.new "JSON #{o['kls']} != #{self.name}" if o['kls'] != self.name -            board = self.new o['name'], o['parent'] -            o['postponed'].each do |link_value,particle| -                board.process_p Iotas::Particle.json_create(particle.merge!('spin'=>board.spin)) -            end -            board.resume! o -            board -        end -        # -        def process_p p -            @viewer.receive_p p if @viewer -            if p.action!=Iotas::ACT_ERROR -                p2 = @postponed[p.link_value] ||= p -                return if p2==p -                @postponed.delete p.link_value -                p,p2 = p2,p if p.action==Iotas::ACT_FOLLOW -                p.merge! p2 -            end -            @saved = p -            receive_p p -            garbage if not @saved.nil? -        end -        # -    end -    # -end -# -# EOF diff --git a/lib/iotas/door.rb b/lib/iotas/door.rb deleted file mode 100644 index da4f498..0000000 --- a/lib/iotas/door.rb +++ /dev/null @@ -1,94 +0,0 @@ -#! /usr/bin/env ruby -# -*- coding: UTF-8 -*- -# -# Copyright 2012 Jérémy Zurcher <jeremy@asynk.ch> -# -# This file is part of iotas. -# -# iotas is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# iotas is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the -# GNU Affero General Public License for more details. -# -# You should have received a copy of the GNU Affero General Public License -# along with iotas.  If not, see <http://www.gnu.org/licenses/>. - -# -module Iotas -    # -    class Door < Iota -        # -        def initialize n, p -            super n, p -            @saved = nil -        end -        # -        def to_json *a -            { -                'kls'   => self.class.name, -                'name'  => @name -            }.merge(hibernate!).to_json *a -        end -        # -        def self.json_create o -            raise Iotas::Exception.new "JSON #{o['kls']} != #{self.name}" if o['kls'] != self.name -            door = self.new o['name'], o['parent'] -            door.resume! o -            door -        end -        # -        def require_p p_kls -            @spin.require_p p_kls -        end -        # -        def release_p p -            @saved=nil if @saved==p     # particle is released, all is good -            @spin.release_p p -        end -        # -        def garbage -            puts " ! #{path} didn't give back #{@saved}" if @spin.debug_errors -            puts "\t#{@saved.data Iotas::FIELD_ERROR_MSG}" if @saved.action==Iotas::ACT_ERROR -            release_p @saved -            @saved = nil -        end -        # -        def process_p p -            @viewer.receive_p p if @viewer -            @saved = p -            receive_p p -            garbage if not @saved.nil? -        end -        # -        def process_sys_p p -            # nothing todo with it now -            @spin.release_p p -        end -        # -        def _send sys, p, a=nil, d=nil -            p.init! self -            p.set_dst! a, d||self if a -            @saved=nil if @saved==p # particle is sent back the data, all is good -            # daddy will know what to do -            sys ? @parent.send_sys_p(p) : @parent.send_p(p) -        end -        private :_send -        # -        def send_p p, a=nil, d=nil -            _send false, p, a, d -        end -        # -        def send_sys_p p, a=nil, d=nil -            _send true, p, a, d -        end -        # -    end -    # -end -# -# EOF diff --git a/lib/iotas/iota.rb b/lib/iotas/iota.rb deleted file mode 100644 index 133a6dd..0000000 --- a/lib/iotas/iota.rb +++ /dev/null @@ -1,67 +0,0 @@ -#! /usr/bin/env ruby -# -*- coding: UTF-8 -*- -# -# Copyright 2012 Jérémy Zurcher <jeremy@asynk.ch> -# -# This file is part of iotas. -# -# iotas is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# iotas is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the -# GNU Affero General Public License for more details. -# -# You should have received a copy of the GNU Affero General Public License -# along with iotas.  If not, see <http://www.gnu.org/licenses/>. - -# -module Iotas -    # -    class Iota -        # -        def initialize n, p -            raise Iotas::Exception.new "Iota name #{n} is not valid" if n.include? Iotas::PATH_SEP -            @name   = n     # unique in it's room -            @parent = p     # single direct parent -            @viewer = nil   # particle going through that position will be sent there readonly -            @path = ( @parent ? @parent.path+Iotas::PATH_SEP : '') + @name -            @spin = ( @parent ? @parent.spin : self ) -            if @parent -                @parent.add_iota self -                @spin.add_to_world self if @spin.is_a? Iotas::Spin -            end -        end -        # -        attr_reader :name, :path, :spin -        attr_accessor :viewer, :parent -        # -        def start! -            # override this to initialize your object on system start -        end -        # -        def stop! -            # override this to initialize your object on system stop -        end -        # -        def hibernate! -            # override this to save your object state on hibernate -            {} -        end -        # -        def resume! o -            # override this to restore your object state on resume -        end -        # -        def receive_p p -            raise NoMethodError.new "receive_p(p) must be overridden" -        end -        # -    end -    # -end -# -# EOF diff --git a/lib/iotas/link.rb b/lib/iotas/link.rb deleted file mode 100644 index 073ca1f..0000000 --- a/lib/iotas/link.rb +++ /dev/null @@ -1,70 +0,0 @@ -#! /usr/bin/env ruby -# -*- coding: UTF-8 -*- -# -# Copyright 2012 Jérémy Zurcher <jeremy@asynk.ch> -# -# This file is part of iotas. -# -# iotas is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# iotas is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the -# GNU Affero General Public License for more details. -# -# You should have received a copy of the GNU Affero General Public License -# along with iotas.  If not, see <http://www.gnu.org/licenses/>. - -# -module Iotas -    # -    LNK_SRC     = 'edoors_lnk_src'.freeze -    LNK_DSTS    = 'edoors_lnk_dsts'.freeze -    LNK_FIELDS  = 'edoors_lnk_fields'.freeze -    LNK_CONDF   = 'edoors_lnk_condf'.freeze -    LNK_CONDV   = 'edoors_lnk_condv'.freeze -    # -    class Link -        # -        def initialize src, dsts, fields=nil, cond_fields=nil, cond_value=nil -            @src = src                      # link source name -            @dsts = dsts                    # , separated destinations to apply to the particle on linking success -            @fields = fields                # , separated fields to apply to the particle on linking success -            @cond_fields = cond_fields      # , separated fields used to generate the link value with particle payload -            @cond_value = cond_value        # value which will be compared to the particle link value to link or not -            @door = nil                     # pointer to the source -        end -        # -        def to_json *a -            { -                'kls'           => self.class.name, -                'src'           => @src, -                'dsts'          => @dsts, -                'fields'        => @fields, -                'cond_fields'   => @cond_fields, -                'cond_value'    => @cond_value -            }.to_json *a -        end -        # -        def self.json_create o -            raise Iotas::Exception.new "JSON #{o['kls']} != #{self.name}" if o['kls'] != self.name -            self.new o['src'], o['dsts'], o['fields'], o['cond_fields'], o['cond_value'] -        end -        # -        def self.from_particle_data p -            Iotas::Link.new(p.get_data(Iotas::LNK_SRC), p.get_data(Iotas::LNK_DSTS), -                                p.get_data(Iotas::LNK_FIELDS), p.get_data(Iotas::LNK_CONDF), -                                p.get_data(Iotas::LNK_CONDV)) -        end -        # -        attr_accessor :door -        attr_reader :src, :dsts, :fields, :cond_fields, :cond_value -        # -    end -    # -end -# -# EOF diff --git a/lib/iotas/particle.rb b/lib/iotas/particle.rb deleted file mode 100644 index 79cebfb..0000000 --- a/lib/iotas/particle.rb +++ /dev/null @@ -1,231 +0,0 @@ -#! /usr/bin/env ruby -# -*- coding: UTF-8 -*- -# -# Copyright 2012 Jérémy Zurcher <jeremy@asynk.ch> -# -# This file is part of iotas. -# -# iotas is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# iotas is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the -# GNU Affero General Public License for more details. -# -# You should have received a copy of the GNU Affero General Public License -# along with iotas.  If not, see <http://www.gnu.org/licenses/>. - -require 'time' -# -module Iotas -    # -    class Particle -        # -        def initialize o={} -            @ts = Time.now      # creation time -            @src = nil          # Iota where it's originated from -            @dst = nil          # Iota where it's heading to -            @room = nil         # Room path part of the current destination -            @door = nil         # Door path part of the current destination -            @action = nil       # action part of the current destination -            @link_value = nil   # the value computed with the link_fields values extracted from the payload -                                # used for pearing Particles in Boards and linking in routing process -            @dsts = []          # fifo of path?action strings where to travel to -            @link_fields = []   # the fields used to generate the link value -            @payload = {}       # the actual data carried by this particle -            @merged = []        # list of merged particles -            # -            if not o.empty? -                @ts = Time.parse(o['ts']) if o['ts'] -                @room = o['room'] -                @door = o['door'] -                @action = o['action'] -                @payload = o['payload']||{} -                @src = o['spin'].search_down o['src'] if o['src'] -                @dst = o['spin'].search_down o['dst'] if o['dst'] -                o['dsts'].each do |dst| add_dsts dst end if o['dsts'] -                set_link_fields *o['link_fields'] if o['link_fields'] -                o['merged'].each do |particle| -                    merge! Particle.json_create(particle.merge!('spin'=>o['spin'])) -                end if o['merged'] -            end -        end -        # -        def to_json *a -            { -                'kls'           => self.class.name, -                'ts'            => @ts, -                'src'           => (@src ? @src.path : nil ), -                'dst'           => (@dst ? @dst.path : nil ), -                'room'          => @room, -                'door'          => @door, -                'action'        => @action, -                'dsts'          => @dsts, -                'link_fields'   => @link_fields, -                'payload'       => @payload, -                'merged'        => @merged -            }.to_json *a -        end -        # -        def self.json_create o -            raise Iotas::Exception.new "JSON #{o['kls']} != #{self.name}" if o['kls'] != self.name -            self.new o -        end -        # -        # called when released -        def reset! -            @ts = @src = @dst = @room = @door = @action = @link_value = nil -            @dsts.clear -            @link_fields.clear -            @payload.clear -            @merged.clear -        end -        # -        # called when sent -        def init! src -            @src = src -            @ts = Time.now -            @dst = @room = @door = @action = nil -        end -        # -        attr_reader :ts, :src, :dst, :room, :door, :action, :link_value, :payload -        # -        # routing -        # -        def next_dst -            @dsts[0] -        end -        # -        def clear_dsts! -            @dsts.clear -        end -        # -        def add_dsts dsts -            dsts.split(Iotas::LINK_SEP).each do |dst| -                if dst.empty? or dst[0]==Iotas::PATH_SEP or dst[0]==Iotas::PATH_SEP  or dst=~/\/\?/\ -                    or dst=~/\/{2,}/ or dst=~/\s+/ or dst==Iotas::ACT_SEP -                    raise Iotas::Exception.new "destination #{dst} is not acceptable" -                end -                @dsts << dst -            end -        end -        # -        def add_dst a, d='' -            add_dsts d+Iotas::ACT_SEP+a -        end -        # -        def set_dst! a, d -            @action = a -            if d.is_a? Iotas::Iota -                @dst = d -            else -                _split_path! d -            end -        end -        # -        def split_dst! -            @dst = @room = @door = @action = nil -            return if (n = next_dst).nil? -            p, @action = n.split Iotas::ACT_SEP -            _split_path! p -        end -        # -        def _split_path! p -            i = p.rindex Iotas::PATH_SEP -            if i.nil? -                @room = nil -                @door = p -            else -                @room = p[0..i-1] -                @door = p[i+1..-1] -            end -            @door = nil if @door.empty? -        end -        private :_split_path! -        # -        def dst_routed! dst -            @dst = dst -            @dsts.shift -        end -        # -        def error! e, dst=nil -            @action = Iotas::ACT_ERROR -            @dst = dst||@src -            @payload[Iotas::FIELD_ERROR_MSG]=e -        end -        # -        def apply_link! lnk -            init! lnk.door -            clear_dsts! -            add_dsts lnk.dsts -            set_link_fields lnk.fields -        end -        # -        # data manipulation -        # -        def []=  k, v -            @payload[k]=v -            compute_link_value! if @link_fields.include? k -        end -        # -        def set_data k, v -            @payload[k] = v -            compute_link_value! if @link_fields.include? k -        end -        # -        def []  k -            @payload[k] -        end -        # -        def get_data k -            @payload[k] -        end -        alias :data :get_data -        # -        def clone_data p -            @payload = p.payload.clone -        end -        # -        # link value and fields -        # -        def set_link_fields *args -            @link_fields.clear if not @link_fields.empty? -            args.compact! -            args.each do |lfs| -                lfs.split(',').each do |lf| -                    @link_fields << lf -                end -            end -            compute_link_value! -        end -        # -        def compute_link_value! -            @link_value = @link_fields.inject('') { |s,lf| s+=@payload[lf].to_s if @payload[lf]; s } -        end -        # -        # merge particles management -        # -        def merge! p -            @merged << p -        end -        # -        def merged i -            @merged[i] -        end -        # -        def merged_shift -            @merged.shift -        end -        # -        def clear_merged! -            @merged.clear -        end -        # -    end -    # -end -# -# EOF diff --git a/lib/iotas/room.rb b/lib/iotas/room.rb deleted file mode 100644 index 7ffc5f4..0000000 --- a/lib/iotas/room.rb +++ /dev/null @@ -1,190 +0,0 @@ -#! /usr/bin/env ruby -# -*- coding: UTF-8 -*- -# -# Copyright 2012 Jérémy Zurcher <jeremy@asynk.ch> -# -# This file is part of iotas. -# -# iotas is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# iotas is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the -# GNU Affero General Public License for more details. -# -# You should have received a copy of the GNU Affero General Public License -# along with iotas.  If not, see <http://www.gnu.org/licenses/>. - -# -module Iotas -    # -    ERROR_ROUTE_NS      = 'routing error: no source'.freeze -    ERROR_ROUTE_RRWD    = 'routing error: right room, wrong door'.freeze -    ERROR_ROUTE_DNE     = 'routing error: does not exists'.freeze -    ERROR_ROUTE_NDNL    = 'routing error: no destination, no link'.freeze -    ERROR_ROUTE_SND     = 'routing error: system no destination'.freeze -    # -    class Room < Iota -        # -        def initialize n, p -            super n, p -            @iotas = {} -            @links = {} -        end -        # -        def to_json *a -            { -                'kls'   => self.class.name, -                'name'  => @name, -                'iotas' => @iotas, -                'links' => @links -            }.to_json *a -        end -        # -        def self.json_create o -            raise Iotas::Exception.new "JSON #{o['kls']} != #{self.name}" if o['kls'] != self.name -            room = self.new o['name'], o['parent'] -            o['iotas'].each do |name,iota| -                eval( iota['kls'] ).json_create(iota.merge!('parent'=>room)) -            end -            o['links'].each do |src,links| -                links.each do |link| -                    room.add_link Iotas::Link.json_create(link) -                end -            end -            room -        end -        # -        def add_iota s -            raise Iotas::Exception.new "Iota #{s.name} already has #{s.parent.name} as parent" if not s.parent.nil? and s.parent!=self -            raise Iotas::Exception.new "Iota #{s.name} already exists in #{path}" if @iotas.has_key? s.name -            s.parent = self if s.parent.nil? -            @iotas[s.name]=s -        end -        # -        def add_link l -            l.door = @iotas[l.src] -            raise Iotas::Exception.new "Link source #{l.src} does not exist in #{path}" if l.door.nil? -            (@links[l.src] ||= [])<< l -        end -        # -        def start! -            puts " * start #{path}" if @spin.debug_routing -            @iotas.values.each do |iota| iota.start! end -        end -        # -        def stop! -            puts " * stop #{path}" if @spin.debug_routing -            @iotas.values.each do |iota| iota.stop! end -        end -        # -        def search_down spath -            return self if spath==path -            return nil if (spath=~/^#{path}\/(\w+)\/?/)!=0 -            if iota = @iotas[$1] -                return iota if iota.path==spath    # needed as Door doesn't implement #search_down -                return iota.search_down spath -            end -            nil -        end -        # -        def _try_links p -            puts "   -> try_links ..." if @spin.debug_routing -            links = @links[p.src.name] -            return false if links.nil? -            pending_link = nil -            apply_link = false -            links.each do |link| -                apply_link = link.cond_fields.nil?  # unconditional link -                p.set_link_fields link.cond_fields if not apply_link -                if apply_link or (p.link_value==link.cond_value) -                    # link matches ! -                    if pending_link -                        p2 = @spin.require_p p.class -                        p2.clone_data p -                        p2.apply_link! link -                        send_p p2 -                    end -                    pending_link = link -                end -            end -            if pending_link -                p.apply_link! pending_link -                _send false, p -            end -            pending_link -        end -        private :_try_links -        # -        def _route p -            if p.room.nil? or p.room==path -                if door = @iotas[p.door] -                    p.dst_routed! door -                else -                    p.error! Iotas::ERROR_ROUTE_RRWD -                end -            elsif door = @spin.search_world(p.room+Iotas::PATH_SEP+p.door) -                p.dst_routed! door -            else -                p.error! Iotas::ERROR_ROUTE_DNE -            end -        end -        private :_route -        # -        def _send sys, p -            if not sys and p.src.nil? -                # do not route non system orphan particles !! -                p.error! Iotas::ERROR_ROUTE_NS, @spin -            elsif p.dst -                # direct routing through pointer -                return -            elsif p.door -                # direct routing through path -                _route p -            elsif p.next_dst -                p.split_dst! -                if p.door -                    _route p -                elsif not sys -                    # boomerang -                    p.dst_routed! p.src -                elsif p.action -                    p.dst_routed! @spin -                end -            elsif not sys and _try_links p -                return -            else -                p.error!( sys ? Iotas::ERROR_ROUTE_SND : Iotas::ERROR_ROUTE_NDNL) -            end -        end -        private :_send -        # -        def send_p p -            puts " * send_p #{(p.next_dst.nil? ? 'no dst' : p.next_dst)} ..." if @spin.debug_routing -            _send false, p -            puts "   -> #{p.dst.path}#{Iotas::ACT_SEP}#{p.action}" if @spin.debug_routing -            @spin.post_p p -        end -        # -        def send_sys_p p -            puts " * send_sys_p #{(p.next_dst.nil? ? 'no dst' : p.next_dst)} ..." if @spin.debug_routing -            _send true, p -            puts "   -> #{p.dst.path}#{Iotas::ACT_SEP}#{p.action}" if @spin.debug_routing -            @spin.post_sys_p p -        end -        # -        def process_sys_p p -            if p.action==Iotas::SYS_ACT_ADD_LINK -                add_link Iotas::Link.from_particle_data p -            end -            @spin.release_p p -        end -        # -    end -    # -end -# -# EOF diff --git a/lib/iotas/spin.rb b/lib/iotas/spin.rb deleted file mode 100644 index 1f3c180..0000000 --- a/lib/iotas/spin.rb +++ /dev/null @@ -1,159 +0,0 @@ -#! /usr/bin/env ruby -# -*- coding: UTF-8 -*- -# -# Copyright 2012 Jérémy Zurcher <jeremy@asynk.ch> -# -# This file is part of iotas. -# -# iotas is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# iotas is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the -# GNU Affero General Public License for more details. -# -# You should have received a copy of the GNU Affero General Public License -# along with iotas.  If not, see <http://www.gnu.org/licenses/>. - -# -module Iotas -    # -    class Spin < Room -        # -        def initialize n, o={} -            super n, nil -            # -            @pool       = {}    # per particle class free list -            @world      = {}    # global iotas index -            @sys_fifo   = []    # system particles fifo list -            @app_fifo   = []    # application particles fifo list -            # -            @run = false -            @hibernation    = o['hibernation']||false -            @hibernate_path = 'iotas-hibernate-'+n+'.json' -            @debug_errors   = o[:debug_errors]||o['debug_errors']||false -            @debug_routing  = o[:debug_routing]||o['debug_routing']||false -            # -            if not o.empty? -                o['iotas'].each do |name,iota| -                    Iotas::Room.json_create(iota.merge!('parent'=>self)) -                end if o['iotas'] -                o['app_fifo'].each do |particle| -                    @app_fifo << Iotas::Particle.json_create(particle.merge!('spin'=>self)) -                end if o['app_fifo'] -                o['sys_fifo'].each do |particle| -                    @sys_fifo <<  Iotas::Particle.json_create(particle.merge!('spin'=>self)) -                end if o['sys_fifo'] -            end -        end -        # -        attr_accessor :run, :hibernate_path, :debug_errors, :debug_routing -        # -        def to_json *a -            { -                'kls'           => self.class.name, -                'timestamp'     => Time.now, -                'name'          => @name, -                'hibernation'   => @hibernation, -                'iotas'         => @iotas, -                'sys_fifo'      => @sys_fifo, -                'app_fifo'      => @app_fifo, -                'debug_errors'  => @debug_errors, -                'debug_routing' => @debug_routing -            }.to_json(*a) -        end -        # -        def self.json_create o -            raise Iotas::Exception.new "JSON #{o['kls']} != #{self.name}" if o['kls'] != self.name -            self.new o['name'], o -        end -        # -        def add_to_world iota -            @world[iota.path] = iota -        end -        # -        def search_world path -            @world[path] -        end -        # -        def clear! -            @iotas.clear -            @pool.clear -            @sys_fifo.clear -            @app_fifo.clear -        end -        # -        # -        def release_p p -            # hope there is no circular loop -            while p2=p.merged_shift -                release_p p2 -            end -            p.reset! -            ( @pool[p.class] ||= [] ) << p -        end -        # -        def require_p p_kls -            l = @pool[p_kls] -            return p_kls.new if l.nil? -            p = l.pop -            return p_kls.new if p.nil? -            p -        end -        # -        def post_p p -            @app_fifo << p -        end -        # -        def post_sys_p p -            @sys_fifo << p -        end -        # -        def process_sys_p p -            if p.action==Iotas::SYS_ACT_HIBERNATE -                stop! -                hibernate! p[FIELD_HIBERNATE_PATH] -            else -                super p -            end -        end -        # -        def spin! -            @iotas.values.each do |iota| iota.start! end unless @hibernation -            @run = true -            @hibernation = false -            while @run and (@sys_fifo.length>0 or @app_fifo.length>0) -                while @run and @sys_fifo.length>0 -                    p = @sys_fifo.shift -                    p.dst.process_sys_p p -                end -                while @run and @app_fifo.length>0 -                    p = @app_fifo.shift -                    p.dst.process_p p -                    break -                end -            end -            @iotas.values.each do |iota| iota.stop! end unless @hibernation -        end -        # -        def stop! -            @run=false -        end -        # -        def hibernate! path=nil -            @hibernation = true -            File.open(path||@hibernate_path,'w') do |f| f << JSON.pretty_generate(self) end -        end -        # -        def self.resume! path -            self.json_create JSON.load File.open(path,'r') { |f| f.read } -        end -        # -    end -    # -end -# -# EOF diff --git a/lib/version.rb b/lib/version.rb index b4567e2..345e370 100644 --- a/lib/version.rb +++ b/lib/version.rb @@ -21,7 +21,7 @@  #  module Iotas      # -    VERSION = "0.0.4" +    VERSION = "0.0.5"      #  end  # diff --git a/spec/board_spec.rb b/spec/board_spec.rb deleted file mode 100644 index 0499778..0000000 --- a/spec/board_spec.rb +++ /dev/null @@ -1,92 +0,0 @@ -#! /usr/bin/env ruby -# -*- coding: UTF-8 -*- -# - -require 'spec_helper' -# -describe Iotas::Board do -    # -    before (:all) do -        @spin = Iotas::Spin.new 'dom0' -    end -    # -    before(:each) do -        @spin.clear! -    end -    # -    it "require_p release_p" do -        board = Iotas::Board.new 'hell', @spin -        p0 = board.require_p Iotas::Particle -        p1 = board.require_p Iotas::Particle -        (p0===p1).should be_false -        board.release_p p0 -        p2 = board.require_p Iotas::Particle -        (p0===p2).should be_true -    end -    # -    it "particle wait and merge" do -        p0 = Iotas::Particle.new -        p0['k0'] = 'v0' -        p0['k1'] = 'neither' -        p0['k2'] = 'v2' -        p0.set_link_fields 'k0,k2' -        p0.link_value.should eql 'v0v2' -        p1 = Iotas::Particle.new -        p1['k0'] = 'v0' -        p1['k1'] = 'nore' -        p1['k2'] = 'v2' -        p1.set_link_fields 'k0,k2' -        p1.link_value.should eql 'v0v2' -        P0 = p0 -        P1 = p1 -        class Board0 < Iotas::Board -            attr_reader :ok, :follow -            def receive_p p -                @ok = false -                case p.action -                when Iotas::ACT_FOLLOW -                    @follow = true -                    @ok = (p===P0 and p.merged(0)===P1) -                else -                    @follow = false -                    @ok = (p===P1 and p.merged(0)===P0) -                end -            end -        end -        b0 = Board0.new 'door0', @spin -        b0.process_p p0 -        p0.merged(0).should be_nil -        b0.process_p p1 -        b0.ok.should be_true -        b0.follow.should be_false -        # -        p1.merged_shift -        # -        b0.process_p p0 -        p0.merged(0).should be_nil -        # need to set it to p0 too, so case in Board0 is ok -        p0.add_dst Iotas::ACT_FOLLOW -        p0.split_dst! -        p1.add_dst Iotas::ACT_FOLLOW -        p1.split_dst! -        b0.process_p p1 -        b0.ok.should be_true -        b0.follow.should be_true -    end -    # -    it "board->json->board" do -        board = Iotas::Board.new 'hell', @spin -        p0 = Iotas::Particle.new -        p1 = Iotas::Particle.new -        p1['v0']=0 -        p1.set_link_fields 'v0' -        board.process_p p0 -        board.process_p p1 -        hell = Iotas::Board.json_create( JSON.load( JSON.generate(board) ) ) -        board.name.should eql hell.name -        JSON.generate(board).should eql JSON.generate(hell) -    end -    # -end -# -# EOF diff --git a/spec/door_spec.rb b/spec/door_spec.rb deleted file mode 100644 index 43b98a1..0000000 --- a/spec/door_spec.rb +++ /dev/null @@ -1,95 +0,0 @@ -#! /usr/bin/env ruby -# -*- coding: UTF-8 -*- -# - -require 'spec_helper' -# -describe Iotas::Door do -    # -    before (:all) do -        @spin = Iotas::Spin.new 'dom0' -    end -    # -    before(:each) do -        @spin.clear! -    end -    # -    it "require_p release_p" do -        door = Iotas::Door.new 'hell', @spin -        p0 = door.require_p Iotas::Particle -        p1 = door.require_p Iotas::Particle -        (p0===p1).should be_false -        door.release_p p0 -        p2 = door.require_p Iotas::Particle -        (p0===p2).should be_true -    end -    # -    it "NoMethodError when receive_p not overridden" do -        class Door0 < Iotas::Door -        end -        f = Fake.new 'fake', @spin -        d0 = Door0.new 'door0', f -        p0 = d0.require_p Iotas::Particle -        lambda { d0.process_p p0 }.should raise_error(NoMethodError) -    end -    # -    it "send_p, send_sys_p, release_p and release of lost particles" do -        class Door0 < Iotas::Door -            def receive_p p -                case p.action -                when 'RELEASE' -                    release_p p -                when 'SEND' -                    send_p p -                when 'SEND_SYS' -                    send_sys_p p -                else -                    # lost!! -                end -            end -        end -        f = Fake.new 'fake', @spin -        d0 = Door0.new 'door0', f -        p0 = d0.require_p Iotas::Particle -        # -        p0.add_dst 'SEND' -        p0.split_dst! -        d0.process_p p0 -        f.p.should eql p0 -        p0.clear_dsts! -        # -        p0.add_dst 'SEND_SYS' -        p0.split_dst! -        d0.process_p p0 -        f.sp.should eql p0 -        p0.clear_dsts! -        # -        p0.add_dst 'RELEASE' -        p0.split_dst! -        d0.process_p p0 -        p1 = d0.require_p Iotas::Particle -        p1.should be p0 -        p0.clear_dsts! -        # -        p0.add_dst 'LOST' -        p0.split_dst! -        d0.process_p p0 -        p1 = d0.require_p Iotas::Particle -        p1.should be p0 -        p0.clear_dsts! -        # -        d0.process_sys_p p0 -        p1 = @spin.require_p Iotas::Particle -        p1.should be p0 -    end -    # -    it "door->json->door" do -        door = Iotas::Door.new 'hell', @spin -        hell = Iotas::Door.json_create( JSON.load( JSON.generate(door) ) ) -        door.name.should eql hell.name -        JSON.generate(door).should eql JSON.generate(hell) -    end -    # -end -# -# EOF diff --git a/spec/link_spec.rb b/spec/link_spec.rb deleted file mode 100644 index 6120677..0000000 --- a/spec/link_spec.rb +++ /dev/null @@ -1,38 +0,0 @@ -#! /usr/bin/env ruby -# -*- coding: UTF-8 -*- -# - -require 'spec_helper' -# -describe Iotas::Link do -    # -    it "from particle data" do -        @spin = Iotas::Spin.new 'dom0' -        p = @spin.require_p Iotas::Particle -        p.set_data Iotas::LNK_SRC, 'input1' -        p.set_data Iotas::LNK_DSTS, 'concat1?follow,output1' -        p.set_data Iotas::LNK_FIELDS, 'f0,f2' -        p.set_data Iotas::LNK_CONDF, 'f0,f1,f2' -        p.set_data Iotas::LNK_CONDV, 'v0v1v2' -        lnk = Iotas::Link.from_particle_data p -        lnk.src.should eql 'input1' -        lnk.dsts.should eql 'concat1?follow,output1' -        lnk.fields.should eql 'f0,f2' -        lnk.cond_fields.should eql 'f0,f1,f2' -        lnk.cond_value.should eql 'v0v1v2' -    end -    # -    it "link->json->link" do -        link = Iotas::Link.new  'input1', 'concat1?follow,output1', 'f0,f2', 'f0,f1,f2', 'v0v1v2' -        lnk = Iotas::Link.json_create( JSON.load( JSON.generate(link) ) ) -        link.src.should eql lnk.src -        link.dsts.should eql lnk.dsts -        link.fields.should eql lnk.fields -        link.cond_fields.should eql lnk.cond_fields -        link.cond_value.should eql lnk.cond_value -        JSON.generate(link).should eql JSON.generate(lnk) -    end -    # -end -# -# EOF diff --git a/spec/particle_spec.rb b/spec/particle_spec.rb deleted file mode 100644 index a10a9f9..0000000 --- a/spec/particle_spec.rb +++ /dev/null @@ -1,257 +0,0 @@ -#! /usr/bin/env ruby -# -*- coding: UTF-8 -*- -# - -require 'spec_helper' -# -describe Iotas::Particle do -    # -    it "payload manipulation" do -        p = Iotas::Particle.new -        # -        p['key']=666 -        p['key'].should eql 666 -        p.data('key').should eql 666 -        p.get_data('key').should eql 666 -        # -        p.set_data 'key', 69 -        p['key'].should eql 69 -        p.data('key').should eql 69 -        p.get_data('key').should eql 69 -    end -    # -    it "payload clone" do -        p = Iotas::Particle.new -        p['k00'] = { 'k0'=>0,'k1'=>1} -        p['k11'] = [1,2,3] -        o = Iotas::Particle.new -        o.clone_data p -        p['k00']=nil -        p['k00'].should be_nil -        o['k00']['k0'].should eql 0 -        o['k00']['k1'].should eql 1 -        p['k11']=nil -        p['k11'].should be_nil -        o['k11'][0].should eql 1 -        o['k11'][1].should eql 2 -        o['k11'][2].should eql 3 -    end -    # -    it "particle merge" do -        p = Iotas::Particle.new -        q = Iotas::Particle.new -        o = Iotas::Particle.new -        p.merge! q -        p.merge! o -        p.merged(0).should be q -        p.merged(1).should be o -        p.merged(2).should be_nil -        p.merged_shift.should be q -        p.merged(0).should be o -        p.merged(1).should be_nil -        p.merged_shift.should be o -        p.merged(0).should be_nil -        p.merge! q -        p.merge! o -        p.merged(0).should be q -        p.merged(1).should be o -        p.clear_merged! -        p.merged(0).should be_nil -    end -    # -    it "routing: add_dsts, next_dst and dst_routed!" do -        p = Iotas::Particle.new -        d0 = Iotas::Door.new 'door0', nil -        d1 = Iotas::Door.new 'door1', nil -        p.dst.should be_nil -        p.next_dst.should be_nil -        p.add_dsts 'some?where,room0/room1/door?action,room/door,door' -        p.next_dst.should eql 'some?where' -        p.dst_routed! d0 -        p.dst.should be d0 -        p.next_dst.should eql 'room0/room1/door?action' -        p.dst_routed! d1 -        p.dst.should be d1 -        p.next_dst.should eql 'room/door' -        p.dst_routed! nil -        p.dst.should be_nil -        p.next_dst.should eql 'door' -    end -    # -    it "wrong path should raise exeption" do -        p = Iotas::Particle.new -        lambda { p.add_dst 'action', '/room' }.should raise_error(Iotas::Exception) -        lambda { p.add_dst 'action', 'room/' }.should raise_error(Iotas::Exception) -        lambda { p.add_dst '', 'room/' }.should raise_error(Iotas::Exception) -        lambda { p.add_dst 'action', 'room//door' }.should raise_error(Iotas::Exception) -        lambda { p.add_dst ' ' }.should raise_error(Iotas::Exception) -        lambda { p.add_dst ' ', '' }.should raise_error(Iotas::Exception) -        lambda { p.add_dst 'f f' }.should raise_error(Iotas::Exception) -        lambda { p.add_dst '', ' d' }.should raise_error(Iotas::Exception) -        lambda { p.add_dst '' }.should raise_error(Iotas::Exception) -        lambda { p.add_dst '', '' }.should raise_error(Iotas::Exception) -        lambda { p.add_dst nil }.should raise_error(TypeError) -        lambda { p.add_dst 'action', nil }.should raise_error(NoMethodError) -    end -    # -    it "routing: set_dst!" do -        p = Iotas::Particle.new -        d0 = Iotas::Door.new 'door0', nil -        # -        p.set_dst! 'action', d0 -        p.action.should eql 'action' -        p.dst.should be d0 -    end -    # -    it "routing: add_dst and split_dst!" do -        p = Iotas::Particle.new -        d0 = Iotas::Door.new 'door0', nil -        # -        p.split_dst! -        p.room.should be_nil -        p.door.should be_nil -        p.action.should be_nil -        # -        p.add_dst 'action', 'room0/room1/door' -        p.split_dst! -        p.room.should eql 'room0/room1' -        p.door.should eql 'door' -        p.action.should eql 'action' -        p.clear_dsts! -        # -        p.add_dst 'action', 'room/door' -        p.split_dst! -        p.room.should eql 'room' -        p.door.should eql 'door' -        p.action.should eql 'action' -        p.clear_dsts! -        # -        p.add_dst 'action', '' -        p.split_dst! -        p.room.should be_nil -        p.door.should be_nil -        p.action.should eql 'action' -        p.clear_dsts! -        # -        p.add_dst 'action' -        p.split_dst! -        p.room.should be_nil -        p.door.should be_nil -        p.action.should eql 'action' -        p.clear_dsts! -        # -        p.add_dsts 'door?action,?action' -        p.split_dst! -        p.room.should be_nil -        p.door.should eql 'door' -        p.action.should eql 'action' -        # -        p.dst_routed! d0 -        # -        p.dst.should be d0 -        p.split_dst! -        p.room.should be_nil -        p.door.should be_nil -        p.action.should eql 'action' -        # -    end -    # -    it "routing: error!" do -        p = Iotas::Particle.new -        d = Iotas::Door.new 'door', nil -        p.init! d -        p.add_dsts 'door?action,?action' -        p.next_dst.should eql 'door?action' -        p.error! 'err_msg' -        p[Iotas::FIELD_ERROR_MSG].should eql 'err_msg' -        p.action.should eq Iotas::ACT_ERROR -        p.dst.should be d -    end -    # -    it "link fields and link value" do -        p = Iotas::Particle.new -        p['k0'] = 'v0' -        p['k1'] = 'v1' -        p['k2'] = 'v2' -        p.set_link_fields 'k0,k2' -        p.link_value.should eql 'v0v2' -        p.set_link_fields 'k1,k0' -        p.link_value.should eql 'v1v0' -        p['k0']='vx' -        p.link_value.should eql 'v1vx' -    end -    # -    it "apply_link!" do -        p = Iotas::Particle.new -        p['k0'] = 'v0' -        p['k1'] = 'v1' -        p['k2'] = 'v2' -        p.set_link_fields 'k0,k2' -        p.add_dsts 'door?action,?action' -        p.src.should be_nil -        p.link_value.should eql 'v0v2' -        p.next_dst.should eql 'door?action' -        lnk = Iotas::Link.new('door0', 'door1?get,door2', 'k1', 'f0,f1', 'v0v1') -        f = Fake.new 'fake', nil -        lnk.door = f -        p.apply_link! lnk -        p.src.should be f -        p.next_dst.should eql 'door1?get' -        p.link_value.should eql 'v1' -    end -    # -    it "particle->json->particle" do -        s0 = Iotas::Spin.new 'top' -        s1 = Iotas::Room.new 'room0', s0 -        s2 = Iotas::Room.new 'room1', s1 -        s3 = Iotas::Door.new 'doora', s2 -        s4 = Iotas::Door.new 'doorb', s1 -        p0 = Iotas::Particle.new -        p0['k0'] = 'v0' -        p0['k1'] = 'v1' -        p0['k2'] = 'v2' -        p0.init! s3 -        p0.set_link_fields 'k0,k2' -        p0.add_dsts 'room0/room1/room2/doorX?myaction,door?action,?action' -        p0.split_dst! -        p1 = Iotas::Particle.new -        p1['k3'] = 'v6' -        p1['k4'] = 'v7' -        p1['k5'] = 'v8' -        p1.init! s3 -        p1.dst_routed! s4 -        p1.set_link_fields 'k5,k4,k3' -        p1.add_dsts 'room0/room1/door?action,output?action' -        p0.merge! p1 -        o = JSON.load( JSON.generate(p0) ) -        o['spin'] = s0 -        px = Iotas::Particle.json_create( o ) -        ((px.ts-p0.ts)<0.5).should be_true -        px.src.should be s3 -        px.dst.should be_nil -        px.room.should eql 'room0/room1/room2' -        px.door.should eql 'doorX' -        px.action.should eql 'myaction' -        px.next_dst.should eql 'room0/room1/room2/doorX?myaction' -        px.link_value.should eql 'v0v2' -        px['k0'].should eql 'v0' -        px['k1'].should eql 'v1' -        px['k2'].should eql 'v2' -        py = px.merged(0) -        ((py.ts-p1.ts)<0.5).should be_true -        py.src.should be s3 -        py.dst.should be s4 -        py.room.should be_nil -        py.door.should be_nil -        py.action.should be_nil -        py.next_dst.should eql 'room0/room1/door?action' -        py.link_value.should eql 'v8v7v6' -        py['k3'].should eql 'v6' -        py['k4'].should eql 'v7' -        py['k5'].should eql 'v8' -        JSON.generate(p0).should eql JSON.generate(px) -    end -    # -end -# -# EOF diff --git a/spec/room_spec.rb b/spec/room_spec.rb deleted file mode 100644 index de4b55e..0000000 --- a/spec/room_spec.rb +++ /dev/null @@ -1,315 +0,0 @@ -#! /usr/bin/env ruby -# -*- coding: UTF-8 -*- -# - -require 'spec_helper' -# -describe Iotas::Room do -    # -    before (:all) do -        @spin = Iotas::Spin.new 'dom0' -    end -    # -    before(:each) do -        @spin.clear! -    end -    # -    it "add_iota and add_link correctly" do -        r0 = Iotas::Room.new 'room0', @spin -        d0 = Iotas::Door.new 'door0', r0 -        lambda { Iotas::Door.new('door0', r0) }.should raise_error(Iotas::Exception) -        lambda { r0.add_iota Iotas::Door.new('door1', r0) }.should raise_error(Iotas::Exception) -        r0.add_link Iotas::Link.new 'door0', 'somewhere' -        lambda { r0.add_link(Iotas::Link.new('nowhere', 'somewhere')) }.should raise_error(Iotas::Exception) -    end -    # -    it "start! and stop! should work" do -        r0 = Iotas::Room.new 'room0', @spin -        d0 = Fake.new 'fake', r0 -        d0.start.should be_nil -        d0.stop.should be_nil -        r0.start! -        d0.start.should be_true -        d0.stop.should be_nil -        r0.stop! -        d0.start.should be_true -        d0.stop.should be_true -    end -    # -    it "parent, spin and search_down should be ok" do -        r0 = Iotas::Room.new 'r0', @spin -        r1 = Iotas::Room.new 'r1', r0 -        r2 = Iotas::Room.new 'r2', r1 -        r3 = Iotas::Room.new 'r3', @spin -        r4 = Iotas::Room.new 'r4', r3 -        r2.parent.should be r1 -        r1.parent.should be r0 -        r0.parent.should be @spin -        r0.spin.should be @spin -        r1.spin.should be @spin -        r2.spin.should be @spin -        r3.spin.should be @spin -        @spin.search_down('dom0/r0/r1/r2').should be r2 -        r0.search_down('dom0/r0/r1/r2').should be r2 -        r1.search_down('dom0/r0/r1/r2').should be r2 -        r2.search_down('dom0/r0/r1/r2').should be r2 -        r1.search_down('dom0/r0/r1/r9').should be nil -        r3.search_down('dom0/r0/r1/r2').should be nil -        r4.search_down('dom0/r0/r1/r2').should be nil -    end -    # -    it "routing success (direct add_dst)" do -        room0 = Iotas::Room.new 'room0', @spin -        door0 = Iotas::Door.new 'door0', room0 -        p = @spin.require_p Iotas::Particle -        p.init! Fake.new( 'fake', @spin) -        p.add_dst 'get', 'door0' -        room0.send_p p -        p.action.should eql 'get' -        p.dst.should be door0 -    end -    # -    it "routing success (direct send to self)" do -        room0 = Iotas::Room.new 'room0', @spin -        door0 = Iotas::Door.new 'door0', room0 -        p = @spin.require_p Iotas::Particle -        p.init! Fake.new( 'fake', @spin) -        door0.send_p p, 'get' -        p.action.should eql 'get' -        p.dst.should be door0 -    end -    # -    it "routing success (direct send to pointer)" do -        room0 = Iotas::Room.new 'room0', @spin -        door0 = Iotas::Door.new 'door0', room0 -        p = @spin.require_p Iotas::Particle -        p.init! Fake.new( 'fake', @spin) -        door0.send_p p, 'get', door0 -        p.action.should eql 'get' -        p.dst.should be door0 -    end -    # -    it "routing success (direct send to path)" do -        room0 = Iotas::Room.new 'room0', @spin -        door0 = Iotas::Door.new 'door0', room0 -        p = @spin.require_p Iotas::Particle -        p.init! Fake.new( 'fake', @spin) -        door0.send_p p, 'get', door0.path -        p.action.should eql 'get' -        p.dst.should be door0 -    end -    # -    it "routing success through Spin@world" do -        room0 = Iotas::Room.new 'room0', @spin -        room1 = Iotas::Room.new 'room1', room0 -        door0 = Iotas::Door.new 'door0', room1 -        p = @spin.require_p Iotas::Particle -        p.init! Fake.new('fake', @spin) -        p.add_dst 'get', 'dom0/room0/room1/door0' -        room0.send_p p -        p.action.should eql 'get' -        p.dst.should be door0 -    end -    # -    it "route error: no source" do -        room = Iotas::Room.new 'room', @spin -        p = @spin.require_p Iotas::Particle -        p.add_dst 'get', 'room/door' -        room.send_p p -        p.action.should eql Iotas::ACT_ERROR -        p[Iotas::FIELD_ERROR_MSG].should eql Iotas::ERROR_ROUTE_NS -        p.dst.should be room.spin -    end -    # -    it "route error: no destination no links" do -        room = Iotas::Room.new 'room', @spin -        p = @spin.require_p Iotas::Particle -        p.init! Fake.new('fake', @spin) -        room.send_p p -        p.action.should eql Iotas::ACT_ERROR -        p[Iotas::FIELD_ERROR_MSG].should eql Iotas::ERROR_ROUTE_NDNL -        p.dst.should be p.src -    end -    # -    it "route error: no rooom, wrong door -> right room wrong door" do -        room0 = Iotas::Room.new 'room0', @spin -        p = @spin.require_p Iotas::Particle -        p.init! Fake.new('fake', @spin) -        p.add_dst 'get', 'nodoor' -        room0.send_p p -        p.action.should eql Iotas::ACT_ERROR -        p[Iotas::FIELD_ERROR_MSG].should eql Iotas::ERROR_ROUTE_RRWD -        p.dst.should be p.src -    end -    # -    it "route error: right rooom, wrong door -> right room wrong door" do -        room0 = Iotas::Room.new 'room0', @spin -        p = @spin.require_p Iotas::Particle -        p.init! Fake.new('fake', @spin) -        p.add_dst 'get', 'dom0/room0/nodoor' -        room0.send_p p -        p.action.should eql Iotas::ACT_ERROR -        p[Iotas::FIELD_ERROR_MSG].should eql Iotas::ERROR_ROUTE_RRWD -        p.dst.should be p.src -    end -    # -    it "route error: right room, wrong door through Spin@world -> does not exists" do -        room0 = Iotas::Room.new 'room0', @spin -        room1 = Iotas::Room.new 'room1', room0 -        p = @spin.require_p Iotas::Particle -        p.init! Fake.new('fake', room0) -        p.add_dst 'get', 'dom0/room0/nodoor' -        room1.send_p p -        p.action.should eql Iotas::ACT_ERROR -        p[Iotas::FIELD_ERROR_MSG].should eql Iotas::ERROR_ROUTE_DNE -        p.dst.should be p.src -    end -    # -    it "route error: wrong room, right door through Spin@world -> does not exists" do -        room0 = Iotas::Room.new 'room0', @spin -        room1 = Iotas::Room.new 'room1', room0 -        p = @spin.require_p Iotas::Particle -        p.init! Fake.new('fake', @spin) -        p.add_dst 'get', 'dom0/noroom/fake' -        room1.send_p p -        p.action.should eql Iotas::ACT_ERROR -        p[Iotas::FIELD_ERROR_MSG].should eql Iotas::ERROR_ROUTE_DNE -        p.dst.should be p.src -    end -    # -    it "routing ~failure: no door name -> src" do -        room0 = Iotas::Room.new 'room0', @spin -        door0 = Iotas::Door.new 'door0', room0 -        p = @spin.require_p Iotas::Particle -        p.init! door0 -        p.add_dst 'get' -        room0.send_p p -        p.action.should eql 'get' -        p.dst.should be door0 -    end -    # -    it "routing success: unconditional link" do -        room0 = Iotas::Room.new 'room0', @spin -        door0 = Iotas::Door.new 'door0', room0 -        door1 = Iotas::Door.new 'door1', room0 -        room0.add_link Iotas::Link.new('door0', 'door1') -        p = @spin.require_p Iotas::Particle -        door0.send_p p -        p.action.should be_nil -        p.dst.should be door1 -    end -    # -    it "routing success: conditional link" do -        room0 = Iotas::Room.new 'room0', @spin -        door0 = Iotas::Door.new 'door0', room0 -        door1 = Iotas::Door.new 'door1', room0 -        room0.add_link Iotas::Link.new('door0', 'door1', 'fields', 'f0,f1', 'v0v1') -        p = @spin.require_p Iotas::Particle -        p['f0']='v0' -        p['f1']='v1' -        door0.send_p p -        p.action.should be_nil -        p.src.should be door0 -        p.dst.should be door1 -    end -    # -    it "routing success: more then one matching link" do -        room0 = Iotas::Room.new 'room0', @spin -        door0 = Iotas::Door.new 'door0', room0 -        class Out < Iotas::Door -            attr_reader :count -            def receive_p p -                @count||=0 -                @count += 1 -            end -        end -        door1 = Out.new 'door1', room0 -        room0.add_link Iotas::Link.new('door0', 'door1') -        room0.add_link Iotas::Link.new('door0', 'door1', 'fields', 'f0,f1', 'v0v1') -        room0.add_link Iotas::Link.new('door0', 'door1', 'fields', 'f0,f1', 'v0v2') -        p = @spin.require_p Iotas::Particle -        p['f0']='v0' -        p['f1']='v1' -        door0.send_p p -        @spin.spin! -        door1.count.should eql 2 -    end -    # -    it "system route error: system no destination" do -        room0 = Iotas::Room.new 'room0', @spin -        p = @spin.require_p Iotas::Particle -        room0.send_sys_p p -        p.action.should eql Iotas::ACT_ERROR -        p[Iotas::FIELD_ERROR_MSG].should eql Iotas::ERROR_ROUTE_SND -    end -    # -    it "system routing success: action only" do -        room0 = Iotas::Room.new 'room0', @spin -        p = @spin.require_p Iotas::Particle -        p.add_dst Iotas::SYS_ACT_ADD_LINK -        room0.send_sys_p p -        p.action.should eql Iotas::SYS_ACT_ADD_LINK -        p.dst.should be room0.spin -    end -    # -    it "system routing success (add_dst)" do -        room0 = Iotas::Room.new 'room0', @spin -        door0 = Iotas::Door.new 'door0', room0 -        p = @spin.require_p Iotas::Particle -        p.add_dst Iotas::SYS_ACT_ADD_LINK, 'dom0/room0/door0' -        room0.send_sys_p p -        p.action.should eql Iotas::SYS_ACT_ADD_LINK -        p.dst.should be door0 -    end -    # -    it "system routing success (send_sys_p)" do -        room0 = Iotas::Room.new 'room0', @spin -        door0 = Iotas::Door.new 'door0', room0 -        p = @spin.require_p Iotas::Particle -        door0.send_sys_p p, Iotas::SYS_ACT_ADD_LINK -        p.action.should eql Iotas::SYS_ACT_ADD_LINK -        p.dst.should be door0 -    end -    # -    it "SYS_ACT_ADD_LINK" do -        room0 = Iotas::Room.new 'room0', @spin -        door0 = Iotas::Door.new 'door0', room0 -        door1 = Iotas::Door.new 'door1', room0 -        p0 = @spin.require_p Iotas::Particle -        p0.set_data Iotas::LNK_SRC, 'door0' -        p0.set_data Iotas::LNK_DSTS, 'door1' -        p0.set_data Iotas::LNK_FIELDS, 'fields' -        p0.set_data Iotas::LNK_CONDF, 'f0,f1' -        p0.set_data Iotas::LNK_CONDV, 'v0v1' -        p0.add_dst Iotas::SYS_ACT_ADD_LINK, room0.path -        room0.send_sys_p p0 -        @spin.spin! -        p = @spin.require_p Iotas::Particle -        p['f0']='v0' -        p['f1']='v1' -        door0.send_p p -        p.action.should be_nil -        p.src.should be door0 -        p.dst.should be door1 -    end -    # -    it "room->json->room" do -        r0 = Iotas::Room.new 'r0', @spin -        r1 = Iotas::Room.new 'r1', r0 -        r2 = Iotas::Room.new 'r2', r1 -        r3 = Iotas::Room.new 'r3', r1 -        r4 = Iotas::Room.new 'r4', r3 -        d0 = Iotas::Door.new 'd0', r1 -        d1 = Iotas::Door.new 'd1', r1 -        d2 = Iotas::Door.new 'd2', r2 -        r1.add_link Iotas::Link.new('d0', 'd1', 'fields', 'f0,f1', 'v0v1') -        r1.add_link Iotas::Link.new('d0', 'd2') -        r1.add_link Iotas::Link.new('d1', 'd0') -        r2.add_link Iotas::Link.new('d2', 'd1', 'fies', 'f5,f1', 'v9v1') -        rx = Iotas::Room.json_create( JSON.load( JSON.generate(r0) ) ) -        JSON.generate(r0).should eql JSON.generate(rx) -    end# -    # -end -# -# EOF diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb deleted file mode 100644 index 5a549c5..0000000 --- a/spec/spec_helper.rb +++ /dev/null @@ -1,38 +0,0 @@ -#! /usr/bin/env ruby -# -*- coding: UTF-8 -*- -# -begin -    require 'simplecov' -    SimpleCov.start do -        add_filter 'spec' -    end -rescue LoadError -end -# -require 'iotas' -# -class Fake < Iotas::Iota -    attr_reader :p, :sp, :start, :stop -    def process_p p -        @p = p -    end -    def process_sys_p p -        @sp = p -    end -    def send_p p -        @p = p -    end -    def send_sys_p p -        @sp = p -    end -    def add_iota p -    end -    def start! -        @start=true -    end -    def stop! -        @stop=true -    end -end -# -# EOF diff --git a/spec/spin_spec.rb b/spec/spin_spec.rb deleted file mode 100644 index 69266e5..0000000 --- a/spec/spin_spec.rb +++ /dev/null @@ -1,129 +0,0 @@ -#! /usr/bin/env ruby -# -*- coding: UTF-8 -*- -# - -require 'spec_helper' -# -describe Iotas::Spin do -    # -    class MyP < Iotas::Particle; end -    # -    it "Particles pool" do -        spin = Iotas::Spin.new 'dom0' -        p0 = spin.require_p Iotas::Particle -        p1 = spin.require_p Iotas::Particle -        (p0===p1).should be_false -        spin.release_p p0 -        p2 = spin.require_p Iotas::Particle -        (p0===p2).should be_true -    end -    # -    it "different Particles classes in pool" do -        spin = Iotas::Spin.new 'dom0' -        p0 = spin.require_p Iotas::Particle -        p1 = spin.require_p Iotas::Particle -        (p0===p1).should be_false -        spin.release_p p0 -        p2 = spin.require_p MyP -        p3 = spin.require_p MyP -        (p2===p3).should be_false -        spin.release_p p2 -        p4 = spin.require_p MyP -        (p2===p4).should be_true -    end -    # -    it "release of merged particles" do -        spin = Iotas::Spin.new 'dom0' -        p0 = spin.require_p Iotas::Particle -        p1 = spin.require_p Iotas::Particle -        (p0===p1).should be_false -        p0.merge! p1 -        spin.release_p p0 -        p2 = spin.require_p Iotas::Particle -        (p2===p0).should be_true -        p3 = spin.require_p Iotas::Particle -        (p3===p1).should be_true -    end -    # -    it "clear!" do -        spin = Iotas::Spin.new 'dom0' -        p0 = spin.require_p Iotas::Particle -        p1 = spin.require_p Iotas::Particle -        spin.send_p p0 -        spin.release_p p1 -        spin.clear! -        p2 = spin.require_p Iotas::Particle -        (p2==p0).should be_false -        (p2==p1).should be_false -    end -    # -    it "post_p post_sys_p spin!" do -        spin = Iotas::Spin.new 'dom0' -        f = Fake.new 'fake', spin -        p0 = spin.require_p Iotas::Particle -        p0.dst_routed!  f -        p1 = spin.require_p Iotas::Particle -        p1.dst_routed!  f -        spin.post_p p0 -        spin.post_sys_p p1 -        spin.run = true -        spin.spin! -        f.p.should be p0 -        f.sp.should be p1 -        spin.stop! -    end -    # -    it "process_sys" do -        spin = Iotas::Spin.new 'dom0' -        p0 = spin.require_p Iotas::Particle -        p0.add_dst 'unknown' -        spin.send_sys_p p0 -        spin.spin! -        p1 = spin.require_p Iotas::Particle -        p0.should be p0 -    end -    # -    it "option debug" do -        spin = Iotas::Spin.new 'dom0' -        spin.debug_routing.should be false -        spin.debug_errors.should be false -        spin = Iotas::Spin.new 'dom0', :debug_routing=>true, :debug_errors=>true -        spin.debug_routing.should be true -        spin.debug_errors.should be true -    end -    # -    it "spin->json->spin" do -        spin = Iotas::Spin.new 'dom0', :debug_routing=>true -        r0 = Iotas::Room.new 'r0', spin -        r1 = Iotas::Room.new 'r1', r0 -        r2 = Iotas::Room.new 'r2', r1 -        r3 = Iotas::Room.new 'r3', r1 -        r4 = Iotas::Room.new 'r4', r3 -        d0 = Iotas::Door.new 'd0', r1 -        d1 = Iotas::Door.new 'd1', r1 -        d2 = Iotas::Door.new 'd2', r2 -        p0 = spin.require_p Iotas::Particle -        p1 = spin.require_p Iotas::Particle -        p2 = spin.require_p Iotas::Particle -        spin.post_p p0 -        spin.post_p p1 -        spin.post_sys_p p2 -        json = JSON.generate spin -        dom0 = Iotas::Spin.json_create( JSON.load( json ) ) -        json.should eql JSON.generate(dom0) -    end -    # -    it "hibernate! resume!" do -        spin = Iotas::Spin.new 'dom0' -        p0 = spin.require_p Iotas::Particle -        p0.add_dst Iotas::SYS_ACT_HIBERNATE -        spin.send_sys_p p0 -        spin.spin! -        dom0 = Iotas::Spin.resume! spin.hibernate_path -        dom0.name.should eql spin.name -        File.unlink dom0.hibernate_path -    end -    # -end -# -#EOF diff --git a/spec/spot_spec.rb b/spec/spot_spec.rb deleted file mode 100644 index 1ed2b03..0000000 --- a/spec/spot_spec.rb +++ /dev/null @@ -1,26 +0,0 @@ -#! /usr/bin/env ruby -# -*- coding: UTF-8 -*- -# - -require 'spec_helper' -# -describe Iotas::Iota do -    # -    it "path construction" do -        class S<Iotas::Iota -            def add_iota s -            end -        end -        s0 = S.new 'top', nil -        s1 = S.new 'room0', s0 -        s2 = S.new 'room1', s1 -        s3 = S.new 'door', s2 -        s3.path.should eql 'top/room0/room1/door' -        lambda { Iotas::Iota.new('do/or0', nil) }.should raise_error(Iotas::Exception) -        lambda { Iotas::Iota.new('/door0', nil) }.should raise_error(Iotas::Exception) -        lambda { Iotas::Iota.new('door0/', nil) }.should raise_error(Iotas::Exception) -    end -    # -end -# -# EOF diff --git a/test/test_iotas.rb b/test/test_iotas.rb deleted file mode 100644 index 057742f..0000000 --- a/test/test_iotas.rb +++ /dev/null @@ -1,168 +0,0 @@ -#! /usr/bin/env ruby -# -*- coding: UTF-8 -*- - -require 'iotas' - -HBN_PATH='hibernate.json' -# -class InputDoor < Iotas::Door -    # -    @count = 0 -    # -    class << self -        attr_accessor :count -    end -    # -    def initialize n, p -        super n, p -        @lines = [ "#{name} says : hello", "world ( from #{path} )" ] -        @idx = 0 -    end -    # -    def start! -        puts " -> start #{self.class.name} (#{@path})" -        # stimulate myself -        p = require_p Iotas::Particle -        # p.add_dst Iotas::ACT_GET, path -        send_p p, Iotas::ACT_GET -    end -    # -    def stop! -        puts " >- stop  #{self.class.name} (#{@path})" -    end -    # -    def hibernate! -        puts " !! hibernate  #{self.class.name} (#{@path})" -        # we want to remember where we are in the data flow -        {'idx'=>@idx} -    end -    # -    def resume! o -        puts " !! resume  #{self.class.name} (#{@path})" -        # restore idx -        @idx = o['idx'] -    end -    # -    def receive_p p -        puts " @ #{self.class.name} (#{@path}) receive_p : #{p.action}" -        if p.action==Iotas::ACT_GET -            p.reset! -            p.set_data 'line', @lines[@idx] -            p.set_data 'f0', 'v0' -            p.set_data 'f1', 'v1' -            p.set_data 'f2', 'v2' -            send_p p    # will follow the link -            @idx+=1 -            if @idx<@lines.length -                # there is more to read, restimulate myself -                p = require_p Iotas::Particle -                p.add_dst Iotas::ACT_GET, name -                send_p p -            end -        else -            # we can release it or let the Door do it -            release_p p -        end -        # I want to hibernate now! -        self.class.count+=1 -        if self.class.count==3 -            p = require_p Iotas::Particle -            p[Iotas::FIELD_HIBERNATE_PATH] = HBN_PATH -            p.add_dst Iotas::SYS_ACT_HIBERNATE -            send_sys_p p -        end -    end -    # -end -# -class ConcatBoard < Iotas::Board -    # -    def initialize n, p, m=false -        super n, p -        @manual = m -    end -    # -    def start! -        puts " -> start #{self.class.name} (#{@path})" -    end -    # -    def stop! -        puts " >- stop  #{self.class.name} (#{@path})" -    end -    # -    def receive_p p -        puts " @ #{self.class.name} receive_p : #{p.action}" -        if p.action==Iotas::ACT_ERROR -            # -        else -            if @manual -                # cleanup unnecessary p2 Particle -                p2 = p.merged_shift -                p.set_data 'line', (p.data('line')+' '+p2.data('line')) -                release_p p2 -            else -                # Or let the system do it -                p.set_data 'line', (p.data('line')+' '+p.merged(0).data('line')) -            end -            send_p p -        end -    end -    # -end -# -class OutputDoor < Iotas::Door -    # -    def initialize n, p, c=false -        super n, p -        @clean = c -    end -    # -    def start! -        puts " -> start #{self.class.name} (#{@path})" -    end -    # -    def stop! -        puts " >- stop  #{self.class.name} (#{@path})" -    end -    # -    def receive_p p -        puts " #==> #{self.class.name} (#{@path}) receive_p : #{p.get_data('line')}" -        if @clean -            release_p p -        else -            # we do nothing Iotas::Door#process_p will detect it and release it -        end -    end -    # -end -# -spin = Iotas::Spin.new 'dom0', :debug_routing=>false, :debug_errors=>true -# -room0 = Iotas::Room.new 'room0', spin -room1 = Iotas::Room.new 'room1', spin -# -input0 = InputDoor.new 'input0', room0 -output0 = OutputDoor.new 'output0', room0 -# -input1 = InputDoor.new 'input1', room1 -output1 = OutputDoor.new 'output1', room1, true -concat1 = ConcatBoard.new 'concat1', room1 -# -room0.add_link Iotas::Link.new('input0', 'output0', nil, nil, nil) -# -p0 = spin.require_p Iotas::Particle -p0.set_data Iotas::LNK_SRC, 'input1' -p0.set_data Iotas::LNK_DSTS, 'concat1?follow,output1' -p0.set_data Iotas::LNK_FIELDS, 'f0,f2' -p0.set_data Iotas::LNK_CONDF, 'f0,f1,f2' -p0.set_data Iotas::LNK_CONDV, 'v0v1v2' -p0.add_dst Iotas::SYS_ACT_ADD_LINK, room1.path -room1.send_sys_p p0 # send_sys_p -> room0 -> spin -> room1 -> input1 -# -spin.spin! -# -dom0 = Iotas::Spin.resume! HBN_PATH -dom0.spin! -File.unlink HBN_PATH if File.exists? HBN_PATH -# -# EOF  | 
