web_blocks 2.0.0.dev
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +15 -0
- data/.coveralls.yml +1 -0
- data/.gitignore +23 -0
- data/.travis.yml +8 -0
- data/CHANGELOG.md +1 -0
- data/CONTRIBUTING.md +1 -0
- data/Gemfile +3 -0
- data/LICENSE.txt +27 -0
- data/README.md +641 -0
- data/Rakefile +13 -0
- data/bin/blocks +9 -0
- data/demo/.gitignore +4 -0
- data/demo/Blockfile.rb +67 -0
- data/demo/bower.json +8 -0
- data/demo/package.json +5 -0
- data/demo/src/config/WebBlocks-breakpoints.scss +9 -0
- data/lib/web_blocks/framework.rb +20 -0
- data/lib/web_blocks/manager/bower.rb +106 -0
- data/lib/web_blocks/manager/builder/base.rb +31 -0
- data/lib/web_blocks/manager/builder/js.rb +54 -0
- data/lib/web_blocks/manager/builder/scss.rb +57 -0
- data/lib/web_blocks/manager/parallel_builder.rb +52 -0
- data/lib/web_blocks/product/concat_file/js.rb +15 -0
- data/lib/web_blocks/product/concat_file/raw.rb +33 -0
- data/lib/web_blocks/product/concat_file/scss.rb +21 -0
- data/lib/web_blocks/strategy/compile/scss.rb +90 -0
- data/lib/web_blocks/strategy/link/base.rb +51 -0
- data/lib/web_blocks/strategy/link/js.rb +30 -0
- data/lib/web_blocks/strategy/link/scss.rb +30 -0
- data/lib/web_blocks/structure/attribute/dependency.rb +25 -0
- data/lib/web_blocks/structure/attribute/loose_dependency.rb +25 -0
- data/lib/web_blocks/structure/attribute/reverse_dependency.rb +16 -0
- data/lib/web_blocks/structure/attribute/reverse_loose_dependency.rb +16 -0
- data/lib/web_blocks/structure/block.rb +95 -0
- data/lib/web_blocks/structure/font_file.rb +9 -0
- data/lib/web_blocks/structure/framework.rb +79 -0
- data/lib/web_blocks/structure/img_file.rb +9 -0
- data/lib/web_blocks/structure/js_file.rb +9 -0
- data/lib/web_blocks/structure/raw_file.rb +30 -0
- data/lib/web_blocks/structure/scss_file.rb +9 -0
- data/lib/web_blocks/structure/tree/leaf_node.rb +44 -0
- data/lib/web_blocks/structure/tree/node.rb +14 -0
- data/lib/web_blocks/structure.rb +7 -0
- data/lib/web_blocks/support/attributes/class/container.rb +24 -0
- data/lib/web_blocks/support/attributes/container.rb +41 -0
- data/lib/web_blocks/support/parallel_jobs.rb +26 -0
- data/lib/web_blocks/support/scoped_logger.rb +49 -0
- data/lib/web_blocks/support/tree/child.rb +23 -0
- data/lib/web_blocks/support/tree/node.rb +14 -0
- data/lib/web_blocks/support/tree/parent.rb +35 -0
- data/lib/web_blocks/support/tsort/hash.rb +29 -0
- data/lib/web_blocks/thor/base/class/type_get_class_from_string.rb +36 -0
- data/lib/web_blocks/thor/base/class/types.rb +21 -0
- data/lib/web_blocks/thor/base/initialize.rb +145 -0
- data/lib/web_blocks/thor/base/prepare_blocks.rb +155 -0
- data/lib/web_blocks/thor/base.rb +12 -0
- data/lib/web_blocks/thor/build/all.rb +30 -0
- data/lib/web_blocks/thor/build.rb +13 -0
- data/lib/web_blocks/thor/inspect/blocks/attribute_printer.rb +48 -0
- data/lib/web_blocks/thor/inspect/blocks/block_printer.rb +43 -0
- data/lib/web_blocks/thor/inspect/blocks/printer.rb +24 -0
- data/lib/web_blocks/thor/inspect/blocks.rb +27 -0
- data/lib/web_blocks/thor/inspect/bower_registry.rb +24 -0
- data/lib/web_blocks/thor/inspect/dependency_list.rb +30 -0
- data/lib/web_blocks/thor/inspect/dependency_order.rb +26 -0
- data/lib/web_blocks/thor/inspect.rb +11 -0
- data/lib/web_blocks/thor/partial/compile/scss.rb +24 -0
- data/lib/web_blocks/thor/partial/compile.rb +13 -0
- data/lib/web_blocks/thor/partial/link/js.rb +23 -0
- data/lib/web_blocks/thor/partial/link/scss.rb +23 -0
- data/lib/web_blocks/thor/partial/link.rb +13 -0
- data/lib/web_blocks/thor/partial/runner.rb +14 -0
- data/lib/web_blocks/thor/runner.rb +16 -0
- data/lib/web_blocks/thor/watch/all.rb +67 -0
- data/lib/web_blocks/thor/watch.rb +13 -0
- data/lib/web_blocks/version.rb +3 -0
- data/lib/web_blocks.rb +13 -0
- data/test/init.rb +7 -0
- data/test/web_blocks/framework.rb +40 -0
- data/test/web_blocks/structure.rb +42 -0
- data/test/web_blocks/support/attribute/class/container.rb +29 -0
- data/test/web_blocks/support/attribute/container.rb +71 -0
- data/test/web_blocks/support/tree/child.rb +60 -0
- data/test/web_blocks/support/tree/node.rb +18 -0
- data/test/web_blocks/support/tree/parent.rb +81 -0
- data/test/web_blocks/version.rb +10 -0
- data/web_blocks.gemspec +35 -0
- metadata +297 -0
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'web_blocks/support/attributes/class/container'
|
2
|
+
|
3
|
+
module WebBlocks
|
4
|
+
module Structure
|
5
|
+
module Attribute
|
6
|
+
module Dependency
|
7
|
+
|
8
|
+
class << self
|
9
|
+
include ::WebBlocks::Support::Attributes::Class::Container
|
10
|
+
end
|
11
|
+
|
12
|
+
set :dependencies, []
|
13
|
+
|
14
|
+
def dependency route
|
15
|
+
push :dependencies, route
|
16
|
+
end
|
17
|
+
|
18
|
+
def resolve_dependencies
|
19
|
+
merge_branch_array_attribute :dependencies
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'web_blocks/support/attributes/class/container'
|
2
|
+
|
3
|
+
module WebBlocks
|
4
|
+
module Structure
|
5
|
+
module Attribute
|
6
|
+
module LooseDependency
|
7
|
+
|
8
|
+
class << self
|
9
|
+
include ::WebBlocks::Support::Attributes::Class::Container
|
10
|
+
end
|
11
|
+
|
12
|
+
set :loose_dependencies, []
|
13
|
+
|
14
|
+
def loose_dependency route
|
15
|
+
push :loose_dependencies, route
|
16
|
+
end
|
17
|
+
|
18
|
+
def resolve_loose_dependencies
|
19
|
+
merge_branch_array_attribute :loose_dependencies
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'web_blocks/support/attributes/class/container'
|
2
|
+
|
3
|
+
module WebBlocks
|
4
|
+
module Structure
|
5
|
+
module Attribute
|
6
|
+
module ReverseDependency
|
7
|
+
|
8
|
+
def reverse_dependency route
|
9
|
+
block = framework.block_from_route route
|
10
|
+
block.dependency self.route
|
11
|
+
end
|
12
|
+
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'web_blocks/support/attributes/class/container'
|
2
|
+
|
3
|
+
module WebBlocks
|
4
|
+
module Structure
|
5
|
+
module Attribute
|
6
|
+
module ReverseLooseDependency
|
7
|
+
|
8
|
+
def reverse_loose_dependency route
|
9
|
+
block = framework.block_from_route route
|
10
|
+
block.loose_dependency self.route
|
11
|
+
end
|
12
|
+
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,95 @@
|
|
1
|
+
require 'web_blocks/framework'
|
2
|
+
require 'web_blocks/structure/tree/node'
|
3
|
+
require 'web_blocks/structure/block'
|
4
|
+
require 'web_blocks/structure/scss_file'
|
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'
|
10
|
+
|
11
|
+
module WebBlocks
|
12
|
+
module Structure
|
13
|
+
class Block < ::WebBlocks::Structure::Tree::Node
|
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
|
20
|
+
|
21
|
+
set :required, false
|
22
|
+
|
23
|
+
def resolved_path
|
24
|
+
path = attributes.has_key?(:path) ? attributes[:path] : ''
|
25
|
+
if attributes.has_key? :base_path
|
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
|
86
|
+
|
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
|
+
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
@@ -0,0 +1,79 @@
|
|
1
|
+
require 'web_blocks/structure/block'
|
2
|
+
require 'web_blocks/structure/raw_file'
|
3
|
+
require 'web_blocks/support/tsort/hash'
|
4
|
+
|
5
|
+
module WebBlocks
|
6
|
+
module Structure
|
7
|
+
class Framework < Block
|
8
|
+
|
9
|
+
set :required, true
|
10
|
+
|
11
|
+
def register hash
|
12
|
+
name = hash[:name]
|
13
|
+
path = hash[:path]
|
14
|
+
resolved_block_path = resolved_path + path
|
15
|
+
blockfile_path = resolved_block_path + "Blockfile.rb"
|
16
|
+
raise "Undefined blockfile for #{path}" unless File.exists?(blockfile_path)
|
17
|
+
instance_eval File.read(blockfile_path)
|
18
|
+
block name do
|
19
|
+
set :base_path, resolved_block_path
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def include *args
|
24
|
+
block = self
|
25
|
+
args.each do |name|
|
26
|
+
block = block.block(name)
|
27
|
+
block.set :required, true
|
28
|
+
end
|
29
|
+
nodes = block.children.values
|
30
|
+
while nodes.length > 0
|
31
|
+
node = nodes.pop
|
32
|
+
node.set :required, true
|
33
|
+
if node.respond_to? :children
|
34
|
+
node.children.values.each { |node_child| nodes << node_child }
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def block_from_route route
|
40
|
+
block = self
|
41
|
+
route.each { |name| block = block.block(name) }
|
42
|
+
block
|
43
|
+
end
|
44
|
+
|
45
|
+
def adjacency_list
|
46
|
+
|
47
|
+
file_dependencies = {}
|
48
|
+
|
49
|
+
files = required_files
|
50
|
+
while files.length > 0
|
51
|
+
file = files.pop
|
52
|
+
file_dependencies[file] = []
|
53
|
+
file.resolve_dependencies.each do |dependency_route|
|
54
|
+
block_from_route(dependency_route).files.each do |dependency_file|
|
55
|
+
files << dependency_file unless file_dependencies.has_key?(dependency_file)
|
56
|
+
file_dependencies[file] << dependency_file
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
file_dependencies.each do |file, dependencies|
|
62
|
+
file.resolve_loose_dependencies.each do |dependency_route|
|
63
|
+
block_from_route(dependency_route).files.each do |dependency_file|
|
64
|
+
file_dependencies[file] << dependency_file if file_dependencies.has_key?(dependency_file)
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
end
|
70
|
+
|
71
|
+
def get_file_load_order type = RawFile
|
72
|
+
|
73
|
+
::WebBlocks::Support::TSort::Hash.try_convert(adjacency_list).tsort.keep_if(){ |file| file.is_a? type }
|
74
|
+
|
75
|
+
end
|
76
|
+
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require 'web_blocks/framework'
|
2
|
+
require 'web_blocks/structure/tree/leaf_node'
|
3
|
+
require 'web_blocks/structure/attribute/dependency'
|
4
|
+
require 'web_blocks/structure/attribute/loose_dependency'
|
5
|
+
|
6
|
+
module WebBlocks
|
7
|
+
module Structure
|
8
|
+
class RawFile < ::WebBlocks::Structure::Tree::LeafNode
|
9
|
+
|
10
|
+
include WebBlocks::Framework
|
11
|
+
include WebBlocks::Structure::Attribute::Dependency
|
12
|
+
include WebBlocks::Structure::Attribute::LooseDependency
|
13
|
+
|
14
|
+
set :required, true
|
15
|
+
|
16
|
+
def resolved_path
|
17
|
+
parent.resolved_path + (attributes.has_key?(:path) ? attributes[:path] : name)
|
18
|
+
end
|
19
|
+
|
20
|
+
def inspect
|
21
|
+
{
|
22
|
+
:name => name,
|
23
|
+
:route => route,
|
24
|
+
:resolved_path => resolved_path
|
25
|
+
}
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
require 'extend_method'
|
2
|
+
require 'web_blocks/support/attributes/class/container'
|
3
|
+
require 'web_blocks/support/attributes/container'
|
4
|
+
require 'web_blocks/support/tree/node'
|
5
|
+
require 'web_blocks/support/tree/child'
|
6
|
+
|
7
|
+
module WebBlocks
|
8
|
+
module Structure
|
9
|
+
module Tree
|
10
|
+
class LeafNode
|
11
|
+
|
12
|
+
class << self
|
13
|
+
include ::ExtendMethod
|
14
|
+
include ::WebBlocks::Support::Attributes::Class::Container
|
15
|
+
end
|
16
|
+
|
17
|
+
include ::WebBlocks::Support::Attributes::Container
|
18
|
+
include ::WebBlocks::Support::Tree::Node
|
19
|
+
include ::WebBlocks::Support::Tree::Child
|
20
|
+
|
21
|
+
extend_method :initialize do |name, attributes = {}|
|
22
|
+
parent_method name
|
23
|
+
self.attributes attributes
|
24
|
+
end
|
25
|
+
|
26
|
+
def route *args
|
27
|
+
val = parents.map{|parent| parent.name}.reverse + [name] + args
|
28
|
+
val.shift
|
29
|
+
val
|
30
|
+
end
|
31
|
+
|
32
|
+
def merge_branch_array_attribute attribute, method = nil
|
33
|
+
parent ? (get(attribute) + parent.send(method || caller[0][/`([^']*)'/, 1])) : get(attribute)
|
34
|
+
end
|
35
|
+
|
36
|
+
def run &block
|
37
|
+
instance_eval &block
|
38
|
+
self
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module WebBlocks
|
2
|
+
module Support
|
3
|
+
module Attributes
|
4
|
+
module Class
|
5
|
+
module Container
|
6
|
+
|
7
|
+
def set name, value
|
8
|
+
attributes[self.name] = {} unless attributes.has_key? self.name
|
9
|
+
attributes[self.name][name] = value
|
10
|
+
end
|
11
|
+
|
12
|
+
def attributes name = nil
|
13
|
+
if name
|
14
|
+
@@attributes.has_key?(name) ? @@attributes[name] : {}
|
15
|
+
else
|
16
|
+
@@attributes ||= {}
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
module WebBlocks
|
2
|
+
module Support
|
3
|
+
module Attributes
|
4
|
+
module Container
|
5
|
+
|
6
|
+
def has? name
|
7
|
+
attributes.has_key? name
|
8
|
+
end
|
9
|
+
|
10
|
+
def get name
|
11
|
+
attributes[name]
|
12
|
+
end
|
13
|
+
|
14
|
+
def set name, value
|
15
|
+
attributes name => value
|
16
|
+
end
|
17
|
+
|
18
|
+
def push name, value
|
19
|
+
attributes[name] << value
|
20
|
+
end
|
21
|
+
|
22
|
+
def attributes hash = nil
|
23
|
+
@attributes = class_attributes unless @attributes
|
24
|
+
@attributes.merge! hash if hash
|
25
|
+
@attributes
|
26
|
+
end
|
27
|
+
|
28
|
+
def class_attributes
|
29
|
+
computed = {}
|
30
|
+
self.class.ancestors.reverse.each do |klass|
|
31
|
+
if self.class.respond_to?(:attributes) and self.class.attributes.has_key?(klass.to_s)
|
32
|
+
computed.merge! self.class.attributes[klass.to_s]
|
33
|
+
end
|
34
|
+
end
|
35
|
+
Marshal.load(Marshal.dump(computed)) # deep clone
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'fork'
|
2
|
+
|
3
|
+
module WebBlocks
|
4
|
+
module Support
|
5
|
+
class ParallelJobs
|
6
|
+
def initialize
|
7
|
+
@running = []
|
8
|
+
end
|
9
|
+
def start &block
|
10
|
+
fork = Fork.execute :return, :exceptions do
|
11
|
+
yield
|
12
|
+
true
|
13
|
+
end
|
14
|
+
@running << fork
|
15
|
+
end
|
16
|
+
def wait_for_complete!
|
17
|
+
begin
|
18
|
+
@running.each { |p| p.return_value }
|
19
|
+
ensure
|
20
|
+
@running.each { |p| p.kill if p.alive? }
|
21
|
+
@running = []
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
require 'logger'
|
2
|
+
require 'delegate'
|
3
|
+
|
4
|
+
module WebBlocks
|
5
|
+
module Support
|
6
|
+
class ScopedLogger < ::SimpleDelegator
|
7
|
+
|
8
|
+
class << self
|
9
|
+
def new_without_scope logdev, shift_age = 0, shift_size = 1048576
|
10
|
+
self.new nil, logdev, shift_age, shift_size
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
attr_accessor :scopename
|
15
|
+
|
16
|
+
def initialize scopename, logdev, shift_age = 0, shift_size = 1048576
|
17
|
+
if logdev.is_a? ::Logger or logdev.is_a? ::WebBlocks::Support::ScopedLogger
|
18
|
+
super logdev
|
19
|
+
else
|
20
|
+
super ::Logger.new logdev, shift_age, shift_size
|
21
|
+
end
|
22
|
+
@scopename = scopename
|
23
|
+
end
|
24
|
+
|
25
|
+
def scope name = nil, &block
|
26
|
+
scoped_logger = self.class.new scopename ? "#{scopename} - #{name}" : name, __getobj__
|
27
|
+
yield scoped_logger if block_given?
|
28
|
+
scoped_logger
|
29
|
+
end
|
30
|
+
|
31
|
+
def scoped_progname progname = nil
|
32
|
+
if scopename
|
33
|
+
progname ? "#{scopename} - #{progname}" : scopename
|
34
|
+
else
|
35
|
+
progname ? progname : nil
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def add severity, message = nil, progname = nil, &block
|
40
|
+
__getobj__.add(severity, message, scoped_progname(progname), &block)
|
41
|
+
end
|
42
|
+
|
43
|
+
[:debug, :error, :fatal, :info, :unknown, :warn].each do |method|
|
44
|
+
define_method(method) { |progname = nil, &block| __getobj__.send(method, scoped_progname(progname), &block) }
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module WebBlocks
|
2
|
+
module Support
|
3
|
+
module Tree
|
4
|
+
module Child
|
5
|
+
|
6
|
+
def set_parent parent
|
7
|
+
@parent = parent
|
8
|
+
@parent.add_child(self) if @parent.respond_to?(:add_child)
|
9
|
+
end
|
10
|
+
|
11
|
+
def parent
|
12
|
+
@parent ||= nil
|
13
|
+
end
|
14
|
+
|
15
|
+
def parents
|
16
|
+
parent ? parent.parents.unshift(parent) : []
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
@@ -0,0 +1,35 @@
|
|
1
|
+
module WebBlocks
|
2
|
+
module Support
|
3
|
+
module Tree
|
4
|
+
module Parent
|
5
|
+
|
6
|
+
def add_child child
|
7
|
+
key = child.respond_to?(:name) ? child.name : child
|
8
|
+
return if has_child? key
|
9
|
+
@children ||= {}
|
10
|
+
@children[key] = child
|
11
|
+
child.set_parent(self) if child.respond_to?(:set_parent)
|
12
|
+
end
|
13
|
+
|
14
|
+
def children
|
15
|
+
@children || {}
|
16
|
+
end
|
17
|
+
|
18
|
+
def has_child? name
|
19
|
+
children.has_key? name
|
20
|
+
end
|
21
|
+
|
22
|
+
def remove_child child
|
23
|
+
name = child.respond_to?(:name) ? child.name : child
|
24
|
+
children.delete name if has_child? name
|
25
|
+
end
|
26
|
+
|
27
|
+
def remove_all_children
|
28
|
+
@children = {}
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'tsort'
|
2
|
+
|
3
|
+
module WebBlocks
|
4
|
+
module Support
|
5
|
+
module TSort
|
6
|
+
class Hash < ::Hash
|
7
|
+
|
8
|
+
class << self
|
9
|
+
def try_convert original
|
10
|
+
converted = self.new
|
11
|
+
super(original).each do |key, value|
|
12
|
+
converted[key] = value
|
13
|
+
end
|
14
|
+
converted
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
include ::TSort
|
19
|
+
|
20
|
+
alias tsort_each_node each_key
|
21
|
+
|
22
|
+
def tsort_each_child(node, &block)
|
23
|
+
fetch(node).each(&block)
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require 'web_blocks/thor/base'
|
2
|
+
require 'web_blocks/structure/raw_file'
|
3
|
+
require 'web_blocks/structure/scss_file'
|
4
|
+
require 'web_blocks/structure/js_file'
|
5
|
+
require 'web_blocks/structure/img_file'
|
6
|
+
require 'web_blocks/structure/font_file'
|
7
|
+
|
8
|
+
module WebBlocks
|
9
|
+
module Thor
|
10
|
+
class Base
|
11
|
+
class << self
|
12
|
+
|
13
|
+
def type_get_class_from_string string
|
14
|
+
string = string.downcase if string
|
15
|
+
case string
|
16
|
+
when 'all'
|
17
|
+
::WebBlocks::Structure::RawFile
|
18
|
+
when 'scss'
|
19
|
+
::WebBlocks::Structure::ScssFile
|
20
|
+
when 'js'
|
21
|
+
::WebBlocks::Structure::JsFile
|
22
|
+
when 'img'
|
23
|
+
::WebBlocks::Structure::ImgFile
|
24
|
+
when 'font'
|
25
|
+
::WebBlocks::Structure::FontFile
|
26
|
+
when nil
|
27
|
+
::WebBlocks::Structure::RawFile
|
28
|
+
else
|
29
|
+
raise "invalid type `#{string}' specified"
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|