Skip to content

Commit 862f176

Browse files
committed
Start to refactoring gon
1 parent a4956a9 commit 862f176

File tree

6 files changed

+156
-81
lines changed

6 files changed

+156
-81
lines changed

gon.gemspec

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,4 +24,5 @@ Gem::Specification.new do |s|
2424
s.add_development_dependency "rspec"
2525
s.add_development_dependency "jbuilder"
2626
s.add_development_dependency "rake"
27+
s.add_development_dependency "ruby-debug19"
2728
end

lib/gon.rb

Lines changed: 23 additions & 80 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
end
44
require 'action_view'
55
require 'action_controller'
6+
require 'gon/base'
7+
require 'gon/request'
68
require 'gon/helpers'
79
require 'gon/escaper'
810
if defined?(Rabl)
@@ -16,106 +18,47 @@ module Gon
1618
class << self
1719

1820
def all_variables
19-
@request_env['gon']
21+
Request.gon
2022
end
2123

2224
def clear
23-
@request_env['gon'] = {}
25+
Request.clear
2426
end
2527

26-
def request_env=(environment)
27-
@request_env = environment
28-
@request_env['gon'] ||= {}
29-
end
28+
def method_missing(method, *args, &block)
29+
if ( method.to_s =~ /=$/ )
30+
if public_method_name? method
31+
raise "You can't use Gon public methods for storing data"
32+
end
3033

31-
def request_env
32-
if defined?(@request_env)
33-
return @request_env
34+
set_variable(method.to_s.delete('='), args[0])
35+
else
36+
get_variable(method.to_s)
3437
end
3538
end
3639

37-
def request
38-
@request_id if defined? @request_id
40+
def inspect
41+
'Gon'
3942
end
4043

41-
def request=(request_id)
42-
@request_id = request_id
43-
end
44-
45-
def method_missing(m, *args, &block)
46-
if ( m.to_s =~ /=$/ )
47-
if public_methods.include?(RUBY_VERSION > '1.9' ? m.to_s[0..-2].to_sym : m.to_s[0..-2])
48-
raise "You can't use Gon public methods for storing data"
49-
end
50-
set_variable(m.to_s.delete('='), args[0])
51-
else
52-
get_variable(m.to_s)
53-
end
54-
end
44+
private
5545

5646
def get_variable(name)
57-
@request_env['gon'][name]
47+
Request.gon[name]
5848
end
5949

6050
def set_variable(name, value)
61-
@request_env['gon'][name] = value
51+
Request.gon[name] = value
6252
end
6353

64-
%w(rabl jbuilder).each do |builder_name|
65-
define_method builder_name do |*options|
66-
if options.first.is_a? String
67-
warn "[DEPRECATION] view_path argument is now optional. If you need to specify it please use #{builder}(:template => 'path')"
68-
options = options.extract_options!.merge(:template => options[0])
54+
def public_method_name?(method)
55+
public_methods.include?(
56+
if RUBY_VERSION > '1.9'
57+
method.to_s[0..-2].to_sym
6958
else
70-
options = (options && options.first.is_a?(Hash)) ? options.first : { }
59+
method.to_s[0..-2]
7160
end
72-
73-
builder_module = get_builder(builder_name)
74-
75-
data = builder_module.send("parse_#{builder_name}", get_template_path(options, builder_name), get_controller(options))
76-
77-
if options[:as]
78-
set_variable(options[:as].to_s, data)
79-
elsif data.is_a? Hash
80-
data.each do |key, value|
81-
set_variable(key, value)
82-
end
83-
else
84-
set_variable(builder_name, data)
85-
end
86-
end
87-
end
88-
alias_method :orig_jbuilder, :jbuilder
89-
90-
def jbuilder(*options)
91-
raise NoMethodError.new('You can use Jbuilder support only in 1.9+') if RUBY_VERSION < '1.9'
92-
orig_jbuilder(*options)
93-
end
94-
95-
private
96-
97-
def get_builder(builder_name)
98-
begin
99-
"Gon::#{builder_name.classify}".constantize
100-
rescue
101-
raise NoMethodError.new("You should define #{builder_name.classify} in your Gemfile")
102-
end
103-
end
104-
105-
def get_controller(options)
106-
options[:controller] ||
107-
@request_env['action_controller.instance'] ||
108-
@request_env['action_controller.rescue.response'].
109-
instance_variable_get('@template').
110-
instance_variable_get('@controller')
111-
end
112-
113-
def get_template_path(options, extension)
114-
if options[:template]
115-
File.extname(options[:template]) == ".#{extension}" ? options[:template] : "#{options[:template]}.#{extension}"
116-
else
117-
"app/views/#{get_controller(options).controller_path}/#{get_controller(options).action_name}.json.#{extension}"
118-
end
61+
)
11962
end
12063

