diff --git a/lib/gon-sinatra.rb b/lib/gon-sinatra.rb index 9a0d6b8..c6b3995 100644 --- a/lib/gon-sinatra.rb +++ b/lib/gon-sinatra.rb @@ -1,77 +1,12 @@ require 'sinatra' +require 'gon/sinatra/store' require 'gon/sinatra/helpers' require 'gon/sinatra/rabl' module Gon module Sinatra - class << self - def all_variables - @request_env[:gon] - end - - def clear - @request_env[:gon] = {} - end - - def request_env=(environment) - @request_env = environment - @request_env[:gon] ||= {} - end - - def request_env - if defined?(@request_env) - return @request_env - end - end - - def request - @request_id if defined? @request_id - end - - def request=(request_id) - @request_id = request_id - end - - def method_missing(m, *args, &block) - if ( m.to_s =~ /=$/ ) - if public_methods.include? m.to_s[0..-2].to_sym - raise "You can't use Gon public methods for storing data" - end - set_variable(m.to_s.delete('='), args[0]) - else - get_variable(m.to_s) - end - end - - def get_variable(name) - @request_env[:gon][name] - end - - def set_variable(name, value) - @request_env[:gon][name] = value - end - - def rabl(view_path, options = {}) - unless options[:instance] - raise ArgumentError.new("You should pass :instance in options: :instance => self") - end - - rabl_data = Gon::Sinatra::Rabl.parse_rabl(view_path, options[:instance]) - - if options[:as] - set_variable(options[:as].to_s, rabl_data) - elsif rabl_data.is_a? Hash - rabl_data.each do |key, value| - set_variable(key, value) - end - else - set_variable('rabl', rabl_data) - end - end - - def jbuilder(view_path, options = {}) - raise NoMethodError.new("Not available for sinatra") - end + def self.registered(base) + base.helpers(Gon::Sinatra::GonHelpers, Gon::Sinatra::Helpers) end end end diff --git a/lib/gon/sinatra/helpers.rb b/lib/gon/sinatra/helpers.rb index ccc6683..e0de7ab 100644 --- a/lib/gon/sinatra/helpers.rb +++ b/lib/gon/sinatra/helpers.rb @@ -4,8 +4,8 @@ module Gon module Sinatra module Helpers def include_gon(options = {}) - if Gon::Sinatra.request_env && Gon::Sinatra.all_variables.present? - data = Gon::Sinatra.all_variables + if gon.all_variables.present? + data = gon.all_variables namespace = options[:namespace] || 'gon' script = "" + instance.include_gon.should == "" end it 'returns exception if try to set public method as variable' do - Gon::Sinatra.clear - lambda { Gon::Sinatra.all_variables = 123 }.should raise_error + @gon.clear + lambda { @gon.all_variables = 123 }.should raise_error end it 'should be threadsafe' do - instance1 = Sinatra::Base.new! - instance2 = Sinatra::Base.new! + instance1 = app() + instance2 = app() instance1.gon.test = "foo" instance2.gon.test = "bar" instance1.gon.test.should == "foo" end - it 'render json from rabl template' do - Gon::Sinatra.clear + @gon.clear @objects = [1,2] Gon::Sinatra.rabl 'spec/test_data/sample.rabl', :instance => self Gon::Sinatra.objects.length.should == 2