lotus-view 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (51) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +105 -0
  3. data/{LICENSE.txt → LICENSE.md} +0 -0
  4. data/README.md +117 -28
  5. data/lib/lotus/layout.rb +11 -4
  6. data/lib/lotus/view/configuration.rb +298 -0
  7. data/lib/lotus/view/dsl.rb +89 -10
  8. data/lib/lotus/view/inheritable.rb +4 -0
  9. data/lib/lotus/view/rendering/layout_finder.rb +31 -7
  10. data/lib/lotus/view/rendering/layout_scope.rb +2 -2
  11. data/lib/lotus/view/rendering/registry.rb +0 -1
  12. data/lib/lotus/view/rendering/scope.rb +2 -2
  13. data/lib/lotus/view/rendering/template_name.rb +37 -0
  14. data/lib/lotus/view/rendering/templates_finder.rb +36 -5
  15. data/lib/lotus/view/version.rb +1 -1
  16. data/lib/lotus/view.rb +196 -88
  17. data/lotus-view.gemspec +2 -2
  18. metadata +9 -67
  19. data/.gitignore +0 -8
  20. data/.travis.yml +0 -6
  21. data/.yardopts +0 -3
  22. data/Gemfile +0 -15
  23. data/Rakefile +0 -17
  24. data/test/fixtures/templates/app/app_view.html.erb +0 -0
  25. data/test/fixtures/templates/app/view.html.erb +0 -0
  26. data/test/fixtures/templates/application.html.erb +0 -10
  27. data/test/fixtures/templates/articles/_form.html.erb +0 -4
  28. data/test/fixtures/templates/articles/alternative_new.html.erb +0 -1
  29. data/test/fixtures/templates/articles/index.atom.erb +0 -5
  30. data/test/fixtures/templates/articles/index.html.erb +0 -3
  31. data/test/fixtures/templates/articles/index.json.erb +0 -9
  32. data/test/fixtures/templates/articles/index.rss.erb +0 -0
  33. data/test/fixtures/templates/articles/new.html.erb +0 -7
  34. data/test/fixtures/templates/articles/show.html.erb +0 -1
  35. data/test/fixtures/templates/articles/show.json.erb +0 -5
  36. data/test/fixtures/templates/contacts/show.html.haml +0 -1
  37. data/test/fixtures/templates/dashboard/index.html.erb +0 -2
  38. data/test/fixtures/templates/hello_world_view.html.erb +0 -1
  39. data/test/fixtures/templates/index_view.html.erb +0 -1
  40. data/test/fixtures/templates/json_render_view.json.erb +0 -3
  41. data/test/fixtures/templates/render_view.html.erb +0 -1
  42. data/test/fixtures/templates/shared/_sidebar.html.erb +0 -1
  43. data/test/fixtures.rb +0 -187
  44. data/test/layout_test.rb +0 -10
  45. data/test/load_test.rb +0 -79
  46. data/test/presenter_test.rb +0 -31
  47. data/test/rendering_test.rb +0 -125
  48. data/test/root_test.rb +0 -38
  49. data/test/test_helper.rb +0 -24
  50. data/test/version_test.rb +0 -7
  51. data/test/view_test.rb +0 -27
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 73dd8583d5b48a96229bf72a847120710d701d0e
4
- data.tar.gz: 99c9a9ce462407779c7a14113dddd4c8129c4dfb
3
+ metadata.gz: 6054b04ffdb4d4b0bc17f0de1b4d239a45fa1062
4
+ data.tar.gz: 3fdec77bf94ab52bf27916b979661619cc053b71
5
5
  SHA512:
