nestive 0.1.0 → 0.2.0

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.
@@ -0,0 +1,4 @@
1
+ rvm:
2
+ - 1.9.3
3
+ - 1.9.2
4
+ - 1.8.7
data/Gemfile CHANGED
@@ -1,4 +1,4 @@
1
- source "http://rubygems.org"
1
+ source :rubygems
2
2
 
3
3
  # Specify dependencies in nestive.gemspec
4
4
  gemspec
@@ -1,78 +1,110 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- nestive (0.0.1.pre)
4
+ nestive (0.1.0)
5
5
  rails (~> 3.0)
6
6
 
7
7
  GEM
8
8
  remote: http://rubygems.org/
9
9
  specs:
10
- abstract (1.0.0)
11
- actionmailer (3.0.7)
12
- actionpack (= 3.0.7)
13
- mail (~> 2.2.15)
14
- actionpack (3.0.7)
15
- activemodel (= 3.0.7)
16
- activesupport (= 3.0.7)
17
- builder (~> 2.1.2)
18
- erubis (~> 2.6.6)
19
- i18n (~> 0.5.0)
20
- rack (~> 1.2.1)
21
- rack-mount (~> 0.6.14)
22
- rack-test (~> 0.5.7)
23
- tzinfo (~> 0.3.23)
24
- activemodel (3.0.7)
25
- activesupport (= 3.0.7)
26
- builder (~> 2.1.2)
27
- i18n (~> 0.5.0)
28
- activerecord (3.0.7)
29
- activemodel (= 3.0.7)
30
- activesupport (= 3.0.7)
31
- arel (~> 2.0.2)
32
- tzinfo (~> 0.3.23)
33
- activeresource (3.0.7)
34
- activemodel (= 3.0.7)
35
- activesupport (= 3.0.7)
36
- activesupport (3.0.7)
37
- arel (2.0.10)
38
- builder (2.1.2)
39
- erubis (2.6.6)
40
- abstract (>= 1.0.0)
41
- i18n (0.5.0)
42
- mail (2.2.19)
43
- activesupport (>= 2.3.6)
10
+ actionmailer (3.2.8)
11
+ actionpack (= 3.2.8)
12
+ mail (~> 2.4.4)
13
+ actionpack (3.2.8)
14
+ activemodel (= 3.2.8)
15
+ activesupport (= 3.2.8)
16
+ builder (~> 3.0.0)
17
+ erubis (~> 2.7.0)
18
+ journey (~> 1.0.4)
19
+ rack (~> 1.4.0)
20
+ rack-cache (~> 1.2)
21
+ rack-test (~> 0.6.1)
22
+ sprockets (~> 2.1.3)
23
+ activemodel (3.2.8)
24
+ activesupport (= 3.2.8)
25
+ builder (~> 3.0.0)
26
+ activerecord (3.2.8)
27
+ activemodel (= 3.2.8)
28
+ activesupport (= 3.2.8)
29
+ arel (~> 3.0.2)
30
+ tzinfo (~> 0.3.29)
31
+ activeresource (3.2.8)
32
+ activemodel (= 3.2.8)
33
+ activesupport (= 3.2.8)
34
+ activesupport (3.2.8)
35
+ i18n (~> 0.6)
36
+ multi_json (~> 1.0)
37
+ arel (3.0.2)
38
+ builder (3.0.4)
39
+ combustion (0.3.2)
40
+ rails (>= 3.0.0)
41
+ thor (>= 0.14.6)
42
+ diff-lcs (1.1.3)
43
+ erubis (2.7.0)
44
+ hike (1.2.1)
45
+ i18n (0.6.1)
46
+ journey (1.0.4)
47
+ json (1.7.5)
48
+ mail (2.4.4)
44
49
  i18n (>= 0.4.0)
45
50
  mime-types (~> 1.16)
46
51
  treetop (~> 1.4.8)
47
- mime-types (1.16)
48
- polyglot (0.3.1)
49
- rack (1.2.3)
50
- rack-mount (0.6.14)
51
- rack (>= 1.0.0)
52
- rack-test (0.5.7)
52
+ mime-types (1.19)
53
+ multi_json (1.3.7)
54
+ polyglot (0.3.3)
55
+ rack (1.4.1)
56
+ rack-cache (1.2)
57
+ rack (>= 0.4)
58
+ rack-ssl (1.3.2)
59
+ rack
60
+ rack-test (0.6.2)
53
61
  rack (>= 1.0)
54
- rails (3.0.7)
55
- actionmailer (= 3.0.7)
56
- actionpack (= 3.0.7)
57
- activerecord (= 3.0.7)
58
- activeresource (= 3.0.7)
59
- activesupport (= 3.0.7)
62
+ rails (3.2.8)
63
+ actionmailer (= 3.2.8)
64
+ actionpack (= 3.2.8)
65
+ activerecord (= 3.2.8)
66
+ activeresource (= 3.2.8)
67
+ activesupport (= 3.2.8)
60
68
  bundler (~> 1.0)
