web_blocks 2.0.0.dev
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 +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
|