glia 0.1.3 → 0.1.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: a7c365840fb404b696b34559a20de1fb19e0ade6
4
- data.tar.gz: a8538ba3f88281dd85ccf16e7ea7264b1abd50ae
3
+ metadata.gz: c60022b523fa35b5f6fa9264a831fc701f264e85
4
+ data.tar.gz: 1e11377556148f16bbf2e250cf63e20bff7eb1a1
5
5
  SHA512:
6
- metadata.gz: ef536f5b333cd5a3db8098ffa736d993a8a3e824dc14202c9f87f93167ca284e9d6e839c81fb64fd5c8e72cf0a11896b936ccef47f57d71fe39daed52b0ff3b0
7
- data.tar.gz: 96f03d9af2a0ee4f97f7e6f9cc998fb36806a4ce785348eaa8fc5ef55c30e30e9b4cbe3acb35cdcbfd37a1a7ad6f582b67971c5d4998585fc0286bbb4872b08d
6
+ metadata.gz: 80d45c1149ce6a7af36b8312e54fa20a26cd392b68e397ac99788a1700ad703edaeaaf7e2badd2332405bc9098be9cc06587fb3b231b821d8fb6a6da4b570068
7
+ data.tar.gz: aa4ec7caebe66f54dad33ed98827a6cc6c80e88d0e943a15639439f4d512cf5e6d16e0b94c8c91583ac3ed5d098db078543d83a5c7a0bd30b130578e35308db0
data/README.md CHANGED
@@ -280,6 +280,40 @@ class Client::RenderingPolicy < Lotus::RenderingPolicy
280
280
  end