61
- railties (= 3.0.7)
62
- railties (3.0.7)
63
- actionpack (= 3.0.7)
64
- activesupport (= 3.0.7)
69
+ railties (= 3.2.8)
70
+ railties (3.2.8)
71
+ actionpack (= 3.2.8)
72
+ activesupport (= 3.2.8)
73
+ rack-ssl (~> 1.3.2)
65
74
  rake (>= 0.8.7)
66
- thor (~> 0.14.4)
67
- rake (0.9.0)
68
- thor (0.14.6)
69
- treetop (1.4.9)
75
+ rdoc (~> 3.4)
76
+ thor (>= 0.14.6, < 2.0)
77
+ rake (0.9.2.2)
78
+ rdoc (3.12)
79
+ json (~> 1.4)
80
+ rspec (2.11.0)
81
+ rspec-core (~> 2.11.0)
82
+ rspec-expectations (~> 2.11.0)
83
+ rspec-mocks (~> 2.11.0)
84
+ rspec-core (2.11.1)
85
+ rspec-expectations (2.11.3)
86
+ diff-lcs (~> 1.1.3)
87
+ rspec-mocks (2.11.3)
88
+ rspec-rails (2.11.4)
89
+ actionpack (>= 3.0)
90
+ activesupport (>= 3.0)
91
+ railties (>= 3.0)
92
+ rspec (~> 2.11.0)
93
+ sprockets (2.1.3)
94
+ hike (~> 1.2)
95
+ rack (~> 1.0)
96
+ tilt (~> 1.1, != 1.3.0)
97
+ thor (0.16.0)
98
+ tilt (1.3.3)
99
+ treetop (1.4.12)
100
+ polyglot
70
101
  polyglot (>= 0.3.1)
71
- tzinfo (0.3.27)
102
+ tzinfo (0.3.35)
72
103
 
73
104
  PLATFORMS
74
105
  ruby
75
106
 
76
107
  DEPENDENCIES
108
+ combustion (~> 0.3.2)
77
109
  nestive!
