Class: Object
- Inherits:
- BasicObject
- Defined in:
- lib/rfm/utilities/sax_parser.rb,
lib/rfm/utilities/core_ext.rb
Overview
CORE ADDITIONS #####
Constant Summary collapse
- ATTACH_OBJECT_DEFAULT_OPTIONS =
{ :shared_variable_name => SHARED_VARIABLE_NAME, :default_class => DEFAULT_CLASS, :text_label => TEXT_LABEL, :create_accessors => [] #:all, :private, :shared, :hash }
Class Method Summary collapse
-
.meta_attr_accessor(*names) ⇒ Object
Adds methods to put instance variables in rfm_metaclass, plus getter/setters This is useful to hide instance variables in objects that would otherwise show “too much” information.
- .meta_attr_reader(*names) ⇒ Object
- .meta_attr_writer(*names) ⇒ Object
Instance Method Summary collapse
-
#_attach_as_instance_variables(hash, options = {}) ⇒ Object
Attach hash as individual instance variables to self.
-
#_attach_object!(obj, *args) ⇒ Object
Master method to attach any object to this object.
-
#_create_accessor(name) ⇒ Object
NEW.
-
#_get_attribute(name, shared_var_name = nil, options = {}) ⇒ Object
Get an instance variable, a member of a shared instance variable, or a hash value of self.
- #_merge_delimited_object!(obj, delimit_name) ⇒ Object
-
#_merge_instance!(obj, name, delimiter, prefs, type, options = {}) ⇒ Object
Merge a named object with the specified instance variable of self.
-
#_merge_object!(obj, name, delimiter, prefs, type, options = {}) ⇒ Object
Master method to merge any object with this object.
-
#_merge_shared!(obj, name, delimiter, prefs, type, options = {}) ⇒ Object
Merge a named object with the shared instance variable of self.
-
#rfm_force_array ⇒ Object
Wrap an object in Array, if not already an Array, since XmlMini doesn’t know which will be returnd for any particular element.
-
#rfm_local_methods ⇒ Object
Just testing this functionality.
Class Method Details
.meta_attr_accessor(*names) ⇒ Object
Adds methods to put instance variables in rfm_metaclass, plus getter/setters This is useful to hide instance variables in objects that would otherwise show “too much” information.
14 15 16 17 |
# File 'lib/rfm/utilities/core_ext.rb', line 14 def self.(*names) (*names) (*names) end |
.meta_attr_reader(*names) ⇒ Object
19 20 21 22 23 |
# File 'lib/rfm/utilities/core_ext.rb', line 19 def self.(*names) names.each do |n| define_method(n.to_s) {.instance_variable_get("@#{n}")} end end |
.meta_attr_writer(*names) ⇒ Object
25 26 27 28 29 |
# File 'lib/rfm/utilities/core_ext.rb', line 25 def self.(*names) names.each do |n| define_method(n.to_s + "=") {|val| .instance_variable_set("@#{n}", val)} end end |
Instance Method Details
#_attach_as_instance_variables(hash, options = {}) ⇒ Object
Attach hash as individual instance variables to self. This is for manually attaching a hash of attributes to the current object. Pass in translation procs to alter the keys or values.
1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 |
# File 'lib/rfm/utilities/sax_parser.rb', line 1057 def _attach_as_instance_variables(hash, ={}) #hash.each{|k,v| instance_variable_set("@#{k}", v)} if hash.is_a? Hash key_translator = [:key_translator] value_translator = [:value_translator] #puts ["ATTACH_AS_INSTANCE_VARIABLES", key_translator, value_translator].join(', ') if hash.is_a? Hash hash.each do |k,v| (k = key_translator.call(k)) if key_translator (v = value_translator.call(k, v)) if value_translator instance_variable_set("@#{k}", v) end end end |
#_attach_object!(obj, *args) ⇒ Object
Master method to attach any object to this object.
916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 |
# File 'lib/rfm/utilities/sax_parser.rb', line 916 def _attach_object!(obj, *args) # name/label, collision-delimiter, attachment-prefs, type, *options: <options> #puts ["\nATTACH_OBJECT._attach_object", "self.class: #{self.class}", "obj.class: #{obj.class}", "obj.to_s: #{obj.to_s}", "args: #{args}"] = ATTACH_OBJECT_DEFAULT_OPTIONS.merge(args.last.is_a?(Hash) ? args.pop : {}){|key, old, new| new || old} # name = (args[0] || options[:name]) # delimiter = (args[1] || options[:delimiter]) prefs = (args[2] || [:prefs]) # type = (args[3] || options[:type]) return if (prefs=='none' || prefs=='cursor') #['none', 'cursor'].include? prefs ... not sure which is faster. self._merge_object!( obj, args[0] || [:name] || 'unknown_name', args[1] || [:delimiter], prefs, args[3] || [:type], ) # case # when prefs=='none' || prefs=='cursor'; nil # when name # self._merge_object!(obj, name, delimiter, prefs, type, options) # else # self._merge_object!(obj, 'unknown_name', delimiter, prefs, type, options) # end #puts ["\nATTACH_OBJECT RESULT", self.to_yaml] #puts ["\nATTACH_OBJECT RESULT PORTALS", (self.portals.to_yaml rescue 'no portals')] end |
#_create_accessor(name) ⇒ Object
NEW
1048 1049 1050 1051 1052 |
# File 'lib/rfm/utilities/sax_parser.rb', line 1048 def _create_accessor(name) #puts "OBJECT._create_accessor '#{name}' for Object '#{self.class}'" = (class << self; self; end) .send(:attr_reader, name.to_sym) end |
#_get_attribute(name, shared_var_name = nil, options = {}) ⇒ Object
Get an instance variable, a member of a shared instance variable, or a hash value of self.
1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 |
# File 'lib/rfm/utilities/sax_parser.rb', line 1015 def _get_attribute(name, shared_var_name=nil, ={}) return unless name #puts ["\n\n", self.to_yaml] #puts ["OBJECT_get_attribute", self.class, self.instance_variables, name, shared_var_name, options].join(', ') (shared_var_name = [:shared_variable_name]) unless shared_var_name rslt = case when self.is_a?(Hash) && self[name]; self[name] when ((var= instance_variable_get("@#{shared_var_name}")) && var[name]); var[name] else instance_variable_get("@#{name}") end #puts "OBJECT#_get_attribute: name '#{name}' shared_var_name '#{shared_var_name}' options '#{options}' rslt '#{rslt}'" rslt end |
#_merge_delimited_object!(obj, delimit_name) ⇒ Object
1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 |
# File 'lib/rfm/utilities/sax_parser.rb', line 1003 def _merge_delimited_object!(obj, delimit_name) #puts "MERGING DELIMITED OBJECT self #{self.class} obj #{obj.class} delimit_name #{delimit_name}" case when self[delimit_name].nil?; self[delimit_name] = obj when self[delimit_name].is_a?(Hash); self[delimit_name].merge!(obj) when self[delimit_name].is_a?(Array); self[delimit_name] << obj else self[delimit_name] = [self[delimit_name], obj] end end |
#_merge_instance!(obj, name, delimiter, prefs, type, options = {}) ⇒ Object
Merge a named object with the specified instance variable of self.
965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 |
# File 'lib/rfm/utilities/sax_parser.rb', line 965 def _merge_instance!(obj, name, delimiter, prefs, type, ={}) #puts ["\nOBJECT._merge_instance!", "self.class: #{self.class}", "obj.class: #{obj.class}", "name: #{name}", "delimiter: #{delimiter}", "prefs: #{prefs}", "type: #{type}", "options.keys: #{options.keys}", '_end_merge_instance!'] #.join(', ') rslt = if instance_variable_get("@#{name}") || delimiter if delimiter delimit_name = obj._get_attribute(delimiter, [:shared_variable_name]).to_s.downcase #puts ["\n_setting_with_delimiter", delimit_name] #instance_variable_set("@#{name}", instance_variable_get("@#{name}") || options[:default_class].new)[delimit_name]=obj # This line is more efficient than the above line. instance_variable_set("@#{name}", [:default_class].new) unless instance_variable_get("@#{name}") # This line was active in 3.0.9.pre01, but it was inserting each portal array as an element in the array, # after all the Rfm::Record instances had been added. This was causing an potential infinite recursion situation. # I don't think this line was supposed to be here - was probably an older piece of code. #instance_variable_get("@#{name}")[delimit_name]=obj #instance_variable_get("@#{name}")._merge_object!(obj, delimit_name, nil, nil, nil) # Trying to handle multiple portals with same table-occurance on same layout. # In parsing terms, this is trying to handle multiple elements who's delimiter field contains the SAME delimiter data. instance_variable_get("@#{name}")._merge_delimited_object!(obj, delimit_name) else #puts ["\_setting_existing_instance_var", name] if name == [:text_label] instance_variable_get("@#{name}") << obj.to_s else instance_variable_set("@#{name}", [instance_variable_get("@#{name}")].flatten << obj) end end else #puts ["\n_setting_new_instance_var", name] instance_variable_set("@#{name}", obj) end # NEW _create_accessor(name) if ([:create_accessors] & ['all','private']).any? rslt end |
#_merge_object!(obj, name, delimiter, prefs, type, options = {}) ⇒ Object
Master method to merge any object with this object
945 946 947 948 949 950 951 952 |
# File 'lib/rfm/utilities/sax_parser.rb', line 945 def _merge_object!(obj, name, delimiter, prefs, type, ={}) #puts ["\n-----OBJECT._merge_object", self.class, (obj.to_s rescue obj.class), name, delimiter, prefs, type.capitalize, options].join(', ') if prefs=='private' _merge_instance!(obj, name, delimiter, prefs, type, ) else _merge_shared!(obj, name, delimiter, prefs, type, ) end end |
#_merge_shared!(obj, name, delimiter, prefs, type, options = {}) ⇒ Object
Merge a named object with the shared instance variable of self.
955 956 957 958 959 960 961 962 |
# File 'lib/rfm/utilities/sax_parser.rb', line 955 def _merge_shared!(obj, name, delimiter, prefs, type, ={}) shared_var = instance_variable_get("@#{[:shared_variable_name]}") || instance_variable_set("@#{[:shared_variable_name]}", [:default_class].new) #puts "\n-----OBJECT._merge_shared: self '#{self.class}' obj '#{obj.class}' name '#{name}' delimiter '#{delimiter}' type '#{type}' shared_var '#{options[:shared_variable_name]} - #{shared_var.class}'" # TODO: Figure this part out: # The resetting of shared_variable_name to 'attributes' was to fix Asset.field_controls (it was not able to find the valuelive name). # I think there might be a level of hierarchy that is without a proper cursor model, when using shared variables & object delimiters. shared_var._merge_object!(obj, name, delimiter, nil, type, .merge(:shared_variable_name=>ATTACH_OBJECT_DEFAULT_OPTIONS[:shared_variable_name])) end |
#rfm_force_array ⇒ Object
Wrap an object in Array, if not already an Array, since XmlMini doesn’t know which will be returnd for any particular element. See Rfm Layout & Record where this is used.
34 35 36 37 |
# File 'lib/rfm/utilities/core_ext.rb', line 34 def rfm_force_array return [] if self.nil? self.is_a?(Array) ? self : [self] end |
#rfm_local_methods ⇒ Object
Just testing this functionality
40 41 42 |
# File 'lib/rfm/utilities/core_ext.rb', line 40 def rfm_local_methods self.methods - self.class.superclass.methods end |