radiant 0.6.3 → 0.6.4

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of radiant might be problematic. Click here for more details.

Files changed (197) hide show
  1. data/CHANGELOG +61 -7
  2. data/CONTRIBUTORS +15 -0
  3. data/app/controllers/admin/export_controller.rb +1 -1
  4. data/app/controllers/admin/page_controller.rb +1 -0
  5. data/app/controllers/admin/user_controller.rb +2 -1
  6. data/app/controllers/application.rb +7 -8
  7. data/app/helpers/admin/node_helper.rb +84 -0
  8. data/app/helpers/admin/page_helper.rb +1 -19
  9. data/app/helpers/application_helper.rb +15 -9
  10. data/app/models/file_not_found_page.rb +2 -2
  11. data/app/models/page.rb +22 -18
  12. data/app/models/page_context.rb +9 -0
  13. data/app/models/radiant/config.rb +4 -2
  14. data/app/models/response_cache.rb +18 -12
  15. data/app/models/standard_tags.rb +111 -50
  16. data/app/views/admin/extension/index.rhtml +2 -2
  17. data/app/views/admin/layout/edit.rhtml +2 -2
  18. data/app/views/admin/layout/remove.rhtml +2 -2
  19. data/app/views/admin/page/_node.rhtml +4 -26
  20. data/app/views/admin/page/_part.rhtml +9 -14
  21. data/app/views/admin/page/edit.rhtml +38 -121
  22. data/app/views/admin/page/index.rhtml +2 -6
  23. data/app/views/admin/page/remove.rhtml +2 -2
  24. data/app/views/admin/snippet/edit.rhtml +3 -3
  25. data/app/views/admin/snippet/index.rhtml +2 -2
  26. data/app/views/admin/snippet/remove.rhtml +2 -2
  27. data/app/views/admin/user/edit.rhtml +4 -4
  28. data/app/views/admin/user/preferences.rhtml +2 -2
  29. data/app/views/admin/welcome/login.rhtml +1 -1
  30. data/config/environment.rb +79 -78
  31. data/db/schema.rb +2 -0
  32. data/lib/local_time.rb +12 -0
  33. data/lib/plugins/extension_patches/lib/fixture_loading_extension.rb +1 -1
  34. data/lib/plugins/extension_patches/lib/mailer_view_paths_extension.rb +3 -3
  35. data/lib/radiant.rb +1 -1
  36. data/lib/radiant/extension.rb +9 -3
  37. data/lib/radiant/extension_loader.rb +2 -2
  38. data/lib/tasks/extensions.rake +23 -8
  39. data/public/javascripts/admin.js +89 -0
  40. data/public/javascripts/controls.js +486 -354
  41. data/public/javascripts/dragdrop.js +90 -58
  42. data/public/javascripts/effects.js +398 -364
  43. data/public/javascripts/pngfix.js +37 -37
  44. data/public/javascripts/prototype.js +2764 -1095
  45. data/public/javascripts/ruledtable.js +10 -25
  46. data/public/javascripts/sitemap.js +74 -112
  47. data/public/javascripts/string.js +1 -7
  48. data/public/javascripts/tabcontrol.js +71 -86
  49. data/public/javascripts/tag_reference_search.js +19 -26
  50. data/public/stylesheets/admin/main.css +11 -5
  51. data/test/fixtures/extensions/01_basic/lib/new_module.rb +2 -0
  52. data/test/fixtures/page_parts.yml +16 -1
  53. data/test/fixtures/pages.yml +47 -84
  54. data/test/functional/extension_initialization_test.rb +11 -0
  55. data/test/helpers/login_test_helper.rb +12 -1
  56. data/test/helpers/page_test_helper.rb +6 -0
  57. data/test/helpers/render_test_helper.rb +11 -8
  58. data/test/test_helper.rb +1 -12
  59. data/test/unit/file_not_found_page_test.rb +5 -1
  60. data/test/unit/local_time_test.rb +45 -0
  61. data/test/unit/page_context_test.rb +32 -1
  62. data/test/unit/page_test.rb +45 -11
  63. data/test/unit/radiant/config_test.rb +1 -1
  64. data/test/unit/response_cache_test.rb +27 -2
  65. data/test/unit/standard_tags_test.rb +60 -15
  66. data/vendor/extensions/archive/README +29 -0
  67. data/vendor/extensions/archive/Rakefile +25 -0
  68. data/{app → vendor/extensions/archive/app}/models/archive_day_index_page.rb +0 -0
  69. data/{app → vendor/extensions/archive/app}/models/archive_finder.rb +8 -6
  70. data/{app → vendor/extensions/archive/app}/models/archive_month_index_page.rb +0 -0
  71. data/{app → vendor/extensions/archive/app}/models/archive_page.rb +0 -0
  72. data/{app → vendor/extensions/archive/app}/models/archive_year_index_page.rb +0 -0
  73. data/vendor/extensions/archive/archive_extension.rb +19 -0
  74. data/{lib → vendor/extensions/archive/lib}/archive_index_tags_and_methods.rb +0 -0
  75. data/vendor/extensions/archive/lib/tasks/archive_extension_tasks.rake +28 -0
  76. data/vendor/extensions/archive/test/fixtures/pages.yml +397 -0
  77. data/vendor/extensions/archive/test/functional/archive_extension_test.rb +16 -0
  78. data/{test → vendor/extensions/archive/test}/helpers/archive_index_test_helper.rb +0 -0
  79. data/vendor/extensions/archive/test/test_helper.rb +19 -0
  80. data/{test → vendor/extensions/archive/test}/unit/archive_day_index_page_test.rb +0 -0
  81. data/{test → vendor/extensions/archive/test}/unit/archive_month_index_page_test.rb +0 -0
  82. data/{test → vendor/extensions/archive/test}/unit/archive_page_test.rb +7 -1
  83. data/{test → vendor/extensions/archive/test}/unit/archive_year_index_page_test.rb +0 -0
  84. data/vendor/rails/actionmailer/CHANGELOG +10 -0
  85. data/vendor/rails/actionmailer/Rakefile +1 -1
  86. data/vendor/rails/actionmailer/lib/action_mailer/version.rb +1 -1
  87. data/vendor/rails/actionpack/CHANGELOG +51 -2
  88. data/vendor/rails/actionpack/Rakefile +1 -1
  89. data/vendor/rails/actionpack/lib/action_controller/assertions/dom_assertions.rb +2 -2
  90. data/vendor/rails/actionpack/lib/action_controller/assertions/model_assertions.rb +1 -1
  91. data/vendor/rails/actionpack/lib/action_controller/assertions/response_assertions.rb +3 -0
  92. data/vendor/rails/actionpack/lib/action_controller/assertions/routing_assertions.rb +1 -0
  93. data/vendor/rails/actionpack/lib/action_controller/assertions/selector_assertions.rb +2 -0
  94. data/vendor/rails/actionpack/lib/action_controller/base.rb +7 -1
  95. data/vendor/rails/actionpack/lib/action_controller/caching.rb +39 -38
  96. data/vendor/rails/actionpack/lib/action_controller/cgi_ext/pstore_performance_fix.rb +30 -0
  97. data/vendor/rails/actionpack/lib/action_controller/cgi_ext/raw_post_data_fix.rb +1 -1
  98. data/vendor/rails/actionpack/lib/action_controller/cgi_process.rb +13 -4
  99. data/vendor/rails/actionpack/lib/action_controller/cookies.rb +5 -3
  100. data/vendor/rails/actionpack/lib/action_controller/filters.rb +176 -77
  101. data/vendor/rails/actionpack/lib/action_controller/integration.rb +31 -21
  102. data/vendor/rails/actionpack/lib/action_controller/macros/in_place_editing.rb +1 -1
  103. data/vendor/rails/actionpack/lib/action_controller/pagination.rb +7 -1
  104. data/vendor/rails/actionpack/lib/action_controller/resources.rb +117 -32
  105. data/vendor/rails/actionpack/lib/action_controller/routing.rb +56 -23
  106. data/vendor/rails/actionpack/lib/action_controller/test_process.rb +5 -2
  107. data/vendor/rails/actionpack/lib/action_controller/url_rewriter.rb +4 -1
  108. data/vendor/rails/actionpack/lib/action_controller/verification.rb +1 -0
  109. data/vendor/rails/actionpack/lib/action_pack/version.rb +1 -1
  110. data/vendor/rails/actionpack/lib/action_view/base.rb +25 -19
  111. data/vendor/rails/actionpack/lib/action_view/compiled_templates.rb +2 -2
  112. data/vendor/rails/actionpack/lib/action_view/helpers/active_record_helper.rb +18 -18
  113. data/vendor/rails/actionpack/lib/action_view/helpers/debug_helper.rb +10 -0
  114. data/vendor/rails/actionpack/lib/action_view/helpers/deprecated_helper.rb +3 -0
  115. data/vendor/rails/actionpack/lib/action_view/helpers/prototype_helper.rb +33 -17
  116. data/vendor/rails/actionpack/test/activerecord/pagination_test.rb +9 -0
  117. data/vendor/rails/actionpack/test/controller/action_pack_assertions_test.rb +13 -0
  118. data/vendor/rails/actionpack/test/controller/addresses_render_test.rb +4 -1
  119. data/vendor/rails/actionpack/test/controller/base_test.rb +1 -1
  120. data/vendor/rails/actionpack/test/controller/caching_test.rb +3 -2
  121. data/vendor/rails/actionpack/test/controller/cookie_test.rb +11 -0
  122. data/vendor/rails/actionpack/test/controller/deprecation/deprecated_base_methods_test.rb +18 -0
  123. data/vendor/rails/actionpack/test/controller/filter_params_test.rb +1 -0
  124. data/vendor/rails/actionpack/test/controller/filters_test.rb +149 -26
  125. data/vendor/rails/actionpack/test/controller/integration_test.rb +93 -8
  126. data/vendor/rails/actionpack/test/controller/resources_test.rb +215 -36
  127. data/vendor/rails/actionpack/test/controller/routing_test.rb +2 -2
  128. data/vendor/rails/actionpack/test/controller/test_test.rb +16 -0
  129. data/vendor/rails/actionpack/test/controller/url_rewriter_test.rb +66 -10
  130. data/vendor/rails/actionpack/test/controller/verification_test.rb +15 -0
  131. data/vendor/rails/actionpack/test/fixtures/test/hello_world.rxml +2 -1
  132. data/vendor/rails/actionpack/test/template/asset_tag_helper_test.rb +5 -0
  133. data/vendor/rails/actionpack/test/template/compiled_templates_test.rb +29 -17
  134. data/vendor/rails/actionpack/test/template/javascript_helper_test.rb +4 -4
  135. data/vendor/rails/actionpack/test/template/number_helper_test.rb +1 -1
  136. data/vendor/rails/actionpack/test/template/prototype_helper_test.rb +13 -13
  137. data/vendor/rails/actionwebservice/CHANGELOG +14 -0
  138. data/vendor/rails/actionwebservice/Rakefile +2 -2
  139. data/vendor/rails/actionwebservice/lib/action_web_service/version.rb +1 -1
  140. data/vendor/rails/activerecord/CHANGELOG +34 -0
  141. data/vendor/rails/activerecord/Rakefile +1 -1
  142. data/vendor/rails/activerecord/lib/active_record/acts/list.rb +14 -2
  143. data/vendor/rails/activerecord/lib/active_record/acts/tree.rb +7 -0
  144. data/vendor/rails/activerecord/lib/active_record/associations.rb +29 -14
  145. data/vendor/rails/activerecord/lib/active_record/associations/association_collection.rb +5 -1
  146. data/vendor/rails/activerecord/lib/active_record/associations/has_many_association.rb +2 -2
  147. data/vendor/rails/activerecord/lib/active_record/associations/has_many_through_association.rb +10 -0
  148. data/vendor/rails/activerecord/lib/active_record/base.rb +12 -3
  149. data/vendor/rails/activerecord/lib/active_record/calculations.rb +2 -2
  150. data/vendor/rails/activerecord/lib/active_record/connection_adapters/abstract/quoting.rb +1 -1
  151. data/vendor/rails/activerecord/lib/active_record/connection_adapters/oracle_adapter.rb +1 -0
  152. data/vendor/rails/activerecord/lib/active_record/connection_adapters/sqlite_adapter.rb +2 -2
  153. data/vendor/rails/activerecord/lib/active_record/connection_adapters/sqlserver_adapter.rb +54 -38
  154. data/vendor/rails/activerecord/lib/active_record/deprecated_finders.rb +3 -3
  155. data/vendor/rails/activerecord/lib/active_record/fixtures.rb +1 -1
  156. data/vendor/rails/activerecord/lib/active_record/timestamp.rb +0 -9
  157. data/vendor/rails/activerecord/lib/active_record/version.rb +1 -1
  158. data/vendor/rails/activerecord/test/associations/eager_test.rb +13 -0
  159. data/vendor/rails/activerecord/test/associations/join_model_test.rb +10 -1
  160. data/vendor/rails/activerecord/test/associations_test.rb +36 -3
  161. data/vendor/rails/activerecord/test/base_test.rb +17 -4
  162. data/vendor/rails/activerecord/test/defaults_test.rb +15 -0
  163. data/vendor/rails/activerecord/test/fixtures/author.rb +1 -0
  164. data/vendor/rails/activerecord/test/fixtures/binaries.yml +437 -0
  165. data/vendor/rails/activerecord/test/fixtures/db_definitions/schema.rb +13 -0
  166. data/vendor/rails/activerecord/test/fixtures/developer.rb +10 -0
  167. data/vendor/rails/activerecord/test/fixtures_test.rb +9 -5
  168. data/vendor/rails/activerecord/test/migration_test.rb +9 -10
  169. data/vendor/rails/activerecord/test/mixin_test.rb +47 -0
  170. data/vendor/rails/activerecord/test/validations_test.rb +2 -2
  171. data/vendor/rails/activesupport/CHANGELOG +16 -0
  172. data/vendor/rails/activesupport/lib/active_support/core_ext/blank.rb +9 -3
  173. data/vendor/rails/activesupport/lib/active_support/core_ext/hash/conversions.rb +48 -3
  174. data/vendor/rails/activesupport/lib/active_support/core_ext/module/introspection.rb +14 -0
  175. data/vendor/rails/activesupport/lib/active_support/dependencies.rb +3 -3
  176. data/vendor/rails/activesupport/lib/active_support/json/encoders/core.rb +5 -3
  177. data/vendor/rails/activesupport/lib/active_support/multibyte/chars.rb +6 -6
  178. data/vendor/rails/activesupport/lib/active_support/version.rb +1 -1
  179. data/vendor/rails/activesupport/test/core_ext/hash_ext_test.rb +37 -0
  180. data/vendor/rails/activesupport/test/core_ext/module_test.rb +8 -0
  181. data/vendor/rails/activesupport/test/dependencies_test.rb +11 -0
  182. data/vendor/rails/activesupport/test/{json.rb → json_test.rb} +15 -5
  183. data/vendor/rails/railties/CHANGELOG +25 -1
  184. data/vendor/rails/railties/README +32 -3
  185. data/vendor/rails/railties/Rakefile +5 -5
  186. data/vendor/rails/railties/environments/boot.rb +12 -18
  187. data/vendor/rails/railties/environments/environment.rb +15 -15
  188. data/vendor/rails/railties/lib/dispatcher.rb +1 -2
  189. data/vendor/rails/railties/lib/initializer.rb +33 -9
  190. data/vendor/rails/railties/lib/rails/version.rb +1 -1
  191. data/vendor/rails/railties/lib/rails_generator/generators/components/scaffold/scaffold_generator.rb +1 -1
  192. data/vendor/rails/railties/lib/rails_generator/generators/components/scaffold_resource/scaffold_resource_generator.rb +1 -0
  193. data/vendor/rails/railties/lib/railties_path.rb +1 -1
  194. data/vendor/rails/railties/lib/tasks/framework.rake +4 -4
  195. data/vendor/rails/railties/lib/tasks/routes.rake +17 -0
  196. data/vendor/rails/release.rb +2 -2
  197. metadata +1877 -1848