281
281
  ```
282
282
 
283
+ ## Theme Inheritance
284
+ In addition to areas, Glia provides a means to override the layouts with different 'themes'.
285
+
286
+ For example. If your project serves multiple sites that each need a different header, you can achieve this with themes.
287
+
288
+ ```ruby
289
+ Glia::UpdateRegistry.area(:frontend, :default) do
290
+ handle :default do
291
+ cell name: :root, class: :html, template_name: 'root' do
292
+ cell name: :header, class: :template, template_name: 'header'
293
+ cell name: :footer, class: :template, template_name: 'footer'
294
+ end
295
+ end
296
+ end
297
+
298
+ Glia::UpdateRegistry.area(:frontend, :au) do
299
+ handle :default do
300
+ cell name: :root, class: :html, template_name: 'root' do
301
+ cell name: :header, class: :template, template_name: 'header_au'
302
+ remove name: :footer
303
+ end
304
+ end
305
+ end
306
+ ```
307
+
308
+ When you get the layout, just specify which themes you want to merge.
309
+
310
+ ```ruby
311
+ layout = Glia.layout(:frontend, [:default, :product_view], theme_inheritance: [:default, :au])
312
+ ```
313
+
314
+ There is no limit to the number of themes you can use in the inheritance chain.
315
+ It begins with the first theme, and applies updates from each successive theme.
316
+
283
317
  ## Notes
284
318
  * When the DSL is parsed, the result is a simple hash of values that describes the layout.
285
319
 
@@ -8,8 +8,8 @@ require "glia/view_factory"
8
8
 
9
9
  module Glia
10
10
  # Your code goes here...
11
- def self.area(code, &blk)
12
- UpdateRegistry.area(code, &blk)
11
+ def self.area(code, theme = :default, &blk)
12
+ UpdateRegistry.area(code, theme, &blk)
13
13
  end
14
14
 
15
15
  def self.layout(area, handles, options = {})
@@ -26,5 +26,9 @@ module Glia
26
26
  def blocks
27
27
  @blocks ||= []
28
28
  end
29
+
30
+ def themes
31
+ layout.themes
32
+ end
29
33
  end
30
34
  end
@@ -2,14 +2,16 @@ module Glia
2
2
 
3
3
  class Layout
4
4
  attr_writer :view_factory
5
- attr_reader :handles, :data, :update, :cells
5
+ attr_reader :handles, :data, :update, :cells, :themes
6
+
6
7
  singleton_class.class_eval do
7
8
  attr_accessor :layout_dir, :view_namespace
8
9
  end
9
10
 
10
11
  def initialize(area, handles, options = {})
11
12
  @area = area
12
- @update = UpdateRegistry.area(area)
13
+ @themes = options[:theme_inheritance] || [:default]
14
+ @update = UpdateRegistry.merge_themes(area, )
13
15
  @cells = {}
14
16
  @handles = handles
15
17
  @data = @update.merge(@handles)
@@ -2,8 +2,8 @@ module Glia
2
2
 
3
3
  class UpdateBuilder
4
4
 
5
- def initialize
6
- @data = {}
5
+ def initialize(data = nil)
6
+ @data = data||{}
7
7
  end
8
8
 
9
9
  def view_namespace(namespace)
@@ -59,20 +59,28 @@ module Glia
59
59
  merger = proc { |key, v1, v2| Hash === v1 && Hash === v2 ? v1.merge(v2, &merger) : v2 }
60
60
  handles.each{|h| _data = _data.merge(@data[h].clone, &merger) unless @data[h].nil?}
61
61
 
62
+ #returned cleaned merged data
63
+ _clean_handle(_data)
64
+ end
65
+
66
+ private
67
+
68
+ def _clean_handle(data)
69
+ _data = data.nil? ? {} : data.clone
62
70
  # Remove orphan references, or deleted cells
63
71
  _data = _data.delete_if{|k, v| v.nil? || v[:class].nil? || v[:_removed]}
64
72
 
65
73
  # Tidy up child references for deleted children, empty child lists
66
74
  _data.each_with_object({}) do |(name, definition), hash|
67
75
  d = definition.clone
68
- d[:children].delete_if{|position, n| _data[n].nil?}
69
- d.delete(:children) if d[:children].empty?
76
+ unless d[:children].nil?
77
+ d[:children].delete_if{|position, n| _data[n].nil?}
78
+ d.delete(:children) if d[:children].empty?
79
+ end
70
80
  hash[name] = d
71
81
  end
72
82
  end
73
83
 
74
- private
75
-
76
84
  def _cell(definition, &blk)
77
85
  raise Glia::Errors::SyntaxError, 'cell cannot be used outside of handle' if @current_scope.nil?
78
86
  begin
@@ -1,17 +1,35 @@
1
1
  module Glia
2
2
  class UpdateRegistry
3
3
  class << self
4
- def area(code, &blk)
4
+ def area(area_code, theme = :default, &blk)
5
5
  #@todo UpdateRegistry can load update_data from cache and instantiate new UpdateBuilder directly with cached data.
6
6
  @updates ||= {}
7
- update = @updates[code] ||= UpdateBuilder.new
8
-
7
+ @updates[area_code] ||= {}
8
+ update = @updates[area_code][theme] ||= UpdateBuilder.new
9
9
  if block_given?
10
10
  update.instance_eval(&blk)
11
11
  end
12
12
 
13
13
  update
14
14
  end
15
+
16
+ def merge_themes(area_code, theme_inheritance = nil)
17
+ theme_inheritance ||= [:default]
18
+ merger = proc { |key, v1, v2| Hash === v1 && Hash === v2 ? v1.merge(v2, &merger) : v2 }
19
+ data = theme_inheritance.each_with_object({}) do |theme, data|
20
+ data.merge!(area(area_code, theme).to_h, &merger)
21
+ end
22
+ UpdateBuilder.new(data)
23
+ end
24
+
25
+ def clear(area_code = nil)
26
+ if area_code.nil?
27
+ @updates = {}
28
+ else
29
+ @updates.delete(area_code)
30
+ end
31
+ self
32
+ end
15
33
  end
16
34
  end
17
35
  end
@@ -1,3 +1,3 @@
1
1
  module Glia
2
- VERSION = "0.1.3"
2
+ VERSION = "0.1.4"
3
3
  end
@@ -31,3 +31,9 @@ Glia.area(:frontend) do
31
31
  end
32
32
 
33
33
  end
34
+
35
+ Glia.area(:test_area) do
36
+ handle :test do
37
+ cell name: :test, class: :template, comment: 'This area should be cleared between each test, so not in tests'
38
+ end
39
+ end
@@ -0,0 +1,7 @@
1
+ Glia.area(:frontend, :au) do
2
+
3
+ handle :default do
4
+ reference name: :header, template: 'header_au'
5
+ end
6
+
7
+ end
@@ -7,5 +7,9 @@ require 'fixtures/layout'
7
7
 
8
8
  class UnitTest < Minitest::Test
9
9
 
10
+ def setup
11
+ Glia::UpdateRegistry.clear(:test_area)
12
+ end
13
+
10
14
  end
11
15
 
@@ -1,31 +1,37 @@
1
1
  require 'test_helper'
2
2
  class Glia::Layout::Test < UnitTest
3
- describe Glia::Layout do
4
3
 
5
- let(:layout){ Glia.layout(:frontend, [:default, :cake_view, :pavlova_view]) }
4
+ def setup
5
+ super
6
+ @layout = Glia.layout(:frontend, [:default, :cake_view, :pavlova_view], theme_inheritance: [:default, :au])
7
+ end
6
8
 
7
- def test_update
8
- assert_equal :'core/html', layout.update.to_h[:default][:root][:class]
9
- end
10
9
 
11
- def test_data
12
- assert_equal :'core/html', layout.data[:root][:class]
13
- assert_nil layout.data[:non_existent]
14
- end
10
+ def test_update
11
+ assert_equal :'core/html', @layout.update.to_h[:default][:root][:class]
12
+ end
15
13
 
16
- def test_cell
17
- root = layout.cell(:root)
18
- assert_instance_of Fixtures::View::Core::Html, root
19
- assert_equal 'root', root.template_name
20
- assert_operator root.children.count, :>=, 1
21
- child = root.cell(:content)
22
- assert_equal layout.cell(:details), child
23
- assert_instance_of Fixtures::View::Template, child
24
- assert_equal 'cake_details', child.template_name
25
- ingredients = layout.cell(:cake_ingredients)
26
- assert_instance_of Fixtures::View::Template, ingredients
27
- assert_equal 'cake/pavlova_ingredients', ingredients.template_name
28
- end
14
+ def test_data
15
+ assert_equal :'core/html', @layout.data[:root][:class]
16
+ assert_nil @layout.data[:non_existent]
17
+ assert_equal [:default, :au], @layout.themes
18
+ end
29
19
 
20
+ def test_cell
21
+ root = @layout.cell(:root)
22
+ assert_instance_of Fixtures::View::Core::Html, root
23
+ assert_equal 'root', root.template_name
24
+ assert_operator root.children.count, :>=, 1
25
+ assert_equal [:default, :au], root.themes
26
+ child = root.cell(:content)
27
+ assert_equal @layout.cell(:details), child
28
+ assert_instance_of Fixtures::View::Template, child
29
+ assert_equal 'cake_details', child.template_name
30
+ assert_equal [:default, :au], child.themes
31
+ ingredients = @layout.cell(:cake_ingredients)
32
+ assert_instance_of Fixtures::View::Template, ingredients
33
+ assert_equal 'cake/pavlova_ingredients', ingredients.template_name
34
+ assert_equal [:default, :au], ingredients.themes
30
35
  end
36
+
31
37
  end
@@ -1,66 +1,69 @@
1
1
  require 'test_helper'
2
2
  class Glia::UpdateBuilder::Test < UnitTest
3
- describe Glia::UpdateBuilder do
4
- let(:builder) { Glia::UpdateBuilder.new }
5
3
 
6
- def test_cell
7
- builder.handle :test do
8
- reference name: :defined_later do
9
- cell name: :defined_later_sub_cell, class: :template, position: :here
10
- end
11
- cell name: :root, class: :html, template_name: 'root' do
12
- action name: :compile, args: ['javascript', 'css']
13
- cell name: :header, class: :template, template_name: 'header'
14
- end
15
- end
16
- builder.handle :test, :other_handle do
17
- cell name: :defined_later, class: :list
4
+ def setup
5
+ super
6
+ @builder = Glia::UpdateBuilder.new
7
+ end
8
+
9
+ def test_cell
10
+ @builder.handle :test do
11
+ reference name: :defined_later do
12
+ cell name: :defined_later_sub_cell, class: :template, position: :here
18
13
  end
19
- expected_output = {
20
- test: {
21
- root: {class: :html, template_name: 'root',
22
- children: {header: :header}, actions: [{name: :compile, args: ['javascript', 'css']}]},
23
- header: {class: :template, template_name: 'header', children: {}},
24
- defined_later: {children: {here: :defined_later_sub_cell}, class: :list},
25
- defined_later_sub_cell: {children: {}, class: :template}
26
- },
27
- other_handle: {
28
- defined_later: {children: {}, class: :list},
29
- }
30
- }
31
- assert_equal expected_output, builder.to_h
32
- assert_raises Glia::Errors::SyntaxError do
33
- builder.cell name: :header, class: :template, template_name: 'header'
14
+ cell name: :root, class: :html, template_name: 'root' do
15
+ action name: :compile, args: ['javascript', 'css']
16
+ cell name: :header, class: :template, template_name: 'header'
34
17
  end
35
18
  end
19
+ @builder.handle :test, :other_handle do
20
+ cell name: :defined_later, class: :list
21
+ end
22
+ expected_output = {
23
+ test: {
24
+ root: {class: :html, template_name: 'root',
25
+ children: {header: :header}, actions: [{name: :compile, args: ['javascript', 'css']}]},
26
+ header: {class: :template, template_name: 'header', children: {}},
27
+ defined_later: {children: {here: :defined_later_sub_cell}, class: :list},
28
+ defined_later_sub_cell: {children: {}, class: :template}
29
+ },
30
+ other_handle: {
31
+ defined_later: {children: {}, class: :list},
32
+ }
33
+ }
34
+ assert_equal expected_output, @builder.to_h
35
+ assert_raises Glia::Errors::SyntaxError do
36
+ @builder.cell name: :header, class: :template, template_name: 'header'
37
+ end
38
+ end
36
39
 
37
- def test_merge
38
- builder.handle :default do
39
- remove name: :defined_later
40
- cell name: :root, class: :html, template_name: 'root' do
41
- action name: :compile, args: ['javascript', 'css']
42
- cell name: :header, class: :template, template_name: 'header'
43
- cell name: :footer, class: :template, template_name: 'footer'
44
- end
40
+ def test_merge
41
+ @builder.handle :default do
42
+ remove name: :defined_later
43
+ cell name: :root, class: :html, template_name: 'root' do
44
+ action name: :compile, args: ['javascript', 'css']
45
+ cell name: :header, class: :template, template_name: 'header'
46
+ cell name: :footer, class: :template, template_name: 'footer'
45
47
  end
46
- builder.handle :test do
47
- remove name: :header
48
- reference name: :footer, template_name: 'new_footer' do
49
- cell name: :copyright, class: :template, template_name: 'copyright', position: :footer_bottom
50
- end
51
- cell name: :defined_later, class: :list
48
+ end
49
+ @builder.handle :test do
50
+ remove name: :header
51
+ reference name: :footer, template_name: 'new_footer' do
52
+ cell name: :copyright, class: :template, template_name: 'copyright', position: :footer_bottom
52
53
  end
53
- expected_output = {
54
- root: {
55
- class: :html,
56
- template_name: 'root',
57
- children: {footer: :footer},
58
- actions: [{name: :compile, args: ['javascript', 'css']}]
59
- },
60
- footer: {class: :template, template_name: 'new_footer', children: {footer_bottom: :copyright}},
61
- copyright: {class: :template, template_name: 'copyright'}
62
- }
63
- assert_equal expected_output, builder.merge([:default, :test])
54
+ cell name: :defined_later, class: :list
64
55
  end
56
+ expected_output = {
57
+ root: {
58
+ class: :html,
59
+ template_name: 'root',
60
+ children: {footer: :footer},
61
+ actions: [{name: :compile, args: ['javascript', 'css']}]
62
+ },
63
+ footer: {class: :template, template_name: 'new_footer', children: {footer_bottom: :copyright}},
64
+ copyright: {class: :template, template_name: 'copyright'}
65
+ }
66
+ assert_equal expected_output, @builder.merge([:default, :test])
65
67
  end
68
+
66
69
  end
@@ -0,0 +1,75 @@
1
+ require 'test_helper'
2
+ class Glia::UpdateRegistry::Test < UnitTest
3
+
4
+ def test_theme
5
+ assert_equal({}, Glia::UpdateRegistry.area(:test_area).to_h) #describe messes with inheritance
6
+
7
+ Glia::UpdateRegistry.area(:test_area, :nz) do
8
+ handle :test do
9
+ cell name: :root, class: :html, template_name: 'root' do
10
+ cell name: :header, class: :template, template_name: 'header_nz'
11
+ end
12
+ end
13
+ end
14
+
15
+ Glia::UpdateRegistry.area(:test_area, :au) do
16
+ handle :test do
17
+ cell name: :root, class: :html, template_name: 'root' do
18
+ cell name: :header, class: :template, template_name: 'header_au'
19
+ end
20
+ end
21
+ end
22
+
23
+ assert_equal 'header_nz', Glia::UpdateRegistry.area(:test_area, :nz).to_h[:test][:header][:template_name]
24
+ assert_equal 'header_au', Glia::UpdateRegistry.area(:test_area, :au).to_h[:test][:header][:template_name]
25
+
26
+ end
27
+
28
+ def test_merge_themes
29
+ assert_equal({}, Glia::UpdateRegistry.area(:test_area).to_h)
30
+
31
+ Glia::UpdateRegistry.area(:test_area, :default) do
32
+ handle :test do
33
+ cell name: :root, class: :html, template_name: 'root' do
34
+ cell name: :header, class: :template, template_name: 'header'
35
+ cell name: :footer, class: :template, template_name: 'footer'
36
+ end
37
+ end
38
+ end
39
+
40
+ Glia::UpdateRegistry.area(:test_area, :au) do
41
+ handle :test do
42
+ cell name: :root, class: :html, template_name: 'root' do
43
+ cell name: :header, class: :template, template_name: 'header_au'
44
+ remove name: :footer
45
+ end
46
+ end
47
+ end
48
+
49
+ # We can't clean up the deleted/orphaned children until the handles are merged
50
+ expected_output = {
51
+ test: {
52
+ root: {
53
+ children: {header: :header, footer: :footer},
54
+ class: :html,
55
+ template_name: 'root'
56
+ },
57
+ header: {
58
+ children: {},
59
+ class: :template,
60
+ template_name: 'header_au'
61
+ },
62
+ footer: {
63
+ children: {},
64
+ class: :template,
65
+ template_name: 'footer',
66
+ _removed: true
67
+ }
68
+ }
69
+ }
70
+
71
+ assert_equal expected_output, Glia::UpdateRegistry.merge_themes(:test_area, [:default, :au]).to_h
72
+
73
+ end
74
+
75
+ end
@@ -1,24 +1,26 @@
1
1
  require 'test_helper'
2
2
  class Glia::ViewFactory::Test < UnitTest
3
- describe Glia::ViewFactory do
4
- let(:factory) { Glia::ViewFactory.new }
5
3
 
6
- def test_find_class
7
- assert_equal Fixtures::View::Template, factory.find_class(:template, Fixtures::View)
8
- assert_equal Fixtures::View::Core::Html, factory.find_class(:'core/html', Fixtures::View)
9
- end
4
+ def setup
5
+ super
6
+ @factory = Glia::ViewFactory.new
7
+ end
10
8
 
11
- def test_build
12
- cell = factory.build(
13
- :template,
14
- Fixtures::View,
15
- {template_name: 'my_template'},
16
- [{name: :add_ingredient, args: ['Eggs', '6 Large']}]
17
- )
18
- assert_instance_of Fixtures::View::Template, cell
19
- assert_equal 'my_template', cell.template_name
20
- assert_equal 'Eggs : 6 Large', cell.ingredients.first
21
- end
9
+ def test_find_class
10
+ assert_equal Fixtures::View::Template, @factory.find_class(:template, Fixtures::View)
11
+ assert_equal Fixtures::View::Core::Html, @factory.find_class(:'core/html', Fixtures::View)
12
+ end
22
13
 
14
+ def test_build
15
+ cell = @factory.build(
16
+ :template,
17
+ Fixtures::View,
18
+ {template_name: 'my_template'},
19
+ [{name: :add_ingredient, args: ['Eggs', '6 Large']}]
20
+ )
21
+ assert_instance_of Fixtures::View::Template, cell
22
+ assert_equal 'my_template', cell.template_name
23
+ assert_equal 'Eggs : 6 Large', cell.ingredients.first
23
24
  end
25
+
24
26
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: glia
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.3
4
+ version: 0.1.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dane Lowe
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-08-09 00:00:00.000000000 Z
11
+ date: 2015-08-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -78,6 +78,7 @@ files:
78
78
  - readme/layout_pav.png
79
79
  - test/fixtures/layout.rb
80
80
  - test/fixtures/layout/default.rb
81
+ - test/fixtures/layout/default_au.rb
81
82
  - test/fixtures/view.rb
82
83
  - test/fixtures/view/core/html.rb
83
84
  - test/fixtures/view/list.rb
@@ -85,6 +86,7 @@ files:
85
86
  - test/test_helper.rb
86
87
  - test/unit/layout_test.rb
87
88
  - test/unit/update_builder_test.rb
89
+ - test/unit/update_registry_test.rb
88
90
  - test/unit/view_factory_test.rb
89
91
  homepage: https://github.com/danelowe/glia
90
92
  licenses:
@@ -113,6 +115,7 @@ summary: Manage App Layouts.
113
115
  test_files:
114
116
  - test/fixtures/layout.rb
115
117
  - test/fixtures/layout/default.rb
118
+ - test/fixtures/layout/default_au.rb
116
119
  - test/fixtures/view.rb
117
120
  - test/fixtures/view/core/html.rb
118
121
  - test/fixtures/view/list.rb
@@ -120,5 +123,6 @@ test_files:
120
123
  - test/test_helper.rb
121
124
  - test/unit/layout_test.rb
122
125
  - test/unit/update_builder_test.rb
126
+ - test/unit/update_registry_test.rb
123
127
  - test/unit/view_factory_test.rb
124
128
  has_rdoc: