garterbelt 0.0.2

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.
Files changed (57) hide show
  1. data/.document +5 -0
  2. data/.rspec +1 -0
  3. data/Gemfile +16 -0
  4. data/Gemfile.lock +38 -0
  5. data/LICENSE.txt +20 -0
  6. data/README.rdoc +21 -0
  7. data/Rakefile +46 -0
  8. data/TODO +3 -0
  9. data/VERSION +1 -0
  10. data/garterbelt.gemspec +165 -0
  11. data/lib/garterbelt.rb +23 -0
  12. data/lib/page.rb +46 -0
  13. data/lib/renderers/cache.rb +35 -0
  14. data/lib/renderers/closed_tag.rb +60 -0
  15. data/lib/renderers/comment.rb +14 -0
  16. data/lib/renderers/content_rendering.rb +41 -0
  17. data/lib/renderers/content_tag.rb +36 -0
  18. data/lib/renderers/doctype.rb +24 -0
  19. data/lib/renderers/renderer.rb +33 -0
  20. data/lib/renderers/text.rb +28 -0
  21. data/lib/renderers/xml.rb +9 -0
  22. data/lib/stocking.rb +11 -0
  23. data/lib/support/string.rb +165 -0
  24. data/lib/view.rb +341 -0
  25. data/spec/benchmark/templates/erector.rb +37 -0
  26. data/spec/benchmark/templates/garterbelt.rb +37 -0
  27. data/spec/benchmark/vs_erector.rb +53 -0
  28. data/spec/garterbelt_spec.rb +49 -0
  29. data/spec/integration/expectations/general_view.html +17 -0
  30. data/spec/integration/expectations/variables/view_with_user_and_params.html +23 -0
  31. data/spec/integration/expectations/variables/view_with_user_email.html +23 -0
  32. data/spec/integration/expectations/view_partial_nest.html +24 -0
  33. data/spec/integration/expectations/view_with_tags.html +19 -0
  34. data/spec/integration/templates/view_partial_nest.rb +22 -0
  35. data/spec/integration/templates/view_with_cache.rb +30 -0
  36. data/spec/integration/templates/view_with_partial.rb +36 -0
  37. data/spec/integration/templates/view_with_partial_2.rb +36 -0
  38. data/spec/integration/templates/view_with_tags.rb +26 -0
  39. data/spec/integration/templates/view_with_vars.rb +32 -0
  40. data/spec/integration/view_spec.rb +57 -0
  41. data/spec/page_spec.rb +99 -0
  42. data/spec/renderers/cache_spec.rb +85 -0
  43. data/spec/renderers/closed_tag_spec.rb +172 -0
  44. data/spec/renderers/comment_spec.rb +68 -0
  45. data/spec/renderers/content_tag_spec.rb +150 -0
  46. data/spec/renderers/doctype_spec.rb +46 -0
  47. data/spec/renderers/text_spec.rb +68 -0
  48. data/spec/spec_helper.rb +17 -0
  49. data/spec/support/mock_view.rb +14 -0
  50. data/spec/support/puters.rb +10 -0
  51. data/spec/view/view_basics_spec.rb +106 -0
  52. data/spec/view/view_caching_spec.rb +132 -0
  53. data/spec/view/view_partial_spec.rb +63 -0
  54. data/spec/view/view_rails_type_helpers.rb +148 -0
  55. data/spec/view/view_render_spec.rb +408 -0
  56. data/spec/view/view_variables_spec.rb +159 -0
  57. metadata +367 -0