@@ -19,11 +19,42 @@ class PageContextTest < Test::Unit::TestCase
19
19
  def @context.testing?() false end
20
20
  assert_parse_output_match "undefined tag `missing'", '<r:missing />'
21
21
  end
22
+
23
+ def test_request_is_passed_around
24
+ @context.define_tag "if_request" do |tag|
25
+ tag.expand if tag.locals.page.request
26
+ end
27
+ assert_parse_output_match /^$/, '<r:if_request>tada!</r:if_request>'
28
+
29
+ @page.request = ActionController::TestRequest.new
30
+ assert_parse_output_match "tada!", '<r:if_request>tada!</r:if_request>'
31
+ assert_parse_output_match "tada!", '<r:find url="/another/"><r:if_request>tada!</r:if_request></r:find>'
32
+ end
33
+
34
+ def test_response_is_passed_around
35
+ @context.define_tag "if_response" do |tag|
36
+ tag.expand if tag.locals.page.response
37
+ end
38
+ assert_parse_output_match /^$/, '<r:if_response>tada!</r:if_response>'
22
39
 
40
+ @page.response = ActionController::TestResponse.new
41
+ assert_parse_output_match "tada!", '<r:if_response>tada!</r:if_response>'
42
+ assert_parse_output_match "tada!", '<r:find url="/another/"><r:if_response>tada!</r:if_response></r:find>'
43
+ end
44
+
45
+ def test_exception_pops_stack
46
+ assert_equal '', @context.current_nesting
47
+ @context.define_tag("error") {|tag| raise "Broken!"}
48
+ def @context.testing?(); false; end
49
+ assert_parse_output_match /Broken\!/, "<r:error/>"
50
+ assert_equal '', @context.current_nesting
51
+ end
52
+
23
53
  private