78
- rails (~> 3.0)
110
+ rspec-rails (~> 2.11)
data/README.md CHANGED
@@ -1,6 +1,7 @@
1
- # Nestive, A Nested Inheritable Layouts Plugin for Rails
1
+ # Nestive
2
+ [![Build Status](https://travis-ci.org/rwz/nestive.png)](https://travis-ci.org/rwz/nestive)
3
+ ## A Nested Inheritable Layouts Plugin for Rails
2
4
 
3
- **Note: This is ridiculously alpha proof-of-concept seeking feedback. Things will change.**
4
5
 
5
6
  Nestive adds powerful layout and view helpers to your Rails app. It's similar to the nested layout technique [already documented in the Rails guides](http://guides.rubyonrails.org/layouts_and_rendering.html#using-nested-layouts) and found in many other nested layout plugins (a technique using `content_for` and rendering the parent layout at the end of the child layout). There's a bunch of problems with this technique, including:
6
7
 
@@ -9,14 +10,14 @@ Nestive adds powerful layout and view helpers to your Rails app. It's similar to
9
10
 
10
11
  Nestive is *better* because it addresses these problems.
11
12
 
12
- ## Just five methods (so far) – `area`, `extend`, `append`, `prepend`, `replace`.
13
+ ## Just five methods (so far) – `area`, `extends`, `append`, `prepend`, `replace`.
13
14
 
14
15
  ### Declaring an area of content in your parent layout with `area`:
15
16
 
16
17
  The `area` helper is a lot like Rails' own `<%= yield :foo %>`, and is used in layouts to define and render a chunk of content in your layout:
17
18
 
18
19
  <%= area :sidebar %>
19
-
20
+
20
21
  Unlike `yield`, `area` will allow your parent layouts to add content to the area at the same time using either a String or a block:
21
22
 
22
23
  <%= area :sidebar, "Some Content Here" %>
@@ -24,41 +25,16 @@ Unlike `yield`, `area` will allow your parent layouts to add content to the area
24
25
  <%= area :sidebar do %>
25
26
  Some Content Here
26
27
  <% end %>
27
-
28
- It's important to note that this isn't *default* content, it *is* the content (unless a child changes it).
29
-
30
- ### Extending a layout in a child layout (or view):
31
-
32
- Any layout (or view) can declare that it wants to inherit from and extend a parent layout, in this case we're extending `app/views/layouts/application.html.erb`:
33
-
34
- <%= extends :application do %>
35
- ...
36
- <% end %>
37
-
38
- You can nest many levels deep:
39
28
 
40
- # app/views/posts/index.html.erb
41
- <%= extends :blog do %>
42
- ...
43
- <% end %>
44
-
45
- # app/views/layouts/blog.html.erb
46
- <%= extends :public do %>
47
- ...
48
- <% end %>
49
-
50
- # app/views/layouts/public.html.erb
51
- <%= extends :application do %>
52
- ...
53
- <% end %>
29
+ It's important to note that this isn't *default* content, it *is* the content (unless a child changes it).
54
30
 
55
31
  ### Appending content to an area:
56
32
 
57
33
  The implementation details are quite different, but the `append` helper works much like Rails' built-in `content_for`. It will work with either a String or block, adding the new content onto the end of any content previously provided by parent layouts:
58
34
 
59
35
  <%= extends :application do %>
60
- <%= append :sidebar, "More content." %>
61
- <%= append :sidebar do %>
36
+ <% append :sidebar, "More content." %>
37
+ <% append :sidebar do %>
62
38
  More content.
63
39
  <% end %>
64
40
  <% end %>
@@ -85,17 +61,63 @@ You can also replace any content provided by parent layouts:
85
61
  <% end %>
86
62
  <% end %>
87
63
 
64
+ ### Extending a layout in a child layout (or view):
65
+
66
+ Any layout (or view) can declare that it wants to inherit from and extend a parent layout, in this case we're extending `app/views/layouts/application.html.erb`:
67
+
68
+ <%= extends :application do %>
69
+ ...
70
+ <% end %>
71
+
72
+ You can nest many levels deep:
73
+
74
+ # app/views/layouts/application.html.erb
75
+ <!DOCTYPE html>
76
+ <html>
77
+ <head>
78
+ <%= area :head do %>
79
+ <title><%= area :title, 'Nestive' %></title>
80
+ <% end %>
81
+ </head>
82
+ <body>
83
+ <%= yield %>
84
+ </body>
85
+ </html>
86
+
87
+ # app/views/layouts/with_sidebar.html.erb
88
+ <%= extends :application do %>
89
+ <div class="sidebar"><%= area(:sidebar) do %>
90
+ here goes sidebar
91
+ <% end %></div>
92
+ <%= yield -%>
93
+ <% end %>
94
+
95
+ # app/views/layouts/blog_posts.html.erb
96
+ <%= extends :with_sidebar do %>
97
+ <% append :sidebar do %>
98
+ Blog archive:
99
+ <%= render_blog_archive %>
100
+ <% end %>
101
+
102
+ <% append :head do %>
103
+ <%= javascript_include_tag 'fancy_blog_archive_tag_cloud' %>
104
+ <% end %>
105
+
106
+ <%= yield %>
107
+ <% end %>
108
+
109
+
88
110
 
89
111
  ## The token blog example
90
112
 
91
- Set-up a global layout defining some content areas. Note that there is no `<% yield %>` here.
92
-
113
+ Set-up a global layout defining some content areas.
114
+
93
115
  # app/views/layouts/application.html.erb
94
116
  <!DOCTYPE html>
95
117
  <html>
96
118
  <head>
97
119
  <meta charset="utf-8">
98
- <title><%= area :title %> JustinFrench.com</title>
120
+ <title><%= area :title, "JustinFrench.com" %></title>
99
121
  <meta name="description" content="<%= area :description, "This is my website." %>">
100
122
  <meta name="keywords" content="<%= area :keywords, "justin, french, ruby, design" %>">
101
123
  </head>
@@ -113,76 +135,49 @@ Set-up a global layout defining some content areas. Note that there is no `<% yi
113
135
  <% end %>
114
136
  </div>
115
137
  </div>
138
+ <%= yield %>
116
139
  </body>
117
140
  </html>
118
-
141
+
119
142
  Next, we set-up a `blog` layout that extends `application`, replacing, appending & prepending content to the areas we defined earlier.
120
-
143
+
121
144
  # app/views/layouts/blog.html.erb
122
145
  <%= extends :application do %>
123
146
  <% replace :title, "My Blog – " %>
124
147
  <% replace :description, "Justin French blogs here on Ruby, Rails, Design, Formtastic, etc" %>
125
148
  <% prepend :keywords, "blog, weblog, design links, ruby links, formtastic release notes, " %>
149
+ <%= yield %>
126
150
  <% end %>
127
151
 
128
- Now our blog index view can extend `blog` and fill in the areas with content specific to the index action.
129
-
152
+ Now in our blog index view we can use `blog` layout and fill in the areas with content specific to the index action.
153
+
130
154
  # app/views/posts/index.html.erb
131
- <%= extends :blog do %>
132
- <% replace :content do %>
133
- <h1>My Blog</h1>
134
- <% render @articles %>
135
- <% end %>
136
-
137
- <% append :content do %>
138
- <h2>Blog Roll</h2>
139
- <% render @links %>
140
- <% end %>
155
+ <% replace :content do %>
156
+ <h1>My Blog</h1>
157
+ <%= render @articles %>
141
158
  <% end %>
142
-
143
- We also need to instruct the `PostsController` not to wrap the view in a layout of it's own (default Rails behavior), which can be done on an individual action:
144
159
 
145
- # app/controllers/posts_controller.rb
146
- class PostsController < ApplicationController
147
- def index
148
- render :layout => nil
149
- end
150
- end
160
+ <% append :sidebar do %>
161
+ <h2>Blog Roll</h2>
162
+ <%= render @links %>
163
+ <% end %>
151
164
 
152
- Or for an entire controller:
165
+ We also need to instruct the `PostsController` to use this `blog` layout:
153
166
 
154
167
  # app/controllers/posts_controller.rb
155
168
  class PostsController < ApplicationController
156
- layout nil
169
+ layout 'blog'
157
170
  end
158
-
159
- Or for every controller:
160
-
161
- # app/controllers/application_controller.rb
162
- class ApplicationController < ActionController::Base
163
- layout nil
164
- end
165
-
166
- We'll find a way to make this easier or a bit more obvious in a future version.
167
171
 
168
172
 
169
173
  ## Installation
170
174
 
171
- * add `gem 'nestive', '~> 0.1'` to your gemfile
175
+ * add `gem 'nestive', '~> 0.2'` to your gemfile
172
176
  * run `bundle`
173
- * add `layout nil` to ApplicationController or the specific controllers you want to use Nestive on (see above)
174
-
175
-
176
- ## TODO
177
-
178
- * Figure out how to test it
179
- * Actually use it in an app
180
- * You know, everything!
181
-
182
177
 
183
178
  ## Compatibility
184
179
 
185
- Only testing it with Rails 3.1 RCs right now, but it should work with Rails 2 & 3. The dependency is set to ~> 3.0 right now, will change to 2.x when someone can test it works.
180
+ Nestive should work properly with any Rails 3.*. It should probably work with 2.* too, but we don't have test coverage for this.
186
181
 
187
182
  *Nestive doesn't monkey patch or fiddle with any default behaviors in Rails.* Use it when you want to, don't when you don't.
188
183
 
@@ -195,5 +190,5 @@ Only testing it with Rails 3.1 RCs right now, but it should work with Rails 2 &
195
190
 
196
191
  ## Twitter
197
192
 
198
- * [@nestivegem](http://twitter.com/nestivegem)
199
- * [@justinfrench](http://twitter.com/justinfrench)
193
+ * [@rwz](https://twitter.com/rwz) — current maintainer
194
+ * [@justinfrench](http://twitter.com/justinfrench) — author
data/Rakefile CHANGED
@@ -1,21 +1,15 @@
1
1
  #!/usr/bin/env rake
2
- require 'rake/testtask'
2
+ require 'rspec/core/rake_task'
3
3
  require 'rdoc/task'
4
4
 
5
5
  require 'bundler'
6
6
  Bundler::GemHelper.install_tasks
7
7
 
8
8
 
9
- desc 'Default: run unit tests.'
10
- task :default => :test
9
+ task :default => :spec
11
10
 
12
- desc 'Test the nestive plugin.'
13
- Rake::TestTask.new(:test) do |t|
14
- t.libs << 'lib'
15
- t.libs << 'test'
16
- t.pattern = 'test/**/*_test.rb'
17
- t.verbose = true
18
- end
11
+ desc 'Run specs'
12
+ RSpec::Core::RakeTask.new
19
13
 
20
14
  desc 'Generate documentation for the nestive plugin.'
21
15
  Rake::RDocTask.new(:rdoc) do |rdoc|
@@ -1,9 +1,9 @@
1
1
  module Nestive
2
-
2
+
3
3
  # The Nestive LayoutHelper provides a handful of helper methods for use in your layouts and views.
4
4
  #
5
- # See the documentation for each individual method for detailed information, but at a high level,
6
- # your parent layouts define `area`s of content. You can define an area and optionally add content
5
+ # See the documentation for each individual method for detailed information, but at a high level,
6
+ # your parent layouts define `area`s of content. You can define an area and optionally add content
7
7
  # to it at the same time using either a String, or a block:
8
8
  #
9
9
  # # app/views/layouts/global.html.erb
@@ -24,11 +24,11 @@ module Nestive
24
24
  # </body>
25
25
  # </html>
26
26
  #
27
- # Your child layouts (or views) inherit and modify the parent by wrapping in an `extend` block
28
- # helper. You can then either `append`, `prepend` or `replace` the content that has previously
27
+ # Your child layouts (or views) inherit and modify the parent by wrapping in an `extends` block
28
+ # helper. You can then either `append`, `prepend` or `replace` the content that has previously
29
29
  # been assigned to each area by parent layouts.
30
30
  #
31
- # The `append`, `prepend` or `replace` helpers are *similar* to Rails' own `content_for`, which
31
+ # The `append`, `prepend` or `replace` helpers are *similar* to Rails' own `content_for`, which
32
32
  # accepts content for the named area with either a String or with a block). They're different to
33
33
  # `content_for` because they're only used modify the content assigned to the area, not retrieve it:
34
34
  #
@@ -51,7 +51,7 @@ module Nestive
51
51
  # <% end %>
52
52
  # <% end %>
53
53
  module LayoutHelper
54
-
54
+
55
55
  # Declares that the current layour (or view) is inheriting from and extending another layout.
56
56
  #
57
57
  # @param [Symbol] name
@@ -70,10 +70,10 @@ module Nestive
70
70
  # class Admin::PostsController < ApplicationController
71
71
  # # You can disable Rails' layout rendering for all actions
72
72
  # layout nil
73
- #
73
+ #
74
74
  # # Or disable Rails' layout rendering per-controller
75
75
  # def index
76
- # render :layout => nil
76
+ # render :layout => nil
77
77
  # end
78
78
  # end
79
79
  #
@@ -81,12 +81,20 @@ module Nestive
81
81
  # <%= extends :admin do %>
82
82
  # ...
83
83
  # <% end %>
84
- def extends(name, &block)
85
- capture(&block)
86
- render(:file => "layouts/#{name}")
84
+ def extends(layout, &block)
85
+ # Make sure it's a string
86
+ layout = layout.to_s
87
+
88
+ # If there's no directory component, presume a plain layout name
89
+ layout = layout.include?('/') ? layout : "layouts/#{layout}"
90
+
91
+ # Capture the content to be placed inside the extended layout
92
+ content_for(:layout).replace capture(&block)
93
+
94
+ render :file => layout
87
95
  end
88
-
89
- # Defines an area of content in your layout that can be modified or replaced by child layouts
96
+
97
+ # Defines an area of content in your layout that can be modified or replaced by child layouts
90
98
  # that extend it. You can optionally add content to an area using either a String, or a block.
91
99
  #
92
100
  # Areas are declared in a parent layout and modified by a child layout, but since Nestive
@@ -121,13 +129,13 @@ module Nestive
121
129
  append(name, content)
122
130
  render_area(name)
123
131
  end
124
-
132
+
125
133
  def block(name, content=nil, &block)
126
134
  ActiveSupport::Deprecation.warn("block() is deprecated and will be removed very soon, please use area() instead")
127
135
  area(name, content, &block)
128
136
  end
129
-
130
- # Appends content to an area previously defined or modified in parent layout(s). You can provide
137
+
138
+ # Appends content to an area previously defined or modified in parent layout(s). You can provide
131
139
  # the content using either a String, or a block.
132
140
  #
133
141
  # @example Appending content with a String
@@ -146,9 +154,10 @@ module Nestive
146
154
  def append(name, content=nil, &block)
147
155
  content = capture(&block) if block_given?
148
156
  add_instruction_to_area(name, :push, content)
157
+ nil
149
158
  end
150
159
 
151
- # Prepends content to an area previously declared or modified in parent layout(s). You can
160
+ # Prepends content to an area previously declared or modified in parent layout(s). You can
152
161
  # provide the content using either a String, or a block.
153
162
  #
154
163
  # @example Prepending content with a String
@@ -167,9 +176,10 @@ module Nestive
167
176
  def prepend(name, content=nil, &block)
168
177
  content = capture(&block) if block_given?
169
178
  add_instruction_to_area(name, :unshift, content)
179
+ nil
170
180
  end
171
-
172
- # Replaces the content of an area previously declared or modified in parent layout(s). You can
181
+
182
+ # Replaces the content of an area previously declared or modified in parent layout(s). You can
173
183
  # provide the content using either a String, or a block.
174
184
  #
175
185
  # @example Prepending content with a String
@@ -188,20 +198,21 @@ module Nestive
188
198
  def replace(name, content=nil, &block)
189
199
  content = capture(&block) if block_given?
190
200
  add_instruction_to_area(name, :replace, [content])
201
+ nil
191
202
  end
192
-
203
+
193
204
  private
194
-
205
+
195
206
  # We record the instructions (declaring, appending, prepending and replacing) for an area of
196
207
  # content into an array that we can later retrieve and replay. Instructions are stored in an
197
- # instance variable Hash `@_area_for`, with each key representing an area name, and each value
198
- # an Array of instructions. Each instruction is a two element array containing a instruction
208
+ # instance variable Hash `@_area_for`, with each key representing an area name, and each value
209
+ # an Array of instructions. Each instruction is a two element array containing a instruction
199
210
  # method (eg `:push`, `:unshift`, `:replace`) and a value (content String).
200
211
  #
201
212
  # @_area_for[:sidebar] # => [ [:push,"World"], [:unshift,"Hello"] ]
202
213
  #
203
214
  # Due to the way we extend layouts (render the parent layout after the child), the instructions
204
- # are captured in reverse order. `render_area` reversed them and plays them back at rendering
215
+ # are captured in reverse order. `render_area` reversed them and plays them back at rendering
205
216
  # time.
206
217
  #
207
218
  # @example
@@ -211,12 +222,12 @@ module Nestive
211
222
  @_area_for[name] ||= []
212
223
  @_area_for[name] << [instruction, value]
213
224
  end
214
-
225
+
215
226
  # Take the instructions we've gathered for the area and replay them one after the other on
216
227
  # an empty array. These instructions will push, unshift or replace items into our output array,
217
228
  # which we then join and mark as html_safe.
218
229
  #
219
- # These instructions are reversed and replayed when we render the block (rather than as they
230
+ # These instructions are reversed and replayed when we render the block (rather than as they
220
231
  # happen) due to the way they are gathered by the layout extension process (in reverse).
221
232
  #
222
233
  # @todo is `html_safe` "safe" here?
@@ -229,4 +240,4 @@ module Nestive
229
240
  end
230
241
 
231
242
  end
232
- end
243
+ end
@@ -0,0 +1,7 @@
1
+ require 'rubygems'
2
+ require 'bundler'
3
+
4
+ Bundler.require :default, :development
5
+
6
+ Combustion.initialize!
7
+ run Combustion::Application
@@ -1,3 +1,3 @@
1
1
  module Nestive
2
- VERSION = "0.1.0"
2
+ VERSION = '0.2.0'
3
3
  end
@@ -1,23 +1,26 @@
1
1
  # -*- encoding: utf-8 -*-
2
- $:.push File.expand_path("../lib", __FILE__)
3
- require "nestive/version"
2
+ $:.push File.expand_path('../lib', __FILE__)
3
+ require 'nestive/version'
4
4
 
5
5
  Gem::Specification.new do |s|
6
6
  s.name = "nestive"
7
7
  s.version = Nestive::VERSION
8
8
  s.platform = Gem::Platform::RUBY
9
- s.authors = ["Justin French"]
10
- s.email = ["justin@indent.com.au"]
11
- s.homepage = ""
12
- s.summary = %q{A Rails plugin/gem for awesome nested templates and layouts}
13
- s.description = %q{A Rails plugin/gem for awesome nested templates and layouts}
9
+ s.authors = ['Justin French', 'Pavel Pravosud']
10
+ s.email = ['justin@indent.com.au', 'pavel@pravosud.com']
11
+ s.homepage = 'https://github.com/rwz/nestive'
12
+ s.summary = 'A Rails plugin/gem for awesome nested templates and layouts'
13
+ s.description = 'A Rails plugin/gem for awesome nested templates and layouts'
14
14
 
15
- s.rubyforge_project = "nestive"
15
+ s.rubyforge_project = 'nestive'
16
16
 
17
17
  s.files = `git ls-files`.split("\n")
18
18
  s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
19
19
  s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
20
- s.require_paths = ["lib"]
21
-
22
- s.add_dependency(%q<rails>, ["~> 3.0"])
20
+ s.require_paths = ['lib']
21
+
22
+ s.add_dependency 'rails', '~> 3.0'
23
+ s.add_development_dependency 'combustion', '~> 0.3.2'
24
+ s.add_development_dependency 'rspec-rails', '~> 2.11'
25
+
23
26
  end
@@ -0,0 +1,76 @@
1
+ require 'spec_helper'
2
+
3
+ describe NestiveController do
4
+ render_views
5
+
6
+ context '#area' do
7
+ it 'is empty by default' do
8
+ get :index
9
+ assert_select '#empty-area', ''
10
+ end
11
+
12
+ it 'shows initial value if any' do
13
+ get :index
14
+ assert_select 'title', 'Nestive'
15
+ end
16
+
17
+ it 'can accept blocks as initial value' do
18
+ get :index
19
+ assert_select '#some-area', 'Some content'
20
+ end
21
+ end
22
+
23
+ context '#append' do
24
+ it 'appends content to area as a string' do
25
+ get :append
26
+ assert_select 'title', 'Nestive is awesome'
27
+ end
28
+
29
+ it 'appends content to area as a block' do
30
+ get :append
31
+ assert_select '#some-area', "Some content\n Another content"
32
+ end
33
+ end
34
+
35
+ context '#prepend' do
36
+ it 'prepends content to area as a string' do
37
+ get :prepend
38
+ assert_select 'title', 'Awesome Nestive'
39
+ end
40
+
41
+ it 'prepends content to area as a block' do
42
+ get :prepend
43
+ assert_select '#some-area', "Prepended\n Some content"
44
+ end
45
+ end
46
+
47
+ context '#replace' do
48
+ it 'replaces area content with string' do
49
+ get :replace
50
+ assert_select 'title', 'Lolwut'
51
+ end
52
+
53
+ it 'replaces area content with block' do
54
+ get :replace
55
+ assert_select '#some-area', 'replaced'
56
+ end
57
+ end
58
+
59
+ context '#extends' do
60
+ it 'extends layouts' do
61
+ get :extended_one
62
+ assert_select 'p', 'extended: one'
63
+ assert_select 'title', 'extended: one'
64
+ assert_select 'h2', 'extended: one'
65
+ end
66
+
67
+ it 'can extend already extended layouts' do
68
+ get :extended_two
69
+ assert_select 'p', 'extended: two'
70
+ assert_select 'title', 'extended: one'
71
+ assert_select '#some-area', 'extended: two'
72
+ assert_select 'h2', 'extended: one'
73
+ end
74
+ end
75
+
76
+ end
@@ -0,0 +1,2 @@
1
+ class ApplicationController < ActionController::Base
2
+ end
@@ -0,0 +1,9 @@
1
+ class NestiveController < ApplicationController
2
+ def extended_one
3
+ render :layout => 'extend_one'
4
+ end
5
+
6
+ def extended_two
7
+ render :layout => 'extend_two'
8
+ end
9
+ end
@@ -0,0 +1,7 @@
1
+ <%= extends :nestive do %>
2
+ <% replace :title, 'extended: one' %>
3
+
4
+ <h2>extended: one</h2>
5
+
6
+ <%= yield %>
7
+ <% end %>
@@ -0,0 +1,6 @@
1
+ <%= extends :extend_one do %>
2
+ <%= replace :some_area do %>
3
+ extended: two
4
+ <% end %>
5
+ <%= yield %>
6
+ <% end %>
@@ -0,0 +1,15 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title><%= area :title, 'Nestive' %></title>
5
+ </head>
6
+ <body>
7
+ <%= yield %>
8
+ <div id="some-area">
9
+ <%= area :some_area do -%>
10
+ Some content
11
+ <%- end -%>
12
+ </div>
13
+ <div id="empty-area"><%= area :empty_area %></div>
14
+ </body>
15
+ </html>
@@ -0,0 +1,6 @@
1
+ <h1>here we'll be appending to areas</h1>
2
+
3
+ <% append :title, ' is awesome' %>
4
+ <% append :some_area do %>
5
+ Another content
6
+ <% end %>
@@ -0,0 +1 @@
1
+ <p>extended: one</p>
@@ -0,0 +1 @@
1
+ <p>extended: two</p>
@@ -0,0 +1 @@
1
+ <h1>Hello World</h1>
@@ -0,0 +1,6 @@
1
+ <h1>here we'll be prepending stuff to areas</h1>
2
+
3
+ <% prepend :title, 'Awesome ' %>
4
+ <% prepend :some_area do %>
5
+ Prepended
6
+ <% end %>
@@ -0,0 +1,7 @@
1
+ <h1>replacing areas</h1>
2
+
3
+ <% replace :title, 'Lolwut' %>
4
+
5
+ <%= replace :some_area do %>
6
+ replaced
7
+ <% end %>
@@ -0,0 +1,3 @@
1
+ Rails.application.routes.draw do
2
+ match ':controller/:action'
3
+ end
@@ -0,0 +1,2 @@
1
+ # ActiveRecord::Schema.define do
2
+ # end
@@ -0,0 +1 @@
1
+ *.log
File without changes
@@ -0,0 +1,9 @@
1
+ require 'bundler/setup'
2
+ require 'rails'
3
+ require 'combustion'
4
+
5
+ require File.expand_path('../../lib/nestive', __FILE__)
6
+
7
+ Combustion.initialize! :action_controller
8
+
9
+ require 'rspec/rails'
metadata CHANGED
@@ -1,49 +1,75 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: nestive
3
- version: !ruby/object:Gem::Version
4
- hash: 27
5
- prerelease: false
6
- segments:
7
- - 0
8
- - 1
9
- - 0
10
- version: 0.1.0
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.2.0
5
+ prerelease:
11
6
  platform: ruby
12
- authors:
7
+ authors:
13
8
  - Justin French
9
+ - Pavel Pravosud
14
10
  autorequire:
15
11
  bindir: bin
16
12
  cert_chain: []
17
-
18
- date: 2011-05-30 00:00:00 +10:00
19
- default_executable:
20
- dependencies:
21
- - !ruby/object:Gem::Dependency
13
+ date: 2012-11-10 00:00:00.000000000 Z
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
22
16
  name: rails
23
- prerelease: false
24
- requirement: &id001 !ruby/object:Gem::Requirement
17
+ requirement: !ruby/object:Gem::Requirement
25
18
  none: false
26
- requirements:
19
+ requirements:
27
20
  - - ~>
28
- - !ruby/object:Gem::Version
29
- hash: 7
30
- segments:
31
- - 3
32
- - 0
33
- version: "3.0"
21
+ - !ruby/object:Gem::Version
22
+ version: '3.0'
34
23
  type: :runtime
35
- version_requirements: *id001
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ none: false
27
+ requirements:
28
+ - - ~>
29
+ - !ruby/object:Gem::Version
30
+ version: '3.0'
31
+ - !ruby/object:Gem::Dependency
32
+ name: combustion
33
+ requirement: !ruby/object:Gem::Requirement
34
+ none: false
35
+ requirements:
36
+ - - ~>
37
+ - !ruby/object:Gem::Version
38
+ version: 0.3.2
39
+ type: :development
40
+ prerelease: false
41
+ version_requirements: !ruby/object:Gem::Requirement
42
+ none: false
43
+ requirements:
44
+ - - ~>
45
+ - !ruby/object:Gem::Version
46
+ version: 0.3.2
47
+ - !ruby/object:Gem::Dependency
48
+ name: rspec-rails
49
+ requirement: !ruby/object:Gem::Requirement
50
+ none: false
51
+ requirements:
52
+ - - ~>
53
+ - !ruby/object:Gem::Version
54
+ version: '2.11'
55
+ type: :development
56
+ prerelease: false
57
+ version_requirements: !ruby/object:Gem::Requirement
58
+ none: false
59
+ requirements:
60
+ - - ~>
61
+ - !ruby/object:Gem::Version
62
+ version: '2.11'
36
63
  description: A Rails plugin/gem for awesome nested templates and layouts
37
- email:
64
+ email:
38
65
  - justin@indent.com.au
66
+ - pavel@pravosud.com
39
67
  executables: []
40
-
41
68
  extensions: []
42
-
43
69
  extra_rdoc_files: []
44
-
45
- files:
70
+ files:
46
71
  - .gitignore
72
+ - .travis.yml
47
73
  - .yardopts
48
74
  - Gemfile
49
75
  - Gemfile.lock
@@ -51,6 +77,7 @@ files:
51
77
  - README.md
52
78
  - Rakefile
53
79
  - app/helpers/nestive/layout_helper.rb
80
+ - config.ru
54
81
  - init.rb
55
82
  - install.rb
56
83
  - lib/nestive.rb
@@ -58,43 +85,63 @@ files:
58
85
  - lib/nestive/railtie.rb
59
86
  - lib/nestive/version.rb
60
87
  - nestive.gemspec
61
- - test/nestive_test.rb
62
- - test/test_helper.rb
88
+ - spec/controllers/nestive_spec.rb
89
+ - spec/internal/app/controllers/application_controller.rb
90
+ - spec/internal/app/controllers/nestive_controller.rb
91
+ - spec/internal/app/views/layouts/extend_one.html.erb
92
+ - spec/internal/app/views/layouts/extend_two.html.erb
93
+ - spec/internal/app/views/layouts/nestive.html.erb
94
+ - spec/internal/app/views/nestive/append.html.erb
95
+ - spec/internal/app/views/nestive/extended_one.html.erb
96
+ - spec/internal/app/views/nestive/extended_two.html.erb
97
+ - spec/internal/app/views/nestive/index.html.erb
98
+ - spec/internal/app/views/nestive/prepend.html.erb
99
+ - spec/internal/app/views/nestive/replace.html.erb
100
+ - spec/internal/config/routes.rb
101
+ - spec/internal/db/schema.rb
102
+ - spec/internal/log/.gitignore
103
+ - spec/internal/public/favicon.ico
104
+ - spec/spec_helper.rb
63
105
  - uninstall.rb
64
- has_rdoc: true
65
- homepage: ""
106
+ homepage: https://github.com/rwz/nestive
66
107
  licenses: []
67
-
68
108
  post_install_message:
69
109
  rdoc_options: []
70
-
71
- require_paths:
110
+ require_paths:
72
111
  - lib
73
- required_ruby_version: !ruby/object:Gem::Requirement
112
+ required_ruby_version: !ruby/object:Gem::Requirement
74
113
  none: false
75
- requirements:
76
- - - ">="
77
- - !ruby/object:Gem::Version
78
- hash: 3
79
- segments:
80
- - 0
81
- version: "0"
82
- required_rubygems_version: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ! '>='
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ required_rubygems_version: !ruby/object:Gem::Requirement
83
119
  none: false
84
- requirements:
85
- - - ">="
86
- - !ruby/object:Gem::Version
87
- hash: 3
88
- segments:
89
- - 0
90
- version: "0"
120
+ requirements:
121
+ - - ! '>='
122
+ - !ruby/object:Gem::Version
123
+ version: '0'
91
124
  requirements: []
92
-
93
125
  rubyforge_project: nestive
94
- rubygems_version: 1.3.7
126
+ rubygems_version: 1.8.24
95
127
  signing_key:
96
128
  specification_version: 3
97
129
  summary: A Rails plugin/gem for awesome nested templates and layouts
98
- test_files:
99
- - test/nestive_test.rb
100
- - test/test_helper.rb
130
+ test_files:
131
+ - spec/controllers/nestive_spec.rb
132
+ - spec/internal/app/controllers/application_controller.rb
133
+ - spec/internal/app/controllers/nestive_controller.rb
134
+ - spec/internal/app/views/layouts/extend_one.html.erb
135
+ - spec/internal/app/views/layouts/extend_two.html.erb
136
+ - spec/internal/app/views/layouts/nestive.html.erb
137
+ - spec/internal/app/views/nestive/append.html.erb
138
+ - spec/internal/app/views/nestive/extended_one.html.erb
139
+ - spec/internal/app/views/nestive/extended_two.html.erb
140
+ - spec/internal/app/views/nestive/index.html.erb
141
+ - spec/internal/app/views/nestive/prepend.html.erb
142
+ - spec/internal/app/views/nestive/replace.html.erb
143
+ - spec/internal/config/routes.rb
144
+ - spec/internal/db/schema.rb
145
+ - spec/internal/log/.gitignore
146
+ - spec/internal/public/favicon.ico
147
+ - spec/spec_helper.rb
@@ -1,8 +0,0 @@
1
- require 'test_helper'
2
-
3
- class NestiveTest < ActiveSupport::TestCase
4
- # Replace this with your real tests.
5
- test "the truth" do
6
- assert true
7
- end
8
- end
@@ -1,3 +0,0 @@
1
- require 'rubygems'
2
- require 'test/unit'
3
- require 'active_support'