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.
Files changed (34) hide show
  1. data/Rakefile +34 -1
  2. data/VERSION.yml +3 -2
  3. data/features/command_line.feature +219 -0
  4. data/features/step_definitions/command_line_steps.rb +199 -0
  5. data/lib/compass/app_integration/rails/installer.rb +3 -1
  6. data/lib/compass/app_integration/stand_alone/installer.rb +26 -11
  7. data/lib/compass/commands.rb +1 -1
  8. data/lib/compass/commands/create_project.rb +8 -1
  9. data/lib/compass/commands/installer_command.rb +6 -2
  10. data/lib/compass/commands/project_stats.rb +160 -0
  11. data/lib/compass/commands/update_project.rb +49 -1
  12. data/lib/compass/commands/validate_project.rb +56 -2
  13. data/lib/compass/commands/watch_project.rb +3 -1
  14. data/lib/compass/commands/write_configuration.rb +60 -2
  15. data/lib/compass/compiler.rb +4 -3
  16. data/lib/compass/configuration/helpers.rb +9 -0
  17. data/lib/compass/errors.rb +4 -1
  18. data/lib/compass/exec.rb +1 -0
  19. data/lib/compass/frameworks/compass/stylesheets/compass/utilities/general/_reset.sass +2 -2
  20. data/lib/compass/installers.rb +1 -1
  21. data/lib/compass/installers/bare_installer.rb +62 -0
  22. data/lib/compass/installers/base.rb +7 -51
  23. data/lib/compass/installers/manifest_installer.rb +59 -0
  24. data/lib/compass/sass_extensions/monkey_patches.rb +2 -2
  25. data/lib/compass/sass_extensions/monkey_patches/traversal.rb +23 -0
  26. data/lib/compass/stats.rb +92 -0
  27. data/lib/compass/validator.rb +2 -3
  28. data/test/command_line_helper.rb +6 -2
  29. data/test/fixtures/stylesheets/compass/css/reset.css +1 -1
  30. data/test/io_helper.rb +18 -1
  31. data/test/rails_helper.rb +40 -0
  32. data/test/rails_integration_test.rb +2 -40
  33. data/test/test_helper.rb +1 -0
  34. metadata +12 -3
data/Rakefile CHANGED
@@ -14,6 +14,7 @@ require 'rubygems'
14
14
  require 'rake'
15
15
  $:.unshift File.join(File.dirname(__FILE__), 'lib')
16
16
  require 'compass'
17
+ require 'rcov/rcovtask'
17
18
 
18
19
  # ----- Default: Testing ------
19
20
 
@@ -39,7 +40,7 @@ begin
39
40
  require 'jeweler'
40
41
  Jeweler::Tasks.new do |gemspec|
41
42
  gemspec.rubyforge_project = "compass"
42
- gemspec.name = "compass"
43
+ gemspec.name = "compass-edge"
43
44
  gemspec.summary = "A Real Stylesheet Framework"
44
45
  gemspec.email = "chris@eppsteins.net"
45
46
  gemspec.homepage = "http://compass-style.org"
@@ -65,6 +66,7 @@ begin
65
66
  gemspec.files -= Dir.glob("test/fixtures/stylesheets/*/saved/**/*.*")
66
67
  gemspec.test_files = Dir.glob("test/**/*.*")
67
68
  gemspec.test_files -= Dir.glob("test/fixtures/stylesheets/*/saved/**/*.*")
69
+ gemspec.test_files += Dir.glob("features/**/*.*")
68
70
  end
69
71
  rescue LoadError
70
72
  puts "Jeweler not available. Install it with: sudo gem install technicalpickles-jeweler -s http://gems.github.com"
@@ -129,3 +131,34 @@ namespace :git do
129
131
  sh "git", "clean", "-fdx"
130
132
  end
131
133
  end