24
54
 
25
55
  def assert_parse_output_match(regexp, input)
26
56
  output = @parser.parse(input)
27
57
  assert_match regexp, output
28
58
  end
29
- end
59
+
60
+ end
@@ -94,7 +94,19 @@ class PageTest < Test::Unit::TestCase
94
94
  part = pages(:radius).part(:body)
95
95
  assert_equal 'body', part.name
96
96
  end
97
-
97
+ def test_part__when_page_is_unsaved
98
+ part = PagePart.new(:content => "test", :name => "test")
99
+ @page.parts << part
100
+ assert_equal part, @page.part('test')
101
+ assert_equal part, @page.part(:test)
102
+ end
103
+ def test_part__when_parts_are_unsaved
104
+ @page = pages(:radius)
105
+ @page.parts.build(:content => "test", :name => "test")
106
+ assert_equal "test", @page.part('test').content
107
+ assert_equal "test", @page.part(:test).content
108
+ end
109
+
98
110
  def test_published_at
99
111
  @page = create_test_page(:status_id => '1')
100
112
  assert_nil @page.published_at
@@ -147,13 +159,9 @@ class PageTest < Test::Unit::TestCase
147
159
  found = @page.find_by_url('/parent/child/grandchild/great-grandchild/')
148
160
  assert_equal expected, found