6
- metadata.gz: 098ee9925947868c1f65424e0d443ba6722866f904ba4279fc9d9a79a9f7cb41229723b8f79ddd1aedb80dc521fb880056ce04344a8ad210175f776051a717b8
7
- data.tar.gz: 3fd4ac2c4c5738c15aed901ea82df7e2fb26234df758e1eea35794721ae4f6adc50cd9d7744e8fccd38a2077e0d9eab6b2e1d64265a9f586e91fd4ba10924490
6
+ metadata.gz: ebf1e5d0839acda038d449cb18b9c9b12f49d7de7ec8c6460f7b4c7cef84cf685364e5d3e6ccd0882536024cc47e91f18a05f7aa6afb0cdff08587761d5f2b2f
7
+ data.tar.gz: 73eecc96f67474d79ca0f21f4440d10aa0a510d3172966fe3939d811c1d2d623170328140097ed81f0b17f53bc3537baff7d8f9d5c8a6955cb95e8c0d0083a9c
data/CHANGELOG.md ADDED
@@ -0,0 +1,105 @@
1
+ ## v0.2.0
2
+ ### Jun 23, 2014
3
+
4
+ f053805 2014-06-20 **Luca Guidi** [breaking] Make Rendering::TemplatesFinder to look recursively for templates, starting from the root
5
+
6
+ 5a5ed1b 2014-06-18 **Luca Guidi** Depend on lotus-utils ~> 0.2
7
+
8
+ d7858df 2014-06-18 **Luca Guidi** Ensure to handle correctly the namespace for views, when it's configured as nil
9
+
10
+ 8f9e876 2014-06-18 **Luca Guidi** Renamed Lotus::View methods: .duplicate => .dupe, .generate => .duplicate
11
+
12
+ 199c1d6 2014-06-11 **Luca Guidi** Introducing Lotus::View.generate as shortcut for .duplicate and .configure
13
+
14
+ d3e65d9 2014-06-11 **Luca Guidi** Ensure lazy loading and correct namespace of the layout class when using configuration's "layout" DSL
15
+
16
+ 850c9b9 2014-06-11 **Luca Guidi** Specify different scenario for template name in a standalone application
17
+
18
+ 6199419 2014-06-06 **Luca Guidi** Ensure to return the correct template name for namespaced views
19
+
20
+ 71d502f 2014-06-06 **Luca Guidi** Ensure independent configurations between the framework, the views and its children. Lotus::View::Dsl.root now internally uses the configuration.
21
+
22
+ dd0ec4c 2014-06-06 **Luca Guidi** Lazily load layout for Configuration. This mechanism solves eventual race conditions between the loading of the framework and the application.
23
+
24
+ d2e0775 2014-06-05 **Luca Guidi** [breaking] Lotus::View can be safely duplicated. Moved views and layout registries into Configuration. Configuration is now able to duplicated and (un)load itself. Layouts can be looked up in a given Ruby namespace.
25
+
26
+ a619bd2 2014-06-05 **Luca Guidi** Implemented Lotus::View::Configuration#views and #layouts
27
+
28
+ e4e892e 2014-06-04 **Luca Guidi** [breaking] Removed Lotus::View's class accessor for root, in favor of the API of Lotus::View::Configuration
29
+
30
+ 1aa68c6 2014-06-04 **Luca Guidi** [breaking] Removed Lotus::View's class accessor for layout, in favor of the API of Lotus::View::Configuration
31
+
32
+ da9bee4 2014-06-04 **Luca Guidi** Implemented Lotus::View::Configuration#layout
33
+
34
+ da31e3e 2014-06-04 **Luca Guidi** Implemented Lotus::View::Configuration#load_paths
35
+
36
+ 1471cdd 2014-06-03 **Luca Guidi** Introduced Lotus::View::Configuration with a bare minimum behavior
37
+
38
+ 425c79e 2014-05-21 **Grant Ammons** Support arguments for methods inside templates
39
+
40
+ d4d407b 2014-05-10 **Luca Guidi** Support Ruby 2.1.2
41
+
42
+ 593f1a5 2014-04-07 **Luca Guidi** Ensure outermost locals to not shadow innermost inside templates/partials. Closes #3
43
+
44
+ ## v0.1.0
45
+ ### Mar 23, 2014
46
+
47
+ af70191 2014-03-22 **Luca Guidi** Introduced Lotus::View::MissingFormatError in order to force a rendering context to specify the requested format (mime type)
48
+
49
+ 320f322 2014-03-22 **Luca Guidi** Changed signature of Lotus::View.render: it now accepts only a context for the view
50
+
51
+ 9d5de63 2014-03-21 **Luca Guidi** Test with other engines than ERb, HAML in this case.
52
+
53
+ a5ade35 2014-03-21 **Luca Guidi** Erubis is no longer a dependency.
54
+
55
+ 257e342 2014-03-21 **Luca Guidi** Performance: prefer `Hash#fetch(key) { default }`, over `#fetch(key, default)`.
56
+
57
+ 426eaf7 2014-03-21 **Luca Guidi** Allow custom rendering policies. Views can override #render and decide how to return the output.
58
+
59
+ b2759f8 2014-03-18 **Luca Guidi** Lotus::View::Layout => Lotus::Layout
60
+
61
+ c0c04a8 2014-03-17 **Luca Guidi** Remove private method for Presenter: #object
62
+
63
+ 74ca485 2014-03-13 **Luca Guidi** Introduced Lotus::Presenter
64
+
65
+ 0ee9c10 2014-03-13 **Luca Guidi** Render partial from a layout
66
+
67
+ dc4a74f 2014-03-12 **Luca Guidi** Support for Tilt 2.0
68
+
69
+ 728fe70 2014-02-20 **Luca Guidi** Added Lotus::View#locals
70
+
71
+ 11c7e5a 2013-08-08 **Luca Guidi** Don't use global class vars.
72
+
73
+ 570a20c 2013-08-07 **Luca Guidi** Scope templates discovery to registered engines
74
+
75
+ 4b45b11 2013-08-06 **Luca Guidi** Added support for layouts.
76
+
77
+ 96a2c66 2013-08-02 **Luca Guidi** Allow templates to be rendered from templates.
78
+
79
+ ba5acdc 2013-08-01 **Luca Guidi** Allow partials to be rendered from templates.
80
+
81
+ 04474d4 2013-08-01 **Luca Guidi** Render template in the Lotus::View::Rendering::Scope context
82
+
83
+ d108767 2013-08-01 **Luca Guidi** Freeze at subclasses level too
84
+
85
+ 04a3093 2013-08-01 **Luca Guidi** Let views to specify relative template filename
86
+
87
+ e7c832d 2013-08-01 **Luca Guidi** Lotus::View::Rendering::Template => Lotus::View::Template
88
+
89
+ f603ea9 2013-08-01 **Luca Guidi** Rework
90
+
91
+ 5df49f1 2013-07-23 **Luca Guidi** Removed unnecessary indirection
92
+
93
+ 683741c 2013-07-22 **Luca Guidi** Views can now transparently inheriths variables from locals, in order to reuse them.
94
+
95
+ 3a31f63 2013-07-19 **Luca Guidi** Removed templates as class variable for views: introduced a registry for runtime resolution
96
+
97
+ f27e19f 2013-07-18 **Luca Guidi** WIP rendering resolver
98
+
99
+ 05e1d8c 2013-07-18 **Luca Guidi** Allow views inheritance.
100
+
101
+ 8236523 2013-07-18 **Luca Guidi** Refactoring: Engine is not relevant, let Tilt to deal with it. View has multiple templates. Intoduced DSL for format. Introduced resolver for runtime rendering. Dependency injection. :tophat:
102
+
103
+ f7f3d25 2013-07-17 **Luca Guidi** Extracted Lotus::View::Template::Finder
104
+
105
+ 11d3c47 2013-07-15 **Luca Guidi** Initial mess
File without changes
data/README.md CHANGED
@@ -8,20 +8,20 @@ A _view_ is an object that encapsulates the presentation logic of a page.
8
8
  A _template_ is a file that defines the semantic and visual elements of a page.
