web_blocks 2.0.4.dev → 2.0.5.alpha
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 +4 -4
- data/README.md +73 -0
- data/lib/web_blocks/facade/base.rb +16 -0
- data/lib/web_blocks/facade/block.rb +15 -0
- data/lib/web_blocks/facade/external_component_block.rb +20 -0
- data/lib/web_blocks/facade/file_name_block.rb +35 -0
- data/lib/web_blocks/facade/js_file.rb +15 -0
- data/lib/web_blocks/facade/recursive_file_names_block.rb +47 -0
- data/lib/web_blocks/facade/scss_file.rb +15 -0
- data/lib/web_blocks/manager/bower.rb +4 -0
- data/lib/web_blocks/structure/block.rb +8 -84
- data/lib/web_blocks/structure/block_core.rb +126 -0
- data/lib/web_blocks/structure/framework.rb +8 -3
- data/lib/web_blocks/thor/base/prepare_blocks.rb +14 -1
- data/lib/web_blocks/thor/watch/all.rb +32 -0
- data/lib/web_blocks/version.rb +1 -1
- data/web_blocks.gemspec +2 -1
- metadata +35 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6b45e9ad8b7e3af77d52db79b0685c78ca0dac1f
|
4
|
+
data.tar.gz: 92aa552f7c50dd4985a8b0fa6efafc6668c10aaa
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: aa248d75286aa4001c87cc5c8934063195a780e5caa4e2fd877c4764b73ec9d84eeba1135e8fd1f3edc303e24e5d421179247ab3eb8d3bb7d70f9761e1c73607
|
7
|
+
data.tar.gz: f2ff6239be72f149a6271de716aa456b9c4ae9ac529fd5ee8c3ad6b87e8d2050b3dce3c0e5ebee1169a41140106ca121c670d88144be15c8c4184ba9dda49950
|
data/README.md
CHANGED
@@ -302,6 +302,16 @@ Further, in this example, suppose the goal is to use the `WebBlocks-visibility`
|
|
302
302
|
}
|
303
303
|
```
|
304
304
|
|
305
|
+
While blocks should carefully define their dependencies to be as accepting as possible, two blocks will sometimes require completely different versions of the same dependency. This can be resolved by manually specifying a resolution in `bower.json`:
|
306
|
+
|
307
|
+
```json
|
308
|
+
{
|
309
|
+
"resolutions": {
|
310
|
+
"jquery": "~2.1.0"
|
311
|
+
}
|
312
|
+
}
|
313
|
+
```
|
314
|
+
|
305
315
|
### Including a Block
|
306
316
|
|
307
317
|
While packages define blocks to include, generally they will not be included unless specified explicitly.
|
@@ -441,6 +451,8 @@ blocks watch
|
|
441
451
|
|
442
452
|
Any time that a bower component, blockfile or source file changes, it will rebuild the necessary components.
|
443
453
|
|
454
|
+
**NOTE: The `watch` command will not work properly under inotify (Linux) for modifications to `Blockfile.rb`.**
|
455
|
+
|
444
456
|
### Using Depedencies to Control Load Order
|
445
457
|
|
446
458
|
The WebBlocks-breakpoints module provides a set of variables that it will define unless they're already defined. This enables WebBlocks-visibility's breakpoint-based classes. Suppose, however, that we wish to inject our own variables.
|
@@ -656,6 +668,67 @@ $ blocks inspect dependency_order
|
|
656
668
|
/Users/ebollens/Sites/test/bower_components/efx/src/driver/toggle.js
|
657
669
|
```
|
658
670
|
|
671
|
+
### Modifying the WebBlocks DSL
|
672
|
+
|
673
|
+
At any block level, you can register a new facade into the DSL:
|
674
|
+
|
675
|
+
```ruby
|
676
|
+
block 'efx' do
|
677
|
+
|
678
|
+
register_facade :file_name_block, ::WebBlocks::Facade::FileNameBlock
|
679
|
+
|
680
|
+
file_name_block 'engine', :required => true do
|
681
|
+
loose_dependency framework.route 'jquery'
|
682
|
+
end
|
683
|
+
|
684
|
+
end
|
685
|
+
```
|
686
|
+
|
687
|
+
This registration is available to child nodes as well:
|
688
|
+
|
689
|
+
```ruby
|
690
|
+
block 'efx' do
|
691
|
+
|
692
|
+
register_facade :file_name_block, ::WebBlocks::Facade::FileNameBlock
|
693
|
+
|
694
|
+
# ..
|
695
|
+
|
696
|
+
block 'driver', :path => 'driver' do
|
697
|
+
|
698
|
+
dependency efx.route 'engine'
|
699
|
+
|
700
|
+
file_name_block 'accordion'
|
701
|
+
file_name_block 'tabs'
|
702
|
+
file_name_block 'toggle'
|
703
|
+
|
704
|
+
end
|
705
|
+
|
706
|
+
end
|
707
|
+
```
|
708
|
+
|
709
|
+
Resolution of the facade occurs by way of closest parent. For example, Ex2 wins over Ex1 for the sub-block:
|
710
|
+
|
711
|
+
```ruby
|
712
|
+
block 'top-level' do
|
713
|
+
|
714
|
+
register_facade :ex, Ex1
|
715
|
+
|
716
|
+
block 'driver', :path => 'driver' do
|
717
|
+
|
718
|
+
register_facade :ex, Ex2
|
719
|
+
|
720
|
+
ex 'Ex2_is_used_as_handler_here'
|
721
|
+
|
722
|
+
end
|
723
|
+
|
724
|
+
end
|
725
|
+
```
|
726
|
+
|
727
|
+
### Available Facades
|
728
|
+
|
729
|
+
* **WebBlocks::Facade::FileNameBlock** takes the name passed to it and finds CSS, JS and SCSS files by the same name and loading them into a block by that name.
|
730
|
+
* **WebBlocks::Facade::RecursiveFileNamesBlock** takes the name passed to it and finds all directories, making sub-blocks of them and calling this recursively, while also finding all CSS, JS and SCSS files by the same name and loading them into a block by that name.
|
731
|
+
|
659
732
|
### Learn More
|
660
733
|
|
661
734
|
See the `demo` folder for a example setup.
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'web_blocks/facade/base'
|
2
|
+
require 'web_blocks/structure/block'
|
3
|
+
|
4
|
+
module WebBlocks
|
5
|
+
module Facade
|
6
|
+
class Block < Base
|
7
|
+
|
8
|
+
def handle name, attributes = {}, &block
|
9
|
+
context.child_eval ::WebBlocks::Structure::Block, name, attributes, block
|
10
|
+
end
|
11
|
+
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'web_blocks/facade/base'
|
2
|
+
require 'web_blocks/structure/block'
|
3
|
+
|
4
|
+
module WebBlocks
|
5
|
+
module Facade
|
6
|
+
class ExternalComponentBlock < Base
|
7
|
+
|
8
|
+
def handle name, attributes = {}, &block
|
9
|
+
if attributes.has_key?(:path)
|
10
|
+
attributes[:path] = "bower_components/#{name}/#{attributes[:path]}"
|
11
|
+
else
|
12
|
+
attributes[:path] = "bower_components/#{name}"
|
13
|
+
end
|
14
|
+
context.block name, attributes, &block
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require 'web_blocks/facade/base'
|
2
|
+
|
3
|
+
module WebBlocks
|
4
|
+
module Facade
|
5
|
+
class FileNameBlock < Base
|
6
|
+
|
7
|
+
attr_reader :types
|
8
|
+
|
9
|
+
def initialize context
|
10
|
+
super context
|
11
|
+
@types = {
|
12
|
+
'css' => :scss_file,
|
13
|
+
'js' => :js_file,
|
14
|
+
'scss' => :scss_file
|
15
|
+
}
|
16
|
+
end
|
17
|
+
|
18
|
+
def handle name, attributes = {}, &block
|
19
|
+
|
20
|
+
this = self
|
21
|
+
|
22
|
+
block_was_given = block_given?
|
23
|
+
|
24
|
+
this.context.block name, attributes do |block_entity|
|
25
|
+
this.types.each do |extension, method_name|
|
26
|
+
block_entity.send(method_name, "#{name}.#{extension}") if File.exists?("#{block_entity.resolved_path}/#{name}.#{extension}")
|
27
|
+
end
|
28
|
+
block_entity.instance_eval &block if block_was_given
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'web_blocks/facade/base'
|
2
|
+
require 'web_blocks/structure/js_file'
|
3
|
+
|
4
|
+
module WebBlocks
|
5
|
+
module Facade
|
6
|
+
class JsFile < Base
|
7
|
+
|
8
|
+
def handle name, attributes = {}, &block
|
9
|
+
context.child_eval ::WebBlocks::Structure::JsFile, name, attributes, block
|
10
|
+
end
|
11
|
+
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
@@ -0,0 +1,47 @@
|
|
1
|
+
require 'set'
|
2
|
+
require 'web_blocks/facade/base'
|
3
|
+
require 'web_blocks/facade/file_name_block'
|
4
|
+
|
5
|
+
module WebBlocks
|
6
|
+
module Facade
|
7
|
+
class RecursiveFileNamesBlock < Base
|
8
|
+
|
9
|
+
def handle name, attributes = {}, &block
|
10
|
+
|
11
|
+
this = self
|
12
|
+
|
13
|
+
attributes[:path] = name unless attributes.has_key? :path
|
14
|
+
|
15
|
+
block_was_given = block_given?
|
16
|
+
|
17
|
+
this.context.block name, attributes do |directory_block|
|
18
|
+
|
19
|
+
directory_path = directory_block.resolved_path
|
20
|
+
directory_facade = ::WebBlocks::Facade::RecursiveFileNamesBlock.new(directory_block)
|
21
|
+
file_facade = ::WebBlocks::Facade::FileNameBlock.new(directory_block)
|
22
|
+
file_names = Set.new
|
23
|
+
|
24
|
+
Dir.entries(directory_path).each do |name|
|
25
|
+
next if name == '.' or name == '..'
|
26
|
+
path = "#{directory_path}/#{name}"
|
27
|
+
if File.directory? path
|
28
|
+
directory_facade.handle name, path: name
|
29
|
+
else
|
30
|
+
segs = name.split('.')
|
31
|
+
ext = segs.pop
|
32
|
+
if file_facade.types.keys.include? ext
|
33
|
+
file_names << segs.join('.')
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
file_names.each { |name| file_facade.handle name }
|
39
|
+
|
40
|
+
directory_block.instance_eval &block if block_was_given
|
41
|
+
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'web_blocks/facade/base'
|
2
|
+
require 'web_blocks/structure/scss_file'
|
3
|
+
|
4
|
+
module WebBlocks
|
5
|
+
module Facade
|
6
|
+
class ScssFile < Base
|
7
|
+
|
8
|
+
def handle name, attributes = {}, &block
|
9
|
+
context.child_eval ::WebBlocks::Structure::ScssFile, name, attributes, block
|
10
|
+
end
|
11
|
+
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
@@ -1,94 +1,18 @@
|
|
1
|
-
require 'web_blocks/
|
2
|
-
require 'web_blocks/
|
3
|
-
require 'web_blocks/
|
4
|
-
require 'web_blocks/structure/
|
5
|
-
require 'web_blocks/structure/js_file'
|
6
|
-
require 'web_blocks/structure/attribute/dependency'
|
7
|
-
require 'web_blocks/structure/attribute/loose_dependency'
|
8
|
-
require 'web_blocks/structure/attribute/reverse_dependency'
|
9
|
-
require 'web_blocks/structure/attribute/reverse_loose_dependency'
|
1
|
+
require 'web_blocks/facade/block'
|
2
|
+
require 'web_blocks/facade/js_file'
|
3
|
+
require 'web_blocks/facade/scss_file'
|
4
|
+
require 'web_blocks/structure/block_core'
|
10
5
|
|
11
6
|
module WebBlocks
|
12
7
|
module Structure
|
13
|
-
class Block <
|
14
|
-
|
15
|
-
include WebBlocks::Framework
|
16
|
-
include WebBlocks::Structure::Attribute::Dependency
|
17
|
-
include WebBlocks::Structure::Attribute::LooseDependency
|
18
|
-
include WebBlocks::Structure::Attribute::ReverseDependency
|
19
|
-
include WebBlocks::Structure::Attribute::ReverseLooseDependency
|
8
|
+
class Block < BlockCore
|
20
9
|
|
21
10
|
set :required, false
|
22
11
|
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
Pathname.new(attributes[:base_path]) + path
|
27
|
-
elsif parent
|
28
|
-
parent.resolved_path + path
|
29
|
-
else
|
30
|
-
Pathname.new(path)
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
def block name, attributes = {}, &block
|
35
|
-
child_eval ::WebBlocks::Structure::Block, name, attributes, block
|
36
|
-
end
|
37
|
-
|
38
|
-
def scss_file name, attributes = {}, &block
|
39
|
-
child_eval ::WebBlocks::Structure::ScssFile, name, attributes, block
|
40
|
-
end
|
41
|
-
|
42
|
-
def js_file name, attributes = {}, &block
|
43
|
-
child_eval ::WebBlocks::Structure::JsFile, name, attributes, block
|
44
|
-
end
|
45
|
-
|
46
|
-
def files
|
47
|
-
computed = []
|
48
|
-
children.each do |name,object|
|
49
|
-
if object.is_a? Block
|
50
|
-
computed = computed + object.files
|
51
|
-
elsif object.is_a? RawFile
|
52
|
-
computed << object
|
53
|
-
end
|
54
|
-
end
|
55
|
-
computed
|
56
|
-
end
|
57
|
-
|
58
|
-
def select_leaf_nodes branch_select_proc, leaf_select_proc
|
59
|
-
leaf_nodes = []
|
60
|
-
nodes = [self]
|
61
|
-
while nodes.length > 0
|
62
|
-
node = nodes.pop
|
63
|
-
if node.respond_to? :children
|
64
|
-
nodes |= node.children.values.select(&branch_select_proc)
|
65
|
-
elsif leaf_select_proc.call(node)
|
66
|
-
leaf_nodes << node
|
67
|
-
end
|
68
|
-
end
|
69
|
-
leaf_nodes
|
70
|
-
end
|
71
|
-
|
72
|
-
def required_files
|
73
|
-
select_leaf_nodes Proc.new(){ |node| node.get(:required) }, Proc.new(){ |node| node.is_a? RawFile }
|
74
|
-
end
|
75
|
-
|
76
|
-
private
|
77
|
-
|
78
|
-
def child_add_or_update klass, name, attributes = {}
|
79
|
-
unless has_child? name
|
80
|
-
add_child klass.new(name, attributes)
|
81
|
-
else
|
82
|
-
attributes.each { |key, value| children[name].set key, value }
|
83
|
-
end
|
84
|
-
children[name]
|
85
|
-
end
|
12
|
+
register_facade :block, WebBlocks::Facade::Block
|
13
|
+
register_facade :js_file, WebBlocks::Facade::JsFile
|
14
|
+
register_facade :scss_file, WebBlocks::Facade::ScssFile
|
86
15
|
|
87
|
-
def child_eval klass, name, attributes = {}, block
|
88
|
-
child = child_add_or_update klass, name, attributes
|
89
|
-
child.instance_exec children[name], &block if block
|
90
|
-
child
|
91
|
-
end
|
92
16
|
|
93
17
|
end
|
94
18
|
end
|
@@ -0,0 +1,126 @@
|
|
1
|
+
require 'web_blocks/framework'
|
2
|
+
require 'web_blocks/structure/tree/node'
|
3
|
+
require 'web_blocks/structure/attribute/dependency'
|
4
|
+
require 'web_blocks/structure/attribute/loose_dependency'
|
5
|
+
require 'web_blocks/structure/attribute/reverse_dependency'
|
6
|
+
require 'web_blocks/structure/attribute/reverse_loose_dependency'
|
7
|
+
|
8
|
+
module WebBlocks
|
9
|
+
module Structure
|
10
|
+
class BlockCore < ::WebBlocks::Structure::Tree::Node
|
11
|
+
|
12
|
+
include WebBlocks::Framework
|
13
|
+
|
14
|
+
include WebBlocks::Structure::Attribute::Dependency
|
15
|
+
include WebBlocks::Structure::Attribute::LooseDependency
|
16
|
+
include WebBlocks::Structure::Attribute::ReverseDependency
|
17
|
+
include WebBlocks::Structure::Attribute::ReverseLooseDependency
|
18
|
+
|
19
|
+
def register_facade name, handler
|
20
|
+
@facade_map = {} unless defined? @facade_map
|
21
|
+
@facade_map[name.to_sym] = handler
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.register_facade name, handler
|
25
|
+
@@class_facade_map = {} unless defined? @@class_facade_map
|
26
|
+
@@class_facade_map[name.to_sym] = handler
|
27
|
+
end
|
28
|
+
|
29
|
+
def resolve_facade name
|
30
|
+
if @facade_map and @facade_map.has_key?(name)
|
31
|
+
@facade_map[name]
|
32
|
+
elsif parent
|
33
|
+
parent.resolve_facade name
|
34
|
+
else
|
35
|
+
nil
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def resolve_class_facade name
|
40
|
+
if @@class_facade_map and @@class_facade_map[name]
|
41
|
+
@@class_facade_map[name]
|
42
|
+
elsif parent
|
43
|
+
parent.resolve_class_facade name
|
44
|
+
else
|
45
|
+
nil
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def isolated_facade_registration_scope &block
|
50
|
+
facade_map = @facade_map
|
51
|
+
begin
|
52
|
+
instance_eval &block
|
53
|
+
@facade_map = facade_map
|
54
|
+
rescue => e
|
55
|
+
@facade_map = facade_map
|
56
|
+
raise e
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
def method_missing name, *arguments, &block
|
61
|
+
handler_class = resolve_facade(name)
|
62
|
+
handler_class = resolve_class_facade(name) unless handler_class
|
63
|
+
raise NoMethodError, "undefined facade `#{name}' for #{self}" unless handler_class
|
64
|
+
handler = handler_class.new(self)
|
65
|
+
handler.handle *arguments, &block
|
66
|
+
end
|
67
|
+
|
68
|
+
def resolved_path
|
69
|
+
path = attributes.has_key?(:path) ? attributes[:path] : ''
|
70
|
+
if attributes.has_key? :base_path
|
71
|
+
Pathname.new(attributes[:base_path]) + path
|
72
|
+
elsif parent
|
73
|
+
parent.resolved_path + path
|
74
|
+
else
|
75
|
+
Pathname.new(path)
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
def files
|
80
|
+
computed = []
|
81
|
+
children.each do |name,object|
|
82
|
+
if object.is_a? Block
|
83
|
+
computed = computed + object.files
|
84
|
+
elsif object.is_a? RawFile
|
85
|
+
computed << object
|
86
|
+
end
|
87
|
+
end
|
88
|
+
computed
|
89
|
+
end
|
90
|
+
|
91
|
+
def select_leaf_nodes branch_select_proc, leaf_select_proc
|
92
|
+
leaf_nodes = []
|
93
|
+
nodes = [self]
|
94
|
+
while nodes.length > 0
|
95
|
+
node = nodes.pop
|
96
|
+
if node.respond_to? :children
|
97
|
+
nodes |= node.children.values.select(&branch_select_proc)
|
98
|
+
elsif leaf_select_proc.call(node)
|
99
|
+
leaf_nodes << node
|
100
|
+
end
|
101
|
+
end
|
102
|
+
leaf_nodes
|
103
|
+
end
|
104
|
+
|
105
|
+
def required_files
|
106
|
+
select_leaf_nodes Proc.new(){ |node| node.get(:required) }, Proc.new(){ |node| node.is_a? RawFile }
|
107
|
+
end
|
108
|
+
|
109
|
+
def child_add_or_update klass, name, attributes = {}
|
110
|
+
unless has_child? name
|
111
|
+
add_child klass.new(name, attributes)
|
112
|
+
else
|
113
|
+
attributes.each { |key, value| children[name].set key, value }
|
114
|
+
end
|
115
|
+
children[name]
|
116
|
+
end
|
117
|
+
|
118
|
+
def child_eval klass, name, attributes = {}, block
|
119
|
+
child = child_add_or_update klass, name, attributes
|
120
|
+
child.instance_exec children[name], &block if block
|
121
|
+
child
|
122
|
+
end
|
123
|
+
|
124
|
+
end
|
125
|
+
end
|
126
|
+
end
|
@@ -1,3 +1,4 @@
|
|
1
|
+
require 'web_blocks/facade/external_component_block'
|
1
2
|
require 'web_blocks/structure/block'
|
2
3
|
require 'web_blocks/structure/raw_file'
|
3
4
|
require 'web_blocks/support/tsort/hash'
|
@@ -6,6 +7,8 @@ module WebBlocks
|
|
6
7
|
module Structure
|
7
8
|
class Framework < Block
|
8
9
|
|
10
|
+
register_facade :external_component_block, WebBlocks::Facade::ExternalComponentBlock
|
11
|
+
|
9
12
|
set :required, true
|
10
13
|
|
11
14
|
def register hash
|
@@ -14,9 +17,11 @@ module WebBlocks
|
|
14
17
|
resolved_block_path = resolved_path + path
|
15
18
|
blockfile_path = resolved_block_path + "Blockfile.rb"
|
16
19
|
raise "Undefined blockfile for #{path}" unless File.exists?(blockfile_path)
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
+
isolated_facade_registration_scope do
|
21
|
+
block name do
|
22
|
+
set :base_path, resolved_block_path
|
23
|
+
end
|
24
|
+
instance_eval File.read(blockfile_path)
|
20
25
|
end
|
21
26
|
end
|
22
27
|
|
@@ -35,6 +35,10 @@ module WebBlocks
|
|
35
35
|
|
36
36
|
begin
|
37
37
|
|
38
|
+
if self.options.reload_bower
|
39
|
+
clean_bower_components! log
|
40
|
+
end
|
41
|
+
|
38
42
|
if !bower_manager.installed? or self.options.reload_bower
|
39
43
|
install_bower_components! log
|
40
44
|
elsif self.options.reload_registry
|
@@ -75,6 +79,15 @@ module WebBlocks
|
|
75
79
|
|
76
80
|
end
|
77
81
|
|
82
|
+
def clean_bower_components! log
|
83
|
+
|
84
|
+
log.debug do
|
85
|
+
bower_manager.clean_components!
|
86
|
+
'Cleaned bower components'
|
87
|
+
end
|
88
|
+
|
89
|
+
end
|
90
|
+
|
78
91
|
def clean_bower_registry! log
|
79
92
|
|
80
93
|
log.debug do
|
@@ -96,7 +109,7 @@ module WebBlocks
|
|
96
109
|
register :name => name, :path => path
|
97
110
|
"Loaded"
|
98
111
|
end
|
99
|
-
rescue
|
112
|
+
rescue RuntimeError
|
100
113
|
log.warn("#{name}") { "Skipped -- Blockfile.rb does not exist" }
|
101
114
|
end
|
102
115
|
end
|
@@ -25,17 +25,45 @@ module WebBlocks
|
|
25
25
|
triggers << base_path + '.blocks/cache/bower/registry.yaml'
|
26
26
|
triggers << base_path + 'bower_components/*/Blockfile.rb'
|
27
27
|
|
28
|
+
monitor = nil
|
29
|
+
|
28
30
|
handler = Proc.new do |base, relative|
|
29
31
|
|
32
|
+
rerun_monitor = false
|
30
33
|
changed_file = Pathname.new(base) + relative
|
31
34
|
relink_needed = changed_file.to_s.match(/Blockfile.rb$/)
|
32
35
|
|
33
36
|
log.info("Watch"){ "Detected change to #{changed_file}" }
|
34
37
|
|
35
38
|
if relink_needed
|
39
|
+
|
36
40
|
root.remove_all_children
|
37
41
|
initialize_root!
|
38
42
|
prepare_blocks!
|
43
|
+
|
44
|
+
# This is a super hacky way to detach all handlers for FSSM.monitor and then initialize a new FSSM.monitor
|
45
|
+
# with the right triggers based on the latest changes. This does NOT work with inotify.
|
46
|
+
if monitor.instance_variable_get("@backend").is_a?(FSSM::Backends::RBFSEvent) or monitor.instance_variable_get("@backend").is_a?(FSSM::Backends::Polling)
|
47
|
+
|
48
|
+
monitor.instance_variable_get("@backend").instance_variable_set("@handlers", [])
|
49
|
+
|
50
|
+
triggers = root.adjacency_list.keys.map(){|f| f.resolved_path.to_s }
|
51
|
+
triggers << base_path + 'Blockfile.rb'
|
52
|
+
triggers << base_path + '.blocks/cache/bower/registry.yaml'
|
53
|
+
triggers << base_path + 'bower_components/*/Blockfile.rb'
|
54
|
+
|
55
|
+
monitor = FSSM::Monitor.new
|
56
|
+
monitor.path @base_path do
|
57
|
+
glob triggers
|
58
|
+
update &handler
|
59
|
+
delete &handler
|
60
|
+
create &handler
|
61
|
+
end
|
62
|
+
|
63
|
+
rerun_monitor = true
|
64
|
+
|
65
|
+
end
|
66
|
+
|
39
67
|
end
|
40
68
|
|
41
69
|
begin
|
@@ -59,6 +87,10 @@ module WebBlocks
|
|
59
87
|
|
60
88
|
end
|
61
89
|
|
90
|
+
if rerun_monitor
|
91
|
+
monitor.run
|
92
|
+
end
|
93
|
+
|
62
94
|
end
|
63
95
|
|
64
96
|
if options.build
|
data/lib/web_blocks/version.rb
CHANGED
data/web_blocks.gemspec
CHANGED
@@ -21,7 +21,7 @@ Gem::Specification.new do |spec|
|
|
21
21
|
|
22
22
|
spec.add_dependency 'thor'
|
23
23
|
spec.add_dependency 'ruby-bower'
|
24
|
-
spec.add_dependency 'execjs'
|
24
|
+
spec.add_dependency 'execjs', '~> 2.2', '<= 2.2.2'
|
25
25
|
spec.add_dependency 'extend_method'
|
26
26
|
spec.add_dependency 'compass'
|
27
27
|
spec.add_dependency 'sass-css-importer'
|
@@ -33,5 +33,6 @@ Gem::Specification.new do |spec|
|
|
33
33
|
spec.add_development_dependency 'bundler'
|
34
34
|
spec.add_development_dependency 'rake'
|
35
35
|
spec.add_development_dependency 'coveralls'
|
36
|
+
spec.add_development_dependency 'test-unit'
|
36
37
|
|
37
38
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: web_blocks
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0.
|
4
|
+
version: 2.0.5.alpha
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Eric Bollens
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2015-09-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: thor
|
@@ -42,16 +42,22 @@ dependencies:
|
|
42
42
|
name: execjs
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- - "
|
45
|
+
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: '
|
47
|
+
version: '2.2'
|
48
|
+
- - "<="
|
49
|
+
- !ruby/object:Gem::Version
|
50
|
+
version: 2.2.2
|
48
51
|
type: :runtime
|
49
52
|
prerelease: false
|
50
53
|
version_requirements: !ruby/object:Gem::Requirement
|
51
54
|
requirements:
|
52
|
-
- - "
|
55
|
+
- - "~>"
|
53
56
|
- !ruby/object:Gem::Version
|
54
|
-
version: '
|
57
|
+
version: '2.2'
|
58
|
+
- - "<="
|
59
|
+
- !ruby/object:Gem::Version
|
60
|
+
version: 2.2.2
|
55
61
|
- !ruby/object:Gem::Dependency
|
56
62
|
name: extend_method
|
57
63
|
requirement: !ruby/object:Gem::Requirement
|
@@ -192,6 +198,20 @@ dependencies:
|
|
192
198
|
- - ">="
|
193
199
|
- !ruby/object:Gem::Version
|
194
200
|
version: '0'
|
201
|
+
- !ruby/object:Gem::Dependency
|
202
|
+
name: test-unit
|
203
|
+
requirement: !ruby/object:Gem::Requirement
|
204
|
+
requirements:
|
205
|
+
- - ">="
|
206
|
+
- !ruby/object:Gem::Version
|
207
|
+
version: '0'
|
208
|
+
type: :development
|
209
|
+
prerelease: false
|
210
|
+
version_requirements: !ruby/object:Gem::Requirement
|
211
|
+
requirements:
|
212
|
+
- - ">="
|
213
|
+
- !ruby/object:Gem::Version
|
214
|
+
version: '0'
|
195
215
|
description: Package, configuration and dependency manager for web assets (SCSS, JS,
|
196
216
|
images, and fonts)
|
197
217
|
email:
|
@@ -217,6 +237,13 @@ files:
|
|
217
237
|
- demo/package.json
|
218
238
|
- demo/src/config/WebBlocks-breakpoints.scss
|
219
239
|
- lib/web_blocks.rb
|
240
|
+
- lib/web_blocks/facade/base.rb
|
241
|
+
- lib/web_blocks/facade/block.rb
|
242
|
+
- lib/web_blocks/facade/external_component_block.rb
|
243
|
+
- lib/web_blocks/facade/file_name_block.rb
|
244
|
+
- lib/web_blocks/facade/js_file.rb
|
245
|
+
- lib/web_blocks/facade/recursive_file_names_block.rb
|
246
|
+
- lib/web_blocks/facade/scss_file.rb
|
220
247
|
- lib/web_blocks/framework.rb
|
221
248
|
- lib/web_blocks/manager/bower.rb
|
222
249
|
- lib/web_blocks/manager/builder/base.rb
|
@@ -239,6 +266,7 @@ files:
|
|
239
266
|
- lib/web_blocks/structure/attribute/reverse_dependency.rb
|
240
267
|
- lib/web_blocks/structure/attribute/reverse_loose_dependency.rb
|
241
268
|
- lib/web_blocks/structure/block.rb
|
269
|
+
- lib/web_blocks/structure/block_core.rb
|
242
270
|
- lib/web_blocks/structure/font_file.rb
|
243
271
|
- lib/web_blocks/structure/framework.rb
|
244
272
|
- lib/web_blocks/structure/img_file.rb
|
@@ -304,7 +332,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
304
332
|
version: 1.3.1
|
305
333
|
requirements: []
|
306
334
|
rubyforge_project:
|
307
|
-
rubygems_version: 2.
|
335
|
+
rubygems_version: 2.4.6
|
308
336
|
signing_key:
|
309
337
|
specification_version: 4
|
310
338
|
summary: package, configuration and dependency manager for web assets (SCSS, JS, images,
|