149
161
  end
150
- def test_find_by_url_3
151
- @page = pages(:homepage)
152
- assert_equal pages(:article), @page.find_by_url('/archive/2000/05/01/article/')
153
- end
154
162
  def test_find_by_url__when_virtual
155
163
  @page = pages(:homepage)
156
- found = @page.find_by_url('/archive/2006/02/05/month/')
164
+ found = @page.find_by_url('/assorted/virtual/')
157
165
  assert_equal nil, found
158
166
  end
159
167
  def test_find_by_url__when_not_found_and_missing_page_defined
@@ -297,11 +305,6 @@ class PageTest < Test::Unit::TestCase
297
305
  assert_equal "Hello world! Another test.", @page.render_part(:body)
298
306
  end
299
307
 
300
- def test_render_text
301
- @page = pages(:homepage)
302
- assert_equal "/", @page.render_text( "<r:slug />")
303
- end
304
-
305
308
  def test_display_name_class_method
306
309
  assert_equal "Page", Page.display_name
307
310
 
@@ -412,4 +415,35 @@ class PageTest < Test::Unit::TestCase
412
415
  end
413
416
  end
414
417
 
418
+ def test_has_part
419
+ @page = pages(:homepage)
420
+ assert(@page.has_part?(:body))
421
+ assert(@page.has_part?('extended'))
422
+ assert(!@page.has_part?(:obviously_false_part_name))
423
+ end
424
+ def test_has_or_inherits_part
425
+ @page = pages(:child)
426
+ assert(!@page.has_part?(:sidebar))
427
+ assert(@page.has_or_inherits_part?(:sidebar))
428
+ assert(!@page.has_or_inherits_part?(:obviously_false_part_name))
429
+
430
+ @page = pages(:homepage)
431
+ assert(@page.has_part?(:sidebar))
432
+ assert(@page.has_or_inherits_part?(:sidebar))
433
+ assert(!@page.has_or_inherits_part?(:obviously_false_part_name))
434
+ end
435
+ def test_inherits_part
436
+ @page = pages(:child)
437
+ assert(!@page.has_part?(:sidebar))
438
+ assert(@page.inherits_part?(:sidebar))
439
+
440
+ @page = pages(:homepage)
441
+ assert(@page.has_part?(:sidebar))
442
+ assert(!@page.inherits_part?(:sidebar))
443
+
444
+ @page = pages(:radius)
445
+ assert(@page.has_part?(:extended))
446
+ assert(!@page.inherits_part?(:extended))
447
+ end
448
+
415
449
  end