12164
end

lib/gon/base.rb

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
module Gon
2+
module Base
3+
class << self
4+
5+
def global
6+
Global
7+
end
8+
9+
protected
10+
11+
def check_method(method, *args, &block)
12+
13+
end
14+
15+
private
16+
17+
18+
19+
def get_variable(name)
20+
raise NotImplementedError
21+
end
22+
23+
def set_variable(name, value)
24+
raise NotImplementedError
25+
end
26+
27+
%w(rabl jbuilder).each do |builder_name|
28+
define_method builder_name do |*options|
29+
if options.first.is_a? String
30+
warn "[DEPRECATION] view_path argument is now optional. If you need to specify it please use #{builder}(:template => 'path')"
31+
options = options.extract_options!.merge(:template => options[0])
32+
else
33+
options = (options && options.first.is_a?(Hash)) ? options.first : { }
34+
end
35+
36+
builder_module = get_builder(builder_name)
37+
38+
data = builder_module.send("parse_#{builder_name}", get_template_path(options, builder_name), get_controller(options))
39+
40+
if options[:as]
41+
set_variable(options[:as].to_s, data)
42+
elsif data.is_a? Hash
43+
data.each do |key, value|
44+
set_variable(key, value)
45+
end
46+
else
47+
set_variable(builder_name, data)
48+
end
49+
end
50+
end
51+
alias_method :orig_jbuilder, :jbuilder
52+
53+
def jbuilder(*options)
54+
raise NoMethodError.new('You can use Jbuilder support only in 1.9+') if RUBY_VERSION < '1.9'
55+
orig_jbuilder(*options)
56+
end
57+
58+
private
59+
60+
def get_builder(builder_name)
61+
begin
62+
"Gon::#{builder_name.classify}".constantize
63+
rescue
64+
raise NoMethodError.new("You should define #{builder_name.classify} in your Gemfile")
65+
end
66+
end
67+
68+
def get_controller(options)
69+
options[:controller] ||
70+
@request_env['action_controller.instance'] ||
71+
@request_env['action_controller.rescue.response'].
72+
instance_variable_get('@template').
73+
instance_variable_get('@controller')
74+
end
75+
76+
def get_template_path(options, extension)
77+
if options[:template]
78+
File.extname(options[:template]) == ".#{extension}" ? options[:template] : "#{options[:template]}.#{extension}"
79+
else
80+
"app/views/#{get_controller(options).controller_path}/#{get_controller(options).action_name}.json.#{extension}"
81+
end
82+
end
83+
84+
end
85+
end
86+
end

lib/gon/global.rb

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
module Gon
2+
module Global
3+
class << self
4+
5+
attr_reader :vars
6+
7+
def method_missing
8+
end
9+
end
10+
end
11+
end

lib/gon/request.rb

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
module Gon
2+
module Request
3+
class << self
4+
5+
def env
6+
@request_env if defined? @request_env
7+
end
8+
9+
def env=(environment)
10+
@request_env = environment
11+
@request_env['gon'] ||= {}
12+
end
13+
14+
def request
15+
@request_id if defined? @request_id
16+
end
17+
18+
def request=(request_id)
19+
@request_id = request_id
20+
end
21+
22+
def gon
23+
env['gon'] if env
24+
end
25+
26+
def clear
27+
@request_env['gon'] = {}
28+
end
29+
30+
end
31+
end
32+
end

spec/gon/gon_spec.rb

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,9 @@
44
describe Gon do
55

66
before(:each) do
7-
Gon.request_env = {}
7+
# require 'ruby-debug'
8+
# debugger
9+
Gon::Request.env = {}
810
end
911

1012
describe '#all_variables' do

0 commit comments

Comments
 (0)