lib/nyaplot/base.rb in nyaplot-0.1.6 vs lib/nyaplot/base.rb in nyaplot-0.2.0.rc1
- old
+ new
@@ -1,71 +1,105 @@
require 'json'
module Nyaplot
+ module Base
+ attr_accessor :dependency, :uuid
- # The module to be included by internal classes
- module Jsonizable
-
def self.included(cls)
- cls.extend ClassMethod
+ cls.extend ClassMethods
end
- def before_to_json
+ # @example
+ # Glyph::Scatter.new(data: data, x: :x, y: :y)
+ # #-> #<Nyaplot::Glyph::Scatter|0aff1e>
+ #
+ def initialize(*args)
+ @uuid = SecureRandom.uuid
+ @dependency= []
+ @args = {}
+
+ class << @args
+ def to_json(*args)
+ args_ = self.reduce({}) do |memo, val|
+ memo[val[0]]= val[1].is_a?(Nyaplot::Base) ? {sync: val[1].uuid} : val[1]
+ memo
+ end
+ args_.to_json
+ end
+ end
+
+ self.attr(args.first) if args.length == 1 && args.first.is_a?(Hash)
end
- # This method should be excuted when initializing class includes Jsonizable
- def init_properties
- @properties = {}
+ def attr(hash)
+ hash.each do |val|
+ self.send(val[0], val[1])
+ end
end
- def to_json(*args)
- before_to_json
- @properties.to_json
+ def add_dependency(*given)
+ given.each do |obj|
+ raise RuntimeError unless obj.is_a?(Nyaplot::Base)
+ @dependency.push(obj)
+ end
end
- # Prepared to expressly set property
- def set_property(symbol, val)
- self.send(symbol, val)
+ def remove_dependency(obj)
+ @dependency.delete(obj)
end
- # Prepared to expressly get property
- def get_property(symbol)
- self.send(symbol)
+ def verify
+ raise "Type name should be specified" if self.class.class_variable_get("@@type".to_sym).nil?
+ args = self.class.class_variable_get("@@required_args".to_sym)
+ args.each do |s|
+ raise s.to_s + " of " + self.to_s + " should be set" unless @args.has_key?(s)
+ end
end
- module ClassMethod
+ # over-write it
+ def before_to_json
+ end
- # Define getter/setter for each property
- # @param [Symbol] symbols Name for each property
- def define_properties(*symbols)
- symbols.each do |symbol|
- define_method(symbol) {|val=nil|
- return @properties[symbol] if val.nil?
- @properties[symbol] = val
- return self
- }
+ def to_json(*args)
+ before_to_json
+ verify
+ {
+ type: self.class.class_variable_get("@@type".to_sym),
+ uuid: @uuid,
+ args: @args
+ }.to_json
+ end
+
+ module ClassMethods
+ def type(symbol)
+ self.class_variable_set("@@type".to_sym, symbol)
+ end
+
+ private
+ def define_accessor(s)
+ define_method(s) do |val=nil|
+ next @args[s] if val.nil?
+ if val.is_a? Nyaplot::Base
+ remove_dependency(@args[s]) unless @args[s].nil?
+ add_dependency(val)
+ end
+ @args[s] = val
+ self
end
end
- # Define getter/setter for each property and group.
- # Grouped properties will be merged into one parameter when running to_json.
- # @param [Symbol] name Group name
- # @param [Symbol] symbols Name for each property
- # @example
- # define_group_properties(:options, [:hoge, :nya]) #The methods :options, :hoge, :nya are defined
- # options({})
- # hoge(3)
- # nya(4)
- # some_instance.to_json #-> {options:{hoge: 3, nya:4}}
- def define_group_properties(name, symbols)
- define_properties(name)
- symbols.each do |symbol|
- define_method(symbol) {|val=nil|
- return @properties[name][symbol] if val.nil?
- @properties[name][symbol] = val
- return self
- }
+ def required_args(*symbols)
+ name = "@@required_args".to_sym
+ arr = (self.class_variable_defined?(name) ? self.class_variable_get(name) : [])
+ self.class_variable_set(name, arr.concat(symbols))
+
+ symbols.each do |s|
+ define_accessor s
end
+ end
+
+ def optional_args(*symbols)
+ symbols.each {|s| define_accessor s}
end
end
end
end