zorglub 0.0.2 → 0.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/Changelog +17 -1
- data/lib/zorglub/app.rb +2 -0
- data/lib/zorglub/config.rb +13 -1
- data/lib/zorglub/engines/haml.rb +25 -0
- data/lib/zorglub/node.rb +69 -27
- data/lib/zorglub.rb +1 -1
- data/spec/node_spec.rb +40 -0
- data/spec/spec_helper.rb +23 -2
- metadata +27 -26
data/Changelog
CHANGED
@@ -1,2 +1,18 @@
|
|
1
|
-
|
1
|
+
2011-05-26 Jérémy Zurcher <jeremy@asynk.ch>
|
2
2
|
* Project creation
|
3
|
+
|
4
|
+
2011-09-13 Jérémy Zurcher <jeremy@asynk.ch>
|
5
|
+
* usable WIP
|
6
|
+
|
7
|
+
2012-01-04 Jérémy Zurcher <jeremy@asynk.ch>
|
8
|
+
* lots of code cleanup
|
9
|
+
* replace Helpers Module with Node#inherited_var Node@inherited_vars
|
10
|
+
* rewrite session so it is compatible with Rack SessionHash
|
11
|
+
* update test application and write specs
|
12
|
+
|
13
|
+
2012-01-05 Jérémy Zurcher <jeremy@asynk.ch>
|
14
|
+
* haml engine
|
15
|
+
* optional engine cache
|
16
|
+
* optional engine proc mime-type definition
|
17
|
+
* optional static page generation/cache
|
18
|
+
*
|
data/lib/zorglub/app.rb
CHANGED
data/lib/zorglub/config.rb
CHANGED
@@ -9,10 +9,17 @@ module Zorglub
|
|
9
9
|
:layout => 'default',
|
10
10
|
:view_dir => 'view',
|
11
11
|
:layout_dir => 'layout',
|
12
|
+
:static_dir => 'static',
|
12
13
|
:session_on => false,
|
13
14
|
:session_key => 'zorglub.sid',
|
14
15
|
:session_secret => 'session-secret-secret',
|
15
|
-
:session_sid_len => 64
|
16
|
+
:session_sid_len => 64,
|
17
|
+
:engines_cache_enabled => true,
|
18
|
+
:haml_options => {
|
19
|
+
:format => :html5,
|
20
|
+
:ugly => false,
|
21
|
+
:encoding => 'utf-8'
|
22
|
+
}
|
16
23
|
#
|
17
24
|
}
|
18
25
|
@engines = { }
|
@@ -36,6 +43,11 @@ module Zorglub
|
|
36
43
|
( p.nil? ? File.join(@options[:root], @options[:layout_dir]) : p )
|
37
44
|
end
|
38
45
|
#
|
46
|
+
def static_base_path
|
47
|
+
p = @options[:static_path]
|
48
|
+
( p.nil? ? File.join(@options[:root], @options[:static_dir]) : p )
|
49
|
+
end
|
50
|
+
#
|
39
51
|
def register_engine name, ext, proc
|
40
52
|
return unless name
|
41
53
|
@engines[name]=[ ext, proc ]
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# -*- coding: UTF-8 -*-
|
2
|
+
#
|
3
|
+
require 'haml/util'
|
4
|
+
require 'haml/engine'
|
5
|
+
#
|
6
|
+
module Zorglub
|
7
|
+
module Engines
|
8
|
+
module Haml
|
9
|
+
def self.proc path,obj
|
10
|
+
if Zorglub::Config.engines_cache_enabled
|
11
|
+
key = path.sub Zorglub::Config.root,''
|
12
|
+
haml = obj.app.engines_cache[key] ||= ::Haml::Engine.new( File.open(path,'r'){|f| f.read }, Zorglub::Config.haml_options )
|
13
|
+
else
|
14
|
+
haml = ::Haml::Engine.new( File.open(path,'r'){|f| f.read }, Zorglub::Config.haml_options )
|
15
|
+
end
|
16
|
+
html = haml.render(obj)
|
17
|
+
return html, 'text/html'
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
#
|
23
|
+
Zorglub::Config.register_engine :haml, 'haml', Zorglub::Engines::Haml.method(:proc)
|
24
|
+
#
|
25
|
+
# EOF
|
data/lib/zorglub/node.rb
CHANGED
@@ -32,6 +32,11 @@ module Zorglub
|
|
32
32
|
@layout ||= Config.layout
|
33
33
|
end
|
34
34
|
#
|
35
|
+
def static val=nil
|
36
|
+
@static = val if (val==true or val==false)
|
37
|
+
@static ||=false
|
38
|
+
end
|
39
|
+
#
|
35
40
|
def inherited_var sym, *args
|
36
41
|
var = @inherited_vars[sym] ||=[]
|
37
42
|
unless args.empty?
|
@@ -41,7 +46,7 @@ module Zorglub
|
|
41
46
|
var
|
42
47
|
end
|
43
48
|
#
|
44
|
-
|
49
|
+
attr_accessor :app
|
45
50
|
def map app, location
|
46
51
|
@app = app
|
47
52
|
@app.map location, self
|
@@ -55,13 +60,13 @@ module Zorglub
|
|
55
60
|
def call env
|
56
61
|
meth, *args = env['PATH_INFO'].sub(/^\//,'').split '/'
|
57
62
|
meth||= 'index'
|
58
|
-
node = self.new env, {:engine=>engine,:layout=>layout,:view=>r(meth),:method=>meth,:args=>args}
|
63
|
+
node = self.new env, {:engine=>engine,:layout=>layout,:view=>r(meth),:method=>meth,:args=>args,:static=>static}
|
59
64
|
return error_404 node if not node.respond_to? meth
|
60
65
|
node.realize!
|
61
66
|
end
|
62
67
|
#
|
63
68
|
def partial meth, *args
|
64
|
-
node = self.new nil, {:engine=>engine,:layout=>nil,:view=>r(meth),:method=>meth.to_s,:args=>args}
|
69
|
+
node = self.new nil, {:engine=>engine,:layout=>nil,:view=>r(meth),:method=>meth.to_s,:args=>args,:static=>static}
|
65
70
|
return error_404 node if not node.respond_to? meth
|
66
71
|
node.feed!
|
67
72
|
node.content
|
@@ -95,11 +100,11 @@ module Zorglub
|
|
95
100
|
#
|
96
101
|
end
|
97
102
|
#
|
98
|
-
attr_reader :
|
103
|
+
attr_reader :options, :request, :response, :content, :mime
|
99
104
|
#
|
100
|
-
def initialize env,
|
105
|
+
def initialize env, options
|
101
106
|
@env = env
|
102
|
-
@
|
107
|
+
@options = options
|
103
108
|
@request = Rack::Request.new env
|
104
109
|
@response = Rack::Response.new
|
105
110
|
end
|
@@ -108,23 +113,50 @@ module Zorglub
|
|
108
113
|
catch(:stop_realize) {
|
109
114
|
feed!
|
110
115
|
response.write @content
|
116
|
+
response.header['Content-Type'] = @mime||'text/html'
|
111
117
|
response.finish
|
112
118
|
response
|
113
119
|
}
|
114
120
|
end
|
115
121
|
#
|
116
122
|
def feed!
|
123
|
+
state :pre_cb
|
117
124
|
Node.call_before_hooks self
|
118
125
|
state :meth
|
119
|
-
@content = self.send @
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
+
@content = self.send @options[:method], *@options[:args]
|
127
|
+
static_path = static
|
128
|
+
if static_path.nil?
|
129
|
+
compile!
|
130
|
+
else
|
131
|
+
static! static_path
|
132
|
+
end
|
133
|
+
state :post_cb
|
126
134
|
Node.call_after_hooks self
|
127
|
-
|
135
|
+
state :finished
|
136
|
+
return @content, @mime
|
137
|
+
end
|
138
|
+
#
|
139
|
+
def static! path
|
140
|
+
if not File.exists? path
|
141
|
+
compile!
|
142
|
+
Dir.mkdir Config.static_base_path
|
143
|
+
Dir.mkdir File.dirname path
|
144
|
+
File.open(path, 'w') {|f| f.write(@content); f.write("\n@mime:"+@mime) }
|
145
|
+
else
|
146
|
+
content = File.open(path, 'r') {|f| f.read }
|
147
|
+
@content = content.sub /\n@mime:(.*)$/,''
|
148
|
+
@mime = $1
|
149
|
+
end
|
150
|
+
end
|
151
|
+
#
|
152
|
+
def compile!
|
153
|
+
v, l, e = view, layout, Config.engine_proc(@options[:engine])
|
154
|
+
state (@options[:layout].nil? ? :partial : :view)
|
155
|
+
@content, mime = e.call v, self if e and File.exists? v
|
156
|
+
@mime = mime unless mime.nil?
|
157
|
+
state :layout
|
158
|
+
@content, mime = e.call l, self if e and File.exists? l
|
159
|
+
@mime = mime unless mime.nil?
|
128
160
|
end
|
129
161
|
#
|
130
162
|
def redirect target, options={}, &block
|
@@ -139,29 +171,35 @@ module Zorglub
|
|
139
171
|
end
|
140
172
|
#
|
141
173
|
def state state=nil
|
142
|
-
@
|
143
|
-
@
|
174
|
+
@options[:state] = state unless state.nil?
|
175
|
+
@options[:state]
|
144
176
|
end
|
145
177
|
#
|
146
178
|
def engine engine=nil
|
147
|
-
@
|
148
|
-
@
|
179
|
+
@options[:engine] = engine unless engine.nil? or engine.empty?
|
180
|
+
@options[:engine]
|
149
181
|
end
|
150
182
|
#
|
151
183
|
def layout layout=nil
|
152
|
-
@
|
153
|
-
return '' if @
|
154
|
-
File.join(Config.layout_base_path, @
|
184
|
+
@options[:layout] = layout unless layout.nil? or layout.empty?
|
185
|
+
return '' if @options[:layout].nil?
|
186
|
+
File.join(Config.layout_base_path, @options[:layout])+ Config.engine_ext(@options[:engine])
|
155
187
|
end
|
156
188
|
#
|
157
189
|
def no_layout
|
158
|
-
@
|
190
|
+
@options[:layout] = nil
|
191
|
+
end
|
192
|
+
#
|
193
|
+
def static val=nil
|
194
|
+
@options[:static] = val if (val==true or val==false)
|
195
|
+
return nil if not @options[:static] or @options[:view].nil?
|
196
|
+
File.join(Config.static_base_path, @options[:view])+Config.engine_ext(@options[:engine])
|
159
197
|
end
|
160
198
|
#
|
161
199
|
def view view=nil
|
162
|
-
@
|
163
|
-
return '' if @
|
164
|
-
File.join(Config.view_base_path, @
|
200
|
+
@options[:view] = view unless view.nil? or view.empty?
|
201
|
+
return '' if @options[:view].nil?
|
202
|
+
File.join(Config.view_base_path, @options[:view])+Config.engine_ext(@options[:engine])
|
165
203
|
end
|
166
204
|
#
|
167
205
|
def inherited_var sym, *args
|
@@ -173,8 +211,12 @@ module Zorglub
|
|
173
211
|
d
|
174
212
|
end
|
175
213
|
#
|
214
|
+
def app
|
215
|
+
self.class.app
|
216
|
+
end
|
217
|
+
#
|
176
218
|
def args
|
177
|
-
@
|
219
|
+
@options[:args]
|
178
220
|
end
|
179
221
|
#
|
180
222
|
def map
|
@@ -182,7 +224,7 @@ module Zorglub
|
|
182
224
|
end
|
183
225
|
#
|
184
226
|
def r *args
|
185
|
-
File.join map, (args.empty? ? @
|
227
|
+
File.join map, (args.empty? ? @options[:method] : args.map { |x| x.to_s } )
|
186
228
|
end
|
187
229
|
#
|
188
230
|
def html
|
data/lib/zorglub.rb
CHANGED
data/spec/node_spec.rb
CHANGED
@@ -2,9 +2,24 @@
|
|
2
2
|
#
|
3
3
|
require 'spec_helper'
|
4
4
|
#
|
5
|
+
def clean_static_path
|
6
|
+
static_base_path = Zorglub::Config.static_base_path
|
7
|
+
Dir.glob( File.join(static_base_path,'**','*') ).each do |f| File.unlink f if File.file? f end
|
8
|
+
Dir.glob( File.join(static_base_path,'*') ).each do |d| Dir.rmdir d end
|
9
|
+
Dir.rmdir static_base_path if File.directory? static_base_path
|
10
|
+
end
|
11
|
+
#
|
5
12
|
describe Zorglub do
|
6
13
|
#
|
7
14
|
describe Zorglub::Node do
|
15
|
+
#
|
16
|
+
before(:all) do
|
17
|
+
clean_static_path
|
18
|
+
end
|
19
|
+
#
|
20
|
+
after(:all) do
|
21
|
+
clean_static_path
|
22
|
+
end
|
8
23
|
#
|
9
24
|
it "engine should return default Node's engine" do
|
10
25
|
Node0.engine.should == Zorglub::Config.engine
|
@@ -118,6 +133,16 @@ describe Zorglub do
|
|
118
133
|
r.body[0].should == "layout_start view_content layout_end"
|
119
134
|
end
|
120
135
|
#
|
136
|
+
it "default mime-type should be text/html" do
|
137
|
+
r = Node0.my_call '/index'
|
138
|
+
r.header['Content-type'].should == 'text/html'
|
139
|
+
end
|
140
|
+
#
|
141
|
+
it "should be able to override mime-type" do
|
142
|
+
r = Node0.my_call '/do_render'
|
143
|
+
r.header['Content-type'].should == 'text/view'
|
144
|
+
end
|
145
|
+
#
|
121
146
|
it "partial should render correctly" do
|
122
147
|
Node0.partial(:do_partial, 1, 2).should == 'partial_content'
|
123
148
|
end
|
@@ -126,6 +151,21 @@ describe Zorglub do
|
|
126
151
|
Node0.partial(:other_view).should == 'partial_content'
|
127
152
|
end
|
128
153
|
#
|
154
|
+
it "static pages should be generated" do
|
155
|
+
r = Node0.my_call '/do_static'
|
156
|
+
r.body[0].should == 'VAL 1'
|
157
|
+
r.header['Content-type'].should == 'text/static'
|
158
|
+
r = Node0.my_call '/do_static'
|
159
|
+
r.body[0].should == 'VAL 1'
|
160
|
+
r.header['Content-type'].should == 'text/static'
|
161
|
+
r = Node0.my_call '/do_static'
|
162
|
+
r.body[0].should == 'VAL 1'
|
163
|
+
r.header['Content-type'].should == 'text/static'
|
164
|
+
r = Node0.my_call '/no_static'
|
165
|
+
r.body[0].should == 'VAL 4'
|
166
|
+
r.header['Content-type'].should == 'text/static'
|
167
|
+
end
|
168
|
+
#
|
129
169
|
it "redirect should work" do
|
130
170
|
r = Node0.my_call '/do_redirect'
|
131
171
|
r.status.should == 302
|
data/spec/spec_helper.rb
CHANGED
@@ -13,14 +13,15 @@ require 'yaml'
|
|
13
13
|
require 'zorglub'
|
14
14
|
#
|
15
15
|
HASH_PROC = Proc.new { |path,obj| {:path=>path,:layout=>obj.layout,:view=>obj.view,:args=>obj.args,:map=>obj.map}.to_yaml }
|
16
|
+
STATIC_PROC = Proc.new { |path,obj| ["VAL #{obj.value}",'text/static'] }
|
16
17
|
RENDER_PROC = Proc.new { |path,obj|
|
17
18
|
case obj.state
|
18
19
|
when :layout
|
19
20
|
"layout_start #{obj.content} layout_end"
|
20
21
|
when :view
|
21
|
-
"view_content"
|
22
|
+
["view_content", 'text/view']
|
22
23
|
when :partial
|
23
|
-
'partial_content'
|
24
|
+
['partial_content','text/partial']
|
24
25
|
else
|
25
26
|
raise Exception.new
|
26
27
|
end
|
@@ -29,6 +30,7 @@ Zorglub::Config.register_engine 'default', nil, HASH_PROC
|
|
29
30
|
Zorglub::Config.register_engine 'engine-1', 'spec', HASH_PROC
|
30
31
|
Zorglub::Config.register_engine 'engine-2', 'spec', HASH_PROC
|
31
32
|
Zorglub::Config.register_engine 'real', nil, RENDER_PROC
|
33
|
+
Zorglub::Config.register_engine 'static', nil, STATIC_PROC
|
32
34
|
#
|
33
35
|
Zorglub::Config[:engine] = 'default'
|
34
36
|
Zorglub::Config.root = File.join Dir.pwd, 'spec', 'data'
|
@@ -43,6 +45,10 @@ class Temp < Zorglub::Node
|
|
43
45
|
end
|
44
46
|
#
|
45
47
|
class Node0 < Zorglub::Node
|
48
|
+
@static_cpt=0
|
49
|
+
class << self
|
50
|
+
attr_accessor :static_cpt
|
51
|
+
end
|
46
52
|
# default
|
47
53
|
def index
|
48
54
|
html
|
@@ -66,6 +72,21 @@ class Node0 < Zorglub::Node
|
|
66
72
|
def do_redirect
|
67
73
|
redirect r(:do_partial,1,2,3)
|
68
74
|
end
|
75
|
+
attr_reader :value
|
76
|
+
def no_static
|
77
|
+
static false
|
78
|
+
engine 'static'
|
79
|
+
view r('do_render')
|
80
|
+
Node0.static_cpt+=1
|
81
|
+
@value = Node0.static_cpt
|
82
|
+
end
|
83
|
+
def do_static
|
84
|
+
static true
|
85
|
+
engine 'static'
|
86
|
+
view r('do_render')
|
87
|
+
Node0.static_cpt+=1
|
88
|
+
@value = Node0.static_cpt
|
89
|
+
end
|
69
90
|
end
|
70
91
|
#
|
71
92
|
class Node1 < Zorglub::Node
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: zorglub
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-01-
|
12
|
+
date: 2012-01-05 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rack
|
16
|
-
requirement: &
|
16
|
+
requirement: &23307900 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: 1.4.0
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *23307900
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: rake
|
27
|
-
requirement: &
|
27
|
+
requirement: &23323560 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ! '>='
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: 0.8.0
|
33
33
|
type: :runtime
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *23323560
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: rake
|
38
|
-
requirement: &
|
38
|
+
requirement: &23322980 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ! '>='
|
@@ -43,10 +43,10 @@ dependencies:
|
|
43
43
|
version: 0.8.7
|
44
44
|
type: :development
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *23322980
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: bones
|
49
|
-
requirement: &
|
49
|
+
requirement: &23322340 !ruby/object:Gem::Requirement
|
50
50
|
none: false
|
51
51
|
requirements:
|
52
52
|
- - ! '>='
|
@@ -54,7 +54,7 @@ dependencies:
|
|
54
54
|
version: 3.7.3
|
55
55
|
type: :development
|
56
56
|
prerelease: false
|
57
|
-
version_requirements: *
|
57
|
+
version_requirements: *23322340
|
58
58
|
description: a nano web application framework based on rack[http://rack.rubyforge.org/]
|
59
59
|
email: jeremy@asynk.ch
|
60
60
|
executables: []
|
@@ -67,31 +67,32 @@ files:
|
|
67
67
|
- README.rdoc
|
68
68
|
- Rakefile
|
69
69
|
- lib/zorglub.rb
|
70
|
-
- lib/zorglub/session.rb
|
71
70
|
- lib/zorglub/app.rb
|
72
|
-
- lib/zorglub/rack_session.rb
|
73
|
-
- lib/zorglub/node.rb
|
74
71
|
- lib/zorglub/config.rb
|
72
|
+
- lib/zorglub/engines/haml.rb
|
73
|
+
- lib/zorglub/node.rb
|
74
|
+
- lib/zorglub/rack_session.rb
|
75
|
+
- lib/zorglub/session.rb
|
76
|
+
- spec/app_spec.rb
|
77
|
+
- spec/data/layout/default
|
78
|
+
- spec/data/layout/main.spec
|
75
79
|
- spec/data/view/node0/do_partial
|
76
80
|
- spec/data/view/node0/do_render
|
77
|
-
- spec/data/layout/main.spec
|
78
|
-
- spec/data/layout/default
|
79
|
-
- spec/spec_helper.rb
|
80
81
|
- spec/node_spec.rb
|
81
|
-
- spec/
|
82
|
-
- tasks/
|
83
|
-
- tasks/helpers.rb
|
84
|
-
- tasks/git.rake
|
85
|
-
- tasks/test.rake
|
82
|
+
- spec/spec_helper.rb
|
83
|
+
- tasks/ann.rake
|
86
84
|
- tasks/constants.rb
|
87
|
-
- tasks/
|
85
|
+
- tasks/gem.rake
|
86
|
+
- tasks/git.rake
|
87
|
+
- tasks/helpers.rb
|
88
|
+
- tasks/notes.rake
|
88
89
|
- tasks/post_load.rake
|
90
|
+
- tasks/rdoc.rake
|
89
91
|
- tasks/rubyforge.rake
|
90
|
-
- tasks/notes.rake
|
91
92
|
- tasks/setup.rb
|
92
|
-
- tasks/
|
93
|
-
- tasks/
|
94
|
-
- tasks/
|
93
|
+
- tasks/spec.rake
|
94
|
+
- tasks/svn.rake
|
95
|
+
- tasks/test.rake
|
95
96
|
homepage: http://cgit.asynk.ch/cgi-bin/cgit/zorglub
|
96
97
|
licenses: []
|
97
98
|
post_install_message:
|