glia 0.1.3 → 0.1.4

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.
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: