zena 1.0.0.rc1 → 1.0.0.rc2
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +8 -0
- data/app/models/template.rb +3 -3
- data/bricks/mongrel/zena/deploy.rb +1 -1
- data/bricks/mongrel/zena/init.rb +85 -0
- data/db/init/base/skins/default/style.css +2 -0
- data/lib/bricks/loader.rb +12 -9
- data/lib/tasks/zena.rake +1 -1
- data/lib/zena/info.rb +1 -1
- data/lib/zena/use/query_node.rb +1 -1
- data/test/functional/nodes_controller_test.rb +13 -1
- data/test/unit/site_test.rb +5 -0
- data/test/unit/template_test.rb +25 -1
- data/zena.gemspec +3 -2
- metadata +5 -4
data/History.txt
CHANGED
@@ -1,3 +1,11 @@
|
|
1
|
+
== 1.0.0.rc2 2011-02-14
|
2
|
+
|
3
|
+
* major changes
|
4
|
+
* Fixed Template bug with special '+' modes.
|
5
|
+
* Fixed migration bug (should use NULL as brick name for app).
|
6
|
+
* Fixed custom query loading bug (when brick is not activated).
|
7
|
+
* Fixed Mongrel bug (incompatibility with Rails 2.3.8).
|
8
|
+
|
1
9
|
== 1.0.0.rc1 2011-02-11
|
2
10
|
|
3
11
|
* major changes
|
data/app/models/template.rb
CHANGED
@@ -29,7 +29,7 @@ class Template < TextDocument
|
|
29
29
|
'skin_id' => record[:section_id],
|
30
30
|
}
|
31
31
|
end
|
32
|
-
|
32
|
+
|
33
33
|
safe_property :tkpath, :mode, :target_klass, :format
|
34
34
|
end
|
35
35
|
|
@@ -67,7 +67,7 @@ class Template < TextDocument
|
|
67
67
|
if title =~ /^([A-Z][a-zA-Z]+?)(-(([a-zA-Z_\+]*)(-([a-zA-Z_]+)|))|)(\.|\Z)/
|
68
68
|
# title changed force update
|
69
69
|
prop['target_klass'] = $1 unless prop.target_klass_changed?
|
70
|
-
prop['mode'] = ($4 || '')
|
70
|
+
prop['mode'] = ($4 || '') unless prop.mode_changed?
|
71
71
|
prop['format'] = ($6 || 'html') unless prop.format_changed?
|
72
72
|
else
|
73
73
|
# title set but it is not a master template name
|
@@ -78,7 +78,7 @@ class Template < TextDocument
|
|
78
78
|
end
|
79
79
|
|
80
80
|
if version.edited?
|
81
|
-
prop['mode'] = prop['mode'].gsub(/[^a-zA-Z]/, '') if prop['mode']
|
81
|
+
prop['mode'] = prop['mode'].gsub(/[^a-zA-Z\+]/, '') if prop['mode']
|
82
82
|
|
83
83
|
if !prop['target_klass'].blank?
|
84
84
|
# update title
|
@@ -19,7 +19,7 @@ Capistrano::Configuration.instance(:must_exist).load do
|
|
19
19
|
asset_port = Bricks.raw_config['asset_port']
|
20
20
|
if asset_port == self[:mongrel_port].to_i - 1
|
21
21
|
mongrel_port = asset_port
|
22
|
-
mongrel_count = self[:mongrel_count] + 1
|
22
|
+
mongrel_count = self[:mongrel_count].to_i + 1
|
23
23
|
elsif asset_port.nil?
|
24
24
|
# no asset port: OK.
|
25
25
|
else
|
@@ -0,0 +1,85 @@
|
|
1
|
+
# This fixes a bug between Rails 2.3.8 and Mongrel
|
2
|
+
# Error calling Dispatcher.dispatch #<NoMethodError: undefined method `[]' for nil:NilClass>
|
3
|
+
#
|
4
|
+
if Rails.version == '2.3.8' && Gem.available?('mongrel', Gem::Requirement.new('~>1.1.5')) && self.class.const_defined?(:Mongrel)
|
5
|
+
|
6
|
+
# Pulled right from latest rack. Old looked like this in 1.1.0 version.
|
7
|
+
#
|
8
|
+
# def [](k)
|
9
|
+
# super(@names[k] ||= @names[k.downcase])
|
10
|
+
# end
|
11
|
+
#
|
12
|
+
module Rack
|
13
|
+
module Utils
|
14
|
+
class HeaderHash < Hash
|
15
|
+
def [](k)
|
16
|
+
super(@names[k]) if @names[k]
|
17
|
+
super(@names[k.downcase])
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
# Code pulled from the ticket above.
|
24
|
+
#
|
25
|
+
class Mongrel::CGIWrapper
|
26
|
+
def header_with_rails_fix(options = 'text/html')
|
27
|
+
@head['cookie'] = options.delete('cookie').flatten.map { |v| v.sub(/^\n/,'') } if options.class != String and options['cookie']
|
28
|
+
header_without_rails_fix(options)
|
29
|
+
end
|
30
|
+
alias_method_chain :header, :rails_fix
|
31
|
+
end
|
32
|
+
|
33
|
+
# Pulled right from 2.3.8 ActionPack. Simple diff was
|
34
|
+
#
|
35
|
+
# if headers.include?('Set-Cookie')
|
36
|
+
# headers['cookie'] = headers.delete('Set-Cookie').split("\n")
|
37
|
+
# end
|
38
|
+
#
|
39
|
+
# to
|
40
|
+
#
|
41
|
+
# if headers['Set-Cookie']
|
42
|
+
# headers['cookie'] = headers.delete('Set-Cookie').split("\n")
|
43
|
+
# end
|
44
|
+
#
|
45
|
+
module ActionController
|
46
|
+
class CGIHandler
|
47
|
+
def self.dispatch_cgi(app, cgi, out = $stdout)
|
48
|
+
env = cgi.__send__(:env_table)
|
49
|
+
env.delete "HTTP_CONTENT_LENGTH"
|
50
|
+
cgi.stdinput.extend ProperStream
|
51
|
+
env["SCRIPT_NAME"] = "" if env["SCRIPT_NAME"] == "/"
|
52
|
+
env.update({
|
53
|
+
"rack.version" => [0,1],
|
54
|
+
"rack.input" => cgi.stdinput,
|
55
|
+
"rack.errors" => $stderr,
|
56
|
+
"rack.multithread" => false,
|
57
|
+
"rack.multiprocess" => true,
|
58
|
+
"rack.run_once" => false,
|
59
|
+
"rack.url_scheme" => ["yes", "on", "1"].include?(env["HTTPS"]) ? "https" : "http"
|
60
|
+
})
|
61
|
+
env["QUERY_STRING"] ||= ""
|
62
|
+
env["HTTP_VERSION"] ||= env["SERVER_PROTOCOL"]
|
63
|
+
env["REQUEST_PATH"] ||= "/"
|
64
|
+
env.delete "PATH_INFO" if env["PATH_INFO"] == ""
|
65
|
+
status, headers, body = app.call(env)
|
66
|
+
begin
|
67
|
+
out.binmode if out.respond_to?(:binmode)
|
68
|
+
out.sync = false if out.respond_to?(:sync=)
|
69
|
+
headers['Status'] = status.to_s
|
70
|
+
if headers['Set-Cookie']
|
71
|
+
headers['cookie'] = headers.delete('Set-Cookie').split("\n")
|
72
|
+
end
|
73
|
+
out.write(cgi.header(headers))
|
74
|
+
body.each { |part|
|
75
|
+
out.write part
|
76
|
+
out.flush if out.respond_to?(:flush)
|
77
|
+
}
|
78
|
+
ensure
|
79
|
+
body.close if body.respond_to?(:close)
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
end
|
@@ -26,7 +26,9 @@ input { padding:3px 4px;}
|
|
26
26
|
.summary p { margin:0; font-style:italic; font-family:Georgia,Times,serif;}
|
27
27
|
#context { width:180px; float:left; border-right:1px solid grey;}
|
28
28
|
#context a { color:#aaa; }
|
29
|
+
#context .admin_links a { color:inherit; }
|
29
30
|
#context a:hover { color:#04a; }
|
31
|
+
#context .admin_links a:hover { color:inherit; }
|
30
32
|
ol { padding-left:14px;}
|
31
33
|
|
32
34
|
#content { margin-left: 200px; }
|
data/lib/bricks/loader.rb
CHANGED
@@ -21,13 +21,18 @@ module Bricks
|
|
21
21
|
!File.exist?(f)
|
22
22
|
end
|
23
23
|
end
|
24
|
-
|
24
|
+
|
25
|
+
# Find all paths matching 'sub_path' in the active bricks.
|
26
|
+
def paths_for(sub_path)
|
27
|
+
bricks.map {|f| Dir["#{f}/#{sub_path}"] }.flatten
|
28
|
+
end
|
29
|
+
|
25
30
|
def models_paths
|
26
|
-
|
31
|
+
paths_for('models')
|
27
32
|
end
|
28
33
|
|
29
34
|
def init_paths
|
30
|
-
|
35
|
+
paths_for('zena/init.rb')
|
31
36
|
end
|
32
37
|
|
33
38
|
def migrations_for(brick)
|
@@ -39,15 +44,13 @@ module Bricks
|
|
39
44
|
end
|
40
45
|
|
41
46
|
def zafu_tests
|
42
|
-
|
47
|
+
paths_for('zena/test/zafu')
|
43
48
|
end
|
44
49
|
|
45
50
|
def test_files
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
'bricks/*/zena/test/integration/*_test.rb',
|
50
|
-
]
|
51
|
+
paths_for('zena/test/unit/*_test.rb') +
|
52
|
+
paths_for('zena/test/functional/*_test.rb') +
|
53
|
+
paths_for('zena/test/integration/*_test.rb')
|
51
54
|
end
|
52
55
|
|
53
56
|
# FIXME: remove
|
data/lib/tasks/zena.rake
CHANGED
@@ -273,7 +273,7 @@ namespace :zena do
|
|
273
273
|
paths['_app'] = "#{RAILS_ROOT}/db/migrate"
|
274
274
|
|
275
275
|
bricks.each do |brick_name, path|
|
276
|
-
Zena::Migrator.migrate(paths[brick_name], brick_name, nil)
|
276
|
+
Zena::Migrator.migrate(paths[brick_name], brick_name == '_app' ? nil : brick_name, nil)
|
277
277
|
end
|
278
278
|
#ActiveRecord::Migrator.migrate("db/migrate/", nil)
|
279
279
|
end
|
data/lib/zena/info.rb
CHANGED
data/lib/zena/use/query_node.rb
CHANGED
@@ -105,7 +105,7 @@ module Zena
|
|
105
105
|
after_process :insert_links_fields
|
106
106
|
after_process :secure_query
|
107
107
|
|
108
|
-
load_custom_queries
|
108
|
+
load_custom_queries Bricks.paths_for('queries')
|
109
109
|
|
110
110
|
CORE_CONTEXTS = %w{parent project section}
|
111
111
|
|
@@ -264,9 +264,21 @@ class NodesControllerTest < Zena::Controller::TestCase
|
|
264
264
|
end # with a bad value
|
265
265
|
|
266
266
|
end # by changing skin
|
267
|
-
|
267
|
+
|
268
268
|
end # updating a node
|
269
|
+
|
270
|
+
# ======================================= Template update
|
271
|
+
context 'updating a template' do
|
272
|
+
subject do
|
273
|
+
{:action => 'update', :controller => 'nodes', :id => nodes_zip(:Node_zafu), :node => {:mode => '+index'}}
|
274
|
+
end
|
269
275
|
|
276
|
+
should 'update template with new mode' do
|
277
|
+
put_subject
|
278
|
+
assert_equal '+index', assigns(:node).mode
|
279
|
+
end
|
280
|
+
end # updating a template
|
281
|
+
|
270
282
|
context 'using xml' do
|
271
283
|
context 'without being in the api_group' do
|
272
284
|
setup do
|
data/test/unit/site_test.rb
CHANGED
@@ -31,6 +31,11 @@ class SiteTest < Zena::Unit::TestCase
|
|
31
31
|
|
32
32
|
# should return a new project as root node
|
33
33
|
assert_kind_of Project, subject.root_node
|
34
|
+
|
35
|
+
# should install base skin
|
36
|
+
index_zafu = secure(Node) { subject.root_node.find(:first, "template where title like 'Node%login' in site") }
|
37
|
+
assert_kind_of Template, index_zafu
|
38
|
+
assert_equal '+login', index_zafu.mode
|
34
39
|
end
|
35
40
|
end
|
36
41
|
|
data/test/unit/template_test.rb
CHANGED
@@ -134,7 +134,7 @@ class TemplateTest < Zena::Unit::TestCase
|
|
134
134
|
|
135
135
|
context 'with a format' do
|
136
136
|
subject do
|
137
|
-
secure(Template) { Template.create(:parent_id=>nodes_id(:default), :title => 'Node-tree', :format => 'xml') }
|
137
|
+
secure(Template) { Template.create(:parent_id => nodes_id(:default), :title => 'Node-tree', :format => 'xml') }
|
138
138
|
end
|
139
139
|
|
140
140
|
should 'use format in title' do
|
@@ -143,6 +143,30 @@ class TemplateTest < Zena::Unit::TestCase
|
|
143
143
|
end
|
144
144
|
end # with a blank title
|
145
145
|
|
146
|
+
context 'with a special mode' do
|
147
|
+
subject do
|
148
|
+
secure(Template) { Template.create(:parent_id => nodes_id(:default), :title => 'Node', :mode => '+edit') }
|
149
|
+
end
|
150
|
+
|
151
|
+
should 'use mode in title' do
|
152
|
+
assert !subject.new_record?
|
153
|
+
assert_equal 'Node-+edit', subject.title
|
154
|
+
end
|
155
|
+
|
156
|
+
context 'in the title' do
|
157
|
+
subject do
|
158
|
+
secure(Template) { Template.create(:parent_id => nodes_id(:default), :title => 'Node-+index') }
|
159
|
+
end
|
160
|
+
|
161
|
+
should 'description' do
|
162
|
+
assert_difference('Template.count', 1) do
|
163
|
+
assert_equal '+index', subject.mode
|
164
|
+
end
|
165
|
+
end
|
166
|
+
end # in the title
|
167
|
+
|
168
|
+
end # with a special mode
|
169
|
+
|
146
170
|
context 'with class format and mode in title' do
|
147
171
|
subject do
|
148
172
|
secure!(Document) { Document.create(:parent_id => nodes_id(:default), :title => 'Project-collab-xml.zafu')}
|
data/zena.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{zena}
|
8
|
-
s.version = "1.0.0.
|
8
|
+
s.version = "1.0.0.rc2"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new("> 1.3.1") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Gaspard Bucher"]
|
12
|
-
s.date = %q{2011-02-
|
12
|
+
s.date = %q{2011-02-14}
|
13
13
|
s.default_executable = %q{zena}
|
14
14
|
s.description = %q{zena is a Ruby on Rails CMS (content managment system) with a focus on usability, ease of customization and web 2.0 goodness (application like behaviour).}
|
15
15
|
s.email = %q{gaspard@teti.ch}
|
@@ -272,6 +272,7 @@ Gem::Specification.new do |s|
|
|
272
272
|
"bricks/math/zena/init.rb",
|
273
273
|
"bricks/mongrel/README",
|
274
274
|
"bricks/mongrel/zena/deploy.rb",
|
275
|
+
"bricks/mongrel/zena/init.rb",
|
275
276
|
"bricks/passenger/README",
|
276
277
|
"bricks/passenger/zena/deploy.rb",
|
277
278
|
"bricks/pdf/.document",
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: zena
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 977940575
|
5
5
|
prerelease: true
|
6
6
|
segments:
|
7
7
|
- 1
|
8
8
|
- 0
|
9
9
|
- 0
|
10
|
-
-
|
11
|
-
version: 1.0.0.
|
10
|
+
- rc2
|
11
|
+
version: 1.0.0.rc2
|
12
12
|
platform: ruby
|
13
13
|
authors:
|
14
14
|
- Gaspard Bucher
|
@@ -16,7 +16,7 @@ autorequire:
|
|
16
16
|
bindir: bin
|
17
17
|
cert_chain: []
|
18
18
|
|
19
|
-
date: 2011-02-
|
19
|
+
date: 2011-02-14 00:00:00 +01:00
|
20
20
|
default_executable: zena
|
21
21
|
dependencies:
|
22
22
|
- !ruby/object:Gem::Dependency
|
@@ -614,6 +614,7 @@ files:
|
|
614
614
|
- bricks/math/zena/init.rb
|
615
615
|
- bricks/mongrel/README
|
616
616
|
- bricks/mongrel/zena/deploy.rb
|
617
|
+
- bricks/mongrel/zena/init.rb
|
617
618
|
- bricks/passenger/README
|
618
619
|
- bricks/passenger/zena/deploy.rb
|
619
620
|
- bricks/pdf/.document
|