zena 1.0.0.rc1 → 1.0.0.rc2
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/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
|