9
9
  In order to show a result to an user, a template must be _rendered_ by a view.
10
10
 
11
- Keeping things separated, helps to declutter templates and models from presentation logic.
12
- Also, since views are objects they are easily testable.
11
+ Keeping things separated helps to declutter templates and models from presentation logic.
12
+ Also, since views are objects, they are easily testable.
13
13
  If you ever used [Mustache](http://mustache.github.io/), you are already aware of the advantages.
14
14
 
15
- Like all the other Lotus compontents it can be used as a standalone framework, or within a full Lotus application.
15
+ Like all the other Lotus compontents, it can be used as a standalone framework or within a full Lotus application.
16
16
 
17
17
  ## Status
18
18
 
19
- [![Gem Version](https://badge.fury.io/rb/lotus-view.png)](http://badge.fury.io/rb/lotus-view)
20
- [![Build Status](https://secure.travis-ci.org/lotus/view.png?branch=master)](http://travis-ci.org/lotus/view?branch=master)
21
- [![Coverage](https://coveralls.io/repos/lotus/view/badge.png?branch=master)](https://coveralls.io/r/lotus/view)
22
- [![Code Climate](https://codeclimate.com/github/lotus/view.png)](https://codeclimate.com/github/lotus/view)
23
- [![Dependencies](https://gemnasium.com/lotus/view.png)](https://gemnasium.com/lotus/view)
24
- [![Inline docs](http://inch-pages.github.io/github/lotus/view.png)](http://inch-pages.github.io/github/lotus/view)
19
+ [![Gem Version](http://img.shields.io/gem/v/lotus-view.svg)](https://badge.fury.io/rb/lotus-view)
20
+ [![Build Status](http://img.shields.io/travis/lotus/view/master.svg)](https://travis-ci.org/lotus/view?branch=master)
21
+ [![Coverage](http://img.shields.io/coveralls/lotus/view/master.svg)](https://coveralls.io/r/lotus/view)
22
+ [![Code Climate](http://img.shields.io/codeclimate/github/lotus/view.svg)](https://codeclimate.com/github/lotus/view)
23
+ [![Dependencies](http://img.shields.io/gemnasium/lotus/view.svg)](https://gemnasium.com/lotus/view)
24
+ [![Inline docs](http://inch-ci.org/github/lotus/view.svg?branch=master)](http://inch-ci.org/github/lotus/view)
25
25
 
26
26
  ## Contact
27
27
 
@@ -30,6 +30,7 @@ Like all the other Lotus compontents it can be used as a standalone framework, o
30
30
  * API Doc: http://rdoc.info/gems/lotus-view
31
31
  * Bugs/Issues: https://github.com/lotus/view/issues
32
32
  * Support: http://stackoverflow.com/questions/tagged/lotus-ruby
33
+ * Chat: https://gitter.im/lotus/chat
33
34
 
34
35
  ## Rubies
35
36
 
@@ -53,10 +54,10 @@ Or install it yourself as:
53
54
 
54
55
  ### Conventions
55
56
 
56
- * Templates are searched under `Lotus::View.root`, set this value according to your app structure (eg. `"app/templates"`).
57
+ * Templates are searched under `Lotus::View.configuration.root`, set this value according to your app structure (eg. `"app/templates"`).
57
58
  * A view will look for a template with a file name that is composed by its full class name (eg. `"articles/index"`).
58
59
  * A template must have two concatenated extensions: one for the format one for the engine (eg. `".html.erb"`).
59
- * The framework must be loaded before to render for the first time: `Lotus::View.load!`.
60
+ * The framework must be loaded before rendering the first time: `Lotus::View.load!`.
60
61
 
61
62
  ### Views
62
63
 
@@ -83,10 +84,13 @@ module Articles
83
84
  end
84
85
  end
85
86
 
86
- Lotus::View.root = 'app/templates'
87
+ Lotus::View.configure do
88
+ root 'app/templates'
89
+ end
90
+
87
91
  Lotus::View.load!
88
92
 
89
- path = Lotus::View.root.join('articles/index.html.erb')
93
+ path = Lotus::View.configuration.root.join('articles/index.html.erb')
90
94
  template = Lotus::View::Template.new(path)
91
95
  articles = ArticleRepository.all
92
96
 
@@ -109,7 +113,10 @@ module Articles
109
113
  end
110
114
  end
111
115
 
112
- Lotus::View.root = 'app/templates'
116
+ Lotus::View.configure do
117
+ root 'app/templates'
118
+ end
119
+
113
120
  Lotus::View.load!
114
121
 
115
122
  articles = ArticleRepository.all
@@ -151,13 +158,13 @@ end
151
158
  </article>
152
159
  ```
153
160
 
154
- All the methods defined in the view are accessible in the template:
161
+ All the methods defined in the view are accessible from the template:
155
162
 
156
163
  ```erb
157
164
  <h2><%= authors %></h2>
158
165
  ```
159
166
 
160
- For convenience, they are also available as an Hash `locals` in the view.
167
+ For convenience, they are also available to the view as a Hash, accessed through the `locals` method.
161
168
 
162
169
  ```ruby
163
170
  require 'lotus/view'
@@ -166,11 +173,11 @@ module Articles
166
173
  class Show
167
174
  include Lotus::View
168
175
 
169
- # This view, already responds to `#article` because there is an element in
176
+ # This view already responds to `#article` because there is an element in
170
177
  # the locals with the same key.
171
178
  #
172
179
  # In order to allow developers to override those methods, and decorate a
173
- # single locals object, a view has an Hash with the same values.
180
+ # single locals object, a view has a Hash with the same values.
174
181
  #
175
182
  # If we had implemented this method like this:
176
183
  #
@@ -232,7 +239,7 @@ Articles::Show.render({format: :custom, article: article})
232
239
 
233
240
  The builtin rendering engine is [ERb](http://en.wikipedia.org/wiki/ERuby).
234
241
  However, Lotus::View supports countless rendering engines out of the box.
235
- Require your library of choice **before** of requiring `'lotus/view'`, and it will just work.
242
+ Require your library of choice **before** requiring `'lotus/view'`, and it will just work.
236
243
 
237
244
  ```ruby
238
245
  require 'haml'
@@ -369,7 +376,7 @@ For instance, if [ERubis](http://www.kuwata-lab.com/erubis/) is loaded, it will
369
376
 
370
377
  ### Root
371
378
 
372
- Templates lookup is performed under the `Lotus::View.root` directory. Single views can specify a different path:
379
+ Template lookup is performed under the `Lotus::View.configuration.root` directory. You can specify a different path on a per view basis:
373
380
 
374
381
  ```ruby
375
382
  class ViewWithDifferentRoot
@@ -384,8 +391,8 @@ end
384
391
  The template file must be located under the relevant `root` and must match the class name:
385
392
 
386
393
  ```ruby
387
- puts Lotus::View.root # => #<Pathname:app/templates>
388
- Articles::Index.template # => "articles/index"
394
+ puts Lotus::View.configuration.root # => #<Pathname:app/templates>
395
+ Articles::Index.template # => "articles/index"
389
396
  ```
390
397
 
391
398
  Each view can specify a different template:
@@ -410,7 +417,7 @@ Partials can be rendered within a template:
410
417
  <%= render partial: 'articles/form', locals: { secret: 23 } %>
411
418
  ```
412
419
 
413
- It will look for a template `articles/_form.html.erb` and it will make available both the view's and partial's locals (eg. `article` and `secret`).
420
+ It will look for a template `articles/_form.html.erb` and make available both the view's and partial's locals (eg. `article` and `secret`).
414
421
 
415
422
  ### Templates
416
423
 
@@ -420,11 +427,11 @@ Templates can be rendered within another template:
420
427
  <%= render template: 'articles/new', locals: { errors: {} } %>
421
428
  ```
422
429
 
423
- It will render `articles/new.html.erb` and it will make available both the view's and templates's locals (eg. `article` and `errors`).
430
+ It will render `articles/new.html.erb` and make available both the view's and templates's locals (eg. `article` and `errors`).
424
431
 
425
432
  ### Layouts
426
433
 
427
- Layouts are wrappers for views, they can be a way to reuse common markup.
434
+ Layouts are wrappers for views. Layouts may serve to reuse common markup.
428
435
 
429
436
  ```ruby
430
437
  class ApplicationLayout
@@ -455,11 +462,11 @@ Articles::Index.render(format: :html) # => Will use ApplicationLayout
455
462
  Articles::Index.render(format: :rss) # => Will use nothing
456
463
  ```
457
464
 
458
- As per convention, layouts' templates are located under `Lotus::View.root` or `ApplicationLayout.root` and they uses the underscored name (eg. `ApplicationLayout => application.html.erb`).
465
+ As per convention, layout templates are located under `Lotus::View.root` or `ApplicationLayout.root` and use the underscored name (eg. `ApplicationLayout => application.html.erb`).
459
466
 
460
467
  ### Presenters
461
468
 
462
- They are a way to wrap and reuse presentational logic for an object.
469
+ The goal of a presenter is to wrap and reuse presentational logic for an object.
463
470
 
464
471
  ```ruby
465
472
  class Map
@@ -497,7 +504,7 @@ presenter = MapPresenter.new(map)
497
504
  puts presenter.locations # => ['Rome', 'Boston']
498
505
 
499
506
  # access presenter concrete methods
500
- puts presenter.count # => 1
507
+ puts presenter.count # => 2
501
508
 
502
509
  # uses super to access original object implementation
503
510
  puts presenter.location_names # => 'ROME, BOSTON'
@@ -506,6 +513,88 @@ puts presenter.location_names # => 'ROME, BOSTON'
506
513
  puts presenter.inspect_object # => #<Map:0x007fdeada0b2f0 @locations=["Rome", "Boston"]>
507
514
  ```
508
515
 
516
+ ### Configuration
517
+
518
+ Lotus::View can be configured with a DSL that determines its behavior.
519
+ It supports a few options:
520
+
521
+ ```ruby
522
+ require 'lotus/view'
523
+
524
+ Lotus::View.configure do
525
+ # Set the root path where to search for templates
526
+ # Argument: String, Pathname, #to_pathname, defaults to the current directory
527
+ #
528
+ root '/path/to/root'
529
+
530
+ # Set the Ruby namespace where to lookup for views
531
+ # Argument: Class, Module, String, defaults to Object
532
+ #
533
+ namespace 'MyApp::Views'
534
+
535
+ # Set the global layout
536
+ # Argument: Symbol, defautls to nil
537
+ #
538
+ layout :application
539
+ end
540
+ ```
541
+
542
+ All those global configurations can be overwritten at a finer grained level:
543
+ views. Each view and layout has its own copy of the global configuration, so
544
+ that changes are inherited from the top to the bottom, but not bubbled up in the
545
+ opposite direction.
546
+
547
+ ```ruby
548
+ require 'lotus/view'
549
+
550
+ Lotus::View.configure do
551
+ root '/path/to/root'
552
+ end
553
+
554
+ class Show
555
+ include Lotus::View
556
+ root '/another/root'
557
+ end
558
+
559
+ Lotus::View.configuration.root # => #<Pathname:/path/to/root>
560
+ Show.root # => #<Pathname:/another/root>
561
+ ```
562
+
563
+ ### Reusability
564
+
565
+ Lotus::View can be used as a singleton framework as seen in this README.
566
+ The application code includes `Lotus::View` or `Lotus::Layout` directly
567
+ and the configuration is unique per Ruby process.
568
+
569
+ While this is convenient for tiny applications, it doesn't fit well for more
570
+ complex scenarios, where we want micro applications to coexist together.
571
+
572
+ ```ruby
573
+ require 'lotus/view'
574
+
575
+ Lotus::View.configure do
576
+ root '/path/to/root'
577
+ end
578
+
579
+ module WebApp
580
+ View = Lotus::View.duplicate(self)
581
+ end
582
+
583
+ module ApiApp
584
+ View = Lotus::View.duplicate(self) do
585
+ root '/another/root'
586
+ end
587
+ end
588
+
589
+ Lotus::View.configuration.root # => #<Pathname:/path/to/root>
590
+ WebApp::View.configuration.root # => #<Pathname:/path/to/root>, inherited from Lotus::View
591
+ ApiApp::View.configuration.root # => #<Pathname:/another/root>
592
+ ```
593
+
594
+ The code above defines `WebApp::View` and `WebApp::Layout`, to be used for
595
+ the `WebApp` views, while `ApiApp::View` and `ApiApp::Layout` have a different
596
+ configuration.
597
+
509
598
  ### Thread safety
510
599
 
511
600
  **Lotus::View**'s is thread safe during the runtime, but it isn't during the loading process.
data/lib/lotus/layout.rb CHANGED
@@ -1,3 +1,4 @@
1
+ require 'lotus/utils/class_attribute'
1
2
  require 'lotus/view/rendering/layout_registry'
2
3
  require 'lotus/view/rendering/layout_scope'
3
4
  require 'lotus/view/rendering/null_layout'
@@ -21,12 +22,18 @@ module Lotus
21
22
  # include Lotus::Layout
22
23
  # end
23
24
  def self.included(base)
25
+ conf = Lotus::View::Configuration.for(base)
26
+ conf.add_layout(base)
27
+
24
28
  base.class_eval do
25
29
  extend Lotus::View::Dsl.dup
26
30
  extend ClassMethods
27
- end
28
31
 
29
- Lotus::View.layouts.add(base)
32
+ include Utils::ClassAttribute
33
+ class_attribute :configuration
34
+
35
+ self.configuration = conf.duplicate
36
+ end
30
37
  end
31
38
 
32
39
  # Class level API
@@ -49,7 +56,7 @@ module Lotus
49
56
  #
50
57
  # @see Lotus::View::Rendering::LayoutRegistry
51
58
  def registry
52
- @@registry ||= View::Rendering::LayoutRegistry.new(self)
59
+ @registry ||= View::Rendering::LayoutRegistry.new(self)
53
60
  end
54
61
 
55
62
  # Template name
@@ -91,7 +98,7 @@ module Lotus
91
98
  #
92
99
  # @see Lotus::View.load!
93
100
  def load!
94
- registry.freeze
101
+ # registry.freeze
95
102
  end
96
103
  end
97
104