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.
Files changed (88) hide show
  1. checksums.yaml +15 -0
  2. data/.coveralls.yml +1 -0
  3. data/.gitignore +23 -0
  4. data/.travis.yml +8 -0
  5. data/CHANGELOG.md +1 -0
  6. data/CONTRIBUTING.md +1 -0
  7. data/Gemfile +3 -0
  8. data/LICENSE.txt +27 -0
  9. data/README.md +641 -0
  10. data/Rakefile +13 -0
  11. data/bin/blocks +9 -0
  12. data/demo/.gitignore +4 -0
  13. data/demo/Blockfile.rb +67 -0
  14. data/demo/bower.json +8 -0
  15. data/demo/package.json +5 -0
  16. data/demo/src/config/WebBlocks-breakpoints.scss +9 -0
  17. data/lib/web_blocks/framework.rb +20 -0
  18. data/lib/web_blocks/manager/bower.rb +106 -0
  19. data/lib/web_blocks/manager/builder/base.rb +31 -0
  20. data/lib/web_blocks/manager/builder/js.rb +54 -0
  21. data/lib/web_blocks/manager/builder/scss.rb +57 -0
  22. data/lib/web_blocks/manager/parallel_builder.rb +52 -0
  23. data/lib/web_blocks/product/concat_file/js.rb +15 -0
  24. data/lib/web_blocks/product/concat_file/raw.rb +33 -0
  25. data/lib/web_blocks/product/concat_file/scss.rb +21 -0
  26. data/lib/web_blocks/strategy/compile/scss.rb +90 -0
  27. data/lib/web_blocks/strategy/link/base.rb +51 -0
  28. data/lib/web_blocks/strategy/link/js.rb +30 -0
  29. data/lib/web_blocks/strategy/link/scss.rb +30 -0
  30. data/lib/web_blocks/structure/attribute/dependency.rb +25 -0
  31. data/lib/web_blocks/structure/attribute/loose_dependency.rb +25 -0
  32. data/lib/web_blocks/structure/attribute/reverse_dependency.rb +16 -0
  33. data/lib/web_blocks/structure/attribute/reverse_loose_dependency.rb +16 -0
  34. data/lib/web_blocks/structure/block.rb +95 -0
  35. data/lib/web_blocks/structure/font_file.rb +9 -0
  36. data/lib/web_blocks/structure/framework.rb +79 -0
  37. data/lib/web_blocks/structure/img_file.rb +9 -0
  38. data/lib/web_blocks/structure/js_file.rb +9 -0
  39. data/lib/web_blocks/structure/raw_file.rb +30 -0
  40. data/lib/web_blocks/structure/scss_file.rb +9 -0
  41. data/lib/web_blocks/structure/tree/leaf_node.rb +44 -0
  42. data/lib/web_blocks/structure/tree/node.rb +14 -0
  43. data/lib/web_blocks/structure.rb +7 -0
  44. data/lib/web_blocks/support/attributes/class/container.rb +24 -0
  45. data/lib/web_blocks/support/attributes/container.rb +41 -0
  46. data/lib/web_blocks/support/parallel_jobs.rb +26 -0
  47. data/lib/web_blocks/support/scoped_logger.rb +49 -0
  48. data/lib/web_blocks/support/tree/child.rb +23 -0
  49. data/lib/web_blocks/support/tree/node.rb +14 -0
  50. data/lib/web_blocks/support/tree/parent.rb +35 -0
  51. data/lib/web_blocks/support/tsort/hash.rb +29 -0
  52. data/lib/web_blocks/thor/base/class/type_get_class_from_string.rb +36 -0
  53. data/lib/web_blocks/thor/base/class/types.rb +21 -0
  54. data/lib/web_blocks/thor/base/initialize.rb +145 -0
  55. data/lib/web_blocks/thor/base/prepare_blocks.rb +155 -0
  56. data/lib/web_blocks/thor/base.rb +12 -0
  57. data/lib/web_blocks/thor/build/all.rb +30 -0
  58. data/lib/web_blocks/thor/build.rb +13 -0
  59. data/lib/web_blocks/thor/inspect/blocks/attribute_printer.rb +48 -0
  60. data/lib/web_blocks/thor/inspect/blocks/block_printer.rb +43 -0
  61. data/lib/web_blocks/thor/inspect/blocks/printer.rb +24 -0
  62. data/lib/web_blocks/thor/inspect/blocks.rb +27 -0
  63. data/lib/web_blocks/thor/inspect/bower_registry.rb +24 -0
  64. data/lib/web_blocks/thor/inspect/dependency_list.rb +30 -0
  65. data/lib/web_blocks/thor/inspect/dependency_order.rb +26 -0
  66. data/lib/web_blocks/thor/inspect.rb +11 -0
  67. data/lib/web_blocks/thor/partial/compile/scss.rb +24 -0
  68. data/lib/web_blocks/thor/partial/compile.rb +13 -0
  69. data/lib/web_blocks/thor/partial/link/js.rb +23 -0
  70. data/lib/web_blocks/thor/partial/link/scss.rb +23 -0
  71. data/lib/web_blocks/thor/partial/link.rb +13 -0
  72. data/lib/web_blocks/thor/partial/runner.rb +14 -0
  73. data/lib/web_blocks/thor/runner.rb +16 -0
  74. data/lib/web_blocks/thor/watch/all.rb +67 -0
  75. data/lib/web_blocks/thor/watch.rb +13 -0
  76. data/lib/web_blocks/version.rb +3 -0
  77. data/lib/web_blocks.rb +13 -0
  78. data/test/init.rb +7 -0
  79. data/test/web_blocks/framework.rb +40 -0
  80. data/test/web_blocks/structure.rb +42 -0
  81. data/test/web_blocks/support/attribute/class/container.rb +29 -0
  82. data/test/web_blocks/support/attribute/container.rb +71 -0
  83. data/test/web_blocks/support/tree/child.rb +60 -0
  84. data/test/web_blocks/support/tree/node.rb +18 -0
  85. data/test/web_blocks/support/tree/parent.rb +81 -0
  86. data/test/web_blocks/version.rb +10 -0
  87. data/web_blocks.gemspec +35 -0
  88. metadata +297 -0