@@ -46,7 +46,7 @@ class Radiant::ConfigTest < Test::Unit::TestCase
46
46
  set('bool2', :blahblahblah)
47
47
  assert_equal 'blahblahblah', @conf['bool2']
48
48
  end
49
-
49
+
50
50
  private
51
51
  def set(key, value)
52
52
  setting = Radiant::Config.find_by_key(key)
@@ -13,13 +13,15 @@ class ResponseCacheTest < Test::Unit::TestCase
13
13
  end
14
14
 
15
15
  def setup
16
- @dir = "#{RAILS_ROOT}/test/cache"
16
+ @dir = File.expand_path("#{RAILS_ROOT}/test/cache")
17
+ @baddir = File.expand_path("#{RAILS_ROOT}/test/badcache")
18
+ FileUtils.rm_rf @baddir
17
19
  @old_perform_caching = ResponseCache.defaults[:perform_caching]
18
20
  ResponseCache.defaults[:perform_caching] = true
19
21
  @cache = ResponseCache.new(
20
22
  :directory => @dir,
21
23
  :perform_caching => true
22
- )
24
+ )
23
25
  @cache.clear
24
26
  end
25
27
 
@@ -188,6 +190,29 @@ class ResponseCacheTest < Test::Unit::TestCase
188
190
  File.open("#{@dir}/test_me.yml",'w') {|f| f.puts "--- \nheaders: \n Last-Modified: Tue, 27 Feb 2007 06:13:43 GMT\n"}
189
191
  assert !@cache.response_cached?('/test_me')
190
192
  end
193
+
194
+ def test_cache_cant_write_outside_dir
195
+ @cache.cache_response('../badcache/cache_cant_write_outside_dir', response('content'))
196
+ assert !File.exist?("#{RAILS_ROOT}/test/badcache/cache_cant_write_outside_dir.yml")
197
+ end
198
+
199
+ def test_cache_cant_read_outside_dir
200
+ FileUtils.makedirs(@baddir)
201
+ @cache.cache_response('/test_me', response('content'))
202
+ File.rename "#{@dir}/test_me.yml","#{@baddir}/test_me.yml"
203
+ File.rename "#{@dir}/test_me.data","#{@baddir}/test_me.data"
204
+ assert !@cache.response_cached?('/../badcache/test_me')
205
+ end
206
+
207
+ def test_cache_cant_expire_outside_dir
208
+ FileUtils.makedirs(@baddir)
209
+ @cache.cache_response('/test_me', response('content'))
210
+ File.rename "#{@dir}/test_me.yml","#{@baddir}/test_me.yml"
211
+ File.rename "#{@dir}/test_me.data","#{@baddir}/test_me.data"
212
+ @cache.expire_response('/../badcache/test_me')
213
+ assert File.exist?("#{@baddir}/test_me.yml")
214
+ assert File.exist?("#{@baddir}/test_me.data")
215
+ end
191
216
 