134
+
135
+ require 'cucumber/rake/task'
136
+
137
+ namespace :rcov do
138
+ Cucumber::Rake::Task.new(:cucumber) do |t|
139
+ t.rcov = true
140
+ t.rcov_opts = %w{--exclude osx\/objc,gems\/,spec\/,features\/ --aggregate coverage.data}
141
+ t.rcov_opts << %[-o "coverage"]
142
+ end
143
+
144
+ Rcov::RcovTask.new(:units) do |rcov|
145
+ rcov.libs << 'lib'
146
+ rcov.libs << 'haml/lib' if ENV["RUN_CODE_RUN"]
147
+ test_files = FileList['test/**/*_test.rb']
148
+ test_files.exclude('test/rails/*', 'test/haml/*')
149
+ rcov.pattern = test_files
150
+ rcov.output_dir = 'coverage'
151
+ rcov.verbose = true
152
+ rcov.rcov_opts = %w{--exclude osx\/objc,gems\/,spec\/,features\/ --aggregate coverage.data}
153
+ rcov.rcov_opts << %[-o "coverage" --sort coverage]
154
+ end
155
+
156
+
157
+ desc "Run both specs and features to generate aggregated coverage"
158
+ task :all do |t|
159
+ rm "coverage.data" if File.exist?("coverage.data")
160
+ Rake::Task["rcov:units"].invoke
161
+ Rake::Task["rcov:cucumber"].invoke
162
+ end
163
+ end
164
+
@@ -1,4 +1,5 @@
1
1
  ---
2
- :patch: 0
3
- :major: 0
4
2
  :minor: 9
