lib/highcharts/base.rb in highcharts-js-rails-0.0.3 vs lib/highcharts/base.rb in highcharts-js-rails-0.1.0

- old
+ new

@@ -1,21 +1,52 @@ -require 'action_view' +require 'rails' -module Highcharts - class Base < ActionView::Base +class Highcharts + class Base - def initialize(*args) - args.extract_options!.each {|arg, value| self.send("#{arg}=", value)} - end + attr_reader :options, :default, :skip_quotation, :suboptions - def render_options(args) - attrs = [] - args.each do |t, a| - a.split.each do |option| - attrs << "#{option}: #{t == :objects ? send(option) : "'#{send(option)}'"}" if send(option).present? + def initialize(opts = {}) + @options = opts + @suboptions ||= {} + + # We want to make sure that options in the end is actually a Hash of options, or an Array of hashes of options. + # When default is defined in a subclass and the passed options are not a Hash or Array, we want to replace options + # with a Hash where the only key/value pair is the default key and the options value. + if !options.is_a?(Hash) || (options.is_a?(Array) && !options.first.is_a?(Hash)) + if default.present? + @options = {default => options} + else + raise ArgumentError, "You must pass a Hash to #{self.class}. You passed #{options.inspect}" end end - attrs + # If there is an option that is available as a suboption to the current class, + # let's set the option to an instance of that subclass. + options.each do |k, v| + @options[k] = "Highcharts::#{suboptions[k]}".constantize.new(v) if suboptions.keys.include?(k) + end + end + + def inspect + "#<#{self.class}:0x#{object_id} #{options.inspect}>" + end + + # This method is used in the parent class, Highcharts, in order to render the options in a JavaScript-friendly (JSON) format. + def to_json + json = options.collect do |k, v| + "\"#{k}\":" + + (suboptions.keys.include?(k) && !v.is_a?(Array) ? '{' : '') + + (v.is_a?(Array) && suboptions.keys.include?(k) ? "[{#{v.collect(&:to_json).join('},{')}}]" : check_quotation(k, v.to_json)) + + (suboptions.keys.include?(k) && !v.is_a?(Array) ? '}' : '') + end + json.join(',') + end + + # This method is used in #to_json to remove the first and last characters from an option's value. + # In the end this removes the encapsulating quotation marks (") from a specific option, provided + # it is included in the current class's skip_quotation array. + def check_quotation(key, json) + skip_quotation.present? && Array.wrap(skip_quotation).include?(key) ? json[1..-2] : json end end end