192
217
  # Class Methods
193
218
 
@@ -66,27 +66,27 @@ class StandardTagsTest < Test::Unit::TestCase
66
66
  assert_render_error message, page_children_each_tags(%{order="asdf"})
67
67
  end
68
68
  def test_tag_children_each_does_not_list_virtual_pages
69
- @page = pages(:archive)
70
- assert_renders 'article article-2 article-3 article-4 article-5 ', '<r:children:each><r:slug /> </r:children:each>'
71
- assert_render_match /^(draft |)article article-2 article-3 article-4 article-5( draft|) $/, '<r:children:each status="all"><r:slug /> </r:children:each>'
69
+ @page = pages(:assorted)
70
+ assert_renders 'a b c d e f g h i j ', '<r:children:each><r:slug /> </r:children:each>'
71
+ assert_render_match /^(draft |)a b c d e f g h i j( draft|) $/, '<r:children:each status="all"><r:slug /> </r:children:each>'
72
72
  end
73
73
 
74
74
  def test_tag_children_each_header
75
- @page = pages(:archive)
76
- assert_renders '[May/00] article [Jun/00] article-2 article-3 [Aug/00] article-4 [Aug/01] article-5 ', '<r:children:each><r:header>[<r:date format="%b/%y" />] </r:header><r:slug /> </r:children:each>'
75
+ @page = pages(:news)
76
+ assert_renders '[Jan/06] a-great-day-for-ruby [Feb/06] another-great-day-for-ruby later-that-day [Jan/07] next-year-in-ruby ', '<r:children:each><r:header>[<r:date format="%b/%y" />] </r:header><r:slug /> </r:children:each>'
77
77
  end
78
78
  def test_tag_children_each_header_with_name_attribute
79
- @page = pages(:archive)
80
- assert_renders '[2000] (May) article (Jun) article-2 article-3 (Aug) article-4 [2001] article-5 ', %{<r:children:each><r:header name="year">[<r:date format='%Y' />] </r:header><r:header name="month">(<r:date format="%b" />) </r:header><r:slug /> </r:children:each>}
79
+ @page = pages(:news)
80
+ assert_renders '[2006] (Jan) a-great-day-for-ruby (Feb) another-great-day-for-ruby later-that-day [2007] (Jan) next-year-in-ruby ', %{<r:children:each><r:header name="year">[<r:date format='%Y' />] </r:header><r:header name="month">(<r:date format="%b" />) </r:header><r:slug /> </r:children:each>}
81
81
  end
82
82
  def test_tag_children_each_header_with_restart_attribute
83
- @page = pages(:archive)
83
+ @page = pages(:news)
84
84
  assert_renders(
85
- '[2000] (May) article (Jun) article-2 article-3 (Aug) article-4 [2001] (Aug) article-5 ',
85
+ '[2006] (Jan) a-great-day-for-ruby (Feb) another-great-day-for-ruby later-that-day [2007] (Jan) next-year-in-ruby ',
86
86
  %{<r:children:each><r:header name="year" restart="month">[<r:date format='%Y' />] </r:header><r:header name="month">(<r:date format="%b" />) </r:header><r:slug /> </r:children:each>}
87
87
  )
88
88
  assert_renders(
89
- '[2000] (May) <01> article (Jun) <09> article-2 <10> article-3 (Aug) <06> article-4 [2001] (Aug) <06> article-5 ',
89
+ '[2006] (Jan) <30> a-great-day-for-ruby (Feb) <05> another-great-day-for-ruby <06> later-that-day [2007] (Jan) <30> next-year-in-ruby ',
90
90
  %{<r:children:each><r:header name="year" restart="month;day">[<r:date format='%Y' />] </r:header><r:header name="month" restart="day">(<r:date format="%b" />) </r:header><r:header name="day"><<r:date format='%d' />> </r:header><r:slug /> </r:children:each>}
91
91
  )
92
92
  end
@@ -141,7 +141,7 @@ class StandardTagsTest < Test::Unit::TestCase
141
141
  assert_renders '', '<r:content part="sidebar" inherit="false" />'
142
142
  assert_renders 'Radius Test Page sidebar.', '<r:content part="sidebar" inherit="true" />'