@@ -0,0 +1,21 @@
1
+ require 'web_blocks/thor/base'
2
+
3
+ module WebBlocks
4
+ module Thor
5
+ class Base
6
+ class << self
7
+
8
+ def types
9
+ @@types ||= {
10
+ 'all' => 'All files regardless of type',
11
+ 'scss' => 'SCSS files',
12
+ 'js' => 'Javascript files',
13
+ 'img' => 'Image files such as JPG, GIF, PNG and SVG',
14
+ 'font' => 'Font files such as WOFF, TTF, EOT and SVG'
15
+ }
16
+ end
17
+
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,145 @@
1
+ require 'pathname'
2
+ require 'logger'
3
+ require 'web_blocks/support/scoped_logger'
4
+ require 'web_blocks/manager/bower'
5
+ require 'web_blocks/thor/base'
6
+
7
+ module WebBlocks
8
+ module Thor
9
+ class Base
10
+
11
+ attr_reader :base_path
12
+ attr_reader :bowerfile_path
13
+ attr_reader :blockfile_path
14
+ attr_reader :bower_manager
15
+ attr_reader :log
16
+ attr_reader :root
17
+
18
+ class_option :base_path,
19
+ :type => :string,
20
+ :default => nil,
21
+ :desc => 'Path to workspace'
22
+
23
+ class_option :blockfile_path,
24
+ :type => :string,
25
+ :default => nil,
26
+ :desc => 'Path to workspace'
27
+
28
+ def initialize args = [], options = {}, config = {}
29
+
30
+ super args, options, config
31
+
32
+ initialize_version!
33
+ initialize_log!
34
+ initialize_paths!
35
+ initialize_bower_manager!
36
+ initialize_root!
37
+
38
+ end
39
+
40
+ private
41
+
42
+ def initialize_version!
43
+
44
+ if WebBlocks::VERSION.match /dev$/
45
+ puts "
46
+ = = = = = = = = = = = = W A R N I N G = = = = = = = = = = = = = = =
47
+
48
+ You are using a pre-release DEVELOPMENT SNAPSHOT of WebBlocks.
49
+ This software should not be considered stable, and users are asked
50
+ to be mindful of the fact that there may be significant changes to
51
+ the APIs ad internals before release.
52
+
53
+ = = = = = = = = = = = = W A R N I N G = = = = = = = = = = = = = = =\n\n"
54
+ end
55
+
56
+ end
57
+
58
+ def initialize_log!
59
+ base = ::Logger.new STDOUT
60
+ base.level = ::Logger::DEBUG
61
+ base.datetime_format = '%Y-%m-%d %H:%M:%S'
62
+ @log = ::WebBlocks::Support::ScopedLogger.new_without_scope base
63
+ end
64
+
65
+ def initialize_paths!
66
+
67
+ initialize_base_path_from_resolved! unless initialize_base_path_from_options!
68
+ initialize_bowerfile_path!
69
+ initialize_blockfile_path!
70
+
71
+ end
72
+
73
+ def initialize_base_path_from_options!
74
+
75
+ if self.options.base_path
76
+ @base_path = Pathname.new(Dir.pwd) + self.options.base_path
77
+ true
78
+ else
79
+ false
80
+ end
81
+
82
+ end
83
+
84
+ def initialize_base_path_from_resolved! path = nil
85
+
86
+ path = Pathname.new(Dir.pwd) unless path
87
+
88
+ if File.exists? path + 'bower.json'
89
+ @base_path = path
90
+ return true
91
+ end
92
+
93
+ if path.to_s == '/'
94
+ log.fatal('INIT') { 'Workspace could not be resolved' }
95
+ exit 1
96
+ end
97
+
98
+ initialize_base_path_from_resolved! path.parent
99
+
100
+ end
101
+
102
+ def initialize_bowerfile_path!
103
+
104
+ @bowerfile_path = base_path + 'bower.json'
105
+
106
+ unless File.exists? @bowerfile_path
107
+ log.fatal('INIT') { "bower.json does not exist at #{bowerfile_path}" }
108
+ exit 1
109
+ end
110
+
111
+ end
112
+
113
+ def initialize_blockfile_path!
114
+
115
+ if self.options.blockfile_path
116
+ @blockfile_path = Pathname.new(Dir.pwd) + self.options.blockfile_path
117
+ else
118
+ @blockfile_path = base_path + 'Blockfile.rb'
119
+ end
120
+
121
+ unless File.exists? @blockfile_path
122
+ @blockfile_path = nil
123
+ end
124
+
125
+ end
126
+
127
+ def initialize_bower_manager!
128
+
129
+ @bower_manager = ::WebBlocks::Manager::Bower.new @base_path
130
+
131
+ end
132
+
133
+ def initialize_root!
134
+
135
+ @root = framework do
136
+ set :build_dir, 'build'
137
+ set :css_build_dir, 'css'
138
+ set :js_build_dir, 'js'
139
+ end
140
+
141
+ end
142
+
143
+ end
144
+ end
145
+ end
@@ -0,0 +1,155 @@
1
+ require 'pathname'
2
+ require 'execjs/module'
3
+ require 'web_blocks/manager/bower'
4
+ require 'web_blocks/thor/base'
5
+
6
+ module WebBlocks
7
+ module Thor
8
+ class Base
9
+
10
+ class_option :reload_bower,
11
+ :type => :boolean,
12
+ :default => false,
13
+ :desc => 'Reload Bower-managed blocks'
14
+
15
+ class_option :reload_registry,
16
+ :type => :boolean,
17
+ :default => false,
18
+ :desc => 'Reload block registry rather than using cache'
19
+
20
+ class_option :include,
21
+ :type => :array,
22
+ :default => nil,
23
+ :desc => 'Paths to explicitly include'
24
+
25
+ no_commands do
26
+
27
+ def prepare_blocks!
28
+
29
+ log.scope 'INIT' do |log|
30
+
31
+ begin
32
+
33
+ if !bower_manager.installed? or self.options.reload_bower
34
+ install_bower_components! log
35
+ elsif self.options.reload_registry
36
+ clean_bower_registry! log
37
+ end
38
+
39
+ rescue ::ExecJS::ProgramError => e
40
+
41
+ if e.message.match "Cannot find module 'bower'"
42
+ log.fatal { 'Bower must be installed -- try `npm install bower\'' }
43
+ exit 1
44
+ else
45
+ raise e
46
+ end
47
+
48
+ end
49
+
50
+ load_bower_registry! log
51
+ load_blockfile! log
52
+ include_own_routes! log
53
+ include_routes_from_command_line! log if self.options.include
54
+
55
+ end
56
+
57
+ end
58
+
59
+ end
60
+
61
+ private
62
+
63
+ def install_bower_components! log
64
+
65
+ log.debug do
66
+ bower_manager.clean_update!
67
+ bower_manager.installed? ? 'Reloaded bower components and cleaning component registry' : 'Installed bower components'
68
+ end
69
+
70
+ end
71
+
72
+ def clean_bower_registry! log
73
+
74
+ log.debug do
75
+ bower_manager.clean_registry_cache!
76
+ 'Cleaned bower component registry'
77
+ end
78
+
79
+ end
80
+
81
+ def load_bower_registry! log
82
+
83
+ log.scope 'Block' do |log|
84
+ log.debug do
85
+ task = self
86
+ framework :path => @base_path do
87
+ task.bower_manager.registry.components.each do |name, path|
88
+ begin
89
+ log.debug name do
90
+ register :name => name, :path => path
91
+ "Loaded"
92
+ end
93
+ rescue
94
+ log.warn("#{name}") { "Skipped -- Blockfile.rb does not exist" }
95
+ end
96
+ end
97
+ end
98
+ bower_manager.has_registry_cache? ? 'Loaded cached bower component registry' : 'Generated bower component registry'
99
+ end
100
+ end
101
+
102
+ end
103
+
104
+ def load_blockfile! log
105
+
106
+ if blockfile_path
107
+
108
+ log.debug do
109
+
110
+ root.instance_eval File.read blockfile_path
111
+ "Loaded #{blockfile_path}"
112
+
113
+ end
114
+
115
+ else
116
+
117
+ log.warn('INIT') { "Running without Blockfile -- does not exist" }
118
+
119
+ end
120
+
121
+ end
122
+
123
+ def include_own_routes! log
124
+
125
+ own_name = bower_manager.registry.name
126
+ if root.has_child? own_name
127
+ root.children[own_name].set :required, true
128
+ end
129
+
130
+ end
131
+
132
+ def include_routes_from_command_line! log
133
+
134
+ route = []
135
+
136
+ self.options.include.each do |segment|
137
+
138
+ delimiter = segment[segment.length-1] == ','
139
+
140
+ route.push delimiter ? segment[0,segment.length-1] : segment
141
+
142
+ if delimiter
143
+ root.include *route
144
+ route = []
145
+ end
146
+
147
+ end
148
+
149
+ root.include *route if route.length > 0
150
+
151
+ end
152
+
153
+ end
154
+ end
155
+ end
@@ -0,0 +1,12 @@
1
+ require 'thor'
2
+ require 'web_blocks/framework'
3
+
4
+ module WebBlocks
5
+ module Thor
6
+ class Base < ::Thor
7
+ include ::WebBlocks::Framework
8
+ end
9
+ end
10
+ end
11
+
12
+ Dir.glob(Pathname.new(__FILE__).parent.realpath + "base/**/*.rb").each { |r| require r }
@@ -0,0 +1,30 @@
1
+ require 'tsort'
2
+ require 'web_blocks/thor/build'
3
+ require 'web_blocks/manager/parallel_builder'
4
+
5
+ class Fork
6
+
7
+ end
8
+
9
+ module WebBlocks
10
+ module Thor
11
+ class Build
12
+
13
+ description = "Build all assets"
14
+ desc "all", description
15
+ long_desc description
16
+
17
+ def all
18
+
19
+ prepare_blocks!
20
+
21
+ jobs = WebBlocks::Manager::ParallelBuilder.new self
22
+ jobs.start :scss
23
+ jobs.start :js
24
+ jobs.save_when_done!
25
+
26
+ end
27
+
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,13 @@
1
+ require 'web_blocks/thor/base'
2
+
3
+ module WebBlocks
4
+ module Thor
5
+ class Build < Base
6
+
7
+ default_task 'all'
8
+
9
+ end
10
+ end
11
+ end
12
+
13
+ Dir.glob(Pathname.new(__FILE__).parent.realpath + "build/**/*.rb").each { |r| require r }
@@ -0,0 +1,48 @@
1
+ require 'web_blocks/thor/inspect/blocks/printer'
2
+
3
+ module WebBlocks
4
+ module Thor
5
+ class Inspect
6
+ no_commands do
7
+ module Blocks
8
+ class AttributePrinter < Printer
9
+
10
+ def initialize key, value, options
11
+ super options
12
+ @value = value
13
+ @key_string = parse_key(key)
14
+ @value_string = parse_value(value)
15
+ end
16
+
17
+ def parse_key key
18
+ ":#{key}"
19
+ end
20
+
21
+ def parse_value value
22
+ if @value.is_a?(::Array) or @value.is_a?(::Hash)
23
+ value.size > 0 ? value : nil
24
+ elsif value.is_a?(::String)
25
+ "\"#{value}\""
26
+ elsif value.is_a?(::TrueClass)
27
+ "true"
28
+ elsif value.is_a?(::FalseClass)
29
+ "false"
30
+ else
31
+ nil
32
+ end
33
+ end
34
+
35
+ def color
36
+ @value ? [:green] : [:red]
37
+ end
38
+
39
+ def print!
40
+ say("#{@key_string} = #{@value_string}", color) if @value_string
41
+ end
42
+
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,43 @@
1
+ require 'web_blocks/thor/inspect/blocks/printer'
2
+ require 'web_blocks/thor/inspect/blocks/attribute_printer'
3
+
4
+ module WebBlocks
5
+ module Thor
6
+ class Inspect
7
+ no_commands do
8
+ module Blocks
9
+ class BlockPrinter < Printer
10
+
11
+ def initialize block, options
12
+ super options
13
+ @block = block
14
+ end
15
+
16
+ def print_name!
17
+ say "#{@block.name} (#{@block.class.name.split('::')[-1]})", (@block.respond_to?(:children) ? :bold : [])
18
+ end
19
+
20
+ def print_attributes!
21
+ @block.attributes.each do |key, value|
22
+ AttributePrinter.new(key, value, @options).print!
23
+ end
24
+ end
25
+
26
+ def print_children!
27
+ @block.children.each do |_, child|
28
+ self.class.new(child, @options).print!
29
+ end
30
+ end
31
+
32
+ def print!
33
+ print_name!
34
+ print_attributes! if @options[:attributes]
35
+ print_children! if @block.respond_to? :children
36
+ end
37
+
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,24 @@
1
+ module WebBlocks
2
+ module Thor
3
+ class Inspect
4
+ no_commands do
5
+ module Blocks
6
+ class Printer
7
+
8
+ def initialize options
9
+ @options = options.clone
10
+ @options[:depth] = 0 unless @options.has_key?(:depth)
11
+ @options[:depth] = @options[:depth] + 1
12
+ @shell = ::WebBlocks::Thor::Inspect::Shell::Color.new
13
+ end
14
+
15
+ def say(message = '', color = nil, force_new_line = (message.to_s !~ /( |\t)\Z/))
16
+ @shell.say Array.new(@options[:depth]).join(' ') + message, color, force_new_line
17
+ end
18
+
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,27 @@
1
+ require 'web_blocks/thor/inspect'
2
+ require 'web_blocks/thor/inspect/blocks/block_printer'
3
+
4
+ module WebBlocks
5
+ module Thor
6
+ class Inspect
7
+
8
+ blocks_desc = 'List of registered blocks, optionally with attributes and filtered to a route'
9
+ desc "blocks", blocks_desc
10
+ long_desc blocks_desc
11
+ method_option :route, :type => :array, :default => [], :desc => 'Route to block to print'
12
+ method_option :attributes, :type => :boolean, :default => false, :desc => 'Show block attributes'
13
+
14
+ def blocks
15
+
16
+ prepare_blocks!
17
+
18
+ Blocks::BlockPrinter.new(
19
+ root.block_from_route(options.route),
20
+ :attributes => options[:attributes]
21
+ ).print!
22
+
23
+ end
24
+
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,24 @@
1
+ require 'web_blocks/thor/inspect'
2
+
3
+ module WebBlocks
4
+ module Thor
5
+ class Inspect
6
+
7
+ bower_registry_desc = "Registry of blocks as defined by bower.json"
8
+ desc "bower_registry", bower_registry_desc
9
+ long_desc bower_registry_desc
10
+
11
+ def bower_registry
12
+
13
+ prepare_blocks!
14
+
15
+ bower_manager.registry.components.each do |name,path|
16
+ say name, :bold
17
+ say " #{path}", :green
18
+ end
19
+
20
+ end
21
+
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,30 @@
1
+ require 'web_blocks/thor/inspect'
2
+
3
+ module WebBlocks
4
+ module Thor
5
+ class Inspect
6
+
7
+ list_desc = "Adjacency list of all files and dependencies"
8
+ desc "dependency_list", list_desc
9
+ long_desc list_desc
10
+ method_option :type, :desc => "Any of: \"#{types.keys.join('", "')}\"; default \"all\"."
11
+
12
+ def dependency_list
13
+
14
+ prepare_blocks!
15
+
16
+ type = self.class.type_get_class_from_string options.type
17
+
18
+ root.adjacency_list.each do |file, dependencies|
19
+ next unless file.is_a? type
20
+ say file.resolved_path.to_s
21
+ dependencies.each do |dependency|
22
+ say " #{dependency.resolved_path.to_s}", :green
23
+ end
24
+ end
25
+
26
+ end
27
+
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,26 @@
1
+ require 'web_blocks/thor/inspect'
2
+
3
+ module WebBlocks
4
+ module Thor
5
+ class Inspect
6
+
7
+ order_desc = "File order based on topological sort of dependency list"
8
+ desc "dependency_order", order_desc
9
+ long_desc order_desc
10
+ method_option :type, :desc => "Any of: \"#{types.keys.join('", "')}\"; default \"all\"."
11
+
12
+ def dependency_order
13
+
14
+ prepare_blocks!
15
+
16
+ type = self.class.type_get_class_from_string options.type
17
+
18
+ root.get_file_load_order(type).each do |file|
19
+ say "#{file.resolved_path.to_s}"
20
+ end
21
+
22
+ end
23
+
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,11 @@
1
+ require 'web_blocks/thor/base'
2
+
3
+ module WebBlocks
4
+ module Thor
5
+ class Inspect < Base
6
+
7
+ end
8
+ end
9
+ end
10
+
11
+ Dir.glob(Pathname.new(__FILE__).parent.realpath + "inspect/**/*.rb").each { |r| require r }
@@ -0,0 +1,24 @@
1
+ require 'tsort'
2
+ require 'web_blocks/thor/partial/link'
3
+ require 'web_blocks/strategy/compile/scss'
4
+
5
+ module WebBlocks
6
+ module Thor
7
+ module Partial
8
+ class Compile
9
+
10
+ description = "Compile linked SCSS files"
11
+ desc "scss", description
12
+ long_desc description
13
+
14
+ def scss
15
+
16
+ prepare_blocks!
17
+ ::WebBlocks::Strategy::Compile::Scss.new(self).execute!
18
+
19
+ end
20
+
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,13 @@
1
+ require 'web_blocks/thor/base'
2
+
3
+ module WebBlocks
4
+ module Thor
5
+ module Partial
6
+ class Compile < Base
7
+
8
+ end
9
+ end
10
+ end
11
+ end
12
+
13
+ Dir.glob(Pathname.new(__FILE__).parent.realpath + "compile/**/*.rb").each { |r| require r }
@@ -0,0 +1,23 @@
1
+ require 'tsort'
2
+ require 'web_blocks/thor/partial/link'
3
+ require 'web_blocks/strategy/link/js'
4
+
5
+ module WebBlocks
6
+ module Thor
7
+ module Partial
8
+ class Link
9
+
10
+ description = "Construct linked construct of JS files based on dependencies"
11
+ desc "js", description
12
+ long_desc description
13
+
14
+ def js
15
+
16
+ prepare_blocks!
17
+ ::WebBlocks::Strategy::Link::Js.new(self).execute!
18
+
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end