summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--examples/hello_world.json9
-rw-r--r--examples/hello_world.rb2
-rw-r--r--lib/edoors.rb1
-rw-r--r--lib/edoors/board.rb19
-rw-r--r--lib/edoors/door.rb67
-rw-r--r--lib/edoors/iota.rb24
-rw-r--r--lib/edoors/link.rb64
-rw-r--r--lib/edoors/particle.rb245
-rw-r--r--lib/edoors/room.rb104
-rw-r--r--lib/edoors/spin.rb93
-rw-r--r--spec/board_spec.rb14
-rw-r--r--spec/door_spec.rb6
-rw-r--r--spec/link_spec.rb23
-rw-r--r--spec/particle_spec.rb55
-rw-r--r--spec/room_spec.rb19
-rw-r--r--spec/spin_spec.rb8
-rw-r--r--test/test_iotas.rb11
17 files changed, 591 insertions, 173 deletions
diff --git a/examples/hello_world.json b/examples/hello_world.json
index 295b10d..6635bca 100644
--- a/examples/hello_world.json
+++ b/examples/hello_world.json
@@ -1,6 +1,6 @@
{
"kls": "Edoors::Spin",
- "timestamp": "2012-06-10 23:17:15 +0200",
+ "timestamp": "2012-06-24 22:50:00 +0200",
"name": "dom0",
"hibernation": false,
"inner_room": {
@@ -20,9 +20,8 @@
"kls": "Edoors::Link",
"src": "input",
"dsts": "output",
- "fields": null,
- "cond_fields": null,
- "cond_value": null
+ "keys": null,
+ "value": null
}
]
}
@@ -33,6 +32,6 @@
"app_fifo": [
],
- "debug_errors": false,
+ "debug_garbage": false,
"debug_routing": false
}
diff --git a/examples/hello_world.rb b/examples/hello_world.rb
index 3976d6f..e4ee3c2 100644
--- a/examples/hello_world.rb
+++ b/examples/hello_world.rb
@@ -62,7 +62,7 @@ if $0 == __FILE__
# This will output the receive data and let the system recycle the particle
output = OutputDoor.new 'output', dom0
# This will be the unconditinal link leading from 'input' to 'output'
- dom0.add_link Edoors::Link.new('input', 'output', nil, nil, nil)
+ dom0.add_link Edoors::Link.new('input', 'output', nil, nil)
#
# schedule the spinning particles untill the system cools down
dom0.spin!
diff --git a/lib/edoors.rb b/lib/edoors.rb
index d70d5bf..8ef8823 100644
--- a/lib/edoors.rb
+++ b/lib/edoors.rb
@@ -23,7 +23,6 @@ require 'version'
module Edoors
#
PATH_SEP = '/'.freeze
- LINK_SEP = ','.freeze
ACT_SEP = '?'.freeze
#
ACT_GET = 'get'.freeze
diff --git a/lib/edoors/board.rb b/lib/edoors/board.rb
index f845dcd..990d312 100644
--- a/lib/edoors/board.rb
+++ b/lib/edoors/board.rb
@@ -25,11 +25,20 @@ module Edoors
#
class Board < Door
#
+ # creates a Board object from the arguments.
+ #
+ # @param [String] n the name of this Board
+ # @param [Iota] p the parent
+ #
def initialize n, p
super n, p
@postponed = {}
end
#
+ # called by JSON#generate to serialize the Board object into JSON data
+ #
+ # @param [Array] a belongs to JSON generator
+ #
def to_json *a
{
'kls' => self.class.name,
@@ -38,6 +47,12 @@ module Edoors
}.merge(hibernate!).to_json *a
end
#
+ # creates a Board object from a JSON data
+ #
+ # @param [Hash] o belongs to JSON parser
+ #
+ # @raise Edoors::Exception if the json kls attribute is wrong
+ #
def self.json_create o
raise Edoors::Exception.new "JSON #{o['kls']} != #{self.name}" if o['kls'] != self.name
board = self.new o['name'], o['parent']
@@ -48,6 +63,10 @@ module Edoors
board
end
#
+ # process the given particle then forward it to user code
+ #
+ # @param [Particle] p the Particle to be processed
+ #
def process_p p
@viewer.receive_p p if @viewer
if p.action!=Edoors::ACT_ERROR
diff --git a/lib/edoors/door.rb b/lib/edoors/door.rb
index 848c1b5..beb42ab 100644
--- a/lib/edoors/door.rb
+++ b/lib/edoors/door.rb
@@ -23,11 +23,20 @@ module Edoors
#
class Door < Iota
#
+ # creates a Door object from the arguments.
+ #
+ # @param [String] n the name of this Door
+ # @param [Iota] p the parent
+ #
def initialize n, p
super n, p
@saved = nil
end
#
+ # called by JSON#generate to serialize the Door object into JSON data
+ #
+ # @param [Array] a belongs to JSON generator
+ #
def to_json *a
{
'kls' => self.class.name,
@@ -35,6 +44,12 @@ module Edoors
}.merge(hibernate!).to_json *a
end
#
+ # creates a Door object from a JSON data
+ #
+ # @param [Hash] o belongs to JSON parser
+ #
+ # @raise Edoors::Exception if the json kls attribute is wrong
+ #
def self.json_create o
raise Edoors::Exception.new "JSON #{o['kls']} != #{self.name}" if o['kls'] != self.name
door = self.new o['name'], o['parent']
@@ -42,23 +57,37 @@ module Edoors
door
end
#
- def require_p p_kls
+ # require a Particle of the given class
+ #
+ # @param [Class] p_kls the class of the desired Particle
+ #
+ def require_p p_kls=Edoors::Particle
@spin.require_p p_kls
end
#
+ # release the given Particle
+ #
+ # @param [Particle] p the Particle to be released
+ #
def release_p p
@saved=nil if @saved==p # particle is released, all is good
@spin.release_p p
end
#
+ # release the Particle that have not been released or sent by user code
+ #
def _garbage
- puts " ! #{path} didn't give back #{@saved}" if @spin.debug_errors
+ puts " ! #{path} didn't give back #{@saved}" if @spin.debug_garbage
puts "\t#{@saved.data Edoors::FIELD_ERROR_MSG}" if @saved.action==Edoors::ACT_ERROR
@spin.release_p @saved
@saved = nil
end
private :_garbage
#
+ # process the given particle then forward it to user code
+ #
+ # @param [Particle] p the Particle to be processed
+ #
def process_p p
@viewer.receive_p p if @viewer
@saved = p
@@ -66,12 +95,24 @@ module Edoors
_garbage if not @saved.nil?
end
#
+ # dead end, for now user defined Door do not have to deal with system Particle
+ # the Particle is released
+ #
+ # @param [Particle] p the Particle to deal with
+ #
def process_sys_p p
# nothing todo with it now
@spin.release_p p
end
#
- def _send sys, p, a=nil, d=nil
+ # send the given Particle through the direct @parent
+ #
+ # @param [Particle] p the Particle to be sent
+ # @param [Boolean] sys if true send to system Particle fifo
+ # @param [String] a the post action
+ # @param [Iota] d the post destination
+ #
+ def _send p, sys, a, d
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
@@ -80,12 +121,28 @@ module Edoors
end
private :_send
#
+ # send the given Particle to the application Particle fifo
+ #
+ # @param [Particle] p the Particle to be sent
+ # @param [String] a the post action
+ # @param [Iota] d the post destination
+ #
+ # @see Door#_send real implementation
+ #
def send_p p, a=nil, d=nil
- _send false, p, a, d
+ _send p, false, a, d
end
#
+ # send the given Particle to the system Particle fifo
+ #
+ # @param [Particle] p the Particle to be sent
+ # @param [String] a the post action
+ # @param [Iota] d the post destination
+ #
+ # @see Door#_send real implementation
+ #
def send_sys_p p, a=nil, d=nil
- _send true, p, a, d
+ _send p, true, a, d
end
#
end
diff --git a/lib/edoors/iota.rb b/lib/edoors/iota.rb
index fcf7573..e63aca0 100644
--- a/lib/edoors/iota.rb
+++ b/lib/edoors/iota.rb
@@ -25,6 +25,14 @@ module Edoors
#
class Iota
#
+ # creates a Iota object from the arguments.
+ #
+ # @param [String] n the name of this Iota
+ # @param [Iota] p the parent
+ #
+ # @see Room#add_iota adds itself to it's parent children list
+ # @see Spin#add_to_world adds itself to @spin's world
+ #
def initialize n, p
raise Edoors::Exception.new "Iota name #{n} is not valid" if n.include? Edoors::PATH_SEP
@name = n # unique in it's room
@@ -41,23 +49,31 @@ module Edoors
attr_reader :name, :path, :spin
attr_accessor :viewer, :parent
#
+ # override this to initialize your object on system start
+ #
def start!
- # override this to initialize your object on system start
end
#
+ # override this to initialize your object on system stop
+ #
def stop!
- # override this to initialize your object on system stop
end
#
+ # override this to save your object state on hibernate
+ # #
def hibernate!
- # override this to save your object state on hibernate
{}
end
#
+ # override this to restore your object state on resume
+ #
def resume! o
- # override this to restore your object state on resume
end
#
+ # has to be override, used by user side code
+ #
+ # @raise NoMethodError
+ #
def receive_p p
raise NoMethodError.new "receive_p(p) must be overridden"
end
diff --git a/lib/edoors/link.rb b/lib/edoors/link.rb
index b6a3fb9..ede2cd4 100644
--- a/lib/edoors/link.rb
+++ b/lib/edoors/link.rb
@@ -23,45 +23,65 @@ module Edoors
#
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
+ LNK_KEYS = 'edoors_lnk_keys'.freeze
+ LNK_VALUE = 'edoors_lnk_value'.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
+ # creates a Link object from the arguments.
+ #
+ # @param [String] src link source name
+ # @param [Array] dsts destinations to apply to the particle on linking success
+ # @param [Array] keys keys to apply as link_keys to the particle on linking success
+ # @param [Hash] value will be used to check linking with particles
+ #
+ # @see Room#_try_links try to apply links on a Particle
+ # @see Particle#link_with? linking test
+ #
+ def initialize src, dsts, keys=nil, value=nil
+ @src = src
+ @dsts = dsts
+ @keys = keys
+ @value = value
+ @door = nil # pointer to the source set from @src by Room#add_link
end
#
+ # called by JSON#generate to serialize the Link object into JSON data
+ #
+ # @param [Array] a belongs to JSON generator
+ #
def to_json *a
{
- 'kls' => self.class.name,
- 'src' => @src,
- 'dsts' => @dsts,
- 'fields' => @fields,
- 'cond_fields' => @cond_fields,
- 'cond_value' => @cond_value
+ 'kls' => self.class.name,
+ 'src' => @src,
+ 'dsts' => @dsts,
+ 'keys' => @keys,
+ 'value' => @value
}.to_json *a
end
#
+ # creates a Link object from a JSON data
+ #
+ # @param [Hash] o belongs to JSON parser
+ #
+ # @raise Edoors::Exception if the json kls attribute is wrong
+ #
def self.json_create o
raise Edoors::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']
+ self.new o['src'], o['dsts'], o['keys'], o['value']
end
#
- def self.from_particle_data p
- Edoors::Link.new(p.get_data(Edoors::LNK_SRC), p.get_data(Edoors::LNK_DSTS),
- p.get_data(Edoors::LNK_FIELDS), p.get_data(Edoors::LNK_CONDF),
- p.get_data(Edoors::LNK_CONDV))
+ # creates a Link object from the data of a particle
+ #
+ # @param [Particle] p the Particle to get Link attributes from
+ #
+ def self.from_particle p
+ pl = p.payload
+ Edoors::Link.new pl[Edoors::LNK_SRC], pl[Edoors::LNK_DSTS], pl[Edoors::LNK_KEYS], pl[Edoors::LNK_VALUE]
end
#
attr_accessor :door
- attr_reader :src, :dsts, :fields, :cond_fields, :cond_value
+ attr_reader :src, :dsts, :keys, :value
#
end
#
diff --git a/lib/edoors/particle.rb b/lib/edoors/particle.rb
index f659fbc..763c578 100644
--- a/lib/edoors/particle.rb
+++ b/lib/edoors/particle.rb
@@ -24,6 +24,33 @@ module Edoors
#
class Particle
#
+ # creates a Particle object from the arguments.
+ #
+ # @param [Hash] o a customizable set of options
+ #
+ # @option o 'ts' [String]
+ # creation time
+ # @option o 'src' [String]
+ # Iota where it's originated from
+ # @option o 'dst' [String]
+ # Iota where it's heading to
+ # @option o 'room' [String]
+ # Room path part of the current destination
+ # @option o 'door' [String]
+ # Door path part of the current destination
+ # @option o 'action' [String]
+ # action part of the current destination
+ # @option o 'dsts' [String]
+ # fifo of path?action strings where to travel to
+ # @option o 'link_keys' [String]
+ # unordered keys used has payload keys to build link_value
+ # @option o 'payload' [String]
+ # the data carried by this particle
+ # @option o 'merged' [String]
+ # list of merged particles
+ #
+ # @see Spin#require_p require a Particle
+ #
def initialize o={}
@ts = Time.now # creation time
@src = nil # Iota where it's originated from
@@ -31,11 +58,10 @@ module Edoors
@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
+ @link_keys = [] # unordered keys used has payload keys to build link_value
+ @link_value = {} # the payload keys and values corresponding to the link keys
+ @payload = {} # the data carried by this particle
@merged = [] # list of merged particles
#
if not o.empty?
@@ -46,77 +72,117 @@ module Edoors
@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']
+ add_dsts *o['dsts'] if o['dsts']
+ set_link_keys *o['link_keys'] if o['link_keys']
o['merged'].each do |particle|
merge! Particle.json_create(particle.merge!('spin'=>o['spin']))
end if o['merged']
end
end
#
+ # called by JSON#generate to serialize the Particle object into JSON data
+ #
+ # @param [Array] a belongs to JSON generator
+ #
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
+ '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_keys' => @link_keys,
+ 'payload' => @payload,
+ 'merged' => @merged
}.to_json *a
end
#
+ # creates a Particle object from a JSON data
+ #
+ # @param [Hash] o belongs to JSON parser
+ #
+ # @raise Edoors::Exception if the json kls attribute is wrong
+ #
def self.json_create o
raise Edoors::Exception.new "JSON #{o['kls']} != #{self.name}" if o['kls'] != self.name
self.new o
end
#
- # called when released
+ # clears all attributes
+ #
+ # @see Spin#release_p called whe na Particle is released
+ #
def reset!
clear_merged! ( @src ? @src : ( @dst ? @dst : nil ) )
- @ts = @src = @dst = @room = @door = @action = @link_value = nil
+ @ts = @src = @dst = @room = @door = @action = nil
@dsts.clear
- @link_fields.clear
+ @link_value.clear
+ @link_keys.clear
@payload.clear
end
#
- # called when sent
+ # sets @src, @ts, and reset others
+ #
+ # @see Particle#apply_link! called when a Link is applied
+ # @see Door#_send called when a Door sends a Particle
+ #
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
+ attr_reader :ts, :src, :dst, :room, :door, :action, :payload, :link_value
#
- # routing
+ # returns the next destination
#
def next_dst
@dsts[0]
end
#
+ # clears the destination list
+ #
def clear_dsts!
@dsts.clear
end
#
- def add_dsts dsts
- dsts.split(Edoors::LINK_SEP).each do |dst|
- if dst.empty? or dst[0]==Edoors::PATH_SEP or dst[0]==Edoors::PATH_SEP or dst=~/\/\?/\
- or dst=~/\/{2,}/ or dst=~/\s+/ or dst==Edoors::ACT_SEP
+ # adds destinations to the destination list
+ #
+ # @param [Array] dsts destinations to add
+ #
+ # @raise Edoors::Exception if a destination is not acceptable
+ #
+ # The parameters are checked before beeing added.
+ # they must not be empty or be '?' or start with '/'
+ # or contain '/?' or '//' or '\s+'
+ #
+ def add_dsts *dsts
+ dsts.each do |dst|
+ if dst.empty? or dst==Edoors::ACT_SEP or dst[0]==Edoors::PATH_SEP \
+ or dst=~/\/\?/ or dst=~/\/{2,}/ or dst=~/\s+/
raise Edoors::Exception.new "destination #{dst} is not acceptable"
end
@dsts << dst
end
end
#
+ # adds a destination to the destination list
+ #
+ # @param [String] a the action
+ # @param [String] d the destination
+ #
def add_dst a, d=''
add_dsts d+Edoors::ACT_SEP+a
end
#
+ # sets the current destination
+ #
+ # @param [String] a the action
+ # @param [String Iota] d the destination
+ #
def set_dst! a, d
@action = a
if d.is_a? Edoors::Iota
@@ -127,6 +193,11 @@ module Edoors
end
end
#
+ # splits the next destination into @room, @door, @action attributes
+ #
+ # the @dst attribute is set to nil
+ # the @room, @door, @action attributes are set to nil if not defined
+ #
def split_dst!
@dst = @room = @door = @action = nil
return if (n = next_dst).nil?
@@ -134,6 +205,10 @@ module Edoors
_split_path! p
end
#
+ # called by Particle#split_dst! to split the path part of the destination
+ #
+ # @param [String] p path to be splitted
+ #
def _split_path! p
i = p.rindex Edoors::PATH_SEP
if i.nil?
@@ -147,81 +222,147 @@ module Edoors
end
private :_split_path!
#
+ # sets the current destination and shift the head of destination list
+ #
+ # @param [Iota] dst the current destination
+ #
+ # @see Room#_route routing success
+ # @see Room#_send routing failure
+ #
def dst_routed! dst
@dst = dst
@dsts.shift
end
#
+ # sets the error message, the destination and action
+ #
+ # @param [String] e error message
+ # @param [Iota] dst the destination, @src if nil
+ #
+ # the error message is set into @payload[[Edoors::FIELD_ERROR_MSG]
+ #
def error! e, dst=nil
@action = Edoors::ACT_ERROR
@dst = dst||@src
@payload[Edoors::FIELD_ERROR_MSG]=e
end
#
+ # applies the effects of the given Link
+ #
+ # @param [Link] lnk the link to apply effects
+ #
+ # updates @src with Link @src, clears the destination list
+ # adds the Link destinations to @dsts, sets the @link_keys
+ #
def apply_link! lnk
init! lnk.door
clear_dsts!
- add_dsts lnk.dsts
- set_link_fields lnk.fields
+ add_dsts *lnk.dsts
+ set_link_keys *lnk.keys
end
#
- # data manipulation
+ # adds/updates a key value pair into payload
#
- def []= k, v
- @payload[k]=v
- compute_link_value! if @link_fields.include? k
- end
+ # @param [String] k the key
+ # @param [Object] v the value
#
- def set_data k, v
+ # \@link_value attribute will be updated if impacted
+ #
+ def []= k, v
+ @link_value[k] = v if @link_keys.include? k
@payload[k] = v
- compute_link_value! if @link_fields.include? k
end
+ alias :set_data :[]=
#
- def [] k
- @payload[k]
+ # destroys the value paired with a key
+ #
+ # @param [String] k the key
+ #
+ # @return the associated value
+ #
+ # \@link_value attribute will be updated if impacted
+ #
+ def del_data k
+ @link_value.delete k if @link_keys.include? k
+ @payload.delete k
end
#
- def get_data k
+ # retrieves a data value from a key
+ #
+ # @param [String] k the key
+ #
+ def [] k
@payload[k]
end
- alias :data :get_data
+ #
+ alias :get_data :[]
+ alias :data :[]
+ #
+ # clones the payload of the given Particle
+ #
+ # @param [Particle] p the Particle to clone the payload of
#
def clone_data p
@payload = p.payload.clone
end
#
- # link value and fields
+ # sets the links keys
+ #
+ # @param [Array] args list of keys to set
#
- def set_link_fields *args
- @link_fields.clear if not @link_fields.empty?
+ # \@link_value attribute will be updated
+ #
+ def set_link_keys *args
+ @link_keys.clear if not @link_keys.empty?
args.compact!
- args.each do |lfs|
- lfs.split(',').each do |lf|
- @link_fields << lf
- end
+ args.each do |lf|
+ @link_keys << lf
end
- compute_link_value!
+ @link_value = @payload.select { |k,v| @link_keys.include? k }
end
#
- def compute_link_value!
- @link_value = @link_fields.inject('') { |s,lf| s+=@payload[lf].to_s if @payload[lf]; s }
+ # tries to link the Particle with the given Link
+ #
+ # @param [Link] link the link to try to link with
+ #
+ # returns true if the value of the Link is nil
+ # otherwise checks if the extracted key values pairs from the Particle
+ # payload using the Link value keys as selectors, equals the Link value
+ #
+ # @return [Boolean] true if the Link links with the Particle
+ #
+ def link_with? link
+ return true if link.value.nil?
+ link.value.keys.inject({}) { |h,k| h[k]=@payload[k] if @payload.has_key?(k); h }.eql? link.value
end
#
- # merge particles management
+ # merges the given Particle in
+ #
+ # @param [Particle] p the Particle to merge in
#
def merge! p
@merged << p
end
#
+ # returns a merged Particle
+ #
+ # @param [Integer] i the index into the merged Particle list
+ #
def merged i
@merged[i]
end
#
+ # shifts the merged Particle list
+ #
def merged_shift
@merged.shift
end
#
- def clear_merged! r=nil
+ # recursively clears the merged Particle list
+ #
+ # @param [Boolean] r releases the cleared Particle if true
+ #
+ def clear_merged! r=false
@merged.each do |p|
p.clear_merged! r
r.release_p p if r
diff --git a/lib/edoors/room.rb b/lib/edoors/room.rb
index 5936e27..decdb83 100644
--- a/lib/edoors/room.rb
+++ b/lib/edoors/room.rb
@@ -29,12 +29,21 @@ module Edoors
#
class Room < Iota
#
+ # creates a Room object from the arguments.
+ #
+ # @param [String] n the name of this Room
+ # @param [Iota] p the parent
+ #
def initialize n, p
super n, p
@iotas = {}
@links = {}
end
#
+ # called by JSON#generate to serialize the Room object into JSON data
+ #
+ # @param [Array] a belongs to JSON generator
+ #
def to_json *a
{
'kls' => self.class.name,
@@ -44,6 +53,12 @@ module Edoors
}.to_json *a
end
#
+ # creates a Room object from a JSON data
+ #
+ # @param [Hash] o belongs to JSON parser
+ #
+ # @raise Edoors::Exception if the json kls attribute is wrong
+ #
def self.json_create o
raise Edoors::Exception.new "JSON #{o['kls']} != #{self.name}" if o['kls'] != self.name
room = self.new o['name'], o['parent']
@@ -58,33 +73,65 @@ module Edoors
room
end
#
- def self.from_particle_data p, s
+ # creates a Room object from the data of a particle
+ #
+ # @param [Particle] p the Particle to get Room attributes from
+ #
+ def self.from_particle p, s
Edoors::Room.new(p.get_data(Edoors::IOTA_NAME), s)
end
#
- def add_iota s
- raise Edoors::Exception.new "Iota #{s.name} already has #{s.parent.name} as parent" if not s.parent.nil? and s.parent!=self
- raise Edoors::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
+ # adds the given Iota to this Room
+ #
+ # @param [Iota] i the Iota to add
+ #
+ # @raise Edoors::Exception if i already has a parent or if a Iota with the same name already exists
+ #
+ def add_iota i
+ raise Edoors::Exception.new "Iota #{i.name} already has #{i.parent.name} as parent" if not i.parent.nil? and i.parent!=self
+ raise Edoors::Exception.new "Iota #{i.name} already exists in #{path}" if @iotas.has_key? i.name
+ i.parent = self if i.parent.nil?
+ @iotas[i.name]=i
end
#
+ # adds the given Link to this Room
+ #
+ # @param [Link] l the Link to add
+ #
+ # @raise Edoors::Exception if the link source can't be found in this Room
+ #
def add_link l
l.door = @iotas[l.src]
raise Edoors::Exception.new "Link source #{l.src} does not exist in #{path}" if l.door.nil?
(@links[l.src] ||= [])<< l
end
#
+ # forward the call to each children
+ #
+ # @see Spin#spin! called on system bootup
+ #
def start!
puts " * start #{path}" if @spin.debug_routing
@iotas.values.each do |iota| iota.start! end
end
#
+ # forward the call to each children
+ #
+ # @see Spin#spin! called on system shutdown
+ #
def stop!
puts " * stop #{path}" if @spin.debug_routing
@iotas.values.each do |iota| iota.stop! end
end
#
+ # search through all children for a matching Iota
+ #
+ # @param [String] spath the full path of the earch Iota
+ #
+ # @return [Iota] if found
+ #
+ # @see Particle#initialize used to transform @src and @dst JSON data into refrences
+ #
def search_down spath
return self if spath==path
return nil if (spath=~/^#{path}\/(\w+)\/?/)!=0
@@ -95,17 +142,17 @@ module Edoors
nil
end
#
+ # search for a matching link
+ #
+ # @param [Particle] p the Particle searching for a matching link
+ #
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 p.link_with? link
if pending_link
p2 = @spin.require_p p.class
p2.clone_data p
@@ -117,12 +164,16 @@ module Edoors
end
if pending_link
p.apply_link! pending_link
- _send false, p
+ _send p
end
pending_link
end
private :_try_links
#
+ # route the given Particle
+ #
+ # @param [Particle] p the Particle to be routed
+ #
def _route p
if p.room.nil? or p.room==path
if door = @iotas[p.door]
@@ -138,7 +189,12 @@ module Edoors
end
private :_route
#
- def _send sys, p
+ # send the given Particle
+ #
+ # @param [Particle] p the Particle to send
+ # @param [Boolean] sys if true send to system Particle fifo
+ #
+ def _send p, sys=false
if not sys and p.src.nil?
# do not route non system orphan particles !!
p.error! Edoors::ERROR_ROUTE_NS, @spin
@@ -166,25 +222,39 @@ module Edoors
end
private :_send
#
+ # send the given Particle to application Particle fifo
+ #
+ # @param [Particle] p the Particle to send
+ #
def send_p p
puts " * send_p #{(p.next_dst.nil? ? 'no dst' : p.next_dst)} ..." if @spin.debug_routing
- _send false, p
+ _send p
puts " -> #{p.dst.path}#{Edoors::ACT_SEP}#{p.action}" if @spin.debug_routing
@spin.post_p p
end
#
+ # send the given Particle to system Particle fifo
+ #
+ # @param [Particle] p the Particle to send
+ #
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
+ _send p, true
puts " -> #{p.dst.path}#{Edoors::ACT_SEP}#{p.action}" if @spin.debug_routing
@spin.post_sys_p p
end
#
+ # process the given system Particle
+ #
+ # @param [Particle] p the Particle to be processed
+ #
+ # @note the Particle is automatically released
+ #
def process_sys_p p
if p.action==Edoors::SYS_ACT_ADD_LINK
- add_link Edoors::Link.from_particle_data p
+ add_link Edoors::Link.from_particle p
elsif p.action==Edoors::SYS_ACT_ADD_ROOM
- Edoors::Room.from_particle_data p, self
+ Edoors::Room.from_particle p, self
end
@spin.release_p p
end
diff --git a/lib/edoors/spin.rb b/lib/edoors/spin.rb
index 9f62b47..7efacf1 100644
--- a/lib/edoors/spin.rb
+++ b/lib/edoors/spin.rb
@@ -23,6 +23,25 @@ module Edoors
#
class Spin < Room
#
+ # creates a Spin object from the arguments.
+ #
+ # @param [String] n the name of this Spin
+ # @param [Hash] o a customizable set of options
+ #
+ # @option o 'debug_garbage' [String Symbol]
+ # output debug information about automatic garbage
+ # @option o 'debug_routing' [String Symbol]
+ # output debug information about routing
+ # @option o 'hibernation' [Boolean]
+ # if set to true Iota#start! won't be called within Spin#spin!
+ # @option o 'inner_room' [Hash]
+ # composed of 2 keys, 'iotas' and 'links' use to repopulate the super class Room
+ # @option o 'app_fifo' [Array]
+ # list of Particle to feed @app_fifo
+ # @option o 'sys_fifo' [Array]
+ # list of Particle to feed @sys_fifo
+ #
+ #
def initialize n, o={}
super n, nil
#
@@ -34,7 +53,7 @@ module Edoors
@run = false
@hibernation = o['hibernation']||false
@hibernate_path = 'edoors-hibernate-'+n+'.json'
- @debug_errors = o[:debug_errors]||o['debug_errors']||false
+ @debug_garbage = o[:debug_garbage]||o['debug_garbage']||false
@debug_routing = o[:debug_routing]||o['debug_routing']||false
#
if not o.empty?
@@ -58,7 +77,11 @@ module Edoors
end
end
#
- attr_accessor :run, :hibernate_path, :debug_errors, :debug_routing
+ attr_accessor :run, :hibernate_path, :debug_garbage, :debug_routing
+ #
+ # called by JSON#generate to serialize the Spin object into JSON data
+ #
+ # @param [Array] a belongs to JSON generator
#
def to_json *a
{
@@ -69,25 +92,46 @@ module Edoors
'inner_room' => { :iotas=>@iotas, :links=>@links },
'sys_fifo' => @sys_fifo,
'app_fifo' => @app_fifo,
- 'debug_errors' => @debug_errors,
+ 'debug_garbage' => @debug_garbage,
'debug_routing' => @debug_routing
}.to_json(*a)
end
#
+ # creates a Spin object from a JSON data
+ #
+ # @param [Hash] o belongs to JSON parser
+ #
+ # @raise Edoors::Exception if the json kls attribute is wrong
+ #
def self.json_create o
raise Edoors::Exception.new "JSON #{o['kls']} != #{self.name}" if o['kls'] != self.name
self.new o['name'], o
end
#
+ # add the given Iota to the global Hash
+ #
+ # @param [Iota] iota the Iota to register
+ #
+ # @see Room#_route @world hash is used for routing
+ #
def add_to_world iota
@world[iota.path] = iota
end
#
+ # search the global Hash for the matching Iota
+ #
+ # @param [String] path the path to the desired Iota
+ #
+ # @see Room#_route @world hash is used for routing
+ #
def search_world path
@world[path]
end
#
+ # clears all the structures
+ #
def clear!
+ @links.clear
@iotas.clear
@world.clear
@pool.clear
@@ -95,6 +139,13 @@ module Edoors
@app_fifo.clear
end
#
+ # releases the given Particle
+ #
+ # @parama [Particle] p the Particle to be released
+ #
+ # @note the Particle is stored into Hash @pool to be reused as soon as needed
+ #
+ # @see Particle#reset! the Particle is reseted before beeing stored
#
def release_p p
# hope there is no circular loop
@@ -105,6 +156,12 @@ module Edoors
( @pool[p.class] ||= [] ) << p
end
#
+ # requires a Particle of the given Class
+ #
+ # @param [Class] p_kls the desired Class of Particle
+ #
+ # @note if there is no Particle of the given Class, one is created
+ #
def require_p p_kls
l = @pool[p_kls]
return p_kls.new if l.nil?
@@ -113,14 +170,26 @@ module Edoors
p
end
#
+ # add the given Particle to the application Particle fifo
+ #
+ # @param [Particle] p the Particle to add
+ #
def post_p p
@app_fifo << p
end
#
+ # add the given Particle to the system Particle fifo
+ #
+ # @param [Particle] p the Particle to add
+ #
def post_sys_p p
@sys_fifo << p
end
#
+ # process the given particle
+ #
+ # @param [Particle] p the Particle to be processed
+ #
def process_sys_p p
if p.action==Edoors::SYS_ACT_HIBERNATE
stop!
@@ -130,6 +199,12 @@ module Edoors
end
end
#
+ # starts the system mainloop
+ #
+ # first Iota#start! is called on each children unless the system is resuming from hibernation
+ # then while there is Particle in the fifo, first process all system Particle then 1 application Particle
+ # after all Iota#stop! is called on each children, unless the system is going into hibernation
+ #
def spin!
@iotas.values.each do |iota| iota.start! end unless @hibernation
@run = true
@@ -148,15 +223,27 @@ module Edoors
@iotas.values.each do |iota| iota.stop! end unless @hibernation
end
#
+ # stops the spinning
+ #
def stop!
@run=false
end
#
+ # sends the system into hibernation
+ #
+ # @param [String] path the path to the hibernation file
+ #
+ # the system is serialized into JSON data and flushed to disk
+ #
def hibernate! path=nil
@hibernation = true
File.open(path||@hibernate_path,'w') do |f| f << JSON.pretty_generate(self) end
end
#
+ # resumes the system from the given hibernation file
+ #
+ # @param [String] path the hibernation file to load the system from
+ #
def self.resume! path
self.json_create JSON.load File.open(path,'r') { |f| f.read }
end
diff --git a/spec/board_spec.rb b/spec/board_spec.rb
index 7e291c6..1b2e0c4 100644
--- a/spec/board_spec.rb
+++ b/spec/board_spec.rb
@@ -16,11 +16,11 @@ describe Edoors::Board do
#
it "require_p release_p" do
board = Edoors::Board.new 'hell', @spin
- p0 = board.require_p Edoors::Particle
+ p0 = board.require_p
p1 = board.require_p Edoors::Particle
(p0===p1).should be_false
board.release_p p0
- p2 = board.require_p Edoors::Particle
+ p2 = board.require_p
(p0===p2).should be_true
end
#
@@ -29,14 +29,14 @@ describe Edoors::Board do
p0['k0'] = 'v0'
p0['k1'] = 'neither'
p0['k2'] = 'v2'
- p0.set_link_fields 'k0,k2'
- p0.link_value.should eql 'v0v2'
+ p0.set_link_keys 'k0', 'k2'
+ p0.link_value.should == {'k0'=>'v0','k2'=>'v2'}
p1 = Edoors::Particle.new
p1['k0'] = 'v0'
p1['k1'] = 'nore'
p1['k2'] = 'v2'
- p1.set_link_fields 'k0,k2'
- p1.link_value.should eql 'v0v2'
+ p1.set_link_keys 'k0', 'k2'
+ p1.link_value.should == {'k0'=>'v0','k2'=>'v2'}
P0 = p0
P1 = p1
class Board0 < Edoors::Board
@@ -79,7 +79,7 @@ describe Edoors::Board do
p0 = Edoors::Particle.new
p1 = Edoors::Particle.new
p1['v0']=0
- p1.set_link_fields 'v0'
+ p1.set_link_keys 'v0'
board.process_p p0
board.process_p p1
hell = Edoors::Board.json_create( JSON.load( JSON.generate(board) ) )
diff --git a/spec/door_spec.rb b/spec/door_spec.rb
index 0c2dafe..d86bb5a 100644
--- a/spec/door_spec.rb
+++ b/spec/door_spec.rb
@@ -17,10 +17,10 @@ describe Edoors::Door do
it "require_p release_p" do
door = Edoors::Door.new 'hell', @spin
p0 = door.require_p Edoors::Particle
- p1 = door.require_p Edoors::Particle
+ p1 = door.require_p
(p0===p1).should be_false
door.release_p p0
- p2 = door.require_p Edoors::Particle
+ p2 = door.require_p
(p0===p2).should be_true
end
#
@@ -67,7 +67,7 @@ describe Edoors::Door do
p0.add_dst 'RELEASE'
p0.split_dst!
d0.process_p p0
- p1 = d0.require_p Edoors::Particle
+ p1 = d0.require_p
p1.should be p0
p0.clear_dsts!
#
diff --git a/spec/link_spec.rb b/spec/link_spec.rb
index 0de1d93..49f086a 100644
--- a/spec/link_spec.rb
+++ b/spec/link_spec.rb
@@ -10,26 +10,23 @@ describe Edoors::Link do
@spin = Edoors::Spin.new 'dom0'
p = @spin.require_p Edoors::Particle
p.set_data Edoors::LNK_SRC, 'input1'
- p.set_data Edoors::LNK_DSTS, 'concat1?follow,output1'
- p.set_data Edoors::LNK_FIELDS, 'f0,f2'
- p.set_data Edoors::LNK_CONDF, 'f0,f1,f2'
- p.set_data Edoors::LNK_CONDV, 'v0v1v2'
- lnk = Edoors::Link.from_particle_data p
+ p.set_data Edoors::LNK_DSTS, ['concat1?follow','output1']
+ p.set_data Edoors::LNK_KEYS, ['f0','f2']
+ p.set_data Edoors::LNK_VALUE, {'f0'=>'v0','f1'=>'v1','f2'=>'v2'}
+ lnk = Edoors::Link.from_particle 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'
+ lnk.dsts.should eql ['concat1?follow','output1']
+ lnk.keys.should eql ['f0','f2']
+ lnk.value.should == {'f0'=>'v0','f1'=>'v1','f2'=>'v2'}
end
#
it "link->json->link" do
- link = Edoors::Link.new 'input1', 'concat1?follow,output1', 'f0,f2', 'f0,f1,f2', 'v0v1v2'
+ link = Edoors::Link.new 'input1', ['concat1?follow','output1'], ['f0','f2'], {'f0'=>'v0','f1'=>'v1','f2'=>'v2'}
lnk = Edoors::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
+ link.keys.should eql lnk.keys
+ link.value.should eql lnk.value
JSON.generate(link).should eql JSON.generate(lnk)
end
#
diff --git a/spec/particle_spec.rb b/spec/particle_spec.rb
index fe6508f..8d926ef 100644
--- a/spec/particle_spec.rb
+++ b/spec/particle_spec.rb
@@ -74,7 +74,7 @@ describe Edoors::Particle do
d1 = Edoors::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.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
@@ -155,7 +155,7 @@ describe Edoors::Particle do
p.action.should eql 'action'
p.clear_dsts!
#
- p.add_dsts 'door?action,?action'
+ p.add_dsts 'door?action', '?action'
p.split_dst!
p.room.should be_nil
p.door.should eql 'door'
@@ -175,7 +175,7 @@ describe Edoors::Particle do
p = Edoors::Particle.new
d = Edoors::Door.new 'door', nil
p.init! d
- p.add_dsts 'door?action,?action'
+ p.add_dsts 'door?action', '?action'
p.next_dst.should eql 'door?action'
p.error! 'err_msg'
p[Edoors::FIELD_ERROR_MSG].should eql 'err_msg'
@@ -183,17 +183,30 @@ describe Edoors::Particle do
p.dst.should be d
end
#
- it "link fields and link value" do
+ it "link keys and link values" do
+ p = Edoors::Particle.new
+ p['k0'] = 'v0'
+ p.set_data 'k1', 'v1'
+ p['k2'] = 'v2'
+ p['k3'] = 'v3'
+ p.set_link_keys 'k0', 'k2', 'k1'
+ p.link_value.should == {'k0'=>'v0','k1'=>'v1','k2'=>'v2'}
+ p.del_data 'k0'
+ p.link_value.should == {'k1'=>'v1','k2'=>'v2'}
+ p.set_link_keys 'k1', 'k0'
+ p.link_value.should == {'k1'=>'v1'}
+ p['k1']='vX'
+ p.link_value.should == {'k1'=>'vX'}
+ end
+ #
+ it 'link_with?' do
p = Edoors::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'
+ p.link_with?(Edoors::Link.new('', '', '')).should be_true
+ p.link_with?(Edoors::Link.new('', '', '', {'k0'=>'v0','k1'=>'v1'})).should be_true
+ p.link_with?(Edoors::Link.new('', '', '', {'k0'=>'v2','k1'=>'v1'})).should be_false
end
#
it "apply_link!" do
@@ -201,18 +214,18 @@ describe Edoors::Particle do
p['k0'] = 'v0'
p['k1'] = 'v1'
p['k2'] = 'v2'
- p.set_link_fields 'k0,k2'
- p.add_dsts 'door?action,?action'
+ p.set_link_keys 'k0', 'k2'
+ p.add_dsts 'door?action', '?action'
p.src.should be_nil
- p.link_value.should eql 'v0v2'
+ p.link_value.should == {'k0'=>'v0','k2'=>'v2'}
p.next_dst.should eql 'door?action'
- lnk = Edoors::Link.new('door0', 'door1?get,door2', 'k1', 'f0,f1', 'v0v1')
+ lnk = Edoors::Link.new('door0', ['door1?get','door2'], 'k1', {'f0'=>'v0','f1'=>'v1'})
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'
+ p.link_value.should == {'k1'=>'v1'}
end
#
it "particle->json->particle" do
@@ -226,8 +239,8 @@ describe Edoors::Particle do
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.set_link_keys 'k0', 'k2'
+ p0.add_dsts 'room0/room1/room2/doorX?myaction', 'door?action', '?action'
p0.split_dst!
p1 = Edoors::Particle.new
p1['k3'] = 'v6'
@@ -235,8 +248,8 @@ describe Edoors::Particle do
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'
+ p1.set_link_keys 'k5', 'k4', 'k3'
+ p1.add_dsts 'room0/room1/door?action', 'output?action'
p0.merge! p1
o = JSON.load( JSON.generate(p0) )
o['spin'] = s0
@@ -248,7 +261,7 @@ describe Edoors::Particle do
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.link_value.should == {'k0'=>'v0','k2'=>'v2'}
px['k0'].should eql 'v0'
px['k1'].should eql 'v1'
px['k2'].should eql 'v2'
@@ -260,7 +273,7 @@ describe Edoors::Particle do
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.link_value.should == {'k3'=>'v6','k4'=>'v7','k5'=>'v8'}
py['k3'].should eql 'v6'
py['k4'].should eql 'v7'
py['k5'].should eql 'v8'
diff --git a/spec/room_spec.rb b/spec/room_spec.rb
index de697c1..3757951 100644
--- a/spec/room_spec.rb
+++ b/spec/room_spec.rb
@@ -203,7 +203,7 @@ describe Edoors::Room do
room0 = Edoors::Room.new 'room0', @spin
door0 = Edoors::Door.new 'door0', room0
door1 = Edoors::Door.new 'door1', room0
- room0.add_link Edoors::Link.new('door0', 'door1', 'fields', 'f0,f1', 'v0v1')
+ room0.add_link Edoors::Link.new('door0', 'door1', 'keys', {'f0'=>'v0','f1'=>'v1'})
p = @spin.require_p Edoors::Particle
p['f0']='v0'
p['f1']='v1'
@@ -225,14 +225,16 @@ describe Edoors::Room do
end
door1 = Out.new 'door1', room0
room0.add_link Edoors::Link.new('door0', 'door1')
- room0.add_link Edoors::Link.new('door0', 'door1', 'fields', 'f0,f1', 'v0v1')
- room0.add_link Edoors::Link.new('door0', 'door1', 'fields', 'f0,f1', 'v0v2')
+ room0.add_link Edoors::Link.new('door0', 'door1', 'keys', {'f0'=>'v0'})
+ room0.add_link Edoors::Link.new('door0', 'door1', 'keys', {'f0'=>'v0','f1'=>'v1'})
+ room0.add_link Edoors::Link.new('door0', 'door1', 'keys', {'f0'=>'v0','f1'=>'v2'})
+ room0.add_link Edoors::Link.new('door0', 'door1', 'keys', {'f0'=>'v0','f2'=>'v1'})
p = @spin.require_p Edoors::Particle
p['f0']='v0'
p['f1']='v1'
door0.send_p p
@spin.spin!
- door1.count.should eql 2
+ door1.count.should eql 3
end
#
it "system route error: system no destination" do
@@ -278,9 +280,8 @@ describe Edoors::Room do
p0 = @spin.require_p Edoors::Particle
p0.set_data Edoors::LNK_SRC, 'door0'
p0.set_data Edoors::LNK_DSTS, 'door1'
- p0.set_data Edoors::LNK_FIELDS, 'fields'
- p0.set_data Edoors::LNK_CONDF, 'f0,f1'
- p0.set_data Edoors::LNK_CONDV, 'v0v1'
+ p0.set_data Edoors::LNK_KEYS, 'keys'
+ p0.set_data Edoors::LNK_VALUE, {'f0'=>'v0','f1'=>'v1'}
p0.add_dst Edoors::SYS_ACT_ADD_LINK, room0.path
room0.send_sys_p p0
@spin.spin!
@@ -318,10 +319,10 @@ describe Edoors::Room do
d0 = Edoors::Door.new 'd0', r1
d1 = Edoors::Door.new 'd1', r1
d2 = Edoors::Door.new 'd2', r2
- r1.add_link Edoors::Link.new('d0', 'd1', 'fields', 'f0,f1', 'v0v1')
+ r1.add_link Edoors::Link.new('d0', 'd1', 'keys', {'f0'=>'v0','f1'=>'v1'})
r1.add_link Edoors::Link.new('d0', 'd2')
r1.add_link Edoors::Link.new('d1', 'd0')
- r2.add_link Edoors::Link.new('d2', 'd1', 'fies', 'f5,f1', 'v9v1')
+ r2.add_link Edoors::Link.new('d2', 'd1', 'fies', {'f5'=>'v9','f1'=>'v1'})
rx = Edoors::Room.json_create( JSON.load( JSON.generate(r0) ) )
JSON.generate(r0).should eql JSON.generate(rx)
end#
diff --git a/spec/spin_spec.rb b/spec/spin_spec.rb
index 9ceebf8..9c2e2ea 100644
--- a/spec/spin_spec.rb
+++ b/spec/spin_spec.rb
@@ -86,10 +86,10 @@ describe Edoors::Spin do
it "option debug" do
spin = Edoors::Spin.new 'dom0'
spin.debug_routing.should be false
- spin.debug_errors.should be false
- spin = Edoors::Spin.new 'dom0', :debug_routing=>true, :debug_errors=>true
+ spin.debug_garbage.should be false
+ spin = Edoors::Spin.new 'dom0', :debug_routing=>true, :debug_garbage=>true
spin.debug_routing.should be true
- spin.debug_errors.should be true
+ spin.debug_garbage.should be true
end
#
it "search world" do
@@ -129,7 +129,7 @@ describe Edoors::Spin do
p0.add_dst Edoors::SYS_ACT_HIBERNATE
Edoors::Room.new 'input', spin
Edoors::Room.new 'output', spin
- spin.add_link Edoors::Link.new('input', 'output', nil, nil, nil)
+ spin.add_link Edoors::Link.new('input', 'output', nil, nil)
spin.send_sys_p p0
spin.spin!
dom0 = Edoors::Spin.resume! spin.hibernate_path
diff --git a/test/test_iotas.rb b/test/test_iotas.rb
index 59c9552..333d514 100644
--- a/test/test_iotas.rb
+++ b/test/test_iotas.rb
@@ -136,7 +136,7 @@ class OutputDoor < Edoors::Door
#
end
#
-spin = Edoors::Spin.new 'dom0', :debug_routing=>false, :debug_errors=>true
+spin = Edoors::Spin.new 'dom0', :debug_routing=>false, :debug_garbage=>true
#
room0 = Edoors::Room.new 'room0', spin
room1 = Edoors::Room.new 'room1', spin
@@ -148,14 +148,13 @@ input1 = InputDoor.new 'input1', room1
output1 = OutputDoor.new 'output1', room1, true
concat1 = ConcatBoard.new 'concat1', room1
#
-room0.add_link Edoors::Link.new('input0', 'output0', nil, nil, nil)
+room0.add_link Edoors::Link.new('input0', 'output0', nil, nil)
#
p0 = spin.require_p Edoors::Particle
p0.set_data Edoors::LNK_SRC, 'input1'
-p0.set_data Edoors::LNK_DSTS, 'concat1?follow,output1'
-p0.set_data Edoors::LNK_FIELDS, 'f0,f2'
-p0.set_data Edoors::LNK_CONDF, 'f0,f1,f2'
-p0.set_data Edoors::LNK_CONDV, 'v0v1v2'
+p0.set_data Edoors::LNK_DSTS, ['concat1?follow','output1']
+p0.set_data Edoors::LNK_KEYS, ['f0','f2']
+p0.set_data Edoors::LNK_VALUE, {'f0'=>'v0','f1'=>'v1','f2'=>'v2'}
p0.add_dst Edoors::SYS_ACT_ADD_LINK, room1.path
room1.send_sys_p p0 # send_sys_p -> room0 -> spin -> room1 -> input1
#