compass-edge 0.9.1 → 0.9.2
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.
- data/Rakefile +34 -1
- data/VERSION.yml +3 -2
- data/features/command_line.feature +219 -0
- data/features/step_definitions/command_line_steps.rb +199 -0
- data/lib/compass/app_integration/rails/installer.rb +3 -1
- data/lib/compass/app_integration/stand_alone/installer.rb +26 -11
- data/lib/compass/commands.rb +1 -1
- data/lib/compass/commands/create_project.rb +8 -1
- data/lib/compass/commands/installer_command.rb +6 -2
- data/lib/compass/commands/project_stats.rb +160 -0
- data/lib/compass/commands/update_project.rb +49 -1
- data/lib/compass/commands/validate_project.rb +56 -2
- data/lib/compass/commands/watch_project.rb +3 -1
- data/lib/compass/commands/write_configuration.rb +60 -2
- data/lib/compass/compiler.rb +4 -3
- data/lib/compass/configuration/helpers.rb +9 -0
- data/lib/compass/errors.rb +4 -1
- data/lib/compass/exec.rb +1 -0
- data/lib/compass/frameworks/compass/stylesheets/compass/utilities/general/_reset.sass +2 -2
- data/lib/compass/installers.rb +1 -1
- data/lib/compass/installers/bare_installer.rb +62 -0
- data/lib/compass/installers/base.rb +7 -51
- data/lib/compass/installers/manifest_installer.rb +59 -0
- data/lib/compass/sass_extensions/monkey_patches.rb +2 -2
- data/lib/compass/sass_extensions/monkey_patches/traversal.rb +23 -0
- data/lib/compass/stats.rb +92 -0
- data/lib/compass/validator.rb +2 -3
- data/test/command_line_helper.rb +6 -2
- data/test/fixtures/stylesheets/compass/css/reset.css +1 -1
- data/test/io_helper.rb +18 -1
- data/test/rails_helper.rb +40 -0
- data/test/rails_integration_test.rb +2 -40
- data/test/test_helper.rb +1 -0
- metadata +12 -3
data/lib/compass/compiler.rb
CHANGED
@@ -13,8 +13,9 @@ module Compass
|
|
13
13
|
self.options[:cache_location] ||= File.join(from, ".sass-cache")
|
14
14
|
end
|
15
15
|
|
16
|
-
def sass_files
|
17
|
-
|
16
|
+
def sass_files(options = {})
|
17
|
+
exclude_partials = options.fetch(:exclude_partials, true)
|
18
|
+
@sass_files || Dir.glob(separate("#{from}/**/#{'[^_]' if exclude_partials}*.sass"))
|
18
19
|
end
|
19
20
|
|
20
21
|
def stylesheet_name(sass_file)
|
@@ -51,4 +52,4 @@ module Compass
|
|
51
52
|
end
|
52
53
|
end
|
53
54
|
end
|
54
|
-
end
|
55
|
+
end
|
@@ -66,6 +66,15 @@ module Compass
|
|
66
66
|
File.join(project_path, *path.split('/'))
|
67
67
|
end
|
68
68
|
|
69
|
+
def deprojectize(path, project_path = nil)
|
70
|
+
project_path ||= configuration.project_path
|
71
|
+
if path[0..(project_path.size - 1)] == project_path
|
72
|
+
path[(project_path.size + 1)..-1]
|
73
|
+
else
|
74
|
+
path
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
69
78
|
# TODO: Deprecate the src/config.rb location.
|
70
79
|
KNOWN_CONFIG_LOCATIONS = [".compass/config.rb", "config/compass.config", "config.rb", "src/config.rb"]
|
71
80
|
|
data/lib/compass/errors.rb
CHANGED
data/lib/compass/exec.rb
CHANGED
data/lib/compass/installers.rb
CHANGED
@@ -0,0 +1,62 @@
|
|
1
|
+
module Compass
|
2
|
+
module Installers
|
3
|
+
|
4
|
+
class BareInstaller < Base
|
5
|
+
def default_configuration
|
6
|
+
Compass::Configuration::Data.new.extend(Compass::AppIntegration::StandAlone::ConfigurationDefaults)
|
7
|
+
end
|
8
|
+
|
9
|
+
def completed_configuration
|
10
|
+
nil
|
11
|
+
end
|
12
|
+
|
13
|
+
def init
|
14
|
+
directory targetize("")
|
15
|
+
directory targetize(Compass.configuration.sass_dir)
|
16
|
+
end
|
17
|
+
|
18
|
+
def prepare
|
19
|
+
end
|
20
|
+
|
21
|
+
def install
|
22
|
+
config_file ||= targetize('config.rb')
|
23
|
+
write_file config_file, config_contents
|
24
|
+
end
|
25
|
+
|
26
|
+
def config_contents
|
27
|
+
project_path, Compass.configuration.project_path = Compass.configuration.project_path, nil
|
28
|
+
Compass.configuration.serialize
|
29
|
+
ensure
|
30
|
+
Compass.configuration.project_path = project_path
|
31
|
+
end
|
32
|
+
|
33
|
+
def finalize(options = {})
|
34
|
+
puts <<-NEXTSTEPS
|
35
|
+
|
36
|
+
*********************************************************************
|
37
|
+
Congratulations! Your compass project has been created.
|
38
|
+
|
39
|
+
You may now add sass stylesheets to the #{Compass.configuration.sass_dir} subdirectory of your project.
|
40
|
+
|
41
|
+
Sass files beginning with an underscore are called partials and won't be
|
42
|
+
compiled to CSS, but they can be imported into other sass stylesheets.
|
43
|
+
|
44
|
+
You can configure your project by editing the config.rb configuration file.
|
45
|
+
|
46
|
+
You must compile your sass stylesheets into CSS when they change.
|
47
|
+
This can be done in one of the following ways:
|
48
|
+
1. To compile on demand:
|
49
|
+
compass compile [path/to/project]
|
50
|
+
2. To monitor your project for changes and automatically recompile:
|
51
|
+
compass watch [path/to/project]
|
52
|
+
|
53
|
+
More Resources:
|
54
|
+
* Wiki: http://wiki.github.com/chriseppstein/compass
|
55
|
+
* Sass: http://sass-lang.com
|
56
|
+
* Community: http://groups.google.com/group/compass-users/
|
57
|
+
NEXTSTEPS
|
58
|
+
end
|
59
|
+
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
@@ -7,21 +7,15 @@ module Compass
|
|
7
7
|
|
8
8
|
attr_accessor :template_path, :target_path, :working_path
|
9
9
|
attr_accessor :options
|
10
|
-
attr_accessor :manifest
|
11
10
|
|
12
11
|
def initialize(template_path, target_path, options = {})
|
13
12
|
@template_path = template_path
|
14
13
|
@target_path = target_path
|
15
14
|
@working_path = Dir.getwd
|
16
15
|
@options = options
|
17
|
-
@manifest = Manifest.new(manifest_file, options) if template_path
|
18
16
|
self.logger = options[:logger]
|
19
17
|
end
|
20
18
|
|
21
|
-
def manifest_file
|
22
|
-
@manifest_file ||= File.join(template_path, "manifest.rb")
|
23
|
-
end
|
24
|
-
|
25
19
|
[:css_dir, :sass_dir, :images_dir, :javascripts_dir, :http_stylesheets_path].each do |dir|
|
26
20
|
define_method dir do
|
27
21
|
Compass.configuration.send(dir)
|
@@ -31,23 +25,6 @@ module Compass
|
|
31
25
|
end
|
32
26
|
end
|
33
27
|
|
34
|
-
# Initializes the project to work with compass
|
35
|
-
def init
|
36
|
-
dirs = manifest.map do |entry|
|
37
|
-
loc = send("install_location_for_#{entry.type}", entry.to, entry.options)
|
38
|
-
File.dirname(loc)
|
39
|
-
end
|
40
|
-
|
41
|
-
if manifest.has_stylesheet?
|
42
|
-
dirs << sass_dir
|
43
|
-
dirs << css_dir
|
44
|
-
end
|
45
|
-
|
46
|
-
dirs.uniq.sort.each do |dir|
|
47
|
-
directory targetize(dir)
|
48
|
-
end
|
49
|
-
end
|
50
|
-
|
51
28
|
# Runs the installer.
|
52
29
|
# Every installer must conform to the installation strategy of prepare, install, and then finalize.
|
53
30
|
# A default implementation is provided for each step.
|
@@ -62,25 +39,14 @@ module Compass
|
|
62
39
|
def prepare
|
63
40
|
end
|
64
41
|
|
65
|
-
|
66
|
-
value = options[opt]
|
67
|
-
value ||= begin
|
68
|
-
default_method = "default_#{opt}".to_sym
|
69
|
-
send(default_method) if respond_to?(default_method)
|
70
|
-
end
|
71
|
-
send("#{opt}=", value)
|
72
|
-
end
|
73
|
-
|
74
|
-
# The default install method. Calls install_<type> methods in the order specified by the manifest.
|
42
|
+
# The install method override this to install
|
75
43
|
def install
|
76
|
-
|
77
|
-
send("install_#{entry.type}", entry.from, entry.to, entry.options)
|
78
|
-
end
|
44
|
+
raise "Not Yet Implemented"
|
79
45
|
end
|
80
46
|
|
81
47
|
# The default finalize method -- it is a no-op.
|
82
48
|
# This could print out a message or something.
|
83
|
-
def finalize
|
49
|
+
def finalize(options = {})
|
84
50
|
end
|
85
51
|
|
86
52
|
def compilation_required?
|
@@ -165,22 +131,12 @@ module Compass
|
|
165
131
|
strip_trailing_separator File.join(template_path, separate(path))
|
166
132
|
end
|
167
133
|
|
134
|
+
# Emits an HTML fragment that can be used to link to the compiled css files
|
168
135
|
def stylesheet_links
|
169
|
-
|
170
|
-
manifest.each_stylesheet do |stylesheet|
|
171
|
-
# Skip partials.
|
172
|
-
next if File.basename(stylesheet.from)[0..0] == "_"
|
173
|
-
media = if stylesheet.options[:media]
|
174
|
-
%Q{ media="#{stylesheet.options[:media]}"}
|
175
|
-
end
|
176
|
-
ss_line = %Q{ <link href="#{http_stylesheets_path}/#{stylesheet.to.sub(/\.sass$/,'.css')}"#{media} rel="stylesheet" type="text/css" />}
|
177
|
-
if stylesheet.options[:condition]
|
178
|
-
ss_line = " <!--[if #{stylesheet.options[:condition]}]>\n #{ss_line}\n <![endif]-->"
|
179
|
-
end
|
180
|
-
html << ss_line + "\n"
|
181
|
-
end
|
182
|
-
html << "</head>"
|
136
|
+
""
|
183
137
|
end
|
184
138
|
end
|
185
139
|
end
|
186
140
|
end
|
141
|
+
require 'compass/installers/bare_installer'
|
142
|
+
require 'compass/installers/manifest_installer'
|
@@ -0,0 +1,59 @@
|
|
1
|
+
module Compass
|
2
|
+
module Installers
|
3
|
+
|
4
|
+
class ManifestInstaller < Base
|
5
|
+
|
6
|
+
attr_accessor :manifest
|
7
|
+
|
8
|
+
def initialize(template_path, target_path, options = {})
|
9
|
+
super
|
10
|
+
@manifest = Manifest.new(manifest_file, options) if template_path
|
11
|
+
end
|
12
|
+
|
13
|
+
def manifest_file
|
14
|
+
@manifest_file ||= File.join(template_path, "manifest.rb")
|
15
|
+
end
|
16
|
+
|
17
|
+
# Initializes the project to work with compass
|
18
|
+
def init
|
19
|
+
dirs = manifest.map do |entry|
|
20
|
+
loc = send("install_location_for_#{entry.type}", entry.to, entry.options)
|
21
|
+
File.dirname(loc)
|
22
|
+
end
|
23
|
+
|
24
|
+
if manifest.has_stylesheet?
|
25
|
+
dirs << sass_dir
|
26
|
+
dirs << css_dir
|
27
|
+
end
|
28
|
+
|
29
|
+
dirs.uniq.sort.each do |dir|
|
30
|
+
directory targetize(dir)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
# The default install method. Calls install_<type> methods in the order specified by the manifest.
|
35
|
+
def install
|
36
|
+
manifest.each do |entry|
|
37
|
+
send("install_#{entry.type}", entry.from, entry.to, entry.options)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def stylesheet_links
|
42
|
+
html = "<head>\n"
|
43
|
+
manifest.each_stylesheet do |stylesheet|
|
44
|
+
# Skip partials.
|
45
|
+
next if File.basename(stylesheet.from)[0..0] == "_"
|
46
|
+
media = if stylesheet.options[:media]
|
47
|
+
%Q{ media="#{stylesheet.options[:media]}"}
|
48
|
+
end
|
49
|
+
ss_line = %Q{ <link href="#{http_stylesheets_path}/#{stylesheet.to.sub(/\.sass$/,'.css')}"#{media} rel="stylesheet" type="text/css" />}
|
50
|
+
if stylesheet.options[:condition]
|
51
|
+
ss_line = " <!--[if #{stylesheet.options[:condition]}]>\n #{ss_line}\n <![endif]-->"
|
52
|
+
end
|
53
|
+
html << ss_line + "\n"
|
54
|
+
end
|
55
|
+
html << "</head>"
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
@@ -1,3 +1,3 @@
|
|
1
|
-
%w(stylesheet_updating).each do |patch|
|
1
|
+
%w(stylesheet_updating traversal).each do |patch|
|
2
2
|
require "compass/sass_extensions/monkey_patches/#{patch}"
|
3
|
-
end
|
3
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module Sass
|
2
|
+
module Tree
|
3
|
+
class Node
|
4
|
+
unless method_defined?(:visit_depth_first)
|
5
|
+
def visit_depth_first(visitor)
|
6
|
+
visitor.visit(self)
|
7
|
+
visitor.down(self) if children.any? and visitor.respond_to?(:down)
|
8
|
+
if is_a?(ImportNode) && visitor.import?(self)
|
9
|
+
root = Sass::Files.tree_for(import, @options)
|
10
|
+
imported_children = root.children
|
11
|
+
end
|
12
|
+
|
13
|
+
(imported_children || children).each do |child|
|
14
|
+
break if visitor.respond_to?(:stop?) && visitor.stop?
|
15
|
+
child.visit_depth_first(visitor)
|
16
|
+
end
|
17
|
+
visitor.up(self) if children.any?
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
@@ -0,0 +1,92 @@
|
|
1
|
+
module Compass
|
2
|
+
module Stats
|
3
|
+
class StatsVisitor
|
4
|
+
attr_accessor :rule_count, :prop_count, :mixin_def_count, :mixin_count
|
5
|
+
def initialize
|
6
|
+
self.rule_count = 0
|
7
|
+
self.prop_count = 0
|
8
|
+
self.mixin_def_count = 0
|
9
|
+
self.mixin_count = 0
|
10
|
+
end
|
11
|
+
def visit(node)
|
12
|
+
self.prop_count += 1 if node.is_a?(Sass::Tree::PropNode) && !node.children.any?
|
13
|
+
if node.is_a?(Sass::Tree::RuleNode)
|
14
|
+
self.rule_count += node.rules.map{|r| r.split(/,/)}.flatten.compact.size
|
15
|
+
end
|
16
|
+
self.mixin_def_count += 1 if node.is_a?(Sass::Tree::MixinDefNode)
|
17
|
+
self.mixin_count += 1 if node.is_a?(Sass::Tree::MixinNode)
|
18
|
+
end
|
19
|
+
def up(node)
|
20
|
+
end
|
21
|
+
def down(node)
|
22
|
+
end
|
23
|
+
def import?(node)
|
24
|
+
return false
|
25
|
+
full_filename = node.send(:import)
|
26
|
+
full_filename != Compass.deprojectize(full_filename)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
class CssFile
|
30
|
+
attr_accessor :path, :css
|
31
|
+
attr_accessor :selector_count, :prop_count
|
32
|
+
def initialize(path)
|
33
|
+
require 'css_parser'
|
34
|
+
self.path = path
|
35
|
+
self.css = CssParser::Parser.new
|
36
|
+
self.css.add_block!(contents)
|
37
|
+
self.selector_count = 0
|
38
|
+
self.prop_count = 0
|
39
|
+
end
|
40
|
+
def contents
|
41
|
+
@contents ||= File.read(path)
|
42
|
+
end
|
43
|
+
def lines
|
44
|
+
contents.inject(0){|m,c| m + 1 }
|
45
|
+
end
|
46
|
+
def analyze!
|
47
|
+
css.each_selector do |selector, declarations, specificity|
|
48
|
+
sels = selector.split(/,/).size
|
49
|
+
props = declarations.split(/;/).size
|
50
|
+
self.selector_count += sels
|
51
|
+
self.prop_count += props
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
class SassFile
|
56
|
+
attr_accessor :path
|
57
|
+
attr_reader :visitor
|
58
|
+
def initialize(path)
|
59
|
+
self.path = path
|
60
|
+
end
|
61
|
+
def contents
|
62
|
+
@contents ||= File.read(path)
|
63
|
+
end
|
64
|
+
def tree
|
65
|
+
@tree = Sass::Engine.new(contents, Compass.configuration.to_sass_engine_options).to_tree
|
66
|
+
end
|
67
|
+
def visit_tree!
|
68
|
+
@visitor = StatsVisitor.new
|
69
|
+
tree.visit_depth_first(@visitor)
|
70
|
+
@visitor
|
71
|
+
end
|
72
|
+
def analyze!
|
73
|
+
visit_tree!
|
74
|
+
end
|
75
|
+
def lines
|
76
|
+
contents.inject(0){|m,c| m + 1 }
|
77
|
+
end
|
78
|
+
def rule_count
|
79
|
+
visitor.rule_count
|
80
|
+
end
|
81
|
+
def prop_count
|
82
|
+
visitor.prop_count
|
83
|
+
end
|
84
|
+
def mixin_def_count
|
85
|
+
visitor.mixin_def_count
|
86
|
+
end
|
87
|
+
def mixin_count
|
88
|
+
visitor.mixin_count
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
data/lib/compass/validator.rb
CHANGED
@@ -2,9 +2,8 @@ begin
|
|
2
2
|
require 'rubygems'
|
3
3
|
require 'compass-validator'
|
4
4
|
rescue LoadError
|
5
|
-
|
5
|
+
raise Compass::MissingDependency, %Q{The Compass CSS Validator could not be loaded. Please install it:
|
6
6
|
|
7
7
|
sudo gem install chriseppstein-compass-validator --source http://gems.github.com/
|
8
8
|
}
|
9
|
-
|
10
|
-
end
|
9
|
+
end
|
data/test/command_line_helper.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'timeout'
|
2
|
+
|
1
3
|
module Compass::CommandLineHelper
|
2
4
|
def compass(*arguments)
|
3
5
|
options = arguments.last.is_a?(Hash) ? arguments.pop : {}
|
@@ -35,8 +37,10 @@ module Compass::CommandLineHelper
|
|
35
37
|
end
|
36
38
|
end
|
37
39
|
else
|
38
|
-
@
|
39
|
-
|
40
|
+
@last_error = capture_warning do
|
41
|
+
@last_result = capture_output do
|
42
|
+
@last_exit_code = execute *arguments
|
43
|
+
end
|
40
44
|
end
|
41
45
|
end
|
42
46
|
rescue Timeout::Error
|