3
+ :build:
4
+ :patch: 2
5
+ :major: 0
@@ -0,0 +1,219 @@
1
+ Feature: Command Line
2
+ In order to manage my stylesheets
3
+ As a user on the command line
4
+ I want to create a new project
5
+
6
+ Scenario: Install a project without a framework
7
+ When I create a project using: compass create my_project
8
+ Then a directory my_project/ is created
9
+ And a configuration file my_project/config.rb is created
10
+ And a sass file my_project/src/screen.sass is created
11
+ And a sass file my_project/src/print.sass is created
12
+ And a sass file my_project/src/ie.sass is created
13
+ And a sass file my_project/src/screen.sass is compiled
14
+ And a sass file my_project/src/print.sass is compiled
15
+ And a sass file my_project/src/ie.sass is compiled
16
+ And a css file my_project/stylesheets/screen.css is created
17
+ And a css file my_project/stylesheets/print.css is created
18
+ And a css file my_project/stylesheets/ie.css is created
19
+ And I am told how to link to /stylesheets/screen.css for media "screen, projection"
20
+ And I am told how to link to /stylesheets/print.css for media "print"
21
+ And I am told how to conditionally link "IE" to /stylesheets/ie.css for media "screen, projection"
22
+
23
+ Scenario: Install a project with blueprint
24
+ When I create a project using: compass create bp_project --using blueprint
25
+ Then a directory bp_project/ is created
26
+ And a configuration file bp_project/config.rb is created
27
+ And a sass file bp_project/src/screen.sass is created
28
+ And a sass file bp_project/src/print.sass is created
29
+ And a sass file bp_project/src/ie.sass is created
30
+ And a sass file bp_project/src/screen.sass is compiled
31
+ And a sass file bp_project/src/print.sass is compiled
32
+ And a sass file bp_project/src/ie.sass is compiled
33
+ And a css file bp_project/stylesheets/screen.css is created
34
+ And a css file bp_project/stylesheets/print.css is created
35
+ And a css file bp_project/stylesheets/ie.css is created
36
+ And an image file bp_project/images/grid.png is created
37
+ And I am told how to link to /stylesheets/screen.css for media "screen, projection"
38
+ And I am told how to link to /stylesheets/print.css for media "print"
39
+ And I am told how to conditionally link "lt IE 8" to /stylesheets/ie.css for media "screen, projection"
40
+
41
+ Scenario: Install a project with specific directories
42
+ When I create a project using: compass create custom_project --using blueprint --sass-dir sass --css-dir css --images-dir assets/imgs
43
+ Then a directory custom_project/ is created
44
+ And a directory custom_project/sass/ is created
45
+ And a directory custom_project/css/ is created
46
+ And a directory custom_project/assets/imgs/ is created
47
+ And a sass file custom_project/sass/screen.sass is created
48
+ And a css file custom_project/css/screen.css is created
49
+ And an image file custom_project/assets/imgs/grid.png is created
50
+
51
+ Scenario: Perform a dry run of creating a project
52
+ When I create a project using: compass create my_project --dry-run
53
+ Then a directory my_project/ is not created
54
+ But a configuration file my_project/config.rb is reported created
55
+ And a sass file my_project/src/screen.sass is reported created
56
+ And a sass file my_project/src/print.sass is reported created
57
+ And a sass file my_project/src/ie.sass is reported created
58
+ And I am told how to link to /stylesheets/screen.css for media "screen, projection"
59
+ And I am told how to link to /stylesheets/print.css for media "print"
60
+ And I am told how to conditionally link "IE" to /stylesheets/ie.css for media "screen, projection"
61
+
62
+ Scenario: Creating a bare project
63
+ When I create a project using: compass create bare_project --bare
64
+ Then a directory bare_project/ is created
65
+ And a configuration file bare_project/config.rb is created
66
+ And a directory bare_project/src/ is created
67
+ And a directory bare_project/stylesheets/ is not created
68
+ And I am congratulated
69
+ And I am told that I can place stylesheets in the src subdirectory
70
+ And I am told how to compile my sass stylesheets
71
+
72
+ Scenario: Creating a bare project with a framework
73
+ When I create a project using: compass create bare_project --using blueprint --bare
74
+ Then an error message is printed out: A bare project cannot be created when a framework is specified.
75
+ And the command exits with a non-zero error code
76
+
77
+ Scenario: Initializing a rails project
78
+ Given I'm in a newly created rails project: my_rails_project
79
+ When I initialize a project using: compass init rails --sass-dir app/stylesheets --css-dir public/stylesheets/compiled
80
+ Then a config file config/compass.config is reported created
81
+ Then a config file config/compass.config is created
82
+ And a ruby file config/compass.config is created
83
+ And a sass file config/initializers/compass.rb is created
84
+ And a sass file app/stylesheets/screen.sass is created
85
+ And a sass file app/stylesheets/print.sass is created
86
+ And a sass file app/stylesheets/ie.sass is created
87
+
88
+ Scenario: Compiling an existing project.
89
+ Given I am using the existing project in test/fixtures/stylesheets/compass
90
+ When I run: compass compile
91
+ Then a directory tmp/ is created
92
+ And a sass file sass/layout.sass is reported compiled
93
+ And a sass file sass/print.sass is reported compiled
94
+ And a sass file sass/reset.sass is reported compiled
95
+ And a sass file sass/utilities.sass is reported compiled
96
+ And a css file tmp/layout.css is created
97
+ And a css file tmp/print.css is created
98
+ And a css file tmp/reset.css is created
99
+ And a css file tmp/utilities.css is created
100
+
101
+ Scenario: Compiling an existing project with a specified project
102
+ Given I am using the existing project in test/fixtures/stylesheets/compass
103
+ And I am in the parent directory
104
+ When I run: compass compile tmp_compass
105
+ Then a directory tmp_compass/tmp/ is created
106
+ And a sass file tmp_compass/sass/layout.sass is reported compiled
107
+ And a sass file tmp_compass/sass/print.sass is reported compiled
108
+ And a sass file tmp_compass/sass/reset.sass is reported compiled
109
+ And a sass file tmp_compass/sass/utilities.sass is reported compiled
110
+ And a css file tmp_compass/tmp/layout.css is created
111
+ And a css file tmp_compass/tmp/print.css is created
112
+ And a css file tmp_compass/tmp/reset.css is created
113
+ And a css file tmp_compass/tmp/utilities.css is created
114
+
115
+ Scenario: Recompiling a project with no changes
116
+ Given I am using the existing project in test/fixtures/stylesheets/compass
117
+ When I run: compass compile
118
+ And I run: compass compile
119
+ Then a sass file sass/layout.sass is reported unchanged
120
+ And a sass file sass/print.sass is reported unchanged
121
+ And a sass file sass/reset.sass is reported unchanged
122
+ And a sass file sass/utilities.sass is reported unchanged
123
+
124
+ Scenario: Installing a pattern into a project
125
+ Given I am using the existing project in test/fixtures/stylesheets/compass
126
+ When I run: compass install blueprint/buttons
127
+ Then a sass file sass/buttons.sass is created
128
+ And an image file images/buttons/cross.png is created
129
+ And an image file images/buttons/key.png is created
130
+ And an image file images/buttons/tick.png is created
131
+ And a css file tmp/buttons.css is created
132
+
133
+ Scenario: Basic help
134
+ When I run: compass help
135
+ Then I should be shown a list of available commands
136
+ And the list of commands should describe the compile command
137
+ And the list of commands should describe the create command
138
+ And the list of commands should describe the grid-img command
139
+ And the list of commands should describe the help command
140
+ And the list of commands should describe the init command
141
+ And the list of commands should describe the install command
142
+ And the list of commands should describe the version command
143
+
144
+ Scenario: Recompiling a project with no material changes
145
+ Given I am using the existing project in test/fixtures/stylesheets/compass
146
+ When I run: compass compile
147
+ And I wait 1 second
148
+ And I touch sass/layout.sass
149
+ And I run: compass compile
150
+ Then a sass file sass/layout.sass is reported compiled
151
+ Then a css file tmp/layout.css is reported identical
152
+ And a sass file sass/print.sass is reported unchanged
153
+ And a sass file sass/reset.sass is reported unchanged
154
+ And a sass file sass/utilities.sass is reported unchanged
155
+
156
+ Scenario: Recompiling a project with changes
157
+ Given I am using the existing project in test/fixtures/stylesheets/compass
158
+ When I run: compass compile
159
+ And I wait 1 second
160
+ And I add some sass to sass/layout.sass
161
+ And I run: compass compile
162
+ Then a sass file sass/layout.sass is reported compiled
163
+ And a css file tmp/layout.css is reported overwritten
164
+ And a sass file sass/print.sass is reported unchanged
165
+ And a sass file sass/reset.sass is reported unchanged
166
+ And a sass file sass/utilities.sass is reported unchanged
167
+
168
+ Scenario: Watching a project for changes
169
+ Given I am using the existing project in test/fixtures/stylesheets/compass
170
+ When I run: compass compile
171
+ And I run in a separate process: compass watch
172
+ And I wait 1 second
173
+ And I touch sass/layout.sass
174
+ And I wait 2 seconds
175
+ And I shutdown the other process
176
+ Then a css file tmp/layout.css is reported identical
177
+
178
+ Scenario: Generating a grid image so that I can debug my grid alignments
179
+ Given I am using the existing project in test/fixtures/stylesheets/compass
180
+ When I run: compass grid-img 30+10x24
181
+ Then a png file images/grid.png is created
182
+
183
+ Scenario: Generating a grid image to a specified path with custom dimensions
184
+ Given I am using the existing project in test/fixtures/stylesheets/compass
185
+ When I run: compass grid-img 50+10x24 assets/wide_grid.png
186
+ Then a directory assets is created
187
+ Then a png file assets/wide_grid.png is created
188
+
189
+ Scenario: Generating a grid image with invalid dimensions
190
+ Given I am using the existing project in test/fixtures/stylesheets/compass
191
+ When I run: compass grid-img 50x24 assets/wide_grid.png
192
+ Then a directory assets is not created
193
+ And a png file assets/wide_grid.png is not created
194
+
195
+ Scenario: Generate a compass configuration file
196
+ When I run: compass config config/compass.rb --sass-dir sass --css-dir assets/css
197
+ Then a configuration file config/compass.rb is created
198
+ And the following configuration properties are set in config/compass.rb:
199
+ | property | value |
200
+ | sass_dir | sass |
201
+ | css_dir | assets/css |
202
+
203
+ Scenario: Validate the generated CSS
204
+ Given I am using the existing project in test/fixtures/stylesheets/compass
205
+ When I run: compass validate
206
+ Then my css is validated
207
+ And I am informed that my css is valid.
208
+
209
+ Scenario: Get stats for my project
210
+ Given I am using the existing project in test/fixtures/stylesheets/compass
211
+ When I run: compass stats
212
+ Then I am told statistics for each file:
213
+ | Filename | Rules | Properties | Mixins Defs | Mixins Used | CSS Rules | CSS Properties |
214
+ | sass/layout.sass | 0 | 0 | 0 | 1 | 5 | 9 |
215
+ | sass/print.sass | 0 | 0 | 0 | 2 | 61 | 61 |
216
+ | sass/reset.sass | 4 | 1 | 0 | 2 | 191 | 665 |
217
+ | sass/utilities.sass | 2 | 0 | 0 | 2 | 5 | 11 |
218
+ | Total.* | 6 | 1 | 0 | 7 | 262 | 746 |
219
+
@@ -0,0 +1,199 @@
1
+ require 'spec/expectations'
2
+ $:.unshift(File.expand_path(File.join(File.dirname(__FILE__), '../../test')))
3
+
4
+ require 'test_helper'
5
+
6
+ require 'compass/exec'
7
+
8
+ include Compass::CommandLineHelper
9
+ include Compass::IoHelper
10
+ include Compass::RailsHelper
11
+
12
+ Before do
13
+ Compass.reset_configuration!
14
+ @cleanup_directories = []
15
+ @original_working_directory = Dir.pwd
16
+ end
17
+
18
+ After do
19
+ Dir.chdir @original_working_directory
20
+ @cleanup_directories.each do |dir|
21
+ FileUtils.rm_rf dir
22
+ end
23
+ end
24
+
25
+ # Given Preconditions
26
+ Given %r{^I am using the existing project in ([^\s]+)$} do |project|
27
+ tmp_project = "tmp_#{File.basename(project)}"
28
+ @cleanup_directories << tmp_project
29
+ FileUtils.cp_r project, tmp_project
30
+ Dir.chdir tmp_project
31
+ end
32
+
33
+ Given %r{^I am in the parent directory$} do
34
+ Dir.chdir ".."
35
+ end
36
+
37
+ Given /^I'm in a newly created rails project: (.+)$/ do |project_name|
38
+ @cleanup_directories << project_name
39
+ begin
40
+ generate_rails_app project_name
41
+ Dir.chdir project_name
42
+ rescue LoadError
43
+ pending "Missing Ruby-on-rails gems: sudo gem install rails"
44
+ end
45
+ end
46
+
47
+ # When Actions are performed
48
+ When /^I create a project using: compass create ([^\s]+) ?(.+)?$/ do |dir, args|
49
+ @cleanup_directories << dir
50
+ compass 'create', dir, *(args || '').split
51
+ end
52
+
53
+ When /^I initialize a project using: compass init ?(.+)?$/ do |args|
54
+ compass 'init', *(args || '').split
55
+ end
56
+
57
+ When /^I run: compass ([^\s]+) ?(.+)?$/ do |command, args|
58
+ compass command, *(args || '').split
59
+ end
60
+
61
+ When /^I run in a separate process: compass ([^\s]+) ?(.+)?$/ do |command, args|
62
+ unless @other_process = fork
63
+ @last_result = ''
64
+ @last_error = ''
65
+ Signal.trap("HUP") do
66
+ open('/tmp/last_result.compass_test.txt', 'w') do |file|
67
+ file.puts $stdout.string
68
+ end
69
+ open('/tmp/last_error.compass_test.txt', 'w') do |file|
70
+ file.puts @stderr.string
71
+ end
72
+ exit!
73
+ end
74
+ # this command will run forever
75
+ # we kill it with a HUP signal from the parent process.
76
+ args = (args || '').split
77
+ args << { :wait => 5 }
78
+ compass command, *args
79
+ exit!
80
+ end
81
+ end
82
+
83
+ When /^I shutdown the other process$/ do
84
+ Process.kill("HUP", @other_process)
85
+ Process.wait
86
+ @last_result = File.read('/tmp/last_result.compass_test.txt')
87
+ @last_error = File.read('/tmp/last_error.compass_test.txt')
88
+ end
89
+
90
+ When /^I touch ([^\s]+)$/ do |filename|
91
+ FileUtils.touch filename
92
+ end
93
+
94
+ When /^I wait ([\d.]+) seconds?$/ do |count|
95
+ sleep count.to_f
96
+ end
97
+
98
+ When /^I add some sass to ([^\s]+)$/ do |filename|
99
+ open(filename, "w+") do |file|
100
+ file.puts ".added .some .arbitrary"
101
+ file.puts " sass: code"
102
+ end
103
+ end
104
+
105
+ # Then postconditions
106
+ Then /^a directory ([^ ]+) is (not )?created$/ do |directory, negated|
107
+ File.directory?(directory).should == !negated
108
+ end
109
+
110
+ Then /an? \w+ file ([^ ]+) is (not )?created/ do |filename, negated|
111
+ File.exists?(filename).should == !negated
112
+ end
113
+
114
+ Then /an? \w+ file ([^ ]+) is reported created/ do |filename|
115
+ @last_result.should =~ /create #{Regexp.escape(filename)}/
116
+ end
117
+
118
+ Then /a \w+ file ([^ ]+) is (?:reported )?compiled/ do |filename|
119
+ @last_result.should =~ /compile #{Regexp.escape(filename)}/
120
+ end
121
+
122
+ Then /a \w+ file ([^ ]+) is reported unchanged/ do |filename|
123
+ @last_result.should =~ /unchanged #{Regexp.escape(filename)}/
124
+ end
125
+
126
+ Then /a \w+ file ([^ ]+) is reported identical/ do |filename|
127
+ @last_result.should =~ /identical #{Regexp.escape(filename)}/
128
+ end
129
+
130
+ Then /a \w+ file ([^ ]+) is reported overwritten/ do |filename|
131
+ @last_result.should =~ /overwrite #{Regexp.escape(filename)}/
132
+ end
133
+
134
+ Then /I am told how to link to ([^ ]+) for media "([^"]+)"/ do |stylesheet, media|
135
+ @last_result.should =~ %r{<link href="#{stylesheet}" media="#{media}" rel="stylesheet" type="text/css" />}
136
+ end
137
+
138
+ Then /I am told how to conditionally link "([^"]+)" to ([^ ]+) for media "([^"]+)"/ do |condition, stylesheet, media|
139
+ @last_result.should =~ %r{<!--\[if #{condition}\]>\s+<link href="#{stylesheet}" media="#{media}" rel="stylesheet" type="text/css" />\s+<!\[endif\]-->}mi
140
+ end
141
+
142
+ Then /^an error message is printed out: (.+)$/ do |error_message|
143
+ @last_error.should =~ Regexp.new(Regexp.escape(error_message))
144
+ end
145
+
146
+ Then /^the command exits with a non\-zero error code$/ do
147
+ @last_exit_code.should_not == 0
148
+ end
149
+
150
+
151
+ Then /^I am congratulated$/ do
152
+ @last_result.should =~ /Congratulations!/
153
+ end
154
+
155
+ Then /^I am told that I can place stylesheets in the ([^\s]+) subdirectory$/ do |subdir|
156
+ @last_result.should =~ /You may now add sass stylesheets to the #{subdir} subdirectory of your project./
157
+ end
158
+
159
+ Then /^I am told how to compile my sass stylesheets$/ do
160
+ @last_result.should =~ /You must compile your sass stylesheets into CSS when they change.\nThis can be done in one of the following ways:/
161
+ end
162
+
163
+ Then /^I should be shown a list of available commands$/ do
164
+ @last_result.should =~ /^Available commands:$/
165
+ end
166
+
167
+ Then /^the list of commands should describe the ([^ ]+) command$/ do |command|
168
+ @last_result.should =~ /^\s+\* #{command}\s+- [A-Z].+$/
169
+ end
170
+
171
+ Then /^the following configuration properties are set in ([^ ]+):$/ do |config_file, table|
172
+
173
+ config = Compass::Configuration::Data.new_from_file(config_file)
174
+ table.hashes.each do |hash|
175
+ config.send(hash['property']).should == hash['value']
176
+ end
177
+ end
178
+
179
+ Then /^my css is validated$/ do
180
+ if @last_error =~ /The Compass CSS Validator could not be loaded/
181
+ pending "Missing Dependency: sudo gem install chriseppstein-compass-validator"
182
+ else
183
+ @last_result.should =~ /Compass CSS Validator/
184
+ end
185
+ end
186
+
187
+ Then /^I am informed that my css is valid.$/ do
188
+ @last_result.should =~ /Your CSS files are valid\./
189
+ end
190
+
191
+ Then /^I am told statistics for each file:$/ do |table|
192
+ # table is a Cucumber::Ast::Table
193
+ table.raw.each do |row|
194
+ re = Regexp.new row.join(' *\| *')
195
+ @last_result.should =~ re
196
+ end
197
+ end
198
+
199
+