143
143
  assert_render_error %{`inherit' attribute of `content' tag must be set to either "true" or "false"}, '<r:content part="sidebar" inherit="weird value" />'
144
-
144
+
145
145
  assert_renders '', '<r:content part="part_that_doesnt_exist" inherit="true" />'
146
146
  end
147
147
  def test_tag_content_with_inherit_and_contextual_attributes
@@ -151,6 +151,14 @@ class StandardTagsTest < Test::Unit::TestCase
151
151
  @page = pages(:inheritance_test_page_grandchild)
152
152
  assert_renders 'Inheritance Test Page Grandchild inherited body.', '<r:content part="body" inherit="true" contextual="true" />'
153
153
  end
154
+ def test_tag_content_with_inherit_attribute_grandparent
155
+ @page = pages(:child)
156
+ assert_renders '', '<r:content part="sidebar" />'
157
+ assert_renders 'Child sidebar.', '<r:content part="sidebar" inherit="true" />'
158
+ @page = pages(:parent)
159
+ assert_renders '', '<r:content part="sidebar" />'
160
+ assert_renders 'Parent sidebar.', '<r:content part="sidebar" inherit="true" />'
161
+ end
154
162
 
155
163
  def test_tag_child_content
156
164
  expected = "Radius test child 1 body.\nRadius test child 2 body.\nRadius test child 3 body.\n"
@@ -200,7 +208,13 @@ class StandardTagsTest < Test::Unit::TestCase
200
208
  assert_renders 'Monday, January 30, 2006', '<r:date for="published_at" />'
201
209
  assert_render_error "Invalid value for 'for' attribute.", '<r:date for="blah" />'
202
210
  end
203
-
211
+ def test_tag_date_uses_local_timezone
212
+ Radiant::Config["local.timezone"] = "Tokyo"
213
+ format = "%H:%m"
214
+ expected = TimeZone["Tokyo"].adjust(@page.published_at).strftime format
215
+ assert_renders expected, %Q(<r:date format="#{format}" />)
216
+ end
217
+
204
218
  def test_tag_link
205
219
  assert_renders '<a href="/radius/">Radius Test Page</a>', '<r:link />'
206
220
  end
@@ -301,7 +315,7 @@ class StandardTagsTest < Test::Unit::TestCase
301
315
  end
302
316
 
303
317
  def test_tag_find_and_children
304
- assert_renders 'a-great-day-for-ruby another-great-day-for-ruby ', %{<r:find url="/news/"><r:children:each><r:slug /> </r:children:each></r:find>}
318
+ assert_renders 'a-great-day-for-ruby another-great-day-for-ruby later-that-day next-year-in-ruby ', %{<r:find url="/news/"><r:children:each><r:slug /> </r:children:each></r:find>}
305
319
  end
306
320
 
307
321
  def test_tag_escape_html
@@ -403,6 +417,37 @@ class StandardTagsTest < Test::Unit::TestCase
403
417
  assert_renders 'true', '<r:unless_parent>true</r:unless_parent>'
404
418
  end
405
419
 
420
+ def test_tag_if_children
421
+ @page = pages(:homepage)
422
+ assert_renders 'true', '<r:if_children>true</r:if_children>'
423
+ @page = pages(:childless)
424
+ assert_renders '', '<r:if_children>true</r:if_children>'
425
+ end
426
+ def test_tag_unless_children
427
+ @page = pages(:homepage)
428
+ assert_renders '', '<r:unless_children>true</r:unless_children>'
429
+ @page = pages(:childless)
430
+ assert_renders 'true', '<r:unless_children>true</r:unless_children>'
431
+ end
432
+
433
+ def test_if_dev
434
+ assert_renders '-dev-', '-<r:if_dev>dev</r:if_dev>-', nil , 'dev.site.com'
435
+ assert_renders '--', '-<r:if_dev>dev</r:if_dev>-'
436
+ end
437
+ def test_if_dev_on_included_page
438
+ assert_renders '-dev-', '-<r:find url="/devtags/"><r:content part="if_dev" /></r:find>-', nil, 'dev.site.com'
439
+ assert_renders '--', '-<r:find url="/devtags/"><r:content part="if_dev" /></r:find>-'
440
+ end
441
+
442
+ def test_unless_dev
443
+ assert_renders '--', '-<r:unless_dev>not dev</r:unless_dev>-', nil, 'dev.site.com'
444
+ assert_renders '-not dev-', '-<r:unless_dev>not dev</r:unless_dev>-'
445
+ end
446
+ def test_unless_dev_on_included_page
447
+ assert_renders '--', '-<r:find url="/devtags/"><r:content part="unless_dev" /></r:find>-', nil, 'dev.site.com'
448
+ assert_renders '-not dev-', '-<r:find url="/devtags/"><r:content part="unless_dev" /></r:find>-'
449
+ end
450
+
406
451
  private
407
452
 
408
453
  def page_children_first_tags(attr = nil)
@@ -415,13 +460,13 @@ class StandardTagsTest < Test::Unit::TestCase
415
460
  "<r:children:last#{attr}><r:slug /></r:children:last>"
416
461
  end
417
462
 
418
-
419
463
  def page_children_each_tags(attr = nil)
420
464
  attr = ' ' + attr unless attr.nil?
421
465
  "<r:children:each#{attr}><r:slug /> </r:children:each>"
422
466
  end
423
-
467
+
424
468
  def page_eachable_children(page)
425
469
  page.children.select(&:published?).reject(&:virtual)
426
470
  end
471
+
427
472
  end
@@ -0,0 +1,29 @@
1
+ = Archive
2
+
3
+ The Archive extension extracts the Archive pages from their original place
4
+ in the Radiant distribution.
5
+
6
+ == Archive page
7
+
8
+ An archive page provides behavior similar to a blog archive or a news
9
+ archive. Child page URLs are altered to be in %Y/%m/%d format
10
+ (2004/05/06).
11
+
12
+ An archive page can be used in conjunction with the "Archive Year Index",
13
+ "Archive Month Index", and "Archive Day Index" page types to create year,
14
+ month, and day indexes.
15
+
16
+ == Archive Index pages
17
+
18
+ To create a year/month/day index for an archive, create a child page for the
19
+ archive and assign the "Archive [Year/Month/Day] Index" page type to it.
20
+
21
+ An index page makes following tags available to you:
22
+
23
+ <r:archive:children>...</r:archive:children>
24
+ Grants access to a subset of the children of the archive page
25
+ that match the specific year/month/day which the index page is rendering.
26
+
27
+ The title and breadcrumb attributes of an index page are rendered using Ruby's
28
+ Time#strftime method. Please refer to documentation for Time#strftime to
29
+ format these attributes.
@@ -0,0 +1,25 @@
1
+ require 'rake'
2
+ require 'rake/testtask'
3
+ require 'rake/rdoctask'
4
+
5
+ desc 'Default: run unit tests.'
6
+ task :default => :test
7
+
8
+ desc 'Test the archive extension.'
9
+ Rake::TestTask.new(:test) do |t|
10
+ t.libs << 'lib'
11
+ t.pattern = 'test/**/*_test.rb'
12
+ t.verbose = true
13
+ end
14
+
15
+ desc 'Generate documentation for the archive extension.'
16
+ Rake::RDocTask.new(:rdoc) do |rdoc|
17
+ rdoc.rdoc_dir = 'rdoc'
18
+ rdoc.title = 'ArchiveExtension'
19
+ rdoc.options << '--line-numbers' << '--inline-source'
20
+ rdoc.rdoc_files.include('README')
21
+ rdoc.rdoc_files.include('lib/**/*.rb')
22
+ end
23
+
24
+ # Load any custom rakefiles for extension
25
+ Dir[File.dirname(__FILE__) + '/tasks/*.rake'].sort.each { |f| require f }
@@ -1,8 +1,9 @@
1
1
  class ArchiveFinder
2
+
2
3
  def initialize(&block)
3
4
  @block = block
4
5
  end
5
-
6
+
6
7
  def find(method, options = {})
7
8
  @block.call(method, options)
8
9
  end
@@ -11,7 +12,7 @@ class ArchiveFinder
11
12
  def year_finder(finder, year)
12
13
  new do |method, options|
13
14
  start = Time.local(year)
14
- finish = start.next_year
15
+ finish = start.next_year
15
16
  add_condition(options, "published_at >= ? and published_at < ?", start, finish)
16
17
  finder.find(method, options)
17
18
  end
@@ -20,7 +21,7 @@ class ArchiveFinder
20
21
  def month_finder(finder, year, month)
21
22
  new do |method, options|
22
23
  start = Time.local(year, month)
23
- finish = start.next_month
24
+ finish = start.next_month
24
25
  add_condition(options, "published_at >= ? and published_at < ?", start, finish)
25
26
  finder.find(method, options)
26
27
  end
@@ -29,25 +30,26 @@ class ArchiveFinder
29
30
  def day_finder(finder, year, month, day)
30
31
  new do |method, options|
31
32
  start = Time.local(year, month, day)
32
- finish = start.tomorrow
33
+ finish = start.tomorrow
33
34
  add_condition(options, "published_at >= ? and published_at < ?", start, finish)
34
35
  finder.find(method, options)
35
36
  end
36
37
  end
37
38
 
38
39
  private
39
-
40
+
40
41
  def concat_conditions(a, b)
41
42
  sql = "(#{ [a.shift, b.shift].compact.join(") AND (") })"
42
43
  params = a + b
43
44
  [sql, *params]
44
45
  end
45
-
46
+
46
47
  def add_condition(options, *condition)
47
48
  old = options[:conditions] || []
48
49
  conditions = concat_conditions(old, condition)
49
50
  options[:conditions] = conditions
50
51
  options
51
52
  end
53
+
52
54
  end
53
55
  end