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,23 @@
1
+ require 'web_blocks/thor/partial/link'
2
+ require 'web_blocks/strategy/link/scss'
3
+
4
+ module WebBlocks
5
+ module Thor
6
+ module Partial
7
+ class Link
8
+
9
+ description = "Construct linked construct of SCSS files based on dependencies"
10
+ desc "scss", description
11
+ long_desc description
12
+
13
+ def scss
14
+
15
+ prepare_blocks!
16
+ ::WebBlocks::Strategy::Link::Scss.new(self).execute!
17
+
18
+ end
19
+
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,13 @@
1
+ require 'web_blocks/thor/base'
2
+
3
+ module WebBlocks
4
+ module Thor
5
+ module Partial
6
+ class Link < Base
7
+
8
+ end
9
+ end
10
+ end
11
+ end
12
+
13
+ Dir.glob(Pathname.new(__FILE__).parent.realpath + "link/**/*.rb").each { |r| require r }
@@ -0,0 +1,14 @@
1
+ require 'thor'
2
+ require 'web_blocks/thor/partial/link'
3
+ require 'web_blocks/thor/partial/compile'
4
+
5
+ module WebBlocks
6
+ module Thor
7
+ module Partial
8
+ class Runner < ::Thor
9
+ register ::WebBlocks::Thor::Partial::Link, :link, "link", "Linker that prepares assets for compilation"
10
+ register ::WebBlocks::Thor::Partial::Compile, :compile, "compile", "Compiler that builds assets from linked sources"
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,16 @@
1
+ require 'thor'
2
+ require 'web_blocks/thor/inspect'
3
+ require 'web_blocks/thor/partial/runner'
4
+ require 'web_blocks/thor/build'
5
+ require 'web_blocks/thor/watch'
6
+
7
+ module WebBlocks
8
+ module Thor
9
+ class Runner < ::Thor
10
+ register ::WebBlocks::Thor::Inspect, :inspect, "inspect", "Inspect the blocks configuration and tree"
11
+ register ::WebBlocks::Thor::Build, :build, "build", "Link, compile and optimize all assets"
12
+ register ::WebBlocks::Thor::Watch, :watch, "watch", "Watch for changes and rebuild all assets"
13
+ register ::WebBlocks::Thor::Partial::Runner, :partial, "partial", "Perform a single step of the build process"
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,67 @@
1
+ require 'pathname'
2
+ require 'fssm'
3
+ require 'web_blocks/thor/watch'
4
+ require 'web_blocks/manager/parallel_builder'
5
+
6
+ module WebBlocks
7
+ module Thor
8
+ class Watch
9
+
10
+ description = "Watch and rebuild all assets"
11
+ desc "all", description
12
+ long_desc description
13
+
14
+ def all
15
+
16
+ # TODO: refactor this file so it's not a run-on routine
17
+
18
+ prepare_blocks!
19
+
20
+ task = self
21
+
22
+ triggers = root.adjacency_list.keys.map(){|f| f.resolved_path.to_s }
23
+ triggers << base_path + 'Blockfile.rb'
24
+ triggers << base_path + '.blocks/cache/bower/registry.yaml'
25
+ triggers << base_path + 'bower_components/*/Blockfile.rb'
26
+
27
+ handler = Proc.new do |base, relative|
28
+
29
+ changed_file = Pathname.new(base) + relative
30
+ relink_needed = changed_file.to_s.match(/Blockfile.rb$/)
31
+
32
+ log.info("Watch"){ "Detected change to #{changed_file}" }
33
+
34
+ if relink_needed
35
+ root.remove_all_children
36
+ prepare_blocks!
37
+ end
38
+
39
+ begin
40
+
41
+ jobs = WebBlocks::Manager::ParallelBuilder.new task
42
+ jobs.start :scss
43
+ jobs.start :js
44
+ jobs.save_when_done!
45
+
46
+ rescue ::TSort::Cyclic => e
47
+
48
+ log.error { "Build failed -- Cyclical dependencies detected" }
49
+
50
+ end
51
+
52
+ end
53
+
54
+ monitor = FSSM::Monitor.new
55
+ monitor.path @base_path do
56
+ glob triggers
57
+ update &handler
58
+ delete &handler
59
+ create &handler
60
+ end
61
+ monitor.run
62
+
63
+ end
64
+
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,13 @@
1
+ require 'web_blocks/thor/base'
2
+
3
+ module WebBlocks
4
+ module Thor
5
+ class Watch < Base
6
+
7
+ default_task 'all'
8
+
9
+ end
10
+ end
11
+ end
12
+
13
+ Dir.glob(Pathname.new(__FILE__).parent.realpath + "watch/**/*.rb").each { |r| require r }
@@ -0,0 +1,3 @@
1
+ module WebBlocks
2
+ VERSION = "2.0.0.dev"
3
+ end
data/lib/web_blocks.rb ADDED
@@ -0,0 +1,13 @@
1
+ require 'pathname'
2
+
3
+ # This module contains WebBlocks-related libraries:
4
+ #
5
+ # * {WebBlocks::Framework} defines singleton accessor method framework
6
+ # * {WebBlocks::Structure} defines the structures that comprise WebBlocks
7
+ # * {WebBlocks::Support} defines supporting libraries used by WebBlocks
8
+ #
9
+ # Also see {file:REFERENCE.md full WebBlocks reference}.
10
+ module WebBlocks; end
11
+
12
+ # Require all WebBlocks library files
13
+ Dir.glob(Pathname.new(__FILE__).parent.realpath + "**/*.rb").each { |r| require r }
data/test/init.rb ADDED
@@ -0,0 +1,7 @@
1
+ require 'simplecov'
2
+ require 'coveralls'
3
+
4
+ SimpleCov.formatter = Coveralls::SimpleCov::Formatter
5
+ SimpleCov.start do
6
+ add_filter '/test/'
7
+ end
@@ -0,0 +1,40 @@
1
+ require 'test/unit'
2
+ require 'web_blocks/framework'
3
+
4
+ class TestFramework < Test::Unit::TestCase
5
+
6
+ include WebBlocks::Framework
7
+
8
+ def setup
9
+ @@framework = nil
10
+ end
11
+
12
+ def test_singleton
13
+ previous = framework
14
+ @@framework = nil
15
+ current = framework
16
+ assert previous != current, "Setting @@framework nil in WebBlocks::Framework context destroys singleton"
17
+ assert current === framework, "framework returns same object on subsequent calls"
18
+ end
19
+
20
+ def test_type
21
+ assert framework, "framework method within WebBlocks::Framework"
22
+ assert framework.is_a?(::WebBlocks::Structure::Framework), "framework method returns ::WebBlocks::Structure::Framework"
23
+ end
24
+
25
+ def test_attributes
26
+ framework :test => true
27
+ assert framework.get(:test), 'Attribute set from method parameters on singleton instantiation'
28
+ framework :added_attribute => true
29
+ assert framework.get(:added_attribute), 'Attribute set from method parameters on singleton access'
30
+ framework do
31
+ set :block_set_attribute, true
32
+ end
33
+ assert framework.get(:block_set_attribute), 'Block context executed'
34
+ framework :block_override_attribute => false do
35
+ set :block_override_attribute, true
36
+ end
37
+ assert framework.get(:block_override_attribute), 'Block context executed after attributes set from method parameters'
38
+ end
39
+
40
+ end
@@ -0,0 +1,42 @@
1
+ require 'test/unit'
2
+ require 'web_blocks/structure'
3
+
4
+ class TestStructure < Test::Unit::TestCase
5
+
6
+ def test_namespace
7
+
8
+ assert_nothing_raised("Structure module defined"){ WebBlocks::Structure }
9
+
10
+ end
11
+
12
+ def test_structures_classes
13
+
14
+ ['Block','FontFile','Framework','ImgFile','JsFile','RawFile','ScssFile'].each do |type|
15
+ klass = nil
16
+ assert_nothing_raised("#{type} class defined"){ klass = eval "WebBlocks::Structure::#{type}" }
17
+ assert klass.class == Class
18
+ end
19
+
20
+ end
21
+
22
+ def test_structure_attribute_modules
23
+
24
+ ['Dependency','LooseDependency'].each do |type|
25
+ mod = nil
26
+ assert_nothing_raised("Attribute::#{type} module defined"){ mod = eval "WebBlocks::Structure::Attribute::#{type}" }
27
+ assert mod.class == Module
28
+ end
29
+
30
+ end
31
+
32
+ def test_structure_tree_classes
33
+
34
+ ['LeafNode','Node'].each do |type|
35
+ klass = nil
36
+ assert_nothing_raised("Tree::#{type} class defined"){ klass = eval "WebBlocks::Structure::Tree::#{type}" }
37
+ assert klass.class == Class
38
+ end
39
+
40
+ end
41
+
42
+ end
@@ -0,0 +1,29 @@
1
+ require 'test/unit'
2
+ require 'web_blocks/support/attributes/class/container'
3
+
4
+ class TestSupportAttributesClassContainer < Test::Unit::TestCase
5
+
6
+ class Container
7
+ class << self
8
+ include WebBlocks::Support::Attributes::Class::Container
9
+ end
10
+ end
11
+
12
+ def setup
13
+ @name = Container.name
14
+ end
15
+
16
+ def test_type
17
+ assert Container.attributes.is_a? Hash
18
+ assert Container.attributes(@name).is_a? Hash
19
+ end
20
+
21
+ def test_set
22
+ assert Container.attributes(@name).length == 0
23
+ Container.set :test1, :value
24
+ assert Container.attributes(@name).is_a? Hash
25
+ assert Container.attributes(@name).length == 1
26
+ assert Container.attributes(@name)[:test1] == :value
27
+ end
28
+
29
+ end
@@ -0,0 +1,71 @@
1
+ require 'test/unit'
2
+ require 'web_blocks/support/attributes/container'
3
+
4
+ class TestSupportAttributesContainer < Test::Unit::TestCase
5
+
6
+ class Container
7
+ include WebBlocks::Support::Attributes::Container
8
+ end
9
+
10
+ class ClassContainer
11
+ class << self
12
+ include WebBlocks::Support::Attributes::Class::Container
13
+ end
14
+ include WebBlocks::Support::Attributes::Container
15
+ set :container, :container_value
16
+ set :container_overridden, :container_value
17
+ end
18
+
19
+ class ContainerWithClassContainers < ClassContainer
20
+ class << self
21
+ include WebBlocks::Support::Attributes::Class::Container
22
+ end
23
+ include WebBlocks::Support::Attributes::Container
24
+ set :container_overridden, :container_overridden_value
25
+ end
26
+
27
+ def test_has_get_set
28
+ container = Container.new
29
+ assert !container.has?(:key)
30
+ container.set(:key, :value)
31
+ assert container.has?(:key)
32
+ assert container.get(:key) == :value
33
+ hash = container.set(:key2, :value2)
34
+ assert hash[:key] == :value
35
+ assert hash[:key2] == :value2
36
+ end
37
+
38
+ def test_class_attributes
39
+ container = ContainerWithClassContainers.new
40
+ class_attributes = container.class_attributes
41
+ assert class_attributes[:container] == :container_value
42
+ assert class_attributes[:container_overridden] == :container_overridden_value
43
+ end
44
+
45
+ def test_attributes_with_inheritance
46
+ container = ContainerWithClassContainers.new
47
+ assert container.get(:container) == :container_value
48
+ assert container.get(:container_overridden) == :container_overridden_value
49
+ end
50
+
51
+ def test_attributes_inheritance_with_override
52
+ container = ContainerWithClassContainers.new
53
+ container.attributes :container => :instance_override,
54
+ :container_overridden => :instance_override
55
+ assert container.get(:container) == :instance_override
56
+ assert container.get(:container_overridden) == :instance_override
57
+ end
58
+
59
+ def test_push
60
+ container = Container.new
61
+ container.set :arr, []
62
+ container.push :arr, :val1
63
+ assert container.get(:arr).length == 1
64
+ container.push :arr, :val2
65
+ arr = container.get(:arr)
66
+ assert arr.length == 2
67
+ assert arr[0] == :val1
68
+ assert arr[1] == :val2
69
+ end
70
+
71
+ end
@@ -0,0 +1,60 @@
1
+ require 'test/unit'
2
+ require 'web_blocks/support/tree/child'
3
+
4
+ class TestSupportTreeChild < Test::Unit::TestCase
5
+
6
+ class Child
7
+ include ::WebBlocks::Support::Tree::Child
8
+ end
9
+
10
+ class Parent
11
+ attr_accessor :child
12
+ # stub method that just sets @child as child rather than adds to array - just for testing purposes
13
+ # real version in WebBlocks::Support::Tree::Parent adds it to a children array
14
+ def add_child parent
15
+ @child = parent
16
+ end
17
+ end
18
+
19
+ class ChildWithName < Child
20
+ attr_reader :name
21
+ def initialize name
22
+ @name = name
23
+ end
24
+ end
25
+
26
+ def test_parent
27
+ child = Child.new
28
+ assert child.respond_to? :parent
29
+ assert child.parent == nil
30
+ end
31
+
32
+ def test_set_parent
33
+ child = Child.new
34
+ parent = Parent.new
35
+ child.set_parent parent
36
+ assert child.parent === parent
37
+ assert parent.child === child
38
+ end
39
+
40
+ def test_set_parent_no_add_child_method
41
+ child = Child.new
42
+ parent_without_add_child = Child.new
43
+ child.set_parent parent_without_add_child
44
+ assert child.parent === parent_without_add_child
45
+ end
46
+
47
+ def test_parents
48
+ child = Child.new
49
+ parent = Child.new
50
+ parent_parent = Child.new
51
+ child.set_parent parent
52
+ parent.set_parent parent_parent
53
+ assert child.parent === parent
54
+ assert parent.parent === parent_parent
55
+ parents = child.parents
56
+ assert parents[0] === parent
57
+ assert parents[1] === parent_parent
58
+ end
59
+
60
+ end
@@ -0,0 +1,18 @@
1
+ require 'test/unit'
2
+ require 'web_blocks/support/tree/node'
3
+
4
+ class TestSupportTreeNode < Test::Unit::TestCase
5
+
6
+ class Node
7
+ include ::WebBlocks::Support::Tree::Node
8
+ end
9
+
10
+ def test_name
11
+ node = Node.new('name')
12
+ assert node.name == 'name'
13
+ assert_raise NoMethodError do
14
+ node.name = 'test'
15
+ end
16
+ end
17
+
18
+ end
@@ -0,0 +1,81 @@
1
+ require 'test/unit'
2
+ require 'web_blocks/support/tree/parent'
3
+
4
+ class TestSupportTreeParent < Test::Unit::TestCase
5
+
6
+ class Parent
7
+ include ::WebBlocks::Support::Tree::Parent
8
+ end
9
+
10
+ # stub to check named node association
11
+ class NamedNode
12
+ attr_reader :name
13
+ def initialize name
14
+ @name = name
15
+ end
16
+ end
17
+
18
+ # stub to check proper call of add_parent
19
+ class Child < NamedNode
20
+ attr_reader :parent
21
+ def set_parent parent
22
+ @parent = parent
23
+ end
24
+ end
25
+
26
+ def test_children
27
+ parent = Parent.new
28
+ assert parent.children.is_a? Hash
29
+ assert parent.children.size == 0
30
+ end
31
+
32
+ def test_add_children
33
+
34
+ parent = Parent.new
35
+ child = Child.new 'name'
36
+
37
+ parent.add_child child
38
+ assert parent.children.is_a? Hash
39
+ assert parent.children.size == 1
40
+ assert parent.children.has_key? 'name'
41
+ assert parent.children['name'] === child
42
+ assert child.parent === parent
43
+ assert parent.has_child? 'name'
44
+
45
+ child2 = Child.new 'name2'
46
+
47
+ parent.add_child child2
48
+ assert parent.children.size == 2
49
+
50
+ parent.remove_child 'name2'
51
+ assert parent.children.size == 1
52
+ assert parent.children.has_key? 'name'
53
+ assert parent.has_child? 'name'
54
+ assert !parent.children.has_key?('name2')
55
+ assert !parent.has_child?('name2')
56
+
57
+ end
58
+
59
+ # Should use object as key if no #name method exists
60
+ def test_add_children_no_name
61
+ parent = Parent.new
62
+ child_without_name = Parent.new
63
+ parent.add_child child_without_name
64
+ assert parent.children.has_key?(child_without_name)
65
+ assert parent.children[child_without_name] == child_without_name
66
+ assert parent.has_child? child_without_name
67
+ parent.remove_child child_without_name
68
+ assert !parent.has_child?(child_without_name)
69
+ end
70
+
71
+ def test_add_children_no_set_parent
72
+ parent = Parent.new
73
+ named_node = NamedNode.new 'name'
74
+ assert_nothing_raised do
75
+ parent.add_child named_node
76
+ end
77
+ assert parent.children.has_key? 'name'
78
+ assert parent.children['name'] === named_node
79
+ end
80
+
81
+ end
@@ -0,0 +1,10 @@
1
+ require 'test/unit'
2
+ require 'web_blocks/framework'
3
+
4
+ class TestVersion < Test::Unit::TestCase
5
+
6
+ def test_version
7
+ assert_nothing_raised("VERSION constant initialized"){ WebBlocks::VERSION }
8
+ end
9
+
10
+ end
@@ -0,0 +1,35 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'web_blocks/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+
8
+ spec.name = 'web_blocks'
9
+ spec.version = WebBlocks::VERSION
10
+ spec.authors = ['Eric Bollens']
11
+ spec.email = ['ebollens@ucla.edu']
12
+ spec.description = 'Package, configuration and dependency manager for web assets (SCSS, JS, images, and fonts)'
13
+ spec.summary = 'package, configuration and dependency manager for web assets (SCSS, JS, images, and fonts)'
14
+ spec.homepage = 'http://github.com/WebBlocks/WebBlocks'
15
+ spec.license = 'BSD'
16
+
17
+ spec.files = `git ls-files`.split($/)
18
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
19
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
20
+ spec.require_paths = ['lib']
21
+
22
+ spec.add_dependency 'thor'
23
+ spec.add_dependency 'ruby-bower'
24
+ spec.add_dependency 'execjs'
25
+ spec.add_dependency 'extend_method'
26
+ spec.add_dependency 'compass'
27
+ spec.add_dependency 'sass-css-importer'
28
+ spec.add_dependency 'fork'
29
+ spec.add_dependency 'fssm'
30
+
31
+ spec.add_development_dependency 'bundler'
32
+ spec.add_development_dependency 'rake'
33
+ spec.add_development_dependency 'coveralls'
34
+
35
+ end