@@ -0,0 +1,132 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
+
3
+ describe Garterbelt::View, "Caching" do
4
+ class Cached < Garterbelt::View
5
+ end
6
+
7
+ class SpecialCached < Garterbelt::View
8
+ def self.cache_store_key
9
+ :foo
10
+ end
11
+ end
12
+
13
+ describe 'cache access' do
14
+ describe 'class level #cache_store_key' do
15
+ it 'defaults to :default' do
16
+ Garterbelt::View.cache_store_key.should == :default
17
+ Cached.cache_store_key.should == :default
18
+ end
19
+
20
+ it 'can be customized' do
21
+ SpecialCached.cache_store_key.should == :foo
22
+ end
23
+ end
24
+
25
+ describe 'instance level #cache_store_key' do
26
+ it 'defaults to the class' do
27
+ Cached.new.cache_store_key.should == :default
28
+ SpecialCached.new.cache_store_key.should == :foo
29
+ end
30
+
31
+ it 'can be set independently' do
32
+ cached = Cached.new
33
+ cached.cache_store_key = :boo
34
+ cached.cache_store_key.should == :boo
35
+ end
36
+ end
37
+
38
+ describe 'cache_store' do
39
+ it 'returns a cache object' do
40
+ Cached.new.cache_store.should == Garterbelt.cache
41
+ end
42
+
43
+ it 'uses the instance level cache_store_key' do
44
+ cached = Cached.new
45
+ Garterbelt.cache_hash[:foo] = 'foo'
46
+ cached.cache_store_key = :foo
47
+ cached.cache_store.should == 'foo'
48
+ end
49
+ end
50
+
51
+ describe 'cache key base' do
52
+ describe 'class level' do
53
+ it 'is the underscored version of the class by default' do
54
+ Cached.cache_key_base.should == 'cached'
55
+ SpecialCached.cache_key_base.should == 'special_cached'
56
+ end
57
+
58
+ it 'can be customized' do
59
+ Cached.cache_key_base = 'custom_cache_key_base'
60
+ Cached.cache_key_base.should == 'custom_cache_key_base'
61
+ end
62
+ end
63
+
64
+ describe 'instance level' do
65
+ it 'defaults to the class' do
66
+ Cached.cache_key_base = 'cached'
67
+ Cached.new.cache_key_base.should == 'cached'
68
+ end
69
+
70
+ it 'can be customized, which is probably a bad idea, but maybe necessary in crappy code' do
71
+ Cached.cache_key_base.should == 'cached'
72
+ cached = Cached.new
73
+ cached.cache_key_base = 'foo'
74
+ cached.cache_key_base.should == 'foo'
75
+ end
76
+ end
77
+ end
78
+
79
+ describe '#cache_key' do
80
+ it 'it contains the instance level base' do
81
+ cache = Cached.new
82
+ cache.cache_key.should include "cached"
83
+ cache.cache_key_base = 'foo'
84
+ cache.cache_key.should include 'foo'
85
+ end
86
+
87
+ it 'has a default _default argument that is concatenated' do
88
+ cache = Cached.new
89
+ cache.cache_key.should == 'cached_default'
90
+ end
91
+
92
+ it 'takes a custom key argument' do
93
+ cache = Cached.new
94
+ cache.cache_key(:foo).should == 'cached_foo'
95
+ end
96
+
97
+ it 'uses the default when passed nil' do
98
+ cache = Cached.new
99
+ cache.cache_key(nil).should == 'cached_default'
100
+ end
101
+ end
102
+ end
103
+
104
+ describe '#cache' do
105
+ before do
106
+ @view = Cached.new
107
+ end
108
+
109
+ it 'makes a Cache object' do
110
+ Garterbelt::Cache.should_receive(:new).and_return('foo')
111
+ @view.cache("user_8") do
112
+ puts "bar"
113
+ end
114
+ end
115
+
116
+ it 'passes the correct key and the view' do
117
+ Garterbelt::Cache.should_receive(:new).with(:view => @view, :key => "cached_user_8").and_return('foo')
118
+ @view.cache("user_8") do
119
+ puts "bar"
120
+ end
121
+ end
122
+
123
+ it 'adds the Cache object to the render buffer' do
124
+ @view.cache("foo_you") do
125
+ puts "bar"
126
+ end
127
+ cache = @view.buffer.last
128
+ cache.is_a?(Garterbelt::Cache).should be_true
129
+ cache.key.should == 'cached_foo_you'
130
+ end
131
+ end
132
+ end
@@ -0,0 +1,63 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
+
3
+ describe Garterbelt::View, 'Partials' do
4
+ describe '#partial' do
5
+ before do
6
+ @view = Garterbelt::View.new
7
+ @view.output = "Foo You!\n"
8
+ @view.level = 3
9
+ @view.buffer = ['foo', 'bar']
10
+ end
11
+
12
+ describe 'with an instance' do
13
+ before do
14
+ @child_instance = Garterbelt::View.new
15
+ end
16
+
17
+ it 'sets the curator of the instance to the current view' do
18
+ @child_instance.should_receive(:curator=).with(@view)
19
+ @view.partial(@child_instance)
20
+ end
21
+
22
+ it 'adds the instance to the curator view buffer' do
23
+ @view.partial(@child_instance)
24
+ @view.buffer.should include @child_instance
25
+ end
26
+ end
27
+
28
+ describe 'with a class and initialization options' do
29
+ class PartedOut < Garterbelt::View
30
+ needs :x => 'x'
31
+ def content
32
+ text "foo #{x}"
33
+ end
34
+ end
35
+
36
+ it 'constructs a new instance' do
37
+ @part = PartedOut.new
38
+ PartedOut.should_receive(:new).and_return(@part)
39
+ @view.partial(PartedOut, :x => '!= x')
40
+ end
41
+
42
+ it 'adds the instance to the buffer' do
43
+ @view.partial(PartedOut, :x => '!= y?')
44
+ partial = @view.buffer.last
45
+ partial.is_a?(PartedOut).should be_true
46
+ end
47
+
48
+
49
+ it 'has the curator as the current view' do
50
+ @view.partial(PartedOut, :x => 'what about z?')
51
+ partial = @view.buffer.last
52
+ partial.curator.should == @view
53
+ end
54
+
55
+ it 'has the correct initalization options' do
56
+ @view.partial(PartedOut, :x => '= foo')
57
+ partial = @view
58
+ end
59
+
60
+ it 'passes along the block, wait do views take blocks right now?'
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,148 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
+
3
+ describe Garterbelt::View, "Rails Style Helpers" do
4
+ describe 'inputs' do
5
+ describe '#input' do
6
+ it 'defaults to type of text'
7
+ end
8
+
9
+ describe 'checkbox' do
10
+
11
+ end
12
+ end
13
+
14
+ describe '#form' do
15
+ describe 'method option' do
16
+ describe ':put' do
17
+ it 'builds _method hidden input with the correct attribute'
18
+ it 'sets the form method attribute to post'
19
+ end
20
+
21
+ describe ':delete' do
22
+ it 'builds _method hidden input with the correct attribute'
23
+ it 'sets the form method attribute to post'
24
+ end
25
+
26
+ it 'defaults to :post when none is given'
27
+ it 'can be set to :get too'
28
+ it 'has that Rails fraud detector thingy when available'
29
+ end
30
+ end
31
+
32
+ describe '#image' do
33
+ describe 'class level image path' do
34
+ it 'has a default class image path /images'
35
+ it 'class level image path can be customized'
36
+ it 'class level image path is inherited'
37
+ end
38
+
39
+ it 'takes the file name as first argument constructs a full path for the img src'
40
+
41
+ describe 'alt text' do
42
+ it 'humanizes the file name by default'
43
+ it 'can be customize through options'
44
+ end
45
+
46
+ it 'takes other attributes'
47
+
48
+ describe 'expiration tagging' do
49
+ it 'includes one related to the file updated time in seconds'
50
+ end
51
+ end
52
+
53
+ describe '#auto_discovery' do
54
+ # auto_discovery_link_tag # =>
55
+ # <link rel="alternate" type="application/rss+xml" title="RSS" href="http://www.currenthost.com/controller/action" />
56
+ # auto_discovery_link_tag(:atom) # =>
57
+ # <link rel="alternate" type="application/atom+xml" title="ATOM" href="http://www.currenthost.com/controller/action" />
58
+ # auto_discovery_link_tag(:rss, {:action => "feed"}) # =>
59
+ # <link rel="alternate" type="application/rss+xml" title="RSS" href="http://www.currenthost.com/controller/feed" />
60
+ # auto_discovery_link_tag(:rss, {:action => "feed"}, {:title => "My RSS"}) # =>
61
+ # <link rel="alternate" type="application/rss+xml" title="My RSS" href="http://www.currenthost.com/controller/feed" />
62
+ # auto_discovery_link_tag(:rss, {:controller => "news", :action => "feed"}) # =>
63
+ # <link rel="alternate" type="application/rss+xml" title="RSS" href="http://www.currenthost.com/news/feed" />
64
+ # auto_discovery_link_tag(:rss, "http://www.example.com/feed.rss", {:title => "Example RSS"}) # =>
65
+ # <link rel="alternate" type="application/rss+xml" title="Example RSS" href="http://www.example.com/feed" />
66
+ end
67
+
68
+ describe '#script_include' do
69
+ # javascript_include_tag "xmlhr" # =>
70
+ # <script type="text/javascript" src="/javascripts/xmlhr.js"></script>
71
+ #
72
+ # javascript_include_tag "xmlhr.js" # =>
73
+ # <script type="text/javascript" src="/javascripts/xmlhr.js"></script>
74
+ #
75
+ # javascript_include_tag "common.javascript", "/elsewhere/cools" # =>
76
+ # <script type="text/javascript" src="/javascripts/common.javascript"></script>
77
+ # <script type="text/javascript" src="/elsewhere/cools.js"></script>
78
+ #
79
+ # javascript_include_tag "http://www.railsapplication.com/xmlhr" # =>
80
+ # <script type="text/javascript" src="http://www.railsapplication.com/xmlhr.js"></script>
81
+ #
82
+ # javascript_include_tag "http://www.railsapplication.com/xmlhr.js" # =>
83
+ # <script type="text/javascript" src="http://www.railsapplication.com/xmlhr.js"></script>
84
+ #
85
+ # javascript_include_tag :defaults # =>
86
+ # <script type="text/javascript" src="/javascripts/prototype.js"></script>
87
+ # <script type="text/javascript" src="/javascripts/effects.js"></script>
88
+ # ...
89
+ # <script type="text/javascript" src="/javascripts/application.js"></script>
90
+ #
91
+ # * = The application.js file is only referenced if it exists
92
+ #
93
+ # Though it's not really recommended practice, if you need to extend the default JavaScript set for any reason
94
+ # (e.g., you're going to be using a certain .js file in every action), then take a look at the register_javascript_include_default method.
95
+ #
96
+ # You can also include all javascripts in the javascripts directory using <tt>:all</tt> as the source:
97
+ #
98
+ # javascript_include_tag :all # =>
99
+ # <script type="text/javascript" src="/javascripts/prototype.js"></script>
100
+ # <script type="text/javascript" src="/javascripts/effects.js"></script>
101
+ # ...
102
+ # <script type="text/javascript" src="/javascripts/application.js"></script>
103
+ # <script type="text/javascript" src="/javascripts/shop.js"></script>
104
+ # <script type="text/javascript" src="/javascripts/checkout.js"></script>
105
+ #
106
+ # Note that the default javascript files will be included first. So Prototype and Scriptaculous are available to
107
+ # all subsequently included files.
108
+ #
109
+ # If you want Rails to search in all the subdirectories under javascripts, you should explicitly set <tt>:recursive</tt>:
110
+ #
111
+ # javascript_include_tag :all, :recursive => true
112
+ #
113
+ # == Caching multiple javascripts into one
114
+ #
115
+ # You can also cache multiple javascripts into one file, which requires less HTTP connections to download and can better be
116
+ # compressed by gzip (leading to faster transfers). Caching will only happen if config.perform_caching
117
+ # is set to <tt>true</tt> (which is the case by default for the Rails production environment, but not for the development
118
+ # environment).
119
+ #
120
+ # ==== Examples
121
+ # javascript_include_tag :all, :cache => true # when config.perform_caching is false =>
122
+ # <script type="text/javascript" src="/javascripts/prototype.js"></script>
123
+ # <script type="text/javascript" src="/javascripts/effects.js"></script>
124
+ # ...
125
+ # <script type="text/javascript" src="/javascripts/application.js"></script>
126
+ # <script type="text/javascript" src="/javascripts/shop.js"></script>
127
+ # <script type="text/javascript" src="/javascripts/checkout.js"></script>
128
+ #
129
+ # javascript_include_tag :all, :cache => true # when config.perform_caching is true =>
130
+ # <script type="text/javascript" src="/javascripts/all.js"></script>
131
+ #
132
+ # javascript_include_tag "prototype", "cart", "checkout", :cache => "shop" # when config.perform_caching is false =>
133
+ # <script type="text/javascript" src="/javascripts/prototype.js"></script>
134
+ # <script type="text/javascript" src="/javascripts/cart.js"></script>
135
+ # <script type="text/javascript" src="/javascripts/checkout.js"></script>
136
+ #
137
+ # javascript_include_tag "prototype", "cart", "checkout", :cache => "shop" # when config.perform_caching is true =>
138
+ # <script type="text/javascript" src="/javascripts/shop.js"></script
139
+ end
140
+
141
+ describe '#stylesheet_include' do
142
+ # same as above but for stylesheets
143
+ end
144
+
145
+ describe 'favicon' do
146
+ end
147
+
148
+ end