nestive 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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'