diff --git a/.document b/.document
old mode 100644
new mode 100755
diff --git a/.gitignore b/.gitignore
old mode 100644
new mode 100755
index db30aef9..33eed9a3
--- a/.gitignore
+++ b/.gitignore
@@ -3,4 +3,26 @@
coverage
rdoc
pkg
-.sass-cache
\ No newline at end of file
+.sass-cache
+bin/autospec
+bin/compass
+bin/css2sass
+bin/cucumber
+bin/edit_json.rb
+bin/haml
+bin/html2haml
+bin/htmldiff
+bin/launchy
+bin/ldiff
+bin/prettify_json.rb
+bin/rackup
+bin/rake
+bin/ri
+bin/sass
+bin/sdoc
+bin/sdoc-merge
+bin/shotgun
+bin/spec
+bin/sprocketize
+bin/thin
+bin/tt
diff --git a/Gemfile b/Gemfile
new file mode 100755
index 00000000..c3b8af8e
--- /dev/null
+++ b/Gemfile
@@ -0,0 +1,17 @@
+source "http://gemcutter.org"
+disable_rubygems
+
+gem "thin"
+gem "shotgun"
+gem "templater"
+gem "sprockets"
+gem "sinatra"
+gem "sinatra-content-for"
+gem "rack-test"
+gem "yui-compressor"
+gem "haml"
+gem "compass"
+
+gem "rspec"
+gem "sdoc"
+gem "cucumber"
\ No newline at end of file
diff --git a/LICENSE b/LICENSE
old mode 100644
new mode 100755
diff --git a/README.rdoc b/README.rdoc
old mode 100644
new mode 100755
diff --git a/Rakefile b/Rakefile
old mode 100644
new mode 100755
index be52b2a1..6d51c2ec
--- a/Rakefile
+++ b/Rakefile
@@ -1,4 +1,5 @@
require 'rubygems'
+#require 'lib/middleman'
require 'rake'
require 'cucumber/rake/task'
@@ -25,6 +26,9 @@ begin
gem.add_development_dependency("rspec")
gem.add_development_dependency("sdoc")
gem.add_development_dependency("cucumber")
+
+ # Ignore vendored files
+ #gem.files = gem.files.exclude("vendor/*")
end
Jeweler::GemcutterTasks.new
diff --git a/VERSION b/VERSION
old mode 100644
new mode 100755
diff --git a/bin/mm-init b/bin/mm-init
index 99005033..37a1dfd7 100755
--- a/bin/mm-init
+++ b/bin/mm-init
@@ -1,4 +1,5 @@
#!/usr/bin/env ruby
+require 'rubygems'
require 'templater'
module Generators
diff --git a/deps.rip b/deps.rip
old mode 100644
new mode 100755
diff --git a/lib/middleman.rb b/lib/middleman.rb
old mode 100644
new mode 100755
index 158577dd..020d9a3c
--- a/lib/middleman.rb
+++ b/lib/middleman.rb
@@ -1,4 +1,6 @@
libdir = File.dirname(__FILE__)
$LOAD_PATH.unshift(libdir) unless $LOAD_PATH.include?(libdir)
+# Bundler
+#require File.join(File.dirname(libdir), "vendor", "gems", "environment") if ENV["RUN_CODE_RUN"]
require 'middleman/base'
\ No newline at end of file
diff --git a/lib/middleman/base.rb b/lib/middleman/base.rb
old mode 100644
new mode 100755
diff --git a/lib/middleman/builder.rb b/lib/middleman/builder.rb
old mode 100644
new mode 100755
diff --git a/lib/middleman/config.ru b/lib/middleman/config.ru
old mode 100644
new mode 100755
diff --git a/lib/middleman/fastimage.rb b/lib/middleman/fastimage.rb
old mode 100644
new mode 100755
diff --git a/lib/middleman/features/automatic_image_sizes.rb b/lib/middleman/features/automatic_image_sizes.rb
old mode 100644
new mode 100755
diff --git a/lib/middleman/features/cache_buster.rb b/lib/middleman/features/cache_buster.rb
old mode 100644
new mode 100755
diff --git a/lib/middleman/features/growl.rb b/lib/middleman/features/growl.rb
old mode 100644
new mode 100755
diff --git a/lib/middleman/features/maruku.rb b/lib/middleman/features/maruku.rb
old mode 100644
new mode 100755
diff --git a/lib/middleman/features/minify_css.rb b/lib/middleman/features/minify_css.rb
old mode 100644
new mode 100755
diff --git a/lib/middleman/features/minify_javascript.rb b/lib/middleman/features/minify_javascript.rb
old mode 100644
new mode 100755
diff --git a/lib/middleman/features/relative_assets.rb b/lib/middleman/features/relative_assets.rb
old mode 100644
new mode 100755
diff --git a/lib/middleman/features/slickmap.rb b/lib/middleman/features/slickmap.rb
old mode 100644
new mode 100755
diff --git a/lib/middleman/features/smush_pngs.rb b/lib/middleman/features/smush_pngs.rb
old mode 100644
new mode 100755
diff --git a/lib/middleman/features/sprockets.rb b/lib/middleman/features/sprockets.rb
old mode 100644
new mode 100755
diff --git a/lib/middleman/haml.rb b/lib/middleman/haml.rb
old mode 100644
new mode 100755
diff --git a/lib/middleman/helpers.rb b/lib/middleman/helpers.rb
old mode 100644
new mode 100755
diff --git a/lib/middleman/rack/sprockets+ruby19.rb b/lib/middleman/rack/sprockets+ruby19.rb
old mode 100644
new mode 100755
diff --git a/lib/middleman/rack/sprockets.rb b/lib/middleman/rack/sprockets.rb
old mode 100644
new mode 100755
diff --git a/lib/middleman/rack/static.rb b/lib/middleman/rack/static.rb
old mode 100644
new mode 100755
diff --git a/lib/middleman/sass.rb b/lib/middleman/sass.rb
old mode 100644
new mode 100755
diff --git a/lib/middleman/template/init.rbt b/lib/middleman/template/init.rbt
old mode 100644
new mode 100755
diff --git a/lib/middleman/template/views/index.html.haml b/lib/middleman/template/views/index.html.haml
old mode 100644
new mode 100755
diff --git a/lib/middleman/template/views/layout.haml b/lib/middleman/template/views/layout.haml
old mode 100644
new mode 100755
diff --git a/lib/middleman/template/views/stylesheets/site.css.sass b/lib/middleman/template/views/stylesheets/site.css.sass
old mode 100644
new mode 100755
diff --git a/lib/middleman/templater+dynamic_renderer.rb b/lib/middleman/templater+dynamic_renderer.rb
old mode 100644
new mode 100755
diff --git a/middleman.gemspec b/middleman.gemspec
old mode 100644
new mode 100755
diff --git a/spec/auto_image_sizes.rb b/spec/auto_image_sizes.rb
old mode 100644
new mode 100755
index b065a84b..a691fbf2
--- a/spec/auto_image_sizes.rb
+++ b/spec/auto_image_sizes.rb
@@ -1,4 +1,3 @@
-require 'rack/test'
require File.join(File.dirname(__FILE__), "spec_helper")
base = ::Middleman::Base
diff --git a/spec/builder_spec.rb b/spec/builder_spec.rb
old mode 100644
new mode 100755
diff --git a/spec/cache_buster_spec.rb b/spec/cache_buster_spec.rb
old mode 100644
new mode 100755
index 9e89b781..c44fe6bc
--- a/spec/cache_buster_spec.rb
+++ b/spec/cache_buster_spec.rb
@@ -1,4 +1,3 @@
-require 'rack/test'
require File.join(File.dirname(__FILE__), "spec_helper")
base = ::Middleman::Base
diff --git a/spec/fixtures/sample/init.rb b/spec/fixtures/sample/init.rb
old mode 100644
new mode 100755
diff --git a/spec/fixtures/sample/public/images/blank.gif b/spec/fixtures/sample/public/images/blank.gif
old mode 100644
new mode 100755
diff --git a/spec/fixtures/sample/public/javascripts/to-be-included.js b/spec/fixtures/sample/public/javascripts/to-be-included.js
old mode 100644
new mode 100755
diff --git a/spec/fixtures/sample/public/static.html b/spec/fixtures/sample/public/static.html
old mode 100644
new mode 100755
diff --git a/spec/fixtures/sample/public/stylesheets/auto-css.css b/spec/fixtures/sample/public/stylesheets/auto-css.css
old mode 100644
new mode 100755
diff --git a/spec/fixtures/sample/public/stylesheets/static.css b/spec/fixtures/sample/public/stylesheets/static.css
old mode 100644
new mode 100755
diff --git a/spec/fixtures/sample/public/stylesheets/sub1/auto-css.css b/spec/fixtures/sample/public/stylesheets/sub1/auto-css.css
old mode 100644
new mode 100755
diff --git a/spec/fixtures/sample/public/stylesheets/sub1/sub2/auto-css.css b/spec/fixtures/sample/public/stylesheets/sub1/sub2/auto-css.css
old mode 100644
new mode 100755
diff --git a/spec/fixtures/sample/views/_partial.haml b/spec/fixtures/sample/views/_partial.haml
old mode 100644
new mode 100755
diff --git a/spec/fixtures/sample/views/auto-css.html.haml b/spec/fixtures/sample/views/auto-css.html.haml
old mode 100644
new mode 100755
diff --git a/spec/fixtures/sample/views/auto-image-sizes.html.haml b/spec/fixtures/sample/views/auto-image-sizes.html.haml
old mode 100644
new mode 100755
diff --git a/spec/fixtures/sample/views/index.html.haml b/spec/fixtures/sample/views/index.html.haml
old mode 100644
new mode 100755
diff --git a/spec/fixtures/sample/views/inline-js.html.haml b/spec/fixtures/sample/views/inline-js.html.haml
old mode 100644
new mode 100755
diff --git a/spec/fixtures/sample/views/javascripts/empty-with-include.js b/spec/fixtures/sample/views/javascripts/empty-with-include.js
old mode 100644
new mode 100755
diff --git a/spec/fixtures/sample/views/layout.haml b/spec/fixtures/sample/views/layout.haml
old mode 100644
new mode 100755
diff --git a/spec/fixtures/sample/views/maruku.html.maruku b/spec/fixtures/sample/views/maruku.html.maruku
old mode 100644
new mode 100755
diff --git a/spec/fixtures/sample/views/page-classes.html.haml b/spec/fixtures/sample/views/page-classes.html.haml
old mode 100644
new mode 100755
diff --git a/spec/fixtures/sample/views/services/index.html.haml b/spec/fixtures/sample/views/services/index.html.haml
old mode 100644
new mode 100755
diff --git a/spec/fixtures/sample/views/stylesheets/relative_assets.css.sass b/spec/fixtures/sample/views/stylesheets/relative_assets.css.sass
old mode 100644
new mode 100755
diff --git a/spec/fixtures/sample/views/stylesheets/site.css.sass b/spec/fixtures/sample/views/stylesheets/site.css.sass
old mode 100644
new mode 100755
diff --git a/spec/generator_spec.rb b/spec/generator_spec.rb
old mode 100644
new mode 100755
diff --git a/spec/helpers_spec.rb b/spec/helpers_spec.rb
old mode 100644
new mode 100755
index da15e8cb..c564a885
--- a/spec/helpers_spec.rb
+++ b/spec/helpers_spec.rb
@@ -1,4 +1,3 @@
-require 'rack/test'
require File.join(File.dirname(__FILE__), "spec_helper")
base = ::Middleman::Base
diff --git a/spec/minify_javascript_spec.rb b/spec/minify_javascript_spec.rb
old mode 100644
new mode 100755
index a1a06a91..0081d354
--- a/spec/minify_javascript_spec.rb
+++ b/spec/minify_javascript_spec.rb
@@ -1,4 +1,3 @@
-require 'rack/test'
require File.join(File.dirname(__FILE__), "spec_helper")
base = ::Middleman::Base
diff --git a/spec/relative_assets_spec.rb b/spec/relative_assets_spec.rb
old mode 100644
new mode 100755
index 5940a170..d982aedb
--- a/spec/relative_assets_spec.rb
+++ b/spec/relative_assets_spec.rb
@@ -1,4 +1,3 @@
-require 'rack/test'
require File.join(File.dirname(__FILE__), "spec_helper")
base = ::Middleman::Base
diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb
old mode 100644
new mode 100755
index cfbd9d72..2ac601b5
--- a/spec/spec_helper.rb
+++ b/spec/spec_helper.rb
@@ -1,9 +1,8 @@
require 'rubygems'
require 'spec'
+require 'rack/test'
-$LOAD_PATH.unshift(File.dirname(__FILE__))
-$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
-require 'middleman'
+require File.join(File.dirname(File.dirname(__FILE__)), 'lib', 'middleman')
Spec::Runner.configure do |config|
diff --git a/vendor/gems/cache/builder-2.1.2.gem b/vendor/gems/cache/builder-2.1.2.gem
new file mode 100755
index 00000000..c9016972
Binary files /dev/null and b/vendor/gems/cache/builder-2.1.2.gem differ
diff --git a/vendor/gems/cache/compass-0.8.17.gem b/vendor/gems/cache/compass-0.8.17.gem
new file mode 100755
index 00000000..fcde600e
Binary files /dev/null and b/vendor/gems/cache/compass-0.8.17.gem differ
diff --git a/vendor/gems/cache/configuration-1.1.0.gem b/vendor/gems/cache/configuration-1.1.0.gem
new file mode 100755
index 00000000..25cc4965
Binary files /dev/null and b/vendor/gems/cache/configuration-1.1.0.gem differ
diff --git a/vendor/gems/cache/cucumber-0.4.4.gem b/vendor/gems/cache/cucumber-0.4.4.gem
new file mode 100755
index 00000000..7447f604
Binary files /dev/null and b/vendor/gems/cache/cucumber-0.4.4.gem differ
diff --git a/vendor/gems/cache/daemons-1.0.10.gem b/vendor/gems/cache/daemons-1.0.10.gem
new file mode 100755
index 00000000..248c9507
Binary files /dev/null and b/vendor/gems/cache/daemons-1.0.10.gem differ
diff --git a/vendor/gems/cache/diff-lcs-1.1.2.gem b/vendor/gems/cache/diff-lcs-1.1.2.gem
new file mode 100755
index 00000000..aa0be73b
Binary files /dev/null and b/vendor/gems/cache/diff-lcs-1.1.2.gem differ
diff --git a/vendor/gems/cache/eventmachine-0.12.10.gem b/vendor/gems/cache/eventmachine-0.12.10.gem
new file mode 100755
index 00000000..aa54c34a
Binary files /dev/null and b/vendor/gems/cache/eventmachine-0.12.10.gem differ
diff --git a/vendor/gems/cache/extlib-0.9.13.gem b/vendor/gems/cache/extlib-0.9.13.gem
new file mode 100755
index 00000000..3ef00baa
Binary files /dev/null and b/vendor/gems/cache/extlib-0.9.13.gem differ
diff --git a/vendor/gems/cache/haml-2.2.13.gem b/vendor/gems/cache/haml-2.2.13.gem
new file mode 100755
index 00000000..0785a0ec
Binary files /dev/null and b/vendor/gems/cache/haml-2.2.13.gem differ
diff --git a/vendor/gems/cache/highline-1.5.1.gem b/vendor/gems/cache/highline-1.5.1.gem
new file mode 100755
index 00000000..e1a10f51
Binary files /dev/null and b/vendor/gems/cache/highline-1.5.1.gem differ
diff --git a/vendor/gems/cache/json-1.2.0.gem b/vendor/gems/cache/json-1.2.0.gem
new file mode 100755
index 00000000..0fefc67c
Binary files /dev/null and b/vendor/gems/cache/json-1.2.0.gem differ
diff --git a/vendor/gems/cache/launchy-0.3.3.gem b/vendor/gems/cache/launchy-0.3.3.gem
new file mode 100755
index 00000000..b915520e
Binary files /dev/null and b/vendor/gems/cache/launchy-0.3.3.gem differ
diff --git a/vendor/gems/cache/polyglot-0.2.9.gem b/vendor/gems/cache/polyglot-0.2.9.gem
new file mode 100755
index 00000000..29a97ee1
Binary files /dev/null and b/vendor/gems/cache/polyglot-0.2.9.gem differ
diff --git a/vendor/gems/cache/rack-1.0.1.gem b/vendor/gems/cache/rack-1.0.1.gem
new file mode 100755
index 00000000..bae1ede2
Binary files /dev/null and b/vendor/gems/cache/rack-1.0.1.gem differ
diff --git a/vendor/gems/cache/rack-test-0.5.1.gem b/vendor/gems/cache/rack-test-0.5.1.gem
new file mode 100755
index 00000000..ed57b845
Binary files /dev/null and b/vendor/gems/cache/rack-test-0.5.1.gem differ
diff --git a/vendor/gems/cache/rake-0.8.7.gem b/vendor/gems/cache/rake-0.8.7.gem
new file mode 100755
index 00000000..0740cec7
Binary files /dev/null and b/vendor/gems/cache/rake-0.8.7.gem differ
diff --git a/vendor/gems/cache/rdoc-2.4.3.gem b/vendor/gems/cache/rdoc-2.4.3.gem
new file mode 100755
index 00000000..8d24281d
Binary files /dev/null and b/vendor/gems/cache/rdoc-2.4.3.gem differ
diff --git a/vendor/gems/cache/rspec-1.2.9.gem b/vendor/gems/cache/rspec-1.2.9.gem
new file mode 100755
index 00000000..4a712d64
Binary files /dev/null and b/vendor/gems/cache/rspec-1.2.9.gem differ
diff --git a/vendor/gems/cache/sdoc-0.2.14.1.gem b/vendor/gems/cache/sdoc-0.2.14.1.gem
new file mode 100755
index 00000000..4e894216
Binary files /dev/null and b/vendor/gems/cache/sdoc-0.2.14.1.gem differ
diff --git a/vendor/gems/cache/shotgun-0.4.gem b/vendor/gems/cache/shotgun-0.4.gem
new file mode 100755
index 00000000..1876bfb6
Binary files /dev/null and b/vendor/gems/cache/shotgun-0.4.gem differ
diff --git a/vendor/gems/cache/sinatra-0.9.4.gem b/vendor/gems/cache/sinatra-0.9.4.gem
new file mode 100755
index 00000000..c30a6f78
Binary files /dev/null and b/vendor/gems/cache/sinatra-0.9.4.gem differ
diff --git a/vendor/gems/cache/sinatra-content-for-0.2.gem b/vendor/gems/cache/sinatra-content-for-0.2.gem
new file mode 100755
index 00000000..f2e0528b
Binary files /dev/null and b/vendor/gems/cache/sinatra-content-for-0.2.gem differ
diff --git a/vendor/gems/cache/sprockets-1.0.2.gem b/vendor/gems/cache/sprockets-1.0.2.gem
new file mode 100755
index 00000000..6e7b9b9e
Binary files /dev/null and b/vendor/gems/cache/sprockets-1.0.2.gem differ
diff --git a/vendor/gems/cache/templater-1.0.0.gem b/vendor/gems/cache/templater-1.0.0.gem
new file mode 100755
index 00000000..58c86afb
Binary files /dev/null and b/vendor/gems/cache/templater-1.0.0.gem differ
diff --git a/vendor/gems/cache/term-ansicolor-1.0.4.gem b/vendor/gems/cache/term-ansicolor-1.0.4.gem
new file mode 100755
index 00000000..11f724ba
Binary files /dev/null and b/vendor/gems/cache/term-ansicolor-1.0.4.gem differ
diff --git a/vendor/gems/cache/thin-1.2.5.gem b/vendor/gems/cache/thin-1.2.5.gem
new file mode 100755
index 00000000..25fc506d
Binary files /dev/null and b/vendor/gems/cache/thin-1.2.5.gem differ
diff --git a/vendor/gems/cache/treetop-1.4.2.gem b/vendor/gems/cache/treetop-1.4.2.gem
new file mode 100755
index 00000000..9e6f6272
Binary files /dev/null and b/vendor/gems/cache/treetop-1.4.2.gem differ
diff --git a/vendor/gems/cache/yui-compressor-0.9.1.gem b/vendor/gems/cache/yui-compressor-0.9.1.gem
new file mode 100755
index 00000000..1f1b7169
Binary files /dev/null and b/vendor/gems/cache/yui-compressor-0.9.1.gem differ
diff --git a/vendor/gems/environment.rb b/vendor/gems/environment.rb
new file mode 100755
index 00000000..a0d9f35c
--- /dev/null
+++ b/vendor/gems/environment.rb
@@ -0,0 +1,205 @@
+# DO NOT MODIFY THIS FILE
+module Bundler
+ file = File.expand_path(__FILE__)
+ dir = File.dirname(file)
+
+ ENV["PATH"] = "#{dir}/../../bin:#{ENV["PATH"]}"
+ ENV["RUBYOPT"] = "-r#{file} #{ENV["RUBYOPT"]}"
+
+ $LOAD_PATH.unshift File.expand_path("#{dir}/gems/rdoc-2.4.3/bin")
+ $LOAD_PATH.unshift File.expand_path("#{dir}/gems/rdoc-2.4.3/lib")
+ $LOAD_PATH.unshift File.expand_path("#{dir}/gems/configuration-1.1.0/bin")
+ $LOAD_PATH.unshift File.expand_path("#{dir}/gems/configuration-1.1.0/lib")
+ $LOAD_PATH.unshift File.expand_path("#{dir}/gems/builder-2.1.2/bin")
+ $LOAD_PATH.unshift File.expand_path("#{dir}/gems/builder-2.1.2/lib")
+ $LOAD_PATH.unshift File.expand_path("#{dir}/gems/daemons-1.0.10/bin")
+ $LOAD_PATH.unshift File.expand_path("#{dir}/gems/daemons-1.0.10/lib")
+ $LOAD_PATH.unshift File.expand_path("#{dir}/gems/extlib-0.9.13/bin")
+ $LOAD_PATH.unshift File.expand_path("#{dir}/gems/extlib-0.9.13/lib")
+ $LOAD_PATH.unshift File.expand_path("#{dir}/gems/json-1.2.0/bin")
+ $LOAD_PATH.unshift File.expand_path("#{dir}/gems/json-1.2.0/ext/json/ext")
+ $LOAD_PATH.unshift File.expand_path("#{dir}/gems/json-1.2.0/ext")
+ $LOAD_PATH.unshift File.expand_path("#{dir}/gems/json-1.2.0/lib")
+ $LOAD_PATH.unshift File.expand_path("#{dir}/gems/eventmachine-0.12.10/bin")
+ $LOAD_PATH.unshift File.expand_path("#{dir}/gems/eventmachine-0.12.10/lib")
+ $LOAD_PATH.unshift File.expand_path("#{dir}/gems/rack-1.0.1/bin")
+ $LOAD_PATH.unshift File.expand_path("#{dir}/gems/rack-1.0.1/lib")
+ $LOAD_PATH.unshift File.expand_path("#{dir}/gems/shotgun-0.4/bin")
+ $LOAD_PATH.unshift File.expand_path("#{dir}/gems/shotgun-0.4/lib")
+ $LOAD_PATH.unshift File.expand_path("#{dir}/gems/rack-test-0.5.1/bin")
+ $LOAD_PATH.unshift File.expand_path("#{dir}/gems/rack-test-0.5.1/lib")
+ $LOAD_PATH.unshift File.expand_path("#{dir}/gems/sinatra-0.9.4/bin")
+ $LOAD_PATH.unshift File.expand_path("#{dir}/gems/sinatra-0.9.4/lib")
+ $LOAD_PATH.unshift File.expand_path("#{dir}/gems/thin-1.2.5/bin")
+ $LOAD_PATH.unshift File.expand_path("#{dir}/gems/thin-1.2.5/lib")
+ $LOAD_PATH.unshift File.expand_path("#{dir}/gems/sdoc-0.2.14.1/bin")
+ $LOAD_PATH.unshift File.expand_path("#{dir}/gems/sdoc-0.2.14.1/lib")
+ $LOAD_PATH.unshift File.expand_path("#{dir}/gems/yui-compressor-0.9.1/bin")
+ $LOAD_PATH.unshift File.expand_path("#{dir}/gems/yui-compressor-0.9.1/lib")
+ $LOAD_PATH.unshift File.expand_path("#{dir}/gems/polyglot-0.2.9/bin")
+ $LOAD_PATH.unshift File.expand_path("#{dir}/gems/polyglot-0.2.9/lib")
+ $LOAD_PATH.unshift File.expand_path("#{dir}/gems/treetop-1.4.2/bin")
+ $LOAD_PATH.unshift File.expand_path("#{dir}/gems/treetop-1.4.2/lib")
+ $LOAD_PATH.unshift File.expand_path("#{dir}/gems/rake-0.8.7/bin")
+ $LOAD_PATH.unshift File.expand_path("#{dir}/gems/rake-0.8.7/lib")
+ $LOAD_PATH.unshift File.expand_path("#{dir}/gems/launchy-0.3.3/bin")
+ $LOAD_PATH.unshift File.expand_path("#{dir}/gems/launchy-0.3.3/lib")
+ $LOAD_PATH.unshift File.expand_path("#{dir}/gems/sprockets-1.0.2/bin")
+ $LOAD_PATH.unshift File.expand_path("#{dir}/gems/sprockets-1.0.2/lib")
+ $LOAD_PATH.unshift File.expand_path("#{dir}/gems/haml-2.2.13/bin")
+ $LOAD_PATH.unshift File.expand_path("#{dir}/gems/haml-2.2.13/lib")
+ $LOAD_PATH.unshift File.expand_path("#{dir}/gems/diff-lcs-1.1.2/bin")
+ $LOAD_PATH.unshift File.expand_path("#{dir}/gems/diff-lcs-1.1.2/lib")
+ $LOAD_PATH.unshift File.expand_path("#{dir}/gems/rspec-1.2.9/bin")
+ $LOAD_PATH.unshift File.expand_path("#{dir}/gems/rspec-1.2.9/lib")
+ $LOAD_PATH.unshift File.expand_path("#{dir}/gems/highline-1.5.1/bin")
+ $LOAD_PATH.unshift File.expand_path("#{dir}/gems/highline-1.5.1/lib")
+ $LOAD_PATH.unshift File.expand_path("#{dir}/gems/templater-1.0.0/bin")
+ $LOAD_PATH.unshift File.expand_path("#{dir}/gems/templater-1.0.0/lib")
+ $LOAD_PATH.unshift File.expand_path("#{dir}/gems/term-ansicolor-1.0.4/bin")
+ $LOAD_PATH.unshift File.expand_path("#{dir}/gems/term-ansicolor-1.0.4/lib")
+ $LOAD_PATH.unshift File.expand_path("#{dir}/gems/cucumber-0.4.4/bin")
+ $LOAD_PATH.unshift File.expand_path("#{dir}/gems/cucumber-0.4.4/lib")
+ $LOAD_PATH.unshift File.expand_path("#{dir}/gems/sinatra-content-for-0.2/bin")
+ $LOAD_PATH.unshift File.expand_path("#{dir}/gems/sinatra-content-for-0.2/lib")
+ $LOAD_PATH.unshift File.expand_path("#{dir}/gems/compass-0.8.17/bin")
+ $LOAD_PATH.unshift File.expand_path("#{dir}/gems/compass-0.8.17/lib")
+
+ @gemfile = "#{dir}/../../Gemfile"
+
+ require "rubygems"
+
+ @bundled_specs = {}
+ @bundled_specs["rdoc"] = eval(File.read("#{dir}/specifications/rdoc-2.4.3.gemspec"))
+ @bundled_specs["rdoc"].loaded_from = "#{dir}/specifications/rdoc-2.4.3.gemspec"
+ @bundled_specs["configuration"] = eval(File.read("#{dir}/specifications/configuration-1.1.0.gemspec"))
+ @bundled_specs["configuration"].loaded_from = "#{dir}/specifications/configuration-1.1.0.gemspec"
+ @bundled_specs["builder"] = eval(File.read("#{dir}/specifications/builder-2.1.2.gemspec"))
+ @bundled_specs["builder"].loaded_from = "#{dir}/specifications/builder-2.1.2.gemspec"
+ @bundled_specs["daemons"] = eval(File.read("#{dir}/specifications/daemons-1.0.10.gemspec"))
+ @bundled_specs["daemons"].loaded_from = "#{dir}/specifications/daemons-1.0.10.gemspec"
+ @bundled_specs["extlib"] = eval(File.read("#{dir}/specifications/extlib-0.9.13.gemspec"))
+ @bundled_specs["extlib"].loaded_from = "#{dir}/specifications/extlib-0.9.13.gemspec"
+ @bundled_specs["json"] = eval(File.read("#{dir}/specifications/json-1.2.0.gemspec"))
+ @bundled_specs["json"].loaded_from = "#{dir}/specifications/json-1.2.0.gemspec"
+ @bundled_specs["eventmachine"] = eval(File.read("#{dir}/specifications/eventmachine-0.12.10.gemspec"))
+ @bundled_specs["eventmachine"].loaded_from = "#{dir}/specifications/eventmachine-0.12.10.gemspec"
+ @bundled_specs["rack"] = eval(File.read("#{dir}/specifications/rack-1.0.1.gemspec"))
+ @bundled_specs["rack"].loaded_from = "#{dir}/specifications/rack-1.0.1.gemspec"
+ @bundled_specs["shotgun"] = eval(File.read("#{dir}/specifications/shotgun-0.4.gemspec"))
+ @bundled_specs["shotgun"].loaded_from = "#{dir}/specifications/shotgun-0.4.gemspec"
+ @bundled_specs["rack-test"] = eval(File.read("#{dir}/specifications/rack-test-0.5.1.gemspec"))
+ @bundled_specs["rack-test"].loaded_from = "#{dir}/specifications/rack-test-0.5.1.gemspec"
+ @bundled_specs["sinatra"] = eval(File.read("#{dir}/specifications/sinatra-0.9.4.gemspec"))
+ @bundled_specs["sinatra"].loaded_from = "#{dir}/specifications/sinatra-0.9.4.gemspec"
+ @bundled_specs["thin"] = eval(File.read("#{dir}/specifications/thin-1.2.5.gemspec"))
+ @bundled_specs["thin"].loaded_from = "#{dir}/specifications/thin-1.2.5.gemspec"
+ @bundled_specs["sdoc"] = eval(File.read("#{dir}/specifications/sdoc-0.2.14.1.gemspec"))
+ @bundled_specs["sdoc"].loaded_from = "#{dir}/specifications/sdoc-0.2.14.1.gemspec"
+ @bundled_specs["yui-compressor"] = eval(File.read("#{dir}/specifications/yui-compressor-0.9.1.gemspec"))
+ @bundled_specs["yui-compressor"].loaded_from = "#{dir}/specifications/yui-compressor-0.9.1.gemspec"
+ @bundled_specs["polyglot"] = eval(File.read("#{dir}/specifications/polyglot-0.2.9.gemspec"))
+ @bundled_specs["polyglot"].loaded_from = "#{dir}/specifications/polyglot-0.2.9.gemspec"
+ @bundled_specs["treetop"] = eval(File.read("#{dir}/specifications/treetop-1.4.2.gemspec"))
+ @bundled_specs["treetop"].loaded_from = "#{dir}/specifications/treetop-1.4.2.gemspec"
+ @bundled_specs["rake"] = eval(File.read("#{dir}/specifications/rake-0.8.7.gemspec"))
+ @bundled_specs["rake"].loaded_from = "#{dir}/specifications/rake-0.8.7.gemspec"
+ @bundled_specs["launchy"] = eval(File.read("#{dir}/specifications/launchy-0.3.3.gemspec"))
+ @bundled_specs["launchy"].loaded_from = "#{dir}/specifications/launchy-0.3.3.gemspec"
+ @bundled_specs["sprockets"] = eval(File.read("#{dir}/specifications/sprockets-1.0.2.gemspec"))
+ @bundled_specs["sprockets"].loaded_from = "#{dir}/specifications/sprockets-1.0.2.gemspec"
+ @bundled_specs["haml"] = eval(File.read("#{dir}/specifications/haml-2.2.13.gemspec"))
+ @bundled_specs["haml"].loaded_from = "#{dir}/specifications/haml-2.2.13.gemspec"
+ @bundled_specs["diff-lcs"] = eval(File.read("#{dir}/specifications/diff-lcs-1.1.2.gemspec"))
+ @bundled_specs["diff-lcs"].loaded_from = "#{dir}/specifications/diff-lcs-1.1.2.gemspec"
+ @bundled_specs["rspec"] = eval(File.read("#{dir}/specifications/rspec-1.2.9.gemspec"))
+ @bundled_specs["rspec"].loaded_from = "#{dir}/specifications/rspec-1.2.9.gemspec"
+ @bundled_specs["highline"] = eval(File.read("#{dir}/specifications/highline-1.5.1.gemspec"))
+ @bundled_specs["highline"].loaded_from = "#{dir}/specifications/highline-1.5.1.gemspec"
+ @bundled_specs["templater"] = eval(File.read("#{dir}/specifications/templater-1.0.0.gemspec"))
+ @bundled_specs["templater"].loaded_from = "#{dir}/specifications/templater-1.0.0.gemspec"
+ @bundled_specs["term-ansicolor"] = eval(File.read("#{dir}/specifications/term-ansicolor-1.0.4.gemspec"))
+ @bundled_specs["term-ansicolor"].loaded_from = "#{dir}/specifications/term-ansicolor-1.0.4.gemspec"
+ @bundled_specs["cucumber"] = eval(File.read("#{dir}/specifications/cucumber-0.4.4.gemspec"))
+ @bundled_specs["cucumber"].loaded_from = "#{dir}/specifications/cucumber-0.4.4.gemspec"
+ @bundled_specs["sinatra-content-for"] = eval(File.read("#{dir}/specifications/sinatra-content-for-0.2.gemspec"))
+ @bundled_specs["sinatra-content-for"].loaded_from = "#{dir}/specifications/sinatra-content-for-0.2.gemspec"
+ @bundled_specs["compass"] = eval(File.read("#{dir}/specifications/compass-0.8.17.gemspec"))
+ @bundled_specs["compass"].loaded_from = "#{dir}/specifications/compass-0.8.17.gemspec"
+
+ def self.add_specs_to_loaded_specs
+ Gem.loaded_specs.merge! @bundled_specs
+ end
+
+ def self.add_specs_to_index
+ @bundled_specs.each do |name, spec|
+ Gem.source_index.add_spec spec
+ end
+ end
+
+ add_specs_to_loaded_specs
+ add_specs_to_index
+
+ def self.require_env(env = nil)
+ context = Class.new do
+ def initialize(env) @env = env && env.to_s ; end
+ def method_missing(*) ; yield if block_given? ; end
+ def only(*env)
+ old, @only = @only, _combine_only(env.flatten)
+ yield
+ @only = old
+ end
+ def except(*env)
+ old, @except = @except, _combine_except(env.flatten)
+ yield
+ @except = old
+ end
+ def gem(name, *args)
+ opt = args.last.is_a?(Hash) ? args.pop : {}
+ only = _combine_only(opt[:only] || opt["only"])
+ except = _combine_except(opt[:except] || opt["except"])
+ files = opt[:require_as] || opt["require_as"] || name
+ files = [files] unless files.respond_to?(:each)
+
+ return unless !only || only.any? {|e| e == @env }
+ return if except && except.any? {|e| e == @env }
+
+ if files = opt[:require_as] || opt["require_as"]
+ files = Array(files)
+ files.each { |f| require f }
+ else
+ begin
+ require name
+ rescue LoadError
+ # Do nothing
+ end
+ end
+ yield if block_given?
+ true
+ end
+ private
+ def _combine_only(only)
+ return @only unless only
+ only = [only].flatten.compact.uniq.map { |o| o.to_s }
+ only &= @only if @only
+ only
+ end
+ def _combine_except(except)
+ return @except unless except
+ except = [except].flatten.compact.uniq.map { |o| o.to_s }
+ except |= @except if @except
+ except
+ end
+ end
+ context.new(env && env.to_s).instance_eval(File.read(@gemfile), @gemfile, 1)
+ end
+end
+
+module Gem
+ @loaded_stacks = Hash.new { |h,k| h[k] = [] }
+
+ def source_index.refresh!
+ super
+ Bundler.add_specs_to_index
+ end
+end
diff --git a/vendor/gems/gems/builder-2.1.2/CHANGES b/vendor/gems/gems/builder-2.1.2/CHANGES
new file mode 100755
index 00000000..4843141c
--- /dev/null
+++ b/vendor/gems/gems/builder-2.1.2/CHANGES
@@ -0,0 +1,85 @@
+= Change Log
+
+== Version 2.1.2
+
+* Fixed bug where private methods in kernel could leak through using
+ tag!(). Thanks to Hagen Overdick for finding and diagnosing this
+ bug.
+
+
+== Version 2.1.1
+
+* Fixed typo in XmlMarkup class docs (ident => indent). (from Martin
+ Fowler).
+* Removed extra directory indirection from legacy CVS to SVN move.
+* Removed some extraneous tabs from source.
+* Fixed test on private methods in blankslate to differentiate between
+ targetted and untargetted private methods.
+* Removed legacy capture of @self in XmlBase (@self was used back when
+ we used instance eval).
+* Added additional tests for global functions (both direct and included).
+
+== Version 2.1.0
+
+* Fixed bug in BlankSlate where including a module into Object could
+ cause methods to leak into BlankSlate.
+* Made BlankSlate available as its own gem. Currently the builder gem
+ still directly includes the BlankSlate code.
+* Added reveal capability to BlankSlate.
+
+== Version 2.0.0
+
+* Added doc directory
+* Added unit tests for XmlEvents.
+* Added XChar module and used it in the _escape method.
+* Attributes are now quoted by default when strings. Use Symbol
+ attribute values for unquoted behavior.
+
+== Version 1.2.4
+
+* Added a cdata! command to an XML Builder (from Josh Knowles).
+
+== Version 1.2.3
+
+The attributes in the instruction will be ordered:
+version, encoding, standalone.
+
+== Version 1.2.2
+
+Another fix for BlankSlate. The Kernal/Object traps added in 1.2.1
+failed when a method was defined late more than once. Since the
+method was already marked as removed, another attempt to undefine it
+raised an error. The fix was to check the list of instance methods
+before attempting the undef operation. Thanks to Florian Gross and
+David Heinemeier Hansson for the patch.
+
+== Version 1.2.1
+
+BlankSlate now traps method definitions in Kernel and Object to avoid
+late method definitions inadvertently becoming part of the definition
+of BlankSlate as well.
+
+== Version 1.2.0
+
+Improved support for entity declarations by allowing nested
+declarations and removal of the attribute processing.
+
+Added namespace support.
+
+== Version 1.1.0
+
+Added support for comments, entity declarations and processing instructions.
+
+== Version 1.0.0
+
+Removed use of instace_eval making the use of XmlMarkup much
+less prone to error.
+
+== Version 0.1.1
+
+Bug fix.
+
+== Version 0.1.0
+
+Initial version release.
+
diff --git a/vendor/gems/gems/builder-2.1.2/README b/vendor/gems/gems/builder-2.1.2/README
new file mode 100755
index 00000000..5ba72dff
--- /dev/null
+++ b/vendor/gems/gems/builder-2.1.2/README
@@ -0,0 +1,210 @@
+= Project: Builder
+
+== Goal
+
+Provide a simple way to create XML markup and data structures.
+
+== Classes
+
+Builder::XmlMarkup:: Generate XML markup notiation
+Builder::XmlEvents:: Generate XML events (i.e. SAX-like)
+
+Notes ::
+
+* An Builder::XmlTree class to generate XML tree
+ (i.e. DOM-like) structures is also planned, but not yet implemented.
+ Also, the events builder is currently lagging the markup builder in
+ features.
+
+== Usage
+
+ require 'rubygems'
+ require_gem 'builder', '~> 2.0'
+
+ builder = Builder::XmlMarkup.new
+ xml = builder.person { |b| b.name("Jim"); b.phone("555-1234") }
+ xml #=> Jim 555-1234
+
+or
+
+ require 'rubygems'
+ require_gem 'builder'
+
+ builder = Builder::XmlMarkup.new(:target=>STDOUT, :indent=>2)
+ builder.person { |b| b.name("Jim"); b.phone("555-1234") }
+ #
+ # Prints:
+ #
+ # Jim
+ # 555-1234
+ #
+
+== Compatibility
+
+=== Version 2.0.0 Compatibility Changes
+
+Version 2.0.0 introduces automatically escaped attribute values for
+the first time. Versions prior to 2.0.0 did not insert escape
+characters into attribute values in the XML markup. This allowed
+attribute values to explicitly reference entities, which was
+occasionally used by a small number of developers. Since strings
+could always be explicitly escaped by hand, this was not a major
+restriction in functionality.
+
+However, it did suprise most users of builder. Since the body text is
+normally escaped, everybody expected the attribute values to be
+escaped as well. Escaped attribute values were the number one support
+request on the 1.x Builder series.
+
+Starting with Builder version 2.0.0, all attribute values expressed as
+strings will be processed and the appropriate characters will be
+escaped (e.g. "&" will be tranlated to "&"). Attribute values
+that are expressed as Symbol values will not be processed for escaped
+characters and will be unchanged in output. (Yes, this probably counts
+as Symbol abuse, but the convention is convenient and flexible).
+
+Example:
+
+ xml = Builder::XmlMarkup.new
+ xml.sample(:escaped=>"This&That", :unescaped=>:"Here&There")
+ xml.target! =>
+
+
+=== Version 1.0.0 Compatibility Changes
+
+Version 1.0.0 introduces some changes that are not backwards
+compatible with earlier releases of builder. The main areas of
+incompatibility are:
+
+* Keyword based arguments to +new+ (rather than positional based). It
+ was found that a developer would often like to specify indentation
+ without providing an explicit target, or specify a target without
+ indentation. Keyword based arguments handle this situation nicely.
+
+* Builder must now be an explicit target for markup tags. Instead of
+ writing
+
+ xml_markup = Builder::XmlMarkup.new
+ xml_markup.div { strong("text") }
+
+ you need to write
+
+ xml_markup = Builder::XmlMarkup.new
+ xml_markup.div { xml_markup.strong("text") }
+
+* The builder object is passed as a parameter to all nested markup
+ blocks. This allows you to create a short alias for the builder
+ object that can be used within the block. For example, the previous
+ example can be written as:
+
+ xml_markup = Builder::XmlMarkup.new
+ xml_markup.div { |xml| xml.strong("text") }
+
+* If you have both a pre-1.0 and a post-1.0 gem of builder installed,
+ you can choose which version to use through the RubyGems
+ +require_gem+ facility.
+
+ require_gem 'builder', "~> 0.0" # Gets the old version
+ require_gem 'builder', "~> 1.0" # Gets the new version
+
+== Features
+
+* XML Comments are supported ...
+
+ xml_markup.comment! "This is a comment"
+ #=>
+
+* XML processing instructions are supported ...
+
+ xml_markup.instruct! :xml, :version=>"1.0", :encoding=>"UTF-8"
+ #=>
+
+ If the processing instruction is omitted, it defaults to "xml".
+ When the processing instruction is "xml", the defaults attributes
+ are:
+
+ version :: 1.0
+ encoding :: "UTF-8"
+
+* XML entity declarations are now supported to a small degree.
+
+ xml_markup.declare! :DOCTYPE, :chapter, :SYSTEM, "../dtds/chapter.dtd"
+ #=>
+
+ The parameters to a declare! method must be either symbols or
+ strings. Symbols are inserted without quotes, and strings are
+ inserted with double quotes. Attribute-like arguments in hashes are
+ not allowed.
+
+ If you need to have an argument to declare! be inserted without
+ quotes, but the arguement does not conform to the typical Ruby
+ syntax for symbols, then use the :"string" form to specify a symbol.
+
+ For example:
+
+ xml_markup.declare! :ELEMENT, :chapter, :"(title,para+)"
+ #=>
+
+ Nested entity declarations are allowed. For example:
+
+ @xml_markup.declare! :DOCTYPE, :chapter do |x|
+ x.declare! :ELEMENT, :chapter, :"(title,para+)"
+ x.declare! :ELEMENT, :title, :"(#PCDATA)"
+ x.declare! :ELEMENT, :para, :"(#PCDATA)"
+ end
+
+ #=>
+
+
+
+
+ ]>
+
+* Some support for XML namespaces is now available. If the first
+ argument to a tag call is a symbol, it will be joined to the tag to
+ produce a namespace:tag combination. It is easier to show this than
+ describe it.
+
+ xml.SOAP :Envelope do ... end
+
+ Just put a space before the colon in a namespace to produce the
+ right form for builder (e.g. "SOAP:Envelope " =>
+ "xml.SOAP :Envelope ")
+
+* String attribute values are now escaped by default by
+ Builder (NOTE: this is _new_ behavior as of version 2.0).
+
+ However, occasionally you need to use entities in attribute values.
+ Using a symbols (rather than a string) for an attribute value will
+ cause Builder to not run its quoting/escaping algorithm on that
+ particular value.
+
+ (Note: The +escape_attrs+ option for builder is now
+ obsolete).
+
+ Example:
+
+ xml = Builder::XmlMarkup.new
+ xml.sample(:escaped=>"This&That", :unescaped=>:"Here&There")
+ xml.target! =>
+
+
+* UTF-8 Support
+
+ Builder correctly translates UTF-8 characters into valid XML. (New
+ in version 2.0.0). Thanks to Sam Ruby for the translation code.
+
+ Example:
+
+ xml = Builder::Markup.new
+ xml.sample("Iñtërnâtiônàl")
+ xml.target! =>
+ "Iñtërnâtiônàl "
+
+== Contact
+
+Author:: Jim Weirich
+Email:: jim@weirichhouse.org
+Home Page:: http://onestepback.org
+License:: MIT Licence (http://www.opensource.org/licenses/mit-license.html)
diff --git a/vendor/gems/gems/builder-2.1.2/Rakefile b/vendor/gems/gems/builder-2.1.2/Rakefile
new file mode 100755
index 00000000..89e1ae2c
--- /dev/null
+++ b/vendor/gems/gems/builder-2.1.2/Rakefile
@@ -0,0 +1,263 @@
+# Rakefile for rake -*- ruby -*-
+
+# Copyright 2004, 2005, 2006 by Jim Weirich (jim@weirichhouse.org).
+# All rights reserved.
+
+# Permission is granted for use, copying, modification, distribution,
+# and distribution of modified versions of this work as long as the
+# above copyright notice is included.
+
+require 'rake/clean'
+require 'rake/testtask'
+require 'rake/rdoctask'
+begin
+ require 'rubygems'
+ require 'rake/gempackagetask'
+rescue Exception
+ nil
+end
+
+# Determine the current version of the software
+
+CLOBBER.include('pkg')
+
+CURRENT_VERSION = '2.1.2'
+PKG_VERSION = ENV['REL'] ? ENV['REL'] : CURRENT_VERSION
+
+SRC_RB = FileList['lib/**/*.rb']
+
+# The default task is run if rake is given no explicit arguments.
+
+desc "Default Task"
+task :default => :test_all
+
+# Test Tasks ---------------------------------------------------------
+
+desc "Run all tests"
+task :test_all => [:test_units]
+task :ta => [:test_all]
+
+task :tu => [:test_units]
+
+Rake::TestTask.new("test_units") do |t|
+ t.test_files = FileList['test/test*.rb']
+ t.verbose = false
+end
+
+# Create a task to build the RDOC documentation tree.
+
+rd = Rake::RDocTask.new("rdoc") { |rdoc|
+ rdoc.rdoc_dir = 'html'
+ rdoc.title = "Builder for Markup"
+ rdoc.options << '--line-numbers' << '--inline-source' << '--main' << 'README'
+ rdoc.rdoc_files.include('lib/**/*.rb', '[A-Z]*', 'doc/**/*.rdoc')
+ rdoc.template = 'doc/jamis.rb'
+}
+
+# ====================================================================
+# Create a task that will package the Rake software into distributable
+# gem files.
+
+PKG_FILES = FileList[
+ 'lib/**/*.rb',
+ 'test/**/*.rb',
+ 'scripts/**/*.rb'
+]
+PKG_FILES.exclude('test/testcssbuilder.rb')
+PKG_FILES.exclude('lib/builder/css.rb')
+
+BLANKSLATE_FILES = FileList[
+ 'lib/blankslate.rb',
+ 'test/testblankslate.rb'
+]
+
+if ! defined?(Gem)
+ puts "Package Target requires RubyGEMs"
+else
+ spec = Gem::Specification.new do |s|
+
+ #### Basic information.
+
+ s.name = 'builder'
+ s.version = PKG_VERSION
+ s.summary = "Builders for MarkUp."
+ s.description = %{\
+Builder provides a number of builder objects that make creating structured data
+simple to do. Currently the following builder objects are supported:
+
+* XML Markup
+* XML Events
+}
+
+ s.files = PKG_FILES.to_a
+ s.require_path = 'lib'
+ s.autorequire = 'builder'
+
+ s.test_files = PKG_FILES.select { |fn| fn =~ /^test\/test/ }
+
+ s.has_rdoc = true
+ s.extra_rdoc_files = rd.rdoc_files.reject { |fn| fn =~ /\.rb$/ }.to_a
+ s.rdoc_options <<
+ '--title' << 'Builder -- Easy XML Building' <<
+ '--main' << 'README' <<
+ '--line-numbers'
+
+ s.author = "Jim Weirich"
+ s.email = "jim@weirichhouse.org"
+ s.homepage = "http://onestepback.org"
+ end
+
+ blankslate_spec = Gem::Specification.new do |s|
+
+ #### Basic information.
+
+ s.name = 'blankslate'
+ s.version = PKG_VERSION
+ s.summary = "Blank Slate base class."
+ s.description = %{\
+BlankSlate provides a base class where almost all of the methods from Object and
+Kernel have been removed. This is useful when providing proxy object and other
+classes that make heavy use of method_missing.
+}
+
+ s.files = BLANKSLATE_FILES.to_a
+ s.require_path = 'lib'
+ s.autorequire = 'builder'
+
+ s.test_files = PKG_FILES.select { |fn| fn =~ /^test\/test/ }
+
+ s.has_rdoc = true
+ s.extra_rdoc_files = rd.rdoc_files.reject { |fn| fn =~ /\.rb$/ }.to_a
+ s.rdoc_options <<
+ '--title' << 'BlankSlate -- Base Class for building proxies.' <<
+ '--main' << 'README' <<
+ '--line-numbers'
+
+ s.author = "Jim Weirich"
+ s.email = "jim@weirichhouse.org"
+ s.homepage = "http://onestepback.org"
+ end
+
+ namespace 'builder' do
+ Rake::GemPackageTask.new(spec) do |t|
+ t.need_tar = true
+ end
+ end
+
+ namespace 'blankslate' do
+ Rake::GemPackageTask.new(blankslate_spec) do |t|
+ t.need_tar = true
+ end
+ end
+
+ task :package => ['builder:package', 'blankslate:package']
+end
+
+desc "Look for Debugging print lines"
+task :dbg do
+ FileList['**/*.rb'].egrep /\bDBG|\bbreakpoint\b/
+end
+
+# --------------------------------------------------------------------
+# Creating a release
+
+def announce(msg='')
+ STDERR.puts msg
+end
+
+desc "Make a new release"
+task :release => [
+ :prerelease,
+ :clobber,
+ :test_all,
+ :update_version,
+ :package,
+ :tag] do
+
+ announce
+ announce "**************************************************************"
+ announce "* Release #{PKG_VERSION} Complete."
+ announce "* Packages ready to upload."
+ announce "**************************************************************"
+ announce
+end
+
+# Validate that everything is ready to go for a release.
+task :prerelease do
+ announce
+ announce "**************************************************************"
+ announce "* Making RubyGem Release #{PKG_VERSION}"
+ announce "* (current version #{CURRENT_VERSION})"
+ announce "**************************************************************"
+ announce
+
+ # Is a release number supplied?
+ unless ENV['REL']
+ fail "Usage: rake release REL=x.y.z [REUSE=tag_suffix]"
+ end
+
+ # Is the release different than the current release.
+ # (or is REUSE set?)
+ if PKG_VERSION == CURRENT_VERSION && ! ENV['REUSE']
+ fail "Current version is #{PKG_VERSION}, must specify REUSE=tag_suffix to reuse version"
+ end
+
+ # Are all source files checked in?
+ if ENV['RELTEST']
+ announce "Release Task Testing, skipping checked-in file test"
+ else
+ announce "Checking for unchecked-in files..."
+ data = `cvs -q update`
+ unless data =~ /^$/
+ fail "CVS update is not clean ... do you have unchecked-in files?"
+ end
+ announce "No outstanding checkins found ... OK"
+ end
+end
+
+task :update_version => [:prerelease] do
+ if PKG_VERSION == CURRENT_VERSION
+ announce "No version change ... skipping version update"
+ else
+ announce "Updating Builder version to #{PKG_VERSION}"
+ open("Rakefile") do |rakein|
+ open("Rakefile.new", "w") do |rakeout|
+ rakein.each do |line|
+ if line =~ /^CURRENT_VERSION\s*=\s*/
+ rakeout.puts "CURRENT_VERSION = '#{PKG_VERSION}'"
+ else
+ rakeout.puts line
+ end
+ end
+ end
+ end
+ mv "Rakefile.new", "Rakefile"
+ if ENV['RELTEST']
+ announce "Release Task Testing, skipping commiting of new version"
+ else
+ sh %{cvs commit -m "Updated to version #{PKG_VERSION}" Rakefile}
+ end
+ end
+end
+
+desc "Tag all the CVS files with the latest release number (REL=x.y.z)"
+task :tag => [:prerelease] do
+ reltag = "REL_#{PKG_VERSION.gsub(/\./, '_')}"
+ reltag << ENV['REUSE'].gsub(/\./, '_') if ENV['REUSE']
+ announce "Tagging CVS with [#{reltag}]"
+ if ENV['RELTEST']
+ announce "Release Task Testing, skipping CVS tagging"
+ else
+ sh %{cvs tag #{reltag}}
+ end
+end
+
+desc "Install the jamis RDoc template"
+task :install_jamis_template do
+ require 'rbconfig'
+ dest_dir = File.join(Config::CONFIG['rubylibdir'], "rdoc/generators/template/html")
+ fail "Unabled to write to #{dest_dir}" unless File.writable?(dest_dir)
+ install "doc/jamis.rb", dest_dir, :verbose => true
+end
+
+require 'scripts/publish'
diff --git a/vendor/gems/gems/builder-2.1.2/doc/releases/builder-1.2.4.rdoc b/vendor/gems/gems/builder-2.1.2/doc/releases/builder-1.2.4.rdoc
new file mode 100755
index 00000000..a1cf54fd
--- /dev/null
+++ b/vendor/gems/gems/builder-2.1.2/doc/releases/builder-1.2.4.rdoc
@@ -0,0 +1,31 @@
+= Builder 1.2.4 Released.
+
+Added a "CDATA" method to the XML Markup builder (from Josh Knowles).
+
+== What is Builder?
+
+Builder::XmlMarkup allows easy programmatic creation of XML markup.
+For example:
+
+ builder = Builder::XmlMarkup.new(:target=>STDOUT, :indent=>2)
+ builder.person { |b| b.name("Jim"); b.phone("555-1234") }
+ puts builder.target!
+
+will generate:
+
+
+ Jim
+ 555-1234
+
+
+== Availability
+
+The easiest way to get and install builder is via RubyGems ...
+
+ gem install builder (you may need root/admin privileges)
+
+== Thanks
+
+* Josh Knowles for the cdata! patch.
+
+-- Jim Weirich
diff --git a/vendor/gems/gems/builder-2.1.2/doc/releases/builder-2.0.0.rdoc b/vendor/gems/gems/builder-2.1.2/doc/releases/builder-2.0.0.rdoc
new file mode 100755
index 00000000..ed9e086d
--- /dev/null
+++ b/vendor/gems/gems/builder-2.1.2/doc/releases/builder-2.0.0.rdoc
@@ -0,0 +1,46 @@
+= Builder 2.0.0 Released.
+
+== Changes in 2.0.0
+
+* UTF-8 characters in data are now correctly translated to their XML
+ equivalents. (Thanks to Sam Ruby)
+
+* Attribute values are now escaped by default. See the README
+ file for details.
+
+NOTE: The escaping attribute values by default is different
+than in previous releases of Builder. This makes version 2.0.0
+somewhat incompatible with the 1.x series of Builder. If you use "&",
+"<", or ">" in attributes values, you may have to change your
+code. (Essentially you remove the manual escaping. The new way is
+easier, believe me).
+
+== What is Builder?
+
+Builder::XmlMarkup is a library that allows easy programmatic creation
+of XML markup. For example:
+
+ builder = Builder::XmlMarkup.new(:target=>STDOUT, :indent=>2)
+ builder.person { |b| b.name("Jim"); b.phone("555-1234") }
+
+will generate:
+
+
+ Jim
+ 555-1234
+
+
+== Availability
+
+The easiest way to get and install builder is via RubyGems ...
+
+ gem install builder (you may need root/admin privileges)
+
+== Thanks
+
+* Sam Ruby for the XChar module and the related UTF-8 translation
+ tools.
+* Also to Sam Ruby for gently persuading me to start quoting attribute
+ values.
+
+-- Jim Weirich
diff --git a/vendor/gems/gems/builder-2.1.2/doc/releases/builder-2.1.1.rdoc b/vendor/gems/gems/builder-2.1.2/doc/releases/builder-2.1.1.rdoc
new file mode 100755
index 00000000..dbbf1213
--- /dev/null
+++ b/vendor/gems/gems/builder-2.1.2/doc/releases/builder-2.1.1.rdoc
@@ -0,0 +1,58 @@
+= Builder 2.1.1 Released.
+
+Release 2.1.1 of Builder is mainly a bug fix release.
+
+== Changes in 2.1.1
+
+* Added reveal capability to BlankSlate.
+
+* Fixed a bug in BlankSlate where including a module into Object could
+ cause methods to leak into BlankSlate.
+
+* Fixed typo in XmlMarkup class docs (from Martin Fowler).
+
+* Fixed test on private methods to differentiate between targetted and
+ untargetted private methods.
+
+* Removed legacy capture of @self in XmlBase (@self was used back when
+ we used instance eval).
+
+* Added additional tests for global functions (both direct and
+ included).
+
+* Several misc internal cleanups, including rearranging the source
+ code tree.
+
+NOTE: The escaping attribute values by default is different
+than in previous releases of Builder. This makes version 2.0.x
+somewhat incompatible with the 1.x series of Builder. If you use "&",
+"<", or ">" in attributes values, you may have to change your
+code. (Essentially you remove the manual escaping. The new way is
+easier, believe me).
+
+== What is Builder?
+
+Builder::XmlMarkup is a library that allows easy programmatic creation
+of XML markup. For example:
+
+ builder = Builder::XmlMarkup.new(:target=>STDOUT, :indent=>2)
+ builder.person { |b| b.name("Jim"); b.phone("555-1234") }
+
+will generate:
+
+
+ Jim
+ 555-1234
+
+
+== Availability
+
+The easiest way to get and install builder is via RubyGems ...
+
+ gem install builder (you may need root/admin privileges)
+
+== Thanks
+
+* Martin Fowler for spotting some typos in the documentation.
+
+-- Jim Weirich
diff --git a/vendor/gems/gems/builder-2.1.2/lib/blankslate.rb b/vendor/gems/gems/builder-2.1.2/lib/blankslate.rb
new file mode 100755
index 00000000..0f30838f
--- /dev/null
+++ b/vendor/gems/gems/builder-2.1.2/lib/blankslate.rb
@@ -0,0 +1,113 @@
+#!/usr/bin/env ruby
+#--
+# Copyright 2004, 2006 by Jim Weirich (jim@weirichhouse.org).
+# All rights reserved.
+
+# Permission is granted for use, copying, modification, distribution,
+# and distribution of modified versions of this work as long as the
+# above copyright notice is included.
+#++
+
+######################################################################
+# BlankSlate provides an abstract base class with no predefined
+# methods (except for \_\_send__ and \_\_id__ ).
+# BlankSlate is useful as a base class when writing classes that
+# depend upon method_missing (e.g. dynamic proxies).
+#
+class BlankSlate
+ class << self
+
+ # Hide the method named +name+ in the BlankSlate class. Don't
+ # hide +instance_eval+ or any method beginning with "__".
+ def hide(name)
+ if instance_methods.include?(name.to_s) and
+ name !~ /^(__|instance_eval)/
+ @hidden_methods ||= {}
+ @hidden_methods[name.to_sym] = instance_method(name)
+ undef_method name
+ end
+ end
+
+ def find_hidden_method(name)
+ @hidden_methods ||= {}
+ @hidden_methods[name] || superclass.find_hidden_method(name)
+ end
+
+ # Redefine a previously hidden method so that it may be called on a blank
+ # slate object.
+ def reveal(name)
+ bound_method = nil
+ unbound_method = find_hidden_method(name)
+ fail "Don't know how to reveal method '#{name}'" unless unbound_method
+ define_method(name) do |*args|
+ bound_method ||= unbound_method.bind(self)
+ bound_method.call(*args)
+ end
+ end
+ end
+
+ instance_methods.each { |m| hide(m) }
+end
+
+######################################################################
+# Since Ruby is very dynamic, methods added to the ancestors of
+# BlankSlate after BlankSlate is defined will show up in the
+# list of available BlankSlate methods. We handle this by defining a
+# hook in the Object and Kernel classes that will hide any method
+# defined after BlankSlate has been loaded.
+#
+module Kernel
+ class << self
+ alias_method :blank_slate_method_added, :method_added
+
+ # Detect method additions to Kernel and remove them in the
+ # BlankSlate class.
+ def method_added(name)
+ result = blank_slate_method_added(name)
+ return result if self != Kernel
+ BlankSlate.hide(name)
+ result
+ end
+ end
+end
+
+######################################################################
+# Same as above, except in Object.
+#
+class Object
+ class << self
+ alias_method :blank_slate_method_added, :method_added
+
+ # Detect method additions to Object and remove them in the
+ # BlankSlate class.
+ def method_added(name)
+ result = blank_slate_method_added(name)
+ return result if self != Object
+ BlankSlate.hide(name)
+ result
+ end
+
+ def find_hidden_method(name)
+ nil
+ end
+ end
+end
+
+######################################################################
+# Also, modules included into Object need to be scanned and have their
+# instance methods removed from blank slate. In theory, modules
+# included into Kernel would have to be removed as well, but a
+# "feature" of Ruby prevents late includes into modules from being
+# exposed in the first place.
+#
+class Module
+ alias blankslate_original_append_features append_features
+ def append_features(mod)
+ result = blankslate_original_append_features(mod)
+ return result if mod != Object
+ instance_methods.each do |name|
+ BlankSlate.hide(name)
+ end
+ result
+ end
+end
\ No newline at end of file
diff --git a/vendor/gems/gems/builder-2.1.2/lib/builder.rb b/vendor/gems/gems/builder-2.1.2/lib/builder.rb
new file mode 100755
index 00000000..97192776
--- /dev/null
+++ b/vendor/gems/gems/builder-2.1.2/lib/builder.rb
@@ -0,0 +1,13 @@
+#!/usr/bin/env ruby
+
+#--
+# Copyright 2004 by Jim Weirich (jim@weirichhouse.org).
+# All rights reserved.
+
+# Permission is granted for use, copying, modification, distribution,
+# and distribution of modified versions of this work as long as the
+# above copyright notice is included.
+#++
+
+require 'builder/xmlmarkup'
+require 'builder/xmlevents'
diff --git a/vendor/gems/gems/builder-2.1.2/lib/builder/blankslate.rb b/vendor/gems/gems/builder-2.1.2/lib/builder/blankslate.rb
new file mode 100755
index 00000000..2935b6f1
--- /dev/null
+++ b/vendor/gems/gems/builder-2.1.2/lib/builder/blankslate.rb
@@ -0,0 +1,20 @@
+#!/usr/bin/env ruby
+#--
+# Copyright 2004, 2006 by Jim Weirich (jim@weirichhouse.org).
+# All rights reserved.
+
+# Permission is granted for use, copying, modification, distribution,
+# and distribution of modified versions of this work as long as the
+# above copyright notice is included.
+#++
+
+require 'blankslate'
+
+######################################################################
+# BlankSlate has been promoted to a top level name and is now
+# available as a standalone gem. We make the name available in the
+# Builder namespace for compatibility.
+#
+module Builder
+ BlankSlate = ::BlankSlate
+end
diff --git a/vendor/gems/gems/builder-2.1.2/lib/builder/xchar.rb b/vendor/gems/gems/builder-2.1.2/lib/builder/xchar.rb
new file mode 100755
index 00000000..3a752bab
--- /dev/null
+++ b/vendor/gems/gems/builder-2.1.2/lib/builder/xchar.rb
@@ -0,0 +1,115 @@
+#!/usr/bin/env ruby
+
+# The XChar library is provided courtesy of Sam Ruby (See
+# http://intertwingly.net/stories/2005/09/28/xchar.rb)
+
+# --------------------------------------------------------------------
+
+# If the Builder::XChar module is not currently defined, fail on any
+# name clashes in standard library classes.
+
+module Builder
+ def self.check_for_name_collision(klass, method_name, defined_constant=nil)
+ if klass.instance_methods.include?(method_name)
+ fail RuntimeError,
+ "Name Collision: Method '#{method_name}' is already defined in #{klass}"
+ end
+ end
+end
+
+if ! defined?(Builder::XChar)
+ Builder.check_for_name_collision(String, "to_xs")
+ Builder.check_for_name_collision(Fixnum, "xchr")
+end
+
+######################################################################
+module Builder
+
+ ####################################################################
+ # XML Character converter, from Sam Ruby:
+ # (see http://intertwingly.net/stories/2005/09/28/xchar.rb).
+ #
+ module XChar # :nodoc:
+
+ # See
+ # http://intertwingly.net/stories/2004/04/14/i18n.html#CleaningWindows
+ # for details.
+ CP1252 = { # :nodoc:
+ 128 => 8364, # euro sign
+ 130 => 8218, # single low-9 quotation mark
+ 131 => 402, # latin small letter f with hook
+ 132 => 8222, # double low-9 quotation mark
+ 133 => 8230, # horizontal ellipsis
+ 134 => 8224, # dagger
+ 135 => 8225, # double dagger
+ 136 => 710, # modifier letter circumflex accent
+ 137 => 8240, # per mille sign
+ 138 => 352, # latin capital letter s with caron
+ 139 => 8249, # single left-pointing angle quotation mark
+ 140 => 338, # latin capital ligature oe
+ 142 => 381, # latin capital letter z with caron
+ 145 => 8216, # left single quotation mark
+ 146 => 8217, # right single quotation mark
+ 147 => 8220, # left double quotation mark
+ 148 => 8221, # right double quotation mark
+ 149 => 8226, # bullet
+ 150 => 8211, # en dash
+ 151 => 8212, # em dash
+ 152 => 732, # small tilde
+ 153 => 8482, # trade mark sign
+ 154 => 353, # latin small letter s with caron
+ 155 => 8250, # single right-pointing angle quotation mark
+ 156 => 339, # latin small ligature oe
+ 158 => 382, # latin small letter z with caron
+ 159 => 376, # latin capital letter y with diaeresis
+ }
+
+ # See http://www.w3.org/TR/REC-xml/#dt-chardata for details.
+ PREDEFINED = {
+ 38 => '&', # ampersand
+ 60 => '<', # left angle bracket
+ 62 => '>', # right angle bracket
+ }
+
+ # See http://www.w3.org/TR/REC-xml/#charsets for details.
+ VALID = [
+ 0x9, 0xA, 0xD,
+ (0x20..0xD7FF),
+ (0xE000..0xFFFD),
+ (0x10000..0x10FFFF)
+ ]
+ end
+
+end
+
+
+######################################################################
+# Enhance the Fixnum class with a XML escaped character conversion.
+#
+class Fixnum
+ XChar = Builder::XChar if ! defined?(XChar)
+
+ # XML escaped version of chr
+ def xchr
+ n = XChar::CP1252[self] || self
+ case n when *XChar::VALID
+ XChar::PREDEFINED[n] or (n<128 ? n.chr : "#{n};")
+ else
+ '*'
+ end
+ end
+end
+
+
+######################################################################
+# Enhance the String class with a XML escaped character version of
+# to_s.
+#
+class String
+ # XML escaped version of to_s
+ def to_xs
+ unpack('U*').map {|n| n.xchr}.join # ASCII, UTF-8
+ rescue
+ unpack('C*').map {|n| n.xchr}.join # ISO-8859-1, WIN-1252
+ end
+end
diff --git a/vendor/gems/gems/builder-2.1.2/lib/builder/xmlbase.rb b/vendor/gems/gems/builder-2.1.2/lib/builder/xmlbase.rb
new file mode 100755
index 00000000..8e13483b
--- /dev/null
+++ b/vendor/gems/gems/builder-2.1.2/lib/builder/xmlbase.rb
@@ -0,0 +1,139 @@
+#!/usr/bin/env ruby
+
+require 'builder/blankslate'
+
+module Builder
+
+ # Generic error for builder
+ class IllegalBlockError < RuntimeError; end
+
+ # XmlBase is a base class for building XML builders. See
+ # Builder::XmlMarkup and Builder::XmlEvents for examples.
+ class XmlBase < BlankSlate
+
+ # Create an XML markup builder.
+ #
+ # out:: Object receiving the markup. +out+ must respond to
+ # << .
+ # indent:: Number of spaces used for indentation (0 implies no
+ # indentation and no line breaks).
+ # initial:: Level of initial indentation.
+ #
+ def initialize(indent=0, initial=0)
+ @indent = indent
+ @level = initial
+ end
+
+ # Create a tag named +sym+. Other than the first argument which
+ # is the tag name, the arguements are the same as the tags
+ # implemented via method_missing .
+ def tag!(sym, *args, &block)
+ method_missing(sym.to_sym, *args, &block)
+ end
+
+ # Create XML markup based on the name of the method. This method
+ # is never invoked directly, but is called for each markup method
+ # in the markup block.
+ def method_missing(sym, *args, &block)
+ text = nil
+ attrs = nil
+ sym = "#{sym}:#{args.shift}" if args.first.kind_of?(Symbol)
+ args.each do |arg|
+ case arg
+ when Hash
+ attrs ||= {}
+ attrs.merge!(arg)
+ else
+ text ||= ''
+ text << arg.to_s
+ end
+ end
+ if block
+ unless text.nil?
+ raise ArgumentError, "XmlMarkup cannot mix a text argument with a block"
+ end
+ _indent
+ _start_tag(sym, attrs)
+ _newline
+ _nested_structures(block)
+ _indent
+ _end_tag(sym)
+ _newline
+ elsif text.nil?
+ _indent
+ _start_tag(sym, attrs, true)
+ _newline
+ else
+ _indent
+ _start_tag(sym, attrs)
+ text! text
+ _end_tag(sym)
+ _newline
+ end
+ @target
+ end
+
+ # Append text to the output target. Escape any markup. May be
+ # used within the markup brakets as:
+ #
+ # builder.p { |b| b.br; b.text! "HI" } #=>
HI
+ def text!(text)
+ _text(_escape(text))
+ end
+
+ # Append text to the output target without escaping any markup.
+ # May be used within the markup brakets as:
+ #
+ # builder.p { |x| x << " HI" } #=> HI
+ #
+ # This is useful when using non-builder enabled software that
+ # generates strings. Just insert the string directly into the
+ # builder without changing the inserted markup.
+ #
+ # It is also useful for stacking builder objects. Builders only
+ # use << to append to the target, so by supporting this
+ # method/operation builders can use other builders as their
+ # targets.
+ def <<(text)
+ _text(text)
+ end
+
+ # For some reason, nil? is sent to the XmlMarkup object. If nil?
+ # is not defined and method_missing is invoked, some strange kind
+ # of recursion happens. Since nil? won't ever be an XML tag, it
+ # is pretty safe to define it here. (Note: this is an example of
+ # cargo cult programming,
+ # cf. http://fishbowl.pastiche.org/2004/10/13/cargo_cult_programming).
+ def nil?
+ false
+ end
+
+ private
+
+ require 'builder/xchar'
+ def _escape(text)
+ text.to_xs
+ end
+
+ def _escape_quote(text)
+ _escape(text).gsub(%r{"}, '"') # " WART
+ end
+
+ def _newline
+ return if @indent == 0
+ text! "\n"
+ end
+
+ def _indent
+ return if @indent == 0 || @level == 0
+ text!(" " * (@level * @indent))
+ end
+
+ def _nested_structures(block)
+ @level += 1
+ block.call(self)
+ ensure
+ @level -= 1
+ end
+ end
+end
diff --git a/vendor/gems/gems/builder-2.1.2/lib/builder/xmlevents.rb b/vendor/gems/gems/builder-2.1.2/lib/builder/xmlevents.rb
new file mode 100755
index 00000000..91fcd21e
--- /dev/null
+++ b/vendor/gems/gems/builder-2.1.2/lib/builder/xmlevents.rb
@@ -0,0 +1,63 @@
+#!/usr/bin/env ruby
+
+#--
+# Copyright 2004 by Jim Weirich (jim@weirichhouse.org).
+# All rights reserved.
+
+# Permission is granted for use, copying, modification, distribution,
+# and distribution of modified versions of this work as long as the
+# above copyright notice is included.
+#++
+
+require 'builder/xmlmarkup'
+
+module Builder
+
+ # Create a series of SAX-like XML events (e.g. start_tag, end_tag)
+ # from the markup code. XmlEvent objects are used in a way similar
+ # to XmlMarkup objects, except that a series of events are generated
+ # and passed to a handler rather than generating character-based
+ # markup.
+ #
+ # Usage:
+ # xe = Builder::XmlEvents.new(hander)
+ # xe.title("HI") # Sends start_tag/end_tag/text messages to the handler.
+ #
+ # Indentation may also be selected by providing value for the
+ # indentation size and initial indentation level.
+ #
+ # xe = Builder::XmlEvents.new(handler, indent_size, initial_indent_level)
+ #
+ # == XML Event Handler
+ #
+ # The handler object must expect the following events.
+ #
+ # [start_tag(tag, attrs) ]
+ # Announces that a new tag has been found. +tag+ is the name of
+ # the tag and +attrs+ is a hash of attributes for the tag.
+ #
+ # [end_tag(tag) ]
+ # Announces that an end tag for +tag+ has been found.
+ #
+ # [text(text) ]
+ # Announces that a string of characters (+text+) has been found.
+ # A series of characters may be broken up into more than one
+ # +text+ call, so the client cannot assume that a single
+ # callback contains all the text data.
+ #
+ class XmlEvents < XmlMarkup
+ def text!(text)
+ @target.text(text)
+ end
+
+ def _start_tag(sym, attrs, end_too=false)
+ @target.start_tag(sym, attrs)
+ _end_tag(sym) if end_too
+ end
+
+ def _end_tag(sym)
+ @target.end_tag(sym)
+ end
+ end
+
+end
diff --git a/vendor/gems/gems/builder-2.1.2/lib/builder/xmlmarkup.rb b/vendor/gems/gems/builder-2.1.2/lib/builder/xmlmarkup.rb
new file mode 100755
index 00000000..abc5666a
--- /dev/null
+++ b/vendor/gems/gems/builder-2.1.2/lib/builder/xmlmarkup.rb
@@ -0,0 +1,328 @@
+#!/usr/bin/env ruby
+#--
+# Copyright 2004, 2005 by Jim Weirich (jim@weirichhouse.org).
+# All rights reserved.
+
+# Permission is granted for use, copying, modification, distribution,
+# and distribution of modified versions of this work as long as the
+# above copyright notice is included.
+#++
+
+# Provide a flexible and easy to use Builder for creating XML markup.
+# See XmlBuilder for usage details.
+
+require 'builder/xmlbase'
+
+module Builder
+
+ # Create XML markup easily. All (well, almost all) methods sent to
+ # an XmlMarkup object will be translated to the equivalent XML
+ # markup. Any method with a block will be treated as an XML markup
+ # tag with nested markup in the block.
+ #
+ # Examples will demonstrate this easier than words. In the
+ # following, +xm+ is an +XmlMarkup+ object.
+ #
+ # xm.em("emphasized") # => emphasized
+ # xm.em { xmm.b("emp & bold") } # => emph & bold
+ # xm.a("A Link", "href"=>"http://onestepback.org")
+ # # => A Link
+ # xm.div { br } # =>
+ # xm.target("name"=>"compile", "option"=>"fast")
+ # # =>
+ # # NOTE: order of attributes is not specified.
+ #
+ # xm.instruct! #
+ # xm.html { #
+ # xm.head { #
+ # xm.title("History") # History
+ # } #
+ # xm.body { #
+ # xm.comment! "HI" #
+ # xm.h1("Header") # Header
+ # xm.p("paragraph") # paragraph
+ # } #
+ # } #
+ #
+ # == Notes:
+ #
+ # * The order that attributes are inserted in markup tags is
+ # undefined.
+ #
+ # * Sometimes you wish to insert text without enclosing tags. Use
+ # the text! method to accomplish this.
+ #
+ # Example:
+ #
+ # xm.div { #
+ # xm.text! "line"; xm.br # line
+ # xm.text! "another line"; xmbr # another line
+ # } #
+ #
+ # * The special XML characters <, >, and & are converted to <,
+ # > and & automatically. Use the << operation to
+ # insert text without modification.
+ #
+ # * Sometimes tags use special characters not allowed in ruby
+ # identifiers. Use the tag! method to handle these
+ # cases.
+ #
+ # Example:
+ #
+ # xml.tag!("SOAP:Envelope") { ... }
+ #
+ # will produce ...
+ #
+ # ... "
+ #
+ # tag! will also take text and attribute arguments (after
+ # the tag name) like normal markup methods. (But see the next
+ # bullet item for a better way to handle XML namespaces).
+ #
+ # * Direct support for XML namespaces is now available. If the
+ # first argument to a tag call is a symbol, it will be joined to
+ # the tag to produce a namespace:tag combination. It is easier to
+ # show this than describe it.
+ #
+ # xml.SOAP :Envelope do ... end
+ #
+ # Just put a space before the colon in a namespace to produce the
+ # right form for builder (e.g. "SOAP:Envelope " =>
+ # "xml.SOAP :Envelope ")
+ #
+ # * XmlMarkup builds the markup in any object (called a _target_)
+ # that accepts the << method. If no target is given,
+ # then XmlMarkup defaults to a string target.
+ #
+ # Examples:
+ #
+ # xm = Builder::XmlMarkup.new
+ # result = xm.title("yada")
+ # # result is a string containing the markup.
+ #
+ # buffer = ""
+ # xm = Builder::XmlMarkup.new(buffer)
+ # # The markup is appended to buffer (using <<)
+ #
+ # xm = Builder::XmlMarkup.new(STDOUT)
+ # # The markup is written to STDOUT (using <<)
+ #
+ # xm = Builder::XmlMarkup.new
+ # x2 = Builder::XmlMarkup.new(:target=>xm)
+ # # Markup written to +x2+ will be send to +xm+.
+ #
+ # * Indentation is enabled by providing the number of spaces to
+ # indent for each level as a second argument to XmlBuilder.new.
+ # Initial indentation may be specified using a third parameter.
+ #
+ # Example:
+ #
+ # xm = Builder.new(:indent=>2)
+ # # xm will produce nicely formatted and indented XML.
+ #
+ # xm = Builder.new(:indent=>2, :margin=>4)
+ # # xm will produce nicely formatted and indented XML with 2
+ # # spaces per indent and an over all indentation level of 4.
+ #
+ # builder = Builder::XmlMarkup.new(:target=>$stdout, :indent=>2)
+ # builder.name { |b| b.first("Jim"); b.last("Weirich) }
+ # # prints:
+ # #
+ # # Jim
+ # # Weirich
+ # #
+ #
+ # * The instance_eval implementation which forces self to refer to
+ # the message receiver as self is now obsolete. We now use normal
+ # block calls to execute the markup block. This means that all
+ # markup methods must now be explicitly send to the xml builder.
+ # For instance, instead of
+ #
+ # xml.div { strong("text") }
+ #
+ # you need to write:
+ #
+ # xml.div { xml.strong("text") }
+ #
+ # Although more verbose, the subtle change in semantics within the
+ # block was found to be prone to error. To make this change a
+ # little less cumbersome, the markup block now gets the markup
+ # object sent as an argument, allowing you to use a shorter alias
+ # within the block.
+ #
+ # For example:
+ #
+ # xml_builder = Builder::XmlMarkup.new
+ # xml_builder.div { |xml|
+ # xml.stong("text")
+ # }
+ #
+ class XmlMarkup < XmlBase
+
+ # Create an XML markup builder. Parameters are specified by an
+ # option hash.
+ #
+ # :target=>target_object ::
+ # Object receiving the markup. +out+ must respond to the
+ # << operator. The default is a plain string target.
+ #
+ # :indent=>indentation ::
+ # Number of spaces used for indentation. The default is no
+ # indentation and no line breaks.
+ #
+ # :margin=>initial_indentation_level ::
+ # Amount of initial indentation (specified in levels, not
+ # spaces).
+ #
+ # :escape_attrs=>OBSOLETE::
+ # The :escape_attrs option is no longer supported by builder
+ # (and will be quietly ignored). String attribute values are
+ # now automatically escaped. If you need unescaped attribute
+ # values (perhaps you are using entities in the attribute
+ # values), then give the value as a Symbol. This allows much
+ # finer control over escaping attribute values.
+ #
+ def initialize(options={})
+ indent = options[:indent] || 0
+ margin = options[:margin] || 0
+ super(indent, margin)
+ @target = options[:target] || ""
+ end
+
+ # Return the target of the builder.
+ def target!
+ @target
+ end
+
+ def comment!(comment_text)
+ _ensure_no_block block_given?
+ _special("", comment_text, nil)
+ end
+
+ # Insert an XML declaration into the XML markup.
+ #
+ # For example:
+ #
+ # xml.declare! :ELEMENT, :blah, "yada"
+ # # =>
+ def declare!(inst, *args, &block)
+ _indent
+ @target << ""
+ _newline
+ end
+
+ # Insert a processing instruction into the XML markup. E.g.
+ #
+ # For example:
+ #
+ # xml.instruct!
+ # #=>
+ # xml.instruct! :aaa, :bbb=>"ccc"
+ # #=>
+ #
+ def instruct!(directive_tag=:xml, attrs={})
+ _ensure_no_block block_given?
+ if directive_tag == :xml
+ a = { :version=>"1.0", :encoding=>"UTF-8" }
+ attrs = a.merge attrs
+ end
+ _special(
+ "#{directive_tag}",
+ "?>",
+ nil,
+ attrs,
+ [:version, :encoding, :standalone])
+ end
+
+ # Insert a CDATA section into the XML markup.
+ #
+ # For example:
+ #
+ # xml.cdata!("text to be included in cdata")
+ # #=>
+ #
+ def cdata!(text)
+ _ensure_no_block block_given?
+ _special("", text, nil)
+ end
+
+ private
+
+ # NOTE: All private methods of a builder object are prefixed when
+ # a "_" character to avoid possible conflict with XML tag names.
+
+ # Insert text directly in to the builder's target.
+ def _text(text)
+ @target << text
+ end
+
+ # Insert special instruction.
+ def _special(open, close, data=nil, attrs=nil, order=[])
+ _indent
+ @target << open
+ @target << data if data
+ _insert_attributes(attrs, order) if attrs
+ @target << close
+ _newline
+ end
+
+ # Start an XML tag. If end_too is true, then the start
+ # tag is also the end tag (e.g.
+ def _start_tag(sym, attrs, end_too=false)
+ @target << "<#{sym}"
+ _insert_attributes(attrs)
+ @target << "/" if end_too
+ @target << ">"
+ end
+
+ # Insert an ending tag.
+ def _end_tag(sym)
+ @target << "#{sym}>"
+ end
+
+ # Insert the attributes (given in the hash).
+ def _insert_attributes(attrs, order=[])
+ return if attrs.nil?
+ order.each do |k|
+ v = attrs[k]
+ @target << %{ #{k}="#{_attr_value(v)}"} if v # " WART
+ end
+ attrs.each do |k, v|
+ @target << %{ #{k}="#{_attr_value(v)}"} unless order.member?(k) # " WART
+ end
+ end
+
+ def _attr_value(value)
+ case value
+ when Symbol
+ value.to_s
+ else
+ _escape_quote(value.to_s)
+ end
+ end
+
+ def _ensure_no_block(got_block)
+ if got_block
+ fail IllegalBlockError,
+ "Blocks are not allowed on XML instructions"
+ end
+ end
+
+ end
+
+end
diff --git a/vendor/gems/gems/builder-2.1.2/scripts/publish.rb b/vendor/gems/gems/builder-2.1.2/scripts/publish.rb
new file mode 100755
index 00000000..76657c67
--- /dev/null
+++ b/vendor/gems/gems/builder-2.1.2/scripts/publish.rb
@@ -0,0 +1,17 @@
+# Optional publish task for Rake
+
+require 'rake/contrib/sshpublisher'
+require 'rake/contrib/rubyforgepublisher'
+
+publisher = Rake::CompositePublisher.new
+publisher.add Rake::RubyForgePublisher.new('builder', 'jimweirich')
+publisher.add Rake::SshFilePublisher.new(
+ 'umlcoop',
+ 'htdocs/software/builder',
+ '.',
+ 'builder.blurb')
+
+desc "Publish the Documentation to RubyForge."
+task :publish => [:rdoc] do
+ publisher.upload
+end
diff --git a/vendor/gems/gems/builder-2.1.2/test/performance.rb b/vendor/gems/gems/builder-2.1.2/test/performance.rb
new file mode 100755
index 00000000..2d61bd53
--- /dev/null
+++ b/vendor/gems/gems/builder-2.1.2/test/performance.rb
@@ -0,0 +1,30 @@
+#!/usr/bin/env ruby
+
+require 'builder/xmlmarkup'
+require 'benchmark'
+
+text = "This is a test of the new xml markup. Iñtërnâtiônàlizætiøn\n" * 10000
+
+include Benchmark # we need the CAPTION and FMTSTR constants
+include Builder
+n = 50
+Benchmark.benchmark do |bm|
+ tf = bm.report("base") {
+ n.times do
+ x = XmlMarkup.new
+ x.text(text)
+ x.target!
+ end
+ }
+ def XmlMarkup._escape(text)
+ text.to_xs
+ end
+ tf = bm.report("to_xs") {
+ n.times do
+ x = XmlMarkup.new
+ x.text(text)
+ x.target!
+ end
+ }
+end
+
diff --git a/vendor/gems/gems/builder-2.1.2/test/preload.rb b/vendor/gems/gems/builder-2.1.2/test/preload.rb
new file mode 100755
index 00000000..daab3272
--- /dev/null
+++ b/vendor/gems/gems/builder-2.1.2/test/preload.rb
@@ -0,0 +1,29 @@
+#!/usr/bin/env ruby
+
+# We are defining method_added in Kernel and Object so that when
+# BlankSlate overrides them later, we can verify that it correctly
+# calls the older hooks.
+
+module Kernel
+ class << self
+ attr_reader :k_added_names
+ alias_method :preload_method_added, :method_added
+ def method_added(name)
+ preload_method_added(name)
+ @k_added_names ||= []
+ @k_added_names << name
+ end
+ end
+end
+
+class Object
+ class << self
+ attr_reader :o_added_names
+ alias_method :preload_method_added, :method_added
+ def method_added(name)
+ preload_method_added(name)
+ @o_added_names ||= []
+ @o_added_names << name
+ end
+ end
+end
diff --git a/vendor/gems/gems/builder-2.1.2/test/test_xchar.rb b/vendor/gems/gems/builder-2.1.2/test/test_xchar.rb
new file mode 100755
index 00000000..fb8c53a1
--- /dev/null
+++ b/vendor/gems/gems/builder-2.1.2/test/test_xchar.rb
@@ -0,0 +1,37 @@
+#!/usr/bin/env ruby
+
+require 'test/unit'
+require 'builder/xchar'
+
+class TestXmlEscaping < Test::Unit::TestCase
+ def test_ascii
+ assert_equal 'abc', 'abc'.to_xs
+ end
+
+ def test_predefined
+ assert_equal '&', '&'.to_xs # ampersand
+ assert_equal '<', '<'.to_xs # left angle bracket
+ assert_equal '>', '>'.to_xs # right angle bracket
+ end
+
+ def test_invalid
+ assert_equal '*', "\x00".to_xs # null
+ assert_equal '*', "\x0C".to_xs # form feed
+ assert_equal '*', "\xEF\xBF\xBF".to_xs # U+FFFF
+ end
+
+ def test_iso_8859_1
+ assert_equal 'ç', "\xE7".to_xs # small c cedilla
+ assert_equal '©', "\xA9".to_xs # copyright symbol
+ end
+
+ def test_win_1252
+ assert_equal '’', "\x92".to_xs # smart quote
+ assert_equal '€', "\x80".to_xs # euro
+ end
+
+ def test_utf8
+ assert_equal '’', "\xE2\x80\x99".to_xs # right single quote
+ assert_equal '©', "\xC2\xA9".to_xs # copy
+ end
+end
diff --git a/vendor/gems/gems/builder-2.1.2/test/testblankslate.rb b/vendor/gems/gems/builder-2.1.2/test/testblankslate.rb
new file mode 100755
index 00000000..ae5794ed
--- /dev/null
+++ b/vendor/gems/gems/builder-2.1.2/test/testblankslate.rb
@@ -0,0 +1,183 @@
+#!/usr/bin/env ruby
+
+require 'test/unit'
+require 'test/preload'
+require 'builder/blankslate'
+require 'stringio'
+
+# Methods to be introduced into the Object class late.
+module LateObject
+ def late_object
+ 33
+ end
+ def LateObject.included(mod)
+ # Modules defining an included method should not prevent blank
+ # slate erasure!
+ end
+end
+
+# Methods to be introduced into the Kernel module late.
+module LateKernel
+ def late_kernel
+ 44
+ end
+ def LateKernel.included(mod)
+ # Modules defining an included method should not prevent blank
+ # slate erasure!
+ end
+end
+
+# Introduce some late methods (both module and direct) into the Kernel
+# module.
+module Kernel
+ include LateKernel
+
+ def late_addition
+ 1234
+ end
+
+ def double_late_addition
+ 11
+ end
+
+ def double_late_addition
+ 22
+ end
+end
+
+
+# Introduce some late methods (both module and direct) into the Object
+# class.
+class Object
+ include LateObject
+ def another_late_addition
+ 4321
+ end
+end
+
+# Introduce some late methods by inclusion.
+module GlobalModule
+ def global_inclusion
+ 42
+ end
+end
+include GlobalModule
+
+def direct_global
+ 43
+end
+
+######################################################################
+# Test case for blank slate.
+#
+class TestBlankSlate < Test::Unit::TestCase
+ def setup
+ @bs = BlankSlate.new
+ end
+
+ def test_undefined_methods_remain_undefined
+ assert_raise(NoMethodError) { @bs.no_such_method }
+ assert_raise(NoMethodError) { @bs.nil? }
+ end
+
+
+ # NOTE: NameError is acceptable because the lack of a '.' means that
+ # Ruby can't tell if it is a method or a local variable.
+ def test_undefined_methods_remain_undefined_during_instance_eval
+ assert_raise(NoMethodError, NameError) do
+ @bs.instance_eval do nil? end
+ end
+ assert_raise(NoMethodError, NameError) do
+ @bs.instance_eval do no_such_method end
+ end
+ end
+
+ def test_private_methods_are_undefined
+ assert_raise(NoMethodError) do
+ @bs.puts "HI"
+ end
+ end
+
+ def test_targetted_private_methods_are_undefined_during_instance_eval
+ assert_raise(NoMethodError, NameError) do
+ @bs.instance_eval do self.puts "HI" end
+ end
+ end
+
+ def test_untargetted_private_methods_are_defined_during_instance_eval
+ oldstdout = $stdout
+ $stdout = StringIO.new
+ @bs.instance_eval do
+ puts "HI"
+ end
+ ensure
+ $stdout = oldstdout
+ end
+
+ def test_methods_added_late_to_kernel_remain_undefined
+ assert_equal 1234, nil.late_addition
+ assert_raise(NoMethodError) { @bs.late_addition }
+ end
+
+ def test_methods_added_late_to_object_remain_undefined
+ assert_equal 4321, nil.another_late_addition
+ assert_raise(NoMethodError) { @bs.another_late_addition }
+ end
+
+ def test_methods_added_late_to_global_remain_undefined
+ assert_equal 42, global_inclusion
+ assert_raise(NoMethodError) { @bs.global_inclusion }
+ end
+
+ def test_preload_method_added
+ assert Kernel.k_added_names.include?(:late_addition)
+ assert Object.o_added_names.include?(:another_late_addition)
+ end
+
+ def test_method_defined_late_multiple_times_remain_undefined
+ assert_equal 22, nil.double_late_addition
+ assert_raise(NoMethodError) { @bs.double_late_addition }
+ end
+
+ def test_late_included_module_in_object_is_ok
+ assert_equal 33, 1.late_object
+ assert_raise(NoMethodError) { @bs.late_object }
+ end
+
+ def test_late_included_module_in_kernel_is_ok
+ assert_raise(NoMethodError) { @bs.late_kernel }
+ end
+
+ def test_revealing_previously_hidden_methods_are_callable
+ with_to_s = Class.new(BlankSlate) do
+ reveal :to_s
+ end
+ assert_match /^#<.*>$/, with_to_s.new.to_s
+ end
+
+ def test_revealing_a_hidden_method_twice_is_ok
+ with_to_s = Class.new(BlankSlate) do
+ reveal :to_s
+ reveal :to_s
+ end
+ assert_match /^#<.*>$/, with_to_s.new.to_s
+ end
+
+ def test_revealing_unknown_hidden_method_is_an_error
+ assert_raises(RuntimeError) do
+ Class.new(BlankSlate) do
+ reveal :xyz
+ end
+ end
+ end
+
+ def test_global_includes_still_work
+ assert_nothing_raised do
+ assert_equal 42, global_inclusion
+ assert_equal 42, Object.new.global_inclusion
+ assert_equal 42, "magic number".global_inclusion
+ assert_equal 43, direct_global
+ end
+ end
+end
+
diff --git a/vendor/gems/gems/builder-2.1.2/test/testeventbuilder.rb b/vendor/gems/gems/builder-2.1.2/test/testeventbuilder.rb
new file mode 100755
index 00000000..2d603717
--- /dev/null
+++ b/vendor/gems/gems/builder-2.1.2/test/testeventbuilder.rb
@@ -0,0 +1,133 @@
+class TestEvents < Test::Unit::TestCase
+
+ class Target
+ attr_reader :events
+
+ def initialize
+ @events = []
+ end
+
+ def start_tag(tag, attrs)
+ @events << [:start_tag, tag, attrs]
+ end
+
+ def end_tag(tag)
+ @events << [:end_tag, tag]
+ end
+
+ def text(string)
+ @events << [:text, string]
+ end
+
+ end
+
+
+ def setup
+ @target = Target.new
+ @xml = Builder::XmlEvents.new(:target=>@target)
+ end
+
+ def test_simple
+ @xml.one
+ expect [:start_tag, :one, nil]
+ expect [:end_tag, :one]
+ expect_done
+ end
+
+ def test_nested
+ @xml.one { @xml.two }
+ expect [:start_tag, :one, nil]
+ expect [:start_tag, :two, nil]
+ expect [:end_tag, :two]
+ expect [:end_tag, :one]
+ expect_done
+ end
+
+ def test_text
+ @xml.one("a")
+ expect [:start_tag, :one, nil]
+ expect [:text, "a"]
+ expect [:end_tag, :one]
+ expect_done
+ end
+
+ def test_special_text
+ @xml.one("H&R")
+ expect [:start_tag, :one, nil]
+ expect [:text, "H&R"]
+ expect [:end_tag, :one]
+ expect_done
+ end
+
+ def test_text_with_entity
+ @xml.one("H&R")
+ expect [:start_tag, :one, nil]
+ expect [:text, "H&R"]
+ expect [:end_tag, :one]
+ expect_done
+ end
+
+ def test_attributes
+ @xml.a(:b=>"c", :x=>"y")
+ expect [:start_tag, :a, {:x => "y", :b => "c"}]
+ expect [:end_tag, :a]
+ expect_done
+ end
+
+ def test_moderately_complex
+ @xml.tag! "address-book" do |x|
+ x.entry :id=>"1" do
+ x.name {
+ x.first "Bill"
+ x.last "Smith"
+ }
+ x.address "Cincinnati"
+ end
+ x.entry :id=>"2" do
+ x.name {
+ x.first "John"
+ x.last "Doe"
+ }
+ x.address "Columbus"
+ end
+ end
+ expect [:start_tag, "address-book".intern, nil]
+ expect [:start_tag, :entry, {:id => "1"}]
+ expect [:start_tag, :name, nil]
+ expect [:start_tag, :first, nil]
+ expect [:text, "Bill"]
+ expect [:end_tag, :first]
+ expect [:start_tag, :last, nil]
+ expect [:text, "Smith"]
+ expect [:end_tag, :last]
+ expect [:end_tag, :name]
+ expect [:start_tag, :address, nil]
+ expect [:text, "Cincinnati"]
+ expect [:end_tag, :address]
+ expect [:end_tag, :entry]
+ expect [:start_tag, :entry, {:id => "2"}]
+ expect [:start_tag, :name, nil]
+ expect [:start_tag, :first, nil]
+ expect [:text, "John"]
+ expect [:end_tag, :first]
+ expect [:start_tag, :last, nil]
+ expect [:text, "Doe"]
+ expect [:end_tag, :last]
+ expect [:end_tag, :name]
+ expect [:start_tag, :address, nil]
+ expect [:text, "Columbus"]
+ expect [:end_tag, :address]
+ expect [:end_tag, :entry]
+ expect [:end_tag, "address-book".intern]
+ expect_done
+ end
+
+ def expect(value)
+ assert_equal value, @target.events.shift
+ end
+
+ def expect_done
+ assert_nil @target.events.shift
+ end
+
+end
diff --git a/vendor/gems/gems/builder-2.1.2/test/testmarkupbuilder.rb b/vendor/gems/gems/builder-2.1.2/test/testmarkupbuilder.rb
new file mode 100755
index 00000000..ad173143
--- /dev/null
+++ b/vendor/gems/gems/builder-2.1.2/test/testmarkupbuilder.rb
@@ -0,0 +1,449 @@
+#!/usr/bin/env ruby
+
+#--
+# Portions copyright 2004 by Jim Weirich (jim@weirichhouse.org).
+# Portions copyright 2005 by Sam Ruby (rubys@intertwingly.net).
+# All rights reserved.
+
+# Permission is granted for use, copying, modification, distribution,
+# and distribution of modified versions of this work as long as the
+# above copyright notice is included.
+#++
+
+require 'test/unit'
+require 'test/preload'
+require 'builder'
+require 'builder/xmlmarkup'
+
+class TestMarkup < Test::Unit::TestCase
+ def setup
+ @xml = Builder::XmlMarkup.new
+ end
+
+ def test_create
+ assert_not_nil @xml
+ end
+
+ def test_simple
+ @xml.simple
+ assert_equal " ", @xml.target!
+ end
+
+ def test_value
+ @xml.value("hi")
+ assert_equal "hi ", @xml.target!
+ end
+
+ def test_nested
+ @xml.outer { |x| x.inner("x") }
+ assert_equal "x ", @xml.target!
+ end
+
+ def test_attributes
+ @xml.ref(:id => 12)
+ assert_equal %{}, @xml.target!
+ end
+
+ def test_string_attributes_are_quoted_by_default
+ @xml.ref(:id => "H&R")
+ assert_equal %{}, @xml.target!
+ end
+
+ def test_symbol_attributes_are_unquoted_by_default
+ @xml.ref(:id => :"H&R")
+ assert_equal %{}, @xml.target!
+ end
+
+ def test_attributes_quoted_can_be_turned_on
+ @xml = Builder::XmlMarkup.new
+ @xml.ref(:id => "")
+ assert_equal %{}, @xml.target!
+ end
+
+ def test_mixed_attribute_quoting_with_nested_builders
+ x = Builder::XmlMarkup.new(:target=>@xml)
+ @xml.ref(:id=>:"H&R") {
+ x.element(:tag=>"Long&Short")
+ }
+ assert_equal "",
+ @xml.target!
+ end
+
+ def test_multiple_attributes
+ @xml.ref(:id => 12, :name => "bill")
+ assert_match %r{^$}, @xml.target!
+ end
+
+ def test_attributes_with_text
+ @xml.a("link", :href=>"http://onestepback.org")
+ assert_equal %{link }, @xml.target!
+ end
+
+ def test_complex
+ @xml.body(:bg=>"#ffffff") { |x|
+ x.title("T", :style=>"red")
+ }
+ assert_equal %{T }, @xml.target!
+ end
+
+ def test_funky_symbol
+ @xml.tag!("non-ruby-token", :id=>1) { |x| x.ok }
+ assert_equal %{ }, @xml.target!
+ end
+
+ def test_tag_can_handle_private_method
+ @xml.tag!("loop", :id=>1) { |x| x.ok }
+ assert_equal %{ }, @xml.target!
+ end
+
+ def test_no_explicit_marker
+ @xml.p { |x| x.b("HI") }
+ assert_equal "HI
", @xml.target!
+ end
+
+ def test_reference_local_vars
+ n = 3
+ @xml.ol { |x| n.times { x.li(n) } }
+ assert_equal "3 3 3 ", @xml.target!
+ end
+
+ def test_reference_methods
+ @xml.title { |x| x.a { x.b(name) } }
+ assert_equal "bob ", @xml.target!
+ end
+
+ def test_append_text
+ @xml.p { |x| x.br; x.text! "HI" }
+ assert_equal " HI
", @xml.target!
+ end
+
+ def test_ambiguous_markup
+ ex = assert_raises(ArgumentError) {
+ @xml.h1("data1") { b }
+ }
+ assert_match /\btext\b/, ex.message
+ assert_match /\bblock\b/, ex.message
+ end
+
+ def test_capitalized_method
+ @xml.P { |x| x.B("hi"); x.BR(); x.EM { x.text! "world" } }
+ assert_equal "hi world
", @xml.target!
+ end
+
+ def test_escaping
+ @xml.div { |x| x.text! ""; x.em("H&R Block") }
+ assert_equal %{<hi>H&R Block
}, @xml.target!
+ end
+
+ def test_non_escaping
+ @xml.div("ns:xml"=>:"&xml;") { |x| x << ""; x.em("H&R Block") }
+ assert_equal %{H&R Block
}, @xml.target!
+ end
+
+ def test_return_value
+ str = @xml.x("men")
+ assert_equal @xml.target!, str
+ end
+
+ def test_stacked_builders
+ b = Builder::XmlMarkup.new( :target => @xml )
+ b.div { @xml.span { @xml.a("text", :href=>"ref") } }
+ assert_equal "", @xml.target!
+ end
+
+ def name
+ "bob"
+ end
+end
+
+class TestAttributeEscaping < Test::Unit::TestCase
+
+ def setup
+ @xml = Builder::XmlMarkup.new
+ end
+
+ def test_element_gt
+ @xml.title('1<2')
+ assert_equal '1<2 ', @xml.target!
+ end
+
+ def test_element_amp
+ @xml.title('AT&T')
+ assert_equal 'AT&T ', @xml.target!
+ end
+
+ def test_element_amp2
+ @xml.title('&')
+ assert_equal '& ', @xml.target!
+ end
+
+ def test_attr_less
+ @xml.a(:title => '2>1')
+ assert_equal ' ', @xml.target!
+ end
+
+ def test_attr_amp
+ @xml.a(:title => 'AT&T')
+ assert_equal ' ', @xml.target!
+ end
+
+ def test_attr_quot
+ @xml.a(:title => '"x"')
+ assert_equal ' ', @xml.target!
+ end
+
+end
+
+class TestNameSpaces < Test::Unit::TestCase
+ def setup
+ @xml = Builder::XmlMarkup.new(:indent=>2)
+ end
+
+ def test_simple_name_spaces
+ @xml.rdf :RDF
+ assert_equal " \n", @xml.target!
+ end
+
+ def test_long
+ xml = Builder::XmlMarkup.new(:indent=>2)
+ xml.instruct!
+ xml.rdf :RDF,
+ "xmlns:rdf" => :"&rdf;",
+ "xmlns:rdfs" => :"&rdfs;",
+ "xmlns:xsd" => :"&xsd;",
+ "xmlns:owl" => :"&owl;" do
+ xml.owl :Class, :'rdf:ID'=>'Bird' do
+ xml.rdfs :label, 'bird'
+ xml.rdfs :subClassOf do
+ xml.owl :Restriction do
+ xml.owl :onProperty, 'rdf:resource'=>'#wingspan'
+ xml.owl :maxCardinality,1,'rdf:datatype'=>'&xsd;nonNegativeInteger'
+ end
+ end
+ end
+ end
+ assert_match /^<\?xml/, xml.target!
+ assert_match /\n/m, xml.target!
+ end
+
+end
+
+class TestDeclarations < Test::Unit::TestCase
+ def setup
+ @xml = Builder::XmlMarkup.new(:indent=>2)
+ end
+
+ def test_declare
+ @xml.declare! :element
+ assert_equal "\n", @xml.target!
+ end
+
+ def test_bare_arg
+ @xml.declare! :element, :arg
+ assert_equal"\n", @xml.target!
+ end
+
+ def test_string_arg
+ @xml.declare! :element, "string"
+ assert_equal"\n", @xml.target!
+ end
+
+ def test_mixed_args
+ @xml.declare! :element, :x, "y", :z, "-//OASIS//DTD DocBook XML//EN"
+ assert_equal "\n", @xml.target!
+ end
+
+ def test_nested_declarations
+ @xml = Builder::XmlMarkup.new
+ @xml.declare! :DOCTYPE, :chapter do |x|
+ x.declare! :ELEMENT, :chapter, "(title,para+)".intern
+ end
+ assert_equal "]>", @xml.target!
+ end
+
+ def test_nested_indented_declarations
+ @xml.declare! :DOCTYPE, :chapter do |x|
+ x.declare! :ELEMENT, :chapter, "(title,para+)".intern
+ end
+ assert_equal "\n]>\n", @xml.target!
+ end
+
+ def test_complex_declaration
+ @xml.declare! :DOCTYPE, :chapter do |x|
+ x.declare! :ELEMENT, :chapter, "(title,para+)".intern
+ x.declare! :ELEMENT, :title, "(#PCDATA)".intern
+ x.declare! :ELEMENT, :para, "(#PCDATA)".intern
+ end
+ expected = %{
+
+
+]>
+}
+ assert_equal expected, @xml.target!
+ end
+end
+
+
+class TestSpecialMarkup < Test::Unit::TestCase
+ def setup
+ @xml = Builder::XmlMarkup.new(:indent=>2)
+ end
+
+ def test_comment
+ @xml.comment!("COMMENT")
+ assert_equal "\n", @xml.target!
+ end
+
+ def test_indented_comment
+ @xml.p { @xml.comment! "OK" }
+ assert_equal "\n \n
\n", @xml.target!
+ end
+
+ def test_instruct
+ @xml.instruct! :abc, :version=>"0.9"
+ assert_equal "\n", @xml.target!
+ end
+
+ def test_indented_instruct
+ @xml.p { @xml.instruct! :xml }
+ assert_match %r{\n <\?xml version="1.0" encoding="UTF-8"\?>\n
\n},
+ @xml.target!
+ end
+
+ def test_instruct_without_attributes
+ @xml.instruct! :zz
+ assert_equal "\n", @xml.target!
+ end
+
+ def test_xml_instruct
+ @xml.instruct!
+ assert_match /^<\?xml version="1.0" encoding="UTF-8"\?>$/, @xml.target!
+ end
+
+ def test_xml_instruct_with_overrides
+ @xml.instruct! :xml, :encoding=>"UCS-2"
+ assert_match /^<\?xml version="1.0" encoding="UCS-2"\?>$/, @xml.target!
+ end
+
+ def test_xml_instruct_with_standalong
+ @xml.instruct! :xml, :encoding=>"UCS-2", :standalone=>"yes"
+ assert_match /^<\?xml version="1.0" encoding="UCS-2" standalone="yes"\?>$/, @xml.target!
+ end
+
+ def test_no_blocks
+ assert_raises(Builder::IllegalBlockError) do
+ @xml.instruct! { |x| x.hi }
+ end
+ assert_raises(Builder::IllegalBlockError) do
+ @xml.comment!(:element) { |x| x.hi }
+ end
+ end
+
+ def test_cdata
+ @xml.cdata!("TEST")
+ assert_equal "\n", @xml.target!
+ end
+
+ def test_cdata_with_ampersand
+ @xml.cdata!("TEST&CHECK")
+ assert_equal "\n", @xml.target!
+ end
+end
+
+class TestIndentedXmlMarkup < Test::Unit::TestCase
+ def setup
+ @xml = Builder::XmlMarkup.new(:indent=>2)
+ end
+
+ def test_one_level
+ @xml.ol { |x| x.li "text" }
+ assert_equal "\n text \n \n", @xml.target!
+ end
+
+ def test_two_levels
+ @xml.p { |x|
+ x.ol { x.li "text" }
+ x.br
+ }
+ assert_equal "\n
\n text \n \n \n\n", @xml.target!
+ end
+
+ def test_initial_level
+ @xml = Builder::XmlMarkup.new(:indent=>2, :margin=>4)
+ @xml.name { |x| x.first("Jim") }
+ assert_equal " \n Jim \n \n", @xml.target!
+ end
+
+ class TestXmlEvents < Test::Unit::TestCase
+ def setup
+ @handler = EventHandler.new
+ @xe = Builder::XmlEvents.new(:target=>@handler)
+ end
+
+ def test_simple
+ @xe.p
+ assert_equal [:start, :p, nil], @handler.events.shift
+ assert_equal [:end, :p], @handler.events.shift
+ end
+
+ def test_text
+ @xe.p("HI")
+ assert_equal [:start, :p, nil], @handler.events.shift
+ assert_equal [:text, "HI"], @handler.events.shift
+ assert_equal [:end, :p], @handler.events.shift
+ end
+
+ def test_attributes
+ @xe.p("id"=>"2")
+ ev = @handler.events.shift
+ assert_equal [:start, :p], ev[0,2]
+ assert_equal "2", ev[2]['id']
+ assert_equal [:end, :p], @handler.events.shift
+ end
+
+ def test_indented
+ @xml = Builder::XmlEvents.new(:indent=>2, :target=>@handler)
+ @xml.p { |x| x.b("HI") }
+ assert_equal [:start, :p, nil], @handler.events.shift
+ assert_equal "\n ", pop_text
+ assert_equal [:start, :b, nil], @handler.events.shift
+ assert_equal "HI", pop_text
+ assert_equal [:end, :b], @handler.events.shift
+ assert_equal "\n", pop_text
+ assert_equal [:end, :p], @handler.events.shift
+ end
+
+ def pop_text
+ result = ''
+ while ! @handler.events.empty? && @handler.events[0][0] == :text
+ result << @handler.events[0][1]
+ @handler.events.shift
+ end
+ result
+ end
+
+ class EventHandler
+ attr_reader :events
+ def initialize
+ @events = []
+ end
+
+ def start_tag(sym, attrs)
+ @events << [:start, sym, attrs]
+ end
+
+ def end_tag(sym)
+ @events << [:end, sym]
+ end
+
+ def text(txt)
+ @events << [:text, txt]
+ end
+ end
+ end
+
+end
+
diff --git a/vendor/gems/gems/compass-0.8.17/CHANGELOG.markdown b/vendor/gems/gems/compass-0.8.17/CHANGELOG.markdown
new file mode 100755
index 00000000..ce689ca3
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/CHANGELOG.markdown
@@ -0,0 +1,557 @@
+COMPASS CHANGELOG
+=================
+
+0.8.17 (September 24, 2009)
+---------------------------
+
+* The enumerate function now accepts an optional fourth parameter that specifies the separator to be used.
+ Enables fixing a bug in the Compass 960 Plugin.
+
+0.8.16 (September 12, 2009)
+---------------------------
+
+* Fixed a bug in compass that assumed compass extensions would provide stylesheets.
+
+0.8.15 (September 5, 2009)
+--------------------------
+
+* Upgrade the FSSM library to 0.0.6 to fix bugs on windows.
+
+
+0.8.14 (September 2, 2009)
+--------------------------
+
+* Upgrade the FSSM library to 0.0.4 to fix bugs and enable FS Events on Mac OS.
+
+0.8.13 (August 30, 2009)
+------------------------
+
+* [Blueprint] Mixins have been added for these as +prepend-top and +append-bottom and grid classes will be generated by +blueprint-grid.
+* [Command Line] The watch mode has been re-implemented to use the FSSM library by Travis Tilley. OSX users will
+ now have support for filesystem monitoring. Fixes an infinite looping bug that occured with syntax users.
+
+0.8.12 (August 22, 2009)
+------------------------
+
+Bug Fix Release:
+
+* [Compass Core] Bug fix to sprites: fixed width and height assignments for x and y position variables
+* Ruby 1.9.1 fix: binding for parse_string
+* [Rails] Don't suggest creating a stylesheet link to partials.
+
+
+0.8.10 (August 16, 2009)
+------------------------
+Bug Fix Release:
+
+* Write files in binary mode to avoid data corruption when installing images on windows.
+ Fixes [Issue #39](http://github.com/chriseppstein/compass/issues/#issue/39)
+
+0.8.9 (August 9, 2009)
+----------------------
+Bug Fix Release:
+
+* [Blueprint] The default screen.sass generated invalid selectors due to improper nesting. A better fix is coming in the next release.
+
+0.8.8 (July 21, 2009)
+---------------------
+
+Bug Fix Release:
+
+* [Compass Core] Fixed a bug in alternating_rows_and_columns. Improper nesting caused some styles to be improperly rendered.
+ [Commit](http://github.com/chriseppstein/compass/commit/e277ed2cd3fded0b98ddaa87fc4d3b9d37cb7354)
+* [YUI] Fixed a bug in yui grids where the .first div wouldn't get the right styles in some rare cases due to incorrect nesting.
+ [Commit](http://github.com/chriseppstein/compass/commit/4bfcef4f376ee6e5d5a2b47419d2f21ef4c6eff8)
+
+
+0.8.7 (July 09, 2009)
+---------------------
+
+Bug Fix Release:
+
+* Load haml-edge only if it's all new and shiny. Closes GH-26.
+ [Commit](http://github.com/chriseppstein/compass/commit/59a6067b3a67a79bfd9a5ce325fc1be4bb6c9e78)
+* [Blueprint] Added more descriptive comments to the Blueprint IE template.
+ [Commit](http://github.com/chriseppstein/compass/commit/8684966be1e8166a986ae81abd3daf6c44ed4f94)
+* [Rails] Fixed a bug in rails integration if the request is not set on the controller.
+ [Commit](http://github.com/chriseppstein/compass/commit/7fba6028d8073a9124a6505aab9246b5b459db34)
+* [Blueprint] Fixed a bug in the calculations for the +colborder mixin. Closes GH-25.
+ [Commit](http://github.com/chriseppstein/compass/commit/d2b1370c80a32f70ae6ec94126b737f4f0fc0851)
+
+0.8.6 (July 08, 2009)
+---------------------
+
+### Rails
+
+* The rails installer now correctly references the haml 2.2 dependency.
+ [Commit](http://github.com/chriseppstein/compass/commit/85bb337f50a3a3dfaafa2820d5463f7296140c9e)
+ by [Filip Tepper][filiptepper].
+* When installing into a new rails project, set the http paths correctly for stylesheets and javascripts
+ in the configuration file.
+ [Commit](http://github.com/chriseppstein/compass/commit/94e9696b30a9a9fd750c45e6fe3c2bc93eba506a)
+* Fixed a bug in asset hosts support when compiling outside the context of a controller.
+ [Commit](http://github.com/chriseppstein/compass/commit/6b8bbd22b13ef4c329777913a633948e66e3da99)
+
+### Command Line
+
+* Fixed a bug that caused the output after installing to not display the conditional comments.
+ [Commit](http://github.com/chriseppstein/compass/commit/48a0356ad8bc7b965e64f82498a9adcc1872abad)
+
+### Compass Core
+
+* Fixed a copy & paste error in image_url() that caused the http_images_path to not get picked up unless the
+ http_stylesheets_path was also set.
+ [Commit](http://github.com/chriseppstein/compass/commit/b7a9772efb89b2b882d3fafe02813c0fc650719a)
+
+0.8.5 (July 06, 2009)
+---------------------
+
+The Compass::TestCase class now inherits from ActiveSupport::TestCase if it exists.
+[Commit](http://github.com/chriseppstein/compass/commit/71d5ae8544d1c5ae49e28dcd6b3768fc39d7f01c)
+
+0.8.4 (July 06, 2009)
+---------------------
+
+Fixed a bug in rails integration introduced in 0.8.3.
+
+0.8.3 (July 06, 2009)
+---------------------
+
+Note: Compass now depends on the stable release of haml with version 2.2.0 or greater.
+
+### Compass Core
+
+* A new helper function `stylesheet_url(path)` can now be used to refer to assets that are relative to the css directory.
+ [Commit](http://github.com/chriseppstein/compass/commit/ff5c8500144272ee2b94271b06cce1690cbbc000).
+* Cross browser ellipsis mixin is now available. Use `compass -p ellipsis` to install it into your project since it
+ requires some additional assets.
+ [Commit](http://github.com/chriseppstein/compass/commit/3d909ceda997bdcde2aec09bd72e646098389e7d).
+
+### Blueprint
+
+* The +colruler mixin now accepts an argument for the color.
+ [Commit](http://github.com/chriseppstein/compass/commit/a5393bbb7cd0941ab8add5be188aea1d6f9d4b00)
+ by [Thomas Reynolds][tdreyno].
+
+### Extensions
+
+* A bug was fixed related to how javascript installation as part of an extension manifest.
+ [Commit](http://github.com/chriseppstein/compass/commit/a5393bbb7cd0941ab8add5be188aea1d6f9d4b00)
+ by [dturnbull][dturnbull].
+* When installing a file, the :like option can now be set to have it installed into the
+ same location as what it is like. E.g. `file 'foo.xml', :like => :css` will install
+ the foo.xml file into the top level of the project's css directory.
+ [Commit](http://github.com/chriseppstein/compass/commit/21cfce33db81e185ce5517818844a9849b5a836e).
+
+### Configuration
+* Setting `http_images_path` to `:relative` is now **deprecated**. Instead, please set `relative_assets` to
+ `true`.
+ [Commit](http://github.com/chriseppstein/compass/commit/956c437fe9ffaad08b6b34d91b6cfb80d6121a2f).
+* New configuration option `http_path` can be used to set the project's path relative to the server's root.
+ Defaults to "/". The http paths to images, stylesheets, and javascripts are now assumed to be relative to that
+ path but can be overridden using the `http_images_path`, `http_css_path`, `http_javascripts_path`.
+ [Commit](http://github.com/chriseppstein/compass/commit/6555ab3952ae37d736d54f43ee7053c2a88f4a69).
+
+### Command Line
+
+* A new command line option `--relative-assets` can be used to cause links to assets generated
+ via compass helper functions to be relative to the target css file.
+ [Commit](http://github.com/chriseppstein/compass/commit/956c437fe9ffaad08b6b34d91b6cfb80d6121a2f).
+
+0.8.2 (July 04, 2009)
+---------------------
+
+Fixed a bug that caused touch to fail on windows due to open files. (Contributor: Joe Wasson)
+
+0.8.1
+-----
+
+Fixed some build issues and a bug in the rewritten --watch mode that caused changes to partials to go unnoticed.
+
+0.8.0
+-----
+
+### Rails
+
+* image_url() now integrates with the rails asset handling code when
+ stylesheets are generated within the rails container.
+ **This causes your rails configuration for cache busting and asset hosts
+ to be used when generating your stylesheets**. Unfortunately, all
+ that code runs within the context of a controller, so the stylesheets
+ have to be generated during first request to use this functionality. If you
+ need to compile stylesheets offline, use the compass configuration file to set
+ the asset_host
and asset_cache_buster
.
+ [Commit](http://github.com/chriseppstein/compass/commit/998168160b11c8702ded0a32820ea15b70d51e83).
+
+* An official Rails template for Compass is now [provided][rails_template].
+ [Commit](http://github.com/chriseppstein/compass/commit/f6948d1d58818ef8babce8f8f9d775562d7cd7ef)
+ by [Derek Perez][perezd].
+
+### Blueprint
+
+* The Blueprint port has been upgraded to match Blueprint 0.9. The following changes were made as part
+ of that project:
+ * Removed body margins from blueprint scaffolding by default.
+ The old body styles can be reinstated by mixing +blueprint-scaffolding-body into your body selector(s).
+ [Commit](http://github.com/chriseppstein/compass/commit/45af89d4c7a396fae5d14fab4ef3bab23bcdfb6a)
+ by [Enrico Bianco][enricob].
+ * A bug in the calculations affecting the +colborder mixin has been fixed.
+ [Commit](http://github.com/chriseppstein/compass/commit/4b33fae5e5c5421580ba536116cb10194f1318d1)
+ by [Enrico Bianco][enricob].
+ Related [commit](http://github.com/chriseppstein/compass/commit/0a0a14aab597d2ec31ff9d267f6ee8cfad878e10).
+ * Blueprint now has inline form support. Mix +blueprint-inline-form into a form selector to make it inline.
+ [Commit](http://github.com/chriseppstein/compass/commit/56c745b939c763cfcc5549b54979d48ab1309087)
+ by [Enrico Bianco][enricob].
+ * Please update the conditional comment that surrounds your IE stylesheet to use "lt IE 8" as the condition
+ as these styles are not needed in IE8. New blueprint projects will now use this conditional as their default.
+ [Commit](http://github.com/chriseppstein/compass/commit/77f6e02c0ec80d2b6fd19e611ced02be003c98ae)
+ by [Enrico Bianco][enricob].
+ * Explicitly define image interpolation mode for IE so that images aren't jagged when resizing.
+ [Commit](http://github.com/chriseppstein/compass/commit/63075f82db367913efcce5e1d0f5489888e86ca4)
+ by [Enrico Bianco][enricob].
+
+* When starting a new project based on Blueprint, a more complete screen.sass file will be
+ provided that follows compass best practices instead of matching blueprint css exactly. A
+ partials/_base.sass file is provided and already set up for blueprint customization.
+ [Commit](http://github.com/chriseppstein/compass/commit/11b6ea14c3ee919711fa4bdce349f88b64b68d51)
+
+* The sizes and borders for form styling can now be altered via mixin arguments.
+ [Commit](http://github.com/chriseppstein/compass/commit/b84dd3031b82547cff8e1ef1f85de66d98cd162b)
+ by [Thomas Reynolds][tdreyno].
+
+* Grid borders can now be altered via mixin arguments.
+ [Commit](http://github.com/chriseppstein/compass/commit/0a0a14aab597d2ec31ff9d267f6ee8cfad878e10)
+ by [Thomas Reynolds][tdreyno].
+
+* The reset file for blueprint has moved from compass/reset.sass to blueprint/reset.sass. Please
+ update your imports accordingly. Also note that some of the reset mixin names have changed
+ (now prefixed with blueprint-*).
+ [Commit](http://github.com/chriseppstein/compass/commit/2126240a1a16edacb0a758d782334a9ced5d9116)
+ by [Noel Gomez][noel].
+
+### Compass Core
+
+* **Sprites**. A basic sprite mixin is now available. Import compass/utilities/sprites.sass and use the +sprite-img
+ mixin to set the background image from a sprite image file. Assumes every sprite in the sprite image
+ file has the same dimensions.
+ [Commit](http://github.com/chriseppstein/compass/commit/1f21d6309140c009188d350ed911eed5d34bf02e)
+ by [Thomas Reynolds][tdreyno].
+
+* **Reset**. The compass reset is now based on [Eric Meyer's reset](http://meyerweb.com/eric/thoughts/2007/05/01/reset-reloaded/).
+ which makes no attempt to apply base styles like the blueprint reset does. **Existing compass projects
+ will want to change their reset import to point to blueprint/reset.sass** -- which is where the old
+ default reset for compass projects now lives -- see the blueprint notes above for more information.
+ [Commit](http://github.com/chriseppstein/compass/commit/2126240a1a16edacb0a758d782334a9ced5d9116)
+ by [Noel Gomez][noel].
+
+* A bug was fixed in the tag_cloud mixin so that it actually works.
+ [Commit](http://github.com/chriseppstein/compass/commit/be5c0ff6731ec5e0cdac73bc47f5603c3db899b5)
+ by [Bjørn Arild Mæland][Chrononaut].
+
+### Sass Extensions
+
+* The inline_image(image_path)
function can now be used to generate a data url that embeds the image data in
+ the generated css file -- avoiding the need for another request.
+ This function works like image_url()
in that it expects the image to be a path
+ relative to the images directory. There are clear advantages and disadvantages to this approach.
+ See [Wikipedia](http://en.wikipedia.org/wiki/Data_URI_scheme) for more details.
+ NOTE: Neither IE6 nor IE7 support this feature.
+ [Commit](http://github.com/chriseppstein/compass/commit/5a015b3824f280af56f1265bf8c3a7c64a252621).
+
+### Configuration
+
+* **Asset Hosts**. You can now configure the asset host(s) used for images via the image_url() function.
+ Asset hosts are off unless configured and also off when relative urls are enabled.
+ [Commit](http://github.com/chriseppstein/compass/commit/ef47f3dd9dbfc087de8b12a90f9a82993bbb592e).
+ In your compass configuration file, you must define an asset_host algorithm to be used like so:
+ # Return the same host for all images:
+ asset_host {|path| "http://assets.example.com" }
+ # Return a different host based on the image path.
+ asset_host do |path|
+ "http://assets%d.example.com" % (path.hash % 4)
+ end
+
+
+* **Configurable Cache Buster**. You can now configure the cache buster that gets placed at the end of
+ images via the image_url function. This might be useful if you need to coordinate the query string
+ or use something other than a timestamp.
+ [Commit](http://github.com/chriseppstein/compass/commit/ef47f3dd9dbfc087de8b12a90f9a82993bbb592e)
+ Example:
+ asset_cache_buster do |path, file|
+ "busted=true"
+ end
+
+* You can now set/override arbitrary sass options by setting the sass_options
configuration property
+ to a hash. [Commit](http://github.com/chriseppstein/compass/commit/802bca61741db31da7131c82d31fff45f9323696).
+
+* You can now specify additional import paths to look for sass code outside the project.
+ [Commit](http://github.com/chriseppstein/compass/commit/047be06a0a63923846f53849fc220fb4be69513b).
+ This can be done in two ways:
+ 1. By setting additional_import_paths
to an array of paths.
+ 2. By (repeatedly) calling add_import_path(path)
+
+* The compass configuration can now be placed in PROJECT_DIR/.compass/config.rb if you so choose.
+ [Commit](http://github.com/chriseppstein/compass/commit/69cf32f70ac79c155198d2dbf96f50856bee9504).
+
+
+### Command Line
+
+* **Watch Improvements** The watch command was rewritten for robustness and reliability. The most
+ important change is that generated css files will be deleted if the originating sass file is removed while
+ watching the project. [Commit](http://github.com/chriseppstein/compass/commit/0a232bd922695f6f659fac9f90466745d4425839).
+
+* The images and javascripts directories may now be set via the command line.
+ [Commit](http://github.com/chriseppstein/compass/84aec053d0109923ea0208ac0847684cf09cefc1).
+
+* The usage output (-h) of the command-line has been reformatted to make it more readable and understandable.
+ [Commit](http://github.com/chriseppstein/compass/f742f26208f4c5c783ba63aa0cc509bb19e06ab9).
+
+* The configuration file being read can now be specified explicitly using the -c option.
+ This also affects the output location of the --write-configuration command.
+ NOTE: The -c option used to be for writing the configuration file, an infrequently used option.
+ [Commit](http://github.com/chriseppstein/compass/d2acd343b899db960c1d3a377e2ee6f58595c6b1).
+
+* You can now install into the current working directory by explicitly setting the command line mode to -i
+ and providing no project name.
+ [Commit](http://github.com/chriseppstein/compass/f742f26208f4c5c783ba63aa0cc509bb19e06ab9).
+
+### Compass Internals
+
+* Some internal code was reorganized to make managing sass extensions and functions more manageable.
+
+* Some internal code was reorganized to make managing ruby application integration more manageable.
+
+* The compass unit tests were reorganized to separate rails testing from other tests.
+
+* The [Rip Packaging System](http://hellorip.com) is now supported.
+ [Commit](http://github.com/chriseppstein/compass/commit/56f36577c7654b93a349f74abf274327df23402b)
+ by [Will Farrington](http://github.com/wfarr).
+
+* A [licence is now available](http://github.com/chriseppstein/compass/blob/master/LICENSE.markdown)
+ making the copyrights and terms of use clear for people who care about such things.
+
+
+0.6.14
+------
+
+Extracted the css validator to an external gem that is only required if you try to use the validation feature.
+This makes the compass gem a lot smaller (0.37MB instead of 4MB). To install the validator:
+
+ sudo gem install chriseppstein-compass-validator --source http://gems.github.com/
+
+0.6.8 thru 0.6.13
+-----------------
+
+The compass gem is now built with Jeweler instead of Echoe. No changes to speak of. These versions were bug
+fixes and working out the new release process.
+
+0.6.7
+-----
+
+Bug fix release.
+
+### Rails
+
+The output_style will no longer be set in the compass.config file. Instead compass will use the runtime rails environment to set a sensible default.
+
+### Command Line
+
+The Sass cache directory will be placed into the sass directory of the project instead of the directory from where the compass command was ran.
+
+### Compass Core
+
+Extracted two new mixins from +horizontal-list. The new +horizontal-list-container and +horizontal-list-item mixins can be used to build your
+horizontal list when you need more control over the selectors (E.g. when working with nested lists).
+
+0.6.6
+-----
+
+The Haml project now releases a gem called haml-edge that is built from the haml master branch instead of stable. Compass now depends on this gem and will continue to do so until haml 2.2 is released. This should reduce the number of installation problems that have been encountered by new users.
+
+### Command Line
+
+* Fixed a bug that had broken the --write-configuration (-c) option.
+* The --force option will now force recompilation. Useful when the stylesheets don't appear to need a recompile according to the file timestamps.
+
+### Unit tests
+
+* Some unit tests were cleaned up for clarity and to better take advantage of the compass project management facilities.
+
+0.6.5
+-----
+
+### Compass Core
+
+Converted all mixins definitions referencing images to use the new sass function image\_url()
. The following mixins were affected:
+
+* +pretty-bullets
+* +replace-text
+
+The calls to these mixins should now pass a path to the image that is relative to the images directory of the project.
+
+### Command Line
+
+* Required frameworks specified from the command line will now be added into the initial project configuration file.
+
+0.6.4
+-----
+
+### Command Line
+
+Added a command line option --install-dir that will emit the directory where compass is installed. Useful for debugging and drilling into the compass examples and libraries.
+
+0.6.3
+-----
+
+### Rails
+
+Bug fix: The http_images_path configuration default should be "/images" instead of "/public/images".
+
+### Command Line
+
+These changes, coupled with upcoming changes to Sass result in significantly reduced time spent on compilation for large projects.
+
+* The compass command line will no longer recompile sass files that haven't changed (taking import dependencies into account).
+* The compass command line will now respect the -q (quiet) option during compilation. Additionally, the quiet option will be set by default when watching a project for changes.
+
+0.6.2
+-----
+
+### Blueprint
+
+Split the push and pull mixins into sub-mixins that separate the common styles from the ones that vary. The generated css when using presentational class names will be smaller as a result. The existing +push
and +pull
mixins continue to work as expected. The following mixins were added:
+
+ +push-base
+ +push-margins
+ +pull-base
+ +pull-margins
+
+Additonally, the liquid plugin was updated to have a span mixin that matches elsewhere.
+
+### YUI
+
+Added Yahoo's version of the css reset. To use it, mix into the top level of your project:
+
+ @import yui/modules/reset.sass
+ +reset
+
+### Rails
+
+* Conditionally defining #blank? on String/NilClass (Erik Bryn )
+* Set compass environment in plugin based on RAILS_ENV (Lee Nussbaum )
+
+0.6.1
+-----
+
+Maintenance release that fixes several bugs in the handling of configuration files.
+
+0.6.0
+-----
+
+### New Core Functionality: **Patterns**
+
+Patterns give a framework or plugin access to the compass installer framework
+to install customizable sass, html as well as image and javascript assets.
+
+A pattern is a folder in the plugin's templates directory. It must
+have a manifest file that tells compass what to install and where.
+Unlike the project template, a pattern can be stamped out any number of
+times.
+
+It is best for pattern stylesheets to only provide example usage to get
+the user started. All the core styles for the pattern should be
+distributed as part of the framework's stylesheets as mixins to
+facilitate easy upgrades and bug fixing on the part of the pattern's
+maintainer.
+
+Example Usage:
+compass --framework blueprint --pattern buttons
+
+Please read the
+[Wiki Page](http://wiki.github.com/chriseppstein/compass/patterns) for more information.
+
+### New Command-line options:
+
+1. --validate
+ Validate your project's compiled css. Requires java and probably only works on Mac and Unix.
+2. --grid-img [DIMENSIONS]
+ Generate a background image to test grid alignment. Dimension is given as
+ +. Defaults to 30+10.
+3. -p, --pattern PATTERN
+ When combined with with the --framework option, will stamp a plugin's pattern named PATTERN.
+4. -n, --pattern-name NAME
+ When combined with the --pattern option, the pattern that gets stamped out will
+ be isolated in subdirectories named NAME.
+5. -c, --write-configuration
+ Emit a compass configuration file into the current directory, taking any existing configuration
+ file and any command line options provided into account. (command line options override
+ configuration file options).
+
+### New Sass Functions:
+
+Compass projects can call these sass functions within their sass files, if you find them useful.
+
+1. enumerate(prefix, start, end)
+ Generates selectors with a prefix and a numerical ending
+ counting from start to end. E.g. enumerate("foo", 1, 3) returns "foo-1, foo-2, foo-3"
+2. image_url(path)
+ Uses the compass configuration to convert a path relative to the compass
+ project directory to a path that is either absolute for serving in an HTTP
+ context or that is relative to whatever css file the function was being
+ compiled into. In the future, this function may also tap into the rails
+ asset host configuration.
+
+### New Compass Core Mixins
+
+1. +float-left
& +float-right
+ In order to include fixes for IE's double-margin bug universally,
+ floats were implemented as a utility mixins. These are available by importing
+ compass/utilities/general/float.sass which also imports the clearfix module.
+2. +pie-clearfix
+ Implementation of the
+ [position-is-everything clearfix](http://www.positioniseverything.net/easyclearing.html)
+ that uses content :after.
+
+### Blueprint 0.8
+
+The Compass port of Blueprint has been upgraded from 0.7.1 to 0.8.0. The 0.8.0 release
+brings many bug fixes and a few backward incompatible changes if you use it's presentational
+classnames (you don't do that, do you?). Upgrading to 0.8 is automatic when you upgrade to
+compass 0.6.0. The Blueprint team didn't release a detailed changelog for me to point at here.
+One of the key features of the release was the inclusion of three new core blueprint plugins
+(a.k.a. folders you can copy). These are what prompted the development of the compass patterns
+feature and two of them are packaged as patterns:
+
+1. Buttons
+ To install: compass --framework blueprint --pattern buttons
+ Then follow your nose.
+2. Link Icons
+ To install: compass --framework blueprint --pattern link\_icons
+ Then follow your nose.
+
+The third plugin is the RTL (right-to-left) plugin. To use this one, simply import it after the import
+of the blueprint grid and your mixins will be redefined to work in a left to right manner. Additionally,
+it provides +rtl-typography mixin that works in conjunction with +blueprint-typography and should be mixed
+in with it.
+
+Lastly, I've rewrote some of the presentational class name generation code so that it very nearly
+matches the blueprint CSS. Please note that they are not 100% the same because we fix some bugs
+that are not yet fixed in blueprint-css and we use a different clearfix implementation.
+
+### Bug Fixes
+
+1. A Safari bug related to the +clearfix mixin was resolved.
+2. Running the compass command line installer a second time.
+
+### Bugs Introduced
+
+Almost definitely. Please let me know if you encounter any problems and I'll get a patch out
+
+[tdreyno]: http://github.com/tdreyno
+[noel]: http://github.com/noel
+[enricob]: http://github.com/enricob
+[perezd]: http://github.com/perezd
+[Chrononaut]: http://github.com/Chrononaut
+[rails_template]: http://github.com/chriseppstein/compass/raw/4e7e51e2c5491851f66c77abf3f15194f2f8fb8d/lib/compass/app_integration/rails/templates/compass-install-rails.rb
+[dturnbull]: http://github.com/dturnbull
+[filiptepper]: http://github.com/filiptepper
diff --git a/vendor/gems/gems/compass-0.8.17/LICENSE.markdown b/vendor/gems/gems/compass-0.8.17/LICENSE.markdown
new file mode 100755
index 00000000..8e61ae60
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/LICENSE.markdown
@@ -0,0 +1,29 @@
+Copyright (c) 2009 Christopher M. Eppstein
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+No attribution is required by products that make use of this software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name(s) of the above copyright
+holders shall not be used in advertising or otherwise to promote the sale,
+use or other dealings in this Software without prior written authorization.
+
+Contributors to this project agree to grant all rights to the copyright
+holder of the primary product. Attribution is maintained in the source
+control history of the product.
diff --git a/vendor/gems/gems/compass-0.8.17/README.markdown b/vendor/gems/gems/compass-0.8.17/README.markdown
new file mode 100755
index 00000000..77c8de67
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/README.markdown
@@ -0,0 +1,44 @@
+# Compass
+A [Sass][sass]-based CSS Meta-Framework that allows you to mix and match any of the following CSS frameworks:
+
+- [Compass Core][compass_core_website] - [Wiki Documentation][compass_core_wiki]
+- [Blueprint][blueprint_website] - [Wiki Documentation][bleuprint_wiki]
+- [YUI][yui_website] - [Wiki Documentation][yui_wiki]
+- [960][ninesixty_website] - [Wiki Documentation][ninesixty_wiki]
+- Other frameworks can be added relatively easily. Create your own!
+
+## Compass Provides
+
+1. A [command line tool][command_line_wiki] for managing your Sass projects.
+2. Simple integration with [Ruby-on-Rails][ruby_on_rails_wiki], [Merb][merb_wiki], [StaticMatic][static_matic_wiki], and even [non-ruby application servers][command_line_wiki].
+3. Loads of Sass mixins to make building your website a snap.
+
+## More Information
+Please see the [wiki][wiki]
+
+## Author
+Compass is written by [Chris Eppstein][chris_eppstein].
+Chris is the Software Architect of [Caring.com][caring.com] and a member of the [Sass][sass] core team.
+
+## License
+Copyright (c) 2008-2009 Christopher M. Eppstein
+All Rights Reserved.
+Released under a [slightly modified MIT License][license].
+
+[sass]: http://haml.hamptoncatlin.com/docs/rdoc/classes/Sass.html "Syntactically Awesome StyleSheets"
+[compass_core_website]: http://github.com/chriseppstein/compass/tree/master/frameworks/compass
+[compass_core_wiki]: http://github.com/chriseppstein/compass/wikis/compass-core-documentation
+[blueprint_website]: http://blueprintcss.org/
+[bleuprint_wiki]: http://github.com/chriseppstein/compass/wikis/blueprint-documentation
+[yui_website]: http://developer.yahoo.com/yui/grids/
+[yui_wiki]: http://github.com/chriseppstein/compass/wikis/yui-documentation
+[ninesixty_website]: http://960.gs/
+[ninesixty_wiki]: http://github.com/chriseppstein/compass/wikis/960gs-documentation
+[command_line_wiki]: http://wiki.github.com/chriseppstein/compass/command-line-tool
+[wiki]: http://github.com/chriseppstein/compass/wikis/home
+[ruby_on_rails_wiki]: http://wiki.github.com/chriseppstein/compass/ruby-on-rails-integration
+[merb_wiki]: http://wiki.github.com/chriseppstein/compass/merb-integration
+[static_matic_wiki]: http://wiki.github.com/chriseppstein/compass/staticmatic-integration
+[chris_eppstein]: http://acts-as-architect.blogspot.com
+[caring.com]: http://www.caring.com/ "Senior Care Resources"
+[license]: http://github.com/chriseppstein/compass/tree/master/LICENSE.markdown
diff --git a/vendor/gems/gems/compass-0.8.17/REVISION b/vendor/gems/gems/compass-0.8.17/REVISION
new file mode 100755
index 00000000..4519e373
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/REVISION
@@ -0,0 +1 @@
+2465baba525421ac9cac1774d940f9e27971710d
\ No newline at end of file
diff --git a/vendor/gems/gems/compass-0.8.17/Rakefile b/vendor/gems/gems/compass-0.8.17/Rakefile
new file mode 100755
index 00000000..ac940261
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/Rakefile
@@ -0,0 +1,127 @@
+if ENV['RUN_CODE_RUN']
+ # We need to checkout edge haml for the run>code>run test environment.
+ if File.directory?("haml")
+ Dir.chdir("haml") do
+ sh "git", "pull"
+ end
+ else
+ sh "git", "clone", "git://github.com/nex3/haml.git"
+ end
+ $LOAD_PATH.unshift "haml/lib"
+end
+
+require 'rubygems'
+require 'rake'
+require 'lib/compass'
+
+# ----- Default: Testing ------
+
+task :default => :run_tests
+
+require 'rake/testtask'
+require 'fileutils'
+
+Rake::TestTask.new :run_tests do |t|
+ t.libs << 'lib'
+ t.libs << 'haml/lib' if ENV["RUN_CODE_RUN"]
+ test_files = FileList['test/**/*_test.rb']
+ test_files.exclude('test/rails/*', 'test/haml/*')
+ t.test_files = test_files
+ t.verbose = true
+end
+Rake::Task[:test].send(:add_comment, <= 2.2.0')
+ gemspec.files = []
+ gemspec.files << "CHANGELOG.markdown"
+ gemspec.files << "README.markdown"
+ gemspec.files << "LICENSE.markdown"
+ gemspec.files << "REVISION"
+ gemspec.files << "VERSION.yml"
+ gemspec.files << "Rakefile"
+ gemspec.files << "deps.rip"
+ gemspec.files += Dir.glob("bin/*")
+ gemspec.files += Dir.glob("examples/**/*.*")
+ gemspec.files -= Dir.glob("examples/**/*.css")
+ gemspec.files -= Dir.glob("examples/**/*.html")
+ gemspec.files += Dir.glob("frameworks/**/*.*")
+ gemspec.files += Dir.glob("lib/**/*")
+ gemspec.files += Dir.glob("test/**/*.*")
+ gemspec.files -= Dir.glob("test/fixtures/stylesheets/*/saved/**/*.*")
+ gemspec.test_files = Dir.glob("test/**/*.*")
+ gemspec.test_files -= Dir.glob("test/fixtures/stylesheets/*/saved/**/*.*")
+ end
+rescue LoadError
+ puts "Jeweler not available. Install it with: sudo gem install technicalpickles-jeweler -s http://gems.github.com"
+end
+
+desc "Record the current git revision."
+task :REVISION do
+ require 'git'
+
+ repo = Git.open('.')
+ open("REVISION", "w") do |f|
+ f.write(repo.object("HEAD").sha)
+ end
+end
+
+desc "Commit the revision file."
+task :commit_revision => :REVISION do
+ require 'git'
+ repo = Git.open('.')
+ repo.add("REVISION")
+ repo.commit("Record current revision for release.")
+end
+
+task :release => :commit_revision
+
+desc "Compile Examples into HTML and CSS"
+task :examples do
+ linked_haml = "tests/haml"
+ if File.exists?(linked_haml) && !$:.include?(linked_haml + '/lib')
+ puts "[ using linked Haml ]"
+ $:.unshift linked_haml + '/lib'
+ end
+ require 'haml'
+ require 'sass'
+ require 'pathname'
+ require 'lib/compass'
+ require 'lib/compass/exec'
+ FileList['examples/*'].each do |example|
+ next unless File.directory?(example)
+ puts "\nCompiling #{example}"
+ puts "=" * "Compiling #{example}".length
+ # compile any haml templates to html
+ FileList["#{example}/**/*.haml"].each do |haml_file|
+ basename = haml_file[0..-6]
+ engine = Haml::Engine.new(open(haml_file).read, :filename => haml_file)
+ puts " haml #{File.basename(basename)}"
+ output = open(basename,'w')
+ output.write(engine.render)
+ output.close
+ end
+ Dir.chdir example do
+ Compass::Exec::Compass.new(["--force"]).run!
+ end
+ end
+end
+
+namespace :git do
+ task :clean do
+ sh "git", "clean", "-fdx"
+ end
+end
diff --git a/vendor/gems/gems/compass-0.8.17/VERSION.yml b/vendor/gems/gems/compass-0.8.17/VERSION.yml
new file mode 100755
index 00000000..0bd37399
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/VERSION.yml
@@ -0,0 +1,4 @@
+---
+:patch: 17
+:major: 0
+:minor: 8
diff --git a/vendor/gems/gems/compass-0.8.17/bin/compass b/vendor/gems/gems/compass-0.8.17/bin/compass
new file mode 100755
index 00000000..fb94e65f
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/bin/compass
@@ -0,0 +1,8 @@
+#!/usr/bin/env ruby
+# The compass command line utility
+
+require File.expand_path(File.join(File.dirname(__FILE__), '..', 'lib', 'compass'))
+require File.expand_path(File.join(File.dirname(__FILE__), '..', 'lib', 'compass', 'exec'))
+
+command = Compass::Exec::Compass.new(ARGV)
+exit command.run!
diff --git a/vendor/gems/gems/compass-0.8.17/deps.rip b/vendor/gems/gems/compass-0.8.17/deps.rip
new file mode 100755
index 00000000..71d1e8c1
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/deps.rip
@@ -0,0 +1 @@
+git://github.com/nex3/haml.git master
diff --git a/vendor/gems/gems/compass-0.8.17/examples/README.markdown b/vendor/gems/gems/compass-0.8.17/examples/README.markdown
new file mode 100755
index 00000000..b00d5709
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/examples/README.markdown
@@ -0,0 +1,4 @@
+To build the examples:
+
+1. You can run the compass command line from any particular compass example project
+2. You can compile them all by running `rake examples` at the top of the project directory.
\ No newline at end of file
diff --git a/vendor/gems/gems/compass-0.8.17/examples/blueprint_default/config.rb b/vendor/gems/gems/compass-0.8.17/examples/blueprint_default/config.rb
new file mode 100755
index 00000000..bbb651ed
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/examples/blueprint_default/config.rb
@@ -0,0 +1,7 @@
+# Require any additional compass plugins here.
+project_type = :stand_alone
+css_dir = "stylesheets"
+sass_dir = "src"
+images_dir = "images"
+output_style = :compact
+relative_assets = true
diff --git a/vendor/gems/gems/compass-0.8.17/examples/blueprint_default/images/grid.png b/vendor/gems/gems/compass-0.8.17/examples/blueprint_default/images/grid.png
new file mode 100755
index 00000000..129d4a29
Binary files /dev/null and b/vendor/gems/gems/compass-0.8.17/examples/blueprint_default/images/grid.png differ
diff --git a/vendor/gems/gems/compass-0.8.17/examples/blueprint_default/index.html.haml b/vendor/gems/gems/compass-0.8.17/examples/blueprint_default/index.html.haml
new file mode 100755
index 00000000..8a59a9cf
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/examples/blueprint_default/index.html.haml
@@ -0,0 +1,85 @@
+!!!
+%html{ :lang => "en" }
+ %head
+ %meta{ :content => "text/html; charset=utf-8", "http-equiv" => "Content-Type" }
+ %title
+ Blueprint test pages
+ /
+ Framework CSS
+ %link{ :href => "stylesheets/screen.css", :rel => "stylesheet", :media => "screen, projection", :type => "text/css" }
+ %link{ :href => "stylesheets/index.css", :rel => "stylesheet", :media => "screen, projection", :type => "text/css" }
+ %link{ :href => "stylesheets/print.css", :rel => "stylesheet", :media => "print", :type => "text/css" }
+ /
+ [if IE]> "0", :border => "0", :cellpadding => "0" }
+ %tr
+ %th.span-6
+ Test page
+ %th.span-8
+ Main files tested
+ %th.span-10
+ Description
+ %tr
+ %td
+ %a{ :href => "parts/grid.html" }
+ Grid
+ %td
+ %a{ :href => "../../frameworks/blueprint/stylesheets/blueprint/modules/_grid.sass" }
+ grid.sass
+ %td
+ Tests classes provided by the grid module.
+ %tr.even
+ %td
+ %a{ :href => "parts/elements.html" }
+ Typography
+ %td
+ %a{ :href => "../../frameworks/blueprint/stylesheets/blueprint/modules/_typography.sass" }
+ typography.sass
+ %td
+ Tests HTML elements which gets set in the typography module.
+ %tr
+ %td
+ %a{ :href => "parts/forms.html" }
+ Forms
+ %td
+ %a{ :href => "../../frameworks/blueprint/stylesheets/blueprint/modules/_form.sass" }
+ form.sass
+ %td
+ Tests classes and default look provided by the form module.
+ %p
+ %em
+ %strong
+ Note about the css files:
+ These test files utilize the css files that are generated from
+ %a{ :href => "http://haml.hamptoncatlin.com/docs/rdoc/classes/Sass.html" }
+ Sass templates
+ \.
+ In other words, if you change any of the source files,
+ you'll have to re-build them with
+ %code
+ rake examples
+ to see any changes.
+ .box
+ %p
+ For more information and help, try these resources:
+ %ul.bottom
+ %li
+ %a{ :href => "http://code.google.com/p/blueprintcss" }
+ The Blueprint home page.
+ %li
+ %a{ :href => "http://groups.google.com/group/blueprintcss" }
+ Our anything-goes mailing list.
+ %li
+ %a{ :href => "http://bjorkoy.com" }
+ The blog where news about Blueprint gets posted.
+ %p
+ %a{ :href => "http://validator.w3.org/check?uri=referer" }
+ %img.top{ :src => "parts/valid.png", :height => "31", :alt => "Valid HTML 4.01 Strict", :width => "88" }
diff --git a/vendor/gems/gems/compass-0.8.17/examples/blueprint_default/parts/elements.html.haml b/vendor/gems/gems/compass-0.8.17/examples/blueprint_default/parts/elements.html.haml
new file mode 100755
index 00000000..f6039e46
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/examples/blueprint_default/parts/elements.html.haml
@@ -0,0 +1,282 @@
+!!!
+%html{ :lang => "en" }
+ %head
+ %meta{ :content => "text/html; charset=utf-8", "http-equiv" => "Content-Type" }
+ %title
+ Blueprint HTML Elements Tests
+ /
+ Framework CSS
+ %link{ :href => "../stylesheets/screen.css", :rel => "stylesheet", :media => "screen, projection", :type => "text/css" }
+ %link{ :href => "../stylesheets/print.css", :rel => "stylesheet", :media => "print", :type => "text/css" }
+ /
+ [if IE]> "http://www.google.com" }
+ \<a> a + href
+ %p
+ %abbr{ :title => "extended abbr text should show when mouse over" }
+ \<abbr> abbr - extended text when mouseover.
+ %br
+ %acronym{ :title => "extended acronym text should show when mouse over" }
+ \<acronym> acronym - extended text when mouseover.
+ %address
+ \<address>
+ %br
+ Donald Duck
+ %br
+ Box 555
+ %br
+ Disneyland
+ %p
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore dolore.
+ .span-8
+ %table{ :cellspacing => "0", :border => "0", :summary => "This is the summary text for this table.", :cellpadding => "0" }
+ %caption
+ %em
+ A standard test table with a caption, tr, td elements
+ %tr
+ %th.span-4
+ Table Header One
+ %th.span-4.last
+ Table Header Two
+ %tr
+ %td
+ TD One
+ %td
+ TD Two
+ %tr
+ %td{ :colspan => "2" }
+ TD colspan 2
+ %table{ :cellspacing => "0", :border => "0", :summary => "This is the summary text for this table.", :cellpadding => "0" }
+ %caption
+ %em
+ A test table with a thead, tfoot, and tbody elements
+ %thead
+ %tr
+ %th.span-4
+ Table Header One
+ %th.span-4.last
+ Table Header Two
+ %tfoot
+ %tr
+ %td{ :colspan => "2" }
+ tfoot footer
+ %tbody
+ %tr
+ %td
+ TD One
+ %td
+ TD Two
+ %tr
+ %td
+ TD One
+ %td
+ TD Two
+ %tbody
+ %tr
+ %td
+ TD One
+ %td
+ TD Two
+ %tr
+ %td
+ TD One
+ %td
+ TD Two
+ .span-8.last
+ %pre
+ \<pre>
+ pre space1
+ pre space1
+ pre space2
+ pre space2
+ pre tab
+ pre tab
+ %code
+ \<code>
+ Not indented
+ indent1
+ indent1
+ indent2
+ indent3
+ %tt
+ \<tt>
+ This tt text should be monospaced
+ and
+ wrap as if
+ one line of text
+ even though the code has newlines, spaces, and tabs.
+ It should be the same size as <p> text.
+ %hr
+ %p
+ %a{ :href => "http://validator.w3.org/check?uri=referer" }
+ %img.top{ :src => "valid.png", :height => "31", :alt => "Valid HTML 4.01 Strict", :width => "88" }
diff --git a/vendor/gems/gems/compass-0.8.17/examples/blueprint_default/parts/forms.html.haml b/vendor/gems/gems/compass-0.8.17/examples/blueprint_default/parts/forms.html.haml
new file mode 100755
index 00000000..647b5f52
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/examples/blueprint_default/parts/forms.html.haml
@@ -0,0 +1,190 @@
+!!!
+%html{ :lang => "en" }
+ %head
+ %meta{ :content => "text/html; charset=utf-8", "http-equiv" => "Content-Type" }
+ %title
+ Blueprint Forms Tests
+ /
+ Framework CSS
+ %link{ :href => "../stylesheets/screen.css", :rel => "stylesheet", :media => "screen, projection", :type => "text/css" }
+ %link{ :href => "../stylesheets/print.css", :rel => "stylesheet", :media => "print", :type => "text/css" }
+ /
+ [if lt IE 8]> "", :method => "post" }
+ %fieldset
+ %legend
+ Simple sample form
+ %p
+ %label{ :for => "dummy0" }
+ Text input (title)
+ %br
+ %input#dummy0.title{ :name => "dummy0", :type => "text", :value => "Field with class .title" }
+ %p
+ %label{ :for => "dummy1" }
+ Another field
+ %br
+ %input#dummy1.text{ :name => "dummy1", :type => "text", :value => "Field with class .text" }
+ %p
+ %label{ :for => "dummy2" }
+ Textarea
+ %br
+ %textarea#dummy2{ :name => "dummy2", :rows => "5", :cols => "20" }
+ %p
+ %input{ :type => "submit", :value => "Submit" }
+ %input{ :type => "reset", :value => "Reset" }
+ .span-12.last
+ .error
+ This is a <div> with the class
+ %strong
+ \.error
+ \.
+ %a{ :href => "#" }
+ Link
+ \.
+ .notice
+ This is a <div> with the class
+ %strong
+ \.notice
+ \.
+ %a{ :href => "#" }
+ Link
+ \.
+ .success
+ This is a <div> with the class
+ %strong
+ \.success
+ \.
+ %a{ :href => "#" }
+ Link
+ \.
+ %fieldset
+ %legend
+ Select, checkboxes, lists
+ %p
+ %label{ :for => "dummy3" }
+ Select field
+ %br
+ %select#dummy3{ :name => "dummy3" }
+ %option{ :value => "1" }
+ Ottawa
+ %option{ :value => "2" }
+ Calgary
+ %option{ :value => "3" }
+ Moosejaw
+ %p
+ %label{ :for => "dummy4" }
+ Select with groups
+ %br
+ %select#dummy4{ :name => "dummy4" }
+ %option
+ Favorite pet
+ %optgroup{ :label => "mammals" }
+ %option
+ dog
+ %option
+ cat
+ %option
+ rabbit
+ %option
+ horse
+ %optgroup{ :label => "reptiles" }
+ %option
+ iguana
+ %option
+ snake
+ %p
+ %label
+ Radio buttons
+ %br
+ %input{ :name => "example", :type => "radio" }
+ Radio one
+ %br
+ %input{ :name => "example", :type => "radio" }
+ Radio two
+ %br
+ %input{ :name => "example", :type => "radio" }
+ Radio three
+ %br
+ %p
+ %label
+ Checkboxes
+ %br
+ %input{ :type => "checkbox" }
+ Check one
+ %br
+ %input{ :type => "checkbox" }
+ Check two
+ %br
+ %input{ :type => "checkbox" }
+ Check three
+ %br
+ .span-24.last
+ %fieldset
+ %legend
+ Alignment
+ %p
+ %label{ :for => "dummy5" }
+ Select field
+ %select#dummy5{ :name => "dummy5" }
+ %option{ :value => "1" }
+ Ottawa
+ %option{ :value => "2" }
+ Calgary
+ %option{ :value => "3" }
+ Moosejaw
+ %p
+ %label{ :for => "dummy6" }
+ Text input (title)
+ %input#dummy6.title{ :name => "dummy6", :type => "text", :value => "Field with class .title" }
+ %p
+ %label{ :for => "dummy7" }
+ Select field
+ %select#dummy7{ :name => "dummy7" }
+ %option{ :value => "1" }
+ Ottawa
+ %option{ :value => "2" }
+ Calgary
+ %option{ :value => "3" }
+ Moosejaw
+ %label{ :for => "dummy8" }
+ Another field
+ %input#dummy8.text{ :name => "dummy8", :type => "text", :value => "Field with class .text" }
+ .span-24.last
+ %form.inline{ :action => "", :method => "post" }
+ %fieldset
+ %legend
+ A form with class "inline"
+ .span-3
+ %label{ :for => "a" }
+ Label A:
+ %select#a{ :name => "a" }
+ %option{ :value => "0" }
+ All
+ .span-2
+ some text
+ .span-3
+ %input#o.checkbox{ :type => "checkbox", :name => "o", :value => "true", :checked => "checked" }
+ checkbox one
+ .span-3
+ %label{ :for => "b" }
+ Label B:
+ %select#b{ :name => "b" }
+ %option{ :value => "0" }
+ All
+ .span-2
+ %a{ :href => "" }
+ A Hyperlink
+ .span-8
+ %input#q.text{ :type => "text", :name => "q", :value => "Field with class .text" }
+ .span-2.last
+ %input.button{ :type => "submit", :value => "submit" }
+ %hr
+ %p
+ %a{ :href => "http://validator.w3.org/check?uri=referer" }
+ %img.top{ :src => "valid.png", :height => "31", :alt => "Valid HTML 4.01 Strict", :width => "88" }
diff --git a/vendor/gems/gems/compass-0.8.17/examples/blueprint_default/parts/grid.html.haml b/vendor/gems/gems/compass-0.8.17/examples/blueprint_default/parts/grid.html.haml
new file mode 100755
index 00000000..1e2f5f13
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/examples/blueprint_default/parts/grid.html.haml
@@ -0,0 +1,274 @@
+!!!
+%html{ :lang => "en" }
+ %head
+ %meta{ :content => "text/html; charset=utf-8", "http-equiv" => "Content-Type" }
+ %title
+ Blueprint Grid Tests
+ /
+ Framework CSS
+ %link{ :href => "../stylesheets/screen.css", :rel => "stylesheet", :media => "screen, projection", :type => "text/css" }
+ %link{ :href => "../stylesheets/print.css", :rel => "stylesheet", :media => "print", :type => "text/css" }
+ /
+ [if IE]> "test-small.jpg" }
+ .span-10.last
+ %p
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
+ .span-2
+ %img.push-2{ :src => "test-small.jpg" }
+ .span-10.last
+ %p
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
+ .span-2
+ %img.push-3{ :src => "test-small.jpg" }
+ .span-10.last
+ %p
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
+ .span-2
+ %img.push-4{ :src => "test-small.jpg" }
+ .span-10.last
+ %p
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
+ .span-2
+ %img.push-5{ :src => "test-small.jpg" }
+ .span-10.last
+ %p
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
+ .span-12.last
+ %h5
+ TESTING .PULL-1 TO .PULL-5
+ .span-10
+ %p
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
+ .span-2.last
+ %img.top.pull-1{ :src => "test-small.jpg" }
+ .span-10
+ %p
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
+ .span-2.last
+ %img.top.pull-2{ :src => "test-small.jpg" }
+ .span-10
+ %p
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
+ .span-2.last
+ %img.top.pull-3{ :src => "test-small.jpg" }
+ .span-10
+ %p
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
+ .span-2.last
+ %img.top.pull-4{ :src => "test-small.jpg" }
+ .span-10
+ %p
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
+ .span-2.last
+ %img.top.pull-5{ :src => "test-small.jpg" }
+ .span-24
+ %p
+ %a{ :href => "http://validator.w3.org/check?uri=referer" }
+ %img.bottom{ :src => "valid.png", :height => "31", :alt => "Valid HTML 4.01 Strict", :width => "88" }
diff --git a/vendor/gems/gems/compass-0.8.17/examples/blueprint_default/parts/test-small.jpg b/vendor/gems/gems/compass-0.8.17/examples/blueprint_default/parts/test-small.jpg
new file mode 100755
index 00000000..aa599d99
Binary files /dev/null and b/vendor/gems/gems/compass-0.8.17/examples/blueprint_default/parts/test-small.jpg differ
diff --git a/vendor/gems/gems/compass-0.8.17/examples/blueprint_default/parts/test.jpg b/vendor/gems/gems/compass-0.8.17/examples/blueprint_default/parts/test.jpg
new file mode 100755
index 00000000..0107be27
Binary files /dev/null and b/vendor/gems/gems/compass-0.8.17/examples/blueprint_default/parts/test.jpg differ
diff --git a/vendor/gems/gems/compass-0.8.17/examples/blueprint_default/parts/valid.png b/vendor/gems/gems/compass-0.8.17/examples/blueprint_default/parts/valid.png
new file mode 100755
index 00000000..dd20e497
Binary files /dev/null and b/vendor/gems/gems/compass-0.8.17/examples/blueprint_default/parts/valid.png differ
diff --git a/vendor/gems/gems/compass-0.8.17/examples/blueprint_default/src/ie.sass b/vendor/gems/gems/compass-0.8.17/examples/blueprint_default/src/ie.sass
new file mode 100755
index 00000000..7af9162b
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/examples/blueprint_default/src/ie.sass
@@ -0,0 +1,3 @@
+@import blueprint.sass
+
++blueprint-ie
\ No newline at end of file
diff --git a/vendor/gems/gems/compass-0.8.17/examples/blueprint_default/src/images/grid.png b/vendor/gems/gems/compass-0.8.17/examples/blueprint_default/src/images/grid.png
new file mode 100755
index 00000000..129d4a29
Binary files /dev/null and b/vendor/gems/gems/compass-0.8.17/examples/blueprint_default/src/images/grid.png differ
diff --git a/vendor/gems/gems/compass-0.8.17/examples/blueprint_default/src/print.sass b/vendor/gems/gems/compass-0.8.17/examples/blueprint_default/src/print.sass
new file mode 100755
index 00000000..8e5d49d8
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/examples/blueprint_default/src/print.sass
@@ -0,0 +1,3 @@
+@import blueprint.sass
+
++blueprint-print
\ No newline at end of file
diff --git a/vendor/gems/gems/compass-0.8.17/examples/blueprint_default/src/screen.sass b/vendor/gems/gems/compass-0.8.17/examples/blueprint_default/src/screen.sass
new file mode 100755
index 00000000..0ca30638
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/examples/blueprint_default/src/screen.sass
@@ -0,0 +1,8 @@
+@import blueprint.sass
+@import blueprint/modules/scaffolding.sass
+@import compass/reset.sass
+
++blueprint
+// Remove the scaffolding when you're ready to start doing visual design.
+// Or leave it in if you're happy with how blueprint looks out-of-the-box
++blueprint-scaffolding
diff --git a/vendor/gems/gems/compass-0.8.17/examples/blueprint_plugins/config.rb b/vendor/gems/gems/compass-0.8.17/examples/blueprint_plugins/config.rb
new file mode 100755
index 00000000..16f4235d
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/examples/blueprint_plugins/config.rb
@@ -0,0 +1,8 @@
+# Require any additional compass plugins here.
+project_type = :stand_alone
+css_dir = "stylesheets"
+sass_dir = "src"
+images_dir = "images"
+output_style = :compact
+relative_assets = true
+
diff --git a/vendor/gems/gems/compass-0.8.17/examples/blueprint_plugins/images/buttons/cross.png b/vendor/gems/gems/compass-0.8.17/examples/blueprint_plugins/images/buttons/cross.png
new file mode 100755
index 00000000..1514d51a
Binary files /dev/null and b/vendor/gems/gems/compass-0.8.17/examples/blueprint_plugins/images/buttons/cross.png differ
diff --git a/vendor/gems/gems/compass-0.8.17/examples/blueprint_plugins/images/buttons/key.png b/vendor/gems/gems/compass-0.8.17/examples/blueprint_plugins/images/buttons/key.png
new file mode 100755
index 00000000..a9d5e4f8
Binary files /dev/null and b/vendor/gems/gems/compass-0.8.17/examples/blueprint_plugins/images/buttons/key.png differ
diff --git a/vendor/gems/gems/compass-0.8.17/examples/blueprint_plugins/images/buttons/tick.png b/vendor/gems/gems/compass-0.8.17/examples/blueprint_plugins/images/buttons/tick.png
new file mode 100755
index 00000000..a9925a06
Binary files /dev/null and b/vendor/gems/gems/compass-0.8.17/examples/blueprint_plugins/images/buttons/tick.png differ
diff --git a/vendor/gems/gems/compass-0.8.17/examples/blueprint_plugins/images/grid.png b/vendor/gems/gems/compass-0.8.17/examples/blueprint_plugins/images/grid.png
new file mode 100755
index 00000000..129d4a29
Binary files /dev/null and b/vendor/gems/gems/compass-0.8.17/examples/blueprint_plugins/images/grid.png differ
diff --git a/vendor/gems/gems/compass-0.8.17/examples/blueprint_plugins/images/link_icons/doc.png b/vendor/gems/gems/compass-0.8.17/examples/blueprint_plugins/images/link_icons/doc.png
new file mode 100755
index 00000000..834cdfaf
Binary files /dev/null and b/vendor/gems/gems/compass-0.8.17/examples/blueprint_plugins/images/link_icons/doc.png differ
diff --git a/vendor/gems/gems/compass-0.8.17/examples/blueprint_plugins/images/link_icons/email.png b/vendor/gems/gems/compass-0.8.17/examples/blueprint_plugins/images/link_icons/email.png
new file mode 100755
index 00000000..7348aed7
Binary files /dev/null and b/vendor/gems/gems/compass-0.8.17/examples/blueprint_plugins/images/link_icons/email.png differ
diff --git a/vendor/gems/gems/compass-0.8.17/examples/blueprint_plugins/images/link_icons/external.png b/vendor/gems/gems/compass-0.8.17/examples/blueprint_plugins/images/link_icons/external.png
new file mode 100755
index 00000000..cf1cfb42
Binary files /dev/null and b/vendor/gems/gems/compass-0.8.17/examples/blueprint_plugins/images/link_icons/external.png differ
diff --git a/vendor/gems/gems/compass-0.8.17/examples/blueprint_plugins/images/link_icons/feed.png b/vendor/gems/gems/compass-0.8.17/examples/blueprint_plugins/images/link_icons/feed.png
new file mode 100755
index 00000000..315c4f4f
Binary files /dev/null and b/vendor/gems/gems/compass-0.8.17/examples/blueprint_plugins/images/link_icons/feed.png differ
diff --git a/vendor/gems/gems/compass-0.8.17/examples/blueprint_plugins/images/link_icons/im.png b/vendor/gems/gems/compass-0.8.17/examples/blueprint_plugins/images/link_icons/im.png
new file mode 100755
index 00000000..79f35ccb
Binary files /dev/null and b/vendor/gems/gems/compass-0.8.17/examples/blueprint_plugins/images/link_icons/im.png differ
diff --git a/vendor/gems/gems/compass-0.8.17/examples/blueprint_plugins/images/link_icons/pdf.png b/vendor/gems/gems/compass-0.8.17/examples/blueprint_plugins/images/link_icons/pdf.png
new file mode 100755
index 00000000..8f8095e4
Binary files /dev/null and b/vendor/gems/gems/compass-0.8.17/examples/blueprint_plugins/images/link_icons/pdf.png differ
diff --git a/vendor/gems/gems/compass-0.8.17/examples/blueprint_plugins/images/link_icons/visited.png b/vendor/gems/gems/compass-0.8.17/examples/blueprint_plugins/images/link_icons/visited.png
new file mode 100755
index 00000000..ebf206de
Binary files /dev/null and b/vendor/gems/gems/compass-0.8.17/examples/blueprint_plugins/images/link_icons/visited.png differ
diff --git a/vendor/gems/gems/compass-0.8.17/examples/blueprint_plugins/images/link_icons/xls.png b/vendor/gems/gems/compass-0.8.17/examples/blueprint_plugins/images/link_icons/xls.png
new file mode 100755
index 00000000..b977d7e5
Binary files /dev/null and b/vendor/gems/gems/compass-0.8.17/examples/blueprint_plugins/images/link_icons/xls.png differ
diff --git a/vendor/gems/gems/compass-0.8.17/examples/blueprint_plugins/images/test-small.jpg b/vendor/gems/gems/compass-0.8.17/examples/blueprint_plugins/images/test-small.jpg
new file mode 100755
index 00000000..aa599d99
Binary files /dev/null and b/vendor/gems/gems/compass-0.8.17/examples/blueprint_plugins/images/test-small.jpg differ
diff --git a/vendor/gems/gems/compass-0.8.17/examples/blueprint_plugins/images/test.jpg b/vendor/gems/gems/compass-0.8.17/examples/blueprint_plugins/images/test.jpg
new file mode 100755
index 00000000..0107be27
Binary files /dev/null and b/vendor/gems/gems/compass-0.8.17/examples/blueprint_plugins/images/test.jpg differ
diff --git a/vendor/gems/gems/compass-0.8.17/examples/blueprint_plugins/images/valid.png b/vendor/gems/gems/compass-0.8.17/examples/blueprint_plugins/images/valid.png
new file mode 100755
index 00000000..dd20e497
Binary files /dev/null and b/vendor/gems/gems/compass-0.8.17/examples/blueprint_plugins/images/valid.png differ
diff --git a/vendor/gems/gems/compass-0.8.17/examples/blueprint_plugins/index.html.haml b/vendor/gems/gems/compass-0.8.17/examples/blueprint_plugins/index.html.haml
new file mode 100755
index 00000000..2cdb7ba6
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/examples/blueprint_plugins/index.html.haml
@@ -0,0 +1,96 @@
+!!!
+%html{ :lang => "en" }
+ %head
+ %meta{ :content => "text/html; charset=utf-8", "http-equiv" => "Content-Type" }
+ %title
+ Blueprint test pages
+ /
+ Framework CSS
+ %link{ :href => "stylesheets/screen.css", :rel => "stylesheet", :media => "screen, projection", :type => "text/css" }
+ %link{ :href => "stylesheets/print.css", :rel => "stylesheet", :media => "print", :type => "text/css" }
+ /
+ [if IE]> "0", :border => "0", :cellpadding => "0" }
+ %tr
+ %th.span-6
+ Test page
+ %th.span-8
+ Main files tested
+ %th.span-10
+ Description
+ %tr
+ %td
+ %a{ :href => "plugins/fancy_type.html" }
+ Fancy Type
+ %td
+ %a{ :href => "http://github.com/chriseppstein/compass/blob/master/frameworks/blueprint/stylesheets/blueprint/modules/_grid.sass" }
+ grid.sass
+ ,
+ %a{ :href => "http://github.com/chriseppstein/compass/blob/master/frameworks/blueprint/stylesheets/blueprint/modules/_typography.sass" }
+ typography.sass
+ ,
+ %a{ :href => "http://github.com/chriseppstein/compass/blob/master/frameworks/blueprint/stylesheets/blueprint/modules/_fancy_type.sass" }
+ fancy_type.sass
+ %td
+ A simple sample page, with common elements and fancy type.
+ %tr
+ %td
+ %a{ :href => "plugins/buttons.html" }
+ Buttons
+ %td
+ %a{ :href => "http://github.com/chriseppstein/compass/blob/master/frameworks/blueprint/stylesheets/blueprint/modules/_buttons.sass" }
+ buttons.sass
+ %td
+ A simple page, showing links and buttons styled using the button plugin.
+ %tr
+ %td
+ %a{ :href => "plugins/link_icons.html" }
+ Link Icons
+ %td
+ %a{ :href => "http://github.com/chriseppstein/compass/blob/master/frameworks/blueprint/stylesheets/blueprint/modules/_link_icons.sass" }
+ link_icons.sass
+ %td
+ A simple page, showing links icons.
+ %tr
+ %td
+ %a{ :href => "plugins/rtl.html" }
+ RTL
+ %td
+ %a{ :href => "http://github.com/chriseppstein/compass/blob/master/frameworks/blueprint/stylesheets/blueprint/modules/_rtl.sass" }
+ rtl.sass
+ %td
+ A simple page, showing a right-to-left grid layout.
+ %p
+ %em
+ %strong
+ Note about the css files:
+ These test files utilize the css files that are generated from
+ %a{ :href => "http://haml.hamptoncatlin.com/docs/rdoc/classes/Sass.html" }
+ Sass templates
+ \.
+ In other words, if you change any of the source files,
+ you'll have to re-build them with
+ %code
+ rake examples
+ to see any changes.
+ .box
+ %p
+ For more information and help, try these resources:
+ %ul.bottom
+ %li
+ %a{ :href => "http://www.blueprintcss.org/" }
+ The Blueprint home page.
+ %li
+ %a{ :href => "http://groups.google.com/group/blueprintcss" }
+ Our anything-goes mailing list.
+ %p
+ %a{ :href => "http://validator.w3.org/check?uri=referer" }
+ %img.top{ :src => "images/valid.png", :height => "31", :alt => "Valid HTML 4.01 Strict", :width => "88" }
diff --git a/vendor/gems/gems/compass-0.8.17/examples/blueprint_plugins/plugins/buttons.html.haml b/vendor/gems/gems/compass-0.8.17/examples/blueprint_plugins/plugins/buttons.html.haml
new file mode 100755
index 00000000..331d378d
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/examples/blueprint_plugins/plugins/buttons.html.haml
@@ -0,0 +1,67 @@
+!!!
+%html{ :lang => "en" }
+ %head
+ %meta{ :content => "text/html; charset=utf-8", "http-equiv" => "Content-Type" }
+ %title
+ Blueprint Buttons Sample Page
+ /
+ Framework CSS
+ %link{ :href => "../stylesheets/screen.css", :rel => "stylesheet", :media => "screen, projection", :type => "text/css" }
+ %link{ :href => "../stylesheets/print.css", :rel => "stylesheet", :media => "print", :type => "text/css" }
+ /
+ [if IE]> "../stylesheets/buttons.css", :rel => "stylesheet", :media => "screen, projection", :type => "text/css" }
+ %body
+ .container
+ %h1
+ A Button Example Page
+ %hr
+ %h2.alt
+ This sample page demonstrates what you can do with the Buttons plugin.
+ %hr
+ .span-12
+ %h3
+ Link Buttons
+ %a.button
+ Link Button
+ %a.button.positive
+ Positive Button
+ %a.button.negative
+ Negative Button
+ .span-12.last
+ %h3
+ Real Buttons
+ %button
+ Normal Button
+ %button.positive
+ Positive Button
+ %button.negative
+ Negative Button
+ .span-12
+ %h3
+ Link Buttons with Images
+ %a.button
+ %img{ :src => "../images/buttons/tick.png", :alt => "" }
+ Save
+ %a.button.positive
+ %img{ :src => "../images/buttons/key.png", :alt => "" }
+ Change Password
+ %a.button.negative
+ %img{ :src => "../images/buttons/cross.png", :alt => "" }
+ Cancel
+ .span-12.last
+ %h3
+ Real Buttons with Images
+ %button
+ %img{ :src => "../images/buttons/tick.png", :alt => "" }
+ Save
+ %button.positive
+ %img{ :src => "../images/buttons/key.png", :alt => "" }
+ Change Password
+ %button.negative
+ %img{ :src => "../images/buttons/cross.png", :alt => "" }
+ Cancel
+ .span-24
+ %p
+ %a{ :href => "http://validator.w3.org/check?uri=referer" }
+ %img.top{ :src => "valid.png", :height => "31", :alt => "Valid HTML 4.01 Strict", :width => "88" }
diff --git a/vendor/gems/gems/compass-0.8.17/examples/blueprint_plugins/plugins/fancy_type.html.haml b/vendor/gems/gems/compass-0.8.17/examples/blueprint_plugins/plugins/fancy_type.html.haml
new file mode 100755
index 00000000..b17c1c28
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/examples/blueprint_plugins/plugins/fancy_type.html.haml
@@ -0,0 +1,100 @@
+!!!
+%html{ :lang => "en" }
+ %head
+ %meta{ :content => "text/html; charset=utf-8", "http-equiv" => "Content-Type" }
+ %title
+ Blueprint Sample Page
+ /
+ Framework CSS
+ %link{ :href => "../stylesheets/screen.css", :rel => "stylesheet", :media => "screen, projection", :type => "text/css" }
+ %link{ :href => "../stylesheets/print.css", :rel => "stylesheet", :media => "print", :type => "text/css" }
+ /
+ [if IE]> "../images/test.jpg", :alt => "test" }
+ Lorem ipsum dolor sit amet,
+ %em
+ consectetuer adipiscing elit
+ \. Nunc congue ipsum vestibulum libero. Aenean vitae justo. Nam eget tellus. Etiam convallis, est eu lobortis mattis, lectus tellus tempus felis, a ultricies erat ipsum at metus.
+ %p
+ Lorem ipsum dolor sit amet, consectetuer adipiscing elit.
+ %a{ :href => "#" }
+ Morbi et risus
+ \. Aliquam nisl. Nulla facilisi. Cras accumsan vestibulum ante. Vestibulum sed tortor. Praesent
+ %span.caps
+ SMALL CAPS
+ tempus fringilla elit. Ut elit diam, sagittis in, nonummy in, gravida non, nunc. Ut orci. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos hymenaeos. Nam egestas, orci eu imperdiet malesuada, nisl purus fringilla odio, quis commodo est orci vitae justo. Aliquam placerat odio tincidunt nulla. Cras in libero. Aenean rutrum, magna non tristique posuere, erat odio eleifend nisl, non convallis est tortor blandit ligula. Nulla id augue.
+ %p
+ Nullam mattis, odio ut tempus facilisis, metus nisl facilisis metus, auctor consectetuer felis ligula nec mauris. Vestibulum odio erat, fermentum at, commodo vitae, ultrices et, urna. Mauris vulputate, mi pulvinar sagittis condimentum, sem nulla aliquam velit, sed imperdiet mi purus eu magna. Nulla varius metus ut eros. Aenean aliquet magna eget orci. Class aptent taciti sociosqu ad litora.
+ %p
+ Vivamus euismod. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Suspendisse vel nibh ut turpis dictum sagittis. Aliquam vel velit a elit auctor sollicitudin. Nam vel dui vel neque lacinia pretium. Quisque nunc erat, venenatis id, volutpat ut, scelerisque sed, diam. Mauris ante. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Donec mattis. Morbi dignissim sollicitudin libero. Nulla lorem.
+ %blockquote
+ %p
+ Integer cursus ornare mauris. Praesent nisl arcu, imperdiet eu, ornare id, scelerisque ut, nunc. Praesent sagittis erat sed velit tempus imperdiet. Ut tristique, ante in interdum hendrerit, erat enim faucibus felis, quis rutrum mauris lorem quis sem. Vestibulum ligula nisi, mattis nec, posuere et, blandit eu, ligula. Nam suscipit placerat odio. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos hymenaeos. Pellentesque tortor libero, venenatis vitae, rhoncus eu, placerat ut, mi. Nulla nulla.
+ %p
+ Maecenas vel metus quis magna pharetra fermentum.
+ %em
+ Integer sit amet tortor
+ \. Maecenas porttitor, pede sed gravida auctor, nulla augue aliquet elit, at pretium urna orci ut metus. Aliquam in dolor. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Sed aliquam, tellus id ornare posuere, quam nunc accumsan turpis, at convallis tellus orci et nisl. Phasellus congue neque a lorem.
+ %hr
+ .span-7.colborder
+ %h6
+ This is a nested column
+ %p
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.
+ .span-7.last
+ %h6
+ This is another nested column
+ %p
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.
+ .span-7.last
+ %h3
+ A
+ %span.alt
+ Simple
+ Sidebar
+ %p
+ Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Cras ornare mattis nunc. Mauris venenatis, pede sed aliquet vehicula, lectus tellus pulvinar neque, non cursus sem nisi vel augue.
+ %p
+ Mauris a lectus. Aliquam erat volutpat. Phasellus ultrices mi a sapien. Nunc rutrum egestas lorem. Duis ac sem sagittis elit tincidunt gravida. Mauris a lectus. Aliquam erat volutpat. Phasellus ultrices mi a sapien. Nunc rutrum egestas lorem. Duis ac sem sagittis elit tincidunt gravida.
+ %p.quiet
+ Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Cras ornare mattis nunc. Mauris venenatis, pede sed aliquet vehicula, lectus tellus pulvinar neque, non cursus sem nisi vel augue.
+ %h5
+ Incremental leading
+ %p.incr
+ Vestibulum ante ipsum primis in faucibus orci luctus vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Cras ornare mattis nunc. Mauris venenatis, pede sed aliquet vehicula, lectus tellus pulvinar neque, non cursus sem nisi vel augue. sed aliquet vehicula, lectus tellus.
+ %p.incr
+ Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Cras ornare mattis nunc. Mauris venenatis, pede sed aliquet vehicula, lectus tellus pulvinar neque, non cursus sem nisi vel augue. sed aliquet vehicula, lectus tellus pulvinar neque, non cursus sem nisi vel augue. ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Cras ornare mattis nunc. Mauris venenatis, pede sed aliquet vehicula, lectus tellus pulvinar neque, non cursus sem nisi vel augue. sed aliquet vehicula, lectus tellus pulvinar neque, non cursus sem nisi vel augue.
+ %hr
+ %h2.alt
+ You may pick and choose amongst these and many more features, so be bold.
+ %hr
+ %p
+ %a{ :href => "http://validator.w3.org/check?uri=referer" }
+ %img.top{ :src => "valid.png", :height => "31", :alt => "Valid HTML 4.01 Strict", :width => "88" }
diff --git a/vendor/gems/gems/compass-0.8.17/examples/blueprint_plugins/plugins/link_icons.html.haml b/vendor/gems/gems/compass-0.8.17/examples/blueprint_plugins/plugins/link_icons.html.haml
new file mode 100755
index 00000000..13e93f2f
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/examples/blueprint_plugins/plugins/link_icons.html.haml
@@ -0,0 +1,61 @@
+!!!
+%html{ :lang => "en" }
+ %head
+ %meta{ :content => "text/html; charset=utf-8", "http-equiv" => "Content-Type" }
+ %title
+ Blueprint Link Icons Sample Page
+ /
+ Framework CSS
+ %link{ :href => "../stylesheets/screen.css", :rel => "stylesheet", :media => "screen, projection", :type => "text/css" }
+ %link{ :href => "../stylesheets/print.css", :rel => "stylesheet", :media => "print", :type => "text/css" }
+ /
+ [if IE]> "../stylesheets/link_icons.css", :rel => "stylesheet", :media => "screen, projection", :type => "text/css" }
+ %body
+ .container
+ %h1
+ A Link Icons Example Page
+ %hr
+ %h2.alt
+ This sample page demonstrates what you can do with the Link Icons plugin.
+ %hr
+ .span-12
+ %h3
+ External Links
+ %a{ :href => "http://www.no-such-website.com/" }
+ A Normal External Link
+ %a{ :href => "http://www.google.com" }
+ A Visited External Link
+ %a{ :href => "mailto:donald@duck.com" }
+ An Email Link
+ .span-12.last
+ %h3
+ Document Links
+ %a{ :href => "http://www.no-such-website.com/sample.pdf" }
+ A .pdf Link
+ %a{ :href => "http://www.no-such-website.com/sample.doc" }
+ A .doc Link
+ %a{ :href => "http://www.no-such-website.com/sample.xls" }
+ A .xls Link
+ .span-12
+ %h3
+ Misc Links
+ %a{ :href => "http://www.no-such-website.com/sample.rss" }
+ An RSS Link
+ %a{ :href => "http://www.no-such-website.com/sample.rdf" }
+ An Atom Link
+ %a{ :href => "aim:chatmeup" }
+ A Instant Messenger Link
+ .span-12.last
+ %h3
+ Turning Icons Off
+ %a.noicon{ :href => "http://www.no-such-website.com/" }
+ A Normal External Link
+ %a.noicon{ :href => "http://www.google.com" }
+ A Visited External Link
+ %a.noicon{ :href => "mailto:donald@duck.com" }
+ An Email Link
+ .span-24
+ %p
+ %a.noicon{ :href => "http://validator.w3.org/check?uri=referer" }
+ %img.top{ :src => "valid.png", :height => "31", :alt => "Valid HTML 4.01 Strict", :width => "88" }
diff --git a/vendor/gems/gems/compass-0.8.17/examples/blueprint_plugins/plugins/rtl.html.haml b/vendor/gems/gems/compass-0.8.17/examples/blueprint_plugins/plugins/rtl.html.haml
new file mode 100755
index 00000000..58758202
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/examples/blueprint_plugins/plugins/rtl.html.haml
@@ -0,0 +1,100 @@
+!!!
+%html{ :lang => "en" }
+ %head
+ %meta{ :content => "text/html; charset=utf-8", "http-equiv" => "Content-Type" }
+ %title
+ Blueprint Sample Page
+ /
+ Framework CSS
+ %link{ :href => "../stylesheets/rtl_screen.css", :rel => "stylesheet", :media => "screen, projection", :type => "text/css" }
+ %link{ :href => "../stylesheets/print.css", :rel => "stylesheet", :media => "print", :type => "text/css" }
+ /
+ [if IE]> "../images/test.jpg", :alt => "test" }
+ Lorem ipsum dolor sit amet,
+ %em
+ consectetuer adipiscing elit
+ \. Nunc congue ipsum vestibulum libero. Aenean vitae justo. Nam eget tellus. Etiam convallis, est eu lobortis mattis, lectus tellus tempus felis, a ultricies erat ipsum at metus.
+ %p
+ Lorem ipsum dolor sit amet, consectetuer adipiscing elit.
+ %a{ :href => "#" }
+ Morbi et risus
+ \. Aliquam nisl. Nulla facilisi. Cras accumsan vestibulum ante. Vestibulum sed tortor. Praesent
+ %span.caps
+ SMALL CAPS
+ tempus fringilla elit. Ut elit diam, sagittis in, nonummy in, gravida non, nunc. Ut orci. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos hymenaeos. Nam egestas, orci eu imperdiet malesuada, nisl purus fringilla odio, quis commodo est orci vitae justo. Aliquam placerat odio tincidunt nulla. Cras in libero. Aenean rutrum, magna non tristique posuere, erat odio eleifend nisl, non convallis est tortor blandit ligula. Nulla id augue.
+ %p
+ Nullam mattis, odio ut tempus facilisis, metus nisl facilisis metus, auctor consectetuer felis ligula nec mauris. Vestibulum odio erat, fermentum at, commodo vitae, ultrices et, urna. Mauris vulputate, mi pulvinar sagittis condimentum, sem nulla aliquam velit, sed imperdiet mi purus eu magna. Nulla varius metus ut eros. Aenean aliquet magna eget orci. Class aptent taciti sociosqu ad litora.
+ %p
+ Vivamus euismod. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Suspendisse vel nibh ut turpis dictum sagittis. Aliquam vel velit a elit auctor sollicitudin. Nam vel dui vel neque lacinia pretium. Quisque nunc erat, venenatis id, volutpat ut, scelerisque sed, diam. Mauris ante. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Donec mattis. Morbi dignissim sollicitudin libero. Nulla lorem.
+ %blockquote
+ %p
+ Integer cursus ornare mauris. Praesent nisl arcu, imperdiet eu, ornare id, scelerisque ut, nunc. Praesent sagittis erat sed velit tempus imperdiet. Ut tristique, ante in interdum hendrerit, erat enim faucibus felis, quis rutrum mauris lorem quis sem. Vestibulum ligula nisi, mattis nec, posuere et, blandit eu, ligula. Nam suscipit placerat odio. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos hymenaeos. Pellentesque tortor libero, venenatis vitae, rhoncus eu, placerat ut, mi. Nulla nulla.
+ %p
+ Maecenas vel metus quis magna pharetra fermentum.
+ %em
+ Integer sit amet tortor
+ \. Maecenas porttitor, pede sed gravida auctor, nulla augue aliquet elit, at pretium urna orci ut metus. Aliquam in dolor. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Sed aliquam, tellus id ornare posuere, quam nunc accumsan turpis, at convallis tellus orci et nisl. Phasellus congue neque a lorem.
+ %hr
+ .span-7.colborder
+ %h6
+ This is a nested column
+ %p
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.
+ .span-7.last
+ %h6
+ This is another nested column
+ %p
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.
+ .span-7.last
+ %h3
+ A
+ %span.alt
+ Simple
+ Sidebar
+ %p
+ Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Cras ornare mattis nunc. Mauris venenatis, pede sed aliquet vehicula, lectus tellus pulvinar neque, non cursus sem nisi vel augue.
+ %p
+ Mauris a lectus. Aliquam erat volutpat. Phasellus ultrices mi a sapien. Nunc rutrum egestas lorem. Duis ac sem sagittis elit tincidunt gravida. Mauris a lectus. Aliquam erat volutpat. Phasellus ultrices mi a sapien. Nunc rutrum egestas lorem. Duis ac sem sagittis elit tincidunt gravida.
+ %p.quiet
+ Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Cras ornare mattis nunc. Mauris venenatis, pede sed aliquet vehicula, lectus tellus pulvinar neque, non cursus sem nisi vel augue.
+ %h5
+ Incremental leading
+ %p.incr
+ Vestibulum ante ipsum primis in faucibus orci luctus vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Cras ornare mattis nunc. Mauris venenatis, pede sed aliquet vehicula, lectus tellus pulvinar neque, non cursus sem nisi vel augue. sed aliquet vehicula, lectus tellus.
+ %p.incr
+ Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Cras ornare mattis nunc. Mauris venenatis, pede sed aliquet vehicula, lectus tellus pulvinar neque, non cursus sem nisi vel augue. sed aliquet vehicula, lectus tellus pulvinar neque, non cursus sem nisi vel augue. ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Cras ornare mattis nunc. Mauris venenatis, pede sed aliquet vehicula, lectus tellus pulvinar neque, non cursus sem nisi vel augue. sed aliquet vehicula, lectus tellus pulvinar neque, non cursus sem nisi vel augue.
+ %hr
+ %h2.alt
+ You may pick and choose amongst these and many more features, so be bold.
+ %hr
+ %p
+ %a{ :href => "http://validator.w3.org/check?uri=referer" }
+ %img.top{ :src => "valid.png", :height => "31", :alt => "Valid HTML 4.01 Strict", :width => "88" }
diff --git a/vendor/gems/gems/compass-0.8.17/examples/blueprint_plugins/src/buttons.sass b/vendor/gems/gems/compass-0.8.17/examples/blueprint_plugins/src/buttons.sass
new file mode 100755
index 00000000..e8ca96e6
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/examples/blueprint_plugins/src/buttons.sass
@@ -0,0 +1,49 @@
+@import compass/utilities/general/float.sass
+@import blueprint/modules/buttons.sass
+
+//
+ Use the following HTML code to place the buttons on your site:
+
+
+ Save
+
+
+
+ Change Password
+
+
+
+ Cancel
+
+
+a.button
+ // you can pass "left" or "right" to +anchor-button to float it in that direction
+ // or you can pass no argument to leave it inline-block (cross browser safe!) within
+ // the flow of your page.
+ +anchor-button("left")
+ // All the button color mixins take 4 optional arguments:
+ // font color, background color, border color, border highlight color
+ // the first three default to constants set in blueprint/modules/buttons.sass
+ // the last one defaults to a shade lighter than the border color.
+ +button-colors
+ +button-hover-colors
+ +button-active-colors
+
+button
+ // The +button-button mixin is just like the +anchor-button mixin, but for elements.
+ +button-button("left")
+ +button-colors
+ +button-hover-colors
+ +button-active-colors
+
+// We can change the colors for buttons of certain classes, etc.
+a.positive, button.positive
+ :color #529214
+ +button-hover-colors(#529214, #E6EFC2, #C6D880)
+ +button-active-colors(#FFF, #529214, #529214)
+
+a.negative, button.negative
+ :color #D12F19
+ +button-hover-colors(#D12F19, #FBE3E4, #FBC2C4)
+ +button-active-colors(#FFF, #D12F19, #D12F19)
+
diff --git a/vendor/gems/gems/compass-0.8.17/examples/blueprint_plugins/src/ie.sass b/vendor/gems/gems/compass-0.8.17/examples/blueprint_plugins/src/ie.sass
new file mode 100755
index 00000000..7af9162b
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/examples/blueprint_plugins/src/ie.sass
@@ -0,0 +1,3 @@
+@import blueprint.sass
+
++blueprint-ie
\ No newline at end of file
diff --git a/vendor/gems/gems/compass-0.8.17/examples/blueprint_plugins/src/images/grid.png b/vendor/gems/gems/compass-0.8.17/examples/blueprint_plugins/src/images/grid.png
new file mode 100755
index 00000000..129d4a29
Binary files /dev/null and b/vendor/gems/gems/compass-0.8.17/examples/blueprint_plugins/src/images/grid.png differ
diff --git a/vendor/gems/gems/compass-0.8.17/examples/blueprint_plugins/src/link_icons.sass b/vendor/gems/gems/compass-0.8.17/examples/blueprint_plugins/src/link_icons.sass
new file mode 100755
index 00000000..a095e833
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/examples/blueprint_plugins/src/link_icons.sass
@@ -0,0 +1,13 @@
+@import blueprint/modules/link_icons.sass
+
+// This turns link icons on for all links. You can change the scoping selector from
+// body to something more specific if you prefer.
+body
+ +link-icons
+ // Use this class if a link gets an icon when it shouldn't.
+ a.noicon
+ +no-link-icon
+ // Not all links have a url structure that can be detected,
+ // So you can set them explicitly yourself like so:
+ a#this-is-a-pdf-link
+ +link-icon("pdf.png")
diff --git a/vendor/gems/gems/compass-0.8.17/examples/blueprint_plugins/src/print.sass b/vendor/gems/gems/compass-0.8.17/examples/blueprint_plugins/src/print.sass
new file mode 100755
index 00000000..8e5d49d8
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/examples/blueprint_plugins/src/print.sass
@@ -0,0 +1,3 @@
+@import blueprint.sass
+
++blueprint-print
\ No newline at end of file
diff --git a/vendor/gems/gems/compass-0.8.17/examples/blueprint_plugins/src/rtl_screen.sass b/vendor/gems/gems/compass-0.8.17/examples/blueprint_plugins/src/rtl_screen.sass
new file mode 100755
index 00000000..5cf5459b
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/examples/blueprint_plugins/src/rtl_screen.sass
@@ -0,0 +1,13 @@
+@import blueprint.sass
+@import blueprint/modules/fancy_type.sass
+@import blueprint/modules/scaffolding.sass
+@import blueprint/modules/rtl.sass
+@import compass/reset.sass
+
+
++blueprint
++rtl-typography
++fancy-type
+// Remove the scaffolding when you're ready to start doing visual design.
+// Or leave it in if you're happy with how blueprint looks out-of-the-box
++blueprint-scaffolding
diff --git a/vendor/gems/gems/compass-0.8.17/examples/blueprint_plugins/src/screen.sass b/vendor/gems/gems/compass-0.8.17/examples/blueprint_plugins/src/screen.sass
new file mode 100755
index 00000000..4350dddb
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/examples/blueprint_plugins/src/screen.sass
@@ -0,0 +1,11 @@
+@import blueprint.sass
+@import blueprint/modules/fancy_type.sass
+@import blueprint/modules/scaffolding.sass
+@import compass/reset.sass
+
+
++blueprint
++fancy-type
+// Remove the scaffolding when you're ready to start doing visual design.
+// Or leave it in if you're happy with how blueprint looks out-of-the-box
++blueprint-scaffolding
diff --git a/vendor/gems/gems/compass-0.8.17/examples/blueprint_scoped/images/grid.png b/vendor/gems/gems/compass-0.8.17/examples/blueprint_scoped/images/grid.png
new file mode 100755
index 00000000..76aaa851
Binary files /dev/null and b/vendor/gems/gems/compass-0.8.17/examples/blueprint_scoped/images/grid.png differ
diff --git a/vendor/gems/gems/compass-0.8.17/examples/blueprint_scoped/src/ie.sass b/vendor/gems/gems/compass-0.8.17/examples/blueprint_scoped/src/ie.sass
new file mode 100755
index 00000000..badeb777
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/examples/blueprint_scoped/src/ie.sass
@@ -0,0 +1,3 @@
+@import blueprint.sass
+
++blueprint-ie("body.bp")
\ No newline at end of file
diff --git a/vendor/gems/gems/compass-0.8.17/examples/blueprint_scoped/src/print.sass b/vendor/gems/gems/compass-0.8.17/examples/blueprint_scoped/src/print.sass
new file mode 100755
index 00000000..949e578e
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/examples/blueprint_scoped/src/print.sass
@@ -0,0 +1,3 @@
+@import blueprint.sass
+
++blueprint-print("body.bp")
\ No newline at end of file
diff --git a/vendor/gems/gems/compass-0.8.17/examples/blueprint_scoped/src/screen.sass b/vendor/gems/gems/compass-0.8.17/examples/blueprint_scoped/src/screen.sass
new file mode 100755
index 00000000..400f3314
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/examples/blueprint_scoped/src/screen.sass
@@ -0,0 +1,4 @@
+@import blueprint.sass
+@import compass/reset.sass
+
++blueprint("body.bp")
\ No newline at end of file
diff --git a/vendor/gems/gems/compass-0.8.17/examples/blueprint_scoped_form/images/grid.png b/vendor/gems/gems/compass-0.8.17/examples/blueprint_scoped_form/images/grid.png
new file mode 100755
index 00000000..76aaa851
Binary files /dev/null and b/vendor/gems/gems/compass-0.8.17/examples/blueprint_scoped_form/images/grid.png differ
diff --git a/vendor/gems/gems/compass-0.8.17/examples/blueprint_scoped_form/src/ie.sass b/vendor/gems/gems/compass-0.8.17/examples/blueprint_scoped_form/src/ie.sass
new file mode 100755
index 00000000..7af9162b
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/examples/blueprint_scoped_form/src/ie.sass
@@ -0,0 +1,3 @@
+@import blueprint.sass
+
++blueprint-ie
\ No newline at end of file
diff --git a/vendor/gems/gems/compass-0.8.17/examples/blueprint_scoped_form/src/print.sass b/vendor/gems/gems/compass-0.8.17/examples/blueprint_scoped_form/src/print.sass
new file mode 100755
index 00000000..8e5d49d8
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/examples/blueprint_scoped_form/src/print.sass
@@ -0,0 +1,3 @@
+@import blueprint.sass
+
++blueprint-print
\ No newline at end of file
diff --git a/vendor/gems/gems/compass-0.8.17/examples/blueprint_scoped_form/src/screen.sass b/vendor/gems/gems/compass-0.8.17/examples/blueprint_scoped_form/src/screen.sass
new file mode 100755
index 00000000..fe065088
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/examples/blueprint_scoped_form/src/screen.sass
@@ -0,0 +1,10 @@
+@import blueprint.sass
+@import compass/reset.sass
+
++blueprint-grid
++blueprint-typography
++blueprint-utilities
++blueprint-debug
++blueprint-interaction
+form.blueprint
+ +blueprint-form
diff --git a/vendor/gems/gems/compass-0.8.17/examples/blueprint_semantic/config.rb b/vendor/gems/gems/compass-0.8.17/examples/blueprint_semantic/config.rb
new file mode 100755
index 00000000..bbb651ed
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/examples/blueprint_semantic/config.rb
@@ -0,0 +1,7 @@
+# Require any additional compass plugins here.
+project_type = :stand_alone
+css_dir = "stylesheets"
+sass_dir = "src"
+images_dir = "images"
+output_style = :compact
+relative_assets = true
diff --git a/vendor/gems/gems/compass-0.8.17/examples/blueprint_semantic/images/grid.png b/vendor/gems/gems/compass-0.8.17/examples/blueprint_semantic/images/grid.png
new file mode 100755
index 00000000..129d4a29
Binary files /dev/null and b/vendor/gems/gems/compass-0.8.17/examples/blueprint_semantic/images/grid.png differ
diff --git a/vendor/gems/gems/compass-0.8.17/examples/blueprint_semantic/index.html.haml b/vendor/gems/gems/compass-0.8.17/examples/blueprint_semantic/index.html.haml
new file mode 100755
index 00000000..4532955b
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/examples/blueprint_semantic/index.html.haml
@@ -0,0 +1,86 @@
+!!!
+%html{ :lang => "en" }
+ %head
+ %meta{ :content => "text/html; charset=utf-8", "http-equiv" => "Content-Type" }
+ %title
+ Blueprint test pages
+ /
+ Framework CSS
+ %link{ :href => "stylesheets/screen.css", :rel => "stylesheet", :media => "screen, projection", :type => "text/css" }
+ %link{ :href => "stylesheets/print.css", :rel => "stylesheet", :media => "print", :type => "text/css" }
+ /
+ [if IE]> "0", :border => "0", :cellpadding => "0" }
+ %tr
+ %th#page-header
+ Test page
+ %th#files-header
+ Main files tested
+ %th#description-header
+ Description
+ %tr
+ %td
+ %a{ :href => "parts/fancy_type.html" }
+ Fancy Type
+ %td
+ %a{ :href => "../../frameworks/blueprint/stylesheets/blueprint/modules/_grid.sass" }
+ grid.sass
+ ,
+ %a{ :href => "../../frameworks/blueprint/stylesheets/blueprint/modules/_typography.sass" }
+ typography.sass
+ ,
+ %a{ :href => "../../frameworks/blueprint/stylesheets/blueprint/modules/_fancy_type.sass" }
+ fancy_type.sass
+ %td
+ A simple sample page, with common elements and fancy type.
+ %tr
+ %td
+ %a{ :href => "parts/liquid.html" }
+ Liquid Grid
+ %td
+ %a{ :href => "../../frameworks/blueprint/stylesheets/blueprint/modules/_liquid.sass" }
+ liquid.sass
+ ,
+ %a{ :href => "../../frameworks/blueprint/stylesheets/blueprint/modules/_typography.sass" }
+ typography.sass
+ ,
+ %a{ :href => "../../frameworks/blueprint/stylesheets/blueprint/modules/_fancy_type.sass" }
+ fancy_type.sass
+ %td
+ Like Fancy Type, but using a liquid percent based grid.
+ %p
+ %em
+ %strong
+ Note about the css files:
+ These test files utilize the css files that are generated from
+ %a{ :href => "http://haml.hamptoncatlin.com/docs/rdoc/classes/Sass.html" }
+ Sass templates
+ \.
+ In other words, if you change any of the source files,
+ you'll have to re-build them with
+ %code
+ rake examples
+ to see any changes.
+ #info
+ %p
+ For more information and help, try these resources:
+ %ul
+ %li
+ %a{ :href => "http://code.google.com/p/blueprintcss" }
+ The Blueprint home page.
+ %li
+ %a{ :href => "http://groups.google.com/group/blueprintcss" }
+ Our anything-goes mailing list.
+ %li
+ %a{ :href => "http://bjorkoy.com" }
+ The blog where news about Blueprint gets posted.
+ %p
+ %a{ :href => "http://validator.w3.org/check?uri=referer" }
+ %img#w3c{ :src => "parts/valid.png", :height => "31", :alt => "Valid HTML 4.01 Strict", :width => "88" }
diff --git a/vendor/gems/gems/compass-0.8.17/examples/blueprint_semantic/parts/fancy_type.html.haml b/vendor/gems/gems/compass-0.8.17/examples/blueprint_semantic/parts/fancy_type.html.haml
new file mode 100755
index 00000000..8aabaca2
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/examples/blueprint_semantic/parts/fancy_type.html.haml
@@ -0,0 +1,100 @@
+!!!
+%html{ :lang => "en" }
+ %head
+ %meta{ :content => "text/html; charset=utf-8", "http-equiv" => "Content-Type" }
+ %title
+ Blueprint Semantic Sample Page
+ /
+ Framework CSS
+ %link{ :href => "../stylesheets/screen.css", :rel => "stylesheet", :media => "screen, projection", :type => "text/css" }
+ %link{ :href => "../stylesheets/print.css", :rel => "stylesheet", :media => "print", :type => "text/css" }
+ /
+ [if IE]> "test.jpg", :alt => "test" }
+ Lorem ipsum dolor sit amet,
+ %em
+ consectetuer adipiscing elit
+ \. Nunc congue ipsum vestibulum libero. Aenean vitae justo. Nam eget tellus. Etiam convallis, est eu lobortis mattis, lectus tellus tempus felis, a ultricies erat ipsum at metus.
+ %p
+ Lorem ipsum dolor sit amet, consectetuer adipiscing elit.
+ %a{ :href => "#" }
+ Morbi et risus
+ \. Aliquam nisl. Nulla facilisi. Cras accumsan vestibulum ante. Vestibulum sed tortor. Praesent
+ %em.caps
+ small caps
+ tempus fringilla elit. Ut elit diam, sagittis in, nonummy in, gravida non, nunc. Ut orci. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos hymenaeos. Nam egestas, orci eu imperdiet malesuada, nisl purus fringilla odio, quis commodo est orci vitae justo. Aliquam placerat odio tincidunt nulla. Cras in libero. Aenean rutrum, magna non tristique posuere, erat odio eleifend nisl, non convallis est tortor blandit ligula. Nulla id augue.
+ %p
+ Nullam mattis, odio ut tempus facilisis, metus nisl facilisis metus, auctor consectetuer felis ligula nec mauris. Vestibulum odio erat, fermentum at, commodo vitae, ultrices et, urna. Mauris vulputate, mi pulvinar sagittis condimentum, sem nulla aliquam velit, sed imperdiet mi purus eu magna. Nulla varius metus ut eros. Aenean aliquet magna eget orci. Class aptent taciti sociosqu ad litora.
+ %p
+ Vivamus euismod. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Suspendisse vel nibh ut turpis dictum sagittis. Aliquam vel velit a elit auctor sollicitudin. Nam vel dui vel neque lacinia pretium. Quisque nunc erat, venenatis id, volutpat ut, scelerisque sed, diam. Mauris ante. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Donec mattis. Morbi dignissim sollicitudin libero. Nulla lorem.
+ %blockquote
+ %p
+ Integer cursus ornare mauris. Praesent nisl arcu, imperdiet eu, ornare id, scelerisque ut, nunc. Praesent sagittis erat sed velit tempus imperdiet. Ut tristique, ante in interdum hendrerit, erat enim faucibus felis, quis rutrum mauris lorem quis sem. Vestibulum ligula nisi, mattis nec, posuere et, blandit eu, ligula. Nam suscipit placerat odio. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos hymenaeos. Pellentesque tortor libero, venenatis vitae, rhoncus eu, placerat ut, mi. Nulla nulla.
+ %p
+ Maecenas vel metus quis magna pharetra fermentum.
+ %em
+ Integer sit amet tortor
+ \. Maecenas porttitor, pede sed gravida auctor, nulla augue aliquet elit, at pretium urna orci ut metus. Aliquam in dolor. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Sed aliquam, tellus id ornare posuere, quam nunc accumsan turpis, at convallis tellus orci et nisl. Phasellus congue neque a lorem.
+ %hr
+ #nested-1
+ %h6
+ This is a nested column
+ %p
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.
+ #nested-2
+ %h6
+ This is another nested column
+ %p
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.
+ #sidebar
+ %h3
+ A
+ %em
+ Simple
+ Sidebar
+ %p
+ Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Cras ornare mattis nunc. Mauris venenatis, pede sed aliquet vehicula, lectus tellus pulvinar neque, non cursus sem nisi vel augue.
+ %p
+ Mauris a lectus. Aliquam erat volutpat. Phasellus ultrices mi a sapien. Nunc rutrum egestas lorem. Duis ac sem sagittis elit tincidunt gravida. Mauris a lectus. Aliquam erat volutpat. Phasellus ultrices mi a sapien. Nunc rutrum egestas lorem. Duis ac sem sagittis elit tincidunt gravida.
+ %p.quiet
+ Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Cras ornare mattis nunc. Mauris venenatis, pede sed aliquet vehicula, lectus tellus pulvinar neque, non cursus sem nisi vel augue.
+ %h5
+ Incremental leading
+ %p.incr
+ Vestibulum ante ipsum primis in faucibus orci luctus vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Cras ornare mattis nunc. Mauris venenatis, pede sed aliquet vehicula, lectus tellus pulvinar neque, non cursus sem nisi vel augue. sed aliquet vehicula, lectus tellus.
+ %p.incr
+ Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Cras ornare mattis nunc. Mauris venenatis, pede sed aliquet vehicula, lectus tellus pulvinar neque, non cursus sem nisi vel augue. sed aliquet vehicula, lectus tellus pulvinar neque, non cursus sem nisi vel augue. ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Cras ornare mattis nunc. Mauris venenatis, pede sed aliquet vehicula, lectus tellus pulvinar neque, non cursus sem nisi vel augue. sed aliquet vehicula, lectus tellus pulvinar neque, non cursus sem nisi vel augue.
+ %hr
+ %h2#parting-thought
+ You may pick and choose amongst these and many more features, so be bold.
+ %hr
+ %p
+ %a{ :href => "http://validator.w3.org/check?uri=referer" }
+ %img#w3c{ :src => "valid.png", :height => "31", :alt => "Valid HTML 4.01 Strict", :width => "88" }
diff --git a/vendor/gems/gems/compass-0.8.17/examples/blueprint_semantic/parts/liquid.html.haml b/vendor/gems/gems/compass-0.8.17/examples/blueprint_semantic/parts/liquid.html.haml
new file mode 100755
index 00000000..46e7391b
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/examples/blueprint_semantic/parts/liquid.html.haml
@@ -0,0 +1,100 @@
+!!!
+%html{ :lang => "en" }
+ %head
+ %meta{ :content => "text/html; charset=utf-8", "http-equiv" => "Content-Type" }
+ %title
+ Blueprint Liquid Grid Semantic Sample Page
+ /
+ Framework CSS
+ %link{ :href => "../stylesheets/liquid.css", :rel => "stylesheet", :media => "screen, projection", :type => "text/css" }
+ %link{ :href => "../stylesheets/print.css", :rel => "stylesheet", :media => "print", :type => "text/css" }
+ /
+ [if IE]> "test.jpg", :alt => "test" }
+ Lorem ipsum dolor sit amet,
+ %em
+ consectetuer adipiscing elit
+ \. Nunc congue ipsum vestibulum libero. Aenean vitae justo. Nam eget tellus. Etiam convallis, est eu lobortis mattis, lectus tellus tempus felis, a ultricies erat ipsum at metus.
+ %p
+ Lorem ipsum dolor sit amet, consectetuer adipiscing elit.
+ %a{ :href => "#" }
+ Morbi et risus
+ \. Aliquam nisl. Nulla facilisi. Cras accumsan vestibulum ante. Vestibulum sed tortor. Praesent
+ %em.caps
+ small caps
+ tempus fringilla elit. Ut elit diam, sagittis in, nonummy in, gravida non, nunc. Ut orci. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos hymenaeos. Nam egestas, orci eu imperdiet malesuada, nisl purus fringilla odio, quis commodo est orci vitae justo. Aliquam placerat odio tincidunt nulla. Cras in libero. Aenean rutrum, magna non tristique posuere, erat odio eleifend nisl, non convallis est tortor blandit ligula. Nulla id augue.
+ %p
+ Nullam mattis, odio ut tempus facilisis, metus nisl facilisis metus, auctor consectetuer felis ligula nec mauris. Vestibulum odio erat, fermentum at, commodo vitae, ultrices et, urna. Mauris vulputate, mi pulvinar sagittis condimentum, sem nulla aliquam velit, sed imperdiet mi purus eu magna. Nulla varius metus ut eros. Aenean aliquet magna eget orci. Class aptent taciti sociosqu ad litora.
+ %p
+ Vivamus euismod. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Suspendisse vel nibh ut turpis dictum sagittis. Aliquam vel velit a elit auctor sollicitudin. Nam vel dui vel neque lacinia pretium. Quisque nunc erat, venenatis id, volutpat ut, scelerisque sed, diam. Mauris ante. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Donec mattis. Morbi dignissim sollicitudin libero. Nulla lorem.
+ %blockquote
+ %p
+ Integer cursus ornare mauris. Praesent nisl arcu, imperdiet eu, ornare id, scelerisque ut, nunc. Praesent sagittis erat sed velit tempus imperdiet. Ut tristique, ante in interdum hendrerit, erat enim faucibus felis, quis rutrum mauris lorem quis sem. Vestibulum ligula nisi, mattis nec, posuere et, blandit eu, ligula. Nam suscipit placerat odio. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos hymenaeos. Pellentesque tortor libero, venenatis vitae, rhoncus eu, placerat ut, mi. Nulla nulla.
+ %p
+ Maecenas vel metus quis magna pharetra fermentum.
+ %em
+ Integer sit amet tortor
+ \. Maecenas porttitor, pede sed gravida auctor, nulla augue aliquet elit, at pretium urna orci ut metus. Aliquam in dolor. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Sed aliquam, tellus id ornare posuere, quam nunc accumsan turpis, at convallis tellus orci et nisl. Phasellus congue neque a lorem.
+ %hr
+ #nested-1
+ %h6
+ This is a nested column
+ %p
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.
+ #nested-2
+ %h6
+ This is another nested column
+ %p
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.
+ #sidebar
+ %h3
+ A
+ %em
+ Simple
+ Sidebar
+ %p
+ Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Cras ornare mattis nunc. Mauris venenatis, pede sed aliquet vehicula, lectus tellus pulvinar neque, non cursus sem nisi vel augue.
+ %p
+ Mauris a lectus. Aliquam erat volutpat. Phasellus ultrices mi a sapien. Nunc rutrum egestas lorem. Duis ac sem sagittis elit tincidunt gravida. Mauris a lectus. Aliquam erat volutpat. Phasellus ultrices mi a sapien. Nunc rutrum egestas lorem. Duis ac sem sagittis elit tincidunt gravida.
+ %p.quiet
+ Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Cras ornare mattis nunc. Mauris venenatis, pede sed aliquet vehicula, lectus tellus pulvinar neque, non cursus sem nisi vel augue.
+ %h5
+ Incremental leading
+ %p.incr
+ Vestibulum ante ipsum primis in faucibus orci luctus vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Cras ornare mattis nunc. Mauris venenatis, pede sed aliquet vehicula, lectus tellus pulvinar neque, non cursus sem nisi vel augue. sed aliquet vehicula, lectus tellus.
+ %p.incr
+ Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Cras ornare mattis nunc. Mauris venenatis, pede sed aliquet vehicula, lectus tellus pulvinar neque, non cursus sem nisi vel augue. sed aliquet vehicula, lectus tellus pulvinar neque, non cursus sem nisi vel augue. ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Cras ornare mattis nunc. Mauris venenatis, pede sed aliquet vehicula, lectus tellus pulvinar neque, non cursus sem nisi vel augue. sed aliquet vehicula, lectus tellus pulvinar neque, non cursus sem nisi vel augue.
+ %hr
+ %h2#parting-thought
+ You may pick and choose amongst these and many more features, so be bold.
+ %hr
+ %p
+ %a{ :href => "http://validator.w3.org/check?uri=referer" }
+ %img#w3c{ :src => "valid.png", :height => "31", :alt => "Valid HTML 4.01 Strict", :width => "88" }
diff --git a/vendor/gems/gems/compass-0.8.17/examples/blueprint_semantic/parts/test-small.jpg b/vendor/gems/gems/compass-0.8.17/examples/blueprint_semantic/parts/test-small.jpg
new file mode 100755
index 00000000..aa599d99
Binary files /dev/null and b/vendor/gems/gems/compass-0.8.17/examples/blueprint_semantic/parts/test-small.jpg differ
diff --git a/vendor/gems/gems/compass-0.8.17/examples/blueprint_semantic/parts/test.jpg b/vendor/gems/gems/compass-0.8.17/examples/blueprint_semantic/parts/test.jpg
new file mode 100755
index 00000000..0107be27
Binary files /dev/null and b/vendor/gems/gems/compass-0.8.17/examples/blueprint_semantic/parts/test.jpg differ
diff --git a/vendor/gems/gems/compass-0.8.17/examples/blueprint_semantic/parts/valid.png b/vendor/gems/gems/compass-0.8.17/examples/blueprint_semantic/parts/valid.png
new file mode 100755
index 00000000..dd20e497
Binary files /dev/null and b/vendor/gems/gems/compass-0.8.17/examples/blueprint_semantic/parts/valid.png differ
diff --git a/vendor/gems/gems/compass-0.8.17/examples/blueprint_semantic/src/ie.sass b/vendor/gems/gems/compass-0.8.17/examples/blueprint_semantic/src/ie.sass
new file mode 100755
index 00000000..7af9162b
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/examples/blueprint_semantic/src/ie.sass
@@ -0,0 +1,3 @@
+@import blueprint.sass
+
++blueprint-ie
\ No newline at end of file
diff --git a/vendor/gems/gems/compass-0.8.17/examples/blueprint_semantic/src/images/grid.png b/vendor/gems/gems/compass-0.8.17/examples/blueprint_semantic/src/images/grid.png
new file mode 100755
index 00000000..129d4a29
Binary files /dev/null and b/vendor/gems/gems/compass-0.8.17/examples/blueprint_semantic/src/images/grid.png differ
diff --git a/vendor/gems/gems/compass-0.8.17/examples/blueprint_semantic/src/liquid.sass b/vendor/gems/gems/compass-0.8.17/examples/blueprint_semantic/src/liquid.sass
new file mode 100755
index 00000000..04e500b9
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/examples/blueprint_semantic/src/liquid.sass
@@ -0,0 +1,70 @@
+@import blueprint.sass
+@import blueprint/modules/fancy_type.sass
+@import blueprint/modules/scaffolding.sass
+@import blueprint/modules/liquid.sass
+@import compass/reset.sass
+
+.container
+ +container
+
++blueprint-typography("body.blueprint")
+
+body.blueprint
+ +blueprint-scaffolding-body
+ hr
+ +colruler
+ hr.space
+ +colspacer
+ img#w3c
+ :margin-top 0
+ :padding-top 0
+
+body#index
+ #page-header
+ +span(6)
+ #files-header
+ +span(8)
+ #description-header
+ +span(10)
+ #info
+ +box
+ ul
+ :margin-bottom 0
+ :padding-bottom 0
+
+body#sample
+ +fancy-paragraphs
+ h2
+ +alt
+ #first-box
+ +column(7)
+ +colborder
+ #another-box
+ +column(8)
+ +colborder
+ #aligned-box
+ +column(7, true)
+ #main
+ +column(15)
+ +prepend(1)
+ +colborder
+ img#test
+ +pull(1)
+ :margin-top 0
+ :padding-top 0
+ em.caps
+ +reset-font
+ +caps
+ #nested-1
+ +column(7)
+ +colborder
+ #nested-2
+ +column(7, true)
+ #sidebar
+ +column(7, true)
+ h3
+ em
+ +reset-font
+ +alt
+ #parting-thought
+ +alt
\ No newline at end of file
diff --git a/vendor/gems/gems/compass-0.8.17/examples/blueprint_semantic/src/print.sass b/vendor/gems/gems/compass-0.8.17/examples/blueprint_semantic/src/print.sass
new file mode 100755
index 00000000..8e5d49d8
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/examples/blueprint_semantic/src/print.sass
@@ -0,0 +1,3 @@
+@import blueprint.sass
+
++blueprint-print
\ No newline at end of file
diff --git a/vendor/gems/gems/compass-0.8.17/examples/blueprint_semantic/src/screen.sass b/vendor/gems/gems/compass-0.8.17/examples/blueprint_semantic/src/screen.sass
new file mode 100755
index 00000000..9ad7bd09
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/examples/blueprint_semantic/src/screen.sass
@@ -0,0 +1,71 @@
+@import blueprint.sass
+@import blueprint/modules/fancy_type.sass
+@import blueprint/modules/scaffolding.sass
+@import compass/reset.sass
+
++blueprint-typography("body.blueprint")
+
+body.blueprint
+ +blueprint-scaffolding-body
+ .container
+ +container
+ .showgrid
+ :background= inline_image("grid.png")
+ hr
+ +colruler
+ hr.space
+ +colspacer
+
+ img#w3c
+ :margin-top 0
+ :padding-top 0
+
+body#index
+ #page-header
+ +span(6)
+ #files-header
+ +span(8)
+ #description-header
+ +span(10)
+ #info
+ +box
+ ul
+ :margin-bottom 0
+ :padding-bottom 0
+
+body#sample
+ +fancy-paragraphs
+ h2
+ +alt
+ #first-box
+ +column(7)
+ +colborder
+ #another-box
+ +column(8)
+ +colborder
+ #aligned-box
+ +column(7, true)
+ #main
+ +column(15)
+ +prepend(1)
+ +colborder
+ img#test
+ +pull(1)
+ :margin-top 0
+ :padding-top 0
+ em.caps
+ +reset-font
+ +caps
+ #nested-1
+ +column(7)
+ +colborder
+ #nested-2
+ +column(7, true)
+ #sidebar
+ +column(7, true)
+ h3
+ em
+ +reset-font
+ +alt
+ #parting-thought
+ +alt
\ No newline at end of file
diff --git a/vendor/gems/gems/compass-0.8.17/examples/compass/compass.html.haml b/vendor/gems/gems/compass-0.8.17/examples/compass/compass.html.haml
new file mode 100755
index 00000000..5b36bfc2
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/examples/compass/compass.html.haml
@@ -0,0 +1,39 @@
+%html
+ %head
+ %title
+ Compass Example
+ %link{ :href => "stylesheets/compass.css", :rel => "stylesheet", :media => "screen, projection", :type => "text/css" }
+ %body
+ .compass
+ .n
+ %p
+ North
+ .n.e
+ %p
+ North
+ %br
+ East
+ .e
+ %p
+ East
+ .s.e
+ %p
+ South
+ %br
+ East
+ .s
+ %p
+ South
+ .s.w
+ %p
+ South
+ %br
+ West
+ .w
+ %p
+ West
+ .n.w
+ %p
+ North
+ %br
+ West
diff --git a/vendor/gems/gems/compass-0.8.17/examples/compass/config.rb b/vendor/gems/gems/compass-0.8.17/examples/compass/config.rb
new file mode 100755
index 00000000..bbb651ed
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/examples/compass/config.rb
@@ -0,0 +1,7 @@
+# Require any additional compass plugins here.
+project_type = :stand_alone
+css_dir = "stylesheets"
+sass_dir = "src"
+images_dir = "images"
+output_style = :compact
+relative_assets = true
diff --git a/vendor/gems/gems/compass-0.8.17/examples/compass/images/blue_arrow.gif b/vendor/gems/gems/compass-0.8.17/examples/compass/images/blue_arrow.gif
new file mode 100755
index 00000000..02dfb003
Binary files /dev/null and b/vendor/gems/gems/compass-0.8.17/examples/compass/images/blue_arrow.gif differ
diff --git a/vendor/gems/gems/compass-0.8.17/examples/compass/src/compass.sass b/vendor/gems/gems/compass-0.8.17/examples/compass/src/compass.sass
new file mode 100755
index 00000000..9a96490e
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/examples/compass/src/compass.sass
@@ -0,0 +1,47 @@
+=compass(!s)
+ :position relative
+ :width= 4 * !s
+ :height= 4 * !s
+ :font-size 24px
+ :font-family "Academy Engraved LET", "Papyrus"
+ .n, .s, .e, .w
+ :position absolute
+ :width= !s
+ :height= !s
+ :text-align center
+ :vertical-align middle
+ .w
+ :left 0px
+ .n.w, .s.w
+ :left= 0.5 * !s
+ .n, .s
+ :left= 1.5 * !s
+ .n.e, .s.e
+ :left= 2.5 * !s
+ .e
+ :left= 3 * !s
+ .n
+ :top 0px
+ .n.w, .n.e
+ :top= 0.5 * !s
+ .w, .e
+ :top= 1.5 * !s
+ .s.w, .s.e
+ :top= 2.5 * !s
+ .s
+ :top= 3 * !s
+
+.compass
+ :margin 1em auto
+ +compass(4em)
+ .n, .s, .e, .w
+ p
+ :margin
+ :top 1.5em
+ :bottom 1.5em
+ .n.w, .s.w, .n.e, .s.e
+ p
+ :margin
+ :top 1em
+ :bottom 1em
+
\ No newline at end of file
diff --git a/vendor/gems/gems/compass-0.8.17/examples/compass/src/images/blue_arrow.gif b/vendor/gems/gems/compass-0.8.17/examples/compass/src/images/blue_arrow.gif
new file mode 100755
index 00000000..02dfb003
Binary files /dev/null and b/vendor/gems/gems/compass-0.8.17/examples/compass/src/images/blue_arrow.gif differ
diff --git a/vendor/gems/gems/compass-0.8.17/examples/compass/src/sticky_footer.sass b/vendor/gems/gems/compass-0.8.17/examples/compass/src/sticky_footer.sass
new file mode 100755
index 00000000..bfa2b356
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/examples/compass/src/sticky_footer.sass
@@ -0,0 +1,11 @@
+@import compass/reset.sass
+@import compass/layout.sass
+
++sticky-footer(72px, "#layout", "#layout_footer", "#footer")
+
+#header
+ :background #999
+ :height 72px
+
+#footer
+ :background #ccc
diff --git a/vendor/gems/gems/compass-0.8.17/examples/compass/src/utilities.sass b/vendor/gems/gems/compass-0.8.17/examples/compass/src/utilities.sass
new file mode 100755
index 00000000..404a8d6d
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/examples/compass/src/utilities.sass
@@ -0,0 +1,108 @@
+@import compass/reset.sass
+@import compass/utilities.sass
+@import yui/modules/base.sass
+@import blueprint/modules/grid.sass
+@import blueprint/modules/scaffolding.sass
+@import compass/utilities/text/ellipsis.sass
+
+html
+ +yui-base
+
+h2
+ :margin-top 0
+ :border-bottom 2px solid #777
+
+#utilities
+ +container
+
+.example
+ :border 2px solid #ccc
+ :padding 4px
+
+#links
+ +column(8)
+
+ .hover a
+ +hover-link
+ .colored a
+ +link-colors(#C00, #C0C, #700, #707, #777)
+ .unstyled
+ :color #333
+ a
+ +unstyled-link
+.mixin
+ :font-family monospace
+ :border
+ :width 1px
+ :style solid
+ :border-color #ccc
+ :border-color -moz-use-text-color
+ :padding 2px
+ :line-height 22px
+ :white-space nowrap
+
+#tag-cloud
+ +column(8)
+ ol
+ :margin 0
+ +inline-list
+ +tag-cloud(1em)
+ li
+ +no-bullets
+
+#lists
+ +column(8, true)
+ ul.inline
+ +inline-list
+ ul.comma-delimited
+ +comma-delimited-list
+ ol.pretty
+ +pretty-bullets("blue_arrow.gif", 5px, 7px, 18px)
+
+#tables
+ +column(16)
+ table.alternating
+ :width 100%
+ +alternating-rows-and-columns(#F9E5A7,#CEFBB3,#222)
+ +table-scaffolding
+ +outer-table-borders(2px, #151A99)
+ +inner-table-borders(1px, #151A99)
+
+#ellipsis
+ +column(8, true)
+ td
+ width: 50%
+ +ellipsis
+
+#floats
+ +column(16)
+ .clearfix-example
+ :background #ddd
+ :border 2px solid black
+ :text-align center
+ +clearfix
+ .float-left-example, .float-right-example
+ :border 1px solid black
+ :padding 10px
+ :margin 0 20px
+ :width 25%
+ :background #F9E5A7
+ .float-left-example
+ +float-left
+ .float-right-example
+ +float-right
+ .pie-clearfix-example
+ :background #ddd
+ :border 2px solid black
+ :text-align center
+ :position relative
+ +pie-clearfix
+ .positioned-example
+ :display block
+ :position absolute
+ :left -10px
+ :top -10px
+ :font-size 10px
+ :width 10em
+ :background #ccf
+ :border 1px solid black
diff --git a/vendor/gems/gems/compass-0.8.17/examples/compass/sticky_footer.html.haml b/vendor/gems/gems/compass-0.8.17/examples/compass/sticky_footer.html.haml
new file mode 100755
index 00000000..495ed779
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/examples/compass/sticky_footer.html.haml
@@ -0,0 +1,14 @@
+!!! Transitional
+%html{:xmlns => "http://www.w3.org/1999/xhtml", "xml:lang" => "en", :lang => "en"}
+ %head
+ %meta{'http-equiv' => "content-type", :content => "text/html;charset=UTF-8"}
+ %title Compass Sticky Footer Example
+ %link{:rel=>"stylesheet", :href=>"stylesheets/sticky_footer.css", :type=>"text/css", :media=>"screen, projection"}
+ %body
+ #layout
+ #header
+ %h1 Sticky Footer Example
+ This is the main content area.
+ #layout_footer
+ #footer
+ This is the footer area.
\ No newline at end of file
diff --git a/vendor/gems/gems/compass-0.8.17/examples/compass/utilities.html.haml b/vendor/gems/gems/compass-0.8.17/examples/compass/utilities.html.haml
new file mode 100755
index 00000000..2fa72ab1
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/examples/compass/utilities.html.haml
@@ -0,0 +1,189 @@
+!!! Transitional
+%html{:xmlns => "http://www.w3.org/1999/xhtml", "xml:lang" => "en", :lang => "en"}
+ %head
+ %meta{'http-equiv' => "content-type", :content => "text/html;charset=UTF-8"}
+ %title Compass Utilities Example
+ %link{:rel=>"stylesheet", :href=>"stylesheets/utilities.css", :type=>"text/css", :media=>"screen, projection"}
+ %body
+ #utilities
+ %h1 Compass Utilities Demo
+ #links
+ .example
+ %h2 Link Styling
+ %ul
+ %li.normal
+ %a{:href => "#normal-link"} This is a link, nothing special about it.
+ %li.hover
+ %a{:href => '#hover-link'}
+ This is underlined when hovered because it is using the
+ %code.mixin +hover-link
+ mixin.
+ %li.colored
+ %a{:href => '#colored-link'}
+ This should have different colors
+ because it is using the
+ %code.mixin +link-colors
+ mixin.
+ %li.unstyled
+ This is some text
+ %a{:href => '#unstyled-link'} with a link in it.
+ But you shouldn't see it
+ because it is using the
+ %code.mixin +unstyled-link
+ mixin.
+ #tag-cloud
+ .example
+ %h2 Tag Cloud
+ %p
+ This tag cloud is actually an ordered list so that the markup semantics are correct.
+ It demonstrates the following mixins:
+ %ul
+ %li
+ %code.mixin +inline-list
+ %li
+ %code.mixin +tag-cloud(1em)
+ %li
+ %code.mixin +no-bullets
+ %ol
+ %li.xxs lorem
+ %li.xs ipsum
+ %li.s dolor
+ %li sit
+ %li.l amet
+ %li.xl consectetur
+ %li.xxl adipisicing
+ %li.xs elit
+ %li.s sed
+ %li.l eiusmod
+ %li.xxl tempor
+ %li.xxs incididunt
+ %li labore
+ %li.xs dolore
+ %li magna
+ %li.xl aliqua
+ #lists
+ .example
+ %h2 Lists
+ .p
+ This text contains
+ %ul.inline
+ %li a
+ %li list
+ %li that
+ %li is
+ %li completely
+ %li inline
+ so be semantic!
+ My favorite colors are:
+ %ul.comma-delimited
+ %li red
+ %li yellow
+ %li blue
+ %ol.pretty
+ %li
+ This uses the
+ %code.mixin +pretty-bullets
+ mixin.
+ %li Do you like them?
+ %li If you don't...
+ %li Make them yourself!
+ #tables
+ .example
+ %h2 Tables
+ %p
+ This table is styled using
+ %code.mixin +alternating-rows-and-columns(#F9E5A7,#CEFBB3,#222)
+ The first colors are the even/odd colors respectively
+ and the last argument is a shade that is subtracted from those
+ colors for the even columns.
+ %p
+ The borders are created using
+ %code.mixin +outer-table-borders(2px, #151A99)
+ and
+ %code.mixin +inner-table-borders(1px, #151A99)
+ %table.alternating{:cellspacing => 0, :cellpadding => 0, :border => 0}
+ %thead
+ %tr
+ %th
+ %th.even Header #1
+ %th.odd Header #2
+ %th.even Header #3
+ %tr.odd
+ %th Row #1
+ %td.numeric.even 1.1
+ %td.numeric.odd 1.2
+ %td.numeric.even 1.3
+ %tr.even
+ %th Row #2
+ %td.numeric.even 2.1
+ %td.numeric.odd 2.2
+ %td.numeric.even 2.3
+ %tr.odd
+ %th Row #3
+ %td.numeric.even 3.1
+ %td.numeric.odd 3.2
+ %td.numeric.even 3.3
+ %tr.even
+ %th Row #4
+ %td.numeric.even 4.1
+ %td.numeric.odd 4.2
+ %td.numeric.even 4.3
+ %tr.odd.last
+ %th Row #5
+ %td.numeric.even 5.1
+ %td.numeric.odd 5.2
+ %td.numeric.even 5.3
+ %tfoot
+ %tr
+ %th Totals
+ %td.numeric.even 15.5
+ %td.numeric.odd 16.0
+ %td.numeric.even 17.5
+ #ellipsis
+ .example
+ %h2 Ellipsis
+ %p This long text is truncated at the end of the first line. Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
+ #floats
+ .example
+ %h2 Floats
+ %p
+ The float helpers add fixes for the double-margin float
+ bug, so you don't need to remember.
+ %p
+ Floated elements will extend beyond the bottom boundary of their
+ parent container unless a
+ %code.mixin +clearfix
+ is applied to the parent.
+ %p
+ The regular
+ %code.mixin +clearfix
+ method uses overflow:hidden. This is a simple and reliable way to
+ get your box wrapped around your float elements.
+ .clearfix-example
+ .float-left-example
+ This div is styled with
+ %code.mixin +float-left
+ \. It is taller than its parent and it should be 20px from the left edge.
+ .float-right-example
+ This short div is styled with
+ %code.mixin +float-right
+ and it should be 20px from the right edge, even in IE6.
+ This div is styled with
+ %code.mixin +clearfix
+ %p
+ An alternate clearing method is provided for when elements need
+ to be positioned to hang outside the box. This is based on the
+ \:after content method.
+ .pie-clearfix-example
+ .float-left-example
+ This div is styled with
+ %code.mixin +float-left
+ \. It is taller than its parent and it should be 20px from the left edge.
+ .float-right-example
+ This short div is styled with
+ %code.mixin +float-right
+ and it should be 20px from the right edge, even in IE6.
+ This div is styled with
+ %code.mixin +pie-clearfix
+ .positioned-example
+ Using this clear method, this positioned box is not cut off.
diff --git a/vendor/gems/gems/compass-0.8.17/examples/logo/logo.html.haml b/vendor/gems/gems/compass-0.8.17/examples/logo/logo.html.haml
new file mode 100755
index 00000000..35c52702
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/examples/logo/logo.html.haml
@@ -0,0 +1,40 @@
+%html
+ %head
+ %link{ :href => "stylesheets/screen.css", :rel => "stylesheet", :media => "screen", :type => "text/css", :charset => "utf-8" }
+ %body
+ #logo-large
+ %span.selector
+ un
+ %span.brace
+ {
+ %span.rule
+ ob:tru-sive;
+ %span.brace
+ }
+ #logo-medium
+ %span.selector
+ un
+ %span.brace
+ {
+ %span.rule
+ ob:tru-sive;
+ %span.brace
+ }
+ #logo
+ %span.selector
+ un
+ %span.brace
+ {
+ %span.rule
+ ob:tru-sive;
+ %span.brace
+ }
+ #logo-small
+ %span.selector
+ un
+ %span.brace
+ {
+ %span.rule
+ ob:tru-sive;
+ %span.brace
+ }
diff --git a/vendor/gems/gems/compass-0.8.17/examples/logo/src/ie.sass b/vendor/gems/gems/compass-0.8.17/examples/logo/src/ie.sass
new file mode 100755
index 00000000..b38d08b4
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/examples/logo/src/ie.sass
@@ -0,0 +1,6 @@
+/*
+ Welcome to Compass. Use this file to write IE specific override styles.
+ Import this file using the following HTML or equivalent:
+
diff --git a/vendor/gems/gems/compass-0.8.17/examples/logo/src/print.sass b/vendor/gems/gems/compass-0.8.17/examples/logo/src/print.sass
new file mode 100755
index 00000000..34991cab
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/examples/logo/src/print.sass
@@ -0,0 +1,6 @@
+/*
+ Welcome to Compass. Use this file to define print styles.
+ Import this file using the following HTML or equivalent:
+
+
+
diff --git a/vendor/gems/gems/compass-0.8.17/examples/logo/src/screen.sass b/vendor/gems/gems/compass-0.8.17/examples/logo/src/screen.sass
new file mode 100755
index 00000000..d4cff66f
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/examples/logo/src/screen.sass
@@ -0,0 +1,29 @@
+/*
+ Welcome to Compass.
+ In this file you should write your main styles. (or centralize your imports)
+ Import this file using the following HTML or equivalent:
+
+
+@import compass/reset.sass
+@import compass/misc.sass
+
+#logo-large,
+#logo-medium,
+#logo,
+#logo-small
+ :text-align center
+ :margin
+ :bottom 40px
+
+#logo-large
+ +unobtrusive-logo(3em)
+ :margin-top 20px
+
+#logo-medium
+ +unobtrusive-logo(2em)
+
+#logo
+ +unobtrusive-logo
+
+#logo-small
+ +unobtrusive-logo(0.5em)
diff --git a/vendor/gems/gems/compass-0.8.17/examples/yui/divisions.html.haml b/vendor/gems/gems/compass-0.8.17/examples/yui/divisions.html.haml
new file mode 100755
index 00000000..c4fa50e2
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/examples/yui/divisions.html.haml
@@ -0,0 +1,179 @@
+!!! Transitional
+%html{:xmlns => "http://www.w3.org/1999/xhtml", "xml:lang" => "en", :lang => "en"}
+ %head
+ %title Yahoo Grid Divisions Example
+ %link{:rel=>"stylesheet", :href=>"stylesheets/screen.css", :type=>"text/css", :media=>"screen, projection"}
+ :javascript
+ function changeTemplate() {
+ var templateClass = document.getElementById("current-template").value;
+ document.getElementById("doc4").className = templateClass;
+ }
+ %style{:type => "text/css"}
+ :sass
+ .yui-b
+ border: 1px dotted #ccc
+ %body
+ #doc4.yui-t2
+ #hd
+ %h1 Yahoo Grid Divisions Example
+ #bd
+ .yui-b
+ %h3 YUI Examples
+ %ul
+ %li
+ %a{:href=>"templates.html"} Template Presets
+ %li
+ %a{:href=>"typography.html"} Typography
+ %li
+ %a{:href=>"divisions.html"} Grid Divisions
+ %label{:for => "current-template"} Select Template Preset
+ %select{:id=>"current-template", :onchange => "changeTemplate()"}
+ %option{:value => "yui-t1"}= ".yui-t1"
+ %option{:value => "yui-t2", :selected => "selected"}= ".yui-t2"
+ %option{:value => "yui-t3"}= ".yui-t3"
+ %option{:value => "yui-t4"}= ".yui-t4"
+ %option{:value => "yui-t5"}= ".yui-t5"
+ %option{:value => "yui-t6"}= ".yui-t6"
+
+ #yui-main
+ .yui-b
+ %h2 50/50 Division
+ %hr
+ .yui-g
+ .yui-u.first
+ %h3 Left Side
+ %p
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor
+ incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud
+ exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
+ Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat
+ nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui
+ officia deserunt mollit anim id est laborum.
+ .yui-u
+ %h3 Right Side
+ %p
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor
+ incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud
+ exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
+ Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat
+ nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui
+ officia deserunt mollit anim id est laborum.
+ %h2 33/33/33 Division
+ %hr
+ .yui-gb
+ .yui-u.first
+ %h3 Left Side
+ %p
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor
+ incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud
+ exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
+ Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat
+ nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui
+ officia deserunt mollit anim id est laborum.
+ .yui-u
+ %h3 Middle
+ %p
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor
+ incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud
+ exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
+ Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat
+ nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui
+ officia deserunt mollit anim id est laborum.
+
+ .yui-u
+ %h3 Right Side
+ %p
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor
+ incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud
+ exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
+ Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat
+ nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui
+ officia deserunt mollit anim id est laborum.
+ %h2 67/33 Division
+ %hr
+ .yui-gc
+ .yui-u.first
+ %h3 Left Side
+ %p
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor
+ incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud
+ exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
+ Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat
+ nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui
+ officia deserunt mollit anim id est laborum.
+ .yui-u
+ %h3 Right Side
+ %p
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor
+ incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud
+ exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
+ Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat
+ nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui
+ officia deserunt mollit anim id est laborum.
+ %h2 33/67 Division
+ %hr
+ .yui-gd
+ .yui-u.first
+ %h3 Left Side
+ %p
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor
+ incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud
+ exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
+ Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat
+ nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui
+ officia deserunt mollit anim id est laborum.
+ .yui-u
+ %h3 Right Side
+ %p
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor
+ incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud
+ exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
+ Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat
+ nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui
+ officia deserunt mollit anim id est laborum.
+ %h2 75/25 Division
+ %hr
+ .yui-ge
+ .yui-u.first
+ %h3 Left Side
+ %p
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor
+ incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud
+ exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
+ Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat
+ nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui
+ officia deserunt mollit anim id est laborum.
+ .yui-u
+ %h3 Right Side
+ %p
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor
+ incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud
+ exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
+ Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat
+ nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui
+ officia deserunt mollit anim id est laborum.
+ %h2 25/75 Division
+ %hr
+ .yui-gf
+ .yui-u.first
+ %h3 Left Side
+ %p
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor
+ incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud
+ exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
+ Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat
+ nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui
+ officia deserunt mollit anim id est laborum.
+ .yui-u
+ %h3 Right Side
+ %p
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor
+ incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud
+ exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
+ Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat
+ nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui
+ officia deserunt mollit anim id est laborum.
+
+ #ft
+ Copyright © 2008. All Rights Reserved.
+
diff --git a/vendor/gems/gems/compass-0.8.17/examples/yui/index.html.haml b/vendor/gems/gems/compass-0.8.17/examples/yui/index.html.haml
new file mode 100755
index 00000000..8d5849f7
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/examples/yui/index.html.haml
@@ -0,0 +1,19 @@
+!!! Transitional
+%html{:xmlns => "http://www.w3.org/1999/xhtml", "xml:lang" => "en", :lang => "en"}
+ %head
+ %title YUI Typography Demo
+ %link{:rel=>"stylesheet", :href=>"stylesheets/screen.css", :type=>"text/css", :media=>"screen, projection"}
+ %body
+ #doc4.yui-t2
+ .yui-b
+ %h3 YUI Examples
+ %ul
+ %li
+ %a{:href=>"templates.html"} Template Presets
+ %li
+ %a{:href=>"typography.html"} Typography
+ #yui-main
+ .yui-b
+ %h1 YUI Examples
+ %p
+ Please select an example.
diff --git a/vendor/gems/gems/compass-0.8.17/examples/yui/src/screen.sass b/vendor/gems/gems/compass-0.8.17/examples/yui/src/screen.sass
new file mode 100755
index 00000000..cdff4c9c
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/examples/yui/src/screen.sass
@@ -0,0 +1,13 @@
+@import yui.sass
+@import compass/reset.sass
+
++yui
+
+.bigger
+ +font-size(16px)
+
+.biggest
+ +font-size(18px)
+
+.bigger .biggest
+ +font-size(18px, 16px)
diff --git a/vendor/gems/gems/compass-0.8.17/examples/yui/sub_divisions.html.haml b/vendor/gems/gems/compass-0.8.17/examples/yui/sub_divisions.html.haml
new file mode 100755
index 00000000..13400385
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/examples/yui/sub_divisions.html.haml
@@ -0,0 +1,169 @@
+!!! Transitional
+%html{:xmlns => "http://www.w3.org/1999/xhtml", "xml:lang" => "en", :lang => "en"}
+ %head
+ %title YUI Grid Sub-Divisions Example
+ %link{:rel=>"stylesheet", :href=>"stylesheets/screen.css", :type=>"text/css", :media=>"screen, projection"}
+ %style{:type => "text/css"}
+ :sass
+ .yui-b
+ border: 1px dotted #ccc
+ %body
+ #doc4.yui-t2
+ #hd
+ %h1 Yahoo Grid Sub-Divisions Example
+ #bd
+ .yui-b
+ %h3 YUI Examples
+ %ul
+ %li
+ %a{:href=>"templates.html"} Template Presets
+ %li
+ %a{:href=>"typography.html"} Typography
+ %li
+ %a{:href=>"divisions.html"} Grid Divisions
+ #yui-main
+ .yui-b
+ %h2 50/50 Division
+ %hr
+ .yui-g
+ .yui-g.first
+ .yui-u.first
+ %h4 Left Side of 50/50 Sub-Division (25%)
+ %p
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor
+ incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud
+ exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
+ .yui-u
+ %h4 Right Side of 50/50 Sub-Division (25%)
+ %p
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor
+ incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud
+ exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
+ .yui-u
+ %h4 Right Side of 50/50 Division (50%)
+ %p
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor
+ incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud
+ exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
+ Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat
+ nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui
+ officia deserunt mollit anim id est laborum.
+ %h2 33/33/33 Division
+ %hr
+ .yui-gb
+ .yui-u.first
+ %h3 Left Side
+ %p
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor
+ incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud
+ exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
+ Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat
+ nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui
+ officia deserunt mollit anim id est laborum.
+ .yui-u
+ %h3 Middle
+ %p
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor
+ incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud
+ exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
+ Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat
+ nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui
+ officia deserunt mollit anim id est laborum.
+
+ .yui-u
+ %h3 Right Side
+ %p
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor
+ incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud
+ exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
+ Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat
+ nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui
+ officia deserunt mollit anim id est laborum.
+ %h2 67/33 Division
+ %hr
+ .yui-gc
+ .yui-u.first
+ %h3 Left Side
+ %p
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor
+ incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud
+ exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
+ Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat
+ nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui
+ officia deserunt mollit anim id est laborum.
+ .yui-u
+ %h3 Right Side
+ %p
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor
+ incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud
+ exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
+ Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat
+ nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui
+ officia deserunt mollit anim id est laborum.
+ %h2 33/67 Division
+ %hr
+ .yui-gd
+ .yui-u.first
+ %h3 Left Side
+ %p
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor
+ incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud
+ exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
+ Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat
+ nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui
+ officia deserunt mollit anim id est laborum.
+ .yui-u
+ %h3 Right Side
+ %p
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor
+ incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud
+ exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
+ Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat
+ nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui
+ officia deserunt mollit anim id est laborum.
+ %h2 75/25 Division
+ %hr
+ .yui-ge
+ .yui-u.first
+ %h3 Left Side
+ %p
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor
+ incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud
+ exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
+ Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat
+ nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui
+ officia deserunt mollit anim id est laborum.
+ .yui-u
+ %h3 Right Side
+ %p
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor
+ incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud
+ exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
+ Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat
+ nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui
+ officia deserunt mollit anim id est laborum.
+ %h2 25/75 Division
+ %hr
+ .yui-gf
+ .yui-u.first
+ %h3 Left Side
+ %p
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor
+ incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud
+ exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
+ Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat
+ nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui
+ officia deserunt mollit anim id est laborum.
+ .yui-u
+ %h3 Right Side
+ %p
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor
+ incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud
+ exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
+ Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat
+ nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui
+ officia deserunt mollit anim id est laborum.
+
+ #ft
+ Copyright © 2008. All Rights Reserved.
+
diff --git a/vendor/gems/gems/compass-0.8.17/examples/yui/templates.html.haml b/vendor/gems/gems/compass-0.8.17/examples/yui/templates.html.haml
new file mode 100755
index 00000000..5100876e
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/examples/yui/templates.html.haml
@@ -0,0 +1,54 @@
+!!! Transitional
+%html{:xmlns => "http://www.w3.org/1999/xhtml", "xml:lang" => "en", :lang => "en"}
+ %head
+ %title YUI Template Presets Example
+ %link{:rel=>"stylesheet", :href=>"stylesheets/screen.css", :type=>"text/css", :media=>"screen, projection"}
+ :javascript
+ function changeTemplate() {
+ var templateClass = document.getElementById("current-template").value;
+ document.getElementById("doc4").className = templateClass;
+ }
+ %style{:type => "text/css"}
+ :sass
+ .yui-b
+ border: 1px dotted #ccc
+ %body
+ #doc4.yui-t2
+ #hd
+ %h1 Yahoo Template Presets Example
+ #bd
+ .yui-b
+ %h3 YUI Examples
+ %ul
+ %li
+ %a{:href=>"templates.html"} Template Presets
+ %li
+ %a{:href=>"typography.html"} Typography
+ #yui-main
+ .yui-b
+ %h2 Main Content
+ %label{:for => "current-template"} Select Template Preset
+ %select{:id=>"current-template", :onchange => "changeTemplate()"}
+ %option{:value => "yui-t1"}= ".yui-t1"
+ %option{:value => "yui-t2", :selected => "selected"}= ".yui-t2"
+ %option{:value => "yui-t3"}= ".yui-t3"
+ %option{:value => "yui-t4"}= ".yui-t4"
+ %option{:value => "yui-t5"}= ".yui-t5"
+ %option{:value => "yui-t6"}= ".yui-t6"
+ %hr
+ %p
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
+ .yui-g
+ .yui-u.first
+ %h3 50/50 Left Side
+ %p
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
+ .yui-u
+ %h3 50/50 Right Side
+ %p
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
+ %p
+ Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
+ #ft
+ Copyright © 2008. All Rights Reserved.
+
diff --git a/vendor/gems/gems/compass-0.8.17/examples/yui/test.jpg b/vendor/gems/gems/compass-0.8.17/examples/yui/test.jpg
new file mode 100755
index 00000000..0107be27
Binary files /dev/null and b/vendor/gems/gems/compass-0.8.17/examples/yui/test.jpg differ
diff --git a/vendor/gems/gems/compass-0.8.17/examples/yui/typography.html.haml b/vendor/gems/gems/compass-0.8.17/examples/yui/typography.html.haml
new file mode 100755
index 00000000..e453cdc2
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/examples/yui/typography.html.haml
@@ -0,0 +1,132 @@
+!!! Transitional
+%html{:xmlns => "http://www.w3.org/1999/xhtml", "xml:lang" => "en", :lang => "en"}
+ %head
+ %title YUI Typography Demo
+ %link{:rel=>"stylesheet", :href=>"stylesheets/screen.css", :type=>"text/css", :media=>"screen, projection"}
+ %body
+ #doc4.yui-t2
+ #yui-main
+ .yui-b
+ %h1 Typography Demo
+ %h2 This is a Sub Title.
+
+ %p
+ Lorem ipsum dolor sit amet,
+ %em emphasized adipisicing
+ elit, sed do
+ %strong strong tempor
+ incididunt ut labore et
+ %b bold magna
+ aliqua. Ut enim ad
+ %i<
+ italic veniam,
+ quis nostrud exercitation ullamco
+ %a{:href=>'#'} link nisi ut aliquip ex ea commodo consequat.
+ Duis aute irure dolor in
+ %abbr abbreviation repre
+ in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
+
+ %h3 Third Level Header
+ %p
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
+ %p
+ Subsequent paragraph, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
+
+ %h4 Fourth Level Header
+ %p
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est quotation:
+ %blockquote
+ Block Quotem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
+
+ %h5 Fifth Level Header
+ %img{:src => "test.jpg", :style => 'float: right;'}
+ %p
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in
+ %span.bigger<
+ voluptate velit esse
+ %span.biggest cillum dolore
+ eu fugiat nulla pariatur.
+ Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
+ %p
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
+
+ %h6 Sixth Level Header
+ %p
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
+
+ %table
+ %caption
+ This is the table caption
+ %thead
+ %tr
+ %th
+ %th Table Header 1
+ %th Table Header 2
+ %th Table Header 3
+ %tbody
+ %tr
+ %th Row Header 1
+ %td Lorem ipsum dolor sit amet.
+ %td Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
+ %td Lorem ipsum dolor sit amet.
+ %tr
+ %th Row Header 2
+ %td Lorem ipsum dolor sit amet.
+ %td Lorem ipsum dolor sit amet.
+ %td Lorem ipsum dolor sit amet.
+ %tr
+ %th Row Header 3
+ %td Lorem ipsum dolor sit amet.
+ %td Lorem ipsum dolor sit amet.
+ %td Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
+ %tr
+ %th Row Header 4
+ %td Lorem ipsum dolor sit amet.
+ %td Lorem ipsum dolor sit amet.
+ %td Lorem ipsum dolor sit amet.
+ %tr
+ %th Row Header 5
+ %td Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
+ %td Lorem ipsum dolor sit amet.
+ %td Lorem ipsum dolor sit amet.
+
+ %h3 Unordered Lists
+ %ul
+ %li List Element #1
+ %li<
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
+ %li List Element #3
+ %li<
+ Nested List
+ %ul
+ %li Nested 1
+ %li Nested 2
+ %li Nested 3
+
+ %h3 Ordered Lists
+ %ol
+ %li List Element #1
+ %li<
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
+ %li List Element #3
+ %li<
+ Nested List
+ %ol
+ %li Nested 1
+ %li Nested 2
+ %li Nested 3
+
+ %h3 Definition Lists
+ %dl
+ %dt Term 1
+ %dd Definition 1: Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
+ %dd Definition 2: Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
+ %dt Term 2
+ %dd Another Definition
+ .yui-b
+ %h3 YUI Examples
+ %ul
+ %li
+ %a{:href=>"templates.html"} Template Presets
+ %li
+ %a{:href=>"typography.html"} Typography
diff --git a/vendor/gems/gems/compass-0.8.17/frameworks/blueprint.rb b/vendor/gems/gems/compass-0.8.17/frameworks/blueprint.rb
new file mode 100755
index 00000000..47b3c87b
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/frameworks/blueprint.rb
@@ -0,0 +1,2 @@
+blueprint_dir = File.join(Compass.base_directory, 'frameworks', 'blueprint')
+Compass::Frameworks.register('blueprint', blueprint_dir)
diff --git a/vendor/gems/gems/compass-0.8.17/frameworks/blueprint/stylesheets/_blueprint.sass b/vendor/gems/gems/compass-0.8.17/frameworks/blueprint/stylesheets/_blueprint.sass
new file mode 100755
index 00000000..8bd2084e
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/frameworks/blueprint/stylesheets/_blueprint.sass
@@ -0,0 +1,3 @@
+@import blueprint/screen.sass
+@import blueprint/print.sass
+@import blueprint/ie.sass
diff --git a/vendor/gems/gems/compass-0.8.17/frameworks/blueprint/stylesheets/blueprint/_ie.sass b/vendor/gems/gems/compass-0.8.17/frameworks/blueprint/stylesheets/blueprint/_ie.sass
new file mode 100755
index 00000000..9421d908
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/frameworks/blueprint/stylesheets/blueprint/_ie.sass
@@ -0,0 +1,93 @@
+// The blueprint IE mixins should be mixed into a stylesheet that gets conditionally included
+// into IE like so:
+//
+
+// The +blueprint-ie mixin must be mixed into the top level of your stylesheet.
+// However, you can customize the body selector if you wish to control the scope
+// of this mixin. Examples:
+// Apply to any page including the stylesheet:
+// +blueprint-ie
+// Scoped by a single presentational body class:
+// +blueprint-ie("body.blueprint")
+// Semantically:
+// +blueprint-ie("body#page-1, body#page-2, body.a-special-page-type")
+// Alternatively, you can use the +blueprint-ie-body and +blueprint-ie-defaults
+// mixins to construct your own semantic style rules.
+
+=blueprint-ie(!body_selector = "body")
+ #{!body_selector}
+ +blueprint-ie-body
+ @if !body_selector != "body"
+ +blueprint-ie-defaults
+ @if !body_selector == "body"
+ +blueprint-ie-defaults
+
+=blueprint-ie-body
+ :text-align center
+ +blueprint-ie-hacks
+
+=blueprint-ie-hacks
+ * html &
+ legend
+ :margin 0px -8px 16px 0
+ :padding 0
+ html>&
+ p code
+ :*white-space normal
+
+// Fixes for Blueprint "inline" forms in IE
+=blueprint-inline-form-ie
+ div, p
+ :vertical-align middle
+ label
+ :position relative
+ :top -0.25em
+ input
+ &.checkbox, &.radio, &.button, button
+ :margin 0.5em 0
+
+=blueprint-ie-defaults
+ .container
+ :text-align left
+ ol
+ :margin-left 2em
+ sup
+ :vertical-align text-top
+ sub
+ :vertical-align text-bottom
+ hr
+ :margin -8px auto 11px
+ img
+ :-ms-interpolation-mode bicubic
+ fieldset
+ :padding-top 0
+ input
+ &.text
+ :margin 0.5em 0
+ :background-color #fff
+ :border 1px solid #bbb
+ &:focus
+ :border 1px solid #666
+ &.title
+ :margin 0.5em 0
+ :background-color #fff
+ :border 1px solid #bbb
+ &:focus
+ :border 1px solid #666
+ &.checkbox
+ :position relative
+ :top 0.25em
+ &.radio
+ :position relative
+ :top 0.25em
+ &.button
+ :position relative
+ :top 0.25em
+ textarea
+ :margin 0.5em 0
+ select
+ :margin 0.5em 0
+ button
+ :position relative
+ :top 0.25em
diff --git a/vendor/gems/gems/compass-0.8.17/frameworks/blueprint/stylesheets/blueprint/_print.sass b/vendor/gems/gems/compass-0.8.17/frameworks/blueprint/stylesheets/blueprint/_print.sass
new file mode 100755
index 00000000..d147bf7a
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/frameworks/blueprint/stylesheets/blueprint/_print.sass
@@ -0,0 +1,83 @@
+@import modules/typography.sass
+@import compass/utilities/general/float.sass
+
+// The +blueprint-print mixin must be mixed into the top level of your stylesheet.
+// However, you can customize the body selector if you wish to control the scope
+// of this mixin. Examples:
+// Apply to any page including the stylesheet:
+// +blueprint-print
+// Scoped by a single presentational body class:
+// +blueprint-print("body.blueprint")
+// Semantically:
+// +blueprint-print("body#page-1, body#page-2, body.a-special-page-type")
+// Alternatively, you can use the +blueprint-print-body and +blueprint-print-defaults
+// mixins to construct your own semantic style rules.
+
+=blueprint-print(!body_selector = "body")
+ #{!body_selector}
+ +blueprint-print-body
+ @if !body_selector != "body"
+ +blueprint-print-defaults
+ @if !body_selector == "body"
+ +blueprint-print-defaults
+
+// This style is in blueprint, but I think it's annoying and it doesn't work in all browsers.
+// Feel free to mix it into anchors where you want it.
+=blueprint-show-link-urls
+ &:after
+ :content " (" attr(href) ")"
+ :font-size 90%
+
+=blueprint-print-body
+ :line-height 1.5
+ :font-family= !blueprint_font_family
+ :color #000
+ :background none
+ :font-size 10pt
+
+=blueprint-print-defaults
+ .container
+ :background none
+ hr
+ :background #ccc
+ :color #ccc
+ :width 100%
+ :height 2px
+ :margin 2em 0
+ :padding 0
+ :border none
+ &.space
+ :background #fff
+ :color #fff
+ h1, h2, h3, h4, h5, h6
+ :font-family= !blueprint_font_family
+ code
+ :font
+ :size .9em
+ :family= !blueprint_fixed_font_family
+ img
+ +float-left
+ :margin 1.5em 1.5em 1.5em 0
+ a
+ img
+ :border none
+ &:link,
+ &:visited
+ :background transparent
+ :font-weight 700
+ :text-decoration underline
+ p img.top
+ :margin-top 0
+ blockquote
+ :margin 1.5em
+ :padding 1em
+ :font-style italic
+ :font-size .9em
+ .small
+ :font-size .9em
+ .large
+ :font-size 1.1em
+ .quiet
+ :color #999
+ .hide
+ :display none
diff --git a/vendor/gems/gems/compass-0.8.17/frameworks/blueprint/stylesheets/blueprint/_reset.sass b/vendor/gems/gems/compass-0.8.17/frameworks/blueprint/stylesheets/blueprint/_reset.sass
new file mode 100755
index 00000000..2c9178f2
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/frameworks/blueprint/stylesheets/blueprint/_reset.sass
@@ -0,0 +1,3 @@
+@import modules/reset.sass
+
++blueprint-global-reset
\ No newline at end of file
diff --git a/vendor/gems/gems/compass-0.8.17/frameworks/blueprint/stylesheets/blueprint/_screen.sass b/vendor/gems/gems/compass-0.8.17/frameworks/blueprint/stylesheets/blueprint/_screen.sass
new file mode 100755
index 00000000..15762552
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/frameworks/blueprint/stylesheets/blueprint/_screen.sass
@@ -0,0 +1,15 @@
+@import modules/colors.sass
+@import modules/grid.sass
+@import modules/typography.sass
+@import modules/utilities.sass
+@import modules/form.sass
+@import modules/interaction.sass
+@import modules/debug.sass
+
+=blueprint(!body_selector = "body")
+ +blueprint-typography(!body_selector)
+ +blueprint-utilities
+ +blueprint-grid
+ +blueprint-debug
+ +blueprint-interaction
+ +blueprint-form
diff --git a/vendor/gems/gems/compass-0.8.17/frameworks/blueprint/stylesheets/blueprint/modules/_buttons.sass b/vendor/gems/gems/compass-0.8.17/frameworks/blueprint/stylesheets/blueprint/modules/_buttons.sass
new file mode 100755
index 00000000..a59338a3
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/frameworks/blueprint/stylesheets/blueprint/modules/_buttons.sass
@@ -0,0 +1,84 @@
+@import compass/utilities/general/inline_block.sass
+@import compass/utilities/general/float.sass
+
+// Button Font
+!blueprint_button_font_family ||= "\"Lucida Grande\", Tahoma, Arial, Verdana, sans-serif"
+
+// Default Button Colors
+!blueprint_button_border_color ||= #DEDEDE
+!blueprint_button_background_color ||= #F5F5F5
+!blueprint_button_font_color ||= #565656
+
+// Default Button Hover Colors
+!blueprint_button_hover_border_color ||= #C2E1EF
+!blueprint_button_hover_background_color ||= #DFF4FF
+!blueprint_button_hover_font_color ||= #336699
+
+// Default Button Active Colors
+!blueprint_button_active_border_color ||= #6299C5
+!blueprint_button_active_background_color ||= #6299C5
+!blueprint_button_active_font_color ||= #FFF
+
+//**
+ Sets the colors for a button
+ @param border_highlight_color
+ The highlight color defaults to whatever is the value of the border_color but it's one shade lighter.
+=button-colors(!font_color = !blueprint_button_font_color, !bg_color = !blueprint_button_background_color, !border_color = !blueprint_button_border_color, !border_highlight_color = !border_color + #101010)
+ :background-color= !bg_color
+ :border-color= !border_highlight_color !border_color !border_color !border_highlight_color
+ :color= !font_color
+
+//**
+ Sets the colors for a button in the active state
+ @param border_highlight_color
+ The highlight color defaults to whatever is the value of the border_color but it's one shade lighter.
+=button-active-colors(!font_color = !blueprint_button_active_font_color, !bg_color = !blueprint_button_active_background_color, !border_color = !blueprint_button_active_border_color, !border_highlight_color = !border_color + #101010)
+ &:active
+ +button-colors(!font_color, !bg_color, !border_color, !border_highlight_color)
+
+//**
+ Sets the colors for a button in the hover state.
+ @param border_highlight_color
+ The highlight color defaults to whatever is the value of the border_color but it's one shade lighter.
+=button-hover-colors(!font_color = !blueprint_button_hover_font_color, !bg_color = !blueprint_button_hover_background_color, !border_color = !blueprint_button_hover_border_color, !border_highlight_color = !border_color + #101010)
+ &:hover
+ +button-colors(!font_color, !bg_color, !border_color, !border_highlight_color)
+
+=button-base(!float = false)
+ @if !float
+ :display block
+ +float(!float)
+ @else
+ +inline-block
+ :margin 0.7em 0.5em 0.7em 0
+ :border-width 1px
+ :border-style solid
+ :font-family= !blueprint_button_font_family
+ :font-size 100%
+ :line-height 130%
+ :text-decoration none
+ :font-weight bold
+ :cursor pointer
+ img
+ :margin 0 3px -3px 0 !important
+ :padding 0
+ :border none
+ :width 16px
+ :height 16px
+ :float none
+
+
+=anchor-button(!float = false)
+ +button-base(!float)
+ :padding 5px 10px 5px 7px
+
+=button-button(!float = false)
+ +button-base(!float)
+ :width auto
+ :overflow visible
+ :padding 4px 10px 3px 7px
+ &[type]
+ :padding 4px 10px 4px 7px
+ :line-height 17px
+ *:first-child+html &[type]
+ :padding 4px 10px 3px 7px
diff --git a/vendor/gems/gems/compass-0.8.17/frameworks/blueprint/stylesheets/blueprint/modules/_colors.sass b/vendor/gems/gems/compass-0.8.17/frameworks/blueprint/stylesheets/blueprint/modules/_colors.sass
new file mode 100755
index 00000000..278951f7
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/frameworks/blueprint/stylesheets/blueprint/modules/_colors.sass
@@ -0,0 +1,33 @@
+!font_color ||= #333
+!quiet_color ||= !font_color + #333
+!loud_color ||= !font_color - #222
+
+!header_color ||= !font_color - #111
+
+!link_color ||= #009
+!link_hover_color ||= #000
+!link_focus_color ||= !link_hover_color
+!link_active_color ||= !link_color + #C00
+!link_visited_color ||= !link_color - #333
+
+!feedback_border_color ||= #DDD
+!success_color ||= #264409
+!success_bg_color ||= #E6EFC2
+!success_border_color ||= #C6D880
+
+!notice_color ||= #514721
+!notice_bg_color ||= #FFF6BF
+!notice_border_color ||= #FFD324
+
+!error_color ||= #8A1F11
+!error_bg_color ||= #FBE3E4
+!error_border_color ||= #FBC2C4
+
+!highlight_color ||= #FF0
+!added_color ||= #FFF
+!added_bg_color ||= #060
+!removed_color ||= #FFF
+!removed_bg_color ||= #900
+
+!blueprint_table_header_color ||= #C3D9FF
+!blueprint_table_stripe_color ||= #E5ECF9
diff --git a/vendor/gems/gems/compass-0.8.17/frameworks/blueprint/stylesheets/blueprint/modules/_debug.sass b/vendor/gems/gems/compass-0.8.17/frameworks/blueprint/stylesheets/blueprint/modules/_debug.sass
new file mode 100755
index 00000000..8a4b5bc8
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/frameworks/blueprint/stylesheets/blueprint/modules/_debug.sass
@@ -0,0 +1,9 @@
+=showgrid(!image = "grid.png")
+ :background= image_url(!image)
+
+=blueprint-debug(!grid_image = "grid.png")
+ // Use this class on any column or container to see the grid.
+ // TODO: prefix this with the project path.
+ .showgrid
+ +showgrid(!grid_image)
+
\ No newline at end of file
diff --git a/vendor/gems/gems/compass-0.8.17/frameworks/blueprint/stylesheets/blueprint/modules/_fancy_type.sass b/vendor/gems/gems/compass-0.8.17/frameworks/blueprint/stylesheets/blueprint/modules/_fancy_type.sass
new file mode 100755
index 00000000..77ae86d1
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/frameworks/blueprint/stylesheets/blueprint/modules/_fancy_type.sass
@@ -0,0 +1,82 @@
+@import typography.sass
+
+//
+ To install the fancy type plugin:
+ 1. import the fancy_type module: @import blueprint/modules/fancy_type
+ 2. mixin +fancy-type to your project's body or at the top level of your stylesheet:
+ body
+ +fancy-type
+
+=fancy-type
+ +fancy-paragraphs
+ .caps
+ +caps
+ .dquo
+ +dquo
+ .alt
+ +alt
+
+// Indentation instead of line shifts for sibling paragraphs. Mixin to a style like p + p
+=sibling-indentation
+ :text-indent 2em
+ :margin-top -1.5em
+ /* Don't want this in forms.
+ form &
+ :text-indent 0
+
+//
+ For great looking type, use this code instead of asdf:
+ asdf
+ Best used on prepositions and ampersands.
+
+=alt
+ :color #666
+ :font-family "Warnock Pro", "Goudy Old Style","Palatino","Book Antiqua", Georgia, serif
+ :font-style italic
+ :font-weight normal
+
+//
+ For great looking quote marks in titles, replace "asdf" with:
+ “ asdf”
+ (That is, when the title starts with a quote mark).
+ (You may have to change this value depending on your font size).
+=dquo(!offset = 0.5em)
+ :margin-left -!offset
+
+//
+ Reduced size type with incremental leading
+ (http://www.markboulton.co.uk/journal/comments/incremental_leading/)
+
+ This could be used for side notes. For smaller type, you don't necessarily want to
+ follow the 1.5x vertical rhythm -- the line-height is too much.
+
+ Using this mixin, reduces your font size and line-height so that for
+ every four lines of normal sized type, there is five lines of the sidenote. eg:
+
+ Arguments:
+ font_size - The desired font size in pixels. This will be converted to ems for you. Defaults to 10px.
+ base_font_size - The base font size in pixels. Defaults to 12px
+ old_line_height - The old line height. Defaults to 1.5 times the base_font_size
+=incr(!font_size = 10px, !base_font_size = !blueprint_font_size, !old_line_height = !base_font_size * 1.5)
+ :font-size= 1em * !font_size / !base_font_size
+ :line-height= 1em * !old_line_height / !font_size * 4 / 5
+ :margin-bottom 1.5em
+
+//
+ Surround uppercase words and abbreviations with this class.
+ Based on work by Jørgen Arnor Gårdsø Lom [http://twistedintellect.com/]
+=caps
+ :font-variant small-caps
+ :letter-spacing 1px
+ :text-transform lowercase
+ :font-size 1.2em
+ :line-height 1%
+ :font-weight bold
+ :padding 0 2px
+
+=fancy-paragraphs
+ p + p
+ +sibling-indentation
+ p.incr,
+ .incr p
+ +incr
diff --git a/vendor/gems/gems/compass-0.8.17/frameworks/blueprint/stylesheets/blueprint/modules/_form.sass b/vendor/gems/gems/compass-0.8.17/frameworks/blueprint/stylesheets/blueprint/modules/_form.sass
new file mode 100755
index 00000000..1862c44a
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/frameworks/blueprint/stylesheets/blueprint/modules/_form.sass
@@ -0,0 +1,55 @@
+@import colors.sass
+
+// Mixin for producing Blueprint "inline" forms. Should be used with the blueprint-form mixin.
+=blueprint-inline-form
+ :line-height 3
+ p
+ :margin-bottom 0
+
+=blueprint-form
+ +blueprint-form-layout
+ +blueprint-form-borders
+ +blueprint-form-sizes
+
+=blueprint-form-layout
+ label
+ :font-weight bold
+ fieldset
+ :padding 1.4em
+ :margin 0 0 1.5em 0
+ legend
+ :font-weight bold
+ :font-size 1.2em
+ input
+ &.text, &.title, &[type=text]
+ :margin 0.5em 0
+ :background-color #fff
+ :padding 5px
+ &.title
+ :font-size 1.5em
+ &[type=checkbox], &.checkbox,
+ &[type=radio], &.radio
+ :position relative
+ :top 0.25em
+ textarea
+ :margin 0.5em 0
+ :padding 5px
+ select
+ :margin 0.5em 0
+
+=blueprint-form-sizes(!input_width = 300px, !textarea_width = 390px, !textarea_height = 250px)
+ input.text, input.title
+ :width= !input_width
+ textarea
+ :width= !textarea_width
+ :height= !textarea_height
+
+=blueprint-form-borders(!unfocused_border_color = #bbb, !focus_border_color = #666, !fieldset_border_color = #ccc)
+ fieldset
+ :border= 1px "solid" !fieldset_border_color
+ input.text, input.title,
+ textarea,
+ select
+ :border= 1px "solid" !unfocused_border_color
+ &:focus
+ :border= 1px "solid" !focus_border_color
\ No newline at end of file
diff --git a/vendor/gems/gems/compass-0.8.17/frameworks/blueprint/stylesheets/blueprint/modules/_grid.sass b/vendor/gems/gems/compass-0.8.17/frameworks/blueprint/stylesheets/blueprint/modules/_grid.sass
new file mode 100755
index 00000000..c9ca5bec
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/frameworks/blueprint/stylesheets/blueprint/modules/_grid.sass
@@ -0,0 +1,178 @@
+// --------------------------------------------------------------
+// SASS Gridification
+// * Author: Chris Eppstein
+// A SASS adaptation of Blueprint CSS
+// * Version: 0.7.1 (2008-02-25)
+// * Website: http://code.google.com/p/blueprintcss/
+// Based on work by:
+// * Lorin Tackett [lorintackett.com]
+// * Olav Bjorkoy [bjorkoy.com]
+// * Nathan Borror [playgroundblues.com]
+// * Jeff Croft [jeffcroft.com]
+// * Christian Metts [mintchaos.com]
+// * Khoi Vinh [subtraction.com]
+// Read more about using a grid here:
+// * http://www.subtraction.com/2007/03/18/oh-yeeaahh
+// --------------------------------------------------------------
+
+@import compass/utilities/general/float.sass
+
+// Main layout grid, override these constants to build your grid and container sizes.
+!blueprint_grid_columns ||= 24
+!blueprint_grid_width ||= 30px
+!blueprint_grid_margin ||= 10px
+
+!blueprint_grid_outer_width = !blueprint_grid_width + !blueprint_grid_margin
+!blueprint_container_size = !blueprint_grid_outer_width * !blueprint_grid_columns - !blueprint_grid_margin
+
+
+=blueprint-grid
+ // A container should group all your columns
+ .container
+ +container
+ .column, #{enumerate("div.span", 1, !blueprint_grid_columns)}
+ +column-base
+ // The last column in a row needs this class (or mixin) or it will end up on the next row.
+ .last, div.last
+ +last
+ // Use these classes (or mixins) to set the width of a column.
+ @for !n from 1 to !blueprint_grid_columns
+ .span-#{!n}
+ +span(!n)
+ .span-#{!blueprint_grid_columns}, div.span-#{!blueprint_grid_columns}
+ +span(!blueprint_grid_columns)
+ :margin 0
+ input, textarea, select
+ @for !n from 1 through !blueprint_grid_columns
+ &.span-#{!n}
+ +span(!n, true)
+ // Add these to a column to append empty cols.
+ @for !n from 1 to !blueprint_grid_columns
+ .append-#{!n}
+ +append(!n)
+ // Add these to a column to prepend empty cols.
+ @for !n from 1 to !blueprint_grid_columns
+ .prepend-#{!n}
+ +prepend(!n)
+ // Use these classes on an element to push it into the
+ // next column, or to pull it into the previous column.
+ #{enumerate(".pull", 1, !blueprint_grid_columns)}
+ +pull-base
+ @for !n from 1 through !blueprint_grid_columns
+ .pull-#{!n}
+ +pull-margins(!n)
+ #{enumerate(".push", 1, !blueprint_grid_columns)}
+ +push-base
+ @for !n from 1 through !blueprint_grid_columns
+ .push-#{!n}
+ +push-margins(!n)
+ .prepend-top
+ +prepend-top
+ .append-bottom
+ +append-bottom
+
+
+// Columns
+// Note: If you use this mixin without the class and want to support ie6
+// you must set text-align left on your container element in an IE stylesheet.
+=container
+ :width = !blueprint_container_size
+ :margin 0 auto
+ +clearfix
+
+// The last column in a row needs this mixin or it will end up on the next row.
+// TODO add this to span mixin when we have optional arguments
+=last
+ :margin-right 0
+
+=span(!n, !override = false)
+ !width = !blueprint_grid_width * !n + (!blueprint_grid_margin * (!n - 1))
+ @if !override
+ :width = !width !important
+ @else
+ :width = !width
+
+=column-base(!last = false)
+ +float-left
+ @if !last
+ +last
+ @else
+ :margin-right = !blueprint_grid_margin
+ * html &
+ :overflow-x hidden
+
+// Use this mixins to set the width of n columns.
+=column(!n, !last = false)
+ +column-base(!last)
+ +span(!n)
+
+
+// Mixin to a column to append n empty cols.
+=append(!n)
+ :padding-right = (!blueprint_grid_outer_width) * !n
+
+// Mixin to a column to prepend n empty cols.
+=prepend(!n)
+ :padding-left = (!blueprint_grid_outer_width) * !n
+
+=append-bottom(!amount = 1.5em)
+ :margin-bottom= !amount
+
+=prepend-top(!amount = 1.5em)
+ :margin-top= !amount
+
+=pull-base
+ +float-left
+ :position relative
+
+=pull-margins(!n, !last = false)
+ @if !last
+ :margin-left = (-!blueprint_grid_outer_width * !n) + !blueprint_grid_margin
+ @else
+ :margin-left = -!blueprint_grid_outer_width * !n
+
+// mixin to a column to move it n columns to the left
+=pull(!n, !last = false)
+ +pull-base
+ +pull-margins(!n, !last)
+
+=push-base
+ +float-right
+ :position relative
+
+=push-margins(!n)
+ :margin= 0 (-!blueprint_grid_outer_width * !n) 1.5em (!blueprint_grid_outer_width * !n)
+
+// mixin to a column to push it n columns to the right
+=push(!n)
+ +push-base
+ +push-margins(!n)
+
+// Border on right hand side of a column.
+=border(!border_color = #eee, !border_width = 1px)
+ :padding-right = !blueprint_grid_margin / 2 - !border_width
+ :margin-right = !blueprint_grid_margin / 2
+ :border-right #{!border_width} solid #{!border_color}
+
+// Border with more whitespace, spans one column.
+=colborder(!border_color = #eee, !border_width = 1px)
+ :padding-right= floor((!blueprint_grid_width + 2 * !blueprint_grid_margin - !border_width)/2)
+ :margin-right= ceil((!blueprint_grid_width + 2 * !blueprint_grid_margin - !border_width)/2)
+ :border-right #{!border_width} solid #{!border_color}
+
+// Mixin this to an hr to make a horizontal ruler across a column.
+=colruler(!border_color = #ddd)
+ :background= !border_color
+ :color= !border_color
+ :clear both
+ :float none
+ :width 100%
+ :height .1em
+ :margin 0 0 1.45em
+ :border none
+
+// Mixin this to an hr to make a horizontal spacer across a column.
+=colspacer
+ +colruler
+ :background #fff
+ :color #fff
diff --git a/vendor/gems/gems/compass-0.8.17/frameworks/blueprint/stylesheets/blueprint/modules/_interaction.sass b/vendor/gems/gems/compass-0.8.17/frameworks/blueprint/stylesheets/blueprint/modules/_interaction.sass
new file mode 100755
index 00000000..c4b19f5f
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/frameworks/blueprint/stylesheets/blueprint/modules/_interaction.sass
@@ -0,0 +1,58 @@
+@import colors.sass
+
+
+=blueprint-interaction
+ .error
+ +error
+ .notice
+ +notice
+ .success
+ +success
+ .hide
+ :display none
+ .highlight
+ +highlight
+ .added
+ +added
+ .removed
+ +removed
+
+=feedback-base
+ :padding .8em
+ :margin-bottom 1em
+ :border= 2px "solid" !feedback_border_color
+
+=error
+ +feedback-base
+ :background = !error_bg_color
+ :color = !error_color
+ :border-color = !error_border_color
+ a
+ :color = !error_color
+
+=notice
+ +feedback-base
+ :background = !notice_bg_color
+ :color = !notice_color
+ :border-color = !notice_border_color
+ a
+ :color = !notice_color
+
+=success
+ +feedback-base
+ :background = !success_bg_color
+ :color = !success_color
+ :border-color = !success_border_color
+ a
+ :color = !success_color
+
+=highlight
+ :background = !highlight_color
+
+=added
+ :background = !added_bg_color
+ :color = !added_color
+
+=removed
+ :background = !removed_bg_color
+ :color = !removed_color
diff --git a/vendor/gems/gems/compass-0.8.17/frameworks/blueprint/stylesheets/blueprint/modules/_link_icons.sass b/vendor/gems/gems/compass-0.8.17/frameworks/blueprint/stylesheets/blueprint/modules/_link_icons.sass
new file mode 100755
index 00000000..dd50ebf7
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/frameworks/blueprint/stylesheets/blueprint/modules/_link_icons.sass
@@ -0,0 +1,44 @@
+=no-link-icon
+ :background transparent none !important
+ :padding 0 !important
+ :margin 0 !important
+
+=link-icon-base
+ :padding 2px 22px 2px 0
+ :margin -2px 0
+ :background-repeat no-repeat
+ :background-position right center
+
+=link-icon(!name, !include_base = true)
+ @if !include_base
+ +link-icon-base
+ :background-image= image_url("link_icons/#{!name}")
+
+=link-icons
+ a[href^="http:"],
+ a[href^="mailto:"],
+ a[href^="http:"]:visited,
+ a[href$=".pdf"],
+ a[href$=".doc"],
+ a[href$=".xls"],
+ a[href$=".rss"],
+ a[href$=".rdf"],
+ a[href^="aim:"]
+ +link-icon-base
+ a[href^="http:"]
+ +link-icon("external.png", false)
+ a[href^="mailto:"]
+ +link-icon("email.png", false)
+ a[href^="http:"]:visited
+ +link-icon("visited.png", false)
+ a[href$=".pdf"]
+ +link-icon("pdf.png", false)
+ a[href$=".doc"]
+ +link-icon("doc.png", false)
+ a[href$=".xls"]
+ +link-icon("xls.png", false)
+ a[href$=".rss"],
+ a[href$=".rdf"]
+ +link-icon("feed.png", false)
+ a[href^="aim:"]
+ +link-icon("im.png", false)
\ No newline at end of file
diff --git a/vendor/gems/gems/compass-0.8.17/frameworks/blueprint/stylesheets/blueprint/modules/_liquid.sass b/vendor/gems/gems/compass-0.8.17/frameworks/blueprint/stylesheets/blueprint/modules/_liquid.sass
new file mode 100755
index 00000000..87043942
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/frameworks/blueprint/stylesheets/blueprint/modules/_liquid.sass
@@ -0,0 +1,141 @@
+// --------------------------------------------------------------
+// SASS Gridification
+// * Author: Geoff Garside
+// A SASS adaptation of Blueprint CSS
+// * Version: 0.7.1 (2008-02-25)
+// * Website: http://code.google.com/p/blueprintcss/
+// Based on work by:
+// * Chris Eppstein [eppsteins.net]
+// * Lorin Tacket [lorintackett.com]
+// * Olav Bjorkoy [bjorkoy.com]
+// * Nathan Borror [playgroundblues.com]
+// * Jeff Croft [jeffcroft.com]
+// * Christian Metts [mintchaos.com]
+// * Khoi Vinh [subtraction.com]
+// Liquid grid work by:
+// * Ben Listwon
+// * David Bedingfield
+// * Andrei Michael Herasimchuk
+// Involution Studios, http://www.involutionstudios.com
+// Read more about using a grid here:
+// * subtraction.com/archives/2007/0318_oh_yeeaahh.php
+// -----
+// By default, the grid is 80% of window width, with 24 columns.
+//
+// To make the grid fixed, simply change the .container width
+// property to a pixel value. e.g., 960px.
+// -----
+// To use:
+// This module is a REPLACEMENT for the grid module. Simply import it:
+// @import blueprint.sass
+// @import blueprint/modules/liquid.sass
+// -------------------------------------------------------------------
+
+@import compass/utilities/general/float.sass
+
+// Main layout grid, override these constants to build your grid and container sizes.
+// The width shown gives the right floored percentage values.
+!blueprint_liquid_grid_columns ||= 24
+!blueprint_liquid_grid_width ||= 4.173%
+!blueprint_liquid_grid_margin ||= 0.833em
+
+// Do not edit below this line unless you really know what you're doing.
+!blueprint_liquid_container_width = 80%
+!blueprint_liquid_container_min_width = 950px
+!blueprint_liquid_grid_push_pull = -(!blueprint_liquid_grid_margin * 4)
+
+=blueprint-liquid-grid
+ // A container should group all your columns
+ .container
+ +container
+ // Use these classes (or mixins) to set the width of a column.
+ @for !n from 1 to !blueprint_liquid_grid_columns + 1
+ .span-#{!n}
+ +span(!n)
+ div
+ &.span-#{!n}
+ +column(!n, !n == !blueprint_liquid_grid_columns)
+ // The last column in a row needs this class (or mixin) or it will end up on the next row.
+ div.last
+ +last
+ // Add these to a column to append empty cols.
+ @for !n from 1 to !blueprint_liquid_grid_columns
+ .append-#{!n}
+ +append(!n)
+ // Add these to a column to prepend empty cols.
+ @for !n from 1 to !blueprint_liquid_grid_columns
+ .prepend-#{!n}
+ +prepend(!n)
+ // Use these classes on an element to push it into the
+ // next column, or to pull it into the previous column.
+ @for !n from 1 to !blueprint_liquid_grid_columns + 1
+ .pull-#{!n}
+ +pull(!n)
+ @for !n from 1 to !blueprint_liquid_grid_columns + 1
+ .push-#{!n}
+ +push(!n)
+
+=container
+ :min-width= !blueprint_liquid_container_min_width
+ :width = !blueprint_liquid_container_width
+ :margin 0 auto
+ +clearfix
+
+=span(!n, !override = false)
+ !width = (!blueprint_liquid_grid_width * !n) - ((!blueprint_liquid_grid_width * !n) % 1)
+ @if !override
+ :width = !width !important
+ @else
+ :width = !width
+
+=last
+ :margin-right 0
+
+=column(!n, !last = false)
+ +float-left
+ :overflow hidden
+ +span(!n)
+ @if !last
+ +last
+ @else
+ :margin-right = !blueprint_liquid_grid_margin
+
+=append(!n)
+ :padding-right= (!blueprint_liquid_grid_width * !n) - ((!blueprint_liquid_grid_width * !n) % 1)
+
+=prepend(!n)
+ :padding-left= (!blueprint_liquid_grid_width * !n) - ((!blueprint_liquid_grid_width * !n) % 1)
+
+=pull(!n, !last = false)
+ :margin-left= (!blueprint_liquid_grid_push_pull * !n)
+
+=push(!n)
+ +float-right
+ :margin
+ :top 0
+ :left 1.5em
+ :right= (!blueprint_liquid_grid_push_pull * !n)
+ :bottom 0
+
+=border
+ :border-right 1px solid #eee
+
+=colborder
+ :padding-right 2%
+ :margin-right 2%
+ +border
+
+=colruler
+ :background #ddd
+ :color #ddd
+ :clear both
+ :width 100%
+ :height 0.083em
+ :margin 0 0 1.583em
+ :border none
+
+=colspacer
+ +colruler
+ :background #fff
+ :color #fff
+
diff --git a/vendor/gems/gems/compass-0.8.17/frameworks/blueprint/stylesheets/blueprint/modules/_reset.sass b/vendor/gems/gems/compass-0.8.17/frameworks/blueprint/stylesheets/blueprint/modules/_reset.sass
new file mode 100755
index 00000000..fff5f3f5
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/frameworks/blueprint/stylesheets/blueprint/modules/_reset.sass
@@ -0,0 +1,56 @@
+// Global reset rules.
+// For more specific resets, use the reset mixins provided below
+=blueprint-global-reset
+ html, body
+ +blueprint-reset
+ +blueprint-nested-reset
+
+// Reset all elements within some selector scope.To reset the selector itself,
+// mixin the appropriate reset mixin for that element type as well. This could be
+// useful if you want to style a part of your page in a dramatically different way.
+=blueprint-nested-reset
+ div, span, object, iframe, h1, h2, h3, h4, h5, h6, p,
+ pre, a, abbr, acronym, address, code, del, dfn, em, img,
+ dl, dt, dd, ol, ul, li, fieldset, form, label, legend, caption, tbody, tfoot, thead, tr
+ +blueprint-reset
+ blockquote, q
+ +blueprint-reset-quotation
+ th, td, caption
+ +blueprint-reset-table-cell
+ table
+ +blueprint-reset-table
+ a img
+ :border none
+
+=blueprint-reset-box-model
+ :margin 0
+ :padding 0
+ :border 0
+
+=blueprint-reset
+ +blueprint-reset-box-model
+ :font
+ :weight inherit
+ :style inherit
+ :size 100%
+ :family inherit
+ :vertical-align baseline
+
+=blueprint-reset-quotation
+ +blueprint-reset
+ :quotes "" ""
+ &:before,
+ &:after
+ :content ""
+
+=blueprint-reset-table-cell
+ +blueprint-reset
+ :text-align left
+ :font-weight normal
+ :vertical-align middle
+
+=blueprint-reset-table
+ +blueprint-reset
+ :border-collapse separate
+ :border-spacing 0
+ :vertical-align middle
diff --git a/vendor/gems/gems/compass-0.8.17/frameworks/blueprint/stylesheets/blueprint/modules/_rtl.sass b/vendor/gems/gems/compass-0.8.17/frameworks/blueprint/stylesheets/blueprint/modules/_rtl.sass
new file mode 100755
index 00000000..1efaa2dc
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/frameworks/blueprint/stylesheets/blueprint/modules/_rtl.sass
@@ -0,0 +1,104 @@
+@import grid.sass
+@import compass/utilities/general/float.sass
+
+// Main layout grid, override these constants to build your grid and container sizes.
+!blueprint_grid_columns ||= 24
+!blueprint_grid_width ||= 30px
+!blueprint_grid_margin ||= 10px
+
+!blueprint_grid_outer_width = !blueprint_grid_width + !blueprint_grid_margin
+!blueprint_container_size = !blueprint_grid_outer_width * !blueprint_grid_columns - !blueprint_grid_margin
+
+// Columns
+// Note: If you use this mixin without the class and want to support ie6
+// you must set text-align left on your container element in an IE stylesheet.
+=container
+ :width = !blueprint_container_size
+ :margin 0 auto
+ :direction rtl
+ +clearfix
+
+// The last column in a row needs this mixin or it will end up on the next row.
+// TODO add this to span mixin when we have optional arguments
+=last
+ :margin-left 0
+
+=column-base(!last = false)
+ +float-right
+ @if !last
+ +last
+ @else
+ :margin-left = !blueprint_grid_margin
+ * html &
+ :overflow-x hidden
+
+// Mixin to a column to append n empty cols.
+=append(!n)
+ :padding-left = (!blueprint_grid_outer_width) * !n
+
+// Mixin to a column to prepend n empty cols.
+=prepend(!n)
+ :padding-right = (!blueprint_grid_outer_width) * !n
+
+// mixin to a column to move it n columns to the left
+=pull(!n, !last = false)
+ :position relative
+ @if !last
+ :margin-right = (-!blueprint_grid_outer_width * !n) + !blueprint_grid_margin
+ @else
+ :margin-right = -!blueprint_grid_outer_width * !n
+
+// mixin to a column to push it n columns to the right
+=push(!n)
+ +float-right
+ :position relative
+ :margin
+ :top 0
+ :left = -!blueprint_grid_outer_width * !n
+ :bottom 1.5em
+ :right = !blueprint_grid_outer_width * !n
+
+// Border on left hand side of a column.
+=border
+ :padding-left = !blueprint_grid_margin / 2 - 1
+ :margin-left = !blueprint_grid_margin / 2
+ :border-left 1px solid #eee
+
+// Border with more whitespace, spans one column.
+=colborder
+ :padding-left= (!blueprint_grid_width - 2 * !blueprint_grid_margin - 1)/2
+ :margin-left= (!blueprint_grid_width - 2 * !blueprint_grid_margin)/2
+ :border-left 1px solid #eee
+
+=rtl-typography(!body_selector = "body")
+ html #{!body_selector}
+ :font-family Arial, sans-serif
+ @if !body_selector != "body"
+ +rtl-typography-defaults
+ @if !body_selector == "body"
+ body
+ +rtl-typography-defaults
+
+=rtl-typography-defaults
+ h1, h2, h3, h4, h5, h6
+ :font-family Arial, sans-serif
+
+ pre, code, tt
+ :font-family monospace
+
+ p
+ img.right
+ +float-left
+ :margin 1.5em 1.5em 1.5em 0
+ :padding 0
+ img.left
+ +float-right
+ :margin 1.5em 0 1.5em 1.5em
+ :padding 0
+
+ dd, ul, ol
+ :margin-left 0
+ :margin-right 1.5em
+
+ td, th
+ :text-align right
diff --git a/vendor/gems/gems/compass-0.8.17/frameworks/blueprint/stylesheets/blueprint/modules/_scaffolding.sass b/vendor/gems/gems/compass-0.8.17/frameworks/blueprint/stylesheets/blueprint/modules/_scaffolding.sass
new file mode 100755
index 00000000..a61c8ee8
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/frameworks/blueprint/stylesheets/blueprint/modules/_scaffolding.sass
@@ -0,0 +1,47 @@
+@import grid.sass
+// The styles contained here are meant to provide for an attractive experience out of the box
+// and are expected to be removed once custom visual design begins.
+
+// The +blueprint-scaffolding mixin must be mixed into the top level of your stylesheet.
+// However, you can customize the body selector if you wish to control the scope
+// of this mixin. Examples:
+// Apply to any page including the stylesheet:
+// +blueprint-scaffolding
+// Scoped by a single presentational body class:
+// +blueprint-scaffolding("body.blueprint")
+// Semantically:
+// +blueprint-scaffolding("body#page-1, body#page-2, body.a-special-page-type")
+// Alternatively, you can use the +blueprint-scaffolding-body and +blueprint-scaffolding-defaults
+// mixins to construct your own semantic style rules.
+
+=blueprint-scaffolding(!body_selector = "body")
+ #{!body_selector}
+ @if !body_selector != "body"
+ +blueprint-scaffolding-defaults
+ @if !body_selector == "body"
+ +blueprint-scaffolding-defaults
+
+// The styles this mixin provides were deprecated in Blueprint 0.9 and is no longer part of the
+// main scaffolding, but the mixin is still available if you want to use it.
+=blueprint-scaffolding-body
+ :margin 1.5em 0
+
+// Mixin +box to create a padded box inside a column.
+=box
+ :padding 1.5em
+ :margin-bottom 1.5em
+ :background #E5ECF9
+
+=blueprint-scaffolding-defaults
+ .box
+ +box
+ // Border on right hand side of a column. You can comment this out if you don't plan to use it.
+ div.border
+ +border
+ // Border with more whitespace, spans one column.
+ div.colborder
+ +colborder
+ hr
+ +colruler
+ hr.space
+ +colspacer
diff --git a/vendor/gems/gems/compass-0.8.17/frameworks/blueprint/stylesheets/blueprint/modules/_typography.sass b/vendor/gems/gems/compass-0.8.17/frameworks/blueprint/stylesheets/blueprint/modules/_typography.sass
new file mode 100755
index 00000000..bb11783e
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/frameworks/blueprint/stylesheets/blueprint/modules/_typography.sass
@@ -0,0 +1,155 @@
+@import colors.sass
+@import compass/utilities/links/link_colors.sass
+@import compass/utilities/general/float.sass
+
+!blueprint_font_family ||= "Helvetica Neue, Arial, Helvetica, sans-serif"
+!blueprint_fixed_font_family ||= "'andale mono', 'lucida console', monospace"
+!blueprint_font_size ||= 12px
+
+// The +blueprint-typography mixin must be mixed into the top level of your stylesheet.
+// However, you can customize the body selector if you wish to control the scope
+// of this mixin. Examples:
+// Apply to any page including the stylesheet:
+// +blueprint-typography
+// Scoped by a single presentational body class:
+// +blueprint-typography("body.blueprint")
+// Semantically:
+// +blueprint-typography("body#page-1, body#page-2, body.a-special-page-type")
+// Alternatively, you can use the +blueprint-typography-body and +blueprint-typography-defaults
+// mixins to construct your own semantic style rules.
+
+=blueprint-typography(!body_selector = "body")
+ #{!body_selector}
+ +blueprint-typography-body
+ @if !body_selector != "body"
+ +blueprint-typography-defaults
+ @if !body_selector == "body"
+ +blueprint-typography-defaults
+
+=normal-text
+ :font-family= !blueprint_font_family
+ :color= !font_color
+
+=fixed-width-text
+ :font= 1em !blueprint_fixed_font_family
+ :line-height 1.5
+
+=header-text
+ :font-weight normal
+ :color= !header_color
+
+=quiet
+ :color= !quiet_color
+
+=loud
+ :color= !loud_color
+
+=blueprint-typography-body(!font_size = !blueprint_font_size)
+ :line-height 1.5
+ +normal-text
+ :font-size= 100% * !font_size / 16px
+
+=blueprint-typography-defaults
+ h1
+ +header-text
+ :font-size 3em
+ :line-height 1
+ :margin-bottom 0.5em
+ img
+ :margin 0
+ h2
+ +header-text
+ :font-size 2em
+ :margin-bottom 0.75em
+ h3
+ +header-text
+ :font-size 1.5em
+ :line-height 1
+ :margin-bottom 1em
+ h4
+ +header-text
+ :font-size 1.2em
+ :line-height 1.25
+ :margin-bottom 1.25em
+ h5
+ +header-text
+ :font-size 1em
+ :font-weight bold
+ :margin-bottom 1.5em
+ h6
+ +header-text
+ :font-size 1em
+ :font-weight bold
+ h2 img, h3 img, h4 img, h5 img, h6 img
+ :margin 0
+ p
+ :margin 0 0 1.5em
+ img.left
+ +float-left
+ :margin 1.5em 1.5em 1.5em 0
+ :padding 0
+ img.right
+ +float-right
+ :margin 1.5em 0 1.5em 1.5em
+ :padding 0
+ a
+ :text-decoration underline
+ +link-colors(!link_color, !link_hover_color, !link_active_color, !link_visited_color, !link_focus_color)
+ blockquote
+ :margin 1.5em
+ :color #666
+ :font-style italic
+ strong
+ :font-weight bold
+ em
+ :font-style italic
+ dfn
+ :font-style italic
+ :font-weight bold
+ sup, sub
+ :line-height 0
+ abbr, acronym
+ :border-bottom 1px dotted #666
+ address
+ :margin 0 0 1.5em
+ :font-style italic
+ del
+ :color #666
+ pre
+ :margin 1.5em 0
+ :white-space pre
+ pre, code, tt
+ +fixed-width-text
+ li ul, li ol
+ :margin 0 1.5em
+ ul
+ :margin 0 1.5em 1.5em 1.5em
+ :list-style-type disc
+ ol
+ :margin 0 1.5em 1.5em 1.5em
+ :list-style-type decimal
+ dl
+ :margin 0 0 1.5em 0
+ dt
+ :font-weight bold
+ dd
+ :margin-left 1.5em
+ table
+ :margin-bottom 1.4em
+ :width 100%
+ th
+ :font-weight bold
+ thead th
+ :background= !blueprint_table_header_color
+ th, td, caption
+ :padding 4px 10px 4px 5px
+ tr.even td
+ :background= !blueprint_table_stripe_color
+ tfoot
+ :font-style italic
+ caption
+ :background #eee
+ .quiet
+ +quiet
+ .loud
+ +loud
diff --git a/vendor/gems/gems/compass-0.8.17/frameworks/blueprint/stylesheets/blueprint/modules/_utilities.sass b/vendor/gems/gems/compass-0.8.17/frameworks/blueprint/stylesheets/blueprint/modules/_utilities.sass
new file mode 100755
index 00000000..b46b9b50
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/frameworks/blueprint/stylesheets/blueprint/modules/_utilities.sass
@@ -0,0 +1,37 @@
+@import compass/utilities/text/nowrap.sass
+@import compass/utilities/general/float.sass
+
+// Most of these utility classes are not "semantic". If you use them,
+// you are mixing your content and presentation. For shame!
+
+=blueprint-utilities
+ // Regular clearing apply to column that should drop below previous ones.
+ .clear
+ :clear both
+ // turn off text wrapping for the element.
+ .nowrap
+ +nowrap
+ // Apply to an element that has floated children to make the bottom
+ // of the element fall _below_ the floated children.
+ .clearfix
+ +clearfix
+ .small
+ :font-size .8em
+ :margin-bottom 1.875em
+ :line-height 1.875em
+ .large
+ :font-size 1.2em
+ :line-height 2.5em
+ :margin-bottom 1.25em
+ .first
+ :margin-left 0
+ :padding-left 0
+ .last
+ :margin-right 0
+ :padding-right 0
+ .top
+ :margin-top 0
+ :padding-top 0
+ .bottom
+ :margin-bottom 0
+ :padding-bottom 0
diff --git a/vendor/gems/gems/compass-0.8.17/frameworks/blueprint/templates/buttons/buttons.sass b/vendor/gems/gems/compass-0.8.17/frameworks/blueprint/templates/buttons/buttons.sass
new file mode 100755
index 00000000..e8ca96e6
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/frameworks/blueprint/templates/buttons/buttons.sass
@@ -0,0 +1,49 @@
+@import compass/utilities/general/float.sass
+@import blueprint/modules/buttons.sass
+
+//
+ Use the following HTML code to place the buttons on your site:
+
+
+ Save
+
+
+
+ Change Password
+
+
+
+ Cancel
+
+
+a.button
+ // you can pass "left" or "right" to +anchor-button to float it in that direction
+ // or you can pass no argument to leave it inline-block (cross browser safe!) within
+ // the flow of your page.
+ +anchor-button("left")
+ // All the button color mixins take 4 optional arguments:
+ // font color, background color, border color, border highlight color
+ // the first three default to constants set in blueprint/modules/buttons.sass
+ // the last one defaults to a shade lighter than the border color.
+ +button-colors
+ +button-hover-colors
+ +button-active-colors
+
+button
+ // The +button-button mixin is just like the +anchor-button mixin, but for elements.
+ +button-button("left")
+ +button-colors
+ +button-hover-colors
+ +button-active-colors
+
+// We can change the colors for buttons of certain classes, etc.
+a.positive, button.positive
+ :color #529214
+ +button-hover-colors(#529214, #E6EFC2, #C6D880)
+ +button-active-colors(#FFF, #529214, #529214)
+
+a.negative, button.negative
+ :color #D12F19
+ +button-hover-colors(#D12F19, #FBE3E4, #FBC2C4)
+ +button-active-colors(#FFF, #D12F19, #D12F19)
+
diff --git a/vendor/gems/gems/compass-0.8.17/frameworks/blueprint/templates/buttons/buttons/cross.png b/vendor/gems/gems/compass-0.8.17/frameworks/blueprint/templates/buttons/buttons/cross.png
new file mode 100755
index 00000000..1514d51a
Binary files /dev/null and b/vendor/gems/gems/compass-0.8.17/frameworks/blueprint/templates/buttons/buttons/cross.png differ
diff --git a/vendor/gems/gems/compass-0.8.17/frameworks/blueprint/templates/buttons/buttons/key.png b/vendor/gems/gems/compass-0.8.17/frameworks/blueprint/templates/buttons/buttons/key.png
new file mode 100755
index 00000000..a9d5e4f8
Binary files /dev/null and b/vendor/gems/gems/compass-0.8.17/frameworks/blueprint/templates/buttons/buttons/key.png differ
diff --git a/vendor/gems/gems/compass-0.8.17/frameworks/blueprint/templates/buttons/buttons/tick.png b/vendor/gems/gems/compass-0.8.17/frameworks/blueprint/templates/buttons/buttons/tick.png
new file mode 100755
index 00000000..a9925a06
Binary files /dev/null and b/vendor/gems/gems/compass-0.8.17/frameworks/blueprint/templates/buttons/buttons/tick.png differ
diff --git a/vendor/gems/gems/compass-0.8.17/frameworks/blueprint/templates/buttons/manifest.rb b/vendor/gems/gems/compass-0.8.17/frameworks/blueprint/templates/buttons/manifest.rb
new file mode 100755
index 00000000..b097845b
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/frameworks/blueprint/templates/buttons/manifest.rb
@@ -0,0 +1,5 @@
+stylesheet 'buttons.sass', :media => 'screen, projection'
+
+image 'buttons/cross.png'
+image 'buttons/key.png'
+image 'buttons/tick.png'
diff --git a/vendor/gems/gems/compass-0.8.17/frameworks/blueprint/templates/link_icons/link_icons.sass b/vendor/gems/gems/compass-0.8.17/frameworks/blueprint/templates/link_icons/link_icons.sass
new file mode 100755
index 00000000..a095e833
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/frameworks/blueprint/templates/link_icons/link_icons.sass
@@ -0,0 +1,13 @@
+@import blueprint/modules/link_icons.sass
+
+// This turns link icons on for all links. You can change the scoping selector from
+// body to something more specific if you prefer.
+body
+ +link-icons
+ // Use this class if a link gets an icon when it shouldn't.
+ a.noicon
+ +no-link-icon
+ // Not all links have a url structure that can be detected,
+ // So you can set them explicitly yourself like so:
+ a#this-is-a-pdf-link
+ +link-icon("pdf.png")
diff --git a/vendor/gems/gems/compass-0.8.17/frameworks/blueprint/templates/link_icons/link_icons/doc.png b/vendor/gems/gems/compass-0.8.17/frameworks/blueprint/templates/link_icons/link_icons/doc.png
new file mode 100755
index 00000000..834cdfaf
Binary files /dev/null and b/vendor/gems/gems/compass-0.8.17/frameworks/blueprint/templates/link_icons/link_icons/doc.png differ
diff --git a/vendor/gems/gems/compass-0.8.17/frameworks/blueprint/templates/link_icons/link_icons/email.png b/vendor/gems/gems/compass-0.8.17/frameworks/blueprint/templates/link_icons/link_icons/email.png
new file mode 100755
index 00000000..7348aed7
Binary files /dev/null and b/vendor/gems/gems/compass-0.8.17/frameworks/blueprint/templates/link_icons/link_icons/email.png differ
diff --git a/vendor/gems/gems/compass-0.8.17/frameworks/blueprint/templates/link_icons/link_icons/external.png b/vendor/gems/gems/compass-0.8.17/frameworks/blueprint/templates/link_icons/link_icons/external.png
new file mode 100755
index 00000000..cf1cfb42
Binary files /dev/null and b/vendor/gems/gems/compass-0.8.17/frameworks/blueprint/templates/link_icons/link_icons/external.png differ
diff --git a/vendor/gems/gems/compass-0.8.17/frameworks/blueprint/templates/link_icons/link_icons/feed.png b/vendor/gems/gems/compass-0.8.17/frameworks/blueprint/templates/link_icons/link_icons/feed.png
new file mode 100755
index 00000000..315c4f4f
Binary files /dev/null and b/vendor/gems/gems/compass-0.8.17/frameworks/blueprint/templates/link_icons/link_icons/feed.png differ
diff --git a/vendor/gems/gems/compass-0.8.17/frameworks/blueprint/templates/link_icons/link_icons/im.png b/vendor/gems/gems/compass-0.8.17/frameworks/blueprint/templates/link_icons/link_icons/im.png
new file mode 100755
index 00000000..79f35ccb
Binary files /dev/null and b/vendor/gems/gems/compass-0.8.17/frameworks/blueprint/templates/link_icons/link_icons/im.png differ
diff --git a/vendor/gems/gems/compass-0.8.17/frameworks/blueprint/templates/link_icons/link_icons/pdf.png b/vendor/gems/gems/compass-0.8.17/frameworks/blueprint/templates/link_icons/link_icons/pdf.png
new file mode 100755
index 00000000..8f8095e4
Binary files /dev/null and b/vendor/gems/gems/compass-0.8.17/frameworks/blueprint/templates/link_icons/link_icons/pdf.png differ
diff --git a/vendor/gems/gems/compass-0.8.17/frameworks/blueprint/templates/link_icons/link_icons/visited.png b/vendor/gems/gems/compass-0.8.17/frameworks/blueprint/templates/link_icons/link_icons/visited.png
new file mode 100755
index 00000000..ebf206de
Binary files /dev/null and b/vendor/gems/gems/compass-0.8.17/frameworks/blueprint/templates/link_icons/link_icons/visited.png differ
diff --git a/vendor/gems/gems/compass-0.8.17/frameworks/blueprint/templates/link_icons/link_icons/xls.png b/vendor/gems/gems/compass-0.8.17/frameworks/blueprint/templates/link_icons/link_icons/xls.png
new file mode 100755
index 00000000..b977d7e5
Binary files /dev/null and b/vendor/gems/gems/compass-0.8.17/frameworks/blueprint/templates/link_icons/link_icons/xls.png differ
diff --git a/vendor/gems/gems/compass-0.8.17/frameworks/blueprint/templates/link_icons/manifest.rb b/vendor/gems/gems/compass-0.8.17/frameworks/blueprint/templates/link_icons/manifest.rb
new file mode 100755
index 00000000..5b8b4f9f
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/frameworks/blueprint/templates/link_icons/manifest.rb
@@ -0,0 +1,10 @@
+stylesheet "link_icons.sass", :media => 'screen, projection'
+
+image 'link_icons/doc.png'
+image 'link_icons/email.png'
+image 'link_icons/external.png'
+image 'link_icons/feed.png'
+image 'link_icons/im.png'
+image 'link_icons/pdf.png'
+image 'link_icons/visited.png'
+image 'link_icons/xls.png'
diff --git a/vendor/gems/gems/compass-0.8.17/frameworks/blueprint/templates/project/grid.png b/vendor/gems/gems/compass-0.8.17/frameworks/blueprint/templates/project/grid.png
new file mode 100755
index 00000000..129d4a29
Binary files /dev/null and b/vendor/gems/gems/compass-0.8.17/frameworks/blueprint/templates/project/grid.png differ
diff --git a/vendor/gems/gems/compass-0.8.17/frameworks/blueprint/templates/project/ie.sass b/vendor/gems/gems/compass-0.8.17/frameworks/blueprint/templates/project/ie.sass
new file mode 100755
index 00000000..fad09158
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/frameworks/blueprint/templates/project/ie.sass
@@ -0,0 +1,15 @@
+@import blueprint.sass
+
++blueprint-ie
+
+// Note :
+//
+// Compass will center text to fix IE6 container centering.
+// This means all your texts will be centered under all version of IE by default.
+// Please don't forget to restore the correct behavior to your main container (but not the body tag!)
+//
+// Example :
+//
+// .container, .footer
+// :text-align left
+
diff --git a/vendor/gems/gems/compass-0.8.17/frameworks/blueprint/templates/project/manifest.rb b/vendor/gems/gems/compass-0.8.17/frameworks/blueprint/templates/project/manifest.rb
new file mode 100755
index 00000000..853b59b7
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/frameworks/blueprint/templates/project/manifest.rb
@@ -0,0 +1,6 @@
+stylesheet 'screen.sass', :media => 'screen, projection'
+stylesheet 'partials/_base.sass'
+stylesheet 'print.sass', :media => 'print'
+stylesheet 'ie.sass', :media => 'screen, projection', :condition => "lt IE 8"
+
+image 'grid.png'
diff --git a/vendor/gems/gems/compass-0.8.17/frameworks/blueprint/templates/project/partials/_base.sass b/vendor/gems/gems/compass-0.8.17/frameworks/blueprint/templates/project/partials/_base.sass
new file mode 100755
index 00000000..f6d45e59
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/frameworks/blueprint/templates/project/partials/_base.sass
@@ -0,0 +1,11 @@
+// Here is where you can define your constants for your application and to configure the blueprint framework.
+// Feel free to delete these if you want keep the defaults:
+
+!blueprint_grid_columns = 24
+!blueprint_container_size = 950px
+!blueprint_grid_margin = 10px
+
+// Use this to calculate the width based on the total width.
+// Or you can set !blueprint_grid_width to a fixed value and unset !blueprint_container_size -- it will be calculated for you.
+!blueprint_grid_width = (!blueprint_container_size + !blueprint_grid_margin) / !blueprint_grid_columns - !blueprint_grid_margin
+
diff --git a/vendor/gems/gems/compass-0.8.17/frameworks/blueprint/templates/project/print.sass b/vendor/gems/gems/compass-0.8.17/frameworks/blueprint/templates/project/print.sass
new file mode 100755
index 00000000..8e5d49d8
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/frameworks/blueprint/templates/project/print.sass
@@ -0,0 +1,3 @@
+@import blueprint.sass
+
++blueprint-print
\ No newline at end of file
diff --git a/vendor/gems/gems/compass-0.8.17/frameworks/blueprint/templates/project/screen.sass b/vendor/gems/gems/compass-0.8.17/frameworks/blueprint/templates/project/screen.sass
new file mode 100755
index 00000000..e3588dcd
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/frameworks/blueprint/templates/project/screen.sass
@@ -0,0 +1,40 @@
+// This import applies a global reset to any page that imports this stylesheet.
+@import blueprint/reset.sass
+// To configure blueprint, edit the partials/base.sass file.
+@import partials/base.sass
+// Import all the default blueprint modules so that we can access their mixins.
+@import blueprint
+// Import the non-default scaffolding module.
+@import blueprint/modules/scaffolding.sass
+
+// To generate css equivalent to the blueprint css but with your configuration applied, uncomment:
+// +blueprint
+
+//Recommended Blueprint configuration with scoping and semantic layout:
++blueprint-typography("body.bp")
++blueprint-scaffolding("body.bp")
+body.bp
+ +blueprint-utilities
+ +blueprint-debug
+ +blueprint-interaction
+ // Remove the scaffolding when you're ready to start doing visual design.
+ // Or leave it in if you're happy with how blueprint looks out-of-the-box
+form.bp
+ +blueprint-form
+
+// Page layout can be done using mixins applied to your semantic classes and IDs:
+body.three-col
+ #container
+ +container
+ #header, #footer
+ +column(!blueprint_grid_columns)
+ #sidebar
+ // One third of the grid columns, rounding down. With 24 cols, this is 8.
+ !sidebar_columns = floor(!blueprint_grid_columns / 3)
+ +column(!sidebar_columns)
+ #content
+ // Two thirds of the grid columns, rounding up.
+ // With 24 cols, this is 16.
+ !content_columns = ceil(2 * !blueprint_grid_columns / 3)
+ // true means it's the last column in the row
+ +column(!content_columns, true)
diff --git a/vendor/gems/gems/compass-0.8.17/frameworks/compass.rb b/vendor/gems/gems/compass-0.8.17/frameworks/compass.rb
new file mode 100755
index 00000000..3ad82710
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/frameworks/compass.rb
@@ -0,0 +1,2 @@
+compass_dir = File.join(Compass.base_directory, 'frameworks', 'compass')
+Compass::Frameworks.register('compass', compass_dir)
diff --git a/vendor/gems/gems/compass-0.8.17/frameworks/compass/stylesheets/_compass.sass b/vendor/gems/gems/compass-0.8.17/frameworks/compass/stylesheets/_compass.sass
new file mode 100755
index 00000000..79a50ab1
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/frameworks/compass/stylesheets/_compass.sass
@@ -0,0 +1 @@
+@import compass/utilities.sass
\ No newline at end of file
diff --git a/vendor/gems/gems/compass-0.8.17/frameworks/compass/stylesheets/compass/_layout.sass b/vendor/gems/gems/compass-0.8.17/frameworks/compass/stylesheets/compass/_layout.sass
new file mode 100755
index 00000000..dc745fa8
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/frameworks/compass/stylesheets/compass/_layout.sass
@@ -0,0 +1 @@
+@import layout/sticky_footer.sass
\ No newline at end of file
diff --git a/vendor/gems/gems/compass-0.8.17/frameworks/compass/stylesheets/compass/_misc.sass b/vendor/gems/gems/compass-0.8.17/frameworks/compass/stylesheets/compass/_misc.sass
new file mode 100755
index 00000000..ce332ca5
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/frameworks/compass/stylesheets/compass/_misc.sass
@@ -0,0 +1,24 @@
+//
+ This logo was designed by Jared Hardy
+ This work is licensed under the Creative Commons Attribution 3.0 United States License.
+ To view a copy of this license, visit http://creativecommons.org/licenses/by/3.0/us/
+ or send a letter to:
+ Creative Commons, 171 Second Street, Suite 300, San Francisco, California, 94105, USA.
+
+=unobtrusive-logo(!size = 1em)
+ :font-family Monaco, Courier, "Lucida Sans Unicode", monospace
+ :font-size= !size
+ :color #888
+ .selector
+ :vertical-align middle
+ :font-size= 1.3em
+ .brace
+ :vertical-align middle
+ :font bold 1.7em Georgia, "Times New Roman", serif
+ :color #CCC
+ :margin= 0 -0.2em
+ .rule
+ :vertical-align middle
+ :margin= 0 -0.2em
+
+
\ No newline at end of file
diff --git a/vendor/gems/gems/compass-0.8.17/frameworks/compass/stylesheets/compass/_reset.sass b/vendor/gems/gems/compass-0.8.17/frameworks/compass/stylesheets/compass/_reset.sass
new file mode 100755
index 00000000..30d9bbd4
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/frameworks/compass/stylesheets/compass/_reset.sass
@@ -0,0 +1,3 @@
+@import utilities/general/reset.sass
+
++global-reset
diff --git a/vendor/gems/gems/compass-0.8.17/frameworks/compass/stylesheets/compass/_utilities.sass b/vendor/gems/gems/compass-0.8.17/frameworks/compass/stylesheets/compass/_utilities.sass
new file mode 100755
index 00000000..767001d5
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/frameworks/compass/stylesheets/compass/_utilities.sass
@@ -0,0 +1,6 @@
+@import utilities/general.sass
+@import utilities/links.sass
+@import utilities/lists.sass
+@import utilities/sprites.sass
+@import utilities/tables.sass
+@import utilities/text.sass
diff --git a/vendor/gems/gems/compass-0.8.17/frameworks/compass/stylesheets/compass/layout/_sticky_footer.sass b/vendor/gems/gems/compass-0.8.17/frameworks/compass/stylesheets/compass/layout/_sticky_footer.sass
new file mode 100755
index 00000000..8b8c4b04
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/frameworks/compass/stylesheets/compass/layout/_sticky_footer.sass
@@ -0,0 +1,17 @@
+// Based on http://ryanfait.com/resources/footer-stick-to-bottom-of-page/
+// Mix into the top level.
+// Footer element must be outside of root wrapper element.
+// Footer must be a fixed height.
+
+=sticky-footer(!footer_height, !root_selector = "#root", !root_footer_selector = "#root_footer", !footer_selector = "#footer")
+ html, body
+ :height 100%
+ #{!root_selector}
+ :min-height 100%
+ :margin-bottom= -!footer_height
+ #{!root_footer_selector}
+ :height= !footer_height
+ #{!footer_selector}
+ :clear both
+ :position relative
+ :height= !footer_height
diff --git a/vendor/gems/gems/compass-0.8.17/frameworks/compass/stylesheets/compass/utilities/_general.sass b/vendor/gems/gems/compass-0.8.17/frameworks/compass/stylesheets/compass/utilities/_general.sass
new file mode 100755
index 00000000..a09b235a
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/frameworks/compass/stylesheets/compass/utilities/_general.sass
@@ -0,0 +1,6 @@
+@import general/reset.sass
+@import general/clearfix.sass
+@import general/float.sass
+@import general/tag_cloud.sass
+@import general/inline_block.sass
+@import general/hacks.sass
diff --git a/vendor/gems/gems/compass-0.8.17/frameworks/compass/stylesheets/compass/utilities/_links.sass b/vendor/gems/gems/compass-0.8.17/frameworks/compass/stylesheets/compass/utilities/_links.sass
new file mode 100755
index 00000000..afd4e369
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/frameworks/compass/stylesheets/compass/utilities/_links.sass
@@ -0,0 +1,3 @@
+@import links/hover_link.sass
+@import links/link_colors.sass
+@import links/unstyled_link.sass
\ No newline at end of file
diff --git a/vendor/gems/gems/compass-0.8.17/frameworks/compass/stylesheets/compass/utilities/_lists.sass b/vendor/gems/gems/compass-0.8.17/frameworks/compass/stylesheets/compass/utilities/_lists.sass
new file mode 100755
index 00000000..8e309778
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/frameworks/compass/stylesheets/compass/utilities/_lists.sass
@@ -0,0 +1,3 @@
+@import lists/horizontal_list.sass
+@import lists/inline_list.sass
+@import lists/bullets.sass
diff --git a/vendor/gems/gems/compass-0.8.17/frameworks/compass/stylesheets/compass/utilities/_print.sass b/vendor/gems/gems/compass-0.8.17/frameworks/compass/stylesheets/compass/utilities/_print.sass
new file mode 100755
index 00000000..fc1caf4d
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/frameworks/compass/stylesheets/compass/utilities/_print.sass
@@ -0,0 +1,24 @@
+// Classes that are useful for controlling what gets printed.
+// You must mix +print-utilities into your print stylesheet
+// and +print-utilities("screen") into your screen stylesheet.
+// Note: these aren't semantic.
+=print-utilities(!media = "print")
+ @if !media == "print"
+ .noprint,
+ .no-print
+ :display none
+ address, blockquote, center, dir, div, dd, dl, dt,
+ fieldset, form, frameset, h1, h2, h3, h4, h5, h6, hr,
+ isindex, li, menu, noframes, noscript, ol, p, pre,
+ table, tbody, td, tfoot, th, thead, tr, ul
+ &.print-only
+ :display block
+ a, abbr, acronym, b, basefont, bdo, big, br, cite,
+ code, dfn, em, font, i, img, input, kbd, label, q, s,
+ samp, select, small, span, strike, strong, sub, sup,
+ textarea, tt, u, var
+ &.print-only
+ :display inline
+ @else
+ .print-only
+ :display none
diff --git a/vendor/gems/gems/compass-0.8.17/frameworks/compass/stylesheets/compass/utilities/_sprites.sass b/vendor/gems/gems/compass-0.8.17/frameworks/compass/stylesheets/compass/utilities/_sprites.sass
new file mode 100755
index 00000000..48b42433
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/frameworks/compass/stylesheets/compass/utilities/_sprites.sass
@@ -0,0 +1 @@
+@import sprites/sprite_img.sass
\ No newline at end of file
diff --git a/vendor/gems/gems/compass-0.8.17/frameworks/compass/stylesheets/compass/utilities/_tables.sass b/vendor/gems/gems/compass-0.8.17/frameworks/compass/stylesheets/compass/utilities/_tables.sass
new file mode 100755
index 00000000..2f22af4e
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/frameworks/compass/stylesheets/compass/utilities/_tables.sass
@@ -0,0 +1,3 @@
+@import tables/alternating_rows_and_columns.sass
+@import tables/borders.sass
+@import tables/scaffolding.sass
diff --git a/vendor/gems/gems/compass-0.8.17/frameworks/compass/stylesheets/compass/utilities/_text.sass b/vendor/gems/gems/compass-0.8.17/frameworks/compass/stylesheets/compass/utilities/_text.sass
new file mode 100755
index 00000000..6d130f32
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/frameworks/compass/stylesheets/compass/utilities/_text.sass
@@ -0,0 +1,2 @@
+@import text/nowrap.sass
+@import text/replacement.sass
diff --git a/vendor/gems/gems/compass-0.8.17/frameworks/compass/stylesheets/compass/utilities/general/_clearfix.sass b/vendor/gems/gems/compass-0.8.17/frameworks/compass/stylesheets/compass/utilities/general/_clearfix.sass
new file mode 100755
index 00000000..e64afef3
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/frameworks/compass/stylesheets/compass/utilities/general/_clearfix.sass
@@ -0,0 +1,24 @@
+@import hacks.sass
+
+//**
+ Extends the element to enclose any floats it contains.
+ This basic method is preferred for the usual case, when positioned content will not show outside the bounds of the container.
+ Recommendations include using this in conjunction with a width:
+ http://www.quirksmode.org/blog/archives/2005/03/clearing_floats.html
+=clearfix
+ :overflow hidden
+ +has-layout
+
+//**
+ Extends the element to enclose any floats it contains.
+ This older "Easy Clearing" method has the advantage of allowing positioned elements to hang outside the bounds of the container, at the expense of more tricky CSS.
+ http://www.positioniseverything.net/easyclearing.html
+=pie-clearfix
+ &:after
+ :content " "
+ :display block
+ :height 0
+ :clear both
+ :overflow hidden
+ :visibility hidden
+ +has-layout
diff --git a/vendor/gems/gems/compass-0.8.17/frameworks/compass/stylesheets/compass/utilities/general/_float.sass b/vendor/gems/gems/compass-0.8.17/frameworks/compass/stylesheets/compass/utilities/general/_float.sass
new file mode 100755
index 00000000..a0d58713
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/frameworks/compass/stylesheets/compass/utilities/general/_float.sass
@@ -0,0 +1,17 @@
+//**\\
+ Float
+
+@import clearfix.sass
+
+// Implementation of float:left with fix for double-margin bug
+=float-left
+ +float("left")
+
+// Implementation of float:right with fix for double-margin bug
+=float-right
+ +float("right")
+
+// Available as alternate syntax with just +float
+=float(!side = "left")
+ :display inline
+ :float= !side
diff --git a/vendor/gems/gems/compass-0.8.17/frameworks/compass/stylesheets/compass/utilities/general/_hacks.sass b/vendor/gems/gems/compass-0.8.17/frameworks/compass/stylesheets/compass/utilities/general/_hacks.sass
new file mode 100755
index 00000000..19417ee1
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/frameworks/compass/stylesheets/compass/utilities/general/_hacks.sass
@@ -0,0 +1,6 @@
+=has-layout
+ // This makes ie6 get layout
+ :display inline-block
+ // and this puts it back to block
+ &
+ :display block
diff --git a/vendor/gems/gems/compass-0.8.17/frameworks/compass/stylesheets/compass/utilities/general/_inline_block.sass b/vendor/gems/gems/compass-0.8.17/frameworks/compass/stylesheets/compass/utilities/general/_inline_block.sass
new file mode 100755
index 00000000..94cd1357
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/frameworks/compass/stylesheets/compass/utilities/general/_inline_block.sass
@@ -0,0 +1,6 @@
+=inline-block
+ :zoom 1
+ :display inline
+ :display -moz-inline-box
+ :display inline-block
+ :vertical-align top
diff --git a/vendor/gems/gems/compass-0.8.17/frameworks/compass/stylesheets/compass/utilities/general/_reset.sass b/vendor/gems/gems/compass-0.8.17/frameworks/compass/stylesheets/compass/utilities/general/_reset.sass
new file mode 100755
index 00000000..8d968e53
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/frameworks/compass/stylesheets/compass/utilities/general/_reset.sass
@@ -0,0 +1,134 @@
+// Based on Eric Meyer's reset http://meyerweb.com/eric/thoughts/2007/05/01/reset-reloaded/
+
+// Global reset rules.
+// For more specific resets, use the reset mixins provided below
+=global-reset
+ html, body, div, span, applet, object, iframe,
+ h1, h2, h3, h4, h5, h6, p, blockquote, pre,
+ a, abbr, acronym, address, big, cite, code,
+ del, dfn, em, font, img, ins, kbd, q, s, samp,
+ small, strike, strong, sub, sup, tt, var,
+ dl, dt, dd, ol, ul, li,
+ fieldset, form, label, legend,
+ table, caption, tbody, tfoot, thead, tr, th, td
+ +reset-box-model
+ +reset-font
+
+ *:focus
+ +reset-focus
+
+ body
+ +reset-body
+
+ ol, ul
+ +reset-list-style
+
+ /* tables still need 'cellspacing="0"' in the markup
+ table
+ +reset-table
+
+ caption, th, td
+ +reset-table-cell
+
+ q, blockquote
+ +reset-quotation
+
+ img a
+ +reset-image-anchor-border
+
+
+// Reset all elements within some selector scope.To reset the selector itself,
+// mixin the appropriate reset mixin for that element type as well. This could be
+// useful if you want to style a part of your page in a dramatically different way.
+=nested-reset
+ div, span, object, iframe, h1, h2, h3, h4, h5, h6, p,
+ pre, a, abbr, acronym, address, code, del, dfn, em, img,
+ dl, dt, dd, ol, ul, li, fieldset, form, label, legend, caption, tbody, tfoot, thead, tr
+ +reset-box-model
+ +reset-font
+
+ /* tables still need 'cellspacing="0"' in the markup
+ table
+ +reset-table
+
+ caption, th, td
+ +reset-table-cell
+
+ q, blockquote
+ +reset-quotation
+
+ img a
+ +reset-image-anchor-border
+
+//Mixins partials
+=reset-box-model
+ :margin 0
+ :padding 0
+ :border 0
+ :outline 0
+
+=reset-font
+ :font
+ :weight inherit
+ :style inherit
+ :size 100%
+ :family inherit
+ :vertical-align baseline
+
+=reset-focus
+ :outline 0
+
+=reset-body
+ :line-height 1em
+ :color = #000
+ :background #fff
+
+=reset-list-style
+ :list-style none
+
+=reset-table
+ :border-collapse separate
+ :border-spacing 0
+ :vertical-align middle
+
+=reset-table-cell
+ :text-align left
+ :font-weight normal
+ :vertical-align middle
+
+=reset-quotation
+ :quotes "" ""
+ &:before, &:after
+ :content ""
+
+=reset-image-anchor-border
+ :border none
+
+=reset-html5
+ section, article, aside, header, footer, nav, dialog, figure
+ display: block
+
+//**
+ Resets the display of inline and block elements to their default display
+ according to their tag type. Elements that have a default display that varies across
+ versions of html or browser are not handled here, but this covers the 90% use case.
+ Usage Example:
+ // Turn off the display for both of these classes
+ .unregistered-only, .registered-only
+ :display none
+ // Now turn only one of them back on depending on some other context.
+ body.registered
+ +reset-display(".registered-only")
+ body.unregistered
+ +reset-display(".unregistered-only")
+=reset-display(!selector = "", !important = false)
+ #{append_selector(elements_of_type("inline"), !selector)}
+ @if !important
+ display: inline !important
+ @else
+ display: inline
+ #{append_selector(elements_of_type("block"), !selector)}
+ @if !important
+ display: block !important
+ @else
+ display: block
\ No newline at end of file
diff --git a/vendor/gems/gems/compass-0.8.17/frameworks/compass/stylesheets/compass/utilities/general/_tabs.sass b/vendor/gems/gems/compass-0.8.17/frameworks/compass/stylesheets/compass/utilities/general/_tabs.sass
new file mode 100755
index 00000000..e69de29b
diff --git a/vendor/gems/gems/compass-0.8.17/frameworks/compass/stylesheets/compass/utilities/general/_tag_cloud.sass b/vendor/gems/gems/compass-0.8.17/frameworks/compass/stylesheets/compass/utilities/general/_tag_cloud.sass
new file mode 100755
index 00000000..3f6665dc
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/frameworks/compass/stylesheets/compass/utilities/general/_tag_cloud.sass
@@ -0,0 +1,19 @@
+// Emits styles for a tag cloud
+=tag-cloud(!base_size = 1em)
+ :font-size= !base_size
+ :line-height= 1.2 * !base_size
+ .xxs, .xs, .s, .l, .xl, .xxl
+ :line-height= 1.2 * !base_size
+ .xxs
+ :font-size= !base_size / 2.0
+ .xs
+ :font-size= 2.0 * !base_size / 3.0
+ .s
+ :font-size= 3.0 * !base_size / 4.0
+ .l
+ :font-size= 4.0 * !base_size / 3.0
+ .xl
+ :font-size= 3.0 * !base_size / 2.0
+ .xxl
+ :font-size= 2.0 * !base_size
+
diff --git a/vendor/gems/gems/compass-0.8.17/frameworks/compass/stylesheets/compass/utilities/links/_hover_link.sass b/vendor/gems/gems/compass-0.8.17/frameworks/compass/stylesheets/compass/utilities/links/_hover_link.sass
new file mode 100755
index 00000000..a8b51545
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/frameworks/compass/stylesheets/compass/utilities/links/_hover_link.sass
@@ -0,0 +1,5 @@
+// a link that only has an underline when you hover over it
+=hover-link
+ :text-decoration none
+ &:hover
+ :text-decoration underline
diff --git a/vendor/gems/gems/compass-0.8.17/frameworks/compass/stylesheets/compass/utilities/links/_link_colors.sass b/vendor/gems/gems/compass-0.8.17/frameworks/compass/stylesheets/compass/utilities/links/_link_colors.sass
new file mode 100755
index 00000000..dcdae06d
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/frameworks/compass/stylesheets/compass/utilities/links/_link_colors.sass
@@ -0,0 +1,24 @@
+// Set all the colors for a link with one mixin call
+// Order of arguments is:
+// normal, hover, active, visited, focus
+// states not specified will inherit.
+// Mixin like so:
+// a
+// +link-colors(#00c, #0cc, #c0c, #ccc, #cc0)
+
+=link-colors(!normal, !hover = false, !active = false, !visited = false, !focus = false)
+ :color= !normal
+ @if !visited
+ &:visited
+ :color= !visited
+ @if !focus
+ &:focus
+ :color= !focus
+ @if !hover
+ &:hover
+ :color= !hover
+ @if !active
+ &:active
+ :color= !active
+
+
\ No newline at end of file
diff --git a/vendor/gems/gems/compass-0.8.17/frameworks/compass/stylesheets/compass/utilities/links/_unstyled_link.sass b/vendor/gems/gems/compass-0.8.17/frameworks/compass/stylesheets/compass/utilities/links/_unstyled_link.sass
new file mode 100755
index 00000000..5f25ce39
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/frameworks/compass/stylesheets/compass/utilities/links/_unstyled_link.sass
@@ -0,0 +1,5 @@
+// A link that looks and acts like the text it is contained within
+=unstyled-link
+ :color inherit
+ :text-decoration inherit
+ :cursor inherit
diff --git a/vendor/gems/gems/compass-0.8.17/frameworks/compass/stylesheets/compass/utilities/lists/_bullets.sass b/vendor/gems/gems/compass-0.8.17/frameworks/compass/stylesheets/compass/utilities/lists/_bullets.sass
new file mode 100755
index 00000000..86657098
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/frameworks/compass/stylesheets/compass/utilities/lists/_bullets.sass
@@ -0,0 +1,21 @@
+// Turn off the bullet for an element of a list
+=no-bullet
+ :list-style-type none
+ :margin-left 0px
+
+// turns off the bullets for an entire list
+=no-bullets
+ li
+ +no-bullet
+
+// Make a list(ul/ol) have an image bullet
+// mixin should be used like this for an icon that is 5x7:
+// ul.pretty
+// +pretty-bullets("my-icon.png", 5px, 7px)
+=pretty-bullets(!bullet_icon, !width, !height, !line_height = 18px, !padding = 14px)
+ :margin-left 0
+ li
+ :padding-left= !padding
+ :background= image_url(!bullet_icon) "no-repeat" ((!padding - !width) / 2) ((!line_height - !height) / 2)
+ :list-style-type none
+
diff --git a/vendor/gems/gems/compass-0.8.17/frameworks/compass/stylesheets/compass/utilities/lists/_horizontal_list.sass b/vendor/gems/gems/compass-0.8.17/frameworks/compass/stylesheets/compass/utilities/lists/_horizontal_list.sass
new file mode 100755
index 00000000..49d21c7d
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/frameworks/compass/stylesheets/compass/utilities/lists/_horizontal_list.sass
@@ -0,0 +1,52 @@
+//**\\
+ Horizontal list layout module.
+
+ Easy mode using simple descendant li selectors:
+
+ ul.nav
+ +horizontal-list
+
+ Advanced mode:
+ If you need to target the list items using a different selector then use
+ +horizontal-list-container on your ul/ol and +horizontal-list-item on your li.
+ This may help when working on layouts involving nested lists. For example:
+
+ ul.nav
+ +horizontal-list-container
+ > li
+ +horizontal-list-item
+
+@import bullets.sass
+@import compass/utilities/general/reset.sass
+@import compass/utilities/general/float.sass
+
+//**
+ Can be mixed into any selector that target a ul or ol that is meant
+ to have a horizontal layout. Used to implement +horizontal-list.
+=horizontal-list-container
+ +reset-box-model
+ +clearfix
+
+//**
+ Can be mixed into any li selector that is meant to participate in a horizontal layout.
+ Used to implement +horizontal-list.
+=horizontal-list-item(!padding = 4px)
+ +no-bullet
+ :white-space nowrap
+ +float-left
+ :padding
+ :left= !padding
+ :right= !padding
+ &.first
+ :padding-left 0px
+ &.last
+ :padding-right 0px
+
+//**
+ A list(ol,ul) that is layed out such that the elements are floated left and won't wrap.
+ This is not an inline list.
+=horizontal-list(!padding = 4px)
+ +horizontal-list-container
+ li
+ +horizontal-list-item(!padding)
+
diff --git a/vendor/gems/gems/compass-0.8.17/frameworks/compass/stylesheets/compass/utilities/lists/_inline_list.sass b/vendor/gems/gems/compass-0.8.17/frameworks/compass/stylesheets/compass/utilities/lists/_inline_list.sass
new file mode 100755
index 00000000..e6d0a185
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/frameworks/compass/stylesheets/compass/utilities/lists/_inline_list.sass
@@ -0,0 +1,29 @@
+// makes a list inline.
+
+=inline-list
+ :list-style-type none
+ :margin 0px
+ :padding 0px
+ :display inline
+ li
+ :margin 0px
+ :padding 0px
+ :display inline
+
+// makes an inlin list that is comma delimited.
+// use of this recipe is not recommended at this time due to browser support issues.
+//
+// use of :content and :after is not fully supported in all browsers.
+// See http://www.quirksmode.org/css/contents.html#t15 for the support matrix
+//
+// :last-child is not fully supported
+// see http://www.quirksmode.org/css/contents.html#t29 for the support matrix
+
+=comma-delimited-list
+ +inline-list
+ li
+ &:after
+ :content ", "
+ &:last-child, &.last
+ &:after
+ :content ""
diff --git a/vendor/gems/gems/compass-0.8.17/frameworks/compass/stylesheets/compass/utilities/sprites/_sprite_img.sass b/vendor/gems/gems/compass-0.8.17/frameworks/compass/stylesheets/compass/utilities/sprites/_sprite_img.sass
new file mode 100755
index 00000000..2381dbd4
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/frameworks/compass/stylesheets/compass/utilities/sprites/_sprite_img.sass
@@ -0,0 +1,12 @@
+!sprite_image_default_width ||= 32px
+!sprite_image_default_height ||= 32px
+!sprite_image_default_margin ||= 0px
+
+// Simplest use: +sprite-img("icons-32.png", 1)
+=sprite-img(!img, !col, !row = 1, !width = !sprite_image_default_width, !height = !sprite_image_default_height, !margin = !sprite_image_default_margin)
+ !x = ((!col - 1) * -!width) - ((!col - 1) * !margin)
+ !y = ((!row - 1) * -!height) - ((!row - 1) * !margin)
+ :background= image_url(!img) "no-repeat" !x !y
+ :width= !width
+ :height= !height
+ :overflow hidden
\ No newline at end of file
diff --git a/vendor/gems/gems/compass-0.8.17/frameworks/compass/stylesheets/compass/utilities/tables/_alternating_rows_and_columns.sass b/vendor/gems/gems/compass-0.8.17/frameworks/compass/stylesheets/compass/utilities/tables/_alternating_rows_and_columns.sass
new file mode 100755
index 00000000..4b0e9490
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/frameworks/compass/stylesheets/compass/utilities/tables/_alternating_rows_and_columns.sass
@@ -0,0 +1,20 @@
+=alternating-rows-and-columns(!even_row_color, !odd_row_color, !dark_intersection, !header_color = #FFF, !footer_color = #FFF)
+ th
+ :background-color= !header_color
+ &.even
+ :background-color= !header_color - !dark_intersection
+ tr.odd
+ td
+ :background-color= !odd_row_color
+ &.even
+ :background-color= !odd_row_color - !dark_intersection
+ tr.even
+ td
+ :background-color= !even_row_color
+ &.even
+ :background-color= !even_row_color - !dark_intersection
+ tfoot
+ th, td
+ :background-color= !footer_color
+ &.even
+ :background-color= !footer_color - !dark_intersection
diff --git a/vendor/gems/gems/compass-0.8.17/frameworks/compass/stylesheets/compass/utilities/tables/_borders.sass b/vendor/gems/gems/compass-0.8.17/frameworks/compass/stylesheets/compass/utilities/tables/_borders.sass
new file mode 100755
index 00000000..4073969c
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/frameworks/compass/stylesheets/compass/utilities/tables/_borders.sass
@@ -0,0 +1,27 @@
+=outer-table-borders(!width = 2px, !color = black)
+ :border= !width "solid" !color
+ thead
+ th
+ :border-bottom= !width "solid" !color
+ tfoot
+ th, td
+ :border-top= !width "solid" !color
+ th
+ &:first-child
+ :border-right= !width "solid" !color
+
+=inner-table-borders(!width = 2px, !color = black)
+ th, td
+ :border
+ :right= !width "solid" !color
+ :bottom= !width "solid" !color
+ :left-width 0px
+ :top-width 0px
+ &:last-child,
+ &.last
+ :border-right-width 0px
+ tbody, tfoot
+ tr:last-child,
+ tr.last
+ th, td
+ :border-bottom-width 0px
diff --git a/vendor/gems/gems/compass-0.8.17/frameworks/compass/stylesheets/compass/utilities/tables/_scaffolding.sass b/vendor/gems/gems/compass-0.8.17/frameworks/compass/stylesheets/compass/utilities/tables/_scaffolding.sass
new file mode 100755
index 00000000..96093fc0
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/frameworks/compass/stylesheets/compass/utilities/tables/_scaffolding.sass
@@ -0,0 +1,9 @@
+=table-scaffolding
+ th
+ :text-align center
+ :font-weight bold
+ td,
+ th
+ :padding 2px
+ &.numeric
+ :text-align right
diff --git a/vendor/gems/gems/compass-0.8.17/frameworks/compass/stylesheets/compass/utilities/text/_ellipsis.sass b/vendor/gems/gems/compass-0.8.17/frameworks/compass/stylesheets/compass/utilities/text/_ellipsis.sass
new file mode 100755
index 00000000..01fc3fbc
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/frameworks/compass/stylesheets/compass/utilities/text/_ellipsis.sass
@@ -0,0 +1,13 @@
+//
+ This technique, by [Justin Maxwell](http://code404.com/), was originally
+ published at http://mattsnider.com/css/css-string-truncation-with-ellipsis/
+ Firefox implementation by [Rikkert Koppes](http://www.rikkertkoppes.com/thoughts/2008/6/)
+
+=ellipsis(!no_wrap = true)
+ @if !no_wrap
+ white-space: nowrap
+ overflow: hidden
+ text-overflow: ellipsis
+ -o-text-overflow: ellipsis
+ -ms-text-overflow: ellipsis
+ -moz-binding= stylesheet_url("xml/ellipsis.xml#ellipsis")
diff --git a/vendor/gems/gems/compass-0.8.17/frameworks/compass/stylesheets/compass/utilities/text/_nowrap.sass b/vendor/gems/gems/compass-0.8.17/frameworks/compass/stylesheets/compass/utilities/text/_nowrap.sass
new file mode 100755
index 00000000..1d5ada52
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/frameworks/compass/stylesheets/compass/utilities/text/_nowrap.sass
@@ -0,0 +1,3 @@
+// When remembering whether or not there's a hyphen in white-space is too hard
+=nowrap
+ :white-space nowrap
diff --git a/vendor/gems/gems/compass-0.8.17/frameworks/compass/stylesheets/compass/utilities/text/_replacement.sass b/vendor/gems/gems/compass-0.8.17/frameworks/compass/stylesheets/compass/utilities/text/_replacement.sass
new file mode 100755
index 00000000..52f28103
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/frameworks/compass/stylesheets/compass/utilities/text/_replacement.sass
@@ -0,0 +1,17 @@
+//
+ Hides html text and replaces it with an image.
+ If you use this on an inline element, you will need to change the display to block or inline-block.
+ Also, if the size of the image differs significantly from the font size, you'll need to set the width and/or height.
+ @param img
+ the relative path from the project image directory to the image.
+ @param x
+ the x position of the background image.
+ @param y
+ the y position of the background image.
+=replace-text( !img, !x = 50%, !y = 50% )
+ :text-indent -9999em
+ :overflow hidden
+ :background
+ :image= image_url(!img)
+ :repeat no-repeat
+ :position= !x !y
diff --git a/vendor/gems/gems/compass-0.8.17/frameworks/compass/templates/ellipsis/ellipsis.sass b/vendor/gems/gems/compass-0.8.17/frameworks/compass/templates/ellipsis/ellipsis.sass
new file mode 100755
index 00000000..47d6fe68
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/frameworks/compass/templates/ellipsis/ellipsis.sass
@@ -0,0 +1,6 @@
+@import compass/utilities/text/ellipsis.sass
+
+// You can delete this sass file if you want, it's just an example of how to use the ellipsis mixin.
+// By default, ellipsis text is no-wrap. Pass false as the first argument if you don't want that.
+.ellipsis
+ +ellipsis
\ No newline at end of file
diff --git a/vendor/gems/gems/compass-0.8.17/frameworks/compass/templates/ellipsis/manifest.rb b/vendor/gems/gems/compass-0.8.17/frameworks/compass/templates/ellipsis/manifest.rb
new file mode 100755
index 00000000..de28fcec
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/frameworks/compass/templates/ellipsis/manifest.rb
@@ -0,0 +1,2 @@
+file 'xml/ellipsis.xml', :like => :css
+stylesheet 'ellipsis.sass'
\ No newline at end of file
diff --git a/vendor/gems/gems/compass-0.8.17/frameworks/compass/templates/ellipsis/xml/ellipsis.xml b/vendor/gems/gems/compass-0.8.17/frameworks/compass/templates/ellipsis/xml/ellipsis.xml
new file mode 100755
index 00000000..3f94b6e2
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/frameworks/compass/templates/ellipsis/xml/ellipsis.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/vendor/gems/gems/compass-0.8.17/frameworks/compass/templates/project/ie.sass b/vendor/gems/gems/compass-0.8.17/frameworks/compass/templates/project/ie.sass
new file mode 100755
index 00000000..b38d08b4
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/frameworks/compass/templates/project/ie.sass
@@ -0,0 +1,6 @@
+/*
+ Welcome to Compass. Use this file to write IE specific override styles.
+ Import this file using the following HTML or equivalent:
+
diff --git a/vendor/gems/gems/compass-0.8.17/frameworks/compass/templates/project/manifest.rb b/vendor/gems/gems/compass-0.8.17/frameworks/compass/templates/project/manifest.rb
new file mode 100755
index 00000000..03604fe2
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/frameworks/compass/templates/project/manifest.rb
@@ -0,0 +1,3 @@
+stylesheet 'screen.sass', :media => 'screen, projection'
+stylesheet 'print.sass', :media => 'print'
+stylesheet 'ie.sass', :media => 'screen, projection', :condition => "IE"
\ No newline at end of file
diff --git a/vendor/gems/gems/compass-0.8.17/frameworks/compass/templates/project/print.sass b/vendor/gems/gems/compass-0.8.17/frameworks/compass/templates/project/print.sass
new file mode 100755
index 00000000..34991cab
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/frameworks/compass/templates/project/print.sass
@@ -0,0 +1,6 @@
+/*
+ Welcome to Compass. Use this file to define print styles.
+ Import this file using the following HTML or equivalent:
+
+
+
diff --git a/vendor/gems/gems/compass-0.8.17/frameworks/compass/templates/project/screen.sass b/vendor/gems/gems/compass-0.8.17/frameworks/compass/templates/project/screen.sass
new file mode 100755
index 00000000..aa865b19
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/frameworks/compass/templates/project/screen.sass
@@ -0,0 +1,13 @@
+/*
+ Welcome to Compass.
+ In this file you should write your main styles. (or centralize your imports)
+ Import this file using the following HTML or equivalent:
+
+
+@import compass/reset.sass
+
+/*
+ The *:focus rule is reset and suppresses link outlining.
+ You _must_ remember to redefine your own outline, as it’s an important accessibility aid. E.g.
+ *:focus
+ outline: #ccc dotted medium
diff --git a/vendor/gems/gems/compass-0.8.17/frameworks/yui.rb b/vendor/gems/gems/compass-0.8.17/frameworks/yui.rb
new file mode 100755
index 00000000..00b41003
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/frameworks/yui.rb
@@ -0,0 +1,2 @@
+yui_dir = File.join(Compass.base_directory, 'frameworks', 'yui')
+Compass::Frameworks.register('yui', yui_dir)
diff --git a/vendor/gems/gems/compass-0.8.17/frameworks/yui/stylesheets/_yui.sass b/vendor/gems/gems/compass-0.8.17/frameworks/yui/stylesheets/_yui.sass
new file mode 100755
index 00000000..acc2006e
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/frameworks/yui/stylesheets/_yui.sass
@@ -0,0 +1,7 @@
+@import yui/modules/base.sass
+@import yui/modules/fonts.sass
+@import yui/modules/grids.sass
+=yui
+ +yui-base
+ +yui-base-fonts
+ +yui-grids
\ No newline at end of file
diff --git a/vendor/gems/gems/compass-0.8.17/frameworks/yui/stylesheets/yui/modules/_base.sass b/vendor/gems/gems/compass-0.8.17/frameworks/yui/stylesheets/yui/modules/_base.sass
new file mode 100755
index 00000000..7f95b886
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/frameworks/yui/stylesheets/yui/modules/_base.sass
@@ -0,0 +1,60 @@
+=yui-base
+ h1
+ :font-size 138.5%
+
+ h2
+ :font-size 123.1%
+
+ h3
+ :font-size 108%
+
+ h1, h2, h3
+ :margin 1em 0
+
+ h1,h2, h3, h4, h5, h6, strong
+ :font-weight bold
+
+ abbr, acronym
+ :border-bottom 1px dotted #000
+ :cursor help
+
+ em
+ :font-style italic
+
+ blockquote
+ :margin 1em
+
+ ul
+ :margin 1em
+ :margin-left 2em
+ li
+ :list-style disc outside
+
+ ol
+ :margin 1em
+ :margin-left 2em
+ li
+ :list-style decimal outside
+
+ dl
+ :margin 1em
+ :margin-left 2em
+ dd
+ :margin-left 1em
+
+ th
+ :border 1px solid #000
+ :padding .5em
+ :font-weight bold
+ :text-align center
+
+ td
+ :border 1px solid #000
+ :padding .5em
+
+ caption
+ :margin-bottom .5em
+ :text-align center
+
+ p, fieldset, table
+ :margin-bottom 1em
diff --git a/vendor/gems/gems/compass-0.8.17/frameworks/yui/stylesheets/yui/modules/_fonts.sass b/vendor/gems/gems/compass-0.8.17/frameworks/yui/stylesheets/yui/modules/_fonts.sass
new file mode 100755
index 00000000..d84284ab
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/frameworks/yui/stylesheets/yui/modules/_fonts.sass
@@ -0,0 +1,38 @@
+!yui_default_base_font_size ||= 13px
+!yui_default_base_line_height ||= 1.231
+!yui_default_font_family ||= "arial,helvetica,clean,sans-serif"
+
+// Sets the font size specified in pixels using percents so that the base
+// font size changes and 1em has the correct value. When nesting font size
+// declarations, within the DOM tree, the base_font_size must be the parent's
+// effective font-size in pixels.
+// Usage Examples:
+// .big
+// +font-size(16px)
+// .bigger
+// +font-size(18px)
+// .big .bigger
+// +font-size(18px, 16px)
+//
+// For more information see the table found at http://developer.yahoo.com/yui/fonts/#fontsize
+=font-size(!size, !base_font_size = !yui_default_base_font_size)
+ :font-size= percentage(!size / !base_font_size)
+
+// Sets the base fonts for a page, this should be mixed into the top level of a stylesheet.
+=yui-base-fonts(!family = !yui_default_font_family, !size = !yui_default_base_font_size, !line_height = !yui_default_base_line_height)
+ body
+ :font
+ :size= !size
+ :family= !family
+ :line-height= !line_height
+ :*font-size small
+ :*font x-small
+
+ table
+ :font-size inherit
+ :font 100%
+
+ pre, code, kbd, samp, tt
+ :font-family monospace
+ :*font-size 108%
+ :line-height 100%
diff --git a/vendor/gems/gems/compass-0.8.17/frameworks/yui/stylesheets/yui/modules/_grids.sass b/vendor/gems/gems/compass-0.8.17/frameworks/yui/stylesheets/yui/modules/_grids.sass
new file mode 100755
index 00000000..aa9a9c9d
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/frameworks/yui/stylesheets/yui/modules/_grids.sass
@@ -0,0 +1,341 @@
+// This is a port of YUI Grids version 2.6.0
+// Note: This is not really tested yet. Use at your own risk.
+
+@import compass/utilities/general/float.sass
+@import fonts.sass
+
+=yui-grids
+ +yui-grids-init
+ +yui-grid-templates
+ +yui-grid-divisions
+
+=yui-grid-templates
+ #doc
+ +yui-document(750px)
+ #doc2
+ +yui-document(950px)
+ #doc3
+ +yui-document("fluid")
+ #doc4
+ +yui-document(974px)
+ .yui-t1
+ +yui-two-column-left-template(160px)
+ .yui-t2
+ +yui-two-column-left-template(180px)
+ .yui-t3
+ +yui-two-column-left-template(300px)
+ .yui-t4
+ +yui-two-column-right-template(180px)
+ .yui-t5
+ +yui-two-column-right-template(240px)
+ .yui-t6
+ +yui-two-column-right-template(300px)
+
+=yui-grids-footer
+ clear: both
+
+=yui-grids-body
+ +clearfix
+
+=yui-grids-init(!footer = "#ft", !body = "#bd")
+ body
+ :text-align center
+ @if !footer
+ #{!footer}
+ +yui-grids-footer
+ @if !body
+ #{!body}
+ +yui-grids-body
+
+=em-size(!style, !px_size, !base_font_size = !yui_default_base_font_size)
+ :#{!style}= 1em * !px_size / !base_font_size
+
+=em-size-hacked(!style, !px_size, !base_font_size = !yui_default_base_font_size)
+ +em-size(!style, !px_size, !base_font_size)
+ +em-size("*"+!style, !px_size * 39 / 40, !base_font_size)
+
+// All documents must have these styles. Setting a min-width is optional, but recommended. To omit it, pass false as the min_width value.
+=yui-document-base(!min_width = 750px)
+ :margin auto
+ :text-align left
+ @if !min_width
+ :min-width= !min_width
+
+=yui-block-base
+ :position relative
+ :_position static
+
+=yui-main-block
+ :position static
+ :float none
+ :width auto
+
+
+// Creates a fixed width document container
+// Pass "fluid" for the width to create a document that grows with the width of the browser.
+=yui-document(!width, !min_width = 750px, !base_font_size = !yui_default_base_font_size)
+ +yui-document-base(!min_width)
+ @if !width == "fluid"
+ :margin auto 10px
+ :width auto
+ @else
+ +em-size-hacked("width", !width, !base_font_size)
+
+=yui-two-column-left-template(!column_width, !main_selector = "#yui-main", !block_selector = ".yui-b", !document_width = 750px, !min_width = 750px, !base_font_size = !yui_default_base_font_size)
+ +yui-document(!document_width, !min_width, !base_font_size)
+ #{!main_selector}
+ :width 100%
+ :float right
+ +em-size("margin-left", -!column_width - 10px, !base_font_size)
+ #{!block_selector}
+ +yui-main-block
+ +em-size-hacked("margin-left", !column_width, !base_font_size)
+ #{!block_selector}
+ +yui-block-base
+ :float left
+ +em-size-hacked("width", !column_width, !base_font_size)
+
+=yui-two-column-right-template(!column_width, !main_selector = "#yui-main", !block_selector = ".yui-b", !document_width = 750px, !min_width = 750px, !base_font_size = !yui_default_base_font_size)
+ +yui-document(!document_width, !min_width, !base_font_size)
+ #{!main_selector}
+ :width 100%
+ :float left
+ +em-size("margin-right", -!column_width - 10px, !base_font_size)
+ #{!block_selector}
+ +yui-main-block
+ +em-size-hacked("margin-right", !column_width, !base_font_size)
+ #{!block_selector}
+ +yui-block-base
+ :float right
+ +em-size-hacked("width", !column_width, !base_font_size)
+
+=yui-one-column-template(!main_selector = "#yui-main", !block_selector = ".yui-b", !document_width = 750px, !min_width = 750px, !base_font_size = !yui_default_base_font_size)
+ +yui-document(!document_width, !min_width, !base_font_size)
+ #{!main_selector}
+ :width 100%
+ #{!block_selector}
+ +yui-main-block
+ :display block
+ :margin 0 0 1em 0
+ #{!block_selector}
+ +yui-block-base
+
+=yui-custom-template(!main_selector = "#yui-main", !block_selector = ".yui-b")
+ #{!main_selector}
+ :width 100%
+ #{!block_selector}
+ +yui-main-block
+ #{!block_selector}
+ +yui-block-base
+
+=yui-grid-divisions(!unit = ".yui-u", !g_50_50 = ".yui-g", !g_33_33_33 = ".yui-gb", !g_67_33 = ".yui-gc", !g_33_67 = ".yui-gd", !g_75_25 = ".yui-ge", !g_25_75 = ".yui-gf")
+ #{nest(!g_50_50, !g_33_33_33, !unit)},
+ #{nest(!g_67_33, !unit)},
+ #{nest(!g_67_33, !g_50_50)},
+ #{nest(!g_33_67, !unit)},
+ #{nest(!g_33_33_33, !g_50_50)},
+ #{nest(!g_33_33_33, !g_33_33_33)},
+ #{nest(!g_33_33_33, !g_67_33)},
+ #{nest(!g_33_33_33, !g_33_67)},
+ #{nest(!g_33_33_33, !g_75_25)},
+ #{nest(!g_33_33_33, !g_25_75)},
+ #{nest(!g_33_33_33, !unit)}
+ float: left
+ margin-left: 2%
+ width: 32%
+
+ #{!g_33_33_33}
+ #{!g_33_33_33},
+ #{!g_67_33}
+ #{!unit}
+ *margin-left: 1.8%
+ _margin-left: 4%
+
+ #{nest(!g_50_50, !g_33_33_33, !unit)}
+ _margin-left: .8%
+
+ #{nest(!g_33_33_33, !unit)}
+ float: right
+
+ #{nest(!g_33_33_33, "div.first")}
+ margin-left: 0
+ float: left
+
+ #{!g_50_50},
+ #{!g_33_33_33}
+ #{!g_33_33_33}
+ div.first
+ *margin-right: 0
+ *width: 32%
+ _width: 31.7%
+
+ #{!g_33_33_33}
+ #{!g_67_33},
+ #{!g_33_67}
+ div.first
+ *margin-right: 0
+
+ #{nest(!g_33_33_33, !g_33_67, !unit)}
+ *width: 66%
+ _width: 61.2%
+
+ #{nest(!g_33_33_33, !g_33_67, "div.first")}
+ *width: 31%
+ _width: 29.5%
+
+ #{!g_50_50},
+ #{!g_33_33_33}
+ #{!g_67_33}
+ #{!unit}
+ width: 32%
+ _float: right
+ margin-right: 0
+ _margin-left: 0
+
+ #{nest(!g_33_33_33, !g_67_33, "div.first")}
+ width: 66%
+ *float: left
+ *margin-left: 0
+
+ #{!g_33_33_33}
+ #{!g_75_25},
+ #{!g_25_75}
+ #{!unit}
+ margin: 0
+
+ #{nest(!g_50_50, !unit)},
+ #{nest(!g_50_50, !g_50_50)},
+ #{nest(!g_50_50, !g_33_33_33)},
+ #{nest(!g_50_50, !g_67_33)},
+ #{nest(!g_50_50, !g_33_67)},
+ #{nest(!g_50_50, !g_75_25)},
+ #{nest(!g_50_50, !g_25_75)},
+ #{nest(!g_67_33, !unit)},
+ #{nest(!g_33_67, !g_50_50)},
+ #{nest(!g_50_50, !g_67_33, !unit)},
+ #{nest(!g_75_25, !unit)},
+ #{nest(!g_75_25, !g_50_50)},
+ #{nest(!g_25_75, !g_50_50)},
+ #{nest(!g_25_75, !unit)}
+ float: right
+
+ #{nest(!g_50_50, !g_67_33)},
+ #{nest(!g_50_50, !g_75_25)},
+ #{!g_50_50},
+ #{!g_67_33},
+ #{nest(!g_67_33, "div.first")},
+ #{!g_33_67},
+ #{!g_75_25},
+ #{!g_25_75}
+ div.first
+ float: left
+
+ #{!g_50_50},
+ #{!g_33_33_33},
+ #{!g_67_33},
+ #{!g_33_67},
+ #{!g_75_25},
+ #{!g_25_75}
+ #{!g_50_50}
+ #{!unit}
+ width: 49%
+ *width: 48.1%
+ *margin-left: 0
+
+ #{nest(!g_50_50, !g_50_50, "div.first")}
+ *margin: 0
+
+ #{nest(!g_33_33_33, !g_50_50, "div.first")}
+ *margin-right: 4%
+ _margin-right: 1.3%
+
+ #{nest(!g_33_33_33, !g_33_33_33, !unit)}
+ _margin-left: .7%
+
+ #{nest(!g_33_33_33, !g_50_50)},
+ #{nest(!g_33_33_33, !g_33_33_33)}
+ div.first
+ *margin-left: 0
+
+ #{!g_67_33},
+ #{!g_33_67}
+ #{!g_50_50}
+ #{!unit}
+ *width: 48.1%
+ *margin-left: 0
+
+ #{!g_50_50}
+ #{!unit},
+ #{!g_50_50},
+ #{!g_33_33_33},
+ #{!g_67_33},
+ #{!g_33_67},
+ #{!g_75_25},
+ #{!g_25_75}
+ width: 49.1%
+
+ #{nest(!g_50_50, !g_33_33_33)},
+ #{!g_33_33_33},
+ #{!g_67_33},
+ #{!g_33_67}
+ div.first
+ margin-left: 0
+
+ #{nest(!g_50_50, !g_67_33, "div.first")},
+ #{nest(!g_67_33, "div.first")},
+ #{nest(!g_33_67, !g_50_50)},
+ #{nest(!g_33_67, !unit)}
+ width: 66%
+
+ #{!g_33_67},
+ #{nest(!g_33_33_33, !g_33_67)}
+ div.first
+ width: 32%
+
+ #{nest(!g_50_50, !g_33_67, "div.first")}
+ _width: 29.9%
+
+ #{nest(!g_75_25, !unit)},
+ #{nest(!g_75_25, !g_50_50)},
+ #{nest(!g_25_75, "div.first")}
+ width: 24%
+
+ #{!g_33_33_33}
+ #{!g_75_25},
+ #{!g_25_75}
+ div#{!unit}
+ float: right
+
+ #{!g_33_33_33}
+ #{!g_75_25},
+ #{!g_25_75}
+ div.first
+ float: left
+
+ #{nest(!g_75_25, "div.first")},
+ #{nest(!g_25_75, !g_50_50)},
+ #{nest(!g_25_75, !unit)}
+ width: 74.2%
+
+ #{!g_33_33_33}
+ #{nest(!g_75_25, !unit)},
+ #{nest(!g_25_75, "div.first")}
+ *width: 24%
+ _width: 20%
+
+ #{!g_33_33_33}
+ #{nest(!g_75_25, "div.first")},
+ #{nest(!g_25_75, !unit)}
+ *width: 73.5%
+ _width: 65.5%
+
+ #{!g_50_50},
+ #{!g_33_33_33},
+ #{!g_67_33},
+ #{!g_33_67},
+ #{!g_75_25},
+ #{!g_25_75}
+ +clearfix
+
+ #{nest(!g_33_33_33, !unit)}
+ float: left
diff --git a/vendor/gems/gems/compass-0.8.17/frameworks/yui/stylesheets/yui/modules/_reset.sass b/vendor/gems/gems/compass-0.8.17/frameworks/yui/stylesheets/yui/modules/_reset.sass
new file mode 100755
index 00000000..bf706e81
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/frameworks/yui/stylesheets/yui/modules/_reset.sass
@@ -0,0 +1,61 @@
+/*
+ Copyright (c) 2008, Yahoo! Inc. All rights reserved.
+ Code licensed under the BSD License:
+ http://developer.yahoo.net/yui/license.txt
+ version: 3.0.0pr2
+
+=reset
+ html
+ :color #000
+ :background #FFF
+
+ body, div, dl, dt, dd, ul, ol, li,
+ h1, h2, h3, h4, h5, h6, pre, code,
+ form, fieldset, legend,input,
+ textarea, p, blockquote, th, td
+ :margin 0
+ :padding 0
+
+ li
+ :list-style none
+
+ h1, h2, h3, h4, h5, h6
+ :font-size 100%
+ :font-weight normal
+
+ code, th, address, caption,
+ cite, dfn, em, strong, var
+ :font-style normal
+ :font-weight normal
+
+ fieldset, img, abbr, acronym
+ :border 0
+
+ legend
+ :color #000
+
+ input, textarea, select
+ :font-family inherit
+ :font-size inherit
+ :font-weight inherit
+ :*font-size 100%
+
+ th, caption
+ :text-align left
+
+ table
+ :border-collapse collapse
+ :border-spacing 0
+
+ q
+ &:before, &:after
+ :content ''
+
+ abbr, acronym
+ :font-variant normal
+
+ sup
+ :vertical-align text-top
+
+ sub
+ :vertical-align text-bottom
diff --git a/vendor/gems/gems/compass-0.8.17/frameworks/yui/templates/project/manifest.rb b/vendor/gems/gems/compass-0.8.17/frameworks/yui/templates/project/manifest.rb
new file mode 100755
index 00000000..c7af4356
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/frameworks/yui/templates/project/manifest.rb
@@ -0,0 +1 @@
+stylesheet 'screen.sass', :media => "screen, projection"
diff --git a/vendor/gems/gems/compass-0.8.17/frameworks/yui/templates/project/screen.sass b/vendor/gems/gems/compass-0.8.17/frameworks/yui/templates/project/screen.sass
new file mode 100755
index 00000000..40dab7fa
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/frameworks/yui/templates/project/screen.sass
@@ -0,0 +1,4 @@
+@import yui.sass
+@import compass/reset.sass
+
++yui
diff --git a/vendor/gems/gems/compass-0.8.17/lib/compass.rb b/vendor/gems/gems/compass-0.8.17/lib/compass.rb
new file mode 100755
index 00000000..d09dd6df
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/lib/compass.rb
@@ -0,0 +1,23 @@
+module Compass
+end
+
+['dependencies', 'sass_extensions', 'core_ext', 'version', 'errors'].each do |file|
+ require File.join(File.dirname(__FILE__), 'compass', file)
+end
+
+module Compass
+ extend Compass::Version
+ def base_directory
+ File.expand_path(File.join(File.dirname(__FILE__), '..'))
+ end
+ def lib_directory
+ File.expand_path(File.join(File.dirname(__FILE__)))
+ end
+ module_function :base_directory, :lib_directory
+end
+
+require File.join(File.dirname(__FILE__), 'compass', 'configuration')
+require File.join(File.dirname(__FILE__), 'compass', 'frameworks')
+require File.join(File.dirname(__FILE__), 'compass', 'app_integration')
+
+
diff --git a/vendor/gems/gems/compass-0.8.17/lib/compass/actions.rb b/vendor/gems/gems/compass-0.8.17/lib/compass/actions.rb
new file mode 100755
index 00000000..3959f7a2
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/lib/compass/actions.rb
@@ -0,0 +1,110 @@
+module Compass
+ module Actions
+
+ attr_writer :logger
+
+ def logger
+ @logger ||= Logger.new
+ end
+
+ # copy/process a template in the compass template directory to the project directory.
+ def copy(from, to, options = nil, binary = false)
+ options ||= self.options if self.respond_to?(:options)
+ contents = File.new(from).read
+ write_file to, contents, options, binary
+ end
+
+ # create a directory and all the directories necessary to reach it.
+ def directory(dir, options = nil)
+ options ||= self.options if self.respond_to?(:options)
+ if File.exists?(dir) && File.directory?(dir)
+ logger.record :exists, basename(dir) unless options[:quiet]
+ elsif File.exists?(dir)
+ msg = "#{basename(dir)} already exists and is not a directory."
+ raise Compass::FilesystemConflict.new(msg)
+ else
+ logger.record :directory, separate("#{basename(dir)}/")
+ FileUtils.mkdir_p(dir) unless options[:dry_run]
+ end
+ end
+
+ # Write a file given the file contents as a string
+ def write_file(file_name, contents, options = nil, binary = false)
+ options ||= self.options if self.respond_to?(:options)
+ skip_write = options[:dry_run]
+ if File.exists?(file_name)
+ existing_contents = IO.read(file_name)
+ if existing_contents == contents
+ logger.record :identical, basename(file_name)
+ skip_write = true
+ elsif options[:force]
+ logger.record :overwrite, basename(file_name)
+ else
+ msg = "File #{basename(file_name)} already exists. Run with --force to force overwrite."
+ raise Compass::FilesystemConflict.new(msg)
+ end
+ else
+ logger.record :create, basename(file_name)
+ end
+ if skip_write
+ FileUtils.touch file_name
+ else
+ mode = "w"
+ mode << "b" if binary
+ open(file_name, mode) do |file|
+ file.write(contents)
+ end
+ end
+ end
+
+ # Compile one Sass file
+ def compile(sass_filename, css_filename, options)
+ if options[:force] || Sass::Plugin.exact_stylesheet_needs_update?(css_filename, sass_filename)
+ logger.record :compile, basename(sass_filename) unless options[:quiet]
+ engine = ::Sass::Engine.new(open(sass_filename).read,
+ :filename => sass_filename,
+ :line_comments => options[:line_comments],
+ :style => options[:style],
+ :css_filename => css_filename,
+ :load_paths => options[:load_paths],
+ :cache_location => options[:cache_location])
+ css_content = engine.render
+ write_file(css_filename, css_content, options.merge(:force => true))
+ else
+ logger.record :unchanged, basename(sass_filename) unless options[:quiet]
+ end
+ end
+
+ def remove(file_name)
+ if File.exists?(file_name)
+ File.unlink file_name
+ logger.record :remove, basename(file_name)
+ end
+ end
+
+ def basename(file)
+ relativize(file) {|f| File.basename(file)}
+ end
+
+ def relativize(path)
+ if path.index(working_path+File::SEPARATOR) == 0
+ path[(working_path+File::SEPARATOR).length..-1]
+ elsif block_given?
+ yield path
+ else
+ path
+ end
+ end
+
+ # Write paths like we're on unix and then fix it
+ def separate(path)
+ path.gsub(%r{/}, File::SEPARATOR)
+ end
+
+ # Removes the trailing separator, if any, from a path.
+ def strip_trailing_separator(path)
+ (path[-1..-1] == File::SEPARATOR) ? path[0..-2] : path
+ end
+
+ end
+end
diff --git a/vendor/gems/gems/compass-0.8.17/lib/compass/app_integration.rb b/vendor/gems/gems/compass-0.8.17/lib/compass/app_integration.rb
new file mode 100755
index 00000000..58e55913
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/lib/compass/app_integration.rb
@@ -0,0 +1,5 @@
+# If we're running inside Rails
+require File.join(File.dirname(__FILE__), 'app_integration', 'rails') if defined?(ActionController::Base)
+
+# If we're running inside Merb
+require File.join(File.dirname(__FILE__), 'app_integration', 'merb') if defined?(Merb::Plugins)
diff --git a/vendor/gems/gems/compass-0.8.17/lib/compass/app_integration/merb.rb b/vendor/gems/gems/compass-0.8.17/lib/compass/app_integration/merb.rb
new file mode 100755
index 00000000..b8ff84b0
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/lib/compass/app_integration/merb.rb
@@ -0,0 +1,43 @@
+# To configure Merb to use compass do the following:
+# Merb::BootLoader.after_app_loads do
+# require 'merb-haml'
+# require 'compass'
+# end
+#
+# To use a different sass stylesheets locations as is recommended by compass
+# add this configuration to your configuration block:
+#
+# Merb::Config.use do |c|
+# c[:compass] = {
+# :stylesheets => 'app/stylesheets',
+# :compiled_stylesheets => 'public/stylesheets/compiled'
+# }
+# end
+
+Merb::BootLoader.after_app_loads do
+ #set up sass if haml load didn't do it -- this happens when using a non-default stylesheet location.
+ unless defined?(Sass::Plugin)
+ require "sass/plugin"
+ Sass::Plugin.options = Merb::Config[:sass] if Merb::Config[:sass]
+ end
+
+ # default the compass configuration if they didn't set it up yet.
+ Merb::Config[:compass] ||= {}
+
+ # default sass stylesheet location unless configured to something else
+ Merb::Config[:compass][:stylesheets] ||= Merb.dir_for(:stylesheet) / "sass"
+
+ # default sass css location unless configured to something else
+ Merb::Config[:compass][:compiled_stylesheets] ||= Merb.dir_for(:stylesheet)
+
+ #define the template hash for the project stylesheets as well as the framework stylesheets.
+ template_location = {
+ Merb::Config[:compass][:stylesheets] => Merb::Config[:compass][:compiled_stylesheets]
+ }
+ Compass::Frameworks::ALL.each do |framework|
+ template_location[framework.stylesheets_directory] = Merb::Config[:compass][:compiled_stylesheets]
+ end
+
+ #configure Sass to know about all these sass locations.
+ Sass::Plugin.options[:template_location] = template_location
+end
diff --git a/vendor/gems/gems/compass-0.8.17/lib/compass/app_integration/rails.rb b/vendor/gems/gems/compass-0.8.17/lib/compass/app_integration/rails.rb
new file mode 100755
index 00000000..904be241
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/lib/compass/app_integration/rails.rb
@@ -0,0 +1,12 @@
+unless defined?(Compass::RAILS_LOADED)
+ Compass::RAILS_LOADED = true
+ require File.join(File.dirname(__FILE__), 'rails', 'action_controller')
+ require File.join(File.dirname(__FILE__), 'rails', 'sass_plugin')
+ require File.join(File.dirname(__FILE__), 'rails', 'urls')
+ # Wierd that this has to be re-included to pick up sub-modules. Ruby bug?
+ class Sass::Script::Functions::EvaluationContext
+ include Sass::Script::Functions
+ private
+ include ActionView::Helpers::AssetTagHelper
+ end
+end
diff --git a/vendor/gems/gems/compass-0.8.17/lib/compass/app_integration/rails/action_controller.rb b/vendor/gems/gems/compass-0.8.17/lib/compass/app_integration/rails/action_controller.rb
new file mode 100755
index 00000000..d3a4b9e9
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/lib/compass/app_integration/rails/action_controller.rb
@@ -0,0 +1,15 @@
+# :stopdoc:
+module ActionController
+ class Base
+ def process_with_compass(*args)
+ Sass::Plugin.rails_controller = self
+ begin
+ process_without_compass(*args)
+ ensure
+ Sass::Plugin.rails_controller = nil
+ end
+ end
+ alias_method_chain :process, :compass
+ end
+end
+# :startdoc:
\ No newline at end of file
diff --git a/vendor/gems/gems/compass-0.8.17/lib/compass/app_integration/rails/sass_plugin.rb b/vendor/gems/gems/compass-0.8.17/lib/compass/app_integration/rails/sass_plugin.rb
new file mode 100755
index 00000000..8e0cba78
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/lib/compass/app_integration/rails/sass_plugin.rb
@@ -0,0 +1,5 @@
+module Sass::Plugin
+ class << self
+ attr_accessor :rails_controller
+ end
+end
\ No newline at end of file
diff --git a/vendor/gems/gems/compass-0.8.17/lib/compass/app_integration/rails/templates/compass-install-rails.rb b/vendor/gems/gems/compass-0.8.17/lib/compass/app_integration/rails/templates/compass-install-rails.rb
new file mode 100755
index 00000000..ca9a0b49
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/lib/compass/app_integration/rails/templates/compass-install-rails.rb
@@ -0,0 +1,80 @@
+# =================================================================
+# Compass Ruby on Rails Installer (template) v.1.0
+# written by Derek Perez (derek@derekperez.com)
+# -----------------------------------------------------------------
+# NOTE: This installer is designed to work as a Rails template,
+# and can only be used with Rails 2.3+.
+# -----------------------------------------------------------------
+# Copyright (c) 2009 Derek Perez
+#
+# Permission is hereby granted, free of charge, to any person
+# obtaining a copy of this software and associated documentation
+# files (the "Software"), to deal in the Software without
+# restriction, including without limitation the rights to use,
+# copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following
+# conditions:
+#
+# The above copyright notice and this permission notice shall be
+# included in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+# OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+# OTHER DEALINGS IN THE SOFTWARE.
+# =================================================================
+puts "==================================================="
+puts "Welcome to the Compass Installer for Ruby on Rails!"
+puts "==================================================="
+puts
+
+# css framework prompt
+css_framework = ask("What CSS Framework do you want to use with Compass? (default: 'blueprint')")
+css_framework = "blueprint" if css_framework.blank?
+
+# sass storage prompt
+sass_dir = ask("Where would you like to keep your sass files within your project? (default: 'app/stylesheets')")
+sass_dir = "app/stylesheets" if sass_dir.blank?
+
+# compiled css storage prompt
+css_dir = ask("Where would you like Compass to store your compiled css files? (default: 'public/stylesheets/compiled')")
+css_dir = "public/stylesheets/compiled" if css_dir.blank?
+
+# define dependencies
+gem "haml", :lib => "haml", :version => ">=2.2.0"
+gem "chriseppstein-compass", :source => "http://gems.github.com/", :lib => "compass"
+
+# install and unpack
+rake "gems:install GEM=haml", :sudo => true
+rake "gems:install GEM=chriseppstein-compass", :sudo => true
+rake "gems:unpack GEM=chriseppstein-compass"
+
+# load any compass framework plugins
+if css_framework =~ /960/
+ gem "chriseppstein-compass-960-plugin", :source => "http://gems.github.com", :lib => "ninesixty"
+ rake "gems:install GEM=chriseppstein-compass-960-plugin", :sudo => true
+ rake "gems:unpack GEM=chriseppstein-compass-960-plugin"
+ css_framework = "960" # rename for command
+ plugin_require = "-r ninesixty"
+end
+
+# build out compass command
+compass_command = "compass --rails -f #{css_framework} . --css-dir=#{css_dir} --sass-dir=#{sass_dir} "
+compass_command << plugin_require if plugin_require
+
+# Require compass during plugin loading
+file 'vendor/plugins/compass/init.rb', <<-CODE
+# This is here to make sure that the right version of sass gets loaded (haml 2.2) by the compass requires.
+require 'compass'
+CODE
+
+# integrate it!
+run "haml --rails ."
+run compass_command
+
+puts "Compass (with #{css_framework}) is all setup, have fun!"
\ No newline at end of file
diff --git a/vendor/gems/gems/compass-0.8.17/lib/compass/app_integration/rails/urls.rb b/vendor/gems/gems/compass-0.8.17/lib/compass/app_integration/rails/urls.rb
new file mode 100755
index 00000000..f7eb3432
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/lib/compass/app_integration/rails/urls.rb
@@ -0,0 +1,14 @@
+module Compass::SassExtensions::Functions::Urls
+ def image_url_with_rails_integration(path)
+ if (@controller = Sass::Plugin.rails_controller) && @controller.respond_to?(:request) && @controller.request
+ begin
+ Sass::Script::String.new "url(#{image_path(path.value)})"
+ ensure
+ @controller = nil
+ end
+ else
+ image_url_without_rails_integration(path)
+ end
+ end
+ alias_method_chain :image_url, :rails_integration
+end
\ No newline at end of file
diff --git a/vendor/gems/gems/compass-0.8.17/lib/compass/commands/base.rb b/vendor/gems/gems/compass-0.8.17/lib/compass/commands/base.rb
new file mode 100755
index 00000000..94c17d57
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/lib/compass/commands/base.rb
@@ -0,0 +1,33 @@
+module Compass
+ module Commands
+ class Base
+
+ include Actions
+
+ attr_accessor :working_path, :options
+
+ def initialize(working_path, options)
+ self.working_path = working_path
+ self.options = options
+ end
+
+ def execute
+ perform
+ end
+
+ def perform
+ raise StandardError.new("Not Implemented")
+ end
+
+ protected
+
+ def framework
+ unless Compass::Frameworks[options[:framework]]
+ raise Compass::Error.new("No such framework: #{options[:framework].inspect}")
+ end
+ Compass::Frameworks[options[:framework]]
+ end
+
+ end
+ end
+end
\ No newline at end of file
diff --git a/vendor/gems/gems/compass-0.8.17/lib/compass/commands/create_project.rb b/vendor/gems/gems/compass-0.8.17/lib/compass/commands/create_project.rb
new file mode 100755
index 00000000..3605af1e
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/lib/compass/commands/create_project.rb
@@ -0,0 +1,19 @@
+require 'fileutils'
+require File.join(File.dirname(__FILE__), 'stamp_pattern')
+require File.join(File.dirname(__FILE__), 'update_project')
+
+module Compass
+ module Commands
+ class CreateProject < StampPattern
+
+ def initialize(working_path, options)
+ super(working_path, options.merge(:pattern => "project", :pattern_name => nil))
+ end
+
+ def is_project_creation?
+ true
+ end
+
+ end
+ end
+end
\ No newline at end of file
diff --git a/vendor/gems/gems/compass-0.8.17/lib/compass/commands/generate_grid_background.rb b/vendor/gems/gems/compass-0.8.17/lib/compass/commands/generate_grid_background.rb
new file mode 100755
index 00000000..d294d030
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/lib/compass/commands/generate_grid_background.rb
@@ -0,0 +1,24 @@
+require File.join(File.dirname(__FILE__), 'project_base')
+require File.join(File.dirname(__FILE__), 'update_project')
+require File.join(File.dirname(__FILE__), '..', 'grid_builder')
+
+module Compass
+ module Commands
+ class GenerateGridBackground < ProjectBase
+ include Actions
+ def initialize(working_path, options)
+ super
+ assert_project_directory_exists!
+ end
+
+ def perform
+ column_width, gutter_width = options[:grid_dimensions].split(/\+/).map{|d| d.to_i}
+ unless GridBuilder.new(options.merge(:column_width => column_width, :gutter_width => gutter_width, :output_path => projectize(project_images_subdirectory), :working_path => self.working_path)).generate!
+ puts "ERROR: Some library dependencies appear to be missing."
+ puts "Have you installed rmagick? If not, please run:"
+ puts "sudo gem install rmagick"
+ end
+ end
+ end
+ end
+end
\ No newline at end of file
diff --git a/vendor/gems/gems/compass-0.8.17/lib/compass/commands/installer_command.rb b/vendor/gems/gems/compass-0.8.17/lib/compass/commands/installer_command.rb
new file mode 100755
index 00000000..b59d451b
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/lib/compass/commands/installer_command.rb
@@ -0,0 +1,31 @@
+require File.join(Compass.lib_directory, 'compass', 'installers')
+
+module Compass
+ module Commands
+ module InstallerCommand
+ include Compass::Installers
+
+ def configure!
+ read_project_configuration
+ Compass.configuration.set_maybe(options)
+ Compass.configuration.default_all(installer.configuration_defaults)
+ Compass.configuration.set_defaults!
+ end
+
+ def installer
+ @installer ||= case options[:project_type]
+ when :stand_alone
+ StandAloneInstaller.new *installer_args
+ when :rails
+ RailsInstaller.new *installer_args
+ else
+ raise "Unknown project type: #{options[:project_type].inspect}"
+ end
+ end
+
+ def installer_args
+ [template_directory(options[:pattern]), project_directory, options]
+ end
+ end
+ end
+end
\ No newline at end of file
diff --git a/vendor/gems/gems/compass-0.8.17/lib/compass/commands/list_frameworks.rb b/vendor/gems/gems/compass-0.8.17/lib/compass/commands/list_frameworks.rb
new file mode 100755
index 00000000..27801945
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/lib/compass/commands/list_frameworks.rb
@@ -0,0 +1,16 @@
+module Compass
+ module Commands
+ class ListFrameworks
+ attr_accessor :options
+ def initialize(working_path, options)
+ self.options = options
+ end
+
+ def execute
+ Compass::Frameworks::ALL.each do |framework|
+ puts framework.name
+ end
+ end
+ end
+ end
+end
\ No newline at end of file
diff --git a/vendor/gems/gems/compass-0.8.17/lib/compass/commands/print_version.rb b/vendor/gems/gems/compass-0.8.17/lib/compass/commands/print_version.rb
new file mode 100755
index 00000000..1217f2c3
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/lib/compass/commands/print_version.rb
@@ -0,0 +1,23 @@
+module Compass
+ module Commands
+ class PrintVersion
+ attr_accessor :options
+ def initialize(working_path, options)
+ self.options = options
+ end
+
+ def execute
+ if options[:quiet]
+ # The quiet option may make scripting easier
+ puts ::Compass.version[:string]
+ else
+ lines = []
+ lines << "Compass #{::Compass.version[:string]}"
+ lines << "Copyright (c) 2008-2009 Chris Eppstein"
+ lines << "Released under the MIT License."
+ puts lines.join("\n")
+ end
+ end
+ end
+ end
+end
\ No newline at end of file
diff --git a/vendor/gems/gems/compass-0.8.17/lib/compass/commands/project_base.rb b/vendor/gems/gems/compass-0.8.17/lib/compass/commands/project_base.rb
new file mode 100755
index 00000000..dc082eeb
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/lib/compass/commands/project_base.rb
@@ -0,0 +1,112 @@
+require 'fileutils'
+require 'pathname'
+require File.join(File.dirname(__FILE__), 'base')
+require File.join(File.dirname(__FILE__), 'installer_command')
+
+module Compass
+ module Commands
+ class ProjectBase < Base
+ attr_accessor :project_directory, :project_name, :options
+
+ def initialize(working_path, options = {})
+ super(working_path, options)
+ self.project_name = determine_project_name(working_path, options)
+ Compass.configuration.project_path = determine_project_directory(working_path, options)
+ end
+
+ def execute
+ configure!
+ super
+ end
+
+ protected
+
+ def configure!
+ read_project_configuration
+ Compass.configuration.set_maybe(options)
+ Compass.configuration.set_defaults!
+ end
+
+ def projectize(path)
+ File.join(project_directory, separate(path))
+ end
+
+ def project_directory
+ Compass.configuration.project_path
+ end
+
+ def project_css_subdirectory
+ Compass.configuration.css_dir
+ end
+
+ def project_src_subdirectory
+ Compass.configuration.sass_dir
+ end
+
+ def project_images_subdirectory
+ Compass.configuration.images_dir
+ end
+
+ # Read the configuration file for this project
+ def read_project_configuration
+ if file = detect_configuration_file
+ Compass.configuration.parse(file) if File.readable?(file)
+ end
+ end
+
+ def explicit_config_file_must_be_readable?
+ true
+ end
+
+ # TODO: Deprecate the src/config.rb location.
+ KNOWN_CONFIG_LOCATIONS = [".compass/config.rb", "config/compass.config", "config.rb", "src/config.rb"]
+
+ # Finds the configuration file, if it exists in a known location.
+ def detect_configuration_file
+ if options[:configuration_file]
+ if explicit_config_file_must_be_readable? && !File.readable?(options[:configuration_file])
+ raise Compass::Error, "Configuration file, #{file}, not found or not readable."
+ end
+ return options[:configuration_file]
+ end
+ KNOWN_CONFIG_LOCATIONS.map{|f| projectize(f)}.detect{|f| File.exists?(f)}
+ end
+
+ def assert_project_directory_exists!
+ if File.exists?(project_directory) && !File.directory?(project_directory)
+ raise Compass::FilesystemConflict.new("#{project_directory} is not a directory.")
+ elsif !File.directory?(project_directory)
+ raise Compass::Error.new("#{project_directory} does not exist.")
+ end
+ end
+
+ private
+
+ def determine_project_name(working_path, options)
+ if options[:project_name]
+ File.basename(strip_trailing_separator(options[:project_name]))
+ else
+ File.basename(working_path)
+ end
+ end
+
+ def determine_project_directory(working_path, options)
+ if options[:project_name]
+ if absolute_path?(options[:project_name])
+ options[:project_name]
+ else
+ File.join(working_path, options[:project_name])
+ end
+ else
+ working_path
+ end
+ end
+
+ def absolute_path?(path)
+ # This is only going to work on unix, gonna need a better implementation.
+ path.index(File::SEPARATOR) == 0
+ end
+
+ end
+ end
+end
\ No newline at end of file
diff --git a/vendor/gems/gems/compass-0.8.17/lib/compass/commands/stamp_pattern.rb b/vendor/gems/gems/compass-0.8.17/lib/compass/commands/stamp_pattern.rb
new file mode 100755
index 00000000..47f02b84
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/lib/compass/commands/stamp_pattern.rb
@@ -0,0 +1,33 @@
+require 'fileutils'
+require File.join(File.dirname(__FILE__), 'base')
+require File.join(File.dirname(__FILE__), 'update_project')
+
+module Compass
+ module Commands
+ class StampPattern < ProjectBase
+
+ include InstallerCommand
+
+ def initialize(working_path, options)
+ super(working_path, options)
+ end
+
+ # all commands must implement perform
+ def perform
+ installer.init
+ installer.run(:skip_finalization => true)
+ UpdateProject.new(working_path, options).perform if installer.compilation_required?
+ installer.finalize(:create => is_project_creation?)
+ end
+
+ def is_project_creation?
+ false
+ end
+
+ def template_directory(pattern)
+ File.join(framework.templates_directory, pattern)
+ end
+
+ end
+ end
+end
\ No newline at end of file
diff --git a/vendor/gems/gems/compass-0.8.17/lib/compass/commands/update_project.rb b/vendor/gems/gems/compass-0.8.17/lib/compass/commands/update_project.rb
new file mode 100755
index 00000000..e00e7a8f
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/lib/compass/commands/update_project.rb
@@ -0,0 +1,34 @@
+require File.join(File.dirname(__FILE__), 'project_base')
+require File.join(Compass.lib_directory, 'compass', 'compiler')
+
+module Compass
+ module Commands
+ class UpdateProject < ProjectBase
+
+ def initialize(working_path, options)
+ super
+ assert_project_directory_exists!
+ end
+
+ def perform
+ compiler = new_compiler_instance
+ if compiler.sass_files.empty?
+ message = "Nothing to compile. If you're trying to start a new project, you have left off the directory argument.\n"
+ message << "Run \"compass -h\" to get help."
+ raise Compass::Error, message
+ else
+ compiler.run
+ end
+ end
+
+ def new_compiler_instance(additional_options = {})
+ Compass::Compiler.new(working_path,
+ projectize(Compass.configuration.sass_dir),
+ projectize(Compass.configuration.css_dir),
+ Compass.sass_engine_options.merge(:quiet => options[:quiet],
+ :force => options[:force]).merge(additional_options))
+ end
+
+ end
+ end
+end
\ No newline at end of file
diff --git a/vendor/gems/gems/compass-0.8.17/lib/compass/commands/validate_project.rb b/vendor/gems/gems/compass-0.8.17/lib/compass/commands/validate_project.rb
new file mode 100755
index 00000000..13c06da9
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/lib/compass/commands/validate_project.rb
@@ -0,0 +1,21 @@
+require File.join(File.dirname(__FILE__), 'project_base')
+require File.join(File.dirname(__FILE__), 'update_project')
+
+module Compass
+ module Commands
+ class ValidateProject < ProjectBase
+
+ def initialize(working_path, options)
+ super
+ assert_project_directory_exists!
+ end
+
+ def perform
+ require File.join(File.dirname(__FILE__), '..', 'validator')
+ UpdateProject.new(working_path, options).perform
+ Validator.new(project_css_subdirectory).validate()
+ end
+
+ end
+ end
+end
\ No newline at end of file
diff --git a/vendor/gems/gems/compass-0.8.17/lib/compass/commands/watch_project.rb b/vendor/gems/gems/compass-0.8.17/lib/compass/commands/watch_project.rb
new file mode 100755
index 00000000..ee0528d8
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/lib/compass/commands/watch_project.rb
@@ -0,0 +1,64 @@
+require 'fileutils'
+require 'pathname'
+require File.join(File.dirname(__FILE__), 'base')
+require File.join(File.dirname(__FILE__), 'update_project')
+
+module Compass
+ module Commands
+ class WatchProject < UpdateProject
+
+ attr_accessor :last_update_time, :last_sass_files
+
+ def perform
+ Signal.trap("INT") do
+ puts ""
+ exit 0
+ end
+
+ recompile
+
+ puts ">>> Compass is watching for changes. Press Ctrl-C to Stop."
+
+ require File.join(Compass.lib_directory, 'vendor', 'fssm')
+
+ FSSM.monitor do |monitor|
+ Compass.configuration.sass_load_paths.each do |load_path|
+ monitor.path load_path do |path|
+ path.glob '**/*.sass'
+
+ path.update &method(:recompile)
+ path.delete {|base, relative| remove_obsolete_css(base,relative); recompile(base, relative)}
+ path.create &method(:recompile)
+ end
+ end
+
+ end
+
+ end
+
+ def remove_obsolete_css(base = nil, relative = nil)
+ compiler = new_compiler_instance(:quiet => true)
+ sass_files = compiler.sass_files
+ deleted_sass_files = (last_sass_files || []) - sass_files
+ deleted_sass_files.each do |deleted_sass_file|
+ css_file = compiler.corresponding_css_file(deleted_sass_file)
+ remove(css_file) if File.exists?(css_file)
+ end
+ self.last_sass_files = sass_files
+ end
+
+ def recompile(base = nil, relative = nil)
+ compiler = new_compiler_instance(:quiet => true)
+ if file = compiler.out_of_date?
+ begin
+ puts ">>> Change detected to: #{file}"
+ compiler.run
+ rescue StandardError => e
+ ::Compass::Exec.report_error(e, options)
+ end
+ end
+ end
+
+ end
+ end
+end
\ No newline at end of file
diff --git a/vendor/gems/gems/compass-0.8.17/lib/compass/commands/write_configuration.rb b/vendor/gems/gems/compass-0.8.17/lib/compass/commands/write_configuration.rb
new file mode 100755
index 00000000..1c8c28fc
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/lib/compass/commands/write_configuration.rb
@@ -0,0 +1,28 @@
+require File.join(File.dirname(__FILE__), 'project_base')
+
+module Compass
+ module Commands
+ class WriteConfiguration < ProjectBase
+
+ include InstallerCommand
+
+ def initialize(working_path, options)
+ super
+ assert_project_directory_exists!
+ end
+
+ def perform
+ installer.write_configuration_files(options[:configuration_file])
+ end
+
+ def installer_args
+ [nil, project_directory, options]
+ end
+
+ def explicit_config_file_must_be_readable?
+ false
+ end
+
+ end
+ end
+end
\ No newline at end of file
diff --git a/vendor/gems/gems/compass-0.8.17/lib/compass/compiler.rb b/vendor/gems/gems/compass-0.8.17/lib/compass/compiler.rb
new file mode 100755
index 00000000..c48b2b63
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/lib/compass/compiler.rb
@@ -0,0 +1,54 @@
+module Compass
+ class Compiler
+
+ include Actions
+
+ attr_accessor :working_path, :from, :to, :options
+
+ def initialize(working_path, from, to, options)
+ self.working_path = working_path
+ self.from, self.to = from, to
+ self.logger = options.delete(:logger)
+ self.options = options
+ self.options[:cache_location] ||= File.join(from, ".sass-cache")
+ end
+
+ def sass_files
+ @sass_files || Dir.glob(separate("#{from}/**/[^_]*.sass"))
+ end
+
+ def stylesheet_name(sass_file)
+ sass_file[("#{from}/".length)..-6]
+ end
+
+ def css_files
+ @css_files ||= sass_files.map{|sass_file| corresponding_css_file(sass_file)}
+ end
+
+ def corresponding_css_file(sass_file)
+ "#{to}/#{stylesheet_name(sass_file)}.css"
+ end
+
+ def target_directories
+ css_files.map{|css_file| File.dirname(css_file)}.uniq.sort.sort_by{|d| d.length }
+ end
+
+ def out_of_date?
+ Compass.configure_sass_plugin! unless Compass.sass_plugin_configured?
+ sass_files.zip(css_files).each do |sass_filename, css_filename|
+ return sass_filename if Sass::Plugin.exact_stylesheet_needs_update?(css_filename, sass_filename)
+ end
+ false
+ end
+
+ def run
+ Compass.configure_sass_plugin! unless Compass.sass_plugin_configured?
+ target_directories.each do |dir|
+ directory dir
+ end
+ sass_files.zip(css_files).each do |sass_filename, css_filename|
+ compile sass_filename, css_filename, options
+ end
+ end
+ end
+end
\ No newline at end of file
diff --git a/vendor/gems/gems/compass-0.8.17/lib/compass/configuration.rb b/vendor/gems/gems/compass-0.8.17/lib/compass/configuration.rb
new file mode 100755
index 00000000..9a39a7de
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/lib/compass/configuration.rb
@@ -0,0 +1,324 @@
+require 'singleton'
+
+module Compass
+ class Configuration
+ include Singleton
+
+ ATTRIBUTES = [
+ :project_type,
+ :project_path,
+ :http_path,
+ :css_dir,
+ :sass_dir,
+ :images_dir,
+ :javascripts_dir,
+ :output_style,
+ :environment,
+ :relative_assets,
+ :http_images_path,
+ :http_stylesheets_path,
+ :http_javascripts_path,
+ :additional_import_paths,
+ :sass_options
+ ]
+
+ attr_accessor *ATTRIBUTES
+
+ attr_accessor :required_libraries
+
+ def initialize
+ self.required_libraries = []
+ end
+
+ # parses a manifest file which is a ruby script
+ # evaluated in a Manifest instance context
+ def parse(config_file)
+ open(config_file) do |f|
+ parse_string(f.read, config_file)
+ end
+ end
+
+ def parse_string(contents, filename)
+ bind = binding
+ eval(contents, bind, filename)
+ ATTRIBUTES.each do |prop|
+ value = eval(prop.to_s, bind) rescue nil
+ self.send("#{prop}=", value) if value
+ end
+ if @added_import_paths
+ self.additional_import_paths ||= []
+ self.additional_import_paths += @added_import_paths
+ end
+ issue_deprecation_warnings
+ end
+
+ def set_all(options)
+ ATTRIBUTES.each do |a|
+ self.send("#{a}=", options[a]) if options.has_key?(a)
+ end
+ end
+
+ def set_maybe(options)
+ ATTRIBUTES.each do |a|
+ self.send("#{a}=", options[a]) if options[a]
+ end
+ end
+
+ def default_all(options)
+ ATTRIBUTES.each do |a|
+ set_default_unless_set(a, options[a])
+ end
+ end
+
+ def set_default_unless_set(attribute, value)
+ self.send("#{attribute}=", value) unless self.send(attribute)
+ end
+
+ def set_defaults!
+ ATTRIBUTES.each do |a|
+ set_default_unless_set(a, default_for(a))
+ end
+ end
+
+ def default_for(attribute)
+ method = "default_#{attribute}".to_sym
+ self.send(method) if respond_to?(method)
+ end
+
+ def default_sass_dir
+ "src"
+ end
+
+ def default_css_dir
+ "stylesheets"
+ end
+
+ def default_images_dir
+ "images"
+ end
+
+ def default_http_path
+ "/"
+ end
+
+ def comment_for_http_path
+ "# Set this to the root of your project when deployed:\n"
+ end
+
+ def relative_assets?
+ # the http_images_path is deprecated, but here for backwards compatibility.
+ relative_assets || http_images_path == :relative
+ end
+
+ def comment_for_relative_assets
+ unless relative_assets
+ %q{# To enable relative paths to assets via compass helper functions. Uncomment:
+# relative_assets = true
+}
+ else
+ ""
+ end
+ end
+
+ def default_output_style
+ if environment == :development
+ :expanded
+ else
+ :compact
+ end
+ end
+
+ def default_line_comments
+ environment == :development
+ end
+
+ def sass_path
+ if project_path && sass_dir
+ File.join(project_path, sass_dir)
+ end
+ end
+
+ def css_path
+ if project_path && css_dir
+ File.join(project_path, css_dir)
+ end
+ end
+
+ def root_relative(path)
+ hp = http_path || default_http_path
+ hp = hp[0..-2] if hp[-1..-1] == "/"
+ "#{hp}/#{path}"
+ end
+
+ def add_import_path(*paths)
+ # The @added_import_paths variable works around an issue where
+ # the additional_import_paths gets overwritten during parse
+ @added_import_paths ||= []
+ @added_import_paths += paths
+ self.additional_import_paths ||= []
+ self.additional_import_paths += paths
+ end
+
+ # When called with a block, defines the asset host url to be used.
+ # The block must return a string that starts with a protocol (E.g. http).
+ # The block will be passed the root-relative url of the asset.
+ # When called without a block, returns the block that was previously set.
+ def asset_host(&block)
+ if block_given?
+ @asset_host = block
+ else
+ @asset_host
+ end
+ end
+
+ # When called with a block, defines the cache buster strategy to be used.
+ # The block must return nil or a string that can be appended to a url as a query parameter.
+ # The returned string must not include the starting '?'.
+ # The block will be passed the root-relative url of the asset.
+ # If the block accepts two arguments, it will also be passed a File object
+ # that points to the asset on disk -- which may or may not exist.
+ # When called without a block, returns the block that was previously set.
+ def asset_cache_buster(&block)
+ if block_given?
+ @asset_cache_buster = block
+ else
+ @asset_cache_buster
+ end
+ end
+
+
+ def serialize
+ if asset_cache_buster
+ raise Compass::Error, "Cannot serialize a configuration with asset_cache_buster set."
+ end
+ if asset_host
+ raise Compass::Error, "Cannot serialize a configuration with asset_host set."
+ end
+ contents = ""
+ required_libraries.each do |lib|
+ contents << %Q{require '#{lib}'\n}
+ end
+ contents << "# Require any additional compass plugins here.\n"
+ contents << "\n" if required_libraries.any?
+ ATTRIBUTES.each do |prop|
+ value = send(prop)
+ if respond_to?("comment_for_#{prop}")
+ contents << send("comment_for_#{prop}")
+ end
+ if block_given? && (to_emit = yield(prop, value))
+ contents << to_emit
+ else
+ contents << Configuration.serialize_property(prop, value) unless value.nil?
+ end
+ end
+ contents
+ end
+
+ def self.serialize_property(prop, value)
+ %Q(#{prop} = #{value.inspect}\n)
+ end
+
+ def to_compiler_arguments(additional_options)
+ [project_path, sass_path, css_path, to_sass_engine_options.merge(additional_options)]
+ end
+
+ def to_sass_plugin_options
+ locations = {}
+ locations[sass_path] = css_path if sass_path && css_path
+ Compass::Frameworks::ALL.each do |framework|
+ locations[framework.stylesheets_directory] = css_path || css_dir || "."
+ end
+ resolve_additional_import_paths.each do |additional_path|
+ locations[additional_path] = File.join(css_path || css_dir || ".", File.basename(additional_path))
+ end
+ plugin_opts = {:template_location => locations}
+ plugin_opts[:style] = output_style if output_style
+ plugin_opts[:line_comments] = default_line_comments if environment
+ plugin_opts.merge!(sass_options || {})
+ plugin_opts
+ end
+
+ def resolve_additional_import_paths
+ (additional_import_paths || []).map do |path|
+ if project_path && !absolute_path?(path)
+ File.join(project_path, path)
+ else
+ path
+ end
+ end
+ end
+
+ def to_sass_engine_options
+ engine_opts = {:load_paths => sass_load_paths}
+ engine_opts[:style] = output_style if output_style
+ engine_opts[:line_comments] = default_line_comments if environment
+ engine_opts.merge!(sass_options || {})
+ end
+
+ def sass_load_paths
+ load_paths = []
+ load_paths << sass_path if sass_path
+ Compass::Frameworks::ALL.each do |framework|
+ load_paths << framework.stylesheets_directory if File.exists?(framework.stylesheets_directory)
+ end
+ load_paths += resolve_additional_import_paths
+ load_paths
+ end
+
+ # Support for testing.
+ def reset!
+ ATTRIBUTES.each do |attr|
+ send("#{attr}=", nil)
+ end
+ @asset_cache_buster = nil
+ @asset_host = nil
+ @added_import_paths = nil
+ self.required_libraries = []
+ end
+
+ def issue_deprecation_warnings
+ if http_images_path == :relative
+ puts "DEPRECATION WARNING: Please set relative_assets = true to enable relative paths."
+ end
+ end
+
+ def require(lib)
+ required_libraries << lib
+ super
+ end
+
+ def absolute_path?(path)
+ # This is only going to work on unix, gonna need a better implementation.
+ path.index(File::SEPARATOR) == 0
+ end
+ end
+
+ module ConfigHelpers
+ def configuration
+ if block_given?
+ yield Configuration.instance
+ end
+ Configuration.instance
+ end
+
+ def sass_plugin_configuration
+ configuration.to_sass_plugin_options
+ end
+
+ def configure_sass_plugin!
+ @sass_plugin_configured = true
+ Sass::Plugin.options.merge!(sass_plugin_configuration)
+ end
+
+ def sass_plugin_configured?
+ @sass_plugin_configured
+ end
+
+ def sass_engine_options
+ configuration.to_sass_engine_options
+ end
+ end
+
+ extend ConfigHelpers
+
+end
diff --git a/vendor/gems/gems/compass-0.8.17/lib/compass/core_ext.rb b/vendor/gems/gems/compass-0.8.17/lib/compass/core_ext.rb
new file mode 100755
index 00000000..09927e72
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/lib/compass/core_ext.rb
@@ -0,0 +1,14 @@
+class String
+ unless method_defined?(:blank?)
+ # see if string has any content
+ def blank?; self.length.zero?; end
+ end
+end
+
+class NilClass
+ unless method_defined?(:blank?)
+ def blank?
+ true
+ end
+ end
+end
diff --git a/vendor/gems/gems/compass-0.8.17/lib/compass/dependencies.rb b/vendor/gems/gems/compass-0.8.17/lib/compass/dependencies.rb
new file mode 100755
index 00000000..81eed158
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/lib/compass/dependencies.rb
@@ -0,0 +1,10 @@
+unless defined?(Sass)
+ require 'rubygems'
+ begin
+ gem 'haml-edge', '>= 2.3.0'
+ $stderr.puts "Loading haml-edge gem."
+ rescue Exception
+ #pass
+ end
+ require 'sass'
+end
\ No newline at end of file
diff --git a/vendor/gems/gems/compass-0.8.17/lib/compass/errors.rb b/vendor/gems/gems/compass-0.8.17/lib/compass/errors.rb
new file mode 100755
index 00000000..d0dccfcd
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/lib/compass/errors.rb
@@ -0,0 +1,7 @@
+module Compass
+ class Error < StandardError
+ end
+
+ class FilesystemConflict < Error
+ end
+end
\ No newline at end of file
diff --git a/vendor/gems/gems/compass-0.8.17/lib/compass/exec.rb b/vendor/gems/gems/compass-0.8.17/lib/compass/exec.rb
new file mode 100755
index 00000000..9877e629
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/lib/compass/exec.rb
@@ -0,0 +1,251 @@
+require File.join(Compass.lib_directory, 'compass', 'dependencies')
+require 'optparse'
+require File.join(Compass.lib_directory, 'compass', 'logger')
+require File.join(Compass.lib_directory, 'compass', 'errors')
+require File.join(Compass.lib_directory, 'compass', 'actions')
+
+module Compass
+ module Exec
+
+ def report_error(e, options)
+ $stderr.puts "#{e.class} on line #{get_line e} of #{get_file e}: #{e.message}"
+ if options[:trace]
+ e.backtrace[1..-1].each { |t| $stderr.puts " #{t}" }
+ else
+ $stderr.puts "Run with --trace to see the full backtrace"
+ end
+ end
+
+ def get_file(exception)
+ exception.backtrace[0].split(/:/, 2)[0]
+ end
+
+ def get_line(exception)
+ exception.backtrace[0].scan(/:(\d+)/)[0]
+ end
+ module_function :report_error, :get_file, :get_line
+
+ class Compass
+
+ attr_accessor :args, :options, :opts
+
+ def initialize(args)
+ self.args = args
+ self.options = {}
+ parse!
+ end
+
+ def run!
+ begin
+ perform!
+ rescue Exception => e
+ raise e if e.is_a? SystemExit
+ if e.is_a?(::Compass::Error) || e.is_a?(OptionParser::ParseError)
+ $stderr.puts e.message
+ else
+ ::Compass::Exec.report_error(e, @options)
+ end
+ return 1
+ end
+ return 0
+ end
+
+ protected
+
+ def perform!
+ if options[:command]
+ do_command(options[:command])
+ else
+ puts self.opts
+ end
+ end
+
+ def parse!
+ self.opts = OptionParser.new(&method(:set_opts))
+ self.opts.parse!(self.args)
+ if self.args.size > 0
+ self.options[:project_name] = trim_trailing_separator(self.args.shift)
+ end
+ self.options[:command] ||= self.options[:project_name] ? :create_project : :update_project
+ self.options[:framework] ||= :compass
+ self.options[:project_type] ||= :stand_alone
+ end
+
+ def trim_trailing_separator(path)
+ path[-1..-1] == File::SEPARATOR ? path[0..-2] : path
+ end
+
+ def set_opts(opts)
+ opts.banner = <+.',
+ ' Defaults to 30+10.') do |dimensions|
+ self.options[:grid_dimensions] = dimensions || "30+10"
+ unless self.options[:grid_dimensions] =~ /^\d+\+\d+$/
+ puts "Please enter your dimensions as +. E.g. 20+5 or 30+10."
+ exit
+ end
+ self.options[:command] = :generate_grid_background
+ end
+
+ opts.separator ''
+ opts.separator 'Install/Pattern Options:'
+
+ opts.on('-f FRAMEWORK', '--framework FRAMEWORK', 'Use the specified framework. Only one may be specified.') do |framework|
+ self.options[:framework] = framework
+ end
+
+ opts.on('-n', '--pattern-name NAME', 'The name to use when stamping a pattern.',
+ ' Must be used in combination with -p.') do |name|
+ self.options[:pattern_name] = name
+ end
+
+ opts.on('--rails', "Sets the project type to a rails project.") do
+ self.options[:project_type] = :rails
+ end
+
+ opts.separator ''
+ opts.separator 'Configuration Options:'
+
+ opts.on('-c', '--config CONFIG_FILE', 'Specify the location of the configuration file explicitly.') do |configuration_file|
+ self.options[:configuration_file] = configuration_file
+ end
+
+ opts.on('--sass-dir SRC_DIR', "The source directory where you keep your sass stylesheets.") do |sass_dir|
+ self.options[:sass_dir] = sass_dir
+ end
+
+ opts.on('--css-dir CSS_DIR', "The target directory where you keep your css stylesheets.") do |css_dir|
+ self.options[:css_dir] = css_dir
+ end
+
+ opts.on('--images-dir IMAGES_DIR', "The directory where you keep your images.") do |images_dir|
+ self.options[:images_dir] = images_dir
+ end
+
+ opts.on('--javascripts-dir JS_DIR', "The directory where you keep your javascripts.") do |javascripts_dir|
+ self.options[:javascripts_dir] = javascripts_dir
+ end
+
+ opts.on('-e ENV', '--environment ENV', [:development, :production], 'Use sensible defaults for your current environment.',
+ ' One of: development, production (default)') do |env|
+ self.options[:environment] = env
+ end
+
+ opts.on('-s STYLE', '--output-style STYLE', [:nested, :expanded, :compact, :compressed], 'Select a CSS output mode.',
+ ' One of: nested, expanded, compact, compressed') do |style|
+ self.options[:output_style] = style
+ end
+
+ opts.on('--relative-assets', :NONE, 'Make compass asset helpers generate relative urls to assets.') do
+ self.options[:relative_assets] = true
+ end
+
+ opts.separator ''
+ opts.separator 'General Options:'
+
+ opts.on('-r LIBRARY', '--require LIBRARY', "Require the given ruby LIBRARY before running commands.",
+ " This is used to access compass plugins without having a",
+ " project configuration file.") do |library|
+ ::Compass.configuration.require library
+ end
+
+ opts.on('-q', '--quiet', :NONE, 'Quiet mode.') do
+ self.options[:quiet] = true
+ end
+
+ opts.on('--dry-run', :NONE, 'Dry Run. Tells you what it plans to do.') do
+ self.options[:dry_run] = true
+ end
+
+ opts.on('--trace', :NONE, 'Show a full stacktrace on error') do
+ self.options[:trace] = true
+ end
+
+ opts.on('--force', :NONE, 'Force. Allows some failing commands to succeed instead.') do
+ self.options[:force] = true
+ end
+
+ opts.on('--imports', :NONE, 'Emit an imports suitable for passing to the sass command-line.',
+ ' Example: sass `compass --imports`',
+ ' Note: Compass\'s Sass extensions will not be available.') do
+ print ::Compass::Frameworks::ALL.map{|f| "-I #{f.stylesheets_directory}"}.join(' ')
+ exit
+ end
+
+ opts.on('--install-dir', :NONE, 'Emit the location where compass is installed.') do
+ puts ::Compass.base_directory
+ exit
+ end
+
+ opts.on_tail("-?", "-h", "--help", "Show this message") do
+ puts opts
+ exit
+ end
+
+ opts.on_tail("-v", "--version", "Print version") do
+ self.options[:command] = :print_version
+ end
+
+ end
+
+ def do_command(command)
+ command_class_name = command.to_s.split(/_/).map{|p| p.capitalize}.join('')
+ command_class = eval("::Compass::Commands::#{command_class_name}")
+ command_class.new(Dir.getwd, options).execute
+ end
+
+ end
+ end
+end
+
+Dir.glob(File.join(File.dirname(__FILE__), 'commands', "*.rb")).each do |file|
+ require file
+end
diff --git a/vendor/gems/gems/compass-0.8.17/lib/compass/frameworks.rb b/vendor/gems/gems/compass-0.8.17/lib/compass/frameworks.rb
new file mode 100755
index 00000000..e74c4529
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/lib/compass/frameworks.rb
@@ -0,0 +1,29 @@
+module Compass
+ module Frameworks
+ ALL = []
+ class Framework
+ attr_accessor :name
+ attr_accessor :templates_directory, :stylesheets_directory
+ def initialize(name, *arguments)
+ options = arguments.last.is_a?(Hash) ? arguments.pop : {}
+ path = options[:path] || arguments.shift
+ @name = name
+ @templates_directory = options[:templates_directory] || File.join(path, 'templates')
+ @stylesheets_directory = options[:stylesheets_directory] || File.join(path, 'stylesheets')
+ end
+ end
+ def register(name, *arguments)
+ ALL << Framework.new(name, *arguments)
+ end
+ def [](name)
+ ALL.detect{|f| f.name.to_s == name.to_s}
+ end
+ module_function :register, :[]
+ end
+end
+
+# Import all of the default frameworks.
+default_frameworks_directory = File.expand_path(File.join(File.dirname(__FILE__), '..', '..', 'frameworks'))
+Dir.glob(File.join(default_frameworks_directory, "*.rb")).each do |framework|
+ require framework
+end
diff --git a/vendor/gems/gems/compass-0.8.17/lib/compass/grid_builder.rb b/vendor/gems/gems/compass-0.8.17/lib/compass/grid_builder.rb
new file mode 100755
index 00000000..0c91f60f
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/lib/compass/grid_builder.rb
@@ -0,0 +1,72 @@
+# This file came from the Blueprint Project
+begin
+ require 'rubygems'
+ gem 'rmagick'
+ require 'rvg/rvg'
+rescue Exception => e
+end
+
+module Compass
+ # Uses ImageMagick and RMagick to generate grid.png file
+ class GridBuilder
+ include Actions
+
+ begin
+ include Magick
+ rescue Exception => e
+ end
+
+ attr_reader :column_width, :gutter_width, :output_path, :able_to_generate, :options
+
+ # ==== Options
+ # * options
+ # * :column_width -- Width (in pixels) of current grid column
+ # * :gutter_width -- Width (in pixels) of current grid gutter
+ # * :output_path -- Output path of grid.png file
+ def initialize(options={})
+ @able_to_generate = Magick::Long_version rescue false
+ return unless @able_to_generate
+ @column_width = options[:column_width]
+ @gutter_width = options[:gutter_width]
+ @output_path = options[:output_path]
+ @options = options
+ end
+
+ def working_path
+ options[:working_path]
+ end
+
+ # generates (overwriting if necessary) grid.png image to be tiled in background
+ def generate!
+ return false unless self.able_to_generate
+ total_width = self.column_width + self.gutter_width
+ height = 20
+ RVG::dpi = 100
+
+ rvg = RVG.new((total_width.to_f/RVG::dpi).in, (height.to_f/RVG::dpi).in).viewbox(0, 0, total_width, height) do |canvas|
+ canvas.background_fill = 'white'
+
+ canvas.g do |column|
+ column.rect(self.column_width, height).styles(:fill => "#e8effb")
+ end
+
+ canvas.g do |baseline|
+ baseline.line(0, (height - 1), total_width, (height- 1)).styles(:fill => "#e9e9e9")
+ end
+ end
+
+ filename = File.join(self.output_path, "grid.png")
+ if File.exists?(filename)
+ if options[:force]
+ overwrite = true
+ else
+ msg = "#{filename} already exists. Overwrite with --force."
+ raise Compass::FilesystemConflict.new(msg)
+ end
+ end
+ directory self.output_path
+ logger.record((overwrite ? :overwrite : :create), basename(filename))
+ rvg.draw.write(filename)
+ end
+ end
+end
\ No newline at end of file
diff --git a/vendor/gems/gems/compass-0.8.17/lib/compass/installers.rb b/vendor/gems/gems/compass-0.8.17/lib/compass/installers.rb
new file mode 100755
index 00000000..a92f1a3f
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/lib/compass/installers.rb
@@ -0,0 +1,5 @@
+require File.join(File.dirname(__FILE__), 'installers', 'manifest')
+require File.join(File.dirname(__FILE__), 'installers', 'base')
+require File.join(File.dirname(__FILE__), 'installers', 'stand_alone')
+require File.join(File.dirname(__FILE__), 'installers', 'rails')
+
diff --git a/vendor/gems/gems/compass-0.8.17/lib/compass/installers/base.rb b/vendor/gems/gems/compass-0.8.17/lib/compass/installers/base.rb
new file mode 100755
index 00000000..fb1e26c3
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/lib/compass/installers/base.rb
@@ -0,0 +1,158 @@
+module Compass
+ module Installers
+
+ class Base
+
+ include Actions
+
+ attr_accessor :template_path, :target_path, :working_path
+ attr_accessor :options
+ attr_accessor :manifest
+
+ def initialize(template_path, target_path, options = {})
+ @template_path = template_path
+ @target_path = target_path
+ @working_path = Dir.getwd
+ @options = options
+ @manifest = Manifest.new(manifest_file) if template_path
+ self.logger = options[:logger]
+ end
+
+ def manifest_file
+ @manifest_file ||= File.join(template_path, "manifest.rb")
+ end
+
+ [:css_dir, :sass_dir, :images_dir, :javascripts_dir].each do |dir|
+ define_method dir do
+ Compass.configuration.send(dir)
+ end
+ end
+
+ # Initializes the project to work with compass
+ def init
+ dirs = manifest.map do |entry|
+ File.dirname(send("install_location_for_#{entry.type}", entry.to, entry.options))
+ end
+
+ if manifest.has_stylesheet?
+ dirs << sass_dir
+ dirs << css_dir
+ end
+
+ dirs.uniq.sort.each do |dir|
+ directory targetize(dir)
+ end
+ end
+
+ # Runs the installer.
+ # Every installer must conform to the installation strategy of prepare, install, and then finalize.
+ # A default implementation is provided for each step.
+ def run(options = {})
+ prepare
+ install
+ finalize unless options[:skip_finalization]
+ end
+
+ # The default prepare method -- it is a no-op.
+ # Generally you would create required directories, etc.
+ def prepare
+ end
+
+ def configure_option_with_default(opt)
+ value = options[opt]
+ value ||= begin
+ default_method = "default_#{opt}".to_sym
+ send(default_method) if respond_to?(default_method)
+ end
+ send("#{opt}=", value)
+ end
+
+ # The default install method. Calls install_ methods in the order specified by the manifest.
+ def install
+ manifest.each do |entry|
+ send("install_#{entry.type}", entry.from, entry.to, entry.options)
+ end
+ end
+
+ # The default finalize method -- it is a no-op.
+ # This could print out a message or something.
+ def finalize
+ end
+
+ def compilation_required?
+ false
+ end
+
+ def pattern_name_as_dir
+ "#{options[:pattern_name]}/" if options[:pattern_name]
+ end
+
+ def self.installer(type, installer_opts = {}, &locator)
+ locator ||= lambda{|to| to}
+ loc_method = "install_location_for_#{type}".to_sym
+ define_method("simple_#{loc_method}", locator)
+ define_method(loc_method) do |to, options|
+ if options[:like] && options[:like] != type
+ send("install_location_for_#{options[:like]}", to, options)
+ else
+ send("simple_#{loc_method}", to)
+ end
+ end
+ define_method "install_#{type}" do |from, to, options|
+ from = templatize(from)
+ to = targetize(send(loc_method, to, options))
+ copy from, to, nil, (installer_opts[:binary] || options[:binary])
+ end
+ end
+
+ installer :stylesheet do |to|
+ "#{sass_dir}/#{pattern_name_as_dir}#{to}"
+ end
+
+ installer :css do |to|
+ "#{css_dir}/#{to}"
+ end
+
+ installer :image, :binary => true do |to|
+ "#{images_dir}/#{to}"
+ end
+
+ installer :javascript do |to|
+ "#{javascripts_dir}/#{to}"
+ end
+
+ installer :file do |to|
+ "#{pattern_name_as_dir}#{to}"
+ end
+
+ # returns an absolute path given a path relative to the current installation target.
+ # Paths can use unix style "/" and will be corrected for the current platform.
+ def targetize(path)
+ strip_trailing_separator File.join(target_path, separate(path))
+ end
+
+ # returns an absolute path given a path relative to the current template.
+ # Paths can use unix style "/" and will be corrected for the current platform.
+ def templatize(path)
+ strip_trailing_separator File.join(template_path, separate(path))
+ end
+
+ def stylesheet_links
+ html = "\n"
+ manifest.each_stylesheet do |stylesheet|
+ # Skip partials.
+ next if File.basename(stylesheet.from)[0..0] == "_"
+ media = if stylesheet.options[:media]
+ %Q{ media="#{stylesheet.options[:media]}"}
+ end
+ ss_line = %Q{ }
+ if stylesheet.options[:condition]
+ ss_line = " "
+ end
+ html << ss_line + "\n"
+ end
+ html << ""
+ end
+ end
+ end
+end
diff --git a/vendor/gems/gems/compass-0.8.17/lib/compass/installers/manifest.rb b/vendor/gems/gems/compass-0.8.17/lib/compass/installers/manifest.rb
new file mode 100755
index 00000000..bd5d9a34
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/lib/compass/installers/manifest.rb
@@ -0,0 +1,58 @@
+module Compass
+ module Installers
+
+ class Manifest
+ include Enumerable
+
+ # A Manifest entry
+ class Entry < Struct.new(:type, :from, :options)
+ def to
+ options[:to] || from
+ end
+ end
+
+ def initialize(manifest_file = nil)
+ @entries = []
+ parse(manifest_file) if manifest_file
+ end
+
+ def self.type(t)
+ eval <<-END
+ def #{t}(from, options = {})
+ @entries << Entry.new(:#{t}, from, options)
+ end
+ def has_#{t}?
+ @entries.detect {|e| e.type == :#{t}}
+ end
+ def each_#{t}
+ @entries.select {|e| e.type == :#{t}}.each {|e| yield e}
+ end
+ END
+ end
+
+ type :stylesheet
+ type :image
+ type :javascript
+ type :file
+
+ # Enumerates over the manifest files
+ def each
+ @entries.each {|e| yield e}
+ end
+
+
+ protected
+ # parses a manifest file which is a ruby script
+ # evaluated in a Manifest instance context
+ def parse(manifest_file)
+ open(manifest_file) do |f|
+ eval(f.read, instance_binding, manifest_file)
+ end
+ end
+ def instance_binding
+ binding
+ end
+ end
+
+ end
+end
\ No newline at end of file
diff --git a/vendor/gems/gems/compass-0.8.17/lib/compass/installers/rails.rb b/vendor/gems/gems/compass-0.8.17/lib/compass/installers/rails.rb
new file mode 100755
index 00000000..9f2a3e36
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/lib/compass/installers/rails.rb
@@ -0,0 +1,135 @@
+module Compass
+ module Installers
+
+ class RailsInstaller < Base
+
+ def configuration_defaults
+ {
+ :sass_dir => (sass_dir || prompt_sass_dir),
+ :css_dir => (css_dir || prompt_css_dir),
+ :images_dir => default_images_dir,
+ :javascripts_dir => default_javascripts_dir,
+ :http_stylesheets_path => default_http_stylesheets_path,
+ :http_javascripts_path => default_http_javascripts_path,
+ :http_images_path => default_http_images_path
+ }
+ end
+
+ def write_configuration_files(config_file = nil)
+ config_file ||= targetize('config/compass.config')
+ write_file config_file, config_contents
+ write_file targetize('config/initializers/compass.rb'), initializer_contents
+ end
+
+ def config_files_exist?
+ File.exists?(targetize('config/compass.config')) &&
+ File.exists?(targetize('config/initializers/compass.rb'))
+ end
+
+ def prepare
+ write_configuration_files unless config_files_exist?
+ end
+
+ def finalize(options = {})
+ if options[:create]
+ puts <<-NEXTSTEPS
+
+Congratulations! Your rails project has been configured to use Compass.
+Sass will automatically compile your stylesheets during the next
+page request and keep them up to date when they change.
+Make sure you restart your server!
+NEXTSTEPS
+ end
+ puts "\nNext add these lines to the head of your layouts:\n\n"
+ puts stylesheet_links
+ puts "\n(You are using haml, aren't you?)"
+ end
+
+ def default_images_dir
+ separate("public/images")
+ end
+
+ def default_javascripts_dir
+ separate("public/javascripts")
+ end
+
+ def default_http_images_path
+ "/images"
+ end
+
+ def default_http_javascripts_path
+ "/javascripts"
+ end
+
+ def default_http_stylesheets_path
+ "/stylesheets"
+ end
+
+ def prompt_sass_dir
+ recommended_location = separate('app/stylesheets')
+ default_location = separate('public/stylesheets/sass')
+ print %Q{Compass recommends that you keep your stylesheets in #{recommended_location}
+instead of the Sass default location of #{default_location}.
+Is this OK? (Y/n) }
+ answer = gets.downcase[0]
+ answer == ?n ? default_location : recommended_location
+ end
+
+ def prompt_css_dir
+ recommended_location = separate("public/stylesheets/compiled")
+ default_location = separate("public/stylesheets")
+ puts
+ print %Q{Compass recommends that you keep your compiled css in #{recommended_location}/
+instead the Sass default of #{default_location}/.
+However, if you're exclusively using Sass, then #{default_location}/ is recommended.
+Emit compiled stylesheets to #{recommended_location}/? (Y/n) }
+ answer = gets.downcase[0]
+ answer == ?n ? default_location : recommended_location
+ end
+
+ def config_contents
+ Compass.configuration.serialize do |prop, value|
+ if prop == :project_path
+ "project_path = RAILS_ROOT if defined?(RAILS_ROOT)\n"
+ elsif prop == :output_style
+ ""
+ end
+ end
+ end
+
+ def initializer_contents
+ %Q{require 'compass'
+# If you have any compass plugins, require them here.
+Compass.configuration.parse(File.join(RAILS_ROOT, "config", "compass.config"))
+Compass.configuration.environment = RAILS_ENV.to_sym
+Compass.configure_sass_plugin!
+}
+ end
+
+ def stylesheet_prefix
+ if css_dir.length >= 19
+ "#{css_dir[19..-1]}/"
+ else
+ nil
+ end
+ end
+
+ def stylesheet_links
+ html = "%head\n"
+ manifest.each_stylesheet do |stylesheet|
+ # Skip partials.
+ next if File.basename(stylesheet.from)[0..0] == "_"
+ ss_line = " = stylesheet_link_tag '#{stylesheet_prefix}#{stylesheet.to.sub(/\.sass$/,'.css')}'"
+ if stylesheet.options[:media]
+ ss_line += ", :media => '#{stylesheet.options[:media]}'"
+ end
+ if stylesheet.options[:condition]
+ ss_line = " /[if #{stylesheet.options[:condition]}]\n " + ss_line
+ end
+ html << ss_line + "\n"
+ end
+ html
+ end
+ end
+ end
+end
diff --git a/vendor/gems/gems/compass-0.8.17/lib/compass/installers/stand_alone.rb b/vendor/gems/gems/compass-0.8.17/lib/compass/installers/stand_alone.rb
new file mode 100755
index 00000000..5ae61d5d
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/lib/compass/installers/stand_alone.rb
@@ -0,0 +1,60 @@
+module Compass
+ module Installers
+
+ class StandAloneInstaller < Base
+
+ def init
+ directory targetize("")
+ super
+ end
+
+ def write_configuration_files(config_file = nil)
+ config_file ||= targetize('config.rb')
+ write_file config_file, config_contents
+ end
+
+ def config_files_exist?
+ File.exists? targetize('config.rb')
+ end
+
+ def config_contents
+ project_path, Compass.configuration.project_path = Compass.configuration.project_path, nil
+ Compass.configuration.serialize
+ ensure
+ Compass.configuration.project_path = project_path
+ end
+
+ def prepare
+ write_configuration_files unless config_files_exist?
+ end
+
+ # We want to rely on the defaults provided by Configuration
+ def configuration_defaults
+ {}
+ end
+
+ def finalize(options = {})
+ if options[:create]
+ puts <<-NEXTSTEPS
+
+Congratulations! Your compass project has been created.
+You must recompile your sass stylesheets when they change.
+This can be done in one of the following ways:
+ 1. From within your project directory run:
+ compass
+ 2. From any directory run:
+ compass -u path/to/project
+ 3. To monitor your project for changes and automatically recompile:
+ compass --watch [path/to/project]
+NEXTSTEPS
+ end
+ puts "\nTo import your new stylesheets add the following lines of HTML (or equivalent) to your webpage:"
+ puts stylesheet_links
+ end
+
+ def compilation_required?
+ true
+ end
+ end
+ end
+end
diff --git a/vendor/gems/gems/compass-0.8.17/lib/compass/logger.rb b/vendor/gems/gems/compass-0.8.17/lib/compass/logger.rb
new file mode 100755
index 00000000..d48eecaf
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/lib/compass/logger.rb
@@ -0,0 +1,42 @@
+module Compass
+ class Logger
+
+ DEFAULT_ACTIONS = [:directory, :exists, :remove, :create, :overwrite, :compile]
+
+ attr_accessor :actions, :options
+
+ def initialize(*actions)
+ self.options = actions.last.is_a?(Hash) ? actions.pop : {}
+ @actions = DEFAULT_ACTIONS.dup
+ @actions += actions
+ end
+
+ # Record an action that has occurred
+ def record(action, *arguments)
+ log "#{action_padding(action)}#{action} #{arguments.join(' ')}"
+ end
+
+ # Emit a log message
+ def log(msg)
+ puts msg
+ end
+
+ # add padding to the left of an action that was performed.
+ def action_padding(action)
+ ' ' * [(max_action_length - action.to_s.length), 0].max
+ end
+
+ # the maximum length of all the actions known to the logger.
+ def max_action_length
+ @max_action_length ||= actions.inject(0){|memo, a| [memo, a.to_s.length].max}
+ end
+ end
+
+ class NullLogger
+ def record(*args)
+ end
+
+ def log(msg)
+ end
+ end
+end
\ No newline at end of file
diff --git a/vendor/gems/gems/compass-0.8.17/lib/compass/sass_extensions.rb b/vendor/gems/gems/compass-0.8.17/lib/compass/sass_extensions.rb
new file mode 100755
index 00000000..986be47f
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/lib/compass/sass_extensions.rb
@@ -0,0 +1,5 @@
+module Compass::SassExtensions
+end
+
+require File.join(File.dirname(__FILE__), 'sass_extensions', 'functions')
+require File.join(File.dirname(__FILE__), 'sass_extensions', 'monkey_patches')
diff --git a/vendor/gems/gems/compass-0.8.17/lib/compass/sass_extensions/functions.rb b/vendor/gems/gems/compass-0.8.17/lib/compass/sass_extensions/functions.rb
new file mode 100755
index 00000000..75c8eb2f
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/lib/compass/sass_extensions/functions.rb
@@ -0,0 +1,19 @@
+module Compass::SassExtensions::Functions
+end
+
+['selectors', 'enumerate', 'urls', 'display', 'inline_image'].each do |func|
+ require File.join(File.dirname(__FILE__), 'functions', func)
+end
+
+module Sass::Script::Functions
+ include Compass::SassExtensions::Functions::Selectors
+ include Compass::SassExtensions::Functions::Enumerate
+ include Compass::SassExtensions::Functions::Urls
+ include Compass::SassExtensions::Functions::Display
+ include Compass::SassExtensions::Functions::InlineImage
+end
+
+# Wierd that this has to be re-included to pick up sub-modules. Ruby bug?
+class Sass::Script::Functions::EvaluationContext
+ include Sass::Script::Functions
+end
diff --git a/vendor/gems/gems/compass-0.8.17/lib/compass/sass_extensions/functions/display.rb b/vendor/gems/gems/compass-0.8.17/lib/compass/sass_extensions/functions/display.rb
new file mode 100755
index 00000000..bea06200
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/lib/compass/sass_extensions/functions/display.rb
@@ -0,0 +1,22 @@
+module Compass::SassExtensions::Functions::Display
+ DEFAULT_DISPLAY = {
+ :block => %w{address blockquote center dir div dd dl dt fieldset form
+ frameset h1 h2 h3 h4 h5 h6 hr isindex menu noframes
+ noscript ol p pre ul},
+ :inline => %w{a abbr acronym b basefont bdo big br cite code dfn em
+ font i img input kbd label q s samp select small span
+ strike strong sub sup textarea tt u var},
+ :table => %w{table},
+ :"list-item" => %w{li},
+ :"table-row-group" => %w{tbody},
+ :"table-header-group" => %w{thead},
+ :"table-footer-group" => %w{tfoot},
+ :"table-row" => %w{tr},
+ :"table-cell" => %w{th td}
+ }
+
+ # returns a comma delimited string for all the elements according to their default css3 display value.
+ def elements_of_type(display)
+ Sass::Script::String.new(DEFAULT_DISPLAY.fetch(display.value.to_sym).join(", "))
+ end
+end
\ No newline at end of file
diff --git a/vendor/gems/gems/compass-0.8.17/lib/compass/sass_extensions/functions/enumerate.rb b/vendor/gems/gems/compass-0.8.17/lib/compass/sass_extensions/functions/enumerate.rb
new file mode 100755
index 00000000..48f89f73
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/lib/compass/sass_extensions/functions/enumerate.rb
@@ -0,0 +1,6 @@
+module Compass::SassExtensions::Functions::Enumerate
+ def enumerate(prefix, from, through, separator = "-")
+ selectors = (from.value..through.value).map{|i| "#{prefix.value}#{separator}#{i}"}.join(", ")
+ Sass::Script::String.new(selectors)
+ end
+end
\ No newline at end of file
diff --git a/vendor/gems/gems/compass-0.8.17/lib/compass/sass_extensions/functions/inline_image.rb b/vendor/gems/gems/compass-0.8.17/lib/compass/sass_extensions/functions/inline_image.rb
new file mode 100755
index 00000000..97b7b0e2
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/lib/compass/sass_extensions/functions/inline_image.rb
@@ -0,0 +1,35 @@
+require 'base64'
+module Compass::SassExtensions::Functions::InlineImage
+
+ def inline_image(path, mime_type = nil)
+ path = path.value
+ real_path = File.join(Compass.configuration.project_path, Compass.configuration.images_dir, path)
+ url = "url('data:#{compute_mime_type(path,mime_type)};base64,#{data(real_path)}')"
+ Sass::Script::String.new(url)
+ end
+
+private
+ def compute_mime_type(path, mime_type)
+ return mime_type if mime_type
+ case path
+ when /\.png$/i
+ 'image/png'
+ when /\.jpe?g$/i
+ 'image/jpeg'
+ when /\.gif$/i
+ 'image/gif'
+ when /\.([a-zA-Z]+)$/
+ "image/#{Regexp.last_match(1).downcase}"
+ else
+ raise Compass::Error, "A mime type could not be determined for #{path}, please specify one explicitly."
+ end
+ end
+
+ def data(real_path)
+ if File.readable?(real_path)
+ Base64.encode64(File.read(real_path)).gsub("\n","")
+ else
+ raise Compass::Error, "File not found or cannot be read: #{real_path}"
+ end
+ end
+end
diff --git a/vendor/gems/gems/compass-0.8.17/lib/compass/sass_extensions/functions/selectors.rb b/vendor/gems/gems/compass-0.8.17/lib/compass/sass_extensions/functions/selectors.rb
new file mode 100755
index 00000000..fecaab73
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/lib/compass/sass_extensions/functions/selectors.rb
@@ -0,0 +1,39 @@
+module Compass::SassExtensions::Functions::Selectors
+ COMMA_SEPARATOR = /\s*,\s*/
+
+ # Permute multiple selectors each of which may be comma delimited, the end result is
+ # a new selector that is the equivalent of nesting each under the previous selector.
+ # To illustrate, the following mixins are equivalent:
+ # =mixin-a(!selector1, !selector2, !selector3)
+ # #{!selector1}
+ # #{selector2}
+ # #{selector3}
+ # width: 2px
+ # =mixin-b(!selector1, !selector2)
+ # #{nest(!selector, !selector2, !selector3)}
+ # width: 2px
+ def nest(*arguments)
+ nested = arguments.map{|a| a.value}.inject do |memo,arg|
+ ancestors = memo.split(COMMA_SEPARATOR)
+ descendants = arg.split(COMMA_SEPARATOR)
+ ancestors.map{|a| descendants.map{|d| "#{a} #{d}"}.join(", ")}.join(", ")
+ end
+ Sass::Script::String.new(nested)
+ end
+
+ # Permute two selectors, the first may be comma delimited.
+ # The end result is a new selector that is the equivalent of nesting the second
+ # selector under the first one in a sass file and preceding it with an &.
+ # To illustrate, the following mixins are equivalent:
+ # =mixin-a(!selector, !to_append)
+ # #{!selector}
+ # {!to_append}
+ # width: 2px
+ # =mixin-b(!selector, !to_append)
+ # #{append_selector(!selector, !to_append)}
+ # width: 2px
+ def append_selector(selector, to_append)
+ Sass::Script::String.new(selector.value.split(COMMA_SEPARATOR).map{|s| "#{s}#{to_append}"}.join(", "))
+ end
+
+end
\ No newline at end of file
diff --git a/vendor/gems/gems/compass-0.8.17/lib/compass/sass_extensions/functions/urls.rb b/vendor/gems/gems/compass-0.8.17/lib/compass/sass_extensions/functions/urls.rb
new file mode 100755
index 00000000..06103623
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/lib/compass/sass_extensions/functions/urls.rb
@@ -0,0 +1,105 @@
+module Compass::SassExtensions::Functions::Urls
+
+ def stylesheet_url(path)
+ # Compute the path to the stylesheet, either root relative or stylesheet relative
+ # or nil if the http_images_path is not set in the configuration.
+ http_stylesheets_path = if relative?
+ compute_relative_path(Compass.configuration.css_dir)
+ elsif Compass.configuration.http_stylesheets_path
+ Compass.configuration.http_stylesheets_path
+ else
+ Compass.configuration.root_relative(Compass.configuration.css_dir)
+ end
+
+ url("#{http_stylesheets_path}/#{path}")
+ end
+
+ def image_url(path)
+ path = path.value # get to the string value of the literal.
+ # Short curcuit if they have provided an absolute url.
+ if absolute_path?(path)
+ return Sass::Script::String.new("url(#{path})")
+ end
+
+ # Compute the path to the image, either root relative or stylesheet relative
+ # or nil if the http_images_path is not set in the configuration.
+ http_images_path = if relative?
+ compute_relative_path(Compass.configuration.images_dir)
+ elsif Compass.configuration.http_images_path
+ Compass.configuration.http_images_path
+ else
+ Compass.configuration.root_relative(Compass.configuration.images_dir)
+ end
+
+ # Compute the real path to the image on the file stystem if the images_dir is set.
+ real_path = if Compass.configuration.images_dir
+ File.join(Compass.configuration.project_path, Compass.configuration.images_dir, path)
+ end
+
+ # prepend the path to the image if there's one
+ if http_images_path
+ http_images_path = "#{http_images_path}/" unless http_images_path[-1..-1] == "/"
+ path = "#{http_images_path}#{path}"
+ end
+
+ # Compute the asset host unless in relative mode.
+ asset_host = if !relative? && Compass.configuration.asset_host
+ Compass.configuration.asset_host.call(path)
+ end
+
+ # Compute and append the cache buster if there is one.
+ if buster = compute_cache_buster(path, real_path)
+ path += "?#{buster}"
+ end
+
+ # prepend the asset host if there is one.
+ path = "#{asset_host}#{'/' unless path[0..0] == "/"}#{path}" if asset_host
+
+ url(path)
+ end
+
+ # Emits a url, taking off any leading "./"
+ def url(url)
+ url = url.to_s
+ url = url[0..1] == "./" ? url[2..-1] : url
+ Sass::Script::String.new("url('#{url}')")
+ end
+
+ private
+
+ def relative?
+ Compass.configuration.relative_assets?
+ end
+
+ def absolute_path?(path)
+ path[0..0] == "/" || path[0..3] == "http"
+ end
+
+ def compute_relative_path(dir)
+ if (target_css_file = options[:css_filename])
+ path = File.join(Compass.configuration.project_path, dir)
+ Pathname.new(path).relative_path_from(Pathname.new(File.dirname(target_css_file))).to_s
+ end
+ end
+
+ def compute_cache_buster(path, real_path)
+ if Compass.configuration.asset_cache_buster
+ args = [path]
+ if Compass.configuration.asset_cache_buster.arity > 1
+ args << (File.new(real_path) if real_path)
+ end
+ Compass.configuration.asset_cache_buster.call(*args)
+ elsif real_path
+ default_cache_buster(path, real_path)
+ end
+ end
+
+ def default_cache_buster(path, real_path)
+ if File.readable?(real_path)
+ File.mtime(real_path).strftime("%s")
+ else
+ $stderr.puts "WARNING: '#{File.basename(path)}' was not found (or cannot be read) in #{File.dirname(real_path)}"
+ end
+ end
+
+end
diff --git a/vendor/gems/gems/compass-0.8.17/lib/compass/sass_extensions/monkey_patches.rb b/vendor/gems/gems/compass-0.8.17/lib/compass/sass_extensions/monkey_patches.rb
new file mode 100755
index 00000000..de54a75c
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/lib/compass/sass_extensions/monkey_patches.rb
@@ -0,0 +1,3 @@
+['stylesheet_updating'].each do |patch|
+ require File.join(File.dirname(__FILE__), 'monkey_patches', patch)
+end
\ No newline at end of file
diff --git a/vendor/gems/gems/compass-0.8.17/lib/compass/sass_extensions/monkey_patches/stylesheet_updating.rb b/vendor/gems/gems/compass-0.8.17/lib/compass/sass_extensions/monkey_patches/stylesheet_updating.rb
new file mode 100755
index 00000000..1cb09118
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/lib/compass/sass_extensions/monkey_patches/stylesheet_updating.rb
@@ -0,0 +1,23 @@
+require 'sass/plugin'
+
+# XXX: We can remove this monkeypatch once Sass 2.2 is released.
+module Sass::Plugin
+ class << self
+ unless method_defined?(:exact_stylesheet_needs_update?)
+ def stylesheet_needs_update?(name, template_path, css_path)
+ css_file = css_filename(name, css_path)
+ template_file = template_filename(name, template_path)
+ exact_stylesheet_needs_update?(css_file, template_file)
+ end
+ def exact_stylesheet_needs_update?(css_file, template_file)
+ if !File.exists?(css_file)
+ return true
+ else
+ css_mtime = File.mtime(css_file)
+ File.mtime(template_file) > css_mtime ||
+ dependencies(template_file).any?(&dependency_updated?(css_mtime))
+ end
+ end
+ end
+ end
+end
\ No newline at end of file
diff --git a/vendor/gems/gems/compass-0.8.17/lib/compass/test_case.rb b/vendor/gems/gems/compass-0.8.17/lib/compass/test_case.rb
new file mode 100755
index 00000000..84368868
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/lib/compass/test_case.rb
@@ -0,0 +1,38 @@
+module Compass
+ # Write your unit test like this if you want to make sure all your stylesheets compile.
+ #
+ # require 'compass/test_case'
+ # class StylesheetsTest < Compass::TestCase
+ # def test_stylesheets
+ # my_sass_files.each do |sass_file|
+ # assert_compiles(sass_file) do |result|
+ # assert_not_blank result
+ # end
+ # end
+ # end
+ # protected
+ # def my_sass_files
+ # Dir.glob(File.expand_path(File.join(File.dirname(__FILE__), "../..", "app/stylesheets/**/[^_]*.sass")))
+ # end
+ # end
+ class TestCase < (defined?(ActiveSupport::TestCase) ? ActiveSupport::TestCase : Test::Unit::TestCase)
+
+ def setup
+ super
+ @last_compile = nil
+ end
+
+ def compile(stylesheet)
+ input = open(stylesheet)
+ template = input.read()
+ input.close()
+ @last_compile = ::Sass::Engine.new(template, ::Sass::Plugin.engine_options(:filename => stylesheet)).render
+ yield @last_compile if block_given?
+ end
+
+ def assert_compiles(stylesheet, &block)
+ compile(stylesheet, &block)
+ end
+
+ end
+end
diff --git a/vendor/gems/gems/compass-0.8.17/lib/compass/validator.rb b/vendor/gems/gems/compass-0.8.17/lib/compass/validator.rb
new file mode 100755
index 00000000..8ddefafa
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/lib/compass/validator.rb
@@ -0,0 +1,10 @@
+begin
+ require 'rubygems'
+ require 'compass-validator'
+rescue LoadError
+ puts %Q{The Compass CSS Validator could not be loaded. Please install it:
+
+sudo gem install chriseppstein-compass-validator --source http://gems.github.com/
+}
+ exit(1)
+end
\ No newline at end of file
diff --git a/vendor/gems/gems/compass-0.8.17/lib/compass/version.rb b/vendor/gems/gems/compass-0.8.17/lib/compass/version.rb
new file mode 100755
index 00000000..f8e79bb2
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/lib/compass/version.rb
@@ -0,0 +1,57 @@
+module Compass
+ module Version
+ # Returns a hash representing the version.
+ # The :major, :minor, and :teeny keys have their respective numbers.
+ # The :string key contains a human-readable string representation of the version.
+ # The :rev key will have the current revision hash.
+ #
+ # This method swiped from Haml and then modified, some credit goes to Nathan Weizenbaum
+ attr_writer :version
+ def version
+ return @version if defined?(@version)
+
+ read_version_file
+
+ if r = revision
+ @version[:rev] = r
+ @version[:string] << " [#{r[0...7]}]"
+ end
+
+ @version
+ end
+
+ protected
+
+ def scope(file) # :nodoc:
+ File.join(File.dirname(__FILE__), '..', '..', file)
+ end
+
+ def read_version_file
+ require 'yaml'
+ @version = YAML::load(File.read(scope('VERSION.yml')))
+ @version[:string] = "#{@version[:major]}.#{@version[:minor]}.#{@version[:patch]}"
+ @version[:teeny] = @version[:patch]
+ end
+
+ def revision
+ revision_from_git || revision_from_file
+ end
+
+ def revision_from_file
+ if File.exists?(scope('REVISION'))
+ rev = File.read(scope('REVISION')).strip
+ rev if rev =~ /[a-f0-9]+/
+ end
+ end
+
+ def revision_from_git
+ if File.exists?(scope('.git/HEAD'))
+ rev = File.read(scope('.git/HEAD')).strip
+ if rev =~ /^ref: (.*)$/
+ rev = File.read(scope(".git/#{$1}")).strip
+ end
+ end
+ end
+
+ end
+end
diff --git a/vendor/gems/gems/compass-0.8.17/lib/vendor/fssm.rb b/vendor/gems/gems/compass-0.8.17/lib/vendor/fssm.rb
new file mode 100755
index 00000000..faf3fd1b
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/lib/vendor/fssm.rb
@@ -0,0 +1,41 @@
+dir = File.dirname(__FILE__)
+$LOAD_PATH.unshift dir unless $LOAD_PATH.include?(dir)
+
+module FSSM
+ FileNotFoundError = Class.new(StandardError)
+ CallbackError = Class.new(StandardError)
+
+ class << self
+ def dbg(msg=nil)
+ STDERR.puts(msg)
+ end
+
+ def monitor(*args, &block)
+ monitor = FSSM::Monitor.new
+ context = args.empty? ? monitor : monitor.path(*args)
+
+ if block_given?
+ if block.arity == 1
+ block.call(context)
+ else
+ context.instance_eval(&block)
+ end
+ end
+
+ monitor.run
+ end
+ end
+end
+
+require 'thread'
+require 'pathname'
+
+require 'fssm/ext'
+require 'fssm/support'
+require 'fssm/tree'
+require 'fssm/path'
+require 'fssm/state'
+require 'fssm/monitor'
+
+require "fssm/backends/#{FSSM::Support.backend.downcase}"
+FSSM::Backends::Default = FSSM::Backends.const_get(FSSM::Support.backend)
diff --git a/vendor/gems/gems/compass-0.8.17/lib/vendor/fssm/backends/fsevents.rb b/vendor/gems/gems/compass-0.8.17/lib/vendor/fssm/backends/fsevents.rb
new file mode 100755
index 00000000..0d143221
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/lib/vendor/fssm/backends/fsevents.rb
@@ -0,0 +1,37 @@
+require 'fssm/fsevents'
+
+module FSSM::Backends
+ class FSEvents
+ def initialize
+ @handlers = {}
+ @fsevents = []
+ end
+
+ def add_path(path, preload=true)
+ handler = FSSM::State.new(path)
+ @handlers["#{path}"] = handler
+
+ fsevent = Rucola::FSEvents.new("#{path}", {:latency => 0.5}) do |events|
+ events.each do |event|
+ handler.refresh(event.path)
+ end
+ end
+
+ fsevent.create_stream
+ handler.refresh(path.to_pathname, true) if preload
+ fsevent.start
+ @fsevents << fsevent
+ end
+
+ def run
+ begin
+ OSX.CFRunLoopRun
+ rescue Interrupt
+ @fsevents.each do |fsev|
+ fsev.stop
+ end
+ end
+ end
+
+ end
+end
diff --git a/vendor/gems/gems/compass-0.8.17/lib/vendor/fssm/backends/polling.rb b/vendor/gems/gems/compass-0.8.17/lib/vendor/fssm/backends/polling.rb
new file mode 100755
index 00000000..b2bdd3bb
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/lib/vendor/fssm/backends/polling.rb
@@ -0,0 +1,26 @@
+module FSSM::Backends
+ class Polling
+ def initialize(options={})
+ @handlers = []
+ @latency = options[:latency] || 1
+ end
+
+ def add_path(path, preload=true)
+ handler = FSSM::State.new(path)
+ handler.refresh(path.to_pathname, true) if preload
+ @handlers << handler
+ end
+
+ def run
+ begin
+ loop do
+ start = Time.now.to_f
+ @handlers.each {|handler| handler.refresh}
+ nap_time = @latency - (Time.now.to_f - start)
+ sleep nap_time if nap_time > 0
+ end
+ rescue Interrupt
+ end
+ end
+ end
+end
diff --git a/vendor/gems/gems/compass-0.8.17/lib/vendor/fssm/cache.rb b/vendor/gems/gems/compass-0.8.17/lib/vendor/fssm/cache.rb
new file mode 100755
index 00000000..adeff963
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/lib/vendor/fssm/cache.rb
@@ -0,0 +1,193 @@
+class FSSM::Cache
+ module Common
+ include Enumerable
+
+ def initialize
+ @children = Hash.new
+ end
+
+ def each(prefix='./', &block)
+ @children.each do |segment, node|
+ cprefix = Pathname.for(prefix.dup).join(segment)
+ block.call(cprefix, node)
+ node.each(cprefix, &block)
+ end
+ end
+
+ protected
+
+ def with_lock
+ @mutex.lock
+ yield
+ @mutex.unlock
+ end
+
+ def descendant(path)
+ recurse_on_key(path, false)
+ end
+
+ def descendant!(path)
+ recurse_on_key(path, true)
+ end
+
+ def child(segment)
+ has_child?(segment) ? @children["#{segment}"] : nil
+ end
+
+ def child!(segment)
+ (@children["#{segment}"] ||= Node.new)
+ end
+
+ def has_child?(segment)
+ @children.include?("#{segment}")
+ end
+
+ def remove_child(segment)
+ @children.delete("#{segment}")
+ end
+
+ def remove_children
+ @children.clear
+ end
+
+ def recurse_on_key(key, create)
+ key = sanitize_key(key)
+ node = self
+
+ until key.empty?
+ segment = key.shift
+ node = create ? node.child!(segment) : node.child(segment)
+ return nil unless node
+ end
+
+ node
+ end
+
+ def key_for_path(path)
+ Pathname.for(path).names
+ end
+
+ def relative_path(path)
+ sanitize_path(path, false)
+ end
+
+ def absolute_path(path)
+ sanitize_path(path, true)
+ end
+
+ def sanitize_path(path, absolute)
+ if path.is_a?(Array)
+ first = absolute ? '/' : path.shift
+ path = path.inject(Pathname.new("#{first}")) do |pathname, segment|
+ pathname.join("#{segment}")
+ end
+ path
+ else
+ path = Pathname.for(path)
+ absolute ? path.expand_path : path
+ end
+ end
+ end
+
+ class Node
+ include Common
+
+ attr_accessor :mtime
+ attr_accessor :ftype
+
+ def <=>(other)
+ self.mtime <=> other.mtime
+ end
+
+ def from_path(path)
+ path = absolute_path(path)
+ @mtime = path.mtime
+ @ftype = path.ftype
+ end
+
+ protected
+
+ def sanitize_key(key)
+ key_for_path(relative_path(key))
+ end
+ end
+
+ include Common
+
+ def initialize
+ @mutex = Mutex.new
+ super
+ end
+
+ def clear
+ @mutex.lock
+ @children.clear
+ @mutex.unlock
+ end
+
+ def set(path)
+ unset(path)
+ node = descendant!(path)
+ node.from_path(path)
+ node.mtime
+ end
+
+ def unset(path='/')
+ key = sanitize_key(path)
+
+ if key.empty?
+ self.clear
+ return nil
+ end
+
+ segment = key.pop
+ node = descendant(key)
+
+ return unless node
+
+ @mutex.lock
+ node.remove_child(segment)
+ @mutex.unlock
+
+ nil
+ end
+
+ def files
+ ftype('file')
+ end
+
+ def directories
+ ftype('directory')
+ end
+
+ protected
+
+ def each(&block)
+ prefix='/'
+ super(prefix, &block)
+ end
+
+ def ftype(ft)
+ inject({}) do |hash, entry|
+ path, node = entry
+ hash["#{path}"] = node.mtime if node.ftype == ft
+ hash
+ end
+ end
+
+ def descendant(path)
+ node = recurse_on_key(path, false)
+ node
+ end
+
+ def descendant!(path)
+ @mutex.lock
+ node = recurse_on_key(path, true)
+ @mutex.unlock
+ node
+ end
+
+ def sanitize_key(key)
+ key_for_path(absolute_path(key))
+ end
+end
diff --git a/vendor/gems/gems/compass-0.8.17/lib/vendor/fssm/ext.rb b/vendor/gems/gems/compass-0.8.17/lib/vendor/fssm/ext.rb
new file mode 100755
index 00000000..1f084b85
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/lib/vendor/fssm/ext.rb
@@ -0,0 +1,37 @@
+class Pathname
+ class << self
+ def for(path)
+ path.is_a?(Pathname) ? path : new(path)
+ end
+ end
+
+ # before overwriting chop_basename:
+ # %total - 29.50%
+ # %self - 20.50%
+ # after overwriting chop_basename:
+ # %total - 24.36%
+ # %self - 15.47%
+ CHOP_PAT = /\A#{SEPARATOR_PAT}?\z/
+ def chop_basename(path)
+ base = File.basename(path)
+ # the original version of this method recalculates this regexp
+ # each run, despite the pattern never changing.
+ if CHOP_PAT =~ base
+ return nil
+ else
+ return path[0, path.rindex(base)], base
+ end
+ end
+
+ def segments
+ prefix, names = split_names(@path)
+ names.unshift(prefix) unless prefix.empty?
+ names.shift if names[0] == '.'
+ names
+ end
+
+ def names
+ prefix, names = split_names(@path)
+ names
+ end
+end
diff --git a/vendor/gems/gems/compass-0.8.17/lib/vendor/fssm/fsevents.rb b/vendor/gems/gems/compass-0.8.17/lib/vendor/fssm/fsevents.rb
new file mode 100755
index 00000000..848c6ae2
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/lib/vendor/fssm/fsevents.rb
@@ -0,0 +1,129 @@
+OSX.require_framework '/System/Library/Frameworks/CoreServices.framework/Frameworks/CarbonCore.framework'
+
+module Rucola
+ class FSEvents
+ class FSEvent
+ attr_reader :fsevents_object
+ attr_reader :id
+ attr_reader :path
+ def initialize(fsevents_object, id, path)
+ @fsevents_object, @id, @path = fsevents_object, id, path
+ end
+
+ # Returns an array of the files/dirs in the path that the event occurred in.
+ # The files are sorted by the modification time, the first entry is the last modified file.
+ def files
+ Dir.glob("#{File.expand_path(path)}/*").sort_by {|f| File.mtime(f) }.reverse
+ end
+
+ # Returns the last modified file in the path that the event occurred in.
+ def last_modified_file
+ files.first
+ end
+ end
+
+ class StreamError < StandardError; end
+
+ attr_reader :paths
+ attr_reader :stream
+
+ attr_accessor :allocator
+ attr_accessor :context
+ attr_accessor :since
+ attr_accessor :latency
+ attr_accessor :flags
+
+ # Initializes a new FSEvents `watchdog` object and starts watching the directories you specify for events. The
+ # block is used as a handler for events, which are passed as the block's argument. This method is the easiest
+ # way to start watching some directories if you don't care about the details of setting up the event stream.
+ #
+ # Rucola::FSEvents.start_watching('/tmp') do |events|
+ # events.each { |event| log.debug("#{event.files.inspect} were changed.") }
+ # end
+ #
+ # Rucola::FSEvents.start_watching('/var/log/system.log', '/var/log/secure.log', :since => last_id, :latency => 5) do
+ # Growl.notify("Something was added to your log files!")
+ # end
+ #
+ # Note that the method also returns the FSEvents object. This enables you to control the event stream if you want to.
+ #
+ # fsevents = Rucola::FSEvents.start_watching('/Volumes') do |events|
+ # events.each { |event| Growl.notify("Volume changes: #{event.files.to_sentence}") }
+ # end
+ # fsevents.stop
+ def self.start_watching(*params, &block)
+ fsevents = new(*params, &block)
+ fsevents.create_stream
+ fsevents.start
+ fsevents
+ end
+
+ # Creates a new FSEvents `watchdog` object. You can specify a list of paths to watch and options to control the
+ # behaviour of the watchdog. The block you pass serves as a callback when an event is generated on one of the
+ # specified paths.
+ #
+ # fsevents = FSEvents.new('/etc/passwd') { Mailer.send_mail("Someone touched the password file!") }
+ # fsevents.create_stream
+ # fsevents.start
+ #
+ # fsevents = FSEvents.new('/home/upload', :since => UploadWatcher.last_event_id) do |events|
+ # events.each do |event|
+ # UploadWatcher.last_event_id = event.id
+ # event.files.each do |file|
+ # UploadWatcher.logfile.append("#{file} was changed")
+ # end
+ # end
+ # end
+ #
+ # *:since: The service will report events that have happened after the supplied event ID. Never use 0 because that
+ # will cause every fsevent since the "beginning of time" to be reported. Use OSX::KFSEventStreamEventIdSinceNow
+ # if you want to receive events that have happened after this call. (Default: OSX::KFSEventStreamEventIdSinceNow).
+ # You can find the ID's passed with :since in the events passed to your block.
+ # *:latency: Number of seconds to wait until an FSEvent is reported, this allows the service to bundle events. (Default: 0.0)
+ #
+ # Please refer to the Cocoa documentation for the rest of the options.
+ def initialize(*params, &block)
+ raise ArgumentError, 'No callback block was specified.' unless block_given?
+
+ options = params.last.kind_of?(Hash) ? params.pop : {}
+ @paths = params.flatten
+
+ paths.each { |path| raise ArgumentError, "The specified path (#{path}) does not exist." unless File.exist?(path) }
+
+ @allocator = options[:allocator] || OSX::KCFAllocatorDefault
+ @context = options[:context] || nil
+ @since = options[:since] || OSX::KFSEventStreamEventIdSinceNow
+ @latency = options[:latency] || 0.0
+ @flags = options[:flags] || 0
+ @stream = options[:stream] || nil
+
+ @user_callback = block
+ @callback = Proc.new do |stream, client_callback_info, number_of_events, paths_pointer, event_flags, event_ids|
+ paths_pointer.regard_as('*')
+ events = []
+ number_of_events.times {|i| events << Rucola::FSEvents::FSEvent.new(self, event_ids[i], paths_pointer[i]) }
+ @user_callback.call(events)
+ end
+ end
+
+ # Create the stream.
+ # Raises a Rucola::FSEvents::StreamError if the stream could not be created.
+ def create_stream
+ @stream = OSX.FSEventStreamCreate(@allocator, @callback, @context, @paths, @since, @latency, @flags)
+ raise(StreamError, 'Unable to create FSEvents stream.') unless @stream
+ OSX.FSEventStreamScheduleWithRunLoop(@stream, OSX.CFRunLoopGetCurrent, OSX::KCFRunLoopDefaultMode)
+ end
+
+ # Start the stream.
+ # Raises a Rucola::FSEvents::StreamError if the stream could not be started.
+ def start
+ raise(StreamError, 'Unable to start FSEvents stream.') unless OSX.FSEventStreamStart(@stream)
+ end
+
+ # Stop the stream.
+ # You can resume it by calling `start` again.
+ def stop
+ OSX.FSEventStreamStop(@stream)
+ end
+ end
+end
diff --git a/vendor/gems/gems/compass-0.8.17/lib/vendor/fssm/monitor.rb b/vendor/gems/gems/compass-0.8.17/lib/vendor/fssm/monitor.rb
new file mode 100755
index 00000000..b7cd0f99
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/lib/vendor/fssm/monitor.rb
@@ -0,0 +1,25 @@
+class FSSM::Monitor
+ def initialize(options={})
+ @options = options
+ @backend = FSSM::Backends::Default.new
+ end
+
+ def path(*args, &block)
+ path = FSSM::Path.new(*args)
+
+ if block_given?
+ if block.arity == 1
+ block.call(path)
+ else
+ path.instance_eval(&block)
+ end
+ end
+
+ @backend.add_path(path)
+ path
+ end
+
+ def run
+ @backend.run
+ end
+end
diff --git a/vendor/gems/gems/compass-0.8.17/lib/vendor/fssm/path.rb b/vendor/gems/gems/compass-0.8.17/lib/vendor/fssm/path.rb
new file mode 100755
index 00000000..16290ec4
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/lib/vendor/fssm/path.rb
@@ -0,0 +1,91 @@
+class FSSM::Path
+ def initialize(path=nil, glob=nil, &block)
+ set_path(path || '.')
+ set_glob(glob || '**/*')
+ init_callbacks
+
+ if block_given?
+ if block.arity == 1
+ block.call(self)
+ else
+ self.instance_eval(&block)
+ end
+ end
+ end
+
+ def to_s
+ @path.to_s
+ end
+
+ def to_pathname
+ @path
+ end
+
+ def glob(value=nil)
+ return @glob if value.nil?
+ set_glob(value)
+ end
+
+ def create(callback_or_path=nil, &block)
+ callback_action(:create, (block_given? ? block : callback_or_path))
+ end
+
+ def update(callback_or_path=nil, &block)
+ callback_action(:update, (block_given? ? block : callback_or_path))
+ end
+
+ def delete(callback_or_path=nil, &block)
+ callback_action(:delete, (block_given? ? block : callback_or_path))
+ end
+
+ private
+
+ def init_callbacks
+ do_nothing = lambda {|base, relative|}
+ @callbacks = Hash.new(do_nothing)
+ end
+
+ def callback_action(type, arg=nil)
+ if arg.is_a?(Proc)
+ set_callback(type, arg)
+ elsif arg.nil?
+ get_callback(type)
+ else
+ run_callback(type, arg)
+ end
+ end
+
+ def set_callback(type, arg)
+ raise ArgumentError, "Proc expected" unless arg.is_a?(Proc)
+ @callbacks[type] = arg
+ end
+
+ def get_callback(type)
+ @callbacks[type]
+ end
+
+ def run_callback(type, arg)
+ base, relative = split_path(arg)
+
+ begin
+ @callbacks[type].call(base, relative)
+ rescue Exception => e
+ raise FSSM::CallbackError, "#{type} - #{base.join(relative)}: #{e.message}", e.backtrace
+ end
+ end
+
+ def split_path(path)
+ path = Pathname.for(path)
+ [@path, (path.relative? ? path : path.relative_path_from(@path))]
+ end
+
+ def set_path(path)
+ path = Pathname.for(path)
+ raise FSSM::FileNotFoundError, "#{path}" unless path.exist?
+ @path = path.realpath
+ end
+
+ def set_glob(glob)
+ @glob = glob.is_a?(Array) ? glob : [glob]
+ end
+end
diff --git a/vendor/gems/gems/compass-0.8.17/lib/vendor/fssm/state.rb b/vendor/gems/gems/compass-0.8.17/lib/vendor/fssm/state.rb
new file mode 100755
index 00000000..50fd1f71
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/lib/vendor/fssm/state.rb
@@ -0,0 +1,54 @@
+require 'yaml'
+class FSSM::State
+ def initialize(path)
+ @path = path
+ @cache = FSSM::Tree::Cache.new
+ end
+
+ def refresh(base=nil, skip_callbacks=false)
+ previous, current = recache(base || @path.to_pathname)
+
+ unless skip_callbacks
+ deleted(previous, current)
+ created(previous, current)
+ modified(previous, current)
+ end
+ end
+
+ private
+
+ def created(previous, current)
+ (current.keys - previous.keys).each {|created| @path.create(created)}
+ end
+
+ def deleted(previous, current)
+ (previous.keys - current.keys).each {|deleted| @path.delete(deleted)}
+ end
+
+ def modified(previous, current)
+ (current.keys & previous.keys).each do |file|
+ @path.update(file) if (current[file] <=> previous[file]) != 0
+ end
+ end
+
+ def recache(base)
+ base = Pathname.for(base)
+ previous = @cache.files
+ snapshot(base)
+ current = @cache.files
+ [previous, current]
+ end
+
+ def snapshot(base)
+ base = Pathname.for(base)
+ @cache.unset(base)
+ @path.glob.each {|glob| add_glob(base, glob)}
+ end
+
+ def add_glob(base, glob)
+ Pathname.glob(base.join(glob)).each do |fn|
+ @cache.set(fn)
+ end
+ end
+
+end
diff --git a/vendor/gems/gems/compass-0.8.17/lib/vendor/fssm/support.rb b/vendor/gems/gems/compass-0.8.17/lib/vendor/fssm/support.rb
new file mode 100755
index 00000000..68128b60
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/lib/vendor/fssm/support.rb
@@ -0,0 +1,22 @@
+module FSSM::Support
+ class << self
+ def backend
+ (mac? && carbon_core?) ? 'FSEvents' : 'Polling'
+ end
+
+ def mac?
+ @@mac ||= RUBY_PLATFORM =~ /darwin/i
+ end
+
+ def carbon_core?
+ @@carbon_core ||= begin
+ require 'osx/foundation'
+ OSX.require_framework '/System/Library/Frameworks/CoreServices.framework/Frameworks/CarbonCore.framework'
+ true
+ rescue LoadError
+ false
+ end
+ end
+
+ end
+end
diff --git a/vendor/gems/gems/compass-0.8.17/lib/vendor/fssm/tree.rb b/vendor/gems/gems/compass-0.8.17/lib/vendor/fssm/tree.rb
new file mode 100755
index 00000000..449d11d8
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/lib/vendor/fssm/tree.rb
@@ -0,0 +1,176 @@
+module FSSM::Tree
+ module NodeBase
+ def initialize
+ @children = {}
+ end
+
+ protected
+
+ def child(segment)
+ @children["#{segment}"]
+ end
+
+ def child!(segment)
+ (@children["#{segment}"] ||= Node.new)
+ end
+
+ def has_child?(segment)
+ @children.has_key?("#{segment}")
+ end
+
+ def remove_child(segment)
+ @children.delete("#{segment}")
+ end
+
+ def remove_children
+ @children.clear
+ end
+ end
+
+ module NodeEnumerable
+ include NodeBase
+ include Enumerable
+
+ def each(prefix=nil, &block)
+ @children.each do |segment, node|
+ cprefix = prefix ?
+ Pathname.for(prefix).join(segment) :
+ Pathname.for(segment)
+ block.call(cprefix, node)
+ node.each(cprefix, &block)
+ end
+ end
+ end
+
+ module NodeInsertion
+ include NodeBase
+
+ def unset(path)
+ key = key_segments(path)
+
+ if key.empty?
+ remove_children
+ return nil
+ end
+
+ segment = key.pop
+ node = descendant(key)
+
+ return unless node
+
+ node.remove_child(segment)
+
+ nil
+ end
+
+ def set(path)
+ node = descendant!(path)
+ node.from_path(path).mtime
+ end
+
+ protected
+
+ def key_segments(key)
+ return key if key.is_a?(Array)
+ Pathname.for(key).segments
+ end
+
+ def descendant(path)
+ recurse(path, false)
+ end
+
+ def descendant!(path)
+ recurse(path, true)
+ end
+
+ def recurse(key, create=false)
+ key = key_segments(key)
+ node = self
+
+ until key.empty?
+ segment = key.shift
+ node = create ? node.child!(segment) : node.child(segment)
+ return nil unless node
+ end
+
+ node
+ end
+ end
+
+ module CacheDebug
+ def set(path)
+ FSSM.dbg("Cache#set(#{path})")
+ super
+ end
+
+ def unset(path)
+ FSSM.dbg("Cache#unset(#{path})")
+ super
+ end
+
+ def ftype(ft)
+ FSSM.dbg("Cache#ftype(#{ft})")
+ super
+ end
+ end
+
+ class Node
+ include NodeBase
+ include NodeEnumerable
+
+ attr_accessor :mtime
+ attr_accessor :ftype
+
+ def <=>(other)
+ return unless other.is_a?(::FSSM::Tree::Node)
+ self.mtime <=> other.mtime
+ end
+
+ def from_path(path)
+ path = Pathname.for(path)
+ @ftype = path.ftype
+ # this handles bad symlinks without failing. why handle bad symlinks at
+ # all? well, we could still be interested in their creation and deletion.
+ @mtime = path.symlink? ? Time.at(0) : path.mtime
+ self
+ end
+ end
+
+ class Cache
+ include NodeBase
+ include NodeEnumerable
+ include NodeInsertion
+ include CacheDebug if $DEBUG
+
+ def set(path)
+ # all paths set from this level need to be absolute
+ # realpath will fail on broken links
+ path = Pathname.for(path).expand_path
+ super(path)
+ end
+
+ def files
+ ftype('file')
+ end
+
+ def directories
+ ftype('directory')
+ end
+
+ def links
+ ftype('link')
+ end
+ alias symlinks links
+
+ private
+
+ def ftype(ft)
+ inject({}) do |hash, entry|
+ path, node = entry
+ hash["#{path}"] = node.mtime if node.ftype == ft
+ hash
+ end
+ end
+ end
+
+end
diff --git a/vendor/gems/gems/compass-0.8.17/test/command_line_helper.rb b/vendor/gems/gems/compass-0.8.17/test/command_line_helper.rb
new file mode 100755
index 00000000..029994c3
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/test/command_line_helper.rb
@@ -0,0 +1,102 @@
+module Compass::CommandLineHelper
+ def compass(*arguments)
+ options = arguments.last.is_a?(Hash) ? arguments.pop : {}
+ options[:wait] = 0.25
+ if block_given?
+ responder = Responder.new
+ yield responder
+ IO.popen("-", "w+") do |io|
+ if io
+ #parent process
+ output = ""
+ eof_at = nil
+ while !eof_at || (Time.now - eof_at < options[:wait])
+ if io.eof?
+ eof_at ||= Time.now
+ sleep 0.1
+ else
+ eof_at = nil
+ timeout(1) do
+ output << io.readpartial(1024)
+ end
+ prompt = output.split("\n").last
+ if response = responder.response_for(prompt)
+ io.puts response
+ end
+ end
+ end
+ responder.assert_required_responses!
+ @last_result = output
+ else
+ #child process
+ execute *arguments
+ end
+ end
+ else
+ @last_result = capture_output do
+ execute *arguments
+ end
+ end
+ rescue Timeout::Error
+ fail "Read from child process timed out"
+ end
+
+ class Responder
+ Response = Struct.new(:prompt, :text, :required, :responded)
+ def initialize
+ @responses = []
+ end
+ def respond_to(prompt, options = {})
+ @responses << Response.new(prompt, options[:with], options[:required])
+ end
+ def response_for(prompt)
+ response = @responses.detect{|r| r.prompt == prompt}
+ if response
+ response.responded = true
+ response.text
+ end
+ end
+ def assert_required_responses!
+ @responses.each do |response|
+ if response.required && !response.responded
+ raise "Prompt not encountered: \"#{response.prompt}\""
+ end
+ end
+ end
+ end
+
+ def assert_action_performed(action, path)
+ actions_found = []
+ @last_result.split("\n").each do |line|
+ line = line.split
+ return if line.first == action.to_s && line.last == path
+ actions_found << line.first if line.last == path
+ end
+ message = "Action #{action.inspect} was not performed on: #{path}."
+ message += "The following actions were performed: #{actions_found.join(", ")}" if actions_found.any?
+ puts @last_result
+ fail message
+ end
+
+ def within_tmp_directory(dir = "tmp")
+ d = absolutize(dir)
+ FileUtils.mkdir_p(d)
+ Dir.chdir(d) do
+ yield
+ end
+ ensure
+ FileUtils.rm_rf(d)
+ end
+
+ def capture_output
+ real_stdout, $stdout = $stdout, StringIO.new
+ yield
+ $stdout.string
+ ensure
+ $stdout = real_stdout
+ end
+
+ def execute(*arguments)
+ Compass::Exec::Compass.new(arguments).run!
+ end
+end
\ No newline at end of file
diff --git a/vendor/gems/gems/compass-0.8.17/test/command_line_test.rb b/vendor/gems/gems/compass-0.8.17/test/command_line_test.rb
new file mode 100755
index 00000000..8e621deb
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/test/command_line_test.rb
@@ -0,0 +1,66 @@
+require File.dirname(__FILE__)+'/test_helper'
+require 'fileutils'
+require 'compass'
+require 'compass/exec'
+require 'timeout'
+
+class CommandLineTest < Test::Unit::TestCase
+ include Compass::TestCaseHelper
+ include Compass::CommandLineHelper
+
+ def teardown
+ Compass.configuration.reset!
+ end
+
+ def test_print_version
+ compass "-vq"
+ assert_match /\d+\.\d+\.\d+( [0-9a-f]+)?/, @last_result
+ end
+
+ def test_list_frameworks
+ compass "--list-frameworks"
+ assert_equal(%w(blueprint compass yui), @last_result.split.sort)
+ end
+
+ def test_basic_install
+ within_tmp_directory do
+ compass "basic"
+ assert File.exists?("basic/src/screen.sass")
+ assert File.exists?("basic/stylesheets/screen.css")
+ assert_action_performed :directory, "basic/"
+ assert_action_performed :create, "basic/src/screen.sass"
+ assert_action_performed :compile, "basic/src/screen.sass"
+ assert_action_performed :create, "basic/stylesheets/screen.css"
+ end
+ end
+
+ def test_framework_installs
+ Compass::Frameworks::ALL.each do |framework|
+ within_tmp_directory do
+ compass *%W(--framework #{framework.name} #{framework.name}_project)
+ assert File.exists?("#{framework.name}_project/src/screen.sass")
+ assert File.exists?("#{framework.name}_project/stylesheets/screen.css")
+ assert_action_performed :directory, "#{framework.name}_project/"
+ assert_action_performed :create, "#{framework.name}_project/src/screen.sass"
+ assert_action_performed :compile, "#{framework.name}_project/src/screen.sass"
+ assert_action_performed :create, "#{framework.name}_project/stylesheets/screen.css"
+ end
+ end
+ end
+
+ def test_basic_update
+ within_tmp_directory do
+ compass "basic"
+ Dir.chdir "basic" do
+ # basic update with timestamp caching
+ compass
+ assert_action_performed :unchanged, "src/screen.sass"
+ # basic update with force option set
+ compass "--force"
+ assert_action_performed :compile, "src/screen.sass"
+ assert_action_performed :identical, "stylesheets/screen.css"
+ end
+ end
+ end
+
+end
\ No newline at end of file
diff --git a/vendor/gems/gems/compass-0.8.17/test/compass_test.rb b/vendor/gems/gems/compass-0.8.17/test/compass_test.rb
new file mode 100755
index 00000000..89e3f988
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/test/compass_test.rb
@@ -0,0 +1,141 @@
+require File.dirname(__FILE__)+'/test_helper'
+require 'fileutils'
+require 'compass'
+
+class CompassTest < Test::Unit::TestCase
+ include Compass::TestCaseHelper
+ def setup
+ Compass.configuration.reset!
+ end
+
+ def teardown
+ teardown_fixtures :blueprint, :yui, :empty, :compass, :image_urls
+ end
+
+ def teardown_fixtures(*project_names)
+ project_names.each do |project_name|
+ FileUtils.rm_rf tempfile_path(project_name)
+ end
+ end
+
+ def test_empty_project
+ # With no sass files, we should have no css files.
+ within_project(:empty) do |proj|
+ return unless proj.css_path && File.exists?(proj.css_path)
+ Dir.new(proj.css_path).each do |f|
+ fail "This file should not have been generated: #{f}" unless f == "." || f == ".."
+ end
+ end
+ end
+
+ def test_blueprint
+ within_project(:blueprint) do |proj|
+ each_css_file(proj.css_path) do |css_file|
+ assert_no_errors css_file, :blueprint
+ end
+ assert_renders_correctly :typography
+ end
+ end
+
+ def test_yui
+ within_project('yui') do |proj|
+ each_css_file(proj.css_path) do |css_file|
+ assert_no_errors css_file, 'yui'
+ end
+ assert_renders_correctly :mixins
+ end
+ end
+
+ def test_compass
+ within_project('compass') do |proj|
+ each_css_file(proj.css_path) do |css_file|
+ assert_no_errors css_file, 'compass'
+ end
+ assert_renders_correctly :reset, :layout, :utilities
+ end
+ end
+
+ def test_image_urls
+ within_project('image_urls') do |proj|
+ each_css_file(proj.css_path) do |css_file|
+ assert_no_errors css_file, 'image_urls'
+ end
+ assert_renders_correctly :screen
+ end
+ end
+
+private
+ def assert_no_errors(css_file, project_name)
+ file = css_file[(tempfile_path(project_name).size+1)..-1]
+ msg = "Syntax Error found in #{file}. Results saved into #{save_path(project_name)}/#{file}"
+ assert_equal 0, open(css_file).readlines.grep(/Sass::SyntaxError/).size, msg
+ end
+
+ def assert_renders_correctly(*arguments)
+ options = arguments.last.is_a?(Hash) ? arguments.pop : {}
+ for name in arguments
+ actual_result_file = "#{tempfile_path(@current_project)}/#{name}.css"
+ expected_result_file = "#{result_path(@current_project)}/#{name}.css"
+ actual_lines = File.read(actual_result_file).split("\n")
+ expected_lines = File.read(expected_result_file).split("\n")
+ expected_lines.zip(actual_lines).each_with_index do |pair, line|
+ message = "template: #{name}\nline: #{line + 1}"
+ assert_equal(pair.first, pair.last, message)
+ end
+ if expected_lines.size < actual_lines.size
+ assert(false, "#{actual_lines.size - expected_lines.size} Trailing lines found in #{actual_result_file}.css: #{actual_lines[expected_lines.size..-1].join('\n')}")
+ end
+ end
+ end
+
+ def within_project(project_name)
+ @current_project = project_name
+ Compass.configuration.parse(configuration_file(project_name)) if File.exists?(configuration_file(project_name))
+ Compass.configuration.project_path = project_path(project_name)
+ args = Compass.configuration.to_compiler_arguments(:logger => Compass::NullLogger.new)
+ if Compass.configuration.sass_path && File.exists?(Compass.configuration.sass_path)
+ compiler = Compass::Compiler.new *args
+ compiler.run
+ end
+ yield Compass.configuration
+ rescue
+ save_output(project_name)
+ raise
+ end
+
+ def each_css_file(dir)
+ Dir.glob("#{dir}/**/*.css").each do |css_file|
+ yield css_file
+ end
+ end
+
+ def save_output(dir)
+ FileUtils.rm_rf(save_path(dir))
+ FileUtils.cp_r(tempfile_path(dir), save_path(dir)) if File.exists?(tempfile_path(dir))
+ end
+
+ def project_path(project_name)
+ absolutize("fixtures/stylesheets/#{project_name}")
+ end
+
+ def configuration_file(project_name)
+ File.join(project_path(project_name), "config.rb")
+ end
+
+ def tempfile_path(project_name)
+ File.join(project_path(project_name), "tmp")
+ end
+
+ def template_path(project_name)
+ File.join(project_path(project_name), "sass")
+ end
+
+ def result_path(project_name)
+ File.join(project_path(project_name), "css")
+ end
+
+ def save_path(project_name)
+ File.join(project_path(project_name), "saved")
+ end
+
+end
\ No newline at end of file
diff --git a/vendor/gems/gems/compass-0.8.17/test/configuration_test.rb b/vendor/gems/gems/compass-0.8.17/test/configuration_test.rb
new file mode 100755
index 00000000..0191d9a6
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/test/configuration_test.rb
@@ -0,0 +1,118 @@
+require File.dirname(__FILE__)+'/test_helper'
+require 'compass'
+
+class ConfigurationTest < Test::Unit::TestCase
+
+ def setup
+ Compass.configuration.reset!
+ end
+
+ def test_parse_and_serialize
+ contents = <<-CONFIG
+ require 'compass'
+ # Require any additional compass plugins here.
+
+ project_type = :stand_alone
+ # Set this to the root of your project when deployed:
+ http_path = "/"
+ css_dir = "css"
+ sass_dir = "sass"
+ images_dir = "img"
+ javascripts_dir = "js"
+ output_style = :nested
+ # To enable relative paths to assets via compass helper functions. Uncomment:
+ # relative_assets = true
+ CONFIG
+
+ Compass.configuration.parse_string(contents, "test_parse")
+
+ assert_equal 'sass', Compass.configuration.sass_dir
+ assert_equal 'css', Compass.configuration.css_dir
+ assert_equal 'img', Compass.configuration.images_dir
+ assert_equal 'js', Compass.configuration.javascripts_dir
+
+ expected_lines = contents.split("\n").map{|l|l.strip}
+ actual_lines = Compass.configuration.serialize.split("\n").map{|l|l.strip}
+ assert_equal expected_lines, actual_lines
+ end
+
+ def test_serialization_fails_with_asset_host_set
+ contents = <<-CONFIG
+ asset_host do |path|
+ "http://example.com"
+ end
+ CONFIG
+
+ Compass.configuration.parse_string(contents, "test_serialization_fails_with_asset_host_set")
+
+ assert_raise Compass::Error do
+ Compass.configuration.serialize
+ end
+ end
+
+ def test_serialization_fails_with_asset_cache_buster_set
+ contents = <<-CONFIG
+ asset_cache_buster do |path|
+ "http://example.com"
+ end
+ CONFIG
+
+ Compass.configuration.parse_string(contents, "test_serialization_fails_with_asset_cache_buster_set")
+
+ assert_raise Compass::Error do
+ Compass.configuration.serialize
+ end
+ end
+
+ def test_additional_import_paths
+ contents = <<-CONFIG
+ http_path = "/"
+ project_path = "/home/chris/my_compass_project"
+ css_dir = "css"
+ additional_import_paths = ["../foo"]
+ add_import_path "/path/to/my/framework"
+ CONFIG
+
+ Compass.configuration.parse_string(contents, "test_additional_import_paths")
+
+ assert Compass.configuration.to_sass_engine_options[:load_paths].include?("/home/chris/my_compass_project/../foo")
+ assert Compass.configuration.to_sass_engine_options[:load_paths].include?("/path/to/my/framework"), Compass.configuration.to_sass_engine_options[:load_paths].inspect
+ assert_equal "/home/chris/my_compass_project/css/framework", Compass.configuration.to_sass_plugin_options[:template_location]["/path/to/my/framework"]
+ assert_equal "/home/chris/my_compass_project/css/foo", Compass.configuration.to_sass_plugin_options[:template_location]["/home/chris/my_compass_project/../foo"]
+
+ expected_serialization = < 'bar'}
+ CONFIG
+
+ Compass.configuration.parse_string(contents, "test_sass_options")
+
+ assert_equal 'bar', Compass.configuration.to_sass_engine_options[:foo]
+ assert_equal 'bar', Compass.configuration.to_sass_plugin_options[:foo]
+
+ expected_serialization = <"bar"}
+EXPECTED
+
+ assert_equal expected_serialization, Compass.configuration.serialize
+ end
+
+end
\ No newline at end of file
diff --git a/vendor/gems/gems/compass-0.8.17/test/fixtures/stylesheets/blueprint/config.rb b/vendor/gems/gems/compass-0.8.17/test/fixtures/stylesheets/blueprint/config.rb
new file mode 100755
index 00000000..1b3ad842
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/test/fixtures/stylesheets/blueprint/config.rb
@@ -0,0 +1,9 @@
+# Require any additional compass plugins here.
+project_type = :stand_alone
+css_dir = "tmp"
+sass_dir = "sass"
+images_dir = "images"
+output_style = :nested
+# To enable relative image paths using the images_url() function:
+# http_images_path = :relative
+http_images_path = "/images"
diff --git a/vendor/gems/gems/compass-0.8.17/test/fixtures/stylesheets/blueprint/css/typography.css b/vendor/gems/gems/compass-0.8.17/test/fixtures/stylesheets/blueprint/css/typography.css
new file mode 100755
index 00000000..53f7e26b
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/test/fixtures/stylesheets/blueprint/css/typography.css
@@ -0,0 +1,158 @@
+body {
+ line-height: 1.5;
+ font-family: Helvetica Neue, Arial, Helvetica, sans-serif;
+ color: #333333;
+ font-size: 75%; }
+
+h1 {
+ font-weight: normal;
+ color: #222222;
+ font-size: 3em;
+ line-height: 1;
+ margin-bottom: 0.5em; }
+ h1 img {
+ margin: 0; }
+
+h2 {
+ font-weight: normal;
+ color: #222222;
+ font-size: 2em;
+ margin-bottom: 0.75em; }
+
+h3 {
+ font-weight: normal;
+ color: #222222;
+ font-size: 1.5em;
+ line-height: 1;
+ margin-bottom: 1em; }
+
+h4 {
+ font-weight: normal;
+ color: #222222;
+ font-size: 1.2em;
+ line-height: 1.25;
+ margin-bottom: 1.25em; }
+
+h5 {
+ font-weight: normal;
+ color: #222222;
+ font-size: 1em;
+ font-weight: bold;
+ margin-bottom: 1.5em; }
+
+h6 {
+ font-weight: normal;
+ color: #222222;
+ font-size: 1em;
+ font-weight: bold; }
+
+h2 img, h3 img, h4 img, h5 img, h6 img {
+ margin: 0; }
+
+p {
+ margin: 0 0 1.5em; }
+ p img.left {
+ display: inline;
+ float: left;
+ margin: 1.5em 1.5em 1.5em 0;
+ padding: 0; }
+ p img.right {
+ display: inline;
+ float: right;
+ margin: 1.5em 0 1.5em 1.5em;
+ padding: 0; }
+
+a {
+ text-decoration: underline;
+ color: #000099; }
+ a:visited {
+ color: #000066; }
+ a:focus {
+ color: black; }
+ a:hover {
+ color: black; }
+ a:active {
+ color: #cc0099; }
+
+blockquote {
+ margin: 1.5em;
+ color: #666;
+ font-style: italic; }
+
+strong {
+ font-weight: bold; }
+
+em {
+ font-style: italic; }
+
+dfn {
+ font-style: italic;
+ font-weight: bold; }
+
+sup, sub {
+ line-height: 0; }
+
+abbr, acronym {
+ border-bottom: 1px dotted #666; }
+
+address {
+ margin: 0 0 1.5em;
+ font-style: italic; }
+
+del {
+ color: #666; }
+
+pre {
+ margin: 1.5em 0;
+ white-space: pre; }
+
+pre, code, tt {
+ font: 1em 'andale mono', 'lucida console', monospace;
+ line-height: 1.5; }
+
+li ul, li ol {
+ margin: 0 1.5em; }
+
+ul {
+ margin: 0 1.5em 1.5em 1.5em;
+ list-style-type: disc; }
+
+ol {
+ margin: 0 1.5em 1.5em 1.5em;
+ list-style-type: decimal; }
+
+dl {
+ margin: 0 0 1.5em 0; }
+ dl dt {
+ font-weight: bold; }
+
+dd {
+ margin-left: 1.5em; }
+
+table {
+ margin-bottom: 1.4em;
+ width: 100%; }
+
+th {
+ font-weight: bold; }
+
+thead th {
+ background: #c3d9ff; }
+
+th, td, caption {
+ padding: 4px 10px 4px 5px; }
+
+tr.even td {
+ background: #e5ecf9; }
+
+tfoot {
+ font-style: italic; }
+
+caption {
+ background: #eee; }
+
+.quiet {
+ color: #666666; }
+
+.loud {
+ color: #111111; }
diff --git a/vendor/gems/gems/compass-0.8.17/test/fixtures/stylesheets/blueprint/images/grid.png b/vendor/gems/gems/compass-0.8.17/test/fixtures/stylesheets/blueprint/images/grid.png
new file mode 100755
index 00000000..76aaa851
Binary files /dev/null and b/vendor/gems/gems/compass-0.8.17/test/fixtures/stylesheets/blueprint/images/grid.png differ
diff --git a/vendor/gems/gems/compass-0.8.17/test/fixtures/stylesheets/blueprint/sass/ie.sass b/vendor/gems/gems/compass-0.8.17/test/fixtures/stylesheets/blueprint/sass/ie.sass
new file mode 100755
index 00000000..cbd72ab5
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/test/fixtures/stylesheets/blueprint/sass/ie.sass
@@ -0,0 +1,3 @@
+@import blueprint/ie
+
++blueprint-ie
\ No newline at end of file
diff --git a/vendor/gems/gems/compass-0.8.17/test/fixtures/stylesheets/blueprint/sass/print.sass b/vendor/gems/gems/compass-0.8.17/test/fixtures/stylesheets/blueprint/sass/print.sass
new file mode 100755
index 00000000..493af468
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/test/fixtures/stylesheets/blueprint/sass/print.sass
@@ -0,0 +1,3 @@
+@import blueprint/print
+
++blueprint-print
\ No newline at end of file
diff --git a/vendor/gems/gems/compass-0.8.17/test/fixtures/stylesheets/blueprint/sass/screen.sass b/vendor/gems/gems/compass-0.8.17/test/fixtures/stylesheets/blueprint/sass/screen.sass
new file mode 100755
index 00000000..93ec4087
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/test/fixtures/stylesheets/blueprint/sass/screen.sass
@@ -0,0 +1,17 @@
+@import blueprint/screen
+@import compass/reset
+
++blueprint
+#main.container
+ #top
+ +column(24, true)
+ #middle
+ +column(24, true)
+ #left
+ +column(6)
+ #content
+ +column(12)
+ #right
+ +column(6, true)
+ #bottom
+ +column(24, true)
diff --git a/vendor/gems/gems/compass-0.8.17/test/fixtures/stylesheets/blueprint/sass/typography.sass b/vendor/gems/gems/compass-0.8.17/test/fixtures/stylesheets/blueprint/sass/typography.sass
new file mode 100755
index 00000000..13262468
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/test/fixtures/stylesheets/blueprint/sass/typography.sass
@@ -0,0 +1,3 @@
+@import blueprint/modules/typography.sass
+
++blueprint-typography
\ No newline at end of file
diff --git a/vendor/gems/gems/compass-0.8.17/test/fixtures/stylesheets/compass/config.rb b/vendor/gems/gems/compass-0.8.17/test/fixtures/stylesheets/compass/config.rb
new file mode 100755
index 00000000..1b3ad842
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/test/fixtures/stylesheets/compass/config.rb
@@ -0,0 +1,9 @@
+# Require any additional compass plugins here.
+project_type = :stand_alone
+css_dir = "tmp"
+sass_dir = "sass"
+images_dir = "images"
+output_style = :nested
+# To enable relative image paths using the images_url() function:
+# http_images_path = :relative
+http_images_path = "/images"
diff --git a/vendor/gems/gems/compass-0.8.17/test/fixtures/stylesheets/compass/css/layout.css b/vendor/gems/gems/compass-0.8.17/test/fixtures/stylesheets/compass/css/layout.css
new file mode 100755
index 00000000..95a69635
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/test/fixtures/stylesheets/compass/css/layout.css
@@ -0,0 +1,13 @@
+html, body {
+ height: 100%; }
+
+#layout {
+ min-height: 100%;
+ margin-bottom: -72px; }
+ #layout #layout_footer {
+ height: 72px; }
+
+#footer {
+ clear: both;
+ position: relative;
+ height: 72px; }
diff --git a/vendor/gems/gems/compass-0.8.17/test/fixtures/stylesheets/compass/css/print.css b/vendor/gems/gems/compass-0.8.17/test/fixtures/stylesheets/compass/css/print.css
new file mode 100755
index 00000000..3dceb843
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/test/fixtures/stylesheets/compass/css/print.css
@@ -0,0 +1,18 @@
+.noprint,
+.no-print {
+ display: none; }
+
+address.print-only, blockquote.print-only, center.print-only, dir.print-only, div.print-only, dd.print-only, dl.print-only, dt.print-only,
+fieldset.print-only, form.print-only, frameset.print-only, h1.print-only, h2.print-only, h3.print-only, h4.print-only, h5.print-only, h6.print-only, hr.print-only,
+isindex.print-only, li.print-only, menu.print-only, noframes.print-only, noscript.print-only, ol.print-only, p.print-only, pre.print-only,
+table.print-only, tbody.print-only, td.print-only, tfoot.print-only, th.print-only, thead.print-only, tr.print-only, ul.print-only {
+ display: block; }
+
+a.print-only, abbr.print-only, acronym.print-only, b.print-only, basefont.print-only, bdo.print-only, big.print-only, br.print-only, cite.print-only,
+code.print-only, dfn.print-only, em.print-only, font.print-only, i.print-only, img.print-only, input.print-only, kbd.print-only, label.print-only, q.print-only, s.print-only,
+samp.print-only, select.print-only, small.print-only, span.print-only, strike.print-only, strong.print-only, sub.print-only, sup.print-only,
+textarea.print-only, tt.print-only, u.print-only, var.print-only {
+ display: inline; }
+
+.print-only {
+ display: none; }
diff --git a/vendor/gems/gems/compass-0.8.17/test/fixtures/stylesheets/compass/css/reset.css b/vendor/gems/gems/compass-0.8.17/test/fixtures/stylesheets/compass/css/reset.css
new file mode 100755
index 00000000..e778b379
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/test/fixtures/stylesheets/compass/css/reset.css
@@ -0,0 +1,60 @@
+html, body, div, span, applet, object, iframe,
+h1, h2, h3, h4, h5, h6, p, blockquote, pre,
+a, abbr, acronym, address, big, cite, code,
+del, dfn, em, font, img, ins, kbd, q, s, samp,
+small, strike, strong, sub, sup, tt, var,
+dl, dt, dd, ol, ul, li,
+fieldset, form, label, legend,
+table, caption, tbody, tfoot, thead, tr, th, td {
+ margin: 0;
+ padding: 0;
+ border: 0;
+ outline: 0;
+ font-weight: inherit;
+ font-style: inherit;
+ font-size: 100%;
+ font-family: inherit;
+ vertical-align: baseline; }
+
+*:focus {
+ outline: 0; }
+
+body {
+ line-height: 1em;
+ color: black;
+ background: #fff; }
+
+ol, ul {
+ list-style: none; }
+
+/* tables still need 'cellspacing="0"' in the markup */
+table {
+ border-collapse: separate;
+ border-spacing: 0;
+ vertical-align: middle; }
+
+caption, th, td {
+ text-align: left;
+ font-weight: normal;
+ vertical-align: middle; }
+
+q, blockquote {
+ quotes: "" ""; }
+ q:before, q:after, blockquote:before, blockquote:after {
+ content: ""; }
+
+img a {
+ border: none; }
+
+.unregistered-only, .registered-only {
+ display: none; }
+
+body.registered a.registered-only, body.registered abbr.registered-only, body.registered acronym.registered-only, body.registered b.registered-only, body.registered basefont.registered-only, body.registered bdo.registered-only, body.registered big.registered-only, body.registered br.registered-only, body.registered cite.registered-only, body.registered code.registered-only, body.registered dfn.registered-only, body.registered em.registered-only, body.registered font.registered-only, body.registered i.registered-only, body.registered img.registered-only, body.registered input.registered-only, body.registered kbd.registered-only, body.registered label.registered-only, body.registered q.registered-only, body.registered s.registered-only, body.registered samp.registered-only, body.registered select.registered-only, body.registered small.registered-only, body.registered span.registered-only, body.registered strike.registered-only, body.registered strong.registered-only, body.registered sub.registered-only, body.registered sup.registered-only, body.registered textarea.registered-only, body.registered tt.registered-only, body.registered u.registered-only, body.registered var.registered-only {
+ display: inline; }
+body.registered address.registered-only, body.registered blockquote.registered-only, body.registered center.registered-only, body.registered dir.registered-only, body.registered div.registered-only, body.registered dd.registered-only, body.registered dl.registered-only, body.registered dt.registered-only, body.registered fieldset.registered-only, body.registered form.registered-only, body.registered frameset.registered-only, body.registered h1.registered-only, body.registered h2.registered-only, body.registered h3.registered-only, body.registered h4.registered-only, body.registered h5.registered-only, body.registered h6.registered-only, body.registered hr.registered-only, body.registered isindex.registered-only, body.registered menu.registered-only, body.registered noframes.registered-only, body.registered noscript.registered-only, body.registered ol.registered-only, body.registered p.registered-only, body.registered pre.registered-only, body.registered ul.registered-only {
+ display: block; }
+
+body.unregistered a.unregistered-only, body.unregistered abbr.unregistered-only, body.unregistered acronym.unregistered-only, body.unregistered b.unregistered-only, body.unregistered basefont.unregistered-only, body.unregistered bdo.unregistered-only, body.unregistered big.unregistered-only, body.unregistered br.unregistered-only, body.unregistered cite.unregistered-only, body.unregistered code.unregistered-only, body.unregistered dfn.unregistered-only, body.unregistered em.unregistered-only, body.unregistered font.unregistered-only, body.unregistered i.unregistered-only, body.unregistered img.unregistered-only, body.unregistered input.unregistered-only, body.unregistered kbd.unregistered-only, body.unregistered label.unregistered-only, body.unregistered q.unregistered-only, body.unregistered s.unregistered-only, body.unregistered samp.unregistered-only, body.unregistered select.unregistered-only, body.unregistered small.unregistered-only, body.unregistered span.unregistered-only, body.unregistered strike.unregistered-only, body.unregistered strong.unregistered-only, body.unregistered sub.unregistered-only, body.unregistered sup.unregistered-only, body.unregistered textarea.unregistered-only, body.unregistered tt.unregistered-only, body.unregistered u.unregistered-only, body.unregistered var.unregistered-only {
+ display: inline; }
+body.unregistered address.unregistered-only, body.unregistered blockquote.unregistered-only, body.unregistered center.unregistered-only, body.unregistered dir.unregistered-only, body.unregistered div.unregistered-only, body.unregistered dd.unregistered-only, body.unregistered dl.unregistered-only, body.unregistered dt.unregistered-only, body.unregistered fieldset.unregistered-only, body.unregistered form.unregistered-only, body.unregistered frameset.unregistered-only, body.unregistered h1.unregistered-only, body.unregistered h2.unregistered-only, body.unregistered h3.unregistered-only, body.unregistered h4.unregistered-only, body.unregistered h5.unregistered-only, body.unregistered h6.unregistered-only, body.unregistered hr.unregistered-only, body.unregistered isindex.unregistered-only, body.unregistered menu.unregistered-only, body.unregistered noframes.unregistered-only, body.unregistered noscript.unregistered-only, body.unregistered ol.unregistered-only, body.unregistered p.unregistered-only, body.unregistered pre.unregistered-only, body.unregistered ul.unregistered-only {
+ display: block; }
\ No newline at end of file
diff --git a/vendor/gems/gems/compass-0.8.17/test/fixtures/stylesheets/compass/css/utilities.css b/vendor/gems/gems/compass-0.8.17/test/fixtures/stylesheets/compass/css/utilities.css
new file mode 100755
index 00000000..b8b12855
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/test/fixtures/stylesheets/compass/css/utilities.css
@@ -0,0 +1,17 @@
+.clearfix {
+ overflow: hidden;
+ display: inline-block; }
+ .clearfix {
+ display: block; }
+
+.pie-clearfix {
+ display: inline-block; }
+ .pie-clearfix:after {
+ content: " ";
+ display: block;
+ height: 0;
+ clear: both;
+ overflow: hidden;
+ visibility: hidden; }
+ .pie-clearfix {
+ display: block; }
diff --git a/vendor/gems/gems/compass-0.8.17/test/fixtures/stylesheets/compass/sass/layout.sass b/vendor/gems/gems/compass-0.8.17/test/fixtures/stylesheets/compass/sass/layout.sass
new file mode 100755
index 00000000..8d241235
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/test/fixtures/stylesheets/compass/sass/layout.sass
@@ -0,0 +1,3 @@
+@import compass/layout.sass
+
++sticky-footer(72px, "#layout", "#layout_footer", "#footer")
diff --git a/vendor/gems/gems/compass-0.8.17/test/fixtures/stylesheets/compass/sass/print.sass b/vendor/gems/gems/compass-0.8.17/test/fixtures/stylesheets/compass/sass/print.sass
new file mode 100755
index 00000000..34d4cb3b
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/test/fixtures/stylesheets/compass/sass/print.sass
@@ -0,0 +1,5 @@
+@import compass/utilities/print.sass
+
++print-utilities
+
++print-utilities("screen")
\ No newline at end of file
diff --git a/vendor/gems/gems/compass-0.8.17/test/fixtures/stylesheets/compass/sass/reset.sass b/vendor/gems/gems/compass-0.8.17/test/fixtures/stylesheets/compass/sass/reset.sass
new file mode 100755
index 00000000..3293dc6c
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/test/fixtures/stylesheets/compass/sass/reset.sass
@@ -0,0 +1,10 @@
+@import compass/reset.sass
+
+// Turn off the display for both of these classes
+.unregistered-only, .registered-only
+ :display none
+// Now turn only one of them back on depending on some other context.
+body.registered
+ +reset-display(".registered-only")
+body.unregistered
+ +reset-display(".unregistered-only")
diff --git a/vendor/gems/gems/compass-0.8.17/test/fixtures/stylesheets/compass/sass/utilities.sass b/vendor/gems/gems/compass-0.8.17/test/fixtures/stylesheets/compass/sass/utilities.sass
new file mode 100755
index 00000000..1e01b659
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/test/fixtures/stylesheets/compass/sass/utilities.sass
@@ -0,0 +1,6 @@
+@import compass/utilities.sass
+
+.clearfix
+ +clearfix
+.pie-clearfix
+ +pie-clearfix
diff --git a/vendor/gems/gems/compass-0.8.17/test/fixtures/stylesheets/image_urls/config.rb b/vendor/gems/gems/compass-0.8.17/test/fixtures/stylesheets/image_urls/config.rb
new file mode 100755
index 00000000..c3381dac
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/test/fixtures/stylesheets/image_urls/config.rb
@@ -0,0 +1,17 @@
+# Require any additional compass plugins here.
+project_type = :stand_alone
+css_dir = "tmp"
+sass_dir = "sass"
+images_dir = "images"
+output_style = :compact
+# To enable relative image paths using the images_url() function:
+# http_images_path = :relative
+http_images_path = "/images"
+
+asset_cache_buster do |path, file|
+ "busted=true"
+end
+
+asset_host do |path|
+ "http://assets%d.example.com" % (path.hash % 4)
+end
diff --git a/vendor/gems/gems/compass-0.8.17/test/fixtures/stylesheets/image_urls/css/screen.css b/vendor/gems/gems/compass-0.8.17/test/fixtures/stylesheets/image_urls/css/screen.css
new file mode 100755
index 00000000..c7de0c65
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/test/fixtures/stylesheets/image_urls/css/screen.css
@@ -0,0 +1,3 @@
+.showgrid { background-image: url('http://assets2.example.com/images/grid.png?busted=true'); }
+
+.inlinegrid { background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAUEAYAAACv1qP4AAAABmJLR0T///////8JWPfcAAAACXBIWXMAAABIAAAASABGyWs+AAAAZ0lEQVRYw+3QwQ2AIBAFUTEUwI3+uzN7gDscsIgxEuO8An52J11X73OudfxMraXkzHfO3Y98nQEhA0IGhAwIGRAyIGRAyICQASEDQgaEDAgZEDIgZEDIgJABoZzSGK3tPuN9ERFP7Nw4fg+c5g8V1wAAAABJRU5ErkJggg=='); }
diff --git a/vendor/gems/gems/compass-0.8.17/test/fixtures/stylesheets/image_urls/images/grid.png b/vendor/gems/gems/compass-0.8.17/test/fixtures/stylesheets/image_urls/images/grid.png
new file mode 100755
index 00000000..76aaa851
Binary files /dev/null and b/vendor/gems/gems/compass-0.8.17/test/fixtures/stylesheets/image_urls/images/grid.png differ
diff --git a/vendor/gems/gems/compass-0.8.17/test/fixtures/stylesheets/image_urls/sass/screen.sass b/vendor/gems/gems/compass-0.8.17/test/fixtures/stylesheets/image_urls/sass/screen.sass
new file mode 100755
index 00000000..75c55c4b
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/test/fixtures/stylesheets/image_urls/sass/screen.sass
@@ -0,0 +1,6 @@
+.showgrid
+ background-image= image_url("grid.png")
+
+.inlinegrid
+ background-image= inline_image("grid.png")
+
diff --git a/vendor/gems/gems/compass-0.8.17/test/fixtures/stylesheets/yui/config.rb b/vendor/gems/gems/compass-0.8.17/test/fixtures/stylesheets/yui/config.rb
new file mode 100755
index 00000000..1b3ad842
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/test/fixtures/stylesheets/yui/config.rb
@@ -0,0 +1,9 @@
+# Require any additional compass plugins here.
+project_type = :stand_alone
+css_dir = "tmp"
+sass_dir = "sass"
+images_dir = "images"
+output_style = :nested
+# To enable relative image paths using the images_url() function:
+# http_images_path = :relative
+http_images_path = "/images"
diff --git a/vendor/gems/gems/compass-0.8.17/test/fixtures/stylesheets/yui/css/mixins.css b/vendor/gems/gems/compass-0.8.17/test/fixtures/stylesheets/yui/css/mixins.css
new file mode 100755
index 00000000..7037c3ef
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/test/fixtures/stylesheets/yui/css/mixins.css
@@ -0,0 +1,13 @@
+.font-size-26px {
+ font-size: 200%; }
+
+.font-size-baseline {
+ font-size: 300%; }
+
+.em-sizing {
+ width: 1em;
+ margin: 9em; }
+
+.em-sizing-hack {
+ width: 1em;
+ *width: 0.975em; }
\ No newline at end of file
diff --git a/vendor/gems/gems/compass-0.8.17/test/fixtures/stylesheets/yui/sass/base.sass b/vendor/gems/gems/compass-0.8.17/test/fixtures/stylesheets/yui/sass/base.sass
new file mode 100755
index 00000000..8c0bc40b
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/test/fixtures/stylesheets/yui/sass/base.sass
@@ -0,0 +1,3 @@
+@import yui/modules/base.sass
+
++yui-base
\ No newline at end of file
diff --git a/vendor/gems/gems/compass-0.8.17/test/fixtures/stylesheets/yui/sass/fonts.sass b/vendor/gems/gems/compass-0.8.17/test/fixtures/stylesheets/yui/sass/fonts.sass
new file mode 100755
index 00000000..a73ec8e9
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/test/fixtures/stylesheets/yui/sass/fonts.sass
@@ -0,0 +1,3 @@
+@import yui/modules/fonts.sass
+
++yui-base-fonts
\ No newline at end of file
diff --git a/vendor/gems/gems/compass-0.8.17/test/fixtures/stylesheets/yui/sass/grids.sass b/vendor/gems/gems/compass-0.8.17/test/fixtures/stylesheets/yui/sass/grids.sass
new file mode 100755
index 00000000..e751fae8
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/test/fixtures/stylesheets/yui/sass/grids.sass
@@ -0,0 +1,3 @@
+@import yui/modules/grids.sass
+
++yui-grids
\ No newline at end of file
diff --git a/vendor/gems/gems/compass-0.8.17/test/fixtures/stylesheets/yui/sass/mixins.sass b/vendor/gems/gems/compass-0.8.17/test/fixtures/stylesheets/yui/sass/mixins.sass
new file mode 100755
index 00000000..d0dbea12
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/test/fixtures/stylesheets/yui/sass/mixins.sass
@@ -0,0 +1,16 @@
+@import yui/modules/fonts.sass
+@import yui/modules/grids.sass
+
+.font-size-26px
+ +font-size(26px)
+
+.font-size-baseline
+ +font-size(30px, 10px)
+
+.em-sizing
+ +em-size("width", 13px)
+ +em-size("margin", 99px, 11px)
+
+.em-sizing-hack
+ +em-size-hacked("width", 13px)
+
diff --git a/vendor/gems/gems/compass-0.8.17/test/rails_integration_test.rb b/vendor/gems/gems/compass-0.8.17/test/rails_integration_test.rb
new file mode 100755
index 00000000..df144c7a
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/test/rails_integration_test.rb
@@ -0,0 +1,83 @@
+require File.join(File.dirname(__FILE__),'test_helper')
+require 'fileutils'
+require 'compass'
+require 'compass/exec'
+require 'timeout'
+
+class RailsIntegrationTest < Test::Unit::TestCase
+ include Compass::TestCaseHelper
+ include Compass::CommandLineHelper
+
+ def setup
+ Compass.configuration.reset!
+ end
+
+ def test_rails_install
+ within_tmp_directory do
+ generate_rails_app_directories("compass_rails")
+ Dir.chdir "compass_rails" do
+ compass("--rails", '--trace', ".") do |responder|
+ responder.respond_to "Is this OK? (Y/n) ", :with => "Y", :required => true
+ responder.respond_to "Emit compiled stylesheets to public/stylesheets/compiled/? (Y/n) ", :with => "Y", :required => true
+ end
+ # puts ">>>#{@last_result}<<<"
+ assert_action_performed :create, "./app/stylesheets/screen.sass"
+ assert_action_performed :create, "./config/initializers/compass.rb"
+ end
+ end
+ rescue LoadError
+ puts "Skipping rails test. Couldn't Load rails"
+ end
+
+ def test_rails_install_with_no_dialog
+ within_tmp_directory do
+ generate_rails_app_directories("compass_rails")
+ Dir.chdir "compass_rails" do
+ compass(*%w(--rails --trace --sass-dir app/stylesheets --css-dir public/stylesheets/compiled .))
+ assert_action_performed :create, "./app/stylesheets/screen.sass"
+ assert_action_performed :create, "./config/initializers/compass.rb"
+ end
+ end
+ rescue LoadError
+ puts "Skipping rails test. Couldn't Load rails"
+ end
+
+
+ def generate_rails_app_directories(name)
+ Dir.mkdir name
+ Dir.mkdir File.join(name, "config")
+ Dir.mkdir File.join(name, "config", "initializers")
+ end
+
+ # Generate a rails application without polluting our current set of requires
+ # with the rails libraries. This will allow testing against multiple versions of rails
+ # by manipulating the load path.
+ def generate_rails_app(name)
+ if pid = fork
+ Process.wait(pid)
+ if $?.exitstatus == 2
+ raise LoadError, "Couldn't load rails"
+ elsif $?.exitstatus != 0
+ raise "Failed to generate rails application."
+ end
+ else
+ begin
+ require 'rails/version'
+ require 'rails_generator'
+ require 'rails_generator/scripts/generate'
+ Rails::Generator::Base.use_application_sources!
+ capture_output do
+ Rails::Generator::Base.logger = Rails::Generator::SimpleLogger.new $stdout
+ Rails::Generator::Scripts::Generate.new.run([name], :generator => 'app')
+ end
+ rescue LoadError
+ Kernel.exit(2)
+ rescue => e
+ $stderr.puts e
+ Kernel.exit!(1)
+ end
+ Kernel.exit!(0)
+ end
+ end
+
+end
\ No newline at end of file
diff --git a/vendor/gems/gems/compass-0.8.17/test/sass_extensions_test.rb b/vendor/gems/gems/compass-0.8.17/test/sass_extensions_test.rb
new file mode 100755
index 00000000..98136c9a
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/test/sass_extensions_test.rb
@@ -0,0 +1,31 @@
+require File.dirname(__FILE__)+'/test_helper'
+
+class SassExtensionsTest < Test::Unit::TestCase
+ def test_simple
+ assert_equal "a b", nest("a", "b")
+ end
+ def test_left_side_expansion
+ assert_equal "a c, b c", nest("a, b", "c")
+ end
+ def test_right_side_expansion
+ assert_equal "a b, a c", nest("a", "b, c")
+ end
+ def test_both_sides_expansion
+ assert_equal "a c, a d, b c, b d", nest("a, b", "c, d")
+ end
+ def test_three_selectors_expansion
+ assert_equal "a b, a c, a d", nest("a", "b, c, d")
+ end
+ def test_third_argument_expansion
+ assert_equal "a b e, a b f, a c e, a c f, a d e, a d f", nest("a", "b, c, d", "e, f")
+ end
+
+protected
+ def evaluation_content(options)
+ Sass::Script::Functions::EvaluationContext.new(options)
+ end
+ def nest(*arguments)
+ options = arguments.last.is_a?(Hash) ? arguments.pop : Hash.new
+ evaluation_content(options).nest(*arguments.map{|a| Sass::Script::String.new(a)}).to_s
+ end
+end
\ No newline at end of file
diff --git a/vendor/gems/gems/compass-0.8.17/test/test_case_helper.rb b/vendor/gems/gems/compass-0.8.17/test/test_case_helper.rb
new file mode 100755
index 00000000..3c4f95e0
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/test/test_case_helper.rb
@@ -0,0 +1,13 @@
+module Compass
+ module TestCaseHelper
+ def absolutize(path)
+ if path.blank?
+ File.dirname(__FILE__)
+ elsif path[0] == ?/
+ "#{File.dirname(__FILE__)}#{path}"
+ else
+ "#{File.dirname(__FILE__)}/#{path}"
+ end
+ end
+ end
+end
diff --git a/vendor/gems/gems/compass-0.8.17/test/test_helper.rb b/vendor/gems/gems/compass-0.8.17/test/test_helper.rb
new file mode 100755
index 00000000..30ee1245
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/test/test_helper.rb
@@ -0,0 +1,21 @@
+need_gems = false
+
+# allows testing with edge Haml by creating a test/haml symlink
+linked_haml = File.dirname(__FILE__) + '/haml'
+
+if File.exists?(linked_haml) && !$:.include?(linked_haml + '/lib')
+ puts "[ using linked Haml ]"
+ $:.unshift linked_haml + '/lib'
+ require 'sass'
+else
+ need_gems = true
+end
+
+require 'rubygems' if need_gems
+
+require 'compass'
+
+require 'test/unit'
+
+require File.join(File.dirname(__FILE__), 'test_case_helper')
+require File.join(File.dirname(__FILE__), 'command_line_helper')
diff --git a/vendor/gems/gems/compass-0.8.17/test/test_rails_helper.rb b/vendor/gems/gems/compass-0.8.17/test/test_rails_helper.rb
new file mode 100755
index 00000000..6cbb80f2
--- /dev/null
+++ b/vendor/gems/gems/compass-0.8.17/test/test_rails_helper.rb
@@ -0,0 +1,20 @@
+# XXX This file isn't in use at the moment, but will be used to help test
+# XXX deep rails integration of compass features.
+need_gems = false
+
+# allows testing with edge Rails by creating a test/rails symlink
+RAILS_ROOT = linked_rails = File.dirname(__FILE__) + '/rails'
+RAILS_ENV = 'test'
+
+if File.exists?(linked_rails) && !$:.include?(linked_rails + '/activesupport/lib')
+ puts "[ using linked Rails ]"
+ $:.unshift linked_rails + '/activesupport/lib'
+ $:.unshift linked_rails + '/actionpack/lib'
+else
+ need_gems = true
+end
+
+require 'rubygems' if need_gems
+
+require 'action_controller'
+require 'action_view'
diff --git a/vendor/gems/gems/configuration-1.1.0/README b/vendor/gems/gems/configuration-1.1.0/README
new file mode 100755
index 00000000..fd142ea7
--- /dev/null
+++ b/vendor/gems/gems/configuration-1.1.0/README
@@ -0,0 +1,197 @@
+NAME
+ configuration.rb
+
+SYNOPSIS
+ pure ruby scoped configuration files
+
+DESCRIPTION
+ configuration.rb provides a mechanism for configuring ruby programs with
+ ruby configuration files. a configuration.rb file, for example
+ 'config/app.rb', can be written simply as
+
+ Configuration.for('app'){
+ key 'value'
+ foo 'bar'
+ port 42
+ }
+
+ and loaded via the normal ruby require/load mechanism
+
+ Kernel.load 'config/app.rb'
+
+ or with a slightly augmented loading mechnanism which simply searches an
+ extra set of paths in *addition* to the standard ones
+
+ Configuration.path = %w( config configuration )
+
+ Configuration.load 'app'
+
+ configurations are completely open
+
+ Configuration.for('app'){
+ object_id 'very open'
+ }
+
+ support arbitrarily nested values
+
+ Configuration.for('app'){
+ a { b { c { d 42 } } }
+ }
+
+ c = Configuration.for 'app'
+
+ p c.a.b.c.d #=> 42
+
+ allow POLS scoped lookup of vars
+
+ Configuration.for('config'){
+ outer 'bar'
+
+ inner {
+ value 42
+ }
+ }
+
+ c = Configuration.for 'config'
+
+ p c.outer #=> 'bar'
+ p c.inner.value #=> 42
+ p c.inner.outer #=> 'bar'
+
+
+ and not a whole lot else - configuration.rb is s very small library
+ consisting of one file and < 150 loc
+
+SAMPLES
+
+ <========< samples/a.rb >========>
+
+ ~ > cat samples/a.rb
+
+ #
+ # basic usage is quite, simple, load the config and use it's values. the
+ # config syntax is fairly obvious, i think, but note that it *is* ruby and any
+ # ruby can be included. also note that each config is named, allowing
+ # multiple configs to be places in one file
+ #
+ require 'configuration'
+
+ c = Configuration.load 'a'
+
+ p c.a + c.b - c.c
+
+ ~ > ruby samples/a.rb
+
+ 42
+
+
+ <========< samples/b.rb >========>
+
+ ~ > cat samples/b.rb
+
+ #
+ # configuration.rb supports a very natural nesting syntax. note how values
+ # are scoped in a POLS fashion
+ #
+ require 'configuration'
+
+ c = Configuration.for 'b'
+
+ p c.www.url
+ p c.db.url
+ p c.mail.url
+
+ ~ > ruby samples/b.rb
+
+ "http://codeforpeople.com:80"
+ "db://codeforpeople.com:5342"
+ "mail://gmail.com:25"
+
+
+ <========< samples/c.rb >========>
+
+ ~ > cat samples/c.rb
+
+ #
+ # configuration.rb let's you keep code very dry.
+ #
+
+ require 'configuration'
+
+ Configuration.load 'c'
+
+ p Configuration.for('development').db
+ p Configuration.for('production').db
+ p Configuration.for('testing').db
+
+ ~ > ruby samples/c.rb
+
+ "db/development"
+ "db/production"
+ "db/testing"
+
+
+ <========< samples/d.rb >========>
+
+ ~ > cat samples/d.rb
+
+ #
+ # configuration.rb makes use of an external blank slate dsl, this means that
+ # you Configuration objects do, in fact, have all built-in ruby methods such
+ # as #inspect, etc, *unless* you configure over the top of them. the effect
+ # is a configuration object that behaves like a nice ruby object, but which
+ # allows *any* key to be configured
+ #
+ require 'configuration'
+
+ c = Configuration.for 'd'
+
+ p c.object_id
+ p c.inspect
+ p c.p
+
+ ~ > ruby samples/d.rb
+
+ config/d.rb:2:in `object_id': wrong number of arguments (1 for 0) (ArgumentError)
+ from config/d.rb:2
+ from ./lib/configuration.rb:159:in `instance_eval'
+ from ./lib/configuration.rb:159:in `call'
+ from ./lib/configuration.rb:159:in `method_missing'
+ from ./lib/configuration.rb:105:in `evaluate'
+ from ./lib/configuration.rb:68:in `initialize'
+ from ./lib/configuration.rb:29:in `new'
+ from ./lib/configuration.rb:29:in `for'
+ from config/d.rb:1
+ from ./lib/configuration.rb:53:in `load'
+ from ./lib/configuration.rb:53:in `load'
+ from ./lib/configuration.rb:31:in `for'
+ from samples/d.rb:10
+
+
+ <========< samples/e.rb >========>
+
+ ~ > cat samples/e.rb
+
+ #
+ # configuration.rb uses a totally clean slate dsl for the block. if you need
+ # to access base Object methods you can do this
+ #
+
+ require 'configuration'
+
+ c = Configuration.for 'e'
+
+ p c.foo
+ p c.bar
+ p c.foobar
+
+ ~ > ruby samples/e.rb
+
+ 42
+ "forty-two"
+ 42.0
+
+
+
+AUTHOR
+ ara.t.howard@gmail.com
diff --git a/vendor/gems/gems/configuration-1.1.0/README.erb b/vendor/gems/gems/configuration-1.1.0/README.erb
new file mode 100755
index 00000000..28159dae
--- /dev/null
+++ b/vendor/gems/gems/configuration-1.1.0/README.erb
@@ -0,0 +1,69 @@
+NAME
+ configuration.rb
+
+SYNOPSIS
+ pure ruby scoped configuration files
+
+DESCRIPTION
+ configuration.rb provides a mechanism for configuring ruby programs with
+ ruby configuration files. a configuration.rb file, for example
+ 'config/app.rb', can be written simply as
+
+ Configuration.for('app'){
+ key 'value'
+ foo 'bar'
+ port 42
+ }
+
+ and loaded via the normal ruby require/load mechanism
+
+ Kernel.load 'config/app.rb'
+
+ or with a slightly augmented loading mechnanism which simply searches an
+ extra set of paths in *addition* to the standard ones
+
+ Configuration.path = %w( config configuration )
+
+ Configuration.load 'app'
+
+ configurations are completely open
+
+ Configuration.for('app'){
+ object_id 'very open'
+ }
+
+ support arbitrarily nested values
+
+ Configuration.for('app'){
+ a { b { c { d 42 } } }
+ }
+
+ c = Configuration.for 'app'
+
+ p c.a.b.c.d #=> 42
+
+ allow POLS scoped lookup of vars
+
+ Configuration.for('config'){
+ outer 'bar'
+
+ inner {
+ value 42
+ }
+ }
+
+ c = Configuration.for 'config'
+
+ p c.outer #=> 'bar'
+ p c.inner.value #=> 42
+ p c.inner.outer #=> 'bar'
+
+
+ and not a whole lot else - configuration.rb is s very small library
+ consisting of one file and < 150 loc
+
+SAMPLES
+<%= samples %>
+
+AUTHOR
+ ara.t.howard@gmail.com
diff --git a/vendor/gems/gems/configuration-1.1.0/Rakefile b/vendor/gems/gems/configuration-1.1.0/Rakefile
new file mode 100755
index 00000000..a155f9c2
--- /dev/null
+++ b/vendor/gems/gems/configuration-1.1.0/Rakefile
@@ -0,0 +1,241 @@
+This.author = "Ara T. Howard"
+This.email = "ara.t.howard@gmail.com"
+This.homepage = "http://github.com/ahoward/#{ This.lib }/tree/master"
+This.rubyforge_project = 'codeforpeople'
+
+task :default do
+ puts(Rake::Task.tasks.map{|task| task.name} - ['default'])
+end
+
+task :spec do
+ require 'spec/rake/spectask'
+ Spec::Rake::SpecTask.new do |t|
+ t.spec_files = FileList['spec/*_spec.rb']
+ end
+end
+
+task :gemspec do
+ ignore_extensions = 'git', 'svn', 'tmp', /sw./, 'bak', 'gem'
+ ignore_directories = 'pkg'
+ ignore_files = 'test/log'
+
+ shiteless =
+ lambda do |list|
+ list.delete_if do |entry|
+ next unless test(?e, entry)
+ extension = File.basename(entry).split(%r/[.]/).last
+ ignore_extensions.any?{|ext| ext === extension}
+ end
+ list.delete_if do |entry|
+ next unless test(?d, entry)
+ dirname = File.expand_path(entry)
+ ignore_directories.any?{|dir| File.expand_path(dir) == dirname}
+ end
+ list.delete_if do |entry|
+ next unless test(?f, entry)
+ filename = File.expand_path(entry)
+ ignore_files.any?{|file| File.expand_path(file) == filename}
+ end
+ end
+
+ lib = This.lib
+ version = This.version
+ files = shiteless[Dir::glob("**/**")]
+ executables = shiteless[Dir::glob("bin/*")].map{|exe| File.basename(exe)}
+ has_rdoc = true #File.exist?('doc')
+ test_files = "test/#{ lib }.rb" if File.file?("test/#{ lib }.rb")
+
+ extensions = This.extensions
+ if extensions.nil?
+ %w( Makefile configure extconf.rb ).each do |ext|
+ extensions << ext if File.exists?(ext)
+ end
+ end
+ extensions = [extensions].flatten.compact
+
+ template =
+ if test(?e, 'gemspec.erb')
+ Template{ IO.read('gemspec.erb') }
+ else
+ Template {
+ <<-__
+ ## #{ lib }.gemspec
+ #
+
+ Gem::Specification::new do |spec|
+ spec.name = #{ lib.inspect }
+ spec.version = #{ version.inspect }
+ spec.platform = Gem::Platform::RUBY
+ spec.summary = #{ lib.inspect }
+
+ spec.files = #{ files.inspect }
+ spec.executables = #{ executables.inspect }
+
+ <% if test(?d, 'lib') %>
+ spec.require_path = "lib"
+ <% end %>
+
+ spec.has_rdoc = #{ has_rdoc.inspect }
+ spec.test_files = #{ test_files.inspect }
+ #spec.add_dependency 'lib', '>= version'
+ #spec.add_dependency 'fattr'
+
+ spec.extensions.push(*#{ extensions.inspect })
+
+ spec.rubyforge_project = #{ This.rubyforge_project.inspect }
+ spec.author = #{ This.author.inspect }
+ spec.email = #{ This.email.inspect }
+ spec.homepage = #{ This.homepage.inspect }
+ end
+ __
+ }
+ end
+
+ open("#{ lib }.gemspec", "w"){|fd| fd.puts template}
+ This.gemspec = "#{ lib }.gemspec"
+end
+
+task :gem => [:clean, :gemspec] do
+ Fu.mkdir_p This.pkgdir
+ before = Dir['*.gem']
+ cmd = "gem build #{ This.gemspec }"
+ `#{ cmd }`
+ after = Dir['*.gem']
+ gem = ((after - before).first || after.first) or abort('no gem!')
+ Fu.mv gem, This.pkgdir
+ This.gem = File.basename(gem)
+end
+
+task :readme do
+ samples = ''
+ prompt = '~ > '
+ lib = This.lib
+ version = This.version
+
+ Dir['sample*/*'].sort.each do |sample|
+ samples << "\n" << " <========< #{ sample } >========>" << "\n\n"
+
+ cmd = "cat #{ sample }"
+ samples << Util.indent(prompt + cmd, 2) << "\n\n"
+ samples << Util.indent(`#{ cmd }`, 4) << "\n"
+
+ cmd = "ruby #{ sample }"
+ samples << Util.indent(prompt + cmd, 2) << "\n\n"
+
+ cmd = "ruby -e'STDOUT.sync=true; exec %(ruby -Ilib -Iconfig #{ sample })'"
+ samples << Util.indent(`#{ cmd } 2>&1`, 4) << "\n"
+ end
+
+ template =
+ if test(?e, 'readme.erb')
+ Template{ IO.read('readme.erb') }
+ else
+ Template {
+ <<-__
+ NAME
+ #{ lib }
+
+ DESCRIPTION
+
+ INSTALL
+ gem install #{ lib }
+
+ SAMPLES
+ #{ samples }
+ __
+ }
+ end
+
+ open("README", "w"){|fd| fd.puts template}
+end
+
+
+task :clean do
+ Dir[File.join(This.pkgdir, '**/**')].each{|entry| Fu.rm_rf(entry)}
+end
+
+
+task :release => [:clean, :gemspec, :gem] do
+ gems = Dir[File.join(This.pkgdir, '*.gem')].flatten
+ raise "which one? : #{ gems.inspect }" if gems.size > 1
+ raise "no gems?" if gems.size < 1
+ cmd = "rubyforge login && rubyforge add_release #{ This.rubyforge_project } #{ This.lib } #{ This.version } #{ This.pkgdir }/#{ This.gem }"
+ puts cmd
+ system cmd
+end
+
+
+
+
+
+BEGIN {
+ $VERBOSE = nil
+
+ require 'ostruct'
+ require 'erb'
+ require 'fileutils'
+
+ Fu = FileUtils
+
+ This = OpenStruct.new
+
+ This.file = File.expand_path(__FILE__)
+ This.dir = File.dirname(This.file)
+ This.pkgdir = File.join(This.dir, 'pkg')
+
+ lib = ENV['LIB']
+ unless lib
+ lib = File.basename(Dir.pwd)
+ end
+ This.lib = lib
+
+ version = ENV['VERSION']
+ unless version
+ name = lib.capitalize
+ library = "./lib/#{ lib }.rb"
+ program = "./bin/#{ lib }"
+ if test(?e, library)
+ require library
+ version = eval(name).send(:version)
+ elsif test(?e, program)
+ version = `#{ program } --version`.strip
+ end
+ abort('no version') if(version.nil? or version.empty?)
+ end
+ This.version = version
+
+ abort('no lib') unless This.lib
+ abort('no version') unless This.version
+
+ module Util
+ def indent(s, n = 2)
+ s = unindent(s)
+ ws = ' ' * n
+ s.gsub(%r/^/, ws)
+ end
+
+ def unindent(s)
+ indent = nil
+ s.each do |line|
+ next if line =~ %r/^\s*$/
+ indent = line[%r/^\s*/] and break
+ end
+ indent ? s.gsub(%r/^#{ indent }/, "") : s
+ end
+ extend self
+ end
+
+ class Template
+ def initialize(&block)
+ @block = block
+ @template = block.call.to_s
+ end
+ def expand(b=nil)
+ ERB.new(Util.unindent(@template)).result(b||@block)
+ end
+ alias_method 'to_s', 'expand'
+ end
+ def Template(*args, &block) Template.new(*args, &block) end
+
+ Dir.chdir(This.dir)
+}
diff --git a/vendor/gems/gems/configuration-1.1.0/config/a.rb b/vendor/gems/gems/configuration-1.1.0/config/a.rb
new file mode 100755
index 00000000..fdcdac6f
--- /dev/null
+++ b/vendor/gems/gems/configuration-1.1.0/config/a.rb
@@ -0,0 +1,5 @@
+Configuration.for('a'){
+ a 40
+ b 4
+ c 2
+}
diff --git a/vendor/gems/gems/configuration-1.1.0/config/b.rb b/vendor/gems/gems/configuration-1.1.0/config/b.rb
new file mode 100755
index 00000000..7c41f195
--- /dev/null
+++ b/vendor/gems/gems/configuration-1.1.0/config/b.rb
@@ -0,0 +1,19 @@
+Configuration.for('b'){
+ host "codeforpeople.com"
+
+ www {
+ port 80
+ url "http://#{ host }:#{ port }"
+ }
+
+ db {
+ port 5342
+ url "db://#{ host }:#{ port }"
+ }
+
+ mail {
+ host "gmail.com"
+ port 25
+ url "mail://#{ host }:#{ port }"
+ }
+}
diff --git a/vendor/gems/gems/configuration-1.1.0/config/c.rb b/vendor/gems/gems/configuration-1.1.0/config/c.rb
new file mode 100755
index 00000000..63a769ae
--- /dev/null
+++ b/vendor/gems/gems/configuration-1.1.0/config/c.rb
@@ -0,0 +1,8 @@
+%w( development production testing ).each do |environment|
+
+ Configuration.for(environment){
+ adapter "sqlite3"
+ db "db/#{ environment }"
+ }
+
+end
diff --git a/vendor/gems/gems/configuration-1.1.0/config/d.rb b/vendor/gems/gems/configuration-1.1.0/config/d.rb
new file mode 100755
index 00000000..9cda1011
--- /dev/null
+++ b/vendor/gems/gems/configuration-1.1.0/config/d.rb
@@ -0,0 +1,5 @@
+Configuration.for('d'){
+ object_id 42
+ inspect 'forty-two'
+ p 42.0
+}
diff --git a/vendor/gems/gems/configuration-1.1.0/config/e.rb b/vendor/gems/gems/configuration-1.1.0/config/e.rb
new file mode 100755
index 00000000..f458940e
--- /dev/null
+++ b/vendor/gems/gems/configuration-1.1.0/config/e.rb
@@ -0,0 +1,13 @@
+Configuration.for('e'){
+ foo 42
+
+ if Send('respond_to?', 'foo')
+ bar 'forty-two'
+ end
+
+ respond_to = Method('bar')
+
+ if respond_to.call()
+ foobar 42.0
+ end
+}
diff --git a/vendor/gems/gems/configuration-1.1.0/configuration.gemspec b/vendor/gems/gems/configuration-1.1.0/configuration.gemspec
new file mode 100755
index 00000000..e64f2247
--- /dev/null
+++ b/vendor/gems/gems/configuration-1.1.0/configuration.gemspec
@@ -0,0 +1,28 @@
+## configuration.gemspec
+#
+
+Gem::Specification::new do |spec|
+ spec.name = "configuration"
+ spec.version = "1.1.0"
+ spec.platform = Gem::Platform::RUBY
+ spec.summary = "configuration"
+
+ spec.files = ["config", "config/a.rb", "config/b.rb", "config/c.rb", "config/d.rb", "config/e.rb", "configuration.gemspec", "lib", "lib/configuration.rb", "Rakefile", "README", "README.erb", "samples", "samples/a.rb", "samples/b.rb", "samples/c.rb", "samples/d.rb", "samples/e.rb"]
+ spec.executables = []
+
+
+ spec.require_path = "lib"
+
+
+ spec.has_rdoc = true
+ spec.test_files = nil
+ #spec.add_dependency 'lib', '>= version'
+ #spec.add_dependency 'fattr'
+
+ spec.extensions.push(*[])
+
+ spec.rubyforge_project = "codeforpeople"
+ spec.author = "Ara T. Howard"
+ spec.email = "ara.t.howard@gmail.com"
+ spec.homepage = "http://github.com/ahoward/configuration/tree/master"
+end
diff --git a/vendor/gems/gems/configuration-1.1.0/lib/configuration.rb b/vendor/gems/gems/configuration-1.1.0/lib/configuration.rb
new file mode 100755
index 00000000..1e5308f6
--- /dev/null
+++ b/vendor/gems/gems/configuration-1.1.0/lib/configuration.rb
@@ -0,0 +1,199 @@
+class Configuration
+ Configuration::Version = '1.1.0'
+ def Configuration.version() Configuration::Version end
+
+ Path = [
+ if defined? CONFIGURATION_PATH
+ CONFIGURATION_PATH
+ else
+ ENV['CONFIGURATION_PATH']
+ end
+ ].compact.flatten.join(File::PATH_SEPARATOR).split(File::PATH_SEPARATOR)
+
+ Table = Hash.new
+ Error = Class.new StandardError
+ Import = Class.new Error
+
+ module ClassMethods
+ def for name, options = nil, &block
+ name = name.to_s
+ if Table.has_key?(name)
+ if options or block
+ configuration = Table[name]
+ Table[name] = DSL.evaluate(configuration, options || {}, &block)
+ else
+ Table[name]
+ end
+ else
+ if options or block
+ Table[name] = new name, options || {}, &block
+ else
+ load name
+ end
+ end
+ end
+
+ def path *value
+ return self.path = value.first unless value.empty?
+ Path
+ end
+
+ def path= value
+ Path.clear
+ Path.replace [value].compact.flatten.join(File::PATH_SEPARATOR).split(File::PATH_SEPARATOR)
+ end
+
+ def load name
+ name = name.to_s
+ name = name + '.rb' unless name[%r/\.rb$/]
+ key = name.sub %r/\.rb$/, ''
+ load_path = $LOAD_PATH.dup
+ begin
+ $LOAD_PATH.replace(path + load_path)
+ ::Kernel.load name
+ ensure
+ $LOAD_PATH.replace load_path
+ end
+ Table[key]
+ end
+ end
+ send :extend, ClassMethods
+
+ module InstanceMethods
+ attr 'name'
+
+ def initialize *argv, &block
+ options = Hash === argv.last ? argv.pop : Hash.new
+ @name = argv.shift
+ DSL.evaluate(self, options, &block)
+ end
+
+ def method_missing m, *a, &b
+ return(Pure[@__parent].send m, *a, &b) rescue super if @__parent
+ super
+ end
+ end
+ send :include, InstanceMethods
+
+ class DSL
+ Protected = %r/^__|^object_id$/
+
+ instance_methods.each do |m|
+ undef_method m unless m[Protected]
+ end
+
+ Kernel.methods.each do |m|
+ next if m[Protected]
+ module_eval <<-code
+ def #{ m }(*a, &b)
+ method_missing '#{ m }', *a, &b
+ end
+ code
+ end
+
+ def Send(m, *a, &b)
+ Method(m).call(*a, &b)
+ end
+
+ def Method m
+ @__configuration.method(m)
+ end
+
+ def self.evaluate configuration, options = {}, &block
+ dsl = new configuration
+ Pure[dsl].instance_eval(&block) if block
+ options.each{|key, value| Pure[dsl].send key, value}
+ Pure[dsl].instance_eval{ @__configuration }
+ end
+
+ def initialize configuration, &block
+ @__configuration = configuration
+ @__singleton_class =
+ class << @__configuration
+ self
+ end
+ end
+
+ def __configuration__
+ @__configuration
+ end
+
+ undef_method(:method_missing) rescue nil
+ def method_missing(m, *a, &b)
+ if(a.empty? and b.nil?)
+ return Pure[@__configuration].send(m, *a, &b)
+ end
+ if b
+ raise ArgumentError unless a.empty?
+ parent = @__configuration
+ name = m.to_s
+ configuration =
+ if @__configuration.respond_to?(name) and Configuration === @__configuration.send(name)
+ @__configuration.send name
+ else
+ Configuration.new name
+ end
+ Pure[configuration].instance_eval{ @__parent = parent }
+ DSL.evaluate configuration, &b
+ value = configuration
+ end
+ unless a.empty?
+ value = a.size == 1 ? a.first : a
+ end
+ @__singleton_class.module_eval do
+ define_method(m){ value }
+ end
+ end
+
+ verbose = $VERBOSE
+ begin
+ $VERBOSE = nil
+ def object_id(*args)
+ unless args.empty?
+ verbose = $VERBOSE
+ begin
+ $VERBOSE = nil
+ define_method(:object_id){ args.first }
+ ensure
+ $VERBOSE = verbose
+ end
+ else
+ return Pure[@__configuration].object_id
+ end
+ end
+ ensure
+ $VERBOSE = verbose
+ end
+ end
+
+ class Pure
+ Instance_Methods = Hash.new
+ Protected = %r/^__|^object_id$/
+
+ ::Object.instance_methods.each do |m|
+ Instance_Methods[m.to_s] = ::Object.instance_method m
+ undef_method m unless m[Protected]
+ end
+
+ def method_missing m, *a, &b
+ Instance_Methods[m.to_s].bind(@object).call(*a, &b)
+ end
+
+ def initialize object
+ @object = object
+ end
+
+ def Pure.[] object
+ new object
+ end
+ end
+end
+
+def Configuration(*a, &b)
+ if a.empty? and b.nil?
+ const_get :Configuration
+ else
+ Configuration.new(*a, &b)
+ end
+end
+
diff --git a/vendor/gems/gems/configuration-1.1.0/samples/a.rb b/vendor/gems/gems/configuration-1.1.0/samples/a.rb
new file mode 100755
index 00000000..0bd2d017
--- /dev/null
+++ b/vendor/gems/gems/configuration-1.1.0/samples/a.rb
@@ -0,0 +1,11 @@
+#
+# basic usage is quite, simple, load the config and use it's values. the
+# config syntax is fairly obvious, i think, but note that it *is* ruby and any
+# ruby can be included. also note that each config is named, allowing
+# multiple configs to be places in one file
+#
+ require 'configuration'
+
+ c = Configuration.load 'a'
+
+ p c.a + c.b - c.c
diff --git a/vendor/gems/gems/configuration-1.1.0/samples/b.rb b/vendor/gems/gems/configuration-1.1.0/samples/b.rb
new file mode 100755
index 00000000..ca407130
--- /dev/null
+++ b/vendor/gems/gems/configuration-1.1.0/samples/b.rb
@@ -0,0 +1,11 @@
+#
+# configuration.rb supports a very natural nesting syntax. note how values
+# are scoped in a POLS fashion
+#
+ require 'configuration'
+
+ c = Configuration.for 'b'
+
+ p c.www.url
+ p c.db.url
+ p c.mail.url
diff --git a/vendor/gems/gems/configuration-1.1.0/samples/c.rb b/vendor/gems/gems/configuration-1.1.0/samples/c.rb
new file mode 100755
index 00000000..419de628
--- /dev/null
+++ b/vendor/gems/gems/configuration-1.1.0/samples/c.rb
@@ -0,0 +1,11 @@
+#
+# configuration.rb let's you keep code very dry.
+#
+
+ require 'configuration'
+
+ Configuration.load 'c'
+
+ p Configuration.for('development').db
+ p Configuration.for('production').db
+ p Configuration.for('testing').db
diff --git a/vendor/gems/gems/configuration-1.1.0/samples/d.rb b/vendor/gems/gems/configuration-1.1.0/samples/d.rb
new file mode 100755
index 00000000..54099926
--- /dev/null
+++ b/vendor/gems/gems/configuration-1.1.0/samples/d.rb
@@ -0,0 +1,14 @@
+#
+# configuration.rb makes use of an external blank slate dsl, this means that
+# you Configuration objects do, in fact, have all built-in ruby methods such
+# as #inspect, etc, *unless* you configure over the top of them. the effect
+# is a configuration object that behaves like a nice ruby object, but which
+# allows *any* key to be configured
+#
+ require 'configuration'
+
+ c = Configuration.for 'd'
+
+ p c.object_id
+ p c.inspect
+ p c.p
diff --git a/vendor/gems/gems/configuration-1.1.0/samples/e.rb b/vendor/gems/gems/configuration-1.1.0/samples/e.rb
new file mode 100755
index 00000000..854f7cea
--- /dev/null
+++ b/vendor/gems/gems/configuration-1.1.0/samples/e.rb
@@ -0,0 +1,12 @@
+#
+# configuration.rb uses a totally clean slate dsl for the block. if you need
+# to access base Object methods you can do this
+#
+
+ require 'configuration'
+
+ c = Configuration.for 'e'
+
+ p c.foo
+ p c.bar
+ p c.foobar
diff --git a/vendor/gems/gems/cucumber-0.4.4/.gitattributes b/vendor/gems/gems/cucumber-0.4.4/.gitattributes
new file mode 100755
index 00000000..3ce46dd7
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/.gitattributes
@@ -0,0 +1 @@
+spec/cucumber/treetop_parser/test_dos.feature -crlf
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/.gitignore b/vendor/gems/gems/cucumber-0.4.4/.gitignore
new file mode 100755
index 00000000..f5a4155d
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/.gitignore
@@ -0,0 +1,17 @@
+nbproject
+coverage
+pkg
+doc
+.yardoc
+*.log
+*.pid
+.eprj
+.tmtags
+*~
+.DS_Store
+*.swp
+target
+*.tmproj
+examples/self_test/tmp
+.#*
+.idea
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/History.txt b/vendor/gems/gems/cucumber-0.4.4/History.txt
new file mode 100755
index 00000000..d31e9064
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/History.txt
@@ -0,0 +1,1269 @@
+== 0.4.4 2009-11-13
+
+What a bad day to make a release, but here goes.
+
+=== New features
+* Cucumber should use ActiveSupport::Callbacks for fixtures (#516 Adam Salter)
+* Make 'I' optional in all webrat steps. (Gavin Hughes)
+* Make generated cucumber.rake work with a vendored gem (Alex Rothenberg)
+* Native support for ANSIColor on IronRuby via the iron-term-ansicolor gem (Will Green)
+* Call a bunch of steps from step definitions - also with tables or pystrings. Copy-paste friendly (Bodaniel Jeanes, Jack Chen, Aslak Hellesøy) TODO - WIKI DOCUMENTATION BEFORE RELEASE
+
+=== Bugfixes
+* Pretty printer fails when expanding scenario outlines with -x when the background includes a table (#515 Mike Sassak)
+* Ensure tags used with Before/After hooks always get parsed (#520 Joseph Wilk)
+* Define IRONRUBY correctly on Ruby 1.9 (Joe Van Dyk)
+* RbStepDefinition#invoke calls #backtrace_line on self rather than @proc (#503 Mike Sassak)
+* Avoid duplicate cucumber entries in database.yml (Daniel Hofstetter)
+* Added respond_to? when checking config.cache_classes for older Rails versions (Jeremy Durham)
+
+=== Changed Features
+* The code for Czech has changed from cz to cs. (deepj)
+* $cucumber_interrupted is now Cucumber.wants_to_quit - avoid global variable, which gives warnings. (Aslak Hellesøy)
+* Examples keyword without a colon is deprecated loudly. Gherkin will not recognize it at all. (Gherkin #30 Mike Sassak)
+
+== 0.4.3 2009-10-28
+
+The exciting thing about this release is that the wire protocol is starting to take shape. This means you can
+now use Cucumber with .NET - writing step definitions in C#. And this is without having to use IronRuby at all!
+See Cuke4Nuke (http://wiki.github.com/richardlawrence/Cuke4Nuke) for more information.
+
+As usual there are several small features and bug fixes.
+
+=== New Features
+* Add support for ORing tags which are passed in with seperate --tag arguments. Make comma seperated tags use AND (#368 Joseph Wilk)
+* New Wire Protocol - allowing out of process execution of Cucumber scenarios. (#428 Matt Wynne)
+* Added an example illustrating how to get screenshots in HTML reports (examples/watir) (Aslak Hellesøy)
+* Added new #embed(file, mime_type) method to visitors and Ruby Worlds to make it easier to embed screenshots (Aslak Hellesøy)
+* The #announce method available from Ruby Step Definitions will print *after* the step is executed. (#487 Zoltan Penzeli)
+* Add support for rolling back transaction for all open database connections. (John Ferlito)
+* Show scenario and step summary in HTML formatter (#285 Joseph Wilk)
+* Ast::Table can now be constructed with an Array of Hash. (Aslak Hellesøy)
+
+=== Changed features
+* The #announce method will no longer escape HTML if the html formatter is used. Escaping must be done manually. (Aslak Hellesøy)
+
+=== Bugfixes
+* Fixed incorrect rendering of step arguments with UTF8 characters (Aslak Hellesøy)
+* "--format rerun", with a Scenario Outline, kills cucumber (#492 Aslak Hellesøy)
+* Usage formatter is not reporting time correctly. (Elliot Crosby-McCullough)
+* JUnit formatter raises a more helpful error when run on a feature with no name. (#493 Matt Wynne)
+* Better Danish translation (Thorbjørn Ravn Andersen)
+
+
+== 0.4.2 2009-10-14
+
+Bugfix release. The 0.4.1 release was hosed when switching from Hoe to Jeweler.
+
+== 0.4.1 2009-10-14
+
+This is mostly a bugfix release. Some of Cucumber's own features have been fixed so they pass on more platforms,
+making it easier for people to contribute. The README.txt also describes how to get up and running with the
+development environment.
+
+=== Bugfixes
+* Cucumber's features verified passing on MRI 1.8.6 (OSX), 1.8.7 (OSX), 1.9.1 (OSX/Win) and JRuby 1.4.0RC1 (OSX). (Aslak Hellesøy)
+* Ensure no errors are raised when limiting with tags which are not in the feature set (#464 Joseph Wilk)
+* Missing Romanian keywords added for Examples, Scenario Outline and Background (to my best google translate knowledge) (Aslak Hellesøy)
+* Make rerun and --drb work together again after formatter API changes (#485 Erik Hansson, John Ferlito)
+
+=== New Features
+* The Rails cucumber generator will only default to RSpec if installed. And print better help. (Aslak Hellesøy)
+* Added 'but' variants to Japanese. (Kakutani Shintaro)
+* README.txt explains people how to run all tests. Install gems with geminstaller. (Aslak Hellesøy)
+* Added support for Serbian language, both Cyrillic and Latin with usage examples. (Dejan Dimic)
+* Add new 'debug' formatter for debugging and visualising the calls to listeners. (Matt Wynne)
+
+=== Changed features
+* Use http://github.com/aslakhellesoy/wac instead of http://github.com/aslakhellesoy/ansicolor on Windows/JRuby (#456 Aslak Hellesøy)
+
+=== Internal changes
+* Ditched Hoe for Jeweler (Aslak Hellesøy)
+* Added StepMother#invoke(step_name, multiline_argument=nil) - needed by cuke4duke ticket #26 (Aslak Hellesøy)
+* StepDefinitionMethods is gone.
+
+== 0.4.0 2009-10-09
+
+The back to stable release. When we went from 0.3.11 to 0.3.90 we thought we were close to a 0.4.0 release. Then the community
+went nuts and a lot of great contributions came in. Some of those broke backwards compatibility, and we decided it would be
+better to do this while still on 0.3.x.
+
+Rails users: you *must* run script/generate cucumber after installing this version.
+
+If something breaks for you, please please please read this file carefully. It's most likely something referenced here, and
+that will give you more information so you can solve any problems. If not, just get in touch on IRC or the Google Group.
+
+=== New Features
+* Total feature parsing time is shown when run with --verbose. Useful for benchmarking with future Ragel parser (Aslak Hellesøy)
+* Tables yielded to step definitions are no longer frozen, so you can edit their data without #dup'ing (Aslak Hellesøy)
+* Transform can now transform tables, using /table:col1,col2,col3/ (#478 Corey Haines)
+* cucumber.yml can also end in .yaml and be located in .config/ or config/ dirs (#447 trans)
+* Turkish support. (Hakan Åženol Ensari)
+* Upgrade Rails generator to set a dependency to Spork 0.7.3. (Aslak Hellesøy)
+* Installation via rubygems will print a message telling people to read this file. (Aslak Hellesøy)
+* Files generated by the Rails cucumber generator have information about the risks of editing. (Aslak Hellesøy)
+* Rotten Cucumber alert on Rails if you upgrade your gem without regenerating with script/generate cucumber. (Aslak Hellesøy)
+* Stop the confusion between "homepage" and "home page" by allowing both (Ryan Bigg & Bodaniel Jeanes)
+* Make script/cucumber file generated by the Rails cucumber generator look for cucumber in vendored gems as well. (Tom ten Thij)
+
+=== Changed Features
+* Step tables now default empty table cells to empty strings and not nil (#470 Joseph Wilk)
+
+=== Removed Features
+* The feature_list, feature_pattern, step_list and step_pattern properties are removed from the Rake task. Use profiles instead. (Aslak Hellesøy)
+* The FeatureTask is removed. Use profiles instead.
+
+=== Bugfixes
+* instance_exec get declared private (#477 Tim Galeckas)
+* Transforms can return nil. (Thomas Marek)
+* Generated rails rake tasks doesn't use the vendored version cucumber binary (#468 Josh Nichols)
+* Incorrect diagnostics in case when Before raises in presence of Background (#465 Fedor Kocherga)
+* Error on pystring in scenario outline with pretty formatter (#475 Aslak Hellesøy)
+* Adding After('@allow-rescue') to set allow_rescue back to its former value. (Alf Mikula)
+* Feature files are now sorted before they are executed, because different operating systems may list files differently. (Aslak Hellesøy)
+* Fixed image loading for Windows in PDF formatter. Allow use of both png and jpg. (#461 Declan Whelan)
+* Before('~@no-txn') is run on all scenarios without @no-txn causing Cucumber::Rails::World.use_transactional_fixtures to always be true. (#457 Aslak Hellesøy)
+* JUnit formatter not handling scenario outline tables (#472 Matt Wynne)
+* Language help broken (#467 Matt Wynne)
+* Language help formatter aligns output better on Ruby 1.8.6 (Aslak Hellesøy)
+* Better backtraces for Ruby 1.8.7. (Jakob Skov-Pedersen)
+* String step definitions ( Given 'I have $number cucumbers' ) are escaped before being turned into regular expressions. (David Waite)
+
+== 0.3.104 2009-09-27
+
+This release has some minor changes to the command line and formatters. The biggest change is internally, paving
+the way for more programming language support in Cuke4Duke, which now supports step definitions written in Java, Scala,
+Groovy, Clojure and Javascript!
+
+=== New Features
+* "usage" formatter should display progress (#437 Aslak Hellesøy)
+* Added example for Ramaze. (Yutaka HARA)
+
+=== Bugfixes
+* Fixed regression in profile formatter from 0.3.102. (Aslak Hellesøy)
+* Raise a proper error message if someone forgets @ for tags, example: --tags ~foo or --tags bar. (Aslak Hellesøy)
+* lib/cucumber/formatter/html.rb requires xml (#458 Brent Snook)
+* lib/cucumber/formatter/html.rb requires ruby-debug (#455 Assaf Arkin)
+* Allow for STDOUT formatters to be defined in profiles. Addresses an Autotest plugin issue. (#375 Gabriel Medina)
+
+=== Removed features
+* The --dry-run option no longer implies --no-source and --no-snippets. It only implies --no-snippets. (Aslak Hellesøy)
+
+=== Changed features
+* The profile and usage formatters have been combined to the usage formatter. Use it eith or without --dry-run. See --help for more. (Aslak Hellesøy)
+* The steps formatter has been renamed to stepdefs formatter. (Aslak Hellesøy)
+* The internal programming language API has changed, giving more power to the implementation. See #428. (Aslak Hellesøy)
+
+== 0.3.103 2009-09-24
+
+This release gives you back some of the control over the Rails environment that was accidentally taken away from you in the
+previous release.
+
+Using this release on a Rails project requires a rerun of script/generate cucumber.
+
+=== New Features
+* Added a new @no-txn tag to selectively turn off transactions for a particlular scenario.
+* Added back a way to globally turn off transactions.
+* Renamed @allow_rescue tag to @allow-rescue.
+
+=== Bugfixes
+* Gracefully handle cases when optional regexp groups are not matched. Ex: /should( not)? be flashed '([^']*?)'$/ (Aslak Hellesøy)
+
+=== Changed Features
+* The Formatter API has completely changed. Formatters are no longer a double-dispacth visitor - just a single-dispatch listener (#438 Matt Wynne)
+
+== 0.3.102 2009-09-22
+
+This release has some changes in the Rails support, so make sure you run "script/generate cucumber" after you upgrade.
+Other noteworthy new features are improved Hook, tags and Transform support, and as always - several smaller bug fixes.
+
+=== New Features
+* Added new internal API for Regexp and groups, allowing other programming languages to leverage native regexps. (Aslak Hellesøy)
+* New @allow_rescue tag for Rails scenarios. Causes exceptions raised in actions to be caught by rails and not bubble up to Cucumber (Aslak Hellesøy)
+* Negative tags can now be used in hooks, just like the command line's --tags option: Before('~@yarr') - will run for all scenarios that *don't* have the @yarr tag. (Aslak Hellesøy)
+* Transform has current "World" scope (Larry Diehl)
+* Other Transforms can be reused by calling Transform with a string inside of another Transform definition (Larry Diehl)
+* Execute "After" hooks in reverse order of declaration for better behavior with dependent blocks and to mimic the behavior of at_exit (David Waite)
+
+=== Bugfixes
+* features/support/env.rb runs commands twice (bugfix cuts total time by almost 50% w00t) (#452 Jim Meyer)
+* Problems adding custom formatters to features/support. (features/support is added to $LOAD_PATH) (#449 Aslak Hellesøy)
+* Some options set in cucumber.yml profiles are ignored (#446 Leonard CHIN)
+* Missing step_definition snippets not properly displayed (#433 Aslak Hellesøy)
+* rspec-rails, :lib => false (#447 David Chelimsky)
+* Cucumber with Spork breaks on OS X Snow Leopard (#431 David Chelimsky)
+
+=== Changed Features
+* Tag names passed on the command line *always* have to use the @ sign. --tags foo or --tags ~bar won't work. Use --tags @foo or --tags ~@bar (Aslak Hellesøy)
+
+=== Removed features
+* The Cucumber::Rails.bypass_rescue no longer exists. Errors will always bubble up, unless you use the new @allow_rescue tag. (Aslak Hellesøy)
+* The Cucumber::Rails.use_transactional_fixtures no longer exists. Transactional fixtures are always enabled for the cucumber environment. (Aslak Hellesøy)
+
+== 0.3.101 2009-09-15
+
+Two exciting things in this release. Step Argument Transforms and a PDF formatter you can use to send
+your features to your customer for review!
+
+=== New Features
+* New pdf formatter (#425 Mads Buus)
+* Step Argument Transforms: These let you use the Transform method to register regular expressions
+ to catch and transform/coerce arguments before they are yielded to step definitions:
+ http://wiki.github.com/aslakhellesoy/cucumber/step-argument-transforms (Larry Diehl & Dave Astels)
+* Adding webrat steps for asserting content does or does not exist within a particular element
+ (using webrat's within method) (Kieran Pilkington)
+
+== 0.3.100 2009-09-09
+
+The JavaZone release!
+
+=== New Features
+* Added support for Uzbek (msarvar)
+* The file argument on the cucumber command line will replace contents of file on cli if file is prefixed with @ (Tero Tilus)
+
+=== Bugfixes
+* Backtraces on JRuby are handled in a cleaner way when the exception comes from Java (NativeException). (Aslak Hellesøy)
+* When exceptions occur in a Before block the rest of the scenario is now skipped (#331 Matt Wynne)
+
+== 0.3.99 2009-09-03
+
+=== New Features
+* Support for Croatian (Bkrsta)
+* Make #feature available from scenario so you can do: Before{|scenario| scenario.feature}. (Aslak Hellesøy)
+* cucumber.yml parsing supports ERB syntax (#427 Gregory Hnatiuk)
+* New AfterConfiguration hook added; a block can be specified that takes Cucumber::Cli::Configuration (#423 Brent Snook)
+* Cucumber::Cli::Configuration#feature_dirs and #out_stream exposed as public attributes so that they may be used in AfterConfiguration hook (#423 Brent Snook)
+
+== 0.3.98 2009-08-25
+
+Just a small release to help Cuke4Duke, which will be presented at Agile2009
+in 2 days.
+
+=== New Features
+* Backtrace filtering now happens in StepInvocation class, meaning other languages (Cuke4Duke) can get backtraces stripped. (Aslak Hellesøy)
+* Cucumber::Ast::Table#map_headers now allows for a block that will convert all the headers. See docs for details. (Ben Mabey)
+
+== 0.3.97 2009-08-23
+
+The AA-FTT release. Creating a release for the AA-FTT meeting in Chicago so that we can play
+with the new language API and maybe knock out some better .NET support.
+
+=== Bugfixes
+* Allow comments on examples sections underneath scenario outlines (#420 Mike Sassak)
+* Table.map_headers! will fail with a decent error message when 0 or 2+ headers are matched. (Aslak Hellesøy)
+* Fixed an issue with comments with preceding spaces after a background causing a parse error (#401 Joseph Wilk)
+
+=== New Features
+* The public API is documented and there is a new :sdoc task to generate nice searchable API docs.
+* Add :default => :cucumber when setting up Rake tasks for Cucumber in Rails (Aslak Hellesøy)
+* New When /^I fill in "([^\"]*)" for "([^\"]*)"$/ Webrat step for Rails (Aslak Hellesøy)
+
+=== Changed Features
+* Changed the Programming Language API to support languages without "bleed through" (e.g. rubypython can't invoke ruby objs) (Aslak Hellesøy)
+* The Programming Language API manages hooks on the language level instead of on the step mother level (Aslak Hellesøy)
+
+== 0.3.96 2009-08-15
+
+This release doesn't have any significant new features or bug fixes, but there are big
+internal changes. This release has a new API for plugging in other programming languages.
+You can read more about that here: http://groups.google.com/group/cukes/browse_thread/thread/b9db8bf1f3ec9708
+
+This might break other tools that are using Cucumber's internal APIs. For example Spork broke and had to
+be patched. Please upgrade to Spork 0.5.9 if you are using Spork.
+
+=== New Features
+* Ability to preload natural language in Spork's prefork. Rerun script/generate cucumber --spork to see how. (Aslak Hellesøy)
+* Ability to control which DRb port is used via the --port flag or by setting CUCUMBER_DRB environment variable. (Chris Flipse)
+* Upgrade Rails generator to use webrat 0.5.0. (Aslak Hellesøy)
+* Upgrade Sinatra example to work with rack-test 0.4.1 and webrat 0.5.0. (Aslak Hellesøy)
+
+=== Changed Features
+* --strict will cause an exit code 1 for missing and pending (used to be for missing only). (Mads Buus)
+* junit formatter doesn't report pending steps unless --strict is used. (Mads Buus)
+
+== 0.3.95 2009-08-13
+
+This release improves Webrat support for table-like HTML markup. Now you can easily turn the HTML
+elements table, dl, ol and ul elements into a 2D array. This is particularly useful for comparing
+data in your HTML with a Cucumber table using Cucumber::Ast::Table#diff!
+
+This release also fixes several bugs related to --drb (Spork) and profiles (cucumber.yml)
+
+=== Bug Fixes
+* --guess will always prefer the longest regexp with no groups if they exist.
+* Prevent delays if a NoMethodError is raise in a step definition. Define a light #inspect in World. (#374 Aslak Hellesøy)
+* Restore 'features' as the default feature running path. (#412 Ben Mabey)
+* --drb degrades gracefully when no drb server is running and no formatter is provided. (#410 Ben Mabey)
+* --language picked up from profiles again. (#409 Ben Mabey)
+* Resolved infinite loop problem when --drb was defined in a profile. (#408 Ben Mabey)
+
+=== New Features
+* Cucumber::World#table has been overloaded to work with 2D Array in addition to a table String to be parsed.
+* New When /^I fill in the following:$/ step definition for Webrat. Useful for filling out a form with a Table. (Aslak Hellesøy)
+* The object returned by element_at (Webrat::Element) has a #to_table that works for table, dl, ol and ul. (Aslak Hellesøy)
+* An explanation of why failures are ok is printed when --wip is used. (Aslak Hellesøy)
+* Added cucumber alias for cucumber:ok in Rails Rake tasks. (Aslak Hellesøy)
+
+=== Changed features
+* element_at('table').to_table should be used instead of table_at('table').to_a. The old way is deprecated but still works. (Aslak Hellesøy)
+* element_at (and the depracated table_at) no longer takes a DOM id, only CSS selectors. Change "my_id" to "#my_id". (Aslak Hellesøy)
+
+== 0.3.94 2009-08-06
+
+Kanban take II.
+
+Release 0.3.6 introduced a new --wip switch that can be used to limit work in progress
+(WIP). Limiting WIP is central for Kanban Software Development (http://www.infoq.com/articles/hiranabe-lean-agile-kanban).
+
+However, this feature went mostly unnoticed, and because we think it's so great we have decided
+to make it the default for Rails projects. When you bootstrap your Rails project for Cucumber
+you will now get 2 Cucumber Rake tasks for Kanban development:
+
+ cucumber:ok : Run features that should pass. This runs your "good,old" features
+ cucumber:wip : Run the features you're working on that don't pass yet. Tag them with @wip. Max 2!
+
+So upgrade today and get into the habit of tagging new features with @wip (or invent your own tags).
+You'll achieve better flow this way.
+
+=== New features
+* Support limiting the number of feature elements with certain tags (#353 Joseph Wilk)
+* script/generate cucumber sets up 'cucumber:ok' and 'cucumber:wip' tasks and deprecates 'features'. More Kanban love. (#344 Aslak Hellesøy)
+* Better JUnit formatter: feature->testsuite, scenario->testcase. Better timing and support for background and scenario outline. (Mads Buus Westmark)
+* Added examples/python that uses rubypython. (Aslak Hellesøy)
+* Checks the number of available colors on the terminal with ruby-terminfo if ruby-terminfo is installed.
+ This prevents Apple's Terminal.app from stalling (Yugui - Yuki Sonoda).
+ * Set 'xterm-256color' to TERM if your terminal supports grey.
+ * ruby-terminfo is available as genki-ruby-terminfo gem from github.
+* Document builtin formatters with --help. (#406 Aslak Hellesøy)
+* Added support for using regular expressions when mapping table headers. (Peter Williams)
+
+== 0.3.93 2009-08-03
+
+Highlights in this release: Improved profile handling (cucumber.yml) and a fix for cucumber hanging.
+
+=== New features
+* script/generate cucumber --spork now sets up a spork gem dependency in the cucumber.rb environment. (Aslak Hellesøy)
+* Feature files defined on the command line override any that are present in profiles. (#344 Ben Mabey)
+* Default (STDOUT) formatter defined in profile can be overridden from the command line. (#344 Ben Mabey)
+* Displays which profile, if any, is being used. (Ben Mabey)
+* click_link_within(parent, link) webrat step (Joakim Kolsjö)
+
+=== Bugfixes
+* script/cucumber correctly loads the gem's binary if the plugin isn't installed.
+* Cucumber hangs waiting for Ctrl+C if an Error is raised. (#374 Aslak Hellesøy)
+
+== 0.3.92 2009-07-29
+
+This release has some minor improvements to the new Table.diff! functionality. For example,
+if you're using Webrat and you want to compare a feature table with a HTML table containing
+links in one of the columns, you can do:
+
+ actual = Cucumber::Ast::Table.new(table_at('table').to_a)
+ actual.map_column!('Name') { |text| text.strip.match(/>(.*))[1] }
+ table.diff!(actual)
+
+=== New features
+* Allow Step Definitions to accept mix of required & optional args (Niels Ganser)
+* table_a.diff!(table_b) now uses column conversions from both tables (Table#map_column!) (Aslak Hellesøy)
+
+=== Bugfixes
+* Upgrade Sinatra example to work with rack-test 0.3.0 and aslakhellesoy-webrat 0.4.4.1 (Aslak Hellesøy)
+* require 'cucumber/webrat/table_locator' added to Spork environment for Rails (Anders Furseth)
+
+=== Changed Features
+* The 'default' profile is now ALWAYS used unless you specify another profile or use the -P or --no-profile flag. (#344 Ben Mabey)
+
+== 0.3.91 2009-07-27
+
+=== New Features
+* CTRL-C will exit immediately instead of carrying on until all features are run. (Aslak Hellesøy)
+* Run can be stopped programmatically by setting $cucumber_interrupted = true, for example in an After block. (Aslak Hellesøy)
+* Support limiting the number of feature elements with certain tags (#353 Joseph Wilk)
+* Table support for cuke4duke
+
+== 0.3.90 2009-07-22
+
+The Hot summer release
+
+This is a hot summer in Norway, and Cucumbers are growing in abundance. To celebrate this we give you
+a new release with lots of new features and bugfixes. This is also one of the last releases in the 0.3 series
+(hence the 0.3.90 number), so 0.4 (or maybe 1.0!) will be coming up soon. The highlights of this release are:
+
+=== Egality
+
+English is not the world's most spoken language, so why should Cucumber force non-English speakers to use the
+--language flag? As of this release you're no longer forced to do that. Instead, you can add a comment header
+to your .feature files:
+
+ # language: fr
+ # Cucumber understands that this is French
+ Fonctionnalité: Trou de boulette
+
+If you don't have that header, Cucumber will work as before - using whatever you specified with --language,
+or default to English if no --language option was specified. A nice side effect of this is that you can now
+have features in several languages side by side and run them in the same cucumber. (Not recommended unless
+you want to take polyglot programming to an extreme level).
+
+=== Table diffing (experimental)
+
+When you pass a table as an argument to your Then steps you often want to compare that table
+to some actual values. In previous releases you had to iterate over the table's values and manually
+compare each row using cell.should equal('foo') or assert_equal('foo', cell). If a discrepancy was found
+you'd get an error, but it was hard to see how the entire expected data set was different from the actual one.
+
+With this release you have a much more powerful way to compare expected tables with actual data. An
+Ast::Table object now has a new #diff!(table) method that you can invoke in your step definitions
+that take table arguments. If the table you pass in is different from the expected table (from your
+plain text step), Cucumber will print the difference for each of the row or column and fail your step.
+
+The Table#diff! method expects an Array of Array, Array of Hash (similar to what you'd get from table#hashes)
+or simply another Ast::Table object. Here is a simple example:
+
+ Then /^I should see the following cukes:$/ do |expected_cukes_table|
+ actual_table = ... # For example [['Latin', 'English'], ['Cucumis sativus', 'Cucumber'], ['Cucumis anguria', 'Burr Gherkin']]
+ expected_cukes_table.diff!(actual_table)
+ end
+
+As an extra bonus we provide Webrat users with a new #table_at(selector) method that you can use to transform
+an HTML table into an Array of Array, so that you can easily compare the contents of your HTML table to
+expected data passed to a step. Here is an example:
+
+ Then /^I should see the following cukes:$/ do |expected_cukes_table|
+ expected_cukes_table.diff!(table_at('#cuke_table').to_a)
+ end
+
+You can do the same trick to compare data from a Rails ActiveRecord table (although this is not a
+recommended practice - your Then steps should compare against what users *see*, not what's in the
+database):
+
+ # This requires that you use the column names in the header of the plain text expected table
+ Then /^I should have the following cukes in the database:$/ do |expected_cukes_table|
+ expected_cukes_table.diff!(Cuke.find(:all).map(&attributes))
+ end
+
+=== Environment variables
+
+Another useful new feature is the ability to define environment variables on Cucumber's command line (just
+like you can with Rake). Example:
+
+ cucumber FOO=BAR --format progress features
+
+You can now pick up ENV['FOO'] in ruby (for example in env.rb) and take actions according to the value,
+for example enabling your super hack that validates all HTTP responses for XHTML validity.
+
+This release also has several bugfixes related to --format and Before/After hooks.
+
+=== Bugfixes
+* Fix some misspellings which affect test fail for Korean example (#373 Dongju Kim)
+* Make it possible to write non-localized step definitions (#377 Aslak Hellesøy)
+* Table cells containing unicode are rendered incorrectly (#386 Stefan Kanev)
+* Before and After hooks run after everything is finished when there are 2+ --format options (#371 Aslak Hellesøy)
+* When using --out and two --format the first is not delivered inline with execution of features (#361 Aslak Hellesøy)
+* Profile Formatter broken (#370 Aslak Hellesøy)
+* Default profile usage with --drb flag degrades gracefully with no server. (#367 Ben Mabey)
+* JUnit formatter uses original file name instead of narrative to avoid accidental duplicate XML files (Aslak Hellesøy)
+* rake gems no longer lists cucumber as a [F]ramework gem (David Chelimsky)
+* CLI issues correct exit code when using --drb. Requires Spork version >= 0.5.1. (#355 Ben Mabey)
+* Make sure script/generate cucumber --spork uses the cucumber Rails environment (Philippe Lafoucrière)
+* Fixed bug with rake task raising errors with feature files with spaces (#380 Joseph Wilk)
+
+=== New Features
+* I should see should support regexes (#382 John Ferlito)
+* Access to scenario outline name from After hook scenario parameter (#342 Aslak Hellesøy)
+* Allow multiple --tags switches to be passed
+* Load step definitions from vendored gems and plugins (#388 Mike Burns)
+* New --format steps formatter. Variant of the usage formatter that lists available step definitions (Demetrius Nunes)
+* Possibility to specify scenario language as part of the .feature file (#345 Aslak Hellesøy)
+* Support specifying environment variables using foo=bar syntax on command line or in profiles (#362 Bryan Helmkamp)
+* Display failing scenarios at the end of pretty format to make it easier for people to play them back (#360 Ryan Bigg)
+
+=== Changed Features
+* When using --tags, positive tags are &&'ed while negative tags are ||'ed (John Wilger)
+* The data returned from Table#hashes and similar methods are frozen. Dup if you need to modify. (Aslak Hellesøy)
+* Visitor.visit_table_cell_value(value, col_width, status) is now visitor.visit_table_cell_value(value, status)
+
+== 0.3.11 2009-06-05
+
+This release just fixes a tiny bug in the formatter to fix an incompatibility
+with the latest RedMine release. It should have been included in 0.3.10, but
+was forgotten.
+
+=== Bugfixes
+* Formatter API was broken in 0.3.9 (Roman Chernyatchik)
+
+== 0.3.10 2009-06-05
+
+The Spork Release!
+
+This release has an exciting new feature - a new --drb switch! This magic switch lets you run your
+features much faster than before, because you can eliminate the startup time for your code. This is
+thanks to a brand new gem called Spork by Tim Harper and Ben Mabey. (You can find out more about Spork
+here: http://github.com/timcharper/spork/tree/master). You can start Spork and have it preload your
+application in a separate process. Spork listens for DRb connections, and when you run cucumber with
+--drb the features will run inside the Spork server instead. Spork provides two simple hooks for preloading
+your application - one for framework/stable code (Spork.prefork) and one for the code that *you* write and
+change often (Spork.each_run). Keep in mind that all World, Before, and other Cucumber hooks need to be
+in the Spork.each_run block. Using Spork works great for Ruby on Rails, which can take a while to load,
+but --drb and Spork aren't tied to Rails at all. The new --drb switch also works great alongside autotest
+(just add --drb to your autotest profile in cucumber.yml), so now you can get even faster feedback.
+
+Cucumber's built-in cucumber generator now has a new --spork switch, so when you bootstrap your Rails
+application for cucumber, you can have spork configuration set up out of the box. (It's just a
+slightly different env.rb.)
+
+Although Spork was in mind when the --drb switch was added it is important to realize that all that was added
+to Cucumber was a DRb client. Any DRb server that adheres to this protocol can be used with Cucumber's --drb
+switch. While Spork is geared towards removing the load time to give you a faster feedback loop you could
+just as easily use this client with a server that distributes your features to run in parallel. Someone just
+needs to write such a server. ;)
+
+This release also has some minor bugfixes related to RSpec and Rails interop.
+
+=== Bugfixes
+* RSpec's be_* matchers did not work in 0.3.9 and probably earlier versions. Now they do. (Aslak Hellesøy)
+* The Rails cucumber environment won't declare gem dependencies if the plugin exists. (Aslak Hellesøy)
+* The Rails cucumber generator will no longer declare gem dependencies on rspec if you use --testunit. (Aslak Hellesøy)
+
+=== New features
+* Spork support via --drb. (Ben Mabey)
+* Added a Ast::Feature#name method for convenience. (Aslak Hellesøy)
+
+=== Changed features
+* The HTML formatter wraps examples in a div, and distinguishes between Scenario and Scenario Outline. (Aslak Hellesøy)
+
+== 0.3.9 2009-05-27
+
+Bugfix release for 0.3.8 released earlier today. 0.3.8 had a bug in the Rails cucumber
+generator which is fixed in 0.3.9.
+
+=== Bugfixes
+* Fix broken Rails cucumber generator (Tim Glen)
+* The Cucumber Rake task in non-fork mode will properly cause Rake to exit with 1 when Cucumber fails. (Aslak Hellesøy)
+
+== 0.3.8 2009-05-27
+
+This Cucumber version fixes several bugs related to Ruby on Rails and RSpec. If you
+use Cucumber with a Rails app we *strongly* recommend you bootstrap Cucumber again:
+
+ ruby script/generate cucumber
+
+=== New Features
+* Rails cucumber generator sets up default gem dependencies in cucumber environment.
+* The duration of a run is reported by formatters - same format as the Linux time command (#228 Aslak Hellesøy)
+* Scenario and ExampleRow objects (passed to Before and After hooks) have #name and #line methods (#316 Aslak Hellesøy)
+* Rails generator creates a cucumber environment file to avoid potential cache_classes conflicts in test.rb (#165, Ben Mabey)
+* HTML formatter renders @tags (but the CSS is still ugly)
+
+=== Removed/changed features
+* The Cucumber Rake task will again fork by default (as 0.3.3 and earlier). Forking must be turned off explicitly. (Aslak Hellesøy)
+
+=== Bugfixes
+* Better coexistence with RSpec - Cucumber now *neuters* the part of RSpec that tries to parse ARGV.
+* The differ= exception is gone (#325, #340 Aslak Hellesøy)
+
+== 0.3.7 2009-05-22
+
+This is the "Help JetBrains RubyMine" release!
+
+=== New Features
+* Added new Given alias for Catalan: Donat|Donada (Lleïr Borràs Metje)
+* New --expand option. This will print Scenario Outlines once for each Example row - with values expanded. (#327 Aslak Hellesøy)
+* You can override the formatter in Rails-generated rake tasks with the CUCUMBER_FORMAT environment variable (#335 Aslak Hellesøy)
+
+=== Bugfixes
+* 'specs' folder needs to be renamed back to 'spec' (#339 Aslak Hellesøy)
+* CUCUMBER_OPTS doesn't work for cucumber rake tasks (#336 Aslak Hellesøy)
+
+== 0.3.6 2009-05-20
+
+Kanban! With this release you can tag features or scenarios that are work in progress
+with a tag and use the new --wip switch.
+
+Another handy feature in this release is that you can package your own formatters in RubyGems.
+
+=== New features
+* New --wip switch. See http://www.jroller.com/perryn/entry/bdd_on_a_multi_disciplined (Perryn Fowler)
+* Added a AfterStep hook (Luke Melia)
+* New aliases for Vietnamese (Ngoc Dao)
+* Automatic require of custom formatters. --require is no longer needed to load them, and they can be in Ruby gems. (Aslak Hellesøy)
+* Lazy loading of built-in formatters. Should improve startup time a little bit.
+
+=== Bugfixes
+* Gracefully handle exceptions in After block (#330 Matt Wynne)
+* Feature with only Background doesn't run hooks (#314, #329 Aslak Hellesøy)
+
+== 0.3.5 2009-05-14
+
+Let's make a new release today because two annoying bugs are fixed.
+
+=== Bugfixes
+* Allow feature element names to contain Gherkin keywords as long as they are not the first word on a newline (#319, #307 Joseph Wilk)
+
+== 0.3.4 2009-05-14
+
+A couple of great new features in this release. Running with Rake is faster than before,
+and there is a brand new JUnit formatter - great for Continuous Integration reports!
+
+This release was made especially for the Oslo XP Meetup today.
+
+** IMPORTANT UPGRADE NOTES FOR RAILS USERS **
+
+Running Cucumber features in the same Ruby interpreter as Rake doesn't seem to work,
+so you have to explicitly tell the task to fork (like it was doing by default in prior
+versions). In lib/tasks/cucumber.rake:
+
+ Cucumber::Rake::Task.new(:features) do |t|
+ t.fork = true # Explicitly fork
+ t.cucumber_opts = %w{--format pretty}
+ end
+
+(If you run script/generate cucumber this will be done for you).
+Alternatively you can omit forking and run features like this:
+
+ RAILS_ENV=test rake cucumber
+
+However, setting the RAILS_ENV is easy to forget, so I don't recommend relying on this.
+
+=== Bugfixes
+* Hooks (World, Before, After) are no longer executed when --dry-run (Aslak Hellesøy)
+* Proper UTF8 use in HTML formatter (Herminio Torres)
+* Problem with multiple terms in languages.yml (#321 Aslak Hellesøy)
+
+=== New features
+* New JUnit formatter (Gareth Jones)
+* Support for Vietnamese (Ngoc Dao)
+* Added aliases for Feature and But in Japanese (Leonard Chin)
+* Support for Catalan (Francesc Esplugas)
+
+=== Changed features
+* --exclude flag now works on ruby files in addition to feature files (#312 Ben Mabey)
+* The Java example under examples/java uses Ant instead of Rake - and the new JUnit formatter.
+* Rake task should not shell out (#297 Aslak Hellesøy)
+ The Cucumber Rake task will run Cucumber in the same Ruby interpreter as Rake itself
+ unless explicitly told to fork a new interpreter. This is to increase speed. You can
+ force a new interpreter by setting fork=true or rcov=true in the task.
+
+== 0.3.3 2009-05-10
+
+Minor bugfix release, made specially for EuRuKo!
+
+=== Bugfixes
+* Summaries are no longer printed in an empty () if there are no scenarios/steps (Aslak Hellesøy)
+* Background, Scenario Outline, Before Hook interaction (#309 Aslak Hellesøy)
+* Multiline String snippets no longer give misleading info. It's a String, not a PyString that's sent to step def.
+
+=== Removed/changed features
+* New aliases: --no-source/-s, --name/-n (#317 Lonnon Foster)
+
+== 0.3.2 2009-05-05
+
+This release has some minor bug fixes and new features.
+Nothing major, but we need a release for RailsConf'09 in Las Vegas!
+
+=== Bugfixes
+* rake tasks with profiles not respecting --require flags (#311 Ben Mabey)
+* Step table with blank cell fails (#308 JohnnyT)
+* Fixed error where unused table cells in Examples where raising exceptions due to having no status (#302 Joseph Wilk)
+
+=== New features
+* Support for Hebrew (Ido Kanner)
+* Summary should report scenarios (#32 Aslak Hellesøy)
+* Examples and the associated tables are indented one level deeper than Scenario Outline. (Aslak Hellesøy)
+* Added support for Examples selection when using --name. (#295 Joseph Wilk)
+
+== 0.3.1 2009-04-26
+
+This release has several minor bug fixes and new features. With the addition of Latvian and Hungarian Cucumber
+now supports 32(!!) languages.
+
+=== New features
+* Support multiline names for Scenarios, Scenario Outlines, Backgrounds, Examples (#231 Joseph Wilk)
+* Added #headers to Cucumber::Ast::Table (Ben Mabey)
+* New translation for Latvian (Vitauts StoÄka)
+* New translation for Hungarian (#287 Bence Golda)
+* Pick up failure on after hook (#272 Aslak Hellesøy)
+
+=== Bugfixes
+* Pretty formatter not colouring Examples tables correctly (#304 Aslak Hellesøy)
+* Problem using --scenario and Scenario Outline (#298 Aslak Hellesøy)
+* Tag Hook gets executed always there is a background (#301 Aslak Hellesøy)
+* Feature which only has a Background with steps causes an exception (#306 Aslak Hellesøy)
+* Gem no longer depends on Hoe (Aslak Hellesøy)
+* Span html tags appear on HTML results with 0.3.0 (#299 Aslak Hellesøy)
+* Fixed incorrect colours in pretty formatter's table headers for outline tables (Aslak Hellesøy)
+* Exceptions from steps called within hooks are now reraised. (#294 Ben Mabey)
+
+=== Removed/changed features
+* --scenario handle has been removed and replaced with --name which supports partial matches, regexp special characters, running named backgrounds (#295 Joseph Wilk)
+
+== 0.3.0 2009-04-14
+
+This release has some minor changes to the APIs, but big enough that a new major release is in order.
+The biggest change is the new semantics of the #World method. Previously you would call this method
+several times, passing a Proc and extending the world object of the previous one with a Ruby module.
+The problem was that there was no nice way to ensure the order in which these procs were called, which
+led to some unexpected situations. In this release you can only register a single World proc. If you
+want to extend a world with certain modules, you simply call the #World method with the module(s)
+you wish to extend the World with. The Sinatra example illustrates how to do this. Also check out
+the RDoc for Cucumber::StepMother#World.
+
+The Visitor API (which is used for formatters) has also changed slightly. However, we have tried to
+do this in a backwards compatible way, so if you have custom formatters for Cucumber 0.2 they should
+still work.
+
+One of the most significant new features is Tagged Hooks: http://wiki.github.com/aslakhellesoy/cucumber/hooks
+This lets you associate Before and After blocks with specific scenarios.
+
+We are also deprecating the step_list, step_pattern, feature_list, and feature_pattern accessors on
+Cucumber::Rake::Task. These accessors will be completely removed in version 0.4. For complex settings
+please rely on cucumber profiles in your rake tasks:
+http://wiki.github.com/aslakhellesoy/cucumber/using-rake#profiles
+
+=== New features
+* Use Hooks with @tags (#229 Aslak Hellesøy)
+* Rake task supports cucumber.yml profiles (#187 Ben Mabey)
+* Field value steps for Webrat (Jack Chen)
+* Added translation for Bulgarian (Krasimir Angelov)
+* Updated translation for Polish (#273 Grzegorz Marszałek)
+* Only a single World proc can be registered. World extension now happens by calling #World with ruby modules.
+* Portuguese uses Funcionalidade in stead of CaracterÃstica and accented words are aliased with unaccented ones (Alexandre da Silva and Felipe Coury).
+* The usage formatter also prints unused step definitions (Aslak Hellesøy)
+* Better exception if a World proc returns nil. (Aslak Hellesøy)
+* Allow Step Definitions to use |*varargs|, but only on Ruby 1.9. (Aslak Hellesøy)
+* Snippets for steps that use Step Tables or PyStrings include block param and object type hint comment (#247 Joseph Wilk)
+* Support description string for Backgrounds (#271 Joseph Wilk)
+
+=== Bugfixes
+* After methods not being executed when Background fails (#288 Luismi Cavallé)
+* Fixed dependency on internal files in rspec breaks cucumber w/ rspec-1.2.4 (#291 Aslak Hellesøy)
+* Fix color use when using autotest on Linux. (Hans de Graaff)
+* Fixed incorrect calculation of pystring indentation (#279 Eugene Naydanov)
+* Fixed --format html leads to an error (#252 Aslak Hellesøy)
+* Fixed Background runs twice (#255 Aslak Hellesøy)
+* Fixed Background Transactions and :xx (#270 Aslak Hellesøy)
+* Fixed Autospec failing with cucumber 0.2 (#254 Aslak Hellesøy)
+* Sibling file detecting not working (#278 Aslak Hellesøy)
+
+=== Removed/changed features
+* The visitor API has changed slightly:
+** #visit_step_name, #visit_multiline_arg and #visit_exception are no longer official API methods.
+** #visit_step_result replaces those 3 methods.
+** Table and PyString no longer hold status information. Each visitor subclass should store state in @state if needed.
+** #visit_py_string no longer takes a status argument.
+
+== 0.2.3 2009-03-30
+
+This release sports 4 updated languages, slightly better help with snippets if you "quote" arguments
+in your steps. Windows/JRuby users can enjoy colours and you get some more sugar with Tables.
+
+=== New features
+* Added new Then /^I should be on (.+)$/ do |page_name| step (Grant Hollingworth)
+* Use skipped_param color for examples table header (#266 Eugene Naydanov)
+* Added new Cucumber::Ast::Table#rows_hash method (Torbjørn Vatn)
+* Windows/JRuby users can now enjoy colourful output (via http://github.com/aslakhellesoy/ansicolor) (#166 Aslak Hellesøy)
+* Ambiguous step errors hint about --guess (unless --guess already on) (Aslak Hellesøy)
+* Added translation for Slovak (Ahmed Al Hafoudh)
+* Updated translation for Dutch (Bart Zonneveld)
+* Updated translation for Italian (Alessandro Baroni)
+* Updated translation for Japanese (KAKUTANI Shintaro)
+
+=== Bugfixes
+* Fixed step name after step keyword without space (#265 Aslak Hellesøy)
+* Backtrace is back in HTML reports (Aslak Hellesøy)
+
+== 0.2.2 2009-03-25
+
+This release includes some minor changes to make Cucumber work with pure Java. Cucumber
+has already worked with Java for a while (using JRuby and step definitions in Ruby),
+but now you can write step definitions in pure Java!
+
+Check out the Cucumber Java project for more details:
+http://github.com/aslakhellesoy/cucumber_java/tree/master
+
+== 0.2.1 2009-03-25
+
+This release fixes a few minor bugs and adds a couple of new features.
+
+== Bugfixes
+* Fixed Cucumber, and rails controller error handling (#49 Matt Patterson)
+* HTML Formatter doesn't work correctly with scenario Outlines. (#260 Aslak Hellesøy)
+* After blocks are run in reverse order of registration. (#113 Aslak Hellesøy)
+* Snippets are showing 'Ands' (#249 Aslak Hellesøy)
+
+=== New features
+* Snippets use a regexp and block arguments if the step name has "quoted" arguments. (Aslak Hellesøy)
+* Cucumber::Ast::Feature#to_sexp includes the file name. (Aslak Hellesøy)
+* support/env.rb is not loaded when --dry-run is specified. This is to increase performance. (Aslak Hellesøy)
+* New usage formatter. This is the foundation for editor autocompletion and navigation between steps and step definitions. (#209 Aslak Hellesøy)
+
+=== Removed features
+* -S/--step-definitions option introduced in 0.2.0 is removed. Use --format usage [--dry-run] [--no-color].
+
+== 0.2.0 2009-03-18
+
+This release sports a bunch of new and exciting features, as well a major rewrite of Cucumber's internals.
+The rewrite was done to address technical debt and to have a code base that is easier to evolve and maintain.
+
+There are some changes to the Gherkin language that breaks backwards compatible with the 0.1.x series.
+Most importantly, "GivenScenario" and "More Examples" no longer exist. See the "Removed features" section
+below for more details on how to use alternatives.
+
+Since the grammar has changed, there are some new keywords. We have to rely on the community
+to provide updated translations. This is much easier than before - just update languages.yml.
+There is no static code generation anymore. To list all languages:
+
+ cucumber --lang help
+
+And to list the keywords for a particular language:
+
+ cucumber --lang en-lol help
+
+There are some really awesome new features in this release: Tagging, Autoformatting, automatic
+aliasing of keywords in all languages, full Ruby 1.9 support and improved output
+for multiline arguments are some of the highlights.
+
+== Bugfixes
+* New StepInvocation breaks console formatter for pending steps. (#241 Jacob Radford)
+* Within Scenario Outlines when replacing with a nil in a step name use empty string instead. (#237 Joseph Wilk)
+* Fixed bug with Scenario Outlines incorrectly replacing values in step tables with nil. (#237 Joseph Wilk)
+* Within Scenario Outlines when replacing with a nil in multiline strings use empty string instead. (#238 Joseph Wilk)
+* Re-structure the ast: Feature -> Background -> (Scenario|ScenarioOutline)*. Fixes bug with background being called outside transactions. (#181 Joseph Wilk)
+* --strict always exits with status 1 (#230 Tim Cuthbertson)
+* Fix error with nil values in tables raising an exception (#227 Joseph Wilk)
+* Add support for using << in formatters to ensure the html formatter works (#210 Joseph Wilk)
+* Explicitly require env.rb files first to avoid potential load order problems. (#213, Ben Mabey, Randy Harmon)
+* Depend on polyglot version (0.2.4) to avoid masking require errors. (Aslak Hellesøy).
+* -n option does not suppress the line info for a Scenario Outline (#175 Aslak Hellesøy)
+* Errors with rspec-rails matchers in cucumber 0.1.99 (#173 David Chelimsky)
+* Can't use an empty string as a table value in a scenario outline (#172 Aslak Hellesøy)
+* Really skip skipped steps (#90 Aslak Hellesøy)
+* No output for multi-line strings (#71 Aslak Hellesøy)
+* Fix cucumber/formatter/unicode flaws on Windows (#145 Michael)
+* Autotest-related Bugs: YAML missing (#136 Tobias Pape)
+* Overeager "rescue LoadError" hides lots of errors (#137 Jonathan del Strother)
+* Nested steps don't show mismatch (#116 Aslak Hellesøy)
+* Pending steps in > steps called from steps (#65 Aslak Hellesøy)
+
+=== New features
+* Australian translation (Josh Graham)
+* Added World#announce(announcment) which lets you output text to the formatted output (#222 Rob Kaufmann)
+* Added Table#transpose to to allow use of vertically aligned table keys (Torbjørn Vatn, Aslak Hellesøy)
+* Added Table#map_headers to to allow use of more readable headers (Rob Holland)
+* New -S/--step-definitions option. Useful (among other things) for tools that implement automcompletion. (#208 Aslak Hellesøy).
+* The cucumber.rake file defines a dummy :features task if Cucumber is not installed (#225 Josh Nichols)
+* Added Table#map_column! to ease casting of cell values into relevant types (#223 Rob Holland)
+* New --no-diff option (#218 Bryan Ash)
+* Rails generators supports testunit and rspec option, defaulting to rspec (#217 Josh Nichols)
+* Sinatra Example (#204 Rob Holland)
+* Keywords can be aliased in languages.yml. See English for an example (examples: Examples|Scenarios)
+* Adding support for Background (#153 Joseph Wilk)
+* Added ÄŒesky/Czech (Vojtech Salbaba)
+* New --no-multiline option to reduce noise in output. Useful if lots of features are failing. (Aslak Hellesøy)
+* Added ability to pass URIs to cucumber in addition to files and directories. Useful for troubleshooting! (Aslak Hellesøy)
+* Groups of tabular scenarios (#57 Aslak Hellesøy)
+* Tagging scenarios and features. Pick the ones to run with --tags (#54 Aslak Hellesøy)
+* Make the current scenario available to the steps. (#44 Aslak Hellesøy)
+* Step definition snippets contain a 'pending' call (#84 Aslak Hellesøy)
+* Call multiline steps from other steps (#144 Aslak Hellesøy)
+* Run cucumber with --autoformat DIR to reformat (pretty print) all of your feature files. (Aslak Hellesøy)
+* New --strict option exits with an error code if there are undefined steps. (#52 Aslak Hellesøy)
+* Given, When, Then methods (used in step definitions) are automatically aliased to current language. Use $KCODE='u' in env.rb if needed.
+* Run cucumber --language help to see all supported languages. (Aslak Hellesøy)
+* Run cucumber --language LANG help to see keywords for a given language. (Aslak Hellesøy)
+* Multiline arguments (tables and """ strings) are printed in the output. (Aslak Hellesøy)
+* It's no longer necessary to compile the Treetop grammar when adding a new language. Localised parser is generated at runtime. (Aslak Hellesøy)
+* New --guess option tries to guess the best step definition match instead of raising Cucumber::Multiple. (Jake Howerton)
+
+=== Removed features
+* "GivenScenario" is gone. Instead you can call Steps from Step Definitions, or use the new Background feature (#153)
+* "More Examples" is gone. "Scenario" + "More Examples" is no longer supported. Use "Scenario Outline" + "Examples" instead.
+* Pure Ruby features are no longer supported.
+* Remove --color option in autotest. Can be added manually in cucumber.yml (#215 Jean-Michel Garnier)
+
+== (0.1.16.4 aslakhellesoy-cucumber gem on GitHub)
+
+Bugfix release.
+
+IMPORTANT NOTE FOR RAILS USERS.
+The template used to generate your features/support/env.rb has changed. You have to apply a minor change
+manually for existing Rails projects when you upgrade to this version. Change this:
+
+ require 'webrat/rspec-rails'
+
+to this:
+
+ require 'webrat/core/matchers'
+
+=== New features
+* Finnish translation (Tero Tilus)
+* Use Webrat's #contain matcher in generated "I should (not) see" step definitions (Bryan Helmkamp)
+
+== Bugfixes
+* Escaped quotes - \" - inside multiline strings will be unescaped.
+* Flush output in HTML formatter since JRuby doesnt do it automatically (Diego Carrion)
+* Better handling of ARGV (#169 David Chelimsky, Ben Mabey)
+* Compatibility with ruby-debug (do ARGV.dup in bin/cucumber so it can restart ruby with same args) (Aslak Hellesøy)
+
+== 0.1.16 2009-01-19
+
+This is a small bugfix release. The most notable improvement is compatibility with Webrat 0.4. Rails/Webrat users should
+upgrade both Cucumber and Webrat gems.
+
+=== New features
+* Allow argument placeholders in step tables and multiline comments (#121 Joseph Wilk)
+* Scenario Outline can be followed by several named Examples sections (#123 Aslak Hellesøy)
+* Add the #binary= method back to the Rake task. It is needed by merb_cucumber for running the features of a merb app with it's bundled gems. (Thomas Marek)
+* Added a /^When I go to (.+)$/ step definition to webrat_steps.rb and a simple page name to path mapping method (Bryan Helmkamp)
+
+=== Bugfixes
+* Fix to run single scenarios when the line number specified doesn't correspond to a step (i.e. blank lines or rows) (#160 Luismi Cavallé)
+
+=== Removed features
+
+== 0.1.15 2009-01-08
+
+Bugfix release
+
+=== New features
+* í•œêµì–´! (Korean!) (John Hwang)
+
+=== Bugfixes
+* --dry-run skips running before/after/steps (#147 Ian Dees)
+* Fix a minor bug in the console formatter's summary (David Chelimsky)
+* Better quoting of Scenario names in Autotest (Peter Jaros)
+* Added some small workarounds for unicode handling on Windows (Aslak Hellesøy)
+
+== 0.1.14 2009-01-04
+
+This is the first release of Cucumber that runs on Ruby 1.9. There are still some encoding-related issues
+with Arabic (ar), Japanese (ja) and Simplified Chinese (zh-CN). Patches are welcome. Other than that -
+a couple of minor bug fixes and polishing.
+
+=== New features
+* Pretty formatter shows number of scenarios (#139 Joseph Wilk)
+* Rudimentary support for Ruby 1.9. Now it's ok to file Ruby 1.9-related bugs.
+
+=== Bugfixes
+* Fixed "No such file or directory -- cucumber (LoadError)" bug with AutoTest (Aslak Hellesøy)
+* Fixed `load_missing_constant': uninitialized constant Dispatcher error with Rails (Aslak Hellesøy)
+
+=== Removed features
+* The #binary= method is gone from the Rake task. It will always point to the binary in the current gem. (Aslak Hellesøy)
+
+== 0.1.13 2008-12-20
+
+It's time for some new features again. Output is now much better since you can use diffing, tweak
+the output colours and get the full --backtrace if you want. Managing your support/* files became
+a little easier since they are now always loaded before the step definitions. Life became easier
+for Windows users in Norway (and other countries using unicode in the features). Plus several other
+bug fixes.
+
+Enjoy!
+
+=== New features
+* Console output is no longer bold, but regular. Step arguments are bold instead of blold+underlined. (Aslak Hellesøy)
+* Console output can be configured with CUCUMBER_COLORS in your shell. (Aslak Hellesøy)
+* Added new --backtrace option to show full backtrace (Aslak Hellesøy)
+* Enable RSpec's diffing automatically if RSpec is loaded (Aslak Hellesøy)
+* Files in support directories are loaded before any other file (i.e. step definitions.) (#120, Ben Mabey)
+* The Rails features generator got some love and is now tested: http://github.com/aslakhellesoy/cucumber_rails (Aslak Hellesøy)
+* --language is aliased to -l instead of -a (-l became available when --line was refactored) (Aslak Hellesøy)
+* Scenario Outlines which through placeholders in the steps allow control of how scenario table values are used. (#57 Joseph Wilk)
+* Scenario Outlines are now usable in pure ruby (Joseph Wilk)
+* Add support for calling 'pending' from step definitions. (#112 Joseph Wilk)
+
+=== Bugfixes
+* Make rails before filters work correctly (#122, #129 Guillermo Ãlvarez Fernández)
+* Proper Unicode support for Windows command shells: Just require cucumber/formatter/unicode in env.rb (Aslak Hellesøy)
+* Fixed disappearing "a" on Windows (#81 Aslak Hellesøy)
+* Fixed a bug where row step outlines were loosing step tables. (#121 Joseph Wilk, Ben Mabey)
+* The Cucumber Autotest plugin now launches JRuby if autotest is run with JRuby (Aslak Hellesøy)
+* Provide helpful and non-confusing error message when specified profile is blank. (#118, Ben Mabey)
+* Improve handling and error messages for malformed cucumber.yml files. (#117, Ben Mabey)
+* document :x run option in command line help (#114, Aslak Hellesøy)
+* Change 'visits' to 'visit' in features generator to comply with new Webrat API (Darius Roberts)
+
+=== Removed features
+
+== 0.1.12 2008-12-04
+
+This is the "getting serious with IronRuby release" - largely based on
+"Patrick Gannon":http://www.patrickgannon.net/archive/2008/10/23/bdd-style-feature-tests-using-ironruby-and-rspeccucumber.aspx's
+blog entry.
+
+== New features
+* Cucumber works with IronRuby/.NET - http://github.com/aslakhellesoy/cucumber/wikis/ironruby-and-net (Aslak Hellesøy)
+
+== Bugfixes
+* Fixed bug which was preventing coloring under Autotest (#111, Alan Larkin)
+
+== Removed features
+None
+
+== 0.1.11 2008-12-02
+
+Bugfix release with a couple of minor additional features to the command line options.
+
+=== New features
+* Capture output from cucumber in Autotest (Alan Larkin)
+* Update cucumber generator to work with latest Webrat (Bryan Helkamp)
+* CUCUMBR LIKEZ 2 SPEEK WIF KATS. KTHXBAI (Aimee Daniells)
+* Support for dynamically pluggable formatters (#99 Joseph Wilk)
+* --verbose mode to see ruby files and feature files loaded by Cucumber (#106 Joseph Wilk)
+
+=== Bugfixes
+* The jcode library is not loaded on JRuby/Rails. Workaround for http://tinyurl.com/55uu3u. (Aslak Hellesøy)
+* Support including modules for class passed to --format (#109 Joseph Wilk)
+
+=== Removed features
+* The cucumber gem no longer depends on the rspec gem. It must be downloaded manually if RSpec is used. (Jeff Rafter)
+
+== 0.1.10 2008-11-25
+
+This release mostly has smaller bugfixes. The most significant new feature is how
+line numbers are specified. You can now run multiple features at specific lines numbers like this:
+
+ cucumber foo.feature:15 bar.feature:6:45:111
+
+This will run foo.feature at line 15 and bar.feature at line 6, 45 and 111.
+
+=== New features
+* Added example showing how to use Cucumber with Test::Unit + Matchy instead of RSpec (Aslak Hellesøy)
+* Yield existing world object to World block (#87 Aslak Hellesøy)
+* AUTOFEATURE=tRue works (case insensitive) (Aslak Hellesøy)
+* Initial support for .NET via IronRuby. (Aslak Hellesøy)
+* Lithuanian translation (sauliusgrigaitis)
+* New webrat step defintions to wrap the new selects_time, selects_date, and selects_datetime methods. (Ben Mabey)
+* Try to load webrat gem if it's not installed as a plugin (Aslak Hellesøy)
+* Support example.feature:20 or example.feature:10:20:30 syntax for running features at specific line number(s). (#88 Joseph Wilk)
+
+=== Bugfixes
+* Windows - all the 'a' characters in the output have gone on strike (#81 Luis Lavena, Joseph Wilk, Aslak Hellesøy)
+* Raise a nice error when encountering step definition without block (#95 Aslak Hellesøy)
+* Features written using Ruby where breaking due to missing a line number (#91 Joseph Wilk)
+* Directly creating a Table meant the scenario table header was never set which was causing a formatter error (#91 Joseph Wilk)
+
+=== Removed features
+* $KCODE='u' is no longer done automatically. Developers should do that explicitly when needed in step definitions or env.rb.
+* Step definition without a block being treated as pending (#64 Joseph Wilk)
+* The --line option has been removed. Use the new file.feature:line format instead.
+
+== 0.1.9 2008-11-12
+
+With this release Cucumber supports 19 (!) natural languages:
+
+* Arabic
+* Chinese Simplified
+* Danish
+* Dutch
+* Estonian
+* French
+* German
+* Italian
+* Japanese
+* Malay
+* Norwegian
+* Polish
+* Portuguese
+* Romanian
+* Russian
+* Spanish
+* Swedish
+* Texan
+* Welsh
+
+Thanks a lot to everyone who has contributed translations. If you don't see your language here, please
+add it: http://github.com/aslakhellesoy/cucumber/wikis/spoken-languages
+
+Main functional changes in this release is "Autotest":http://github.com/aslakhellesoy/cucumber/wikis/autotest-integration
+support and how multiline strings work in feature files:
+
+ # In your .feature file
+ Then I should see
+ """
+ A string
+ that "indents"
+ and spans
+ several lines
+
+ """
+
+ # In your steps.rb file
+ Then 'I should see' do |text|
+ text.should == "A string\n that \"indents\"\nand spans\nseveral lines\n"
+ end
+
+The triple quotes are used to define the start and end of a string, and it also defines what gets stripped away
+in the inside string. If the triple quotes are indented 4 spaces, then the text within will have the 4 first
+spaces removed too.
+
+=== New features
+* Added --[no-]color option to force color on or off (Peter Jaros)
+* Step definition without a block will be treated as pending (#64 Joseph Wilk)
+* Added support for Welsh (improvements welcome) (Joseph Wilk)
+* Added --quiet option to hide all development aid output when using Pretty formatter (#69 Joseph Wilk)
+* Added --no-snippets option to hide snippets for pending steps when using Pretty formatter (#69 Joseph Wilk)
+* Added error messages concerning cucumber.yml. (#70 Ben Mabey)
+* Added Autotest support - work in progress... (Peter Jaros)
+* Added new --exclude option (Bryan Helkamp)
+* Added new --scenario option (Peter Jaros)
+* Renamed common_webrat.rb to webrat_steps.rb (Ben Mabey, Aslak Hellesøy)
+* Added new feature[:feature_path] task (Roman Gonzalez)
+* Added support for Polish (Joseph Wilk)
+* Support specifying multiple formatters and multiple outputs (#47 Joseph Wilk)
+* Added support for Japanese. (Kakutani Shintaro)
+* Added support for Texan (improvements welcome). (Aslak Hellesøy)
+
+=== Bugfixes
+* Pending step snippets should escape special Regexp characters (#82 Joseph Wilk)
+* Scenario without a body shouldn't show up as complete (#63 Josh Knowles)
+* Fixed bug where utf-8 strings where breaking comment alighments. (#79 Joseph Wilk)
+* Fixed next_column_index not resetting after large tables (#60, Barry Mitchelson)
+* The HTML formatter was rendering everything twice. Cannot invoke visit_feature on formatters in executor (#72 Joseph Wilk)
+* Row Scenarios need to support pending? in order for the Profile formatter to work (Joseph Wilk)
+* Snippets are not shown for steps which already have a step definition (#65 Joseph Wilk)
+* Prevent feature/scenario/pending step comments from containing '//' when running features by specifying a directory with a trailing '/' (Joseph Wilk)
+* Scenario tables need spacing after them (#59 Joseph Wilk)
+* Support running scenario table rows when using --line argument (#55 Joseph Wilk)
+* Don't load cucumber.yml unless it exists (Aslak Hellesøy)
+* Fixing bug where specifying line number 1 in a feature which starts with a scenario with a scenario table was raising an error (#56 Joseph Wilk)
+
+=== Removed features
+
+
+== 0.1.8 2008-10-18
+
+This release extends the support for tables. PLEASE NOTE THAT TABLES ARE STILL EXPERIMENTAL.
+In previous releases it has been possible to use tables to define "more examples" of a scenario in
+a FIT-style column fixture kind of way. Now you can also use tables as arguments to steps.
+
+Tables used to define more examples after a scenario must now be prefixed. In English it looks like this:
+
+ Feature: Addition
+ In order to avoid silly mistakes
+ As a math idiot
+ I want to be told the sum of two numbers
+
+ Scenario: Add two numbers
+ Given I have entered 50 into the calculator
+ And I have entered 70 into the calculator
+ When I press add
+ Then the result should be 120 on the screen
+
+ More Examples:
+ | input_1 | input_2 | button | output |
+ | 20 | 30 | add | 50 |
+ | 2 | 5 | add | 7 |
+ | 0 | 40 | add | 40 |
+
+Languages that are not updated yet will have to use "More Examples" until we get the translations.
+
+Tables can also be used as arguments to individual steps. In fact, steps now support a single argument
+that can span several lines. This can be a table or a string.
+
+Example:
+
+ Given the following people exist:
+ | name | email | phone |
+ | Aslak | aslak@email.com | 123 |
+ | Joe | joe@email.com | 234 |
+ | Bryan | bryan@email.org | 456 |
+ When I search for email.com
+ Then I should see:
+ | name | email | phone |
+ | Aslak | aslak@email.com | 123 |
+ | Joe | joe@email.com | 234 |
+ And I should see:
+ "Some text
+ on several lines"
+
+The step definitions for such multiline steps must define an extra block argument for the argument:
+
+ Given /the following people exist:/ do |people_table|
+ # people_table is of type Cucumber::Model::Table
+ # See RDoc for more info
+ end
+
+ Then /I should see:/ do |string|
+ # string is a plain old ruby String with leading spaces on each line removed
+ end
+
+=== New features
+* Added profile formatter. (#35, Joseph Wilk)
+* Added support for Chinese Simplified. (Liming Lian)
+* Added support for Dutch. (Sjoerd Tieleman)
+* Multiline steps are now supported. (#4, Aslak Hellesøy)
+* Tables used to define more examples for a scenario must be prefixed "More Examples" (see languages.yml for other languages)
+* Show the file and line number for scenarios as a comment when displaying with the pretty formatter. (#40, Joseph Wilk)
+* Show the file for the feature as a comment when displaying with the pretty formatter. (#40, Joseph Wilk)
+* Show the feature file and line for pending steps as a comment when displaying with the pretty formatter. (#40, Joseph Wilk)
+
+=== Bugfixes
+* Fixed speling errors in Spanish (Daniel Cadenas)
+* ActionMailer delivery_method should not be set to test (#41, Luke Melia)
+* Reverse incorrectly ordered args in webrat select step (#43, David Chelimsky)
+* Support comments above the first scenario (#31, Aslak Hellesøy)
+* Fixed the HTML Formatter to use actual values for FIT table headers (#30, Joseph Wilk)
+
+=== Removed features
+* Removed the /^I go to (.*)$/ step from common_webrat.rb - it's not language agnostic and provides little value.
+
+=== New features
+* Added new --out option to make it easier to specify output from Rake and cucumber.yml
+
+== 0.1.7 2008-10-05
+
+This release fixes a few bugs and adds some new features. The most notable features are:
+
+=== Calling steps from steps
+
+Step definitions are a little bit closer to having regular method semantics.
+You define them, but now you can also call them from other steps. Here is an
+example:
+
+ Given /I am logged in as an (.*) named (.*)$/ do |role, name|
+ Given "I am registered as #{role}, #{name}, secret"
+ When "I log in with #{name}, secret"
+ end
+
+ Given /I am registered as (.*), (.*), (.*)/ do |role, name, password|
+ # (Code removed for brevity)
+ end
+
+ When /I log in with (.*), (.*)/ do |name, password|
+ # (Code removed for brevity)
+ end
+
+This means that steps can be reused in other steps. The GivenScenario feature achieves a similar
+effect (on the scenario level), but this feature is something we're not very happy with, mostly
+because it's not parameterisable. Calling steps from steps is.
+
+GivenScenario will still be working several releases, but the plan is to remove it completely in
+the 0.3.0 release.
+
+=== Seeing where a step is defined
+
+Prior to this release it could be hard to find out where the ruby step definition matching
+a plain text step is defined. Not anymore! Cucumber will now output this:
+
+ Scenario: Regular numbers
+ Given I have entered 3 into the calculator # features/steps/calculator_steps.rb:12
+ And I have entered 2 into the calculator # features/steps/calculator_steps.rb:12
+ When I press divide # features/steps/calculator_steps.rb:16
+ Then the result should be 1.5 on the screen # features/steps/calculator_steps.rb:20
+ And the result class should be Float # features/steps/calculator_steps.rb:24
+
+=== Bugfixes
+* Fixed a bug in the command line args being lost when using --profile (#27, Joseph Wilk)
+* Fixed a bug in Webrat selects (Tim Glen)
+* Fixed parsing of DOS line endings (#2, #28, Aslak Hellesøy)
+
+=== New features
+* Steps can be called from other steps (#3, Bryan Helmkamp, Aslak Hellesøy)
+* Added But keyword to all languages (#21, Aslak Hellesøy)
+* Added --no-source option to display step definition location next to step text (#26, Joseph Wilk, Aslak Hellesøy)
+* Added more Webrat steps (#25, Tim Glen)
+
+== 0.1.6 2008-10-01
+
+First gem release!
diff --git a/vendor/gems/gems/cucumber-0.4.4/LICENSE b/vendor/gems/gems/cucumber-0.4.4/LICENSE
new file mode 100755
index 00000000..621d6e65
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/LICENSE
@@ -0,0 +1,22 @@
+The MIT License
+
+Copyright (c) 2008,2009 Aslak Hellesøy
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/Manifest.txt b/vendor/gems/gems/cucumber-0.4.4/Manifest.txt
new file mode 100755
index 00000000..e69de29b
diff --git a/vendor/gems/gems/cucumber-0.4.4/README.rdoc b/vendor/gems/gems/cucumber-0.4.4/README.rdoc
new file mode 100755
index 00000000..f1ec518a
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/README.rdoc
@@ -0,0 +1,26 @@
+= Cucumber
+
+The main website is at http://cukes.info/
+The documentation is at http://github.com/aslakhellesoy/cucumber/wikis/home/
+
+== Note on Patches/Pull Requests
+
+* Fork the project.
+* Make your feature addition or bug fix.
+* Add tests for it. This is important so I don't break it in a
+ future version unintentionally.
+* Commit, do not mess with Rakefile, version, or history.
+ (if you want to have your own version, that is fine but
+ bump version in a commit by itself I can ignore when I pull)
+* Send me a pull request. Bonus points for topic branches.
+
+== Running tests
+
+ rake
+
+If you get errors about missing gems - just install them.
+
+== Copyright
+
+Copyright (c) 2008,2009 Aslak Hellesøy. See LICENSE for details.
+
diff --git a/vendor/gems/gems/cucumber-0.4.4/Rakefile b/vendor/gems/gems/cucumber-0.4.4/Rakefile
new file mode 100755
index 00000000..e66e8991
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/Rakefile
@@ -0,0 +1,63 @@
+# encoding: utf-8
+require 'rubygems'
+require 'term/ansicolor'
+require 'rake'
+$:.unshift(File.dirname(__FILE__) + '/lib')
+require 'cucumber/formatter/ansicolor'
+
+begin
+ require 'jeweler'
+ Jeweler::Tasks.new do |gem|
+ gem.name = "cucumber"
+ gem.summary = %Q{Behaviour Driven Development with elegance and joy}
+ gem.description = %Q{A BDD tool written in Ruby}
+ gem.email = "cukes@googlegroups.com"
+ gem.homepage = "http://cukes.info"
+ gem.authors = ["Aslak Hellesøy"]
+ gem.rubyforge_project = "rspec"
+
+ gem.add_dependency 'term-ansicolor', '1.0.4'
+ gem.add_dependency 'treetop', '1.4.2'
+ gem.add_dependency 'polyglot', '0.2.9'
+ gem.add_dependency 'builder', '2.1.2'
+ gem.add_dependency 'diff-lcs', '1.1.2'
+
+ gem.add_development_dependency 'nokogiri', '1.3.3'
+ gem.add_development_dependency 'prawn', '0.5.1'
+ gem.add_development_dependency 'rspec', '1.2.9'
+ gem.add_development_dependency 'spork', '0.7.3'
+
+ extend Cucumber::Formatter::ANSIColor
+ gem.post_install_message = <<-POST_INSTALL_MESSAGE
+
+#{cukes(15)}
+
+ #{cukes(1)} U P G R A D I N G #{cukes(1)}
+
+Thank you for installing cucumber-#{Cucumber::VERSION}.
+Please be sure to read http://wiki.github.com/aslakhellesoy/cucumber/upgrading
+for important information about this release. Happy cuking!
+
+#{cukes(15)}
+
+POST_INSTALL_MESSAGE
+ end
+
+ Jeweler::GemcutterTasks.new
+ Jeweler::RubyforgeTasks.new do |rubyforge|
+ rubyforge.doc_task = "sdoc"
+ end
+rescue LoadError
+ puts "Jeweler (or a dependency) not available. Install it with: sudo gem install jeweler"
+end
+
+Dir['gem_tasks/**/*.rake'].each { |rake| load rake }
+
+if(Cucumber::RUBY_1_9)
+ task :default => [:check_dependencies, :cucumber] # RSpec doesn't run on 1.9 yet.
+else
+ task :default => [:check_dependencies, :spec, :cucumber]
+end
+
+require 'rake/clean'
+CLEAN.include %w(**/*.{log,pyc})
diff --git a/vendor/gems/gems/cucumber-0.4.4/VERSION.yml b/vendor/gems/gems/cucumber-0.4.4/VERSION.yml
new file mode 100755
index 00000000..60e4b941
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/VERSION.yml
@@ -0,0 +1,5 @@
+---
+:patch: 4
+:major: 0
+:minor: 4
+:build:
diff --git a/vendor/gems/gems/cucumber-0.4.4/bin/cucumber b/vendor/gems/gems/cucumber-0.4.4/bin/cucumber
new file mode 100755
index 00000000..a4621eb1
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/bin/cucumber
@@ -0,0 +1,16 @@
+#!/usr/bin/env ruby
+$:.unshift(File.dirname(__FILE__) + '/../lib') unless $:.include?(File.dirname(__FILE__) + '/../lib')
+
+require 'cucumber/rspec_neuter'
+require 'cucumber/cli/main'
+begin
+ # The dup is to keep ARGV intact, so that tools like ruby-debug can respawn.
+ failure = Cucumber::Cli::Main.execute(ARGV.dup)
+ Kernel.exit(failure ? 1 : 0)
+rescue SystemExit => e
+ Kernel.exit(e.status)
+rescue Exception => e
+ STDERR.puts("#{e.message} (#{e.class})")
+ STDERR.puts(e.backtrace.join("\n"))
+ Kernel.exit(1)
+end
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/cucumber.gemspec b/vendor/gems/gems/cucumber-0.4.4/cucumber.gemspec
new file mode 100755
index 00000000..169c332a
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/cucumber.gemspec
@@ -0,0 +1,750 @@
+# Generated by jeweler
+# DO NOT EDIT THIS FILE DIRECTLY
+# Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
+# -*- encoding: utf-8 -*-
+
+Gem::Specification.new do |s|
+ s.name = %q{cucumber}
+ s.version = "0.4.4"
+
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
+ s.authors = ["Aslak Helles\303\270y"]
+ s.date = %q{2009-11-13}
+ s.default_executable = %q{cucumber}
+ s.description = %q{A BDD tool written in Ruby}
+ s.email = %q{cukes@googlegroups.com}
+ s.executables = ["cucumber"]
+ s.extra_rdoc_files = [
+ "LICENSE",
+ "README.rdoc"
+ ]
+ s.files = [
+ ".gitattributes",
+ ".gitignore",
+ "History.txt",
+ "LICENSE",
+ "Manifest.txt",
+ "README.rdoc",
+ "Rakefile",
+ "VERSION.yml",
+ "bin/cucumber",
+ "cucumber.gemspec",
+ "cucumber.yml",
+ "examples/dos_line_endings/Rakefile",
+ "examples/dos_line_endings/features/dos_line_endings.feature",
+ "examples/i18n/README.textile",
+ "examples/i18n/Rakefile",
+ "examples/i18n/ar/Rakefile",
+ "examples/i18n/ar/features/addition.feature",
+ "examples/i18n/ar/features/step_definitons/calculator_steps.rb",
+ "examples/i18n/ar/lib/calculator.rb",
+ "examples/i18n/bg/Rakefile",
+ "examples/i18n/bg/features/addition.feature",
+ "examples/i18n/bg/features/consecutive_calculations.feature",
+ "examples/i18n/bg/features/division.feature",
+ "examples/i18n/bg/features/step_definitons/calculator_steps.rb",
+ "examples/i18n/bg/features/support/env.rb",
+ "examples/i18n/bg/features/support/world.rb",
+ "examples/i18n/bg/lib/calculator.rb",
+ "examples/i18n/cat/Rakefile",
+ "examples/i18n/cat/features/step_definitons/calculator_steps.rb",
+ "examples/i18n/cat/features/suma.feature",
+ "examples/i18n/cat/lib/calculadora.rb",
+ "examples/i18n/da/Rakefile",
+ "examples/i18n/da/features/sammenlaegning.feature",
+ "examples/i18n/da/features/step_definitons/lommeregner_steps.rb",
+ "examples/i18n/da/lib/lommeregner.rb",
+ "examples/i18n/de/.gitignore",
+ "examples/i18n/de/Rakefile",
+ "examples/i18n/de/features/addition.feature",
+ "examples/i18n/de/features/division.feature",
+ "examples/i18n/de/features/step_definitons/calculator_steps.rb",
+ "examples/i18n/de/lib/calculator.rb",
+ "examples/i18n/en-lol/Rakefile",
+ "examples/i18n/en-lol/features/step_definitions/cucumbrz_steps.rb",
+ "examples/i18n/en-lol/features/stuffing.feature",
+ "examples/i18n/en-lol/features/support/env.rb",
+ "examples/i18n/en-lol/lib/basket.rb",
+ "examples/i18n/en-lol/lib/belly.rb",
+ "examples/i18n/en/.gitignore",
+ "examples/i18n/en/Rakefile",
+ "examples/i18n/en/features/addition.feature",
+ "examples/i18n/en/features/division.feature",
+ "examples/i18n/en/features/step_definitons/calculator_steps.rb",
+ "examples/i18n/en/lib/calculator.rb",
+ "examples/i18n/es/Rakefile",
+ "examples/i18n/es/features/adicion.feature",
+ "examples/i18n/es/features/step_definitons/calculador_steps.rb",
+ "examples/i18n/es/lib/calculador.rb",
+ "examples/i18n/et/Rakefile",
+ "examples/i18n/et/features/jagamine.feature",
+ "examples/i18n/et/features/liitmine.feature",
+ "examples/i18n/et/features/step_definitions/kalkulaator_steps.rb",
+ "examples/i18n/et/lib/kalkulaator.rb",
+ "examples/i18n/fi/.gitignore",
+ "examples/i18n/fi/Rakefile",
+ "examples/i18n/fi/features/jakolasku.feature",
+ "examples/i18n/fi/features/step_definitons/laskin_steps.rb",
+ "examples/i18n/fi/features/yhteenlasku.feature",
+ "examples/i18n/fi/lib/laskin.rb",
+ "examples/i18n/fr/Rakefile",
+ "examples/i18n/fr/features/addition.feature",
+ "examples/i18n/fr/features/step_definitions/calculatrice_steps.rb",
+ "examples/i18n/fr/lib/calculatrice.rb",
+ "examples/i18n/he/Rakefile",
+ "examples/i18n/he/features/addition.feature",
+ "examples/i18n/he/features/division.feature",
+ "examples/i18n/he/features/step_definitons/calculator_steps.rb",
+ "examples/i18n/he/lib/calculator.rb",
+ "examples/i18n/hu/.gitignore",
+ "examples/i18n/hu/Rakefile",
+ "examples/i18n/hu/features/addition.feature",
+ "examples/i18n/hu/features/division.feature",
+ "examples/i18n/hu/features/step_definitons/calculator_steps.rb",
+ "examples/i18n/hu/lib/calculator.rb",
+ "examples/i18n/id/.gitignore",
+ "examples/i18n/id/Rakefile",
+ "examples/i18n/id/features/addition.feature",
+ "examples/i18n/id/features/division.feature",
+ "examples/i18n/id/features/step_definitons/calculator_steps.rb",
+ "examples/i18n/id/lib/calculator.rb",
+ "examples/i18n/it/Rakefile",
+ "examples/i18n/it/features/somma.feature",
+ "examples/i18n/it/features/step_definitons/calcolatrice_steps.rb",
+ "examples/i18n/it/lib/calcolatrice.rb",
+ "examples/i18n/ja/.gitignore",
+ "examples/i18n/ja/Rakefile",
+ "examples/i18n/ja/features/addition.feature",
+ "examples/i18n/ja/features/division.feature",
+ "examples/i18n/ja/features/step_definitons/calculator_steps.rb",
+ "examples/i18n/ja/lib/calculator.rb",
+ "examples/i18n/ko/.gitignore",
+ "examples/i18n/ko/Rakefile",
+ "examples/i18n/ko/features/addition.feature",
+ "examples/i18n/ko/features/division.feature",
+ "examples/i18n/ko/features/step_definitons/calculator_steps.rb",
+ "examples/i18n/ko/lib/calculator.rb",
+ "examples/i18n/lt/.gitignore",
+ "examples/i18n/lt/Rakefile",
+ "examples/i18n/lt/features/addition.feature",
+ "examples/i18n/lt/features/division.feature",
+ "examples/i18n/lt/features/step_definitons/calculator_steps.rb",
+ "examples/i18n/lt/lib/calculator.rb",
+ "examples/i18n/lv/Rakefile",
+ "examples/i18n/lv/features/addition.feature",
+ "examples/i18n/lv/features/division.feature",
+ "examples/i18n/lv/features/step_definitons/calculator_steps.rb",
+ "examples/i18n/lv/lib/calculator.rb",
+ "examples/i18n/no/Rakefile",
+ "examples/i18n/no/features/step_definitons/kalkulator_steps.rb",
+ "examples/i18n/no/features/summering.feature",
+ "examples/i18n/no/features/support/env.rb",
+ "examples/i18n/no/lib/kalkulator.rb",
+ "examples/i18n/pl/.gitignore",
+ "examples/i18n/pl/Rakefile",
+ "examples/i18n/pl/features/addition.feature",
+ "examples/i18n/pl/features/division.feature",
+ "examples/i18n/pl/features/step_definitons/calculator_steps.rb",
+ "examples/i18n/pl/features/support/env.rb",
+ "examples/i18n/pl/lib/calculator.rb",
+ "examples/i18n/pt/Rakefile",
+ "examples/i18n/pt/features/adicao.feature",
+ "examples/i18n/pt/features/step_definitions/calculadora_steps.rb",
+ "examples/i18n/pt/features/support/env.rb",
+ "examples/i18n/pt/lib/calculadora.rb",
+ "examples/i18n/ro/Rakefile",
+ "examples/i18n/ro/features/step_definitons/calculator_steps.rb",
+ "examples/i18n/ro/features/suma.feature",
+ "examples/i18n/ro/lib/calculator.rb",
+ "examples/i18n/ru/Rakefile",
+ "examples/i18n/ru/features/addition.feature",
+ "examples/i18n/ru/features/consecutive_calculations.feature",
+ "examples/i18n/ru/features/division.feature",
+ "examples/i18n/ru/features/step_definitons/calculator_steps.rb",
+ "examples/i18n/ru/features/support/env.rb",
+ "examples/i18n/ru/features/support/world.rb",
+ "examples/i18n/ru/lib/calculator.rb",
+ "examples/i18n/se/Rakefile",
+ "examples/i18n/se/features/step_definitons/kalkulator_steps.rb",
+ "examples/i18n/se/features/summering.feature",
+ "examples/i18n/se/lib/kalkulator.rb",
+ "examples/i18n/sk/.gitignore",
+ "examples/i18n/sk/Rakefile",
+ "examples/i18n/sk/features/addition.feature",
+ "examples/i18n/sk/features/division.feature",
+ "examples/i18n/sk/features/step_definitons/calculator_steps.rb",
+ "examples/i18n/sk/lib/calculator.rb",
+ "examples/i18n/sr-latn/Rakefile",
+ "examples/i18n/sr-latn/features/sabiranje.feature",
+ "examples/i18n/sr-latn/features/step_definitons/calculator_steps.rb",
+ "examples/i18n/sr-latn/lib/calculator.rb",
+ "examples/i18n/sr/Rakefile",
+ "examples/i18n/sr/features/sabiranje.feature",
+ "examples/i18n/sr/features/step_definitons/calculator_steps.rb",
+ "examples/i18n/sr/lib/calculator.rb",
+ "examples/i18n/tr/.gitignore",
+ "examples/i18n/tr/Rakefile",
+ "examples/i18n/tr/features/bolme.feature",
+ "examples/i18n/tr/features/step_definitons/hesap_makinesi_adimlari.rb",
+ "examples/i18n/tr/features/toplama.feature",
+ "examples/i18n/tr/lib/hesap_makinesi.rb",
+ "examples/i18n/uz/Rakefile",
+ "examples/i18n/uz/features/addition.feature",
+ "examples/i18n/uz/features/consecutive_calculations.feature",
+ "examples/i18n/uz/features/division.feature",
+ "examples/i18n/uz/features/step_definitons/calculator_steps.rb",
+ "examples/i18n/uz/features/support/env.rb",
+ "examples/i18n/uz/features/support/world.rb",
+ "examples/i18n/uz/lib/calculator.rb",
+ "examples/i18n/zh-CN/Rakefile",
+ "examples/i18n/zh-CN/features/addition.feature",
+ "examples/i18n/zh-CN/features/step_definitons/calculator_steps.rb",
+ "examples/i18n/zh-CN/lib/calculator.rb",
+ "examples/i18n/zh-TW/.gitignore",
+ "examples/i18n/zh-TW/Rakefile",
+ "examples/i18n/zh-TW/features/addition.feature",
+ "examples/i18n/zh-TW/features/division.feature",
+ "examples/i18n/zh-TW/features/step_definitons/calculator_steps.rb",
+ "examples/i18n/zh-TW/lib/calculator.rb",
+ "examples/junit/features/one_passing_one_failing.feature",
+ "examples/junit/features/pending.feature",
+ "examples/junit/features/step_definitions/steps.rb",
+ "examples/python/features/fibonacci.feature",
+ "examples/python/features/step_definitions/fib_steps.py",
+ "examples/python/lib/.gitignore",
+ "examples/python/lib/fib.py",
+ "examples/ramaze/README.textile",
+ "examples/ramaze/Rakefile",
+ "examples/ramaze/app.rb",
+ "examples/ramaze/features/add.feature",
+ "examples/ramaze/features/step_definitions/add_steps.rb",
+ "examples/ramaze/features/support/env.rb",
+ "examples/ramaze/layout/default.html.erb",
+ "examples/ramaze/view/index.html.erb",
+ "examples/ruby2python/features/fibonacci.feature",
+ "examples/ruby2python/features/step_definitions/fib_steps.rb",
+ "examples/ruby2python/features/support/env.rb",
+ "examples/ruby2python/lib/.gitignore",
+ "examples/ruby2python/lib/fib.py",
+ "examples/selenium/Rakefile",
+ "examples/selenium/features/search.feature",
+ "examples/selenium/features/step_definitons/search_steps.rb",
+ "examples/selenium/features/support/env.rb",
+ "examples/selenium_webrat/Rakefile",
+ "examples/selenium_webrat/config.ru",
+ "examples/selenium_webrat/features/search.feature",
+ "examples/selenium_webrat/features/step_definitons/search_steps.rb",
+ "examples/selenium_webrat/features/support/env.rb",
+ "examples/self_test/.gitignore",
+ "examples/self_test/README.textile",
+ "examples/self_test/Rakefile",
+ "examples/self_test/features/background/background_tagged_before_on_outline.feature",
+ "examples/self_test/features/background/background_with_name.feature",
+ "examples/self_test/features/background/failing_background.feature",
+ "examples/self_test/features/background/failing_background_after_success.feature",
+ "examples/self_test/features/background/multiline_args_background.feature",
+ "examples/self_test/features/background/passing_background.feature",
+ "examples/self_test/features/background/pending_background.feature",
+ "examples/self_test/features/background/scenario_outline_failing_background.feature",
+ "examples/self_test/features/background/scenario_outline_passing_background.feature",
+ "examples/self_test/features/call_undefined_step_from_step_def.feature",
+ "examples/self_test/features/failing_expectation.feature",
+ "examples/self_test/features/lots_of_undefined.feature",
+ "examples/self_test/features/multiline_name.feature",
+ "examples/self_test/features/outline_sample.feature",
+ "examples/self_test/features/sample.feature",
+ "examples/self_test/features/search_sample.feature",
+ "examples/self_test/features/step_definitions/sample_steps.rb",
+ "examples/self_test/features/support/env.rb",
+ "examples/self_test/features/tags_sample.feature",
+ "examples/self_test/features/tons_of_cukes.feature",
+ "examples/self_test/features/undefined_multiline_args.feature",
+ "examples/self_test/list-of-features.txt",
+ "examples/sinatra/README.textile",
+ "examples/sinatra/Rakefile",
+ "examples/sinatra/app.rb",
+ "examples/sinatra/features/add.feature",
+ "examples/sinatra/features/step_definitions/add_steps.rb",
+ "examples/sinatra/features/support/env.rb",
+ "examples/sinatra/views/add.erb",
+ "examples/sinatra/views/layout.erb",
+ "examples/steps_library/features/step_definitions/steps_lib1.rb",
+ "examples/steps_library/features/step_definitions/steps_lib2.rb",
+ "examples/test_unit/Rakefile",
+ "examples/test_unit/features/step_definitions/test_unit_steps.rb",
+ "examples/test_unit/features/test_unit.feature",
+ "examples/tickets/Rakefile",
+ "examples/tickets/features.html",
+ "examples/tickets/features/172.feature",
+ "examples/tickets/features/177/1.feature",
+ "examples/tickets/features/177/2.feature",
+ "examples/tickets/features/177/3.feature",
+ "examples/tickets/features/180.feature",
+ "examples/tickets/features/229/tagged_hooks.feature",
+ "examples/tickets/features/229/tagged_hooks.rb",
+ "examples/tickets/features/236.feature",
+ "examples/tickets/features/241.feature",
+ "examples/tickets/features/246.feature",
+ "examples/tickets/features/248.feature",
+ "examples/tickets/features/270/back.feature",
+ "examples/tickets/features/270/back.steps.rb",
+ "examples/tickets/features/272/hooks.feature",
+ "examples/tickets/features/272/hooks_steps.rb",
+ "examples/tickets/features/279/py_string_indent.feature",
+ "examples/tickets/features/279/py_string_indent.steps.rb",
+ "examples/tickets/features/279/wrong.feature_",
+ "examples/tickets/features/301/filter_background_tagged_hooks.feature",
+ "examples/tickets/features/301/filter_background_tagged_hooks_steps.rb",
+ "examples/tickets/features/306/only_background.feature",
+ "examples/tickets/features/lib/eatting_machine.rb",
+ "examples/tickets/features/lib/pantry.rb",
+ "examples/tickets/features/scenario_outline.feature",
+ "examples/tickets/features/step_definitons/246_steps.rb",
+ "examples/tickets/features/step_definitons/248_steps.rb",
+ "examples/tickets/features/step_definitons/scenario_outline_steps.rb",
+ "examples/tickets/features/step_definitons/tickets_steps.rb",
+ "examples/tickets/features/table_diffing.feature",
+ "examples/tickets/features/tickets.feature",
+ "examples/watir/README.textile",
+ "examples/watir/Rakefile",
+ "examples/watir/features/search.feature",
+ "examples/watir/features/step_definitions/search_steps.rb",
+ "examples/watir/features/support/env.rb",
+ "examples/watir/features/support/screenshots.rb",
+ "examples/webrat/features/search.feature",
+ "examples/webrat/features/step_definitions/kvasir_steps.rb",
+ "examples/webrat/features/support/env.rb",
+ "features/announce.feature",
+ "features/background.feature",
+ "features/bug_371.feature",
+ "features/bug_464.feature",
+ "features/bug_475.feature",
+ "features/call_many_steps.feature",
+ "features/cucumber_cli.feature",
+ "features/cucumber_cli_diff_disabled.feature",
+ "features/cucumber_cli_outlines.feature",
+ "features/custom_formatter.feature",
+ "features/default_snippets.feature",
+ "features/drb_server_integration.feature",
+ "features/exception_in_after_block.feature",
+ "features/exception_in_after_step_block.feature",
+ "features/exception_in_before_block.feature",
+ "features/exclude_files.feature",
+ "features/expand.feature",
+ "features/html_formatter.feature",
+ "features/html_formatter/a.html",
+ "features/junit_formatter.feature",
+ "features/language_from_header.feature",
+ "features/language_help.feature",
+ "features/listener_debugger_formatter.feature",
+ "features/multiline_names.feature",
+ "features/negative_tagged_hooks.feature",
+ "features/post_configuration_hook.feature",
+ "features/profiles.feature",
+ "features/rake_task.feature",
+ "features/report_called_undefined_steps.feature",
+ "features/simplest.feature",
+ "features/snippet.feature",
+ "features/step_definitions/cucumber_steps.rb",
+ "features/step_definitions/extra_steps.rb",
+ "features/step_definitions/simplest_steps.rb",
+ "features/step_definitions/wire_steps.rb",
+ "features/support/env.rb",
+ "features/support/env.rb.simplest",
+ "features/support/fake_wire_server.rb",
+ "features/table_diffing.feature",
+ "features/table_mapping.feature",
+ "features/tag_logic.feature",
+ "features/transform.feature",
+ "features/unicode_table.feature",
+ "features/usage_and_stepdefs_formatter.feature",
+ "features/wire_protocol.feature",
+ "features/work_in_progress.feature",
+ "gem_tasks/contributors.rake",
+ "gem_tasks/environment.rake",
+ "gem_tasks/features.rake",
+ "gem_tasks/fix_cr_lf.rake",
+ "gem_tasks/flog.rake",
+ "gem_tasks/rspec.rake",
+ "gem_tasks/sass.rake",
+ "gem_tasks/sdoc.rake",
+ "lib/README.rdoc",
+ "lib/autotest/cucumber.rb",
+ "lib/autotest/cucumber_mixin.rb",
+ "lib/autotest/cucumber_rails.rb",
+ "lib/autotest/cucumber_rails_rspec.rb",
+ "lib/autotest/cucumber_rspec.rb",
+ "lib/autotest/discover.rb",
+ "lib/cucumber.rb",
+ "lib/cucumber/ast.rb",
+ "lib/cucumber/ast/background.rb",
+ "lib/cucumber/ast/comment.rb",
+ "lib/cucumber/ast/examples.rb",
+ "lib/cucumber/ast/feature.rb",
+ "lib/cucumber/ast/feature_element.rb",
+ "lib/cucumber/ast/features.rb",
+ "lib/cucumber/ast/outline_table.rb",
+ "lib/cucumber/ast/py_string.rb",
+ "lib/cucumber/ast/scenario.rb",
+ "lib/cucumber/ast/scenario_outline.rb",
+ "lib/cucumber/ast/step.rb",
+ "lib/cucumber/ast/step_collection.rb",
+ "lib/cucumber/ast/step_invocation.rb",
+ "lib/cucumber/ast/table.rb",
+ "lib/cucumber/ast/tags.rb",
+ "lib/cucumber/ast/tree_walker.rb",
+ "lib/cucumber/ast/visitor.rb",
+ "lib/cucumber/broadcaster.rb",
+ "lib/cucumber/cli/configuration.rb",
+ "lib/cucumber/cli/drb_client.rb",
+ "lib/cucumber/cli/language_help_formatter.rb",
+ "lib/cucumber/cli/main.rb",
+ "lib/cucumber/cli/options.rb",
+ "lib/cucumber/cli/profile_loader.rb",
+ "lib/cucumber/constantize.rb",
+ "lib/cucumber/core_ext/instance_exec.rb",
+ "lib/cucumber/core_ext/proc.rb",
+ "lib/cucumber/core_ext/string.rb",
+ "lib/cucumber/feature_file.rb",
+ "lib/cucumber/filter.rb",
+ "lib/cucumber/formatter/ansicolor.rb",
+ "lib/cucumber/formatter/color_io.rb",
+ "lib/cucumber/formatter/console.rb",
+ "lib/cucumber/formatter/cucumber.css",
+ "lib/cucumber/formatter/cucumber.sass",
+ "lib/cucumber/formatter/debug.rb",
+ "lib/cucumber/formatter/duration.rb",
+ "lib/cucumber/formatter/html.rb",
+ "lib/cucumber/formatter/junit.rb",
+ "lib/cucumber/formatter/ordered_xml_markup.rb",
+ "lib/cucumber/formatter/pdf.rb",
+ "lib/cucumber/formatter/pretty.rb",
+ "lib/cucumber/formatter/progress.rb",
+ "lib/cucumber/formatter/rerun.rb",
+ "lib/cucumber/formatter/stepdefs.rb",
+ "lib/cucumber/formatter/steps.rb",
+ "lib/cucumber/formatter/summary.rb",
+ "lib/cucumber/formatter/tag_cloud.rb",
+ "lib/cucumber/formatter/unicode.rb",
+ "lib/cucumber/formatter/usage.rb",
+ "lib/cucumber/language_support.rb",
+ "lib/cucumber/language_support/language_methods.rb",
+ "lib/cucumber/languages.yml",
+ "lib/cucumber/parser.rb",
+ "lib/cucumber/parser/common.rb",
+ "lib/cucumber/parser/common.tt",
+ "lib/cucumber/parser/feature.rb",
+ "lib/cucumber/parser/feature.tt",
+ "lib/cucumber/parser/i18n.tt",
+ "lib/cucumber/parser/natural_language.rb",
+ "lib/cucumber/parser/py_string.rb",
+ "lib/cucumber/parser/py_string.tt",
+ "lib/cucumber/parser/table.rb",
+ "lib/cucumber/parser/table.tt",
+ "lib/cucumber/parser/treetop_ext.rb",
+ "lib/cucumber/platform.rb",
+ "lib/cucumber/py_support/py_dsl.py",
+ "lib/cucumber/py_support/py_language.py",
+ "lib/cucumber/py_support/py_language.rb",
+ "lib/cucumber/rails/action_controller.rb",
+ "lib/cucumber/rails/active_record.rb",
+ "lib/cucumber/rails/rspec.rb",
+ "lib/cucumber/rails/test_unit.rb",
+ "lib/cucumber/rails/world.rb",
+ "lib/cucumber/rake/task.rb",
+ "lib/cucumber/rb_support/rb_dsl.rb",
+ "lib/cucumber/rb_support/rb_hook.rb",
+ "lib/cucumber/rb_support/rb_language.rb",
+ "lib/cucumber/rb_support/rb_step_definition.rb",
+ "lib/cucumber/rb_support/rb_transform.rb",
+ "lib/cucumber/rb_support/rb_world.rb",
+ "lib/cucumber/rb_support/regexp_argument_matcher.rb",
+ "lib/cucumber/rspec_neuter.rb",
+ "lib/cucumber/step_argument.rb",
+ "lib/cucumber/step_definition_light.rb",
+ "lib/cucumber/step_match.rb",
+ "lib/cucumber/step_mother.rb",
+ "lib/cucumber/webrat/element_locator.rb",
+ "lib/cucumber/webrat/table_locator.rb",
+ "lib/cucumber/wire_support/connection.rb",
+ "lib/cucumber/wire_support/request_handler.rb",
+ "lib/cucumber/wire_support/wire_exception.rb",
+ "lib/cucumber/wire_support/wire_language.rb",
+ "lib/cucumber/wire_support/wire_packet.rb",
+ "lib/cucumber/wire_support/wire_protocol.rb",
+ "lib/cucumber/wire_support/wire_step_definition.rb",
+ "rails_generators/cucumber/USAGE",
+ "rails_generators/cucumber/cucumber_generator.rb",
+ "rails_generators/cucumber/templates/cucumber",
+ "rails_generators/cucumber/templates/cucumber.rake",
+ "rails_generators/cucumber/templates/cucumber_environment.rb",
+ "rails_generators/cucumber/templates/env.rb",
+ "rails_generators/cucumber/templates/paths.rb",
+ "rails_generators/cucumber/templates/spork_env.rb",
+ "rails_generators/cucumber/templates/version_check.rb",
+ "rails_generators/cucumber/templates/webrat_steps.rb",
+ "rails_generators/feature/USAGE",
+ "rails_generators/feature/feature_generator.rb",
+ "rails_generators/feature/templates/feature.erb",
+ "rails_generators/feature/templates/steps.erb",
+ "spec/cucumber/ast/background_spec.rb",
+ "spec/cucumber/ast/feature_element_spec.rb",
+ "spec/cucumber/ast/feature_factory.rb",
+ "spec/cucumber/ast/feature_spec.rb",
+ "spec/cucumber/ast/outline_table_spec.rb",
+ "spec/cucumber/ast/py_string_spec.rb",
+ "spec/cucumber/ast/scenario_outline_spec.rb",
+ "spec/cucumber/ast/scenario_spec.rb",
+ "spec/cucumber/ast/step_collection_spec.rb",
+ "spec/cucumber/ast/step_spec.rb",
+ "spec/cucumber/ast/table_spec.rb",
+ "spec/cucumber/ast/tags_spec.rb",
+ "spec/cucumber/ast/tree_walker_spec.rb",
+ "spec/cucumber/broadcaster_spec.rb",
+ "spec/cucumber/cli/configuration_spec.rb",
+ "spec/cucumber/cli/drb_client_spec.rb",
+ "spec/cucumber/cli/main_spec.rb",
+ "spec/cucumber/cli/options_spec.rb",
+ "spec/cucumber/cli/profile_loader_spec.rb",
+ "spec/cucumber/core_ext/proc_spec.rb",
+ "spec/cucumber/formatter/ansicolor_spec.rb",
+ "spec/cucumber/formatter/color_io_spec.rb",
+ "spec/cucumber/formatter/console_spec.rb",
+ "spec/cucumber/formatter/duration_spec.rb",
+ "spec/cucumber/formatter/html_spec.rb",
+ "spec/cucumber/formatter/junit_spec.rb",
+ "spec/cucumber/formatter/progress_spec.rb",
+ "spec/cucumber/formatter/spec_helper.rb",
+ "spec/cucumber/parser/feature_parser_spec.rb",
+ "spec/cucumber/parser/table_parser_spec.rb",
+ "spec/cucumber/rb_support/rb_step_definition_spec.rb",
+ "spec/cucumber/rb_support/regexp_argument_matcher_spec.rb",
+ "spec/cucumber/sell_cucumbers.feature",
+ "spec/cucumber/step_match_spec.rb",
+ "spec/cucumber/step_mother_spec.rb",
+ "spec/cucumber/treetop_parser/empty_feature.feature",
+ "spec/cucumber/treetop_parser/empty_scenario.feature",
+ "spec/cucumber/treetop_parser/empty_scenario_outline.feature",
+ "spec/cucumber/treetop_parser/fit_scenario.feature",
+ "spec/cucumber/treetop_parser/given_scenario.feature",
+ "spec/cucumber/treetop_parser/invalid_scenario_outlines.feature",
+ "spec/cucumber/treetop_parser/multiline_steps.feature",
+ "spec/cucumber/treetop_parser/multiple_tables.feature",
+ "spec/cucumber/treetop_parser/scenario_outline.feature",
+ "spec/cucumber/treetop_parser/spaces.feature",
+ "spec/cucumber/treetop_parser/test_dos.feature",
+ "spec/cucumber/treetop_parser/with_comments.feature",
+ "spec/cucumber/treetop_parser/with_tags.feature",
+ "spec/cucumber/wire_support/wire_language_spec.rb",
+ "spec/cucumber/wire_support/wire_packet_spec.rb",
+ "spec/cucumber/world/pending_spec.rb",
+ "spec/spec.opts",
+ "spec/spec_helper.rb"
+ ]
+ s.homepage = %q{http://cukes.info}
+ s.post_install_message = %q{
+(::) (::) (::) (::) (::) (::) (::) (::) (::) (::) (::) (::) (::) (::) (::)
+
+ (::) U P G R A D I N G (::)
+
+Thank you for installing cucumber-0.4.4.
+Please be sure to read http://wiki.github.com/aslakhellesoy/cucumber/upgrading
+for important information about this release. Happy cuking!
+
+(::) (::) (::) (::) (::) (::) (::) (::) (::) (::) (::) (::) (::) (::) (::)
+
+}
+ s.rdoc_options = ["--charset=UTF-8"]
+ s.require_paths = ["lib"]
+ s.rubyforge_project = %q{rspec}
+ s.rubygems_version = %q{1.3.5}
+ s.summary = %q{Behaviour Driven Development with elegance and joy}
+ s.test_files = [
+ "spec/cucumber/ast/background_spec.rb",
+ "spec/cucumber/ast/feature_element_spec.rb",
+ "spec/cucumber/ast/feature_factory.rb",
+ "spec/cucumber/ast/feature_spec.rb",
+ "spec/cucumber/ast/outline_table_spec.rb",
+ "spec/cucumber/ast/py_string_spec.rb",
+ "spec/cucumber/ast/scenario_outline_spec.rb",
+ "spec/cucumber/ast/scenario_spec.rb",
+ "spec/cucumber/ast/step_collection_spec.rb",
+ "spec/cucumber/ast/step_spec.rb",
+ "spec/cucumber/ast/table_spec.rb",
+ "spec/cucumber/ast/tags_spec.rb",
+ "spec/cucumber/ast/tree_walker_spec.rb",
+ "spec/cucumber/broadcaster_spec.rb",
+ "spec/cucumber/cli/configuration_spec.rb",
+ "spec/cucumber/cli/drb_client_spec.rb",
+ "spec/cucumber/cli/main_spec.rb",
+ "spec/cucumber/cli/options_spec.rb",
+ "spec/cucumber/cli/profile_loader_spec.rb",
+ "spec/cucumber/core_ext/proc_spec.rb",
+ "spec/cucumber/formatter/ansicolor_spec.rb",
+ "spec/cucumber/formatter/color_io_spec.rb",
+ "spec/cucumber/formatter/console_spec.rb",
+ "spec/cucumber/formatter/duration_spec.rb",
+ "spec/cucumber/formatter/html_spec.rb",
+ "spec/cucumber/formatter/junit_spec.rb",
+ "spec/cucumber/formatter/progress_spec.rb",
+ "spec/cucumber/formatter/spec_helper.rb",
+ "spec/cucumber/parser/feature_parser_spec.rb",
+ "spec/cucumber/parser/table_parser_spec.rb",
+ "spec/cucumber/rb_support/rb_step_definition_spec.rb",
+ "spec/cucumber/rb_support/regexp_argument_matcher_spec.rb",
+ "spec/cucumber/step_match_spec.rb",
+ "spec/cucumber/step_mother_spec.rb",
+ "spec/cucumber/wire_support/wire_language_spec.rb",
+ "spec/cucumber/wire_support/wire_packet_spec.rb",
+ "spec/cucumber/world/pending_spec.rb",
+ "spec/spec_helper.rb",
+ "examples/i18n/ar/features/step_definitons/calculator_steps.rb",
+ "examples/i18n/ar/lib/calculator.rb",
+ "examples/i18n/bg/features/step_definitons/calculator_steps.rb",
+ "examples/i18n/bg/features/support/env.rb",
+ "examples/i18n/bg/features/support/world.rb",
+ "examples/i18n/bg/lib/calculator.rb",
+ "examples/i18n/cat/features/step_definitons/calculator_steps.rb",
+ "examples/i18n/cat/lib/calculadora.rb",
+ "examples/i18n/da/features/step_definitons/lommeregner_steps.rb",
+ "examples/i18n/da/lib/lommeregner.rb",
+ "examples/i18n/de/features/step_definitons/calculator_steps.rb",
+ "examples/i18n/de/lib/calculator.rb",
+ "examples/i18n/en/features/step_definitons/calculator_steps.rb",
+ "examples/i18n/en/lib/calculator.rb",
+ "examples/i18n/en-lol/features/step_definitions/cucumbrz_steps.rb",
+ "examples/i18n/en-lol/features/support/env.rb",
+ "examples/i18n/en-lol/lib/basket.rb",
+ "examples/i18n/en-lol/lib/belly.rb",
+ "examples/i18n/es/features/step_definitons/calculador_steps.rb",
+ "examples/i18n/es/lib/calculador.rb",
+ "examples/i18n/et/features/step_definitions/kalkulaator_steps.rb",
+ "examples/i18n/et/lib/kalkulaator.rb",
+ "examples/i18n/fi/features/step_definitons/laskin_steps.rb",
+ "examples/i18n/fi/lib/laskin.rb",
+ "examples/i18n/fr/features/step_definitions/calculatrice_steps.rb",
+ "examples/i18n/fr/lib/calculatrice.rb",
+ "examples/i18n/he/features/step_definitons/calculator_steps.rb",
+ "examples/i18n/he/lib/calculator.rb",
+ "examples/i18n/hu/features/step_definitons/calculator_steps.rb",
+ "examples/i18n/hu/lib/calculator.rb",
+ "examples/i18n/id/features/step_definitons/calculator_steps.rb",
+ "examples/i18n/id/lib/calculator.rb",
+ "examples/i18n/it/features/step_definitons/calcolatrice_steps.rb",
+ "examples/i18n/it/lib/calcolatrice.rb",
+ "examples/i18n/ja/features/step_definitons/calculator_steps.rb",
+ "examples/i18n/ja/lib/calculator.rb",
+ "examples/i18n/ko/features/step_definitons/calculator_steps.rb",
+ "examples/i18n/ko/lib/calculator.rb",
+ "examples/i18n/lt/features/step_definitons/calculator_steps.rb",
+ "examples/i18n/lt/lib/calculator.rb",
+ "examples/i18n/lv/features/step_definitons/calculator_steps.rb",
+ "examples/i18n/lv/lib/calculator.rb",
+ "examples/i18n/no/features/step_definitons/kalkulator_steps.rb",
+ "examples/i18n/no/features/support/env.rb",
+ "examples/i18n/no/lib/kalkulator.rb",
+ "examples/i18n/pl/features/step_definitons/calculator_steps.rb",
+ "examples/i18n/pl/features/support/env.rb",
+ "examples/i18n/pl/lib/calculator.rb",
+ "examples/i18n/pt/features/step_definitions/calculadora_steps.rb",
+ "examples/i18n/pt/features/support/env.rb",
+ "examples/i18n/pt/lib/calculadora.rb",
+ "examples/i18n/ro/features/step_definitons/calculator_steps.rb",
+ "examples/i18n/ro/lib/calculator.rb",
+ "examples/i18n/ru/features/step_definitons/calculator_steps.rb",
+ "examples/i18n/ru/features/support/env.rb",
+ "examples/i18n/ru/features/support/world.rb",
+ "examples/i18n/ru/lib/calculator.rb",
+ "examples/i18n/se/features/step_definitons/kalkulator_steps.rb",
+ "examples/i18n/se/lib/kalkulator.rb",
+ "examples/i18n/sk/features/step_definitons/calculator_steps.rb",
+ "examples/i18n/sk/lib/calculator.rb",
+ "examples/i18n/sr/features/step_definitons/calculator_steps.rb",
+ "examples/i18n/sr/lib/calculator.rb",
+ "examples/i18n/sr-latn/features/step_definitons/calculator_steps.rb",
+ "examples/i18n/sr-latn/lib/calculator.rb",
+ "examples/i18n/tr/features/step_definitons/hesap_makinesi_adimlari.rb",
+ "examples/i18n/tr/lib/hesap_makinesi.rb",
+ "examples/i18n/uz/features/step_definitons/calculator_steps.rb",
+ "examples/i18n/uz/features/support/env.rb",
+ "examples/i18n/uz/features/support/world.rb",
+ "examples/i18n/uz/lib/calculator.rb",
+ "examples/i18n/zh-CN/features/step_definitons/calculator_steps.rb",
+ "examples/i18n/zh-CN/lib/calculator.rb",
+ "examples/i18n/zh-TW/features/step_definitons/calculator_steps.rb",
+ "examples/i18n/zh-TW/lib/calculator.rb",
+ "examples/junit/features/step_definitions/steps.rb",
+ "examples/ramaze/app.rb",
+ "examples/ramaze/features/step_definitions/add_steps.rb",
+ "examples/ramaze/features/support/env.rb",
+ "examples/ruby2python/features/step_definitions/fib_steps.rb",
+ "examples/ruby2python/features/support/env.rb",
+ "examples/selenium/features/step_definitons/search_steps.rb",
+ "examples/selenium/features/support/env.rb",
+ "examples/selenium_webrat/features/step_definitons/search_steps.rb",
+ "examples/selenium_webrat/features/support/env.rb",
+ "examples/self_test/features/step_definitions/sample_steps.rb",
+ "examples/self_test/features/support/env.rb",
+ "examples/self_test/tmp/features/step_definitions/steps.rb",
+ "examples/sinatra/app.rb",
+ "examples/sinatra/features/step_definitions/add_steps.rb",
+ "examples/sinatra/features/support/env.rb",
+ "examples/steps_library/features/step_definitions/steps_lib1.rb",
+ "examples/steps_library/features/step_definitions/steps_lib2.rb",
+ "examples/test_unit/features/step_definitions/test_unit_steps.rb",
+ "examples/tickets/features/229/tagged_hooks.rb",
+ "examples/tickets/features/270/back.steps.rb",
+ "examples/tickets/features/272/hooks_steps.rb",
+ "examples/tickets/features/279/py_string_indent.steps.rb",
+ "examples/tickets/features/301/filter_background_tagged_hooks_steps.rb",
+ "examples/tickets/features/lib/eatting_machine.rb",
+ "examples/tickets/features/lib/pantry.rb",
+ "examples/tickets/features/step_definitons/246_steps.rb",
+ "examples/tickets/features/step_definitons/248_steps.rb",
+ "examples/tickets/features/step_definitons/scenario_outline_steps.rb",
+ "examples/tickets/features/step_definitons/tickets_steps.rb",
+ "examples/watir/features/step_definitions/search_steps.rb",
+ "examples/watir/features/support/env.rb",
+ "examples/watir/features/support/screenshots.rb",
+ "examples/webrat/features/step_definitions/kvasir_steps.rb",
+ "examples/webrat/features/support/env.rb"
+ ]
+
+ if s.respond_to? :specification_version then
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
+ s.specification_version = 3
+
+ if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
+ s.add_runtime_dependency(%q, ["= 1.0.4"])
+ s.add_runtime_dependency(%q, ["= 1.4.2"])
+ s.add_runtime_dependency(%q, ["= 0.2.9"])
+ s.add_runtime_dependency(%q, ["= 2.1.2"])
+ s.add_runtime_dependency(%q, ["= 1.1.2"])
+ s.add_development_dependency(%q, ["= 1.3.3"])
+ s.add_development_dependency(%q, ["= 0.5.1"])
+ s.add_development_dependency(%q, ["= 1.2.9"])
+ s.add_development_dependency(%q, ["= 0.7.3"])
+ else
+ s.add_dependency(%q, ["= 1.0.4"])
+ s.add_dependency(%q, ["= 1.4.2"])
+ s.add_dependency(%q, ["= 0.2.9"])
+ s.add_dependency(%q, ["= 2.1.2"])
+ s.add_dependency(%q, ["= 1.1.2"])
+ s.add_dependency(%q, ["= 1.3.3"])
+ s.add_dependency(%q, ["= 0.5.1"])
+ s.add_dependency(%q, ["= 1.2.9"])
+ s.add_dependency(%q, ["= 0.7.3"])
+ end
+ else
+ s.add_dependency(%q, ["= 1.0.4"])
+ s.add_dependency(%q, ["= 1.4.2"])
+ s.add_dependency(%q, ["= 0.2.9"])
+ s.add_dependency(%q, ["= 2.1.2"])
+ s.add_dependency(%q, ["= 1.1.2"])
+ s.add_dependency(%q, ["= 1.3.3"])
+ s.add_dependency(%q, ["= 0.5.1"])
+ s.add_dependency(%q, ["= 1.2.9"])
+ s.add_dependency(%q, ["= 0.7.3"])
+ end
+end
+
diff --git a/vendor/gems/gems/cucumber-0.4.4/cucumber.yml b/vendor/gems/gems/cucumber-0.4.4/cucumber.yml
new file mode 100755
index 00000000..897a256f
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/cucumber.yml
@@ -0,0 +1,4 @@
+default: --format progress --strict features
+jruby: --format progress --tags ~@spork --strict features
+windows_mri: --format progress --tags ~@spork --strict features
+wip: --tags @wip --wip features
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/dos_line_endings/Rakefile b/vendor/gems/gems/cucumber-0.4.4/examples/dos_line_endings/Rakefile
new file mode 100755
index 00000000..a5cf96ac
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/dos_line_endings/Rakefile
@@ -0,0 +1,6 @@
+$:.unshift(File.dirname(__FILE__) + '/../../lib')
+require 'cucumber/rake/task'
+
+Cucumber::Rake::Task.new do |t|
+ t.cucumber_opts = %w{--format pretty}
+end
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/dos_line_endings/features/dos_line_endings.feature b/vendor/gems/gems/cucumber-0.4.4/examples/dos_line_endings/features/dos_line_endings.feature
new file mode 100755
index 00000000..d9358a56
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/dos_line_endings/features/dos_line_endings.feature
@@ -0,0 +1,9 @@
+Feature: DOS line endings
+ In order to have less bug reports
+ As a windows developer
+ I want to write features with DOS line endigs
+
+ Scenario: Just lots of DOS
+ Given I am on DOS
+ And Any version of Windows is really just DOS
+ Then Windows still sucks
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/README.textile b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/README.textile
new file mode 100755
index 00000000..dc22721a
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/README.textile
@@ -0,0 +1,18 @@
+h1. Internationalisation (i18n) examples
+
+Under this directory you'll find examples of Cucumber features written in
+many of the natural languages Cucumber supports.
+
+For a full list of what languages Cucumber supports - run cucumber --language help
+
+h2. Running all the examples
+
+Open a shell in this directory and run
+
+rake i18n
+
+h2. Running examples for a specific language
+
+Open a shell in the directory for the specific language and run
+
+rake features
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/Rakefile b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/Rakefile
new file mode 100755
index 00000000..339942a2
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/Rakefile
@@ -0,0 +1,32 @@
+desc 'Run features for all languages'
+task :i18n do
+ dir = File.dirname(__FILE__)
+ Dir["#{dir}/*"].each do |f|
+ if File.directory?(f)
+ lang = f[dir.length+1..-1]
+ if examples_working?(lang)
+ Dir.chdir(f) do
+ rake("cucumber")
+ end
+ else
+ STDERR.puts %{
+!!!!!
+!!!!!
+!!!!! SKIPPING #{lang} (The examples are out of date - please help update them)
+!!!!!
+!!!!!
+}
+ end
+ end
+ end
+end
+
+task :default => :i18n
+
+def examples_working?(lang)
+ !%w{}.index(lang)
+end
+
+def rake(args)
+ ruby($0, args)
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/ar/Rakefile b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/ar/Rakefile
new file mode 100755
index 00000000..6a417570
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/ar/Rakefile
@@ -0,0 +1,6 @@
+$:.unshift(File.dirname(__FILE__) + '/../../../lib')
+require 'cucumber/rake/task'
+
+Cucumber::Rake::Task.new do |t|
+ t.cucumber_opts = %w{--format pretty}
+end
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/ar/features/addition.feature b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/ar/features/addition.feature
new file mode 100755
index 00000000..e2dea445
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/ar/features/addition.feature
@@ -0,0 +1,17 @@
+# language: ar
+خاصية: الجمع
+ من اجل تجنب الأخطاء السخيÙØ©
+ كشخص غبي ÙÙŠ الرياضيات
+ اريد معرÙØ© ناتج جمع عددين
+
+ سيناريو مخطط: جمع عددين
+ بÙرض كتابة ÙÙŠ الآلة الØاسبة
+ Ùˆ كتابة ÙÙŠ الآلة الØاسبة
+ متى يتم الضغط على
+ اذاً يظهر على الشاشة
+
+ امثلة:
+ | input_1 | input_2 | button | output |
+ | 20 | 30 | جمع | 50 |
+ | 2 | 5 | جمع | 7 |
+ | 0 | 40 | جمع | 40 |
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/ar/features/step_definitons/calculator_steps.rb b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/ar/features/step_definitons/calculator_steps.rb
new file mode 100755
index 00000000..74fab135
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/ar/features/step_definitons/calculator_steps.rb
@@ -0,0 +1,24 @@
+# encoding: utf-8
+require 'spec/expectations'
+$:.unshift(File.dirname(__FILE__) + '/../../lib') # This line is not needed in your own project
+require 'cucumber/formatter/unicode'
+require 'calculator'
+
+Before do
+ @calc = Calculator.new
+end
+
+After do
+end
+
+Given "كتابة $n ÙÙŠ الآلة الØاسبة" do |n|
+ @calc.push n.to_i
+end
+
+When /يتم الضغط على (\w+)/ do |op|
+ @result = @calc.send op
+end
+
+Then /يظهر (.*) على الشاشة/ do |result|
+ @result.should == result.to_f
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/ar/lib/calculator.rb b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/ar/lib/calculator.rb
new file mode 100755
index 00000000..86b1a09b
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/ar/lib/calculator.rb
@@ -0,0 +1,11 @@
+# encoding: utf-8
+class Calculator
+ def push(n)
+ @args ||= []
+ @args << n
+ end
+
+ def جمع
+ @args.inject(0){|n,sum| sum+=n}
+ end
+end
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/bg/Rakefile b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/bg/Rakefile
new file mode 100755
index 00000000..80a1aec7
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/bg/Rakefile
@@ -0,0 +1,6 @@
+$:.unshift(File.dirname(__FILE__) + '/../../../lib')
+require 'cucumber/rake/task'
+
+Cucumber::Rake::Task.new do |t|
+ t.cucumber_opts = %w{--format pretty}
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/bg/features/addition.feature b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/bg/features/addition.feature
new file mode 100755
index 00000000..057cfc4a
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/bg/features/addition.feature
@@ -0,0 +1,12 @@
+# language: bg
+ФункционалноÑÑ‚: Събиране на чиÑла
+ За да не го правÑÑ‚ наум
+ Потребителите
+ ТрÑбва да могат да Ñъбират чиÑла Ñ ÐºÐ°Ð»ÐºÑƒÐ»Ð°Ñ‚Ð¾Ñ€Ð°
+
+ Сценарий: Събиране на две цели чиÑла
+ Дадено е че Ñъм въвел 50
+ И Ñъм въвел 70
+ Когато натиÑна "+"
+ То резултата Ñ‚Ñ€Ñбва да е равен на 120
+
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/bg/features/consecutive_calculations.feature b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/bg/features/consecutive_calculations.feature
new file mode 100755
index 00000000..4af79098
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/bg/features/consecutive_calculations.feature
@@ -0,0 +1,19 @@
+# language: bg
+ФункционалоÑÑ‚: ПоÑледователни изчиÑлениÑ
+ За да не го правÑÑ‚ наум
+ Потребителите
+ ТрÑбва да могат да извършват поÑледователни изчиÑÐ»ÐµÐ½Ð¸Ñ Ñ ÐºÐ°Ð»ÐºÑƒÐ»Ð°Ñ‚Ð¾Ñ€Ð°
+
+ ПредиÑториÑ:
+ Дадено е че Ñъм Ñъбрал 3 и 5
+
+ Сценарий: Ñъбиране Ñ Ñ€ÐµÐ·ÑƒÐ»Ñ‚Ð°Ñ‚Ð° от поÑледната операциÑ
+ Когато въведа 4
+ И натиÑна "+"
+ То резултата Ñ‚Ñ€Ñбва да е равен на 12
+
+ Сценарий: делене Ñ Ñ€ÐµÐ·ÑƒÐ»Ñ‚Ð°Ñ‚Ð° от поÑледната операциÑ
+ Когато въведа 2
+ И натиÑна "/"
+ То резултата Ñ‚Ñ€Ñбва да е равен на 4
+
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/bg/features/division.feature b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/bg/features/division.feature
new file mode 100755
index 00000000..6432294a
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/bg/features/division.feature
@@ -0,0 +1,17 @@
+# language: bg
+ФунцкционалноÑÑ‚: Делене на чиÑла
+ За да не го правÑÑ‚ наум
+ Потребителите
+ ТрÑбва да могат да разделÑÑ‚ чиÑла Ñ ÐºÐ°Ð»ÐºÑƒÐ»Ð°Ñ‚Ð¾Ñ€Ð°
+
+ Рамка на Ñценарий: Делене на цели чиÑла
+ Дадено е че Ñъм въвел <делимо>
+ И е че Ñъм въвел <делител>
+ Когато натиÑна "/"
+ То резултата Ñ‚Ñ€Ñбва да е равен на <чаÑтно>
+
+ Примери:
+ | делимо | делител | чаÑтно |
+ | 100 | 2 | 50 |
+ | 28 | 7 | 4 |
+ | 0 | 5 | 0 |
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/bg/features/step_definitons/calculator_steps.rb b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/bg/features/step_definitons/calculator_steps.rb
new file mode 100755
index 00000000..444b8241
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/bg/features/step_definitons/calculator_steps.rb
@@ -0,0 +1,24 @@
+# encoding: utf-8
+
+Дадено /въвел (\d+)/ do |x|
+ calc.push x.to_i
+end
+
+Когато /^въведа (\d+)/ do |x|
+ calc.push x.to_i
+end
+
+Когато /натиÑна "(.*)"/ do |op|
+ calc.send op
+end
+
+То /резултата Ñ‚Ñ€Ñбва да е равен на (\d+)/ do |result|
+ calc.result.should == result.to_f
+end
+
+Дадено /Ñъбрал (\d+) и (\d+)/ do |x, y|
+ Дадено %{въвел #{x}}
+ Дадено %{въвел #{y}}
+ Дадено %{натиÑна "+"}
+end
+
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/bg/features/support/env.rb b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/bg/features/support/env.rb
new file mode 100755
index 00000000..c6962408
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/bg/features/support/env.rb
@@ -0,0 +1,6 @@
+# encoding: utf-8
+require 'spec/expectations'
+$:.unshift(File.dirname(__FILE__) + '/../../lib')
+require 'cucumber/formatter/unicode'
+require 'calculator'
+$KCODE='u' unless Cucumber::RUBY_1_9
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/bg/features/support/world.rb b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/bg/features/support/world.rb
new file mode 100755
index 00000000..78d95d9b
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/bg/features/support/world.rb
@@ -0,0 +1,8 @@
+# encoding: utf-8
+module LazyCalc
+ def calc
+ @calc ||= Calculator.new
+ end
+end
+
+World(LazyCalc)
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/bg/lib/calculator.rb b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/bg/lib/calculator.rb
new file mode 100755
index 00000000..0b975edd
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/bg/lib/calculator.rb
@@ -0,0 +1,24 @@
+# encoding: utf-8
+
+class Calculator
+ def initialize
+ @stack = []
+ end
+
+ def push(arg)
+ @stack.push arg
+ end
+
+ def result
+ @stack.last
+ end
+
+ def +
+ @stack.push @stack.pop + @stack.pop
+ end
+
+ def /
+ divisor, dividend = [@stack.pop, @stack.pop] # Hm, @stack.pop(2) doesn't work
+ @stack.push dividend / divisor
+ end
+end
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/cat/Rakefile b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/cat/Rakefile
new file mode 100755
index 00000000..6a417570
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/cat/Rakefile
@@ -0,0 +1,6 @@
+$:.unshift(File.dirname(__FILE__) + '/../../../lib')
+require 'cucumber/rake/task'
+
+Cucumber::Rake::Task.new do |t|
+ t.cucumber_opts = %w{--format pretty}
+end
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/cat/features/step_definitons/calculator_steps.rb b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/cat/features/step_definitons/calculator_steps.rb
new file mode 100755
index 00000000..4c845f51
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/cat/features/step_definitons/calculator_steps.rb
@@ -0,0 +1,21 @@
+# encoding: utf-8
+require 'spec/expectations'
+$:.unshift(File.dirname(__FILE__) + '/../../lib') # This line is not needed in your own project
+require 'cucumber/formatter/unicode'
+require 'calculadora'
+
+Before do
+ @calc = Calculadora.new
+end
+
+Donat /que he introduït (\d+) a la calculadora/ do |n|
+ @calc.push n.to_i
+end
+
+Quan /premo el (\w+)/ do |op|
+ @result = @calc.send op
+end
+
+Aleshores /el resultat ha de ser (\d+) a la pantalla/ do |result|
+ @result.should == result.to_f
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/cat/features/suma.feature b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/cat/features/suma.feature
new file mode 100755
index 00000000..b93b42f9
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/cat/features/suma.feature
@@ -0,0 +1,17 @@
+# language: cat
+CaracterÃstica: Suma
+ Per evitar fer errors tontos
+ Com un matemà tic idiota
+ Vull saber la suma dels números
+
+ Esquema de l'escenari: Sumar dos números
+ Donat que he introduït a la calculadora
+ I que he introduït a la calculadora
+ Quan premo el
+ Aleshores el resultat ha de ser a la pantalla
+
+ Exemples:
+ | entrada_1 | entrada_2 | botó | resultat |
+ | 20 | 30 | add | 50 |
+ | 2 | 5 | add | 7 |
+ | 0 | 40 | add | 40 |
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/cat/lib/calculadora.rb b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/cat/lib/calculadora.rb
new file mode 100755
index 00000000..75b427f1
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/cat/lib/calculadora.rb
@@ -0,0 +1,16 @@
+class Calculadora
+
+ def push(n)
+ @args ||= []
+ @args << n
+ end
+
+ def add
+ @args.inject(0){|n,sum| sum+=n}
+ end
+
+ def divide
+ @args[0].to_f / @args[1].to_f
+ end
+
+end
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/da/Rakefile b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/da/Rakefile
new file mode 100755
index 00000000..6a417570
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/da/Rakefile
@@ -0,0 +1,6 @@
+$:.unshift(File.dirname(__FILE__) + '/../../../lib')
+require 'cucumber/rake/task'
+
+Cucumber::Rake::Task.new do |t|
+ t.cucumber_opts = %w{--format pretty}
+end
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/da/features/sammenlaegning.feature b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/da/features/sammenlaegning.feature
new file mode 100755
index 00000000..5df76f0a
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/da/features/sammenlaegning.feature
@@ -0,0 +1,18 @@
+# language: da
+Egenskab: Sammenlægning
+ For at slippe for at lave dumme fejl
+ Som bogholder
+ Vil jeg kunne lægge sammen
+
+ Scenarie: to tal
+ Givet at jeg har indtastet 5
+ Og at jeg har indtastet 7
+ Når jeg lægger sammen
+ Så skal resultatet være 12
+
+ Scenarie: tre tal
+ Givet at jeg har indtastet 5
+ Og at jeg har indtastet 7
+ Og at jeg har indtastet 1
+ Når jeg lægger sammen
+ Så skal resultatet være 13
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/da/features/step_definitons/lommeregner_steps.rb b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/da/features/step_definitons/lommeregner_steps.rb
new file mode 100755
index 00000000..1fba9567
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/da/features/step_definitons/lommeregner_steps.rb
@@ -0,0 +1,24 @@
+# encoding: utf-8
+require 'spec/expectations'
+$:.unshift(File.dirname(__FILE__) + '/../../lib') # This line is not needed in your own project
+require 'cucumber/formatter/unicode'
+require 'lommeregner'
+
+Before do
+ @calc = Lommeregner.new
+end
+
+After do
+end
+
+Given /at jeg har indtastet (\d+)/ do |n|
+ @calc.push n.to_i
+end
+
+When 'jeg lægger sammen' do
+ @result = @calc.add
+end
+
+Then /skal resultatet være (\d*)/ do |result|
+ @result.should == result.to_i
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/da/lib/lommeregner.rb b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/da/lib/lommeregner.rb
new file mode 100755
index 00000000..4876c257
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/da/lib/lommeregner.rb
@@ -0,0 +1,11 @@
+class Lommeregner
+ def push(n)
+ @args ||= []
+ @args << n
+ end
+
+ def add
+ #@args[0] + @args[1]
+ @args.inject(0){|n,sum| sum+=n}
+ end
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/de/.gitignore b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/de/.gitignore
new file mode 100755
index 00000000..deeedc9b
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/de/.gitignore
@@ -0,0 +1 @@
+features.html
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/de/Rakefile b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/de/Rakefile
new file mode 100755
index 00000000..6a417570
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/de/Rakefile
@@ -0,0 +1,6 @@
+$:.unshift(File.dirname(__FILE__) + '/../../../lib')
+require 'cucumber/rake/task'
+
+Cucumber::Rake::Task.new do |t|
+ t.cucumber_opts = %w{--format pretty}
+end
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/de/features/addition.feature b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/de/features/addition.feature
new file mode 100755
index 00000000..09c511e3
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/de/features/addition.feature
@@ -0,0 +1,17 @@
+# language: de
+Funktionalität: Addition
+ Um dumme Fehler zu vermeiden
+ möchte ich als Matheidiot
+ die Summe zweier Zahlen gesagt bekommen
+
+ Szenariogrundriss: Zwei Zahlen hinzufügen
+ Gegeben sei ich habe in den Taschenrechner eingegeben
+ Und ich habe in den Taschenrechner eingegeben
+ Wenn ich drücke
+ Dann sollte das Ergebniss auf dem Bildschirm sein
+
+ Beispiele:
+ | Eingabe_1 | Eingabe_2 | Knopf | Ausgabe |
+ | 20 | 30 | add | 50 |
+ | 2 | 5 | add | 7 |
+ | 0 | 40 | add | 40 |
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/de/features/division.feature b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/de/features/division.feature
new file mode 100755
index 00000000..cda4edab
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/de/features/division.feature
@@ -0,0 +1,10 @@
+# language: de
+Funktionalität: Division
+ Um dumme Fehler zu vermeiden
+ müssen Kassierer in der Lage sein einen Bruchteil zu berechnen
+
+ Szenario: Normale Zahlen
+ Gegeben sei ich habe 3 in den Taschenrechner eingegeben
+ Und ich habe 2 in den Taschenrechner eingegeben
+ Wenn ich divide drücke
+ Dann sollte das Ergebniss auf dem Bildschirm 1.5 sein
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/de/features/step_definitons/calculator_steps.rb b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/de/features/step_definitons/calculator_steps.rb
new file mode 100755
index 00000000..96ee3025
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/de/features/step_definitons/calculator_steps.rb
@@ -0,0 +1,24 @@
+# encoding: utf-8
+require 'spec/expectations'
+$:.unshift(File.dirname(__FILE__) + '/../../lib') # This line is not needed in your own project
+require 'cucumber/formatter/unicode'
+require 'calculator'
+
+Before do
+ @calc = Calculator.new
+end
+
+After do
+end
+
+Given /ich habe (\d+) in den Taschenrechner eingegeben/ do |n|
+ @calc.push n.to_i
+end
+
+When /ich (\w+) drücke/ do |op|
+ @result = @calc.send op
+end
+
+Then /sollte das Ergebniss auf dem Bildschirm (.*) sein/ do |result|
+ @result.should == result.to_f
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/de/lib/calculator.rb b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/de/lib/calculator.rb
new file mode 100755
index 00000000..0598d3e6
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/de/lib/calculator.rb
@@ -0,0 +1,14 @@
+class Calculator
+ def push(n)
+ @args ||= []
+ @args << n
+ end
+
+ def add
+ @args.inject(0){|n,sum| sum+=n}
+ end
+
+ def divide
+ @args[0].to_f / @args[1].to_f
+ end
+end
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/en-lol/Rakefile b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/en-lol/Rakefile
new file mode 100755
index 00000000..becb4fa1
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/en-lol/Rakefile
@@ -0,0 +1,6 @@
+$:.unshift(File.dirname(__FILE__) + '/../../../lib')
+require 'cucumber/rake/task'
+
+Cucumber::Rake::Task.new do |t|
+ t.cucumber_opts = %w{--language en-lol}
+end
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/en-lol/features/step_definitions/cucumbrz_steps.rb b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/en-lol/features/step_definitions/cucumbrz_steps.rb
new file mode 100755
index 00000000..7acede26
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/en-lol/features/step_definitions/cucumbrz_steps.rb
@@ -0,0 +1,16 @@
+ICANHAZ /^IN TEH BEGINNIN (\d+) CUCUMBRZ$/ do |n|
+ @basket = Basket.new(n.to_i)
+end
+
+WEN /^I EAT (\d+) CUCUMBRZ$/ do |n|
+ @belly = Belly.new
+ @belly.eat(@basket.take(n.to_i))
+end
+
+DEN /^I HAS (\d+) CUCUMBERZ IN MAH BELLY$/ do |n|
+ @belly.cukes.should == n.to_i
+end
+
+AN /^IN TEH END (\d+) CUCUMBRZ KTHXBAI$/ do |n|
+ @basket.cukes.should == n.to_i
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/en-lol/features/stuffing.feature b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/en-lol/features/stuffing.feature
new file mode 100755
index 00000000..30da3f87
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/en-lol/features/stuffing.feature
@@ -0,0 +1,8 @@
+# language: en-lol
+OH HAI: STUFFING
+
+ MISHUN: CUCUMBR
+ I CAN HAZ IN TEH BEGINNIN 3 CUCUMBRZ
+ WEN I EAT 2 CUCUMBRZ
+ DEN I HAS 2 CUCUMBERZ IN MAH BELLY
+ AN IN TEH END 1 CUCUMBRZ KTHXBAI
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/en-lol/features/support/env.rb b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/en-lol/features/support/env.rb
new file mode 100755
index 00000000..574a300a
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/en-lol/features/support/env.rb
@@ -0,0 +1,8 @@
+# encoding: utf-8
+$KCODE='u' unless Cucumber::RUBY_1_9
+require 'cucumber/formatter/unicode'
+require 'spec/expectations'
+
+$:.unshift(File.dirname(__FILE__) + '/../../lib')
+require 'basket'
+require 'belly'
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/en-lol/lib/basket.rb b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/en-lol/lib/basket.rb
new file mode 100755
index 00000000..cfe81b13
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/en-lol/lib/basket.rb
@@ -0,0 +1,12 @@
+class Basket
+ attr_reader :cukes
+
+ def initialize(cukes)
+ @cukes = cukes
+ end
+
+ def take(cukes)
+ @cukes -= cukes
+ cukes
+ end
+end
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/en-lol/lib/belly.rb b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/en-lol/lib/belly.rb
new file mode 100755
index 00000000..d41e3f94
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/en-lol/lib/belly.rb
@@ -0,0 +1,11 @@
+class Belly
+ attr_reader :cukes
+
+ def initialize
+ @cukes = 0
+ end
+
+ def eat(cukes)
+ @cukes += cukes
+ end
+end
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/en/.gitignore b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/en/.gitignore
new file mode 100755
index 00000000..deeedc9b
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/en/.gitignore
@@ -0,0 +1 @@
+features.html
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/en/Rakefile b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/en/Rakefile
new file mode 100755
index 00000000..6a417570
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/en/Rakefile
@@ -0,0 +1,6 @@
+$:.unshift(File.dirname(__FILE__) + '/../../../lib')
+require 'cucumber/rake/task'
+
+Cucumber::Rake::Task.new do |t|
+ t.cucumber_opts = %w{--format pretty}
+end
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/en/features/addition.feature b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/en/features/addition.feature
new file mode 100755
index 00000000..0bcff4ab
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/en/features/addition.feature
@@ -0,0 +1,17 @@
+# language: en
+Feature: Addition
+ In order to avoid silly mistakes
+ As a math idiot
+ I want to be told the sum of two numbers
+
+ Scenario Outline: Add two numbers
+ Given I have entered into the calculator
+ And I have entered into the calculator
+ When I press
+ Then the result should be on the screen
+
+ Examples:
+ | input_1 | input_2 | button | output |
+ | 20 | 30 | add | 50 |
+ | 2 | 5 | add | 7 |
+ | 0 | 40 | add | 40 |
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/en/features/division.feature b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/en/features/division.feature
new file mode 100755
index 00000000..2cdb6324
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/en/features/division.feature
@@ -0,0 +1,10 @@
+# language: en
+Feature: Division
+ In order to avoid silly mistakes
+ Cashiers must be able to calculate a fraction
+
+ Scenario: Regular numbers
+ Given I have entered 3 into the calculator
+ And I have entered 2 into the calculator
+ When I press divide
+ Then the result should be 1.5 on the screen
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/en/features/step_definitons/calculator_steps.rb b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/en/features/step_definitons/calculator_steps.rb
new file mode 100755
index 00000000..4d69f2dc
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/en/features/step_definitons/calculator_steps.rb
@@ -0,0 +1,24 @@
+# encoding: utf-8
+require 'spec/expectations'
+$:.unshift(File.dirname(__FILE__) + '/../../lib') # This line is not needed in your own project
+require 'cucumber/formatter/unicode'
+require 'calculator'
+
+Before do
+ @calc = Calculator.new
+end
+
+After do
+end
+
+Given /I have entered (\d+) into the calculator/ do |n|
+ @calc.push n.to_i
+end
+
+When /I press (\w+)/ do |op|
+ @result = @calc.send op
+end
+
+Then /the result should be (.*) on the screen/ do |result|
+ @result.should == result.to_f
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/en/lib/calculator.rb b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/en/lib/calculator.rb
new file mode 100755
index 00000000..0598d3e6
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/en/lib/calculator.rb
@@ -0,0 +1,14 @@
+class Calculator
+ def push(n)
+ @args ||= []
+ @args << n
+ end
+
+ def add
+ @args.inject(0){|n,sum| sum+=n}
+ end
+
+ def divide
+ @args[0].to_f / @args[1].to_f
+ end
+end
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/es/Rakefile b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/es/Rakefile
new file mode 100755
index 00000000..6a417570
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/es/Rakefile
@@ -0,0 +1,6 @@
+$:.unshift(File.dirname(__FILE__) + '/../../../lib')
+require 'cucumber/rake/task'
+
+Cucumber::Rake::Task.new do |t|
+ t.cucumber_opts = %w{--format pretty}
+end
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/es/features/adicion.feature b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/es/features/adicion.feature
new file mode 100755
index 00000000..d659127d
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/es/features/adicion.feature
@@ -0,0 +1,17 @@
+# language: es
+CaracterÃstica: adición
+ Para evitar hacer errores tontos
+ Como un matemático idiota
+ Quiero saber la suma de los números
+
+ Esquema del escenario: Sumar dos números
+ Dado que he introducido en la calculadora
+ Y que he introducido en la calculadora
+ Cuando oprimo el
+ Entonces el resultado debe ser en la pantalla
+
+ Ejemplos:
+ | entrada_1 | entrada_2 | botón | resultado |
+ | 20 | 30 | add | 50 |
+ | 2 | 5 | add | 7 |
+ | 0 | 40 | add | 40 |
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/es/features/step_definitons/calculador_steps.rb b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/es/features/step_definitons/calculador_steps.rb
new file mode 100755
index 00000000..476a70eb
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/es/features/step_definitons/calculador_steps.rb
@@ -0,0 +1,21 @@
+# encoding: utf-8
+require 'spec/expectations'
+$:.unshift(File.dirname(__FILE__) + '/../../lib') # This line is not needed in your own project
+require 'cucumber/formatter/unicode'
+require 'calculador'
+
+Before do
+ @calc = Calculador.new
+end
+
+Dado /que he introducido (\d+) en la calculadora/ do |n|
+ @calc.push n.to_i
+end
+
+Cuando /oprimo el (\w+)/ do |op|
+ @result = @calc.send op
+end
+
+Entonces /el resultado debe ser (.*) en la pantalla/ do |result|
+ @result.should == result.to_f
+end
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/es/lib/calculador.rb b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/es/lib/calculador.rb
new file mode 100755
index 00000000..b7db592a
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/es/lib/calculador.rb
@@ -0,0 +1,14 @@
+class Calculador
+ def push(n)
+ @args ||= []
+ @args << n
+ end
+
+ def add
+ @args.inject(0){|n,sum| sum+=n}
+ end
+
+ def divide
+ @args[0].to_f / @args[1].to_f
+ end
+end
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/et/Rakefile b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/et/Rakefile
new file mode 100755
index 00000000..6a417570
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/et/Rakefile
@@ -0,0 +1,6 @@
+$:.unshift(File.dirname(__FILE__) + '/../../../lib')
+require 'cucumber/rake/task'
+
+Cucumber::Rake::Task.new do |t|
+ t.cucumber_opts = %w{--format pretty}
+end
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/et/features/jagamine.feature b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/et/features/jagamine.feature
new file mode 100755
index 00000000..d9142672
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/et/features/jagamine.feature
@@ -0,0 +1,10 @@
+# language: et
+Omadus: Jagamine
+ Rumalate vigade vältimiseks
+ Peavad kassapidajad saama arvutada murdudes
+
+ Stsenaarium: Tavalised numrbid
+ Eeldades et olen sisestanud kalkulaatorisse numbri 3
+ Ja olen sisestanud kalkulaatorisse numbri 2
+ Kui ma vajutan jaga
+ Siis vastuseks peab ekraanil kuvatama 1.5
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/et/features/liitmine.feature b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/et/features/liitmine.feature
new file mode 100755
index 00000000..59e06d72
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/et/features/liitmine.feature
@@ -0,0 +1,17 @@
+# language: et
+Omadus: Liitmine
+ Selleks et vältida rumalaid vigu
+ Olles matemaatika-puupea
+ Tahan et mulle öeldaks kahe numbri summa
+
+ Raamstsenaarium: Liida kaks numbrit
+ Eeldades et olen sisestanud kalkulaatorisse numbri
+ Ja olen sisestanud kalkulaatorisse numbri
+ Kui ma vajutan
+ Siis vastuseks peab ekraanil kuvatama
+
+ Juhtumid:
+ | input_1 | input_2 | button | output |
+ | 20 | 30 | liida | 50 |
+ | 2 | 5 | liida | 7 |
+ | 0 | 40 | liida | 40 |
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/et/features/step_definitions/kalkulaator_steps.rb b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/et/features/step_definitions/kalkulaator_steps.rb
new file mode 100755
index 00000000..21350d43
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/et/features/step_definitions/kalkulaator_steps.rb
@@ -0,0 +1,24 @@
+# encoding: utf-8
+require 'spec/expectations'
+$:.unshift(File.dirname(__FILE__) + '/../../lib') # This line is not needed in your own project
+require 'cucumber/formatter/unicode'
+require 'kalkulaator'
+
+Before do
+ @calc = Kalkulaator.new
+end
+
+After do
+end
+
+Given /olen sisestanud kalkulaatorisse numbri (\d+)/ do |n|
+ @calc.push n.to_i
+end
+
+When /ma vajutan (\w+)/ do |op|
+ @result = @calc.send op
+end
+
+Then /vastuseks peab ekraanil kuvatama (.*)/ do |result|
+ @result.should == result.to_f
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/et/lib/kalkulaator.rb b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/et/lib/kalkulaator.rb
new file mode 100755
index 00000000..3e75a741
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/et/lib/kalkulaator.rb
@@ -0,0 +1,14 @@
+class Kalkulaator
+ def push(n)
+ @args ||= []
+ @args << n
+ end
+
+ def liida
+ @args.inject(0){|n,sum| sum+=n}
+ end
+
+ def jaga
+ @args[0].to_f / @args[1].to_f
+ end
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/fi/.gitignore b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/fi/.gitignore
new file mode 100755
index 00000000..deeedc9b
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/fi/.gitignore
@@ -0,0 +1 @@
+features.html
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/fi/Rakefile b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/fi/Rakefile
new file mode 100755
index 00000000..80a1aec7
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/fi/Rakefile
@@ -0,0 +1,6 @@
+$:.unshift(File.dirname(__FILE__) + '/../../../lib')
+require 'cucumber/rake/task'
+
+Cucumber::Rake::Task.new do |t|
+ t.cucumber_opts = %w{--format pretty}
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/fi/features/jakolasku.feature b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/fi/features/jakolasku.feature
new file mode 100755
index 00000000..89a67051
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/fi/features/jakolasku.feature
@@ -0,0 +1,10 @@
+# language: fi
+Ominaisuus: Jakolasku
+ Välttyäkseen hölmöiltä virheiltä
+ Kassanhoitajan on voitava laskea osamäärä
+
+ Tapaus: Kokonaislukujen jakolasku
+ Oletetaan että olen syöttänyt laskimeen luvun 3
+ Ja että olen syöttänyt laskimeen luvun 2
+ Kun painan "jaa"
+ Niin laskimen ruudulla pitäisi näkyä tulos 1.5
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/fi/features/step_definitons/laskin_steps.rb b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/fi/features/step_definitons/laskin_steps.rb
new file mode 100755
index 00000000..34f7fd5f
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/fi/features/step_definitons/laskin_steps.rb
@@ -0,0 +1,24 @@
+# encoding: utf-8
+require 'spec/expectations'
+$:.unshift(File.dirname(__FILE__) + '/../../lib')
+require 'cucumber/formatter/unicode'
+require 'laskin'
+
+Before do
+ @laskin = Laskin.new
+end
+
+After do
+end
+
+Given /että olen syöttänyt laskimeen luvun (\d+)/ do |n|
+ @laskin.pinoa n.to_i
+end
+
+When /painan "(\w+)"/ do |op|
+ @tulos = @laskin.send op
+end
+
+Then /laskimen ruudulla pitäisi näkyä tulos (.*)/ do |tulos|
+ @tulos.should == tulos.to_f
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/fi/features/yhteenlasku.feature b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/fi/features/yhteenlasku.feature
new file mode 100755
index 00000000..b963a26c
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/fi/features/yhteenlasku.feature
@@ -0,0 +1,17 @@
+# language: fi
+Ominaisuus: Yhteenlasku
+ Välttyäkseni hölmöiltä virheiltä
+ Koska olen laskutaidoton
+ Haluan että yhteenlaskut lasketaan puolestani
+
+ Tapausaihio: Kahden luvun summa
+ Oletetaan että olen syöttänyt laskimeen luvun
+ Ja että olen syöttänyt laskimeen luvun
+ Kun painan ""
+ Niin laskimen ruudulla pitäisi näkyä tulos
+
+ Tapaukset:
+ | luku_1 | luku_2 | nappi | tulos |
+ | 20 | 30 | summaa | 50 |
+ | 2 | 5 | summaa | 7 |
+ | 0 | 40 | summaa | 40 |
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/fi/lib/laskin.rb b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/fi/lib/laskin.rb
new file mode 100755
index 00000000..5e1946c9
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/fi/lib/laskin.rb
@@ -0,0 +1,14 @@
+class Laskin
+ def pinoa(n)
+ @args ||= []
+ @args << n
+ end
+
+ def summaa
+ @args.inject(0){|n,sum| sum+=n}
+ end
+
+ def jaa
+ @args[0].to_f / @args[1].to_f
+ end
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/fr/Rakefile b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/fr/Rakefile
new file mode 100755
index 00000000..6a417570
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/fr/Rakefile
@@ -0,0 +1,6 @@
+$:.unshift(File.dirname(__FILE__) + '/../../../lib')
+require 'cucumber/rake/task'
+
+Cucumber::Rake::Task.new do |t|
+ t.cucumber_opts = %w{--format pretty}
+end
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/fr/features/addition.feature b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/fr/features/addition.feature
new file mode 100755
index 00000000..37d98430
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/fr/features/addition.feature
@@ -0,0 +1,18 @@
+# language: fr
+Fonctionnalité: Addition
+ Afin de gagner du temps lors du calcul de la facture
+ En tant que commerçant
+ Je souhaite pouvoir faire une addition
+
+ Plan du Scénario: Addition de deux nombres
+ Soit une calculatrice
+ Et que j'entre pour le premier nombre
+ Et que je tape sur la touche "+"
+ Et que j'entre pour le second nombre
+ Lorsque je tape sur la touche "="
+ Alors le résultat affiché doit être
+
+ Exemples:
+ | a | b | somme |
+ | 2 | 2 | 4 |
+ | 2 | 3 | 5 |
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/fr/features/step_definitions/calculatrice_steps.rb b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/fr/features/step_definitions/calculatrice_steps.rb
new file mode 100755
index 00000000..8d615577
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/fr/features/step_definitions/calculatrice_steps.rb
@@ -0,0 +1,25 @@
+# encoding: utf-8
+require 'spec/expectations'
+$:.unshift(File.dirname(__FILE__) + '/../../lib') # This line is not needed in your own project
+require 'cucumber/formatter/unicode'
+require 'calculatrice'
+
+Soit /^une calculatrice$/ do
+ @calc = Calculatrice.new
+end
+
+Et /^que j'entre (\d+) pour le (.*) nombre/ do |n, x|
+ @calc.push n.to_i
+end
+
+Lorsque /^je tape sur la touche "="$/ do
+ @expected_result = @calc.additionner
+end
+
+Alors /le résultat affiché doit être (\d*)/ do |result|
+ result.to_i.should == @expected_result
+end
+
+Soit /^que je tape sur la touche "\+"$/ do
+ # noop
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/fr/lib/calculatrice.rb b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/fr/lib/calculatrice.rb
new file mode 100755
index 00000000..f92cddb3
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/fr/lib/calculatrice.rb
@@ -0,0 +1,10 @@
+class Calculatrice
+ def push(n)
+ @args ||= []
+ @args << n
+ end
+
+ def additionner
+ @args.inject(0){|n,sum| sum+=n}
+ end
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/he/Rakefile b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/he/Rakefile
new file mode 100755
index 00000000..80a1aec7
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/he/Rakefile
@@ -0,0 +1,6 @@
+$:.unshift(File.dirname(__FILE__) + '/../../../lib')
+require 'cucumber/rake/task'
+
+Cucumber::Rake::Task.new do |t|
+ t.cucumber_opts = %w{--format pretty}
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/he/features/addition.feature b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/he/features/addition.feature
new file mode 100755
index 00000000..ccca14f8
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/he/features/addition.feature
@@ -0,0 +1,17 @@
+# language: he
+×ª×›×•× ×”: חיבור
+ כדי ×œ×ž× ×•×¢ טעויות טפשיות
+ בתור בור מתמטי
+ ×× ×™ רוצה שיגידו לי ×ת ×”×¡×›×•× ×©×œ ×©× ×™ מספרי×
+
+ ×ª×‘× ×™×ª תרחיש: חבר ×©× ×™ מספרי×
+ ×‘×”×™× ×ª×Ÿ ×©×”×–× ×ª×™ <קלט_1> למחשבון
+ ×•×’× ×©×”×–× ×ª×™ <קלט_2> למחשבון
+ ×›×שר ×× ×™ לוחץ על <כפתור>
+ ××– התוצ××” על המסך צריכה להיות <פלט>
+
+ דוגמ×ות:
+ | קלט_1 | קלט_2 | כפתור | פלט |
+ | 20 | 30 | חבר | 50 |
+ | 2 | 5 | חבר | 7 |
+ | 0 | 40 | חבר | 40 |
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/he/features/division.feature b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/he/features/division.feature
new file mode 100755
index 00000000..5474b1be
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/he/features/division.feature
@@ -0,0 +1,10 @@
+# language: he
+×ª×›×•× ×”: חילוק
+ כדי ×œ×ž× ×•×¢ טעויות טפשיות
+ לקופ××™× ×—×™×™×‘×ª להיות יכולת לחשב שבר
+
+ תרחיש: ×ž×¡×¤×¨×™× ×¨×’×™×œ×™×
+ ×‘×”×™× ×ª×Ÿ ×©×”×–× ×ª×™ 3 למחשבון
+ ×•×’× ×©×”×–× ×ª×™ 2 למחשבון
+ ×›×שר ×× ×™ לוחץ על חלק
+ ××– התוצ××” על המסך צריכה להיות 1.5
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/he/features/step_definitons/calculator_steps.rb b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/he/features/step_definitons/calculator_steps.rb
new file mode 100755
index 00000000..3291467a
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/he/features/step_definitons/calculator_steps.rb
@@ -0,0 +1,24 @@
+# encoding: utf-8
+require 'spec/expectations'
+$:.unshift(File.dirname(__FILE__) + '/../../lib') # This line is not needed in your own project
+require 'cucumber/formatter/unicode'
+require 'calculator'
+
+Before do
+ @calc = Calculator.new
+end
+
+After do
+end
+
+Given /×©×”×–× ×ª×™ (\d+) למחשבון/ do |n|
+ @calc.push n.to_i
+end
+
+When /×× ×™ לוחץ על (\w+)/ do |op|
+ @result = @calc.send op
+end
+
+Then /התוצ××” על המסך צריכה להיות (.*)/ do |result|
+ @result.should == result.to_f
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/he/lib/calculator.rb b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/he/lib/calculator.rb
new file mode 100755
index 00000000..35d836b8
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/he/lib/calculator.rb
@@ -0,0 +1,14 @@
+class Calculator
+ def push(n)
+ @args ||= []
+ @args << n
+ end
+
+ def חבר
+ @args.inject(0){|n,sum| sum+=n}
+ end
+
+ def חלק
+ @args[0].to_f / @args[1].to_f
+ end
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/hu/.gitignore b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/hu/.gitignore
new file mode 100755
index 00000000..deeedc9b
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/hu/.gitignore
@@ -0,0 +1 @@
+features.html
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/hu/Rakefile b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/hu/Rakefile
new file mode 100755
index 00000000..80a1aec7
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/hu/Rakefile
@@ -0,0 +1,6 @@
+$:.unshift(File.dirname(__FILE__) + '/../../../lib')
+require 'cucumber/rake/task'
+
+Cucumber::Rake::Task.new do |t|
+ t.cucumber_opts = %w{--format pretty}
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/hu/features/addition.feature b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/hu/features/addition.feature
new file mode 100755
index 00000000..485f48e1
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/hu/features/addition.feature
@@ -0,0 +1,17 @@
+# language: hu
+Jellemző: Összeadás
+ Azért, hogy elkerüljem a buta hibákat
+ amit diszkalkúliásként elkövethetek,
+ két szám összegét szeretném kiszámoltatni.
+
+ Forgatókönyv vázlat: Két szám összeadása
+ Ha beütök a számológépbe egy -est
+ És beütök a számológépbe egy -est
+ Majd megnyomom az gombot
+ Akkor eredményül -t kell kapnom
+
+ Példák:
+ | be_1 | be_2 | gomb | ki |
+ | 20 | 30 | add | 50 |
+ | 2 | 5 | add | 7 |
+ | 0 | 40 | add | 40 |
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/hu/features/division.feature b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/hu/features/division.feature
new file mode 100755
index 00000000..afd723cc
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/hu/features/division.feature
@@ -0,0 +1,10 @@
+# language: hu
+Jellemző: Osztás
+ Azért, hogy elkerüljem a buta hibákat
+ a számológépeknek tudniuk kell osztani.
+
+ Forgatókönyv: Egyszerű számok
+ Ha beütök a számológépbe egy 3-ast
+ És beütök a számológépbe egy 2-est
+ Majd megnyomom a divide gombot
+ Akkor eredményül 1.5-öt kell kapnom
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/hu/features/step_definitons/calculator_steps.rb b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/hu/features/step_definitons/calculator_steps.rb
new file mode 100755
index 00000000..0d10341a
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/hu/features/step_definitons/calculator_steps.rb
@@ -0,0 +1,25 @@
+# encoding: utf-8
+require 'spec/expectations'
+$:.unshift(File.dirname(__FILE__) + '/../../lib') # This line is not needed in your own project
+require 'cucumber/formatter/unicode'
+require 'calculator'
+
+Before do
+ @calc = Calculator.new
+end
+
+After do
+end
+
+Ha /^beütök a számológépbe egy (\d+)\-(?:es|as|ös|ás)t$/ do |n|
+ @calc.push n.to_i
+end
+
+Majd /^megnyomom az? (\w+) gombot$/ do |op|
+ @result = @calc.send op
+end
+
+Akkor /^eredményül (.*)\-(?:e|a|ö|á|)t kell kapnom$/ do |result|
+ @result.should == result.to_f
+end
+
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/hu/lib/calculator.rb b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/hu/lib/calculator.rb
new file mode 100755
index 00000000..2949fd4d
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/hu/lib/calculator.rb
@@ -0,0 +1,14 @@
+class Calculator
+ def push(n)
+ @args ||= []
+ @args << n
+ end
+
+ def add
+ @args.inject(0){|n,sum| sum+=n}
+ end
+
+ def divide
+ @args[0].to_f / @args[1].to_f
+ end
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/id/.gitignore b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/id/.gitignore
new file mode 100755
index 00000000..deeedc9b
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/id/.gitignore
@@ -0,0 +1 @@
+features.html
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/id/Rakefile b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/id/Rakefile
new file mode 100755
index 00000000..6a417570
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/id/Rakefile
@@ -0,0 +1,6 @@
+$:.unshift(File.dirname(__FILE__) + '/../../../lib')
+require 'cucumber/rake/task'
+
+Cucumber::Rake::Task.new do |t|
+ t.cucumber_opts = %w{--format pretty}
+end
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/id/features/addition.feature b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/id/features/addition.feature
new file mode 100755
index 00000000..eacbd745
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/id/features/addition.feature
@@ -0,0 +1,17 @@
+# language: id
+Fitur: Addition
+ Untuk menghindari kesalahan konyol
+ Sebagai orang yang gak bisa matematika
+ Aku ingin diberi tahu jumlah dua bilangan
+
+ Skenario konsep: Menjumlahkan dua bilangan
+ Dengan aku sudah masukkan ke kalkulator
+ Dan aku sudah masukkan ke kalkulator
+ Ketika aku tekan
+ Maka hasilnya harus di layar
+
+ Contoh:
+ | input_1 | input_2 | button | output |
+ | 20 | 30 | add | 50 |
+ | 2 | 5 | add | 7 |
+ | 0 | 40 | add | 40 |
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/id/features/division.feature b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/id/features/division.feature
new file mode 100755
index 00000000..33d0e385
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/id/features/division.feature
@@ -0,0 +1,10 @@
+# language: id
+Fitur: Division
+ Untuk hindari kesalahan konyol
+ Kasir harus dapat menghitung pembagian
+
+ Skenario: bilangan biasa
+ Dengan aku sudah masukkan 3 ke kalkulator
+ Dan aku sudah masukkan 2 ke kalkulator
+ Ketika aku tekan divide
+ Maka hasilnya harus 1.5 di layar
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/id/features/step_definitons/calculator_steps.rb b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/id/features/step_definitons/calculator_steps.rb
new file mode 100755
index 00000000..54c82fc6
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/id/features/step_definitons/calculator_steps.rb
@@ -0,0 +1,24 @@
+# encoding: utf-8
+require 'spec/expectations'
+$:.unshift(File.dirname(__FILE__) + '/../../lib') # This line is not needed in your own project
+require 'cucumber/formatter/unicode'
+require 'calculator'
+
+Before do
+ @calc = Calculator.new
+end
+
+After do
+end
+
+Given /aku sudah masukkan (\d+) ke kalkulator/ do |n|
+ @calc.push n.to_i
+end
+
+When /aku tekan (\w+)/ do |op|
+ @result = @calc.send op
+end
+
+Then /hasilnya harus (.*) di layar/ do |result|
+ @result.should == result.to_f
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/id/lib/calculator.rb b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/id/lib/calculator.rb
new file mode 100755
index 00000000..0598d3e6
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/id/lib/calculator.rb
@@ -0,0 +1,14 @@
+class Calculator
+ def push(n)
+ @args ||= []
+ @args << n
+ end
+
+ def add
+ @args.inject(0){|n,sum| sum+=n}
+ end
+
+ def divide
+ @args[0].to_f / @args[1].to_f
+ end
+end
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/it/Rakefile b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/it/Rakefile
new file mode 100755
index 00000000..6a417570
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/it/Rakefile
@@ -0,0 +1,6 @@
+$:.unshift(File.dirname(__FILE__) + '/../../../lib')
+require 'cucumber/rake/task'
+
+Cucumber::Rake::Task.new do |t|
+ t.cucumber_opts = %w{--format pretty}
+end
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/it/features/somma.feature b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/it/features/somma.feature
new file mode 100755
index 00000000..0f9790b6
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/it/features/somma.feature
@@ -0,0 +1,11 @@
+# language: it
+Funzionalità : somma
+ Per evitare di fare errori stupidi
+ Come utente
+ Voglio sapere la somma di due numeri
+
+ Scenario: la somma di due numeri
+ Dato che ho inserito 5
+ E che ho inserito 7
+ Quando premo somma
+ Allora il risultato deve essere 12
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/it/features/step_definitons/calcolatrice_steps.rb b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/it/features/step_definitons/calcolatrice_steps.rb
new file mode 100755
index 00000000..2e6fec71
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/it/features/step_definitons/calcolatrice_steps.rb
@@ -0,0 +1,24 @@
+# encoding: utf-8
+require 'spec/expectations'
+$:.unshift(File.dirname(__FILE__) + '/../../lib') # This line is not needed in your own project
+require 'cucumber/formatter/unicode'
+require 'calcolatrice'
+
+Before do
+ @calc = Calcolatrice.new
+end
+
+After do
+end
+
+Given /che ho inserito (\d+)/ do |n|
+ @calc.push n.to_i
+end
+
+When 'premo somma' do
+ @result = @calc.add
+end
+
+Then /il risultato deve essere (\d*)/ do |result|
+ @result.should == result.to_i
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/it/lib/calcolatrice.rb b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/it/lib/calcolatrice.rb
new file mode 100755
index 00000000..82d91844
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/it/lib/calcolatrice.rb
@@ -0,0 +1,11 @@
+class Calcolatrice
+ def push(n)
+ @args ||= []
+ @args << n
+ end
+
+ def add
+ #@args[0] + @args[1]
+ @args.inject(0){|n,sum| sum+=n}
+ end
+end
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/ja/.gitignore b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/ja/.gitignore
new file mode 100755
index 00000000..deeedc9b
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/ja/.gitignore
@@ -0,0 +1 @@
+features.html
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/ja/Rakefile b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/ja/Rakefile
new file mode 100755
index 00000000..80a1aec7
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/ja/Rakefile
@@ -0,0 +1,6 @@
+$:.unshift(File.dirname(__FILE__) + '/../../../lib')
+require 'cucumber/rake/task'
+
+Cucumber::Rake::Task.new do |t|
+ t.cucumber_opts = %w{--format pretty}
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/ja/features/addition.feature b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/ja/features/addition.feature
new file mode 100755
index 00000000..04235ce5
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/ja/features/addition.feature
@@ -0,0 +1,17 @@
+# language: ja
+フィーãƒãƒ£: åŠ ç®—
+ ãƒã‚«ãªé–“é•ã„ã‚’é¿ã‘ã‚‹ãŸã‚ã«
+ æ•°å¦ã‚ªãƒ³ãƒã¨ã—ã¦
+ 2ã¤ã®æ•°ã®åˆè¨ˆã‚’知りãŸã„
+
+ シナリオテンプレート: 2ã¤ã®æ•°ã®åŠ ç®—ã«ã¤ã„ã¦
+ å‰æ <値1> を入力
+ ã‹ã¤ <値2> を入力
+ ã‚‚ã— <ボタン> を押ã—ãŸ
+ ãªã‚‰ã° <çµæžœ> を表示
+
+ 例:
+ | 値1 | 値2 | ボタン | çµæžœ |
+ | 20 | 30 | add | 50 |
+ | 2 | 5 | add | 7 |
+ | 0 | 40 | add | 40 |
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/ja/features/division.feature b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/ja/features/division.feature
new file mode 100755
index 00000000..60e31cdc
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/ja/features/division.feature
@@ -0,0 +1,10 @@
+# language: ja
+フィーãƒãƒ£: 除算
+ ãƒã‚«ãªé–“é•ã„ã‚’é¿ã‘ã‚‹ãŸã‚ã«
+ 有ç†æ•°ã‚‚計算ã§ãã‚‹ã“ã¨
+
+ シナリオ: ãµã¤ã†ã®æ•°å€¤
+ å‰æ 3 を入力
+ ã‹ã¤ 2 を入力
+ ã‚‚ã— divide を押ã—ãŸ
+ ãªã‚‰ã° 1.5 を表示
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/ja/features/step_definitons/calculator_steps.rb b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/ja/features/step_definitons/calculator_steps.rb
new file mode 100755
index 00000000..6c312772
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/ja/features/step_definitons/calculator_steps.rb
@@ -0,0 +1,24 @@
+# encoding: UTF-8
+require 'spec/expectations'
+$:.unshift(File.dirname(__FILE__) + '/../../lib') # This line is not needed in your own project
+require 'cucumber/formatter/unicode'
+require 'calculator'
+
+Before do
+ @calc = Calculator.new
+end
+
+After do
+end
+
+Given "$n を入力" do |n|
+ @calc.push n.to_i
+end
+
+When /(\w+) を押ã—ãŸ/ do |op|
+ @result = @calc.send op
+end
+
+Then /(.*) を表示/ do |result|
+ @result.should == result.to_f
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/ja/lib/calculator.rb b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/ja/lib/calculator.rb
new file mode 100755
index 00000000..0598d3e6
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/ja/lib/calculator.rb
@@ -0,0 +1,14 @@
+class Calculator
+ def push(n)
+ @args ||= []
+ @args << n
+ end
+
+ def add
+ @args.inject(0){|n,sum| sum+=n}
+ end
+
+ def divide
+ @args[0].to_f / @args[1].to_f
+ end
+end
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/ko/.gitignore b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/ko/.gitignore
new file mode 100755
index 00000000..deeedc9b
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/ko/.gitignore
@@ -0,0 +1 @@
+features.html
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/ko/Rakefile b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/ko/Rakefile
new file mode 100755
index 00000000..6a417570
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/ko/Rakefile
@@ -0,0 +1,6 @@
+$:.unshift(File.dirname(__FILE__) + '/../../../lib')
+require 'cucumber/rake/task'
+
+Cucumber::Rake::Task.new do |t|
+ t.cucumber_opts = %w{--format pretty}
+end
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/ko/features/addition.feature b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/ko/features/addition.feature
new file mode 100755
index 00000000..befb0e45
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/ko/features/addition.feature
@@ -0,0 +1,17 @@
+# language: ko
+기능: ë§ì…ˆ
+ 예기치못한 ì‹¤ìˆ˜ì„ ë°©ì§€í•˜ê¸° 위해
+ ìˆ˜í•™ì„ ìž˜ 못하는 사람으로ì¨
+ ë‘숫ìžì˜ í•©ì„ ì•Œê³ ì‹¶ë‹¤
+
+ 시나리오 개요: ë‘ ìˆ«ìžë¥¼ ë”하기
+ ì¡°ê±´ ê³„ì‚°ê¸°ì— <ìž…ë ¥1>ì„ ìž…ë ¥í–ˆìŒ
+ ê·¸ë¦¬ê³ ê³„ì‚°ê¸°ì— <ìž…ë ¥2>ì„ ìž…ë ¥í–ˆìŒ
+ ë§Œì¼ ë‚´ê°€ <버튼>를 누르면
+ 그러면 í™”ë©´ì— ì¶œë ¥ëœ ê²°ê³¼ëŠ” <ê²°ê³¼>ì´ë‹¤
+
+ 예:
+ | ìž…ë ¥1 | ìž…ë ¥2 | 버튼 | ê²°ê³¼ |
+ | 20 | 30 | add | 50 |
+ | 2 | 5 | add | 7 |
+ | 0 | 40 | add | 40 |
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/ko/features/division.feature b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/ko/features/division.feature
new file mode 100755
index 00000000..e3967e55
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/ko/features/division.feature
@@ -0,0 +1,11 @@
+# language: ko
+기능: 나눗셈
+ 예기치못한 ì‹¤ìˆ˜ì„ ë°©ì§€í•˜ê¸° 위해
+ 분수를 계산 ëŠ¥ë ¥ 요구한다
+
+ 시나리오: 보통 숫ìž
+ ì¡°ê±´ ê³„ì‚°ê¸°ì— 3ì„ ìž…ë ¥í–ˆìŒ
+ ê·¸ë¦¬ê³ ê³„ì‚°ê¸°ì— 2ì„ ìž…ë ¥í–ˆìŒ
+ ë§Œì¼ ë‚´ê°€ divide를 누르면
+ 그러면 í™”ë©´ì— ì¶œë ¥ëœ ê²°ê³¼ëŠ” 1.5ì´ë‹¤
+
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/ko/features/step_definitons/calculator_steps.rb b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/ko/features/step_definitons/calculator_steps.rb
new file mode 100755
index 00000000..e74f51ed
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/ko/features/step_definitons/calculator_steps.rb
@@ -0,0 +1,24 @@
+# encoding: utf-8
+require 'spec/expectations'
+$:.unshift(File.dirname(__FILE__) + '/../../lib') # This line is not needed in your own project
+require 'cucumber/formatter/unicode'
+require 'calculator'
+
+Before do
+ @calc = Calculator.new
+end
+
+After do
+end
+
+Given /^ê³„ì‚°ê¸°ì— (.*)ì„ ìž…ë ¥í–ˆìŒ$/ do |n|
+ @calc.push n.to_i
+end
+
+When /^내가 (.*)를 누르면$/ do |op|
+ @result = @calc.send op
+end
+
+Then /^í™”ë©´ì— ì¶œë ¥ëœ ê²°ê³¼ëŠ” (.*)ì´ë‹¤$/ do |result|
+ @result.should == result.to_f
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/ko/lib/calculator.rb b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/ko/lib/calculator.rb
new file mode 100755
index 00000000..0598d3e6
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/ko/lib/calculator.rb
@@ -0,0 +1,14 @@
+class Calculator
+ def push(n)
+ @args ||= []
+ @args << n
+ end
+
+ def add
+ @args.inject(0){|n,sum| sum+=n}
+ end
+
+ def divide
+ @args[0].to_f / @args[1].to_f
+ end
+end
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/lt/.gitignore b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/lt/.gitignore
new file mode 100755
index 00000000..deeedc9b
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/lt/.gitignore
@@ -0,0 +1 @@
+features.html
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/lt/Rakefile b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/lt/Rakefile
new file mode 100755
index 00000000..80a1aec7
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/lt/Rakefile
@@ -0,0 +1,6 @@
+$:.unshift(File.dirname(__FILE__) + '/../../../lib')
+require 'cucumber/rake/task'
+
+Cucumber::Rake::Task.new do |t|
+ t.cucumber_opts = %w{--format pretty}
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/lt/features/addition.feature b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/lt/features/addition.feature
new file mode 100755
index 00000000..3e78880c
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/lt/features/addition.feature
@@ -0,0 +1,17 @@
+# language: lt
+SÄ…vybÄ—: SudÄ—tis
+ Norint išvengti kvailų klaidų
+ Kaip matematinis idiotas
+ AÅ¡ noriu, kad man pasakytų dviejų skaiÄių sumÄ…
+
+ Scenarijaus Å¡ablonas: dviejų skaiÄių sudÄ—tis
+ Duota aÅ¡ įvedžiau <įvestis_1> į skaiÄiuotuvÄ…
+ Ir aÅ¡ įvedžiau <įvestis_2> į skaiÄiuotuvÄ…
+ Kai aš paspaudžiu ""
+ Tada rezultatas ekrane turi būti
+
+ Pavyzdžiai
+ | įvestis_1 | įvestis_2 | mygtukas | išvestis |
+ | 20 | 30 | add | 50 |
+ | 2 | 5 | add | 7 |
+ | 0 | 40 | add | 40 |
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/lt/features/division.feature b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/lt/features/division.feature
new file mode 100755
index 00000000..95642802
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/lt/features/division.feature
@@ -0,0 +1,10 @@
+# language: lt
+Feature: Dalyba
+ Norint išvengti klaidų
+ Kasininkai privalo mokÄ—ti skaiÄiuoti trupmenas
+
+ Scenarijus: Realieji skaiÄiai
+ Duota aÅ¡ įvedžiau 3 į skaiÄiuotuvÄ…
+ Ir aÅ¡ įvedžiau 2 į skaiÄiuotuvÄ…
+ Kai aš paspaudžiu "divide"
+ Tada rezultatas ekrane turi būti 1.5
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/lt/features/step_definitons/calculator_steps.rb b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/lt/features/step_definitons/calculator_steps.rb
new file mode 100755
index 00000000..c0b4b9f0
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/lt/features/step_definitons/calculator_steps.rb
@@ -0,0 +1,24 @@
+# encoding: utf-8
+require 'spec/expectations'
+$:.unshift(File.dirname(__FILE__) + '/../../lib') # This line is not needed in your own project
+require 'cucumber/formatter/unicode'
+require 'calculator'
+
+Before do
+ @calc = Calculator.new
+end
+
+After do
+end
+
+Given /aÅ¡ įvedžiau (\d+) į skaiÄiuotuvÄ…/ do |n|
+ @calc.push n.to_i
+end
+
+When /aš paspaudžiu "(\w+)"/ do |op|
+ @result = @calc.send op
+end
+
+Then /rezultatas ekrane turi būti (.*)/ do |result|
+ @result.should == result.to_f
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/lt/lib/calculator.rb b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/lt/lib/calculator.rb
new file mode 100755
index 00000000..e70f6a38
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/lt/lib/calculator.rb
@@ -0,0 +1,14 @@
+class Calculator
+ def push(n)
+ @args ||= []
+ @args << n
+ end
+
+ def add
+ @args.inject(0){|n,sum| sum+=n}
+ end
+
+ def divide
+ @args[0].to_f / @args[1].to_f
+ end
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/lv/Rakefile b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/lv/Rakefile
new file mode 100755
index 00000000..6a417570
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/lv/Rakefile
@@ -0,0 +1,6 @@
+$:.unshift(File.dirname(__FILE__) + '/../../../lib')
+require 'cucumber/rake/task'
+
+Cucumber::Rake::Task.new do |t|
+ t.cucumber_opts = %w{--format pretty}
+end
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/lv/features/addition.feature b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/lv/features/addition.feature
new file mode 100755
index 00000000..24c466bf
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/lv/features/addition.feature
@@ -0,0 +1,17 @@
+# language: lv
+FunkcionalitÄte: SaskaitÄ«Å¡ana
+ Lai izvairÄ«tos no muļķīgÄm kļūdÄm
+ KÄ matemÄtikas idiots
+ Es vÄ“los uzzinÄt divu skaitļu summu
+
+ ScenÄrijs pÄ“c parauga: SaskaitÄ«t divus skaitļus
+ Kad esmu ievadÄ«jis kalkulatorÄ
+ Un esmu ievadÄ«jis kalkulatorÄ
+ Ja nospiežu pogu
+ Tad rezultÄtam uz ekrÄna ir jÄbÅ«t
+
+ Paraugs:
+ | skaitlis_1 | skaitlis_2 | poga | rezultÄts |
+ | 20 | 30 | add | 50 |
+ | 2 | 5 | add | 7 |
+ | 0 | 40 | add | 40 |
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/lv/features/division.feature b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/lv/features/division.feature
new file mode 100755
index 00000000..af66e35f
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/lv/features/division.feature
@@ -0,0 +1,10 @@
+# language: lv
+FunkcionalitÄte: DalÄ«Å¡ana
+ Lai izvairÄ«tos no muļķīgÄm kļūdÄm
+ Kasieriem ir jÄprot aprÄ“Ä·inÄt daļas
+
+ ScenÄrijs: Veseli skaitļi
+ Kad esmu ievadÄ«jis kalkulatorÄ 3
+ Un esmu ievadÄ«jis kalkulatorÄ 2
+ Ja nospiežu pogu divide
+ Tad rezultÄtam uz ekrÄna ir jÄbÅ«t 1.5
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/lv/features/step_definitons/calculator_steps.rb b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/lv/features/step_definitons/calculator_steps.rb
new file mode 100755
index 00000000..e007a1b0
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/lv/features/step_definitons/calculator_steps.rb
@@ -0,0 +1,24 @@
+# encoding: utf-8
+require 'spec/expectations'
+$:.unshift(File.dirname(__FILE__) + '/../../lib') # This line is not needed in your own project
+require 'cucumber/formatter/unicode'
+require 'calculator'
+
+Before do
+ @calc = Calculator.new
+end
+
+After do
+end
+
+Given /esmu ievadÄ«jis kalkulatorÄ (\d+)/ do |n|
+ @calc.push n.to_i
+end
+
+When /nospiežu pogu (\w+)/ do |op|
+ @result = @calc.send op
+end
+
+Then /rezultÄtam uz ekrÄna ir jÄbÅ«t (.*)/ do |result|
+ @result.should == result.to_f
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/lv/lib/calculator.rb b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/lv/lib/calculator.rb
new file mode 100755
index 00000000..0598d3e6
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/lv/lib/calculator.rb
@@ -0,0 +1,14 @@
+class Calculator
+ def push(n)
+ @args ||= []
+ @args << n
+ end
+
+ def add
+ @args.inject(0){|n,sum| sum+=n}
+ end
+
+ def divide
+ @args[0].to_f / @args[1].to_f
+ end
+end
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/no/Rakefile b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/no/Rakefile
new file mode 100755
index 00000000..6a417570
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/no/Rakefile
@@ -0,0 +1,6 @@
+$:.unshift(File.dirname(__FILE__) + '/../../../lib')
+require 'cucumber/rake/task'
+
+Cucumber::Rake::Task.new do |t|
+ t.cucumber_opts = %w{--format pretty}
+end
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/no/features/step_definitons/kalkulator_steps.rb b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/no/features/step_definitons/kalkulator_steps.rb
new file mode 100755
index 00000000..30ae6f81
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/no/features/step_definitons/kalkulator_steps.rb
@@ -0,0 +1,17 @@
+# encoding: utf-8
+
+Before do
+ @calc = Kalkulator.new
+end
+
+Given /at jeg har tastet inn (\d+)/ do |n|
+ @calc.push n.to_i
+end
+
+NÃ¥r 'jeg summerer' do
+ @result = @calc.add
+end
+
+Så /skal resultatet være (\d*)/ do |result|
+ @result.should == result.to_i
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/no/features/summering.feature b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/no/features/summering.feature
new file mode 100755
index 00000000..e1e89f9e
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/no/features/summering.feature
@@ -0,0 +1,19 @@
+# language: no
+Egenskap: Summering
+ For å slippe å gjøre dumme feil
+ Som en regnskapsfører
+ Vil jeg kunne legge sammen
+
+ Scenario: to tall
+ Gitt at jeg har tastet inn 5
+ Og at jeg har tastet inn 7
+ NÃ¥r jeg summerer
+ Så skal resultatet være 12
+
+ @iterasjon3
+ Scenario: tre tall
+ Gitt at jeg har tastet inn 5
+ Og at jeg har tastet inn 7
+ Og at jeg har tastet inn 1
+ NÃ¥r jeg summerer
+ Så skal resultatet være 13
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/no/features/support/env.rb b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/no/features/support/env.rb
new file mode 100755
index 00000000..f952b464
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/no/features/support/env.rb
@@ -0,0 +1,6 @@
+# encoding: utf-8
+$KCODE='u' unless Cucumber::RUBY_1_9
+require 'spec/expectations'
+$:.unshift(File.dirname(__FILE__) + '/../../lib') # This line is not needed in your own project
+require 'cucumber/formatter/unicode'
+require 'kalkulator'
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/no/lib/kalkulator.rb b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/no/lib/kalkulator.rb
new file mode 100755
index 00000000..081bf1c5
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/no/lib/kalkulator.rb
@@ -0,0 +1,11 @@
+class Kalkulator
+ def push(n)
+ @args ||= []
+ @args << n
+ end
+
+ def add
+ #@args[0] + @args[1]
+ @args.inject(0){|n,sum| sum+=n}
+ end
+end
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/pl/.gitignore b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/pl/.gitignore
new file mode 100755
index 00000000..deeedc9b
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/pl/.gitignore
@@ -0,0 +1 @@
+features.html
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/pl/Rakefile b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/pl/Rakefile
new file mode 100755
index 00000000..80a1aec7
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/pl/Rakefile
@@ -0,0 +1,6 @@
+$:.unshift(File.dirname(__FILE__) + '/../../../lib')
+require 'cucumber/rake/task'
+
+Cucumber::Rake::Task.new do |t|
+ t.cucumber_opts = %w{--format pretty}
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/pl/features/addition.feature b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/pl/features/addition.feature
new file mode 100755
index 00000000..97814660
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/pl/features/addition.feature
@@ -0,0 +1,17 @@
+# language: pl
+Właściwość: Dodawanie
+ W celu uniknięcia głupich błędów
+ Jako matematyczny idiota
+ Chcę sprawdzić wartość sumy dwóch liczb
+
+ Szablon scenariusza: Dodaj dwie liczby
+ Zakładając wprowadzenie do kalkulatora liczby
+ Oraz wprowadzenie do kalkulatora liczby
+ Jeżeli nacisnę
+ Wtedy rezultat wyświetli się na ekranie
+
+ Przykłady:
+ | liczba_1 | liczba_2 | przycisk | wynik |
+ | 20 | 30 | dodaj | 50 |
+ | 2 | 5 | dodaj | 7 |
+ | 0 | 40 | dodaj | 40 |
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/pl/features/division.feature b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/pl/features/division.feature
new file mode 100755
index 00000000..2cd5305b
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/pl/features/division.feature
@@ -0,0 +1,10 @@
+# language: pl
+Właściwość: Dzielenie
+ W celu uniknięcia głupich błędów
+ Kasjer musi znać się na ułamkach
+
+ Scenariusz: Zwykłe liczby
+ Zakładając wprowadzenie do kalkulatora liczby 3
+ Oraz wprowadzenie do kalkulatora liczby 2
+ Jeżeli nacisnę podziel
+ Wtedy rezultat 1.5 wyświetli się na ekranie
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/pl/features/step_definitons/calculator_steps.rb b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/pl/features/step_definitons/calculator_steps.rb
new file mode 100755
index 00000000..fef68160
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/pl/features/step_definitons/calculator_steps.rb
@@ -0,0 +1,24 @@
+# encoding: utf-8
+require 'spec/expectations'
+$:.unshift(File.dirname(__FILE__) + '/../../lib') # This line is not needed in your own project
+require 'cucumber/formatter/unicode'
+require 'calculator'
+
+Before do
+ @calc = Calculator.new
+end
+
+After do
+end
+
+Zakładając /wprowadzenie do kalkulatora liczby (\d+)/ do |n|
+ @calc.push n.to_i
+end
+
+Jeżeli /nacisnę (\w+)/ do |op|
+ @result = @calc.send op
+end
+
+Wtedy /rezultat (.*) wyświetli się na ekranie/ do |result|
+ @result.should == result.to_f
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/pl/features/support/env.rb b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/pl/features/support/env.rb
new file mode 100755
index 00000000..c6962408
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/pl/features/support/env.rb
@@ -0,0 +1,6 @@
+# encoding: utf-8
+require 'spec/expectations'
+$:.unshift(File.dirname(__FILE__) + '/../../lib')
+require 'cucumber/formatter/unicode'
+require 'calculator'
+$KCODE='u' unless Cucumber::RUBY_1_9
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/pl/lib/calculator.rb b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/pl/lib/calculator.rb
new file mode 100755
index 00000000..2a3b2b5a
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/pl/lib/calculator.rb
@@ -0,0 +1,14 @@
+class Calculator
+ def push(n)
+ @args ||= []
+ @args << n
+ end
+
+ def dodaj
+ @args.inject(0){|n,sum| sum+=n}
+ end
+
+ def podziel
+ @args[0].to_f / @args[1].to_f
+ end
+end
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/pt/Rakefile b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/pt/Rakefile
new file mode 100755
index 00000000..6a417570
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/pt/Rakefile
@@ -0,0 +1,6 @@
+$:.unshift(File.dirname(__FILE__) + '/../../../lib')
+require 'cucumber/rake/task'
+
+Cucumber::Rake::Task.new do |t|
+ t.cucumber_opts = %w{--format pretty}
+end
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/pt/features/adicao.feature b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/pt/features/adicao.feature
new file mode 100755
index 00000000..69ae88d1
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/pt/features/adicao.feature
@@ -0,0 +1,11 @@
+# language: pt
+Funcionalidade: Adição
+ Para evitar erros bobos
+ Como um péssimo matemático
+ Eu quero saber como somar dois números
+
+ Cenário: Adicionar dois números
+ Dado que eu digitei 50 na calculadora
+ E que eu digitei 70 na calculadora
+ Quando eu aperto o botão de soma
+ Então o resultado na calculadora deve ser 120
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/pt/features/step_definitions/calculadora_steps.rb b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/pt/features/step_definitions/calculadora_steps.rb
new file mode 100755
index 00000000..c0521af5
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/pt/features/step_definitions/calculadora_steps.rb
@@ -0,0 +1,20 @@
+# encoding: utf-8
+
+Before do
+ @calc = Calculadora.new
+end
+
+After do
+end
+
+Dado /que eu digitei (\d+) na calculadora/ do |n|
+ @calc.push n.to_i
+end
+
+Quando 'eu aperto o botão de soma' do
+ @result = @calc.soma
+end
+
+Então /o resultado na calculadora deve ser (\d*)/ do |result|
+ @result.should == result.to_i
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/pt/features/support/env.rb b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/pt/features/support/env.rb
new file mode 100755
index 00000000..e2c63af1
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/pt/features/support/env.rb
@@ -0,0 +1,6 @@
+# encoding: utf-8
+$KCODE='u' unless Cucumber::RUBY_1_9
+require 'spec/expectations'
+$:.unshift(File.dirname(__FILE__) + '/../../lib') # This line is not needed in your own project
+require 'cucumber/formatter/unicode'
+require 'calculadora'
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/pt/lib/calculadora.rb b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/pt/lib/calculadora.rb
new file mode 100755
index 00000000..037f7de9
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/pt/lib/calculadora.rb
@@ -0,0 +1,10 @@
+class Calculadora
+ def push(n)
+ @args ||= []
+ @args << n
+ end
+
+ def soma
+ @args.inject(0) {|n,sum| sum+n}
+ end
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/ro/Rakefile b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/ro/Rakefile
new file mode 100755
index 00000000..80a1aec7
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/ro/Rakefile
@@ -0,0 +1,6 @@
+$:.unshift(File.dirname(__FILE__) + '/../../../lib')
+require 'cucumber/rake/task'
+
+Cucumber::Rake::Task.new do |t|
+ t.cucumber_opts = %w{--format pretty}
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/ro/features/step_definitons/calculator_steps.rb b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/ro/features/step_definitons/calculator_steps.rb
new file mode 100755
index 00000000..eb62994c
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/ro/features/step_definitons/calculator_steps.rb
@@ -0,0 +1,24 @@
+# encoding: utf-8
+require 'spec/expectations'
+$:.unshift(File.dirname(__FILE__) + '/../../lib') # This line is not needed in your own project
+require 'cucumber/formatter/unicode'
+require 'calculator'
+
+Before do
+ @calc = Calculator.new
+end
+
+After do
+end
+
+Given /introduc (\d+)/ do |n|
+ @calc.push n.to_i
+end
+
+When 'apas suma' do
+ @result = @calc.add
+end
+
+Then /rezultatul trebuie sa fie (\d*)/ do |result|
+ @result.should == result.to_i
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/ro/features/suma.feature b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/ro/features/suma.feature
new file mode 100755
index 00000000..77d7e119
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/ro/features/suma.feature
@@ -0,0 +1,11 @@
+# language: ro
+Functionalitate: suma
+ Pentru a nu face erori stupide
+ Ca utilizator
+ Vreau sa stiu suma a doua numere
+
+ Scenariu: suma a doua numere
+ Daca introduc 5
+ Si apoi introduc 7
+ Cand apas suma
+ Atunci rezultatul trebuie sa fie 12
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/ro/lib/calculator.rb b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/ro/lib/calculator.rb
new file mode 100755
index 00000000..cc6ce0e9
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/ro/lib/calculator.rb
@@ -0,0 +1,11 @@
+class Calculator
+ def push(n)
+ @args ||= []
+ @args << n
+ end
+
+ def add
+ #@args[0] + @args[1]
+ @args.inject(0){|n,sum| sum+=n}
+ end
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/ru/Rakefile b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/ru/Rakefile
new file mode 100755
index 00000000..6a417570
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/ru/Rakefile
@@ -0,0 +1,6 @@
+$:.unshift(File.dirname(__FILE__) + '/../../../lib')
+require 'cucumber/rake/task'
+
+Cucumber::Rake::Task.new do |t|
+ t.cucumber_opts = %w{--format pretty}
+end
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/ru/features/addition.feature b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/ru/features/addition.feature
new file mode 100755
index 00000000..eda57222
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/ru/features/addition.feature
@@ -0,0 +1,11 @@
+# language: ru
+Функционал: Сложение чиÑел
+ Чтобы не Ñкладывать в уме
+ Ð’Ñе, у кого Ñ Ñтим туго
+ ХотÑÑ‚ автоматичеÑкое Ñложение целых чиÑел
+
+ Сценарий: Сложение двух целых чиÑел
+ ДопуÑтим Ñ Ð²Ð²Ð¾Ð¶Ñƒ чиÑло 50
+ И затем ввожу чиÑло 70
+ ЕÑли Ñ Ð½Ð°Ð¶Ð¸Ð¼Ð°ÑŽ "+"
+ То результатом должно быть чиÑло 120
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/ru/features/consecutive_calculations.feature b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/ru/features/consecutive_calculations.feature
new file mode 100755
index 00000000..87cc7f2e
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/ru/features/consecutive_calculations.feature
@@ -0,0 +1,17 @@
+# language: ru
+Функционал: ПоÑледовательные вычиÑлениÑ
+ Чтобы вычиÑлÑÑ‚ÑŒ Ñложные выражениÑ
+ Пользователи хотÑÑ‚ проводить вычиÑÐ»ÐµÐ½Ð¸Ñ Ð½Ð°Ð´ результатом предыдущей операций
+
+ ПредыÑториÑ:
+ ДопуÑтим Ñ Ñложил 3 и 5
+
+ Сценарий: Ñложение Ñ Ñ€ÐµÐ·ÑƒÐ»ÑŒÑ‚Ð°Ñ‚Ð¾Ð¼ поÑледней операций
+ ЕÑли Ñ Ð²Ð²Ð¾Ð¶Ñƒ чиÑло 4
+ И нажимаю "+"
+ То результатом должно быть чиÑло 12
+
+ Сценарий: деление результата поÑледней операции
+ ЕÑли Ñ Ð²Ð²Ð¾Ð¶Ñƒ чиÑло 2
+ И нажимаю "/"
+ То результатом должно быть чиÑло 4
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/ru/features/division.feature b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/ru/features/division.feature
new file mode 100755
index 00000000..7f024f6b
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/ru/features/division.feature
@@ -0,0 +1,16 @@
+# language: ru
+Функционал: Деление чиÑел
+ ПоÑкольку деление Ñложный процеÑÑ Ð¸ люди чаÑто допуÑкают ошибки
+ Ðужно дать им возможноÑÑ‚ÑŒ делить на калькулÑторе
+
+ Структура ÑценариÑ: ЦелочиÑленное деление
+ ДопуÑтим Ñ Ð²Ð²Ð¾Ð¶Ñƒ чиÑло <делимое>
+ И затем ввожу чиÑло <делитель>
+ ЕÑли Ñ Ð½Ð°Ð¶Ð¸Ð¼Ð°ÑŽ "/"
+ То результатом должно быть чиÑло <чаÑтное>
+
+ ЗначениÑ:
+ | делимое | делитель | чаÑтное |
+ | 100 | 2 | 50 |
+ | 28 | 7 | 4 |
+ | 0 | 5 | 0 |
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/ru/features/step_definitons/calculator_steps.rb b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/ru/features/step_definitons/calculator_steps.rb
new file mode 100755
index 00000000..fee7a47c
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/ru/features/step_definitons/calculator_steps.rb
@@ -0,0 +1,19 @@
+# encoding: utf-8
+
+ДопуÑтим /ввожу чиÑло (\d+)/ do |чиÑло|
+ calc.push чиÑло.to_i
+end
+
+ЕÑли /нажимаю "(.*)"/ do |операциÑ|
+ calc.send операциÑ
+end
+
+То /результатом должно быть чиÑло (\d+)/ do |результат|
+ calc.result.should == результат.to_f
+end
+
+ДопуÑтим /Ñ Ñложил (\d+) и (\d+)/ do |Ñлагаемое1, Ñлагаемое2|
+ ДопуÑтим %{Ñ Ð²Ð²Ð¾Ð¶Ñƒ чиÑло #{Ñлагаемое1}}
+ ДопуÑтим %{затем ввожу чиÑло #{Ñлагаемое2}}
+ ДопуÑтим %{Ñ Ð½Ð°Ð¶Ð¸Ð¼Ð°ÑŽ "+"}
+end
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/ru/features/support/env.rb b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/ru/features/support/env.rb
new file mode 100755
index 00000000..c6962408
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/ru/features/support/env.rb
@@ -0,0 +1,6 @@
+# encoding: utf-8
+require 'spec/expectations'
+$:.unshift(File.dirname(__FILE__) + '/../../lib')
+require 'cucumber/formatter/unicode'
+require 'calculator'
+$KCODE='u' unless Cucumber::RUBY_1_9
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/ru/features/support/world.rb b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/ru/features/support/world.rb
new file mode 100755
index 00000000..78d95d9b
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/ru/features/support/world.rb
@@ -0,0 +1,8 @@
+# encoding: utf-8
+module LazyCalc
+ def calc
+ @calc ||= Calculator.new
+ end
+end
+
+World(LazyCalc)
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/ru/lib/calculator.rb b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/ru/lib/calculator.rb
new file mode 100755
index 00000000..0b975edd
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/ru/lib/calculator.rb
@@ -0,0 +1,24 @@
+# encoding: utf-8
+
+class Calculator
+ def initialize
+ @stack = []
+ end
+
+ def push(arg)
+ @stack.push arg
+ end
+
+ def result
+ @stack.last
+ end
+
+ def +
+ @stack.push @stack.pop + @stack.pop
+ end
+
+ def /
+ divisor, dividend = [@stack.pop, @stack.pop] # Hm, @stack.pop(2) doesn't work
+ @stack.push dividend / divisor
+ end
+end
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/se/Rakefile b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/se/Rakefile
new file mode 100755
index 00000000..6a417570
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/se/Rakefile
@@ -0,0 +1,6 @@
+$:.unshift(File.dirname(__FILE__) + '/../../../lib')
+require 'cucumber/rake/task'
+
+Cucumber::Rake::Task.new do |t|
+ t.cucumber_opts = %w{--format pretty}
+end
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/se/features/step_definitons/kalkulator_steps.rb b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/se/features/step_definitons/kalkulator_steps.rb
new file mode 100755
index 00000000..7f0d749c
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/se/features/step_definitons/kalkulator_steps.rb
@@ -0,0 +1,24 @@
+# encoding: utf-8
+require 'spec/expectations'
+$:.unshift(File.dirname(__FILE__) + '/../../lib') # This line is not needed in your own project
+require 'cucumber/formatter/unicode'
+require 'kalkulator'
+
+Before do
+ @calc = Kalkulator.new
+end
+
+After do
+end
+
+Given /att jag har knappat in (\d+)/ do |n|
+ @calc.push n.to_i
+end
+
+When 'jag summerar' do
+ @result = @calc.add
+end
+
+Then /ska resultatet vara (\d+)/ do |result|
+ @result.should == result.to_i
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/se/features/summering.feature b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/se/features/summering.feature
new file mode 100755
index 00000000..e6fb7797
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/se/features/summering.feature
@@ -0,0 +1,18 @@
+# language: se
+Egenskap: Summering
+ För att slippa att göra dumma fel
+ Som räknare
+ Vill jag kunna lägga samman
+
+ Scenario: två tal
+ Givet att jag har knappat in 5
+ Och att jag har knappat in 7
+ När jag summerar
+ SÃ¥ ska resultatet vara 12
+
+ Scenario: tre tal
+ Givet att jag har knappat in 5
+ Och att jag har knappat in 4
+ Och att jag har knappat in 3
+ När jag summerar
+ SÃ¥ ska resultatet vara 12
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/se/lib/kalkulator.rb b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/se/lib/kalkulator.rb
new file mode 100755
index 00000000..081bf1c5
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/se/lib/kalkulator.rb
@@ -0,0 +1,11 @@
+class Kalkulator
+ def push(n)
+ @args ||= []
+ @args << n
+ end
+
+ def add
+ #@args[0] + @args[1]
+ @args.inject(0){|n,sum| sum+=n}
+ end
+end
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/sk/.gitignore b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/sk/.gitignore
new file mode 100755
index 00000000..deeedc9b
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/sk/.gitignore
@@ -0,0 +1 @@
+features.html
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/sk/Rakefile b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/sk/Rakefile
new file mode 100755
index 00000000..6a417570
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/sk/Rakefile
@@ -0,0 +1,6 @@
+$:.unshift(File.dirname(__FILE__) + '/../../../lib')
+require 'cucumber/rake/task'
+
+Cucumber::Rake::Task.new do |t|
+ t.cucumber_opts = %w{--format pretty}
+end
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/sk/features/addition.feature b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/sk/features/addition.feature
new file mode 100755
index 00000000..88c02c03
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/sk/features/addition.feature
@@ -0,0 +1,17 @@
+# language: sk
+Požiadavka: SÄÃtavanie
+ Aby som sa vyhol hlúpym chybám
+ Ako matematický idiot
+ Chcem vedieÅ¥ ako sa sÄÃtavajú dve ÄÃsla
+
+ NáÄrt Scenáru: SÄÃtanie dvoch ÄÃsel
+ Pokiaľ Zadám ÄÃslo do kalkulaÄky
+ A Zadám ÄÃslo do kalkulaÄky
+ KeÄ StlaÄÃm tlaÄidlo
+ Tak Výsledok by mal byť
+
+ PrÃklady:
+ | vstup_1 | vstup_2 | tlaÄidlo | výstup |
+ | 20 | 30 | add | 50 |
+ | 2 | 5 | add | 7 |
+ | 0 | 40 | add | 40 |
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/sk/features/division.feature b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/sk/features/division.feature
new file mode 100755
index 00000000..745f7642
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/sk/features/division.feature
@@ -0,0 +1,10 @@
+# language: sk
+Požiadavka: Delenie
+ Aby som sa vyhol hlúpym chybám
+ PokladnÃci musia vedieÅ¥ vypoÄÃtaÅ¥ podiel
+
+ Scenár: Prirodzené ÄÃsla
+ Pokiaľ Zadám ÄÃslo 3 do kalkulaÄky
+ A Zadám ÄÃslo 2 do kalkulaÄky
+ KeÄ StlaÄÃm tlaÄidlo divide
+ Tak Výsledok by mal byť 1.5
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/sk/features/step_definitons/calculator_steps.rb b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/sk/features/step_definitons/calculator_steps.rb
new file mode 100755
index 00000000..9df249b8
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/sk/features/step_definitons/calculator_steps.rb
@@ -0,0 +1,24 @@
+# encoding: utf-8
+require 'spec/expectations'
+$:.unshift(File.dirname(__FILE__) + '/../../lib') # This line is not needed in your own project
+require 'cucumber/formatter/unicode'
+require 'calculator'
+
+Before do
+ @calc = Calculator.new
+end
+
+After do
+end
+
+Given /Zadám ÄÃslo (\d+) do kalkulaÄky/ do |n|
+ @calc.push n.to_i
+end
+
+When /StlaÄÃm tlaÄidlo (\w+)/ do |op|
+ @result = @calc.send op
+end
+
+Then /Výsledok by mal byť (.*)/ do |result|
+ @result.should == result.to_f
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/sk/lib/calculator.rb b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/sk/lib/calculator.rb
new file mode 100755
index 00000000..0598d3e6
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/sk/lib/calculator.rb
@@ -0,0 +1,14 @@
+class Calculator
+ def push(n)
+ @args ||= []
+ @args << n
+ end
+
+ def add
+ @args.inject(0){|n,sum| sum+=n}
+ end
+
+ def divide
+ @args[0].to_f / @args[1].to_f
+ end
+end
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/sr-latn/Rakefile b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/sr-latn/Rakefile
new file mode 100755
index 00000000..6a417570
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/sr-latn/Rakefile
@@ -0,0 +1,6 @@
+$:.unshift(File.dirname(__FILE__) + '/../../../lib')
+require 'cucumber/rake/task'
+
+Cucumber::Rake::Task.new do |t|
+ t.cucumber_opts = %w{--format pretty}
+end
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/sr-latn/features/sabiranje.feature b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/sr-latn/features/sabiranje.feature
new file mode 100755
index 00000000..c9991256
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/sr-latn/features/sabiranje.feature
@@ -0,0 +1,18 @@
+# language: sr-Latn
+Funkcionalnost: Sabiranje
+ Da bih izbegao smešne greske
+ Kao matematiÄka neznalica
+ Želim da mogu da izraÄunam zbir dva broja
+
+ Struktura scenarija: Dodaj dva broja
+ Zadato Unesen broj u kalkulator
+ I Unesen broj u kalkulator
+ Kada pritisnem
+ Onda bi trebalo da bude prikazano na ekranu
+
+ Primeri:
+ | input_1 | input_2 | button | output |
+ | 20 | 30 | add | 50 |
+ | 25 | 45 | add | 70 |
+ | 7 | 77 | add | 84 |
+ | 11 | 12 | add | 23 |
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/sr-latn/features/step_definitons/calculator_steps.rb b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/sr-latn/features/step_definitons/calculator_steps.rb
new file mode 100755
index 00000000..d86f3a14
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/sr-latn/features/step_definitons/calculator_steps.rb
@@ -0,0 +1,24 @@
+# encoding: utf-8
+# require 'spec/expectations'
+$:.unshift(File.dirname(__FILE__) + '/../../lib') # This line is not needed in your own project
+require 'cucumber/formatter/unicode'
+require 'calculator'
+
+Before do
+ @calc = Calculator.new
+end
+
+After do
+end
+
+Zadato /Unesen (\d+) broj u kalkulator/ do |n|
+ @calc.push n.to_i
+end
+
+Kada /pritisnem (\w+)/ do |op|
+ @result = @calc.send op
+end
+
+Onda /bi trebalo da bude (.*) prikazano na ekranu/ do |result|
+ @result.to_f == result.to_f
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/sr-latn/lib/calculator.rb b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/sr-latn/lib/calculator.rb
new file mode 100755
index 00000000..4a43d451
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/sr-latn/lib/calculator.rb
@@ -0,0 +1,12 @@
+class Calculator
+
+ def push(n)
+ @args ||= []
+ @args << n
+ end
+
+ def add
+ @args.inject(0){|n,sum| sum+=n}
+ end
+
+end
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/sr/Rakefile b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/sr/Rakefile
new file mode 100755
index 00000000..6a417570
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/sr/Rakefile
@@ -0,0 +1,6 @@
+$:.unshift(File.dirname(__FILE__) + '/../../../lib')
+require 'cucumber/rake/task'
+
+Cucumber::Rake::Task.new do |t|
+ t.cucumber_opts = %w{--format pretty}
+end
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/sr/features/sabiranje.feature b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/sr/features/sabiranje.feature
new file mode 100755
index 00000000..0a3c923b
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/sr/features/sabiranje.feature
@@ -0,0 +1,18 @@
+# language: sr
+ФункционалноÑÑ‚: Сабиранје
+ Да бих избегао Ñмешне грешке
+ Као математичка незналица
+ Желим да могу да израчунам збир два броја
+
+ Концепт: Додај два броја
+ Задати унеÑен број у калкулатор
+ И унеÑен број у калкулатор
+ Када притиÑнем
+ Онда би требало да буде прикаѕано на екрану
+
+ Примери:
+ | input_1 | input_2 | button | output |
+ | 20 | 30 | add | 50 |
+ | 25 | 45 | add | 70 |
+ | 7 | 77 | add | 84 |
+ | 11 | 12 | add | 23 |
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/sr/features/step_definitons/calculator_steps.rb b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/sr/features/step_definitons/calculator_steps.rb
new file mode 100755
index 00000000..c5e8a214
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/sr/features/step_definitons/calculator_steps.rb
@@ -0,0 +1,24 @@
+# encoding: utf-8
+# require 'spec/expectations'
+$:.unshift(File.dirname(__FILE__) + '/../../lib') # This line is not needed in your own project
+require 'cucumber/formatter/unicode'
+require 'calculator'
+
+Before do
+ @calc = Calculator.new
+end
+
+After do
+end
+
+Задати /унеÑен број (\d+) у калкулатор/ do |n|
+ @calc.push n.to_i
+end
+
+Када /притиÑнем (\w+)/ do |op|
+ @result = @calc.send op
+end
+
+Онда /би требало да буде (.*) прикаѕано на екрану/ do |result|
+ @result.to_f == result.to_f
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/sr/lib/calculator.rb b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/sr/lib/calculator.rb
new file mode 100755
index 00000000..4a43d451
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/sr/lib/calculator.rb
@@ -0,0 +1,12 @@
+class Calculator
+
+ def push(n)
+ @args ||= []
+ @args << n
+ end
+
+ def add
+ @args.inject(0){|n,sum| sum+=n}
+ end
+
+end
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/tr/.gitignore b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/tr/.gitignore
new file mode 100755
index 00000000..deeedc9b
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/tr/.gitignore
@@ -0,0 +1 @@
+features.html
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/tr/Rakefile b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/tr/Rakefile
new file mode 100755
index 00000000..6a417570
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/tr/Rakefile
@@ -0,0 +1,6 @@
+$:.unshift(File.dirname(__FILE__) + '/../../../lib')
+require 'cucumber/rake/task'
+
+Cucumber::Rake::Task.new do |t|
+ t.cucumber_opts = %w{--format pretty}
+end
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/tr/features/bolme.feature b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/tr/features/bolme.feature
new file mode 100755
index 00000000..df631cac
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/tr/features/bolme.feature
@@ -0,0 +1,10 @@
+# language: tr
+Özellik: Bölme
+ Gülünç hatalardan sakınmak için
+ Bir kasiyer sayıları bölebilmeli
+
+ Senaryo: Doğal sayılar
+ Diyelim ki hesap makinesine 3 girdim
+ Ve hesap makinesine 2 girdim
+ Eğer ki böl tuşuna basarsam
+ O zaman ekrandaki sonuç 1.5 olmalı
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/tr/features/step_definitons/hesap_makinesi_adimlari.rb b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/tr/features/step_definitons/hesap_makinesi_adimlari.rb
new file mode 100755
index 00000000..4c3573bb
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/tr/features/step_definitons/hesap_makinesi_adimlari.rb
@@ -0,0 +1,24 @@
+# encoding: utf-8
+require 'spec/expectations'
+$:.unshift(File.dirname(__FILE__) + '/../../lib') # This line is not needed in your own project
+require 'cucumber/formatter/unicode'
+require 'hesap_makinesi'
+
+Before do
+ @calc = HesapMakinesi.new
+end
+
+After do
+end
+
+Given /hesap makinesine (\d+) girdim/ do |n|
+ @calc.push n.to_i
+end
+
+When /(\w+) tuÅŸuna basarsam/ do |op|
+ @result = @calc.send op
+end
+
+Then /ekrandaki sonuç (.*) olmalı/ do |result|
+ @result.should == result.to_f
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/tr/features/toplama.feature b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/tr/features/toplama.feature
new file mode 100755
index 00000000..b93a95fe
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/tr/features/toplama.feature
@@ -0,0 +1,18 @@
+# language: tr
+Özellik: Toplama
+ Gülünç hatalardan sakınmak için
+ Matematikten anlamayan bir ahmak olarak
+ Hesap makinasının bana iki sayının toplamını bulmasını istiyorum
+
+ Senaryo taslağı: İki sayıyı topla
+ Diyelim ki hesap makinesine girdim
+ Ve hesap makinesine girdim
+ EÄŸer ki tuÅŸuna basarsam
+ O zaman ekrandaki sonuç <çıktı> olmalı
+
+ Örnekler:
+ | girdi_1 | girdi_2 | düğme | çıktı |
+ | 20 | 30 | topla | 50 |
+ | 2 | 5 | topla | 7 |
+ | 0 | 40 | topla | 40 |
+
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/tr/lib/hesap_makinesi.rb b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/tr/lib/hesap_makinesi.rb
new file mode 100755
index 00000000..5e1359cd
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/tr/lib/hesap_makinesi.rb
@@ -0,0 +1,15 @@
+# encoding: utf-8
+class HesapMakinesi
+ def push(n)
+ @args ||= []
+ @args << n
+ end
+
+ def topla
+ @args.inject(0){|n,sum| sum+=n}
+ end
+
+ def böl
+ @args[0].to_f / @args[1].to_f
+ end
+end
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/uz/Rakefile b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/uz/Rakefile
new file mode 100755
index 00000000..6a417570
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/uz/Rakefile
@@ -0,0 +1,6 @@
+$:.unshift(File.dirname(__FILE__) + '/../../../lib')
+require 'cucumber/rake/task'
+
+Cucumber::Rake::Task.new do |t|
+ t.cucumber_opts = %w{--format pretty}
+end
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/uz/features/addition.feature b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/uz/features/addition.feature
new file mode 100755
index 00000000..af602836
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/uz/features/addition.feature
@@ -0,0 +1,10 @@
+# language: uz
+Функционал: Сонларни кушиш
+ Хаелда кушмаÑлик учун
+ Купчилик Ñонларни атомат равищда кушишни иÑтайди
+
+ Сценарий: Икки бутун Ñонни кушиш
+ Ðгар 50 Ñонини киритÑам
+ Ва ундан Ñунг 70 Ñонини киритÑам
+ Ðгар "+" боÑÑам
+ Унда жавоб 120 Ñони булиши керак
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/uz/features/consecutive_calculations.feature b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/uz/features/consecutive_calculations.feature
new file mode 100755
index 00000000..ac3ed40c
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/uz/features/consecutive_calculations.feature
@@ -0,0 +1,17 @@
+# language: uz
+Функционал: Кетма кет хиÑобот
+ Мураккаб амалларни хиÑоблаш учун
+ Ишлатувчилар олдинги жавоблар уÑтидан амаллар бажармокчилардыдущей операций
+
+ Тарих:
+ Ðгар 3 ва 5 Ñонини кушÑам
+
+ Сценарий: охирги жавоб билан кушиш амали
+ Ðгар 4 Ñонини киритÑам
+ Ва "+"ни боÑÑам
+ Унда жавоб 12 Ñони булиши керак
+
+ Сценарий: охирги жавобни булиш
+ Ðгар 2 Ñонини киритÑам
+ Ва "/"ни боÑÑам
+ Унда жавоб 4 Ñони булиши керак
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/uz/features/division.feature b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/uz/features/division.feature
new file mode 100755
index 00000000..0b20a74f
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/uz/features/division.feature
@@ -0,0 +1,17 @@
+# language: uz
+Функционал: Сонларни булиш
+ Булиш кийин амал булганлиги Ñабабли
+ Одамларга бу амални калькулÑторда килишни имконини бериш керак
+
+ Сценарий ÑтруктураÑи: Бутун Ñонли булиш
+ Ðгар ман <булинувчи> Ñонини киритÑам
+ Ва унда Ñунг <булувчи> Ñонини киритÑам
+ Ðгар "/"ни боÑÑам
+ Унда жавоб <булинма> Ñони булиши керак
+
+ МиÑоллар:
+ | булинувчи | булувчи | булинма |
+ | 100 | 2 | 50 |
+ | 28 | 7 | 4 |
+ | 0 | 5 | 0 |
+
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/uz/features/step_definitons/calculator_steps.rb b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/uz/features/step_definitons/calculator_steps.rb
new file mode 100755
index 00000000..433e315f
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/uz/features/step_definitons/calculator_steps.rb
@@ -0,0 +1,19 @@
+# encoding: utf-8
+
+Ðгар /(\d+) Ñонини киритÑам/ do |Ñон|
+ calc.push Ñон.to_i
+end
+
+Ва /"(.*)"(.*) боÑÑам/ do |операциÑ, _|
+ calc.send операциÑ
+end
+
+Унда /жавоб (\d+) Ñони булиши керак/ do |жавоб|
+ calc.result.should == жавоб.to_f
+end
+
+Ðгар /(\d+) ва (\d+) Ñонини кушÑам/ do |кушилувчи1, кушилувчи2|
+ Ðгар %{#{кушилувчи1} Ñонини киритÑам}
+ Ðгар %{ундан Ñунг #{кушилувчи2} Ñонини киритÑам}
+ Ðгар %{"+"ни боÑÑам}
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/uz/features/support/env.rb b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/uz/features/support/env.rb
new file mode 100755
index 00000000..c6962408
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/uz/features/support/env.rb
@@ -0,0 +1,6 @@
+# encoding: utf-8
+require 'spec/expectations'
+$:.unshift(File.dirname(__FILE__) + '/../../lib')
+require 'cucumber/formatter/unicode'
+require 'calculator'
+$KCODE='u' unless Cucumber::RUBY_1_9
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/uz/features/support/world.rb b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/uz/features/support/world.rb
new file mode 100755
index 00000000..78d95d9b
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/uz/features/support/world.rb
@@ -0,0 +1,8 @@
+# encoding: utf-8
+module LazyCalc
+ def calc
+ @calc ||= Calculator.new
+ end
+end
+
+World(LazyCalc)
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/uz/lib/calculator.rb b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/uz/lib/calculator.rb
new file mode 100755
index 00000000..0b975edd
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/uz/lib/calculator.rb
@@ -0,0 +1,24 @@
+# encoding: utf-8
+
+class Calculator
+ def initialize
+ @stack = []
+ end
+
+ def push(arg)
+ @stack.push arg
+ end
+
+ def result
+ @stack.last
+ end
+
+ def +
+ @stack.push @stack.pop + @stack.pop
+ end
+
+ def /
+ divisor, dividend = [@stack.pop, @stack.pop] # Hm, @stack.pop(2) doesn't work
+ @stack.push dividend / divisor
+ end
+end
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/zh-CN/Rakefile b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/zh-CN/Rakefile
new file mode 100755
index 00000000..1043cfb8
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/zh-CN/Rakefile
@@ -0,0 +1,6 @@
+$:.unshift(File.dirname(__FILE__) + '/../../../lib')
+require 'cucumber/rake/task'
+
+Cucumber::Rake::Task.new do |t|
+ t.cucumber_opts = %w{--language zh-CN}
+end
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/zh-CN/features/addition.feature b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/zh-CN/features/addition.feature
new file mode 100755
index 00000000..af1340d0
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/zh-CN/features/addition.feature
@@ -0,0 +1,18 @@
+# language: zh-CN
+功能:åŠ æ³•
+ 为了é¿å…ä¸€äº›æ„šè ¢çš„é”™è¯¯
+ 作为一个数å¦ç™½ç—´
+ 我希望有人告诉我数å—ç›¸åŠ çš„ç»“æžœ
+
+ 场景: 两个数相åŠ
+ å‡å¦‚我已ç»åœ¨è®¡ç®—器里输入6
+ 而且我已ç»åœ¨è®¡ç®—器里输入7
+ å½“æˆ‘æŒ‰ç›¸åŠ æŒ‰é’®
+ 那么我应该在å±å¹•ä¸Šçœ‹åˆ°çš„结果是13
+
+ 场景: 三个数相åŠ
+ å‡å¦‚我已ç»åœ¨è®¡ç®—器里输入6
+ 而且我已ç»åœ¨è®¡ç®—器里输入7
+ 而且我已ç»åœ¨è®¡ç®—器里输入1
+ å½“æˆ‘æŒ‰ç›¸åŠ æŒ‰é’®
+ 那么我应该在å±å¹•ä¸Šçœ‹åˆ°çš„结果是14
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/zh-CN/features/step_definitons/calculator_steps.rb b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/zh-CN/features/step_definitons/calculator_steps.rb
new file mode 100755
index 00000000..c37e83b1
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/zh-CN/features/step_definitons/calculator_steps.rb
@@ -0,0 +1,26 @@
+# encoding: utf-8
+require 'spec/expectations'
+$:.unshift(File.dirname(__FILE__) + '/../../lib') # This line is not needed in your own project
+require 'cucumber/formatter/unicode'
+require 'calculator'
+
+Before do
+ @calc = Calculator.new
+end
+
+After do
+end
+
+Given /我已ç»åœ¨è®¡ç®—器里输入(\d+)/ do |n|
+ @calc.push n.to_i
+end
+
+When /我按(.*)按钮/ do |op|
+ if op == 'ç›¸åŠ '
+ @result = @calc.send "add"
+ end
+end
+
+Then /我应该在å±å¹•ä¸Šçœ‹åˆ°çš„结果是(.*)/ do |result|
+ @result.should == result.to_f
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/zh-CN/lib/calculator.rb b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/zh-CN/lib/calculator.rb
new file mode 100755
index 00000000..4e1ded9e
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/zh-CN/lib/calculator.rb
@@ -0,0 +1,10 @@
+class Calculator
+ def push(n)
+ @args ||= []
+ @args << n
+ end
+
+ def add
+ @args.inject(0){|n,sum| sum+=n}
+ end
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/zh-TW/.gitignore b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/zh-TW/.gitignore
new file mode 100755
index 00000000..deeedc9b
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/zh-TW/.gitignore
@@ -0,0 +1 @@
+features.html
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/zh-TW/Rakefile b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/zh-TW/Rakefile
new file mode 100755
index 00000000..e755d7cc
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/zh-TW/Rakefile
@@ -0,0 +1,6 @@
+$:.unshift(File.dirname(__FILE__) + '/../../../lib')
+require 'cucumber/rake/task'
+
+Cucumber::Rake::Task.new do |t|
+ t.cucumber_opts = %w{--language zh-TW}
+end
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/zh-TW/features/addition.feature b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/zh-TW/features/addition.feature
new file mode 100755
index 00000000..4888906e
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/zh-TW/features/addition.feature
@@ -0,0 +1,17 @@
+# language: zh-TW
+功能: åŠ æ³•
+ 為了é¿å…æ„šè ¢çš„éŒ¯èª¤
+ 作為一個數å¸ç™½ç—´
+ æˆ‘å¸Œæœ›æœ‰äººèƒ½å‘Šè¨´æˆ‘å…©å€‹æ•¸ç›¸åŠ çš„çµæžœ
+
+ å ´æ™¯å¤§ç¶±: 將兩個數相åŠ
+ å‡è¨æˆ‘已經在計算機上輸入 <數值_1>
+ 而且我已經在計算機上輸入 <數值_2>
+ 當我按下 <按鈕>
+ 那麼螢幕上應該顯示 <çµæžœ>
+
+ 例å:
+ | 數值_1 | 數值_2 | 按鈕 | çµæžœ |
+ | 20 | 30 | add | 50 |
+ | 2 | 5 | add | 7 |
+ | 0 | 40 | add | 40 |
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/zh-TW/features/division.feature b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/zh-TW/features/division.feature
new file mode 100755
index 00000000..c78aae61
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/zh-TW/features/division.feature
@@ -0,0 +1,11 @@
+# language: zh-TW
+功能: 除法
+ 為了é¿å…æ„šè ¢çš„éŒ¯èª¤
+ æ”¶éŠ€æ©Ÿå¿…é ˆè¦èƒ½å¤ 計算除法
+ 而且必需能顯示éžæ•´æ•¸çš„çµæžœ
+
+ å ´æ™¯: 將兩個數相除
+ å‡è¨æˆ‘已經在計算機上輸入 3
+ 而且我已經在計算機上輸入 2
+ 當我按下 divide
+ 那麼螢幕上應該顯示 1.5
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/zh-TW/features/step_definitons/calculator_steps.rb b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/zh-TW/features/step_definitons/calculator_steps.rb
new file mode 100755
index 00000000..965ee4cf
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/zh-TW/features/step_definitons/calculator_steps.rb
@@ -0,0 +1,24 @@
+# encoding: utf-8
+require 'spec/expectations'
+$:.unshift(File.dirname(__FILE__) + '/../../lib') # This line is not needed in your own project
+require 'cucumber/formatter/unicode'
+require 'calculator'
+
+Before do
+ @calc = Calculator.new
+end
+
+After do
+end
+
+Given /我已經在計算機上輸入 (\d+)/ do |n|
+ @calc.push n.to_i
+end
+
+When /我按下 (\w+)/ do |op|
+ @result = @calc.send op
+end
+
+Then /螢幕上應該顯示 (.*)/ do |result|
+ @result.should == result.to_f
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/i18n/zh-TW/lib/calculator.rb b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/zh-TW/lib/calculator.rb
new file mode 100755
index 00000000..0598d3e6
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/i18n/zh-TW/lib/calculator.rb
@@ -0,0 +1,14 @@
+class Calculator
+ def push(n)
+ @args ||= []
+ @args << n
+ end
+
+ def add
+ @args.inject(0){|n,sum| sum+=n}
+ end
+
+ def divide
+ @args[0].to_f / @args[1].to_f
+ end
+end
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/junit/features/one_passing_one_failing.feature b/vendor/gems/gems/cucumber-0.4.4/examples/junit/features/one_passing_one_failing.feature
new file mode 100755
index 00000000..9ff6fa76
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/junit/features/one_passing_one_failing.feature
@@ -0,0 +1,8 @@
+Feature: One passing scenario, one failing scenario
+
+ Scenario: Passing
+ Given a passing scenario
+
+ Scenario: Failing
+ Given a failing scenario
+
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/junit/features/pending.feature b/vendor/gems/gems/cucumber-0.4.4/examples/junit/features/pending.feature
new file mode 100755
index 00000000..a013cdf0
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/junit/features/pending.feature
@@ -0,0 +1,5 @@
+Feature: Pending step
+
+ Scenario: Pending
+ Given a pending step
+
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/junit/features/step_definitions/steps.rb b/vendor/gems/gems/cucumber-0.4.4/examples/junit/features/step_definitions/steps.rb
new file mode 100755
index 00000000..84f06aac
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/junit/features/step_definitions/steps.rb
@@ -0,0 +1,11 @@
+Given /a passing scenario/ do
+ #does nothing
+end
+
+Given /a failing scenario/ do
+ fail
+end
+
+Given /a pending step/ do
+ pending
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/python/features/fibonacci.feature b/vendor/gems/gems/cucumber-0.4.4/examples/python/features/fibonacci.feature
new file mode 100755
index 00000000..4a743ea7
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/python/features/fibonacci.feature
@@ -0,0 +1,19 @@
+Feature: Fibonacci
+ In order to calculate super fast fibonacci series
+ As a pythonista
+ I want to use Python for that
+
+ Scenario Outline: Series
+ When I ask python to calculate fibonacci up to
+ Then it should give me
+
+ Examples:
+ | n | series |
+ | 1 | [] |
+ | 2 | [1, 1] |
+ | 3 | [1, 1, 2] |
+ | 4 | [1, 1, 2, 3] |
+ | 6 | [1, 1, 2, 3, 5] |
+ | 9 | [1, 1, 2, 3, 5, 8] |
+ | 100 | [1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89] |
+
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/python/features/step_definitions/fib_steps.py b/vendor/gems/gems/cucumber-0.4.4/examples/python/features/step_definitions/fib_steps.py
new file mode 100755
index 00000000..4a9e4805
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/python/features/step_definitions/fib_steps.py
@@ -0,0 +1,11 @@
+from py_dsl import *
+
+@Given("^I ask python to calculate fibonacci up to (\d+)$")
+def calc_fib_upto(n):
+ print("CALCULATING FIB")
+ #self.fib_result = fib.fib(n.to_i)
+
+@Given("^it should give me (\[.*\])$")
+def fib_should_be(n):
+ print("COMPARING FIB")
+ #self.fib_result = fib.fib(n.to_i)
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/python/lib/.gitignore b/vendor/gems/gems/cucumber-0.4.4/examples/python/lib/.gitignore
new file mode 100755
index 00000000..0d20b648
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/python/lib/.gitignore
@@ -0,0 +1 @@
+*.pyc
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/python/lib/fib.py b/vendor/gems/gems/cucumber-0.4.4/examples/python/lib/fib.py
new file mode 100755
index 00000000..bcc0f904
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/python/lib/fib.py
@@ -0,0 +1,7 @@
+def fib(n):
+ result = []
+ a, b = 0, 1
+ while b < n:
+ result.append(b)
+ a, b = b, a+b
+ return result
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/ramaze/README.textile b/vendor/gems/gems/cucumber-0.4.4/examples/ramaze/README.textile
new file mode 100755
index 00000000..ddca72b5
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/ramaze/README.textile
@@ -0,0 +1,7 @@
+h1. Ramaze and Cucumber
+
+This example will work with:
+
+* ramaze 2009.07
+* rack-test 0.5.0
+* webrat 0.5.3
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/ramaze/Rakefile b/vendor/gems/gems/cucumber-0.4.4/examples/ramaze/Rakefile
new file mode 100755
index 00000000..a5cf96ac
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/ramaze/Rakefile
@@ -0,0 +1,6 @@
+$:.unshift(File.dirname(__FILE__) + '/../../lib')
+require 'cucumber/rake/task'
+
+Cucumber::Rake::Task.new do |t|
+ t.cucumber_opts = %w{--format pretty}
+end
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/ramaze/app.rb b/vendor/gems/gems/cucumber-0.4.4/examples/ramaze/app.rb
new file mode 100755
index 00000000..6939a675
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/ramaze/app.rb
@@ -0,0 +1,21 @@
+begin
+ require 'ramaze'
+rescue LoadError
+ require 'rubygems'
+ require 'ramaze'
+end
+
+class Main < Ramaze::Controller
+ engine :ERB
+ layout :default
+
+ def index
+ # just render views/index.html.erb
+ end
+
+ def add
+ "Answer: #{request[:first].to_i + request[:second].to_i}"
+ end
+end
+
+Ramaze.start :root => __DIR__
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/ramaze/features/add.feature b/vendor/gems/gems/cucumber-0.4.4/examples/ramaze/features/add.feature
new file mode 100755
index 00000000..55f25625
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/ramaze/features/add.feature
@@ -0,0 +1,11 @@
+Feature: Addition
+ In order to avoid silly mistakes
+ As a math idiot
+ I want to be told the sum of two numbers
+
+ Scenario: Add two numbers
+ Given I visit the calculator page
+ And I fill in '50' for 'first'
+ And I fill in '70' for 'second'
+ When I press 'Add'
+ Then I should see 'Answer: 120'
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/ramaze/features/step_definitions/add_steps.rb b/vendor/gems/gems/cucumber-0.4.4/examples/ramaze/features/step_definitions/add_steps.rb
new file mode 100755
index 00000000..de571f9d
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/ramaze/features/step_definitions/add_steps.rb
@@ -0,0 +1,15 @@
+Given /^I visit the calculator page$/ do
+ visit '/'
+end
+
+Given /^I fill in '(.*)' for '(.*)'$/ do |value, field|
+ fill_in(field, :with => value)
+end
+
+When /^I press '(.*)'$/ do |name|
+ click_button(name)
+end
+
+Then /^I should see '(.*)'$/ do |text|
+ response_body.should contain(/#{text}/m)
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/ramaze/features/support/env.rb b/vendor/gems/gems/cucumber-0.4.4/examples/ramaze/features/support/env.rb
new file mode 100755
index 00000000..3a6b2168
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/ramaze/features/support/env.rb
@@ -0,0 +1,32 @@
+# See http://wiki.github.com/aslakhellesoy/cucumber/ramaze
+# for more details about Ramaze with Cucumber
+
+gem 'ramaze', '>= 2009.07'
+gem 'rack-test', '>= 0.5.0'
+gem 'webrat', '>= 0.5.3'
+
+require 'ramaze'
+Ramaze.options.started = true
+require __DIR__("../../app.rb")
+
+require 'spec/expectations'
+require 'rack/test'
+require 'webrat'
+
+Webrat.configure do |config|
+ config.mode = :rack
+end
+
+class MyWorld
+ include Rack::Test::Methods
+ include Webrat::Methods
+ include Webrat::Matchers
+
+ Webrat::Methods.delegate_to_session :response_code, :response_body
+
+ def app
+ Ramaze::middleware
+ end
+end
+
+World{MyWorld.new}
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/ramaze/layout/default.html.erb b/vendor/gems/gems/cucumber-0.4.4/examples/ramaze/layout/default.html.erb
new file mode 100755
index 00000000..ec2e4124
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/ramaze/layout/default.html.erb
@@ -0,0 +1,8 @@
+
+
+ Addition
+
+
+ <%= @content %>
+
+
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/ramaze/view/index.html.erb b/vendor/gems/gems/cucumber-0.4.4/examples/ramaze/view/index.html.erb
new file mode 100755
index 00000000..a1cea1aa
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/ramaze/view/index.html.erb
@@ -0,0 +1,5 @@
+
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/ruby2python/features/fibonacci.feature b/vendor/gems/gems/cucumber-0.4.4/examples/ruby2python/features/fibonacci.feature
new file mode 100755
index 00000000..4a743ea7
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/ruby2python/features/fibonacci.feature
@@ -0,0 +1,19 @@
+Feature: Fibonacci
+ In order to calculate super fast fibonacci series
+ As a pythonista
+ I want to use Python for that
+
+ Scenario Outline: Series
+ When I ask python to calculate fibonacci up to
+ Then it should give me
+
+ Examples:
+ | n | series |
+ | 1 | [] |
+ | 2 | [1, 1] |
+ | 3 | [1, 1, 2] |
+ | 4 | [1, 1, 2, 3] |
+ | 6 | [1, 1, 2, 3, 5] |
+ | 9 | [1, 1, 2, 3, 5, 8] |
+ | 100 | [1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89] |
+
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/ruby2python/features/step_definitions/fib_steps.rb b/vendor/gems/gems/cucumber-0.4.4/examples/ruby2python/features/step_definitions/fib_steps.rb
new file mode 100755
index 00000000..56285032
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/ruby2python/features/step_definitions/fib_steps.rb
@@ -0,0 +1,7 @@
+When /^I ask python to calculate fibonacci up to (\d+)$/ do |n|
+ @fib_result = @fib.fib(n.to_i)
+end
+
+Then /^it should give me (\[.*\])$/ do |expected|
+ @fib_result.inspect.should == expected
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/ruby2python/features/support/env.rb b/vendor/gems/gems/cucumber-0.4.4/examples/ruby2python/features/support/env.rb
new file mode 100755
index 00000000..485d7db9
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/ruby2python/features/support/env.rb
@@ -0,0 +1,21 @@
+require 'rubypython'
+
+ENV['PYTHONPATH'] = File.expand_path(File.dirname(__FILE__) + '/../../lib')
+
+Before do
+ RubyPython.start
+ @fib = RubyPython.import('fib')
+end
+
+After do
+ RubyPython.stop
+end
+
+# RubyPython seems to expect this to exist (?)
+class String
+ def end_with?(str)
+ str = str.to_str
+ tail = self[-str.length, str.length]
+ tail == str
+ end
+end
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/ruby2python/lib/.gitignore b/vendor/gems/gems/cucumber-0.4.4/examples/ruby2python/lib/.gitignore
new file mode 100755
index 00000000..0d20b648
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/ruby2python/lib/.gitignore
@@ -0,0 +1 @@
+*.pyc
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/ruby2python/lib/fib.py b/vendor/gems/gems/cucumber-0.4.4/examples/ruby2python/lib/fib.py
new file mode 100755
index 00000000..bcc0f904
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/ruby2python/lib/fib.py
@@ -0,0 +1,7 @@
+def fib(n):
+ result = []
+ a, b = 0, 1
+ while b < n:
+ result.append(b)
+ a, b = b, a+b
+ return result
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/selenium/Rakefile b/vendor/gems/gems/cucumber-0.4.4/examples/selenium/Rakefile
new file mode 100755
index 00000000..a5cf96ac
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/selenium/Rakefile
@@ -0,0 +1,6 @@
+$:.unshift(File.dirname(__FILE__) + '/../../lib')
+require 'cucumber/rake/task'
+
+Cucumber::Rake::Task.new do |t|
+ t.cucumber_opts = %w{--format pretty}
+end
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/selenium/features/search.feature b/vendor/gems/gems/cucumber-0.4.4/examples/selenium/features/search.feature
new file mode 100755
index 00000000..3824d7d0
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/selenium/features/search.feature
@@ -0,0 +1,9 @@
+Feature: Search
+ In order to learn more
+ As an information seeker
+ I want to find more information
+
+ Scenario: Find what I'm looking for
+ Given I am on the Google search page
+ When I search for "rspec"
+ Then I should see a link to http://rspec.info/
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/selenium/features/step_definitons/search_steps.rb b/vendor/gems/gems/cucumber-0.4.4/examples/selenium/features/step_definitons/search_steps.rb
new file mode 100755
index 00000000..8ea4c858
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/selenium/features/step_definitons/search_steps.rb
@@ -0,0 +1,13 @@
+Given 'I am on the Google search page' do
+ @browser.open('http://www.google.com/')
+end
+
+When /I search for "(.*)"/ do |query|
+ @browser.type('q', query)
+ @browser.click 'btnG'
+ @browser.wait_for_page_to_load
+end
+
+Then /I should see a link to (.*)/ do |expected_url|
+ @browser.is_element_present("css=a[href='#{expected_url}']").should be_true
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/selenium/features/support/env.rb b/vendor/gems/gems/cucumber-0.4.4/examples/selenium/features/support/env.rb
new file mode 100755
index 00000000..e6c8110e
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/selenium/features/support/env.rb
@@ -0,0 +1,19 @@
+require 'spec/expectations'
+require 'selenium'
+
+# "before all"
+browser = Selenium::SeleniumDriver.new("localhost", 4444, "*chrome", "http://localhost", 15000)
+
+Before do
+ @browser = browser
+ @browser.start
+end
+
+After do
+ @browser.stop
+end
+
+# "after all"
+at_exit do
+ browser.close rescue nil
+end
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/selenium_webrat/Rakefile b/vendor/gems/gems/cucumber-0.4.4/examples/selenium_webrat/Rakefile
new file mode 100755
index 00000000..a5cf96ac
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/selenium_webrat/Rakefile
@@ -0,0 +1,6 @@
+$:.unshift(File.dirname(__FILE__) + '/../../lib')
+require 'cucumber/rake/task'
+
+Cucumber::Rake::Task.new do |t|
+ t.cucumber_opts = %w{--format pretty}
+end
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/selenium_webrat/config.ru b/vendor/gems/gems/cucumber-0.4.4/examples/selenium_webrat/config.ru
new file mode 100755
index 00000000..e69de29b
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/selenium_webrat/features/search.feature b/vendor/gems/gems/cucumber-0.4.4/examples/selenium_webrat/features/search.feature
new file mode 100755
index 00000000..f0c6a6df
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/selenium_webrat/features/search.feature
@@ -0,0 +1,9 @@
+Feature: Search
+ In order to learn more
+ As an information seeker
+ I want to find more information
+
+ Scenario: Find what I'm looking for
+ Given I am on the Google search page
+ When I search for "rspec"
+ Then I should see a link to RSpec-1.2.4: Home
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/selenium_webrat/features/step_definitons/search_steps.rb b/vendor/gems/gems/cucumber-0.4.4/examples/selenium_webrat/features/step_definitons/search_steps.rb
new file mode 100755
index 00000000..9b01dd7b
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/selenium_webrat/features/step_definitons/search_steps.rb
@@ -0,0 +1,13 @@
+Given 'I am on the Google search page' do
+ visit('http://www.google.com/')
+end
+
+When /I search for "(.*)"/ do |query|
+ fill_in('q', :with => query)
+ click_button 'Google Search'
+ selenium.wait_for_page_to_load
+end
+
+Then /I should see a link to (.*)/ do |expected_url|
+ click_link expected_url
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/selenium_webrat/features/support/env.rb b/vendor/gems/gems/cucumber-0.4.4/examples/selenium_webrat/features/support/env.rb
new file mode 100755
index 00000000..e0d9f03f
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/selenium_webrat/features/support/env.rb
@@ -0,0 +1,45 @@
+require 'spec/expectations'
+
+# START HACK
+# Webrat's Selenium wrongly assumes Rails in available. # We'll just fool it...
+module ActionController
+ class IntegrationTest
+ end
+end
+
+def silence_stream(*args)
+ yield if block_given?
+end
+# END HACK
+
+# RSpec
+require 'spec/expectations'
+
+# Webrat
+require 'webrat'
+
+Webrat.configure do |config|
+ config.mode = :selenium
+end
+
+World do
+ session = Webrat::SeleniumSession.new
+ session.extend(Webrat::Methods)
+ session.extend(Webrat::Selenium::Methods)
+ session.extend(Webrat::Selenium::Matchers)
+ session
+end
+
+# START HACK
+# Disable Rails-specific code
+class Webrat::Selenium::ApplicationServer
+ def self.boot
+
+ STDOUT.puts "Starting app server"
+ end
+
+ def self.stop_at_exit
+ STDOUT.puts "Stopping app server"
+ end
+end
+# END HACK
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/self_test/.gitignore b/vendor/gems/gems/cucumber-0.4.4/examples/self_test/.gitignore
new file mode 100755
index 00000000..1c2f433d
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/self_test/.gitignore
@@ -0,0 +1 @@
+tmp
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/self_test/README.textile b/vendor/gems/gems/cucumber-0.4.4/examples/self_test/README.textile
new file mode 100755
index 00000000..7721e19c
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/self_test/README.textile
@@ -0,0 +1,6 @@
+h1. Self Test
+
+Cucumber's own features (ROOT_DIR/features) run the features in this directory and look at the output.
+
+Note that several of these fail intentionally. The purpose is to verify actual output against expected
+output.
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/self_test/Rakefile b/vendor/gems/gems/cucumber-0.4.4/examples/self_test/Rakefile
new file mode 100755
index 00000000..65b648a7
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/self_test/Rakefile
@@ -0,0 +1,6 @@
+$:.unshift(File.dirname(__FILE__) + '/../../lib')
+require 'cucumber/rake/task'
+
+Cucumber::Rake::Task.new(:features)
+
+task :default => :features
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/self_test/features/background/background_tagged_before_on_outline.feature b/vendor/gems/gems/cucumber-0.4.4/examples/self_test/features/background/background_tagged_before_on_outline.feature
new file mode 100755
index 00000000..5c0f4816
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/self_test/features/background/background_tagged_before_on_outline.feature
@@ -0,0 +1,12 @@
+@background_tagged_before_on_outline
+Feature: Background tagged Before on Outline
+
+ Background:
+ Given passing without a table
+
+ Scenario Outline: passing background
+ Then I should have '' cukes
+
+ Examples:
+ | count |
+ | 888 |
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/self_test/features/background/background_with_name.feature b/vendor/gems/gems/cucumber-0.4.4/examples/self_test/features/background/background_with_name.feature
new file mode 100755
index 00000000..550457bf
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/self_test/features/background/background_with_name.feature
@@ -0,0 +1,7 @@
+Feature: background with name
+
+ Background: I'm a background and I'm ok
+ Given '10' cukes
+
+ Scenario: example
+ Then I should have '10' cukes
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/self_test/features/background/failing_background.feature b/vendor/gems/gems/cucumber-0.4.4/examples/self_test/features/background/failing_background.feature
new file mode 100755
index 00000000..789cfd7d
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/self_test/features/background/failing_background.feature
@@ -0,0 +1,12 @@
+@after_file
+Feature: Failing background sample
+
+ Background:
+ Given failing without a table
+ And '10' cukes
+
+ Scenario: failing background
+ Then I should have '10' cukes
+
+ Scenario: another failing background
+ Then I should have '10' cukes
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/self_test/features/background/failing_background_after_success.feature b/vendor/gems/gems/cucumber-0.4.4/examples/self_test/features/background/failing_background_after_success.feature
new file mode 100755
index 00000000..d8c45e0d
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/self_test/features/background/failing_background_after_success.feature
@@ -0,0 +1,11 @@
+Feature: Failing background after previously successful background sample
+
+ Background:
+ Given passing without a table
+ And '10' global cukes
+
+ Scenario: passing background
+ Then I should have '10' global cukes
+
+ Scenario: failing background
+ Then I should have '10' global cukes
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/self_test/features/background/multiline_args_background.feature b/vendor/gems/gems/cucumber-0.4.4/examples/self_test/features/background/multiline_args_background.feature
new file mode 100755
index 00000000..3c152e00
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/self_test/features/background/multiline_args_background.feature
@@ -0,0 +1,32 @@
+Feature: Passing background with multiline args
+
+ Background:
+ Given table
+ |a|b|
+ |c|d|
+ And multiline string
+ """
+ I'm a cucumber and I'm okay.
+ I sleep all night and I test all day
+ """
+
+ Scenario: passing background
+ Then the table should be
+ |a|b|
+ |c|d|
+ Then the multiline string should be
+ """
+ I'm a cucumber and I'm okay.
+ I sleep all night and I test all day
+ """
+
+ Scenario: another passing background
+ Then the table should be
+ |a|b|
+ |c|d|
+ Then the multiline string should be
+ """
+ I'm a cucumber and I'm okay.
+ I sleep all night and I test all day
+ """
+
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/self_test/features/background/passing_background.feature b/vendor/gems/gems/cucumber-0.4.4/examples/self_test/features/background/passing_background.feature
new file mode 100755
index 00000000..16cc6e9b
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/self_test/features/background/passing_background.feature
@@ -0,0 +1,10 @@
+Feature: Passing background sample
+
+ Background:
+ Given '10' cukes
+
+ Scenario: passing background
+ Then I should have '10' cukes
+
+ Scenario: another passing background
+ Then I should have '10' cukes
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/self_test/features/background/pending_background.feature b/vendor/gems/gems/cucumber-0.4.4/examples/self_test/features/background/pending_background.feature
new file mode 100755
index 00000000..8ad9c743
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/self_test/features/background/pending_background.feature
@@ -0,0 +1,10 @@
+Feature: Pending background sample
+
+ Background:
+ Given pending
+
+ Scenario: pending background
+ Then I should have '10' cukes
+
+ Scenario: another pending background
+ Then I should have '10' cukes
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/self_test/features/background/scenario_outline_failing_background.feature b/vendor/gems/gems/cucumber-0.4.4/examples/self_test/features/background/scenario_outline_failing_background.feature
new file mode 100755
index 00000000..057d59fd
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/self_test/features/background/scenario_outline_failing_background.feature
@@ -0,0 +1,16 @@
+Feature: Failing background with scenario outlines sample
+
+ Background:
+ Given failing without a table
+
+ Scenario Outline: failing background
+ Then I should have '' cukes
+ Examples:
+ |count|
+ | 10 |
+
+ Scenario Outline: another failing background
+ Then I should have '' cukes
+ Examples:
+ |count|
+ | 10 |
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/self_test/features/background/scenario_outline_passing_background.feature b/vendor/gems/gems/cucumber-0.4.4/examples/self_test/features/background/scenario_outline_passing_background.feature
new file mode 100755
index 00000000..c614655c
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/self_test/features/background/scenario_outline_passing_background.feature
@@ -0,0 +1,16 @@
+Feature: Passing background with scenario outlines sample
+
+ Background:
+ Given '10' cukes
+
+ Scenario Outline: passing background
+ Then I should have '' cukes
+ Examples:
+ |count|
+ | 10 |
+
+ Scenario Outline: another passing background
+ Then I should have '' cukes
+ Examples:
+ |count|
+ | 10 |
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/self_test/features/call_undefined_step_from_step_def.feature b/vendor/gems/gems/cucumber-0.4.4/examples/self_test/features/call_undefined_step_from_step_def.feature
new file mode 100755
index 00000000..85e61e36
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/self_test/features/call_undefined_step_from_step_def.feature
@@ -0,0 +1,7 @@
+Feature: Calling undefined step
+
+ Scenario: Call directly
+ Given a step definition that calls an undefined step
+
+ Scenario: Call via another
+ Given call step "a step definition that calls an undefined step"
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/self_test/features/failing_expectation.feature b/vendor/gems/gems/cucumber-0.4.4/examples/self_test/features/failing_expectation.feature
new file mode 100755
index 00000000..ee7215d0
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/self_test/features/failing_expectation.feature
@@ -0,0 +1,4 @@
+Feature: Failing expectation
+
+ Scenario: Failing expectation
+ Given failing expectation
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/self_test/features/lots_of_undefined.feature b/vendor/gems/gems/cucumber-0.4.4/examples/self_test/features/lots_of_undefined.feature
new file mode 100755
index 00000000..c72d29d1
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/self_test/features/lots_of_undefined.feature
@@ -0,0 +1,8 @@
+Feature: Lots of undefined
+
+ Scenario: Implement me
+ Given it snows in Sahara
+ Given it's 40 degrees in Norway
+ And it's 40 degrees in Norway
+ When I stop procrastinating
+ And there is world peace
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/self_test/features/multiline_name.feature b/vendor/gems/gems/cucumber-0.4.4/examples/self_test/features/multiline_name.feature
new file mode 100755
index 00000000..3bd458fd
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/self_test/features/multiline_name.feature
@@ -0,0 +1,27 @@
+Feature: multiline
+
+ Background: I'm a multiline name
+ which goes on and on and on for three lines
+ yawn
+ Given passing without a table
+
+ Scenario: I'm a multiline name
+ which goes on and on and on for three lines
+ yawn
+ Given passing without a table
+
+ Scenario Outline: I'm a multiline name
+ which goes on and on and on for three lines
+ yawn
+ Given without a table
+ Examples:
+ | state |
+ |passing|
+
+ Scenario Outline: name
+ Given without a table
+ Examples: I'm a multiline name
+ which goes on and on and on for three lines
+ yawn
+ | state |
+ |passing|
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/self_test/features/outline_sample.feature b/vendor/gems/gems/cucumber-0.4.4/examples/self_test/features/outline_sample.feature
new file mode 100755
index 00000000..dd977f3e
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/self_test/features/outline_sample.feature
@@ -0,0 +1,15 @@
+Feature: Outline Sample
+
+ Scenario: I have no steps
+
+ Scenario Outline: Test state
+ Given without a table
+ Given without a table
+ Examples: Rainbow colours
+ | state | other_state |
+ | missing | passing|
+ | passing| passing |
+| failing | passing |
+Examples:Only passing
+| state | other_state |
+| passing | passing |
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/self_test/features/sample.feature b/vendor/gems/gems/cucumber-0.4.4/examples/self_test/features/sample.feature
new file mode 100755
index 00000000..34cd5cd8
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/self_test/features/sample.feature
@@ -0,0 +1,21 @@
+# Feature comment
+@one
+Feature: Sample
+
+ @two @three
+ Scenario: Missing
+ Given missing
+
+# Scenario comment
+@three
+ Scenario: Passing
+ Given passing
+ |a|b|
+ |c|d|
+
+ @four
+ Scenario: Failing
+ Given failing
+ """
+ hello
+ """
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/self_test/features/search_sample.feature b/vendor/gems/gems/cucumber-0.4.4/examples/self_test/features/search_sample.feature
new file mode 100755
index 00000000..a66d1e19
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/self_test/features/search_sample.feature
@@ -0,0 +1,32 @@
+Feature: search examples
+
+ Background: Hantu Pisang background match
+ Given passing without a table
+
+ Scenario: should match Hantu Pisang
+ Given passing without a table
+
+ Scenario: Ignore me
+ Given failing without a table
+
+ Scenario Outline: Ignore me
+ Given without a table
+ Examples:
+ | state |
+ | failing |
+
+ Scenario Outline: Hantu Pisang match
+ Given without a table
+ Examples:
+ | state |
+ | passing |
+
+ Scenario Outline: no match in name but in examples
+ Given without a table
+ Examples: Hantu Pisang
+ | state |
+ | passing |
+
+ Examples: Ignore me
+ | state |
+ | failing |
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/self_test/features/step_definitions/sample_steps.rb b/vendor/gems/gems/cucumber-0.4.4/examples/self_test/features/step_definitions/sample_steps.rb
new file mode 100755
index 00000000..625ef931
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/self_test/features/step_definitions/sample_steps.rb
@@ -0,0 +1,81 @@
+def flunker
+ raise "FAIL"
+end
+
+Given /^passing$/ do |table|
+end
+
+Given /^failing$/ do |string|
+ flunker
+end
+
+Given /^passing without a table$/ do
+end
+
+Given /^failing without a table$/ do
+ flunker
+end
+
+Given /^a step definition that calls an undefined step$/ do
+ Given 'this does not exist'
+end
+
+Given /^call step "(.*)"$/ do |step|
+ Given step
+end
+
+Given /^'(.+)' cukes$/ do |cukes|
+ raise "We already have #{@cukes} cukes!" if @cukes
+ @cukes = cukes
+end
+Then /^I should have '(.+)' cukes$/ do |cukes|
+ @cukes.should == cukes
+end
+
+Given /^'(.+)' global cukes$/ do |cukes|
+ $scenario_runs ||= 0
+ flunker if $scenario_runs >= 1
+ $cukes = cukes
+ $scenario_runs += 1
+end
+
+Then /^I should have '(.+)' global cukes$/ do |cukes|
+ $cukes.should == cukes
+end
+
+Given /^table$/ do |table|
+ @table = table
+end
+
+Given /^multiline string$/ do |string|
+ @multiline = string
+end
+
+Then /^the table should be$/ do |table|
+ @table.raw.should == table.raw
+end
+
+Then /^the multiline string should be$/ do |string|
+ @multiline.should == string
+end
+
+Given /^failing expectation$/ do
+ 'this'.should == 'that'
+end
+
+Given /^unused$/ do
+end
+
+Given /^another unused$/ do
+end
+
+after_file = File.expand_path(File.dirname(__FILE__) + '/../../tmp/after.txt')
+
+Before do
+ FileUtils.rm(after_file) if File.exist?(after_file)
+end
+
+After('@after_file') do
+ FileUtils.mkdir_p(File.dirname(after_file))
+ FileUtils.touch(after_file)
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/self_test/features/support/env.rb b/vendor/gems/gems/cucumber-0.4.4/examples/self_test/features/support/env.rb
new file mode 100755
index 00000000..b37dd9ca
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/self_test/features/support/env.rb
@@ -0,0 +1,18 @@
+require 'spec/expectations'
+$KCODE = 'u' unless Cucumber::RUBY_1_9
+
+Before('@not_used') do
+ raise "Should never run"
+end
+
+After('@not_used') do
+ raise "Should never run"
+end
+
+Before('@background_tagged_before_on_outline') do
+ @cukes = '888'
+end
+
+After('@background_tagged_before_on_outline') do
+ @cukes.should == '888'
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/self_test/features/tags_sample.feature b/vendor/gems/gems/cucumber-0.4.4/examples/self_test/features/tags_sample.feature
new file mode 100755
index 00000000..21eaaab1
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/self_test/features/tags_sample.feature
@@ -0,0 +1,17 @@
+@sample_one
+Feature: Tag samples
+
+ @sample_two @sample_four
+ Scenario: Passing
+ Given missing
+
+ @sample_three
+ Scenario Outline:
+ Given
+ Examples:
+ |state|
+ |missing|
+
+ @sample_three @sample_four
+ Scenario: Skipped
+ Given missing
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/self_test/features/tons_of_cukes.feature b/vendor/gems/gems/cucumber-0.4.4/examples/self_test/features/tons_of_cukes.feature
new file mode 100755
index 00000000..b8656f16
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/self_test/features/tons_of_cukes.feature
@@ -0,0 +1,52 @@
+@lots
+Feature: Tons of cukes
+ Scenario: Lots and lots
+ Given '2' cukes
+ Given '2' cukes
+ Given '2' cukes
+ Given '2' cukes
+ Given '2' cukes
+ Given '2' cukes
+ Given '2' cukes
+ Given '2' cukes
+ Given '2' cukes
+ Given '2' cukes
+ Given '2' cukes
+ Given '2' cukes
+ Given '2' cukes
+ Given '2' cukes
+ Given '2' cukes
+ Given '2' cukes
+ Given '2' cukes
+ Given '2' cukes
+ Given '2' cukes
+ Given '2' cukes
+ Given '2' cukes
+ Given '2' cukes
+ Given '2' cukes
+ Given '2' cukes
+ Given '2' cukes
+ Given '2' cukes
+ Given '2' cukes
+ Given '2' cukes
+ Given '2' cukes
+ Given '2' cukes
+ Given '2' cukes
+ Given '2' cukes
+ Given '2' cukes
+ Given '2' cukes
+ Given '2' cukes
+ Given '2' cukes
+ Given '2' cukes
+ Given '2' cukes
+ Given '2' cukes
+ Given '2' cukes
+ Given '2' cukes
+ Given '2' cukes
+ Given '2' cukes
+ Given '2' cukes
+ Given '2' cukes
+ Given '2' cukes
+ Given '2' cukes
+ Given '2' cukes
+ Given '2' cukes
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/self_test/features/undefined_multiline_args.feature b/vendor/gems/gems/cucumber-0.4.4/examples/self_test/features/undefined_multiline_args.feature
new file mode 100755
index 00000000..ae3c7321
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/self_test/features/undefined_multiline_args.feature
@@ -0,0 +1,12 @@
+Feature: undefined multiline args
+
+ Scenario: pystring
+ Given a pystring
+ """
+ example
+ """
+
+ Scenario: table
+ Given a table
+ | table |
+ |example|
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/self_test/list-of-features.txt b/vendor/gems/gems/cucumber-0.4.4/examples/self_test/list-of-features.txt
new file mode 100755
index 00000000..332dcd5b
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/self_test/list-of-features.txt
@@ -0,0 +1 @@
+features/sample.feature:12
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/sinatra/README.textile b/vendor/gems/gems/cucumber-0.4.4/examples/sinatra/README.textile
new file mode 100755
index 00000000..d4d4dc9d
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/sinatra/README.textile
@@ -0,0 +1,13 @@
+h1. Sinatra and Cucumber
+
+This example will work with:
+
+* sinatra 0.9.4
+* rack-test 0.3.0
+
+As of this writing, the latest released webrat gem isn't compatible with these gems, so you need this:
+
+* aslakhellesoy-webrat 0.4.4.1
+
+That webrat gem is built from sr's ps2 branch: http://github.com/brynary/webrat/network
+
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/sinatra/Rakefile b/vendor/gems/gems/cucumber-0.4.4/examples/sinatra/Rakefile
new file mode 100755
index 00000000..a5cf96ac
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/sinatra/Rakefile
@@ -0,0 +1,6 @@
+$:.unshift(File.dirname(__FILE__) + '/../../lib')
+require 'cucumber/rake/task'
+
+Cucumber::Rake::Task.new do |t|
+ t.cucumber_opts = %w{--format pretty}
+end
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/sinatra/app.rb b/vendor/gems/gems/cucumber-0.4.4/examples/sinatra/app.rb
new file mode 100755
index 00000000..756973c7
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/sinatra/app.rb
@@ -0,0 +1,14 @@
+begin
+ require 'sinatra'
+rescue LoadError
+ require 'rubygems'
+ require 'sinatra'
+end
+
+get '/add' do
+ erb :add
+end
+
+post '/add' do
+ "Answer: #{params[:first].to_i + params[:second].to_i}"
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/sinatra/features/add.feature b/vendor/gems/gems/cucumber-0.4.4/examples/sinatra/features/add.feature
new file mode 100755
index 00000000..55f25625
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/sinatra/features/add.feature
@@ -0,0 +1,11 @@
+Feature: Addition
+ In order to avoid silly mistakes
+ As a math idiot
+ I want to be told the sum of two numbers
+
+ Scenario: Add two numbers
+ Given I visit the calculator page
+ And I fill in '50' for 'first'
+ And I fill in '70' for 'second'
+ When I press 'Add'
+ Then I should see 'Answer: 120'
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/sinatra/features/step_definitions/add_steps.rb b/vendor/gems/gems/cucumber-0.4.4/examples/sinatra/features/step_definitions/add_steps.rb
new file mode 100755
index 00000000..63a90300
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/sinatra/features/step_definitions/add_steps.rb
@@ -0,0 +1,15 @@
+Given /^I visit the calculator page$/ do
+ visit '/add'
+end
+
+Given /^I fill in '(.*)' for '(.*)'$/ do |value, field|
+ fill_in(field, :with => value)
+end
+
+When /^I press '(.*)'$/ do |name|
+ click_button(name)
+end
+
+Then /^I should see '(.*)'$/ do |text|
+ response_body.should contain(/#{text}/m)
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/sinatra/features/support/env.rb b/vendor/gems/gems/cucumber-0.4.4/examples/sinatra/features/support/env.rb
new file mode 100755
index 00000000..c9a0cf21
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/sinatra/features/support/env.rb
@@ -0,0 +1,30 @@
+# See http://wiki.github.com/aslakhellesoy/cucumber/sinatra
+# for more details about Sinatra with Cucumber
+
+gem 'rack-test', '>=0.5.0'
+gem 'sinatra', '=0.9.4'
+
+app_file = File.join(File.dirname(__FILE__), *%w[.. .. app.rb])
+require app_file
+# Force the application name because polyglot breaks the auto-detection logic.
+Sinatra::Application.app_file = app_file
+
+require 'spec/expectations'
+require 'rack/test'
+require 'webrat'
+
+Webrat.configure do |config|
+ config.mode = :rack
+end
+
+class MyWorld
+ include Rack::Test::Methods
+ include Webrat::Methods
+ include Webrat::Matchers
+
+ def app
+ Sinatra::Application
+ end
+end
+
+World{MyWorld.new}
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/sinatra/views/add.erb b/vendor/gems/gems/cucumber-0.4.4/examples/sinatra/views/add.erb
new file mode 100755
index 00000000..a1cea1aa
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/sinatra/views/add.erb
@@ -0,0 +1,5 @@
+
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/sinatra/views/layout.erb b/vendor/gems/gems/cucumber-0.4.4/examples/sinatra/views/layout.erb
new file mode 100755
index 00000000..1f1a5f93
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/sinatra/views/layout.erb
@@ -0,0 +1,8 @@
+
+
+ Addition
+
+
+ <%= yield %>
+
+
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/steps_library/features/step_definitions/steps_lib1.rb b/vendor/gems/gems/cucumber-0.4.4/examples/steps_library/features/step_definitions/steps_lib1.rb
new file mode 100755
index 00000000..97ef52b9
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/steps_library/features/step_definitions/steps_lib1.rb
@@ -0,0 +1,8 @@
+Given /^I defined a first step$/ do
+end
+
+When /^I define a second step$/ do
+end
+
+Then /^I should also have a third step$/ do
+end
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/steps_library/features/step_definitions/steps_lib2.rb b/vendor/gems/gems/cucumber-0.4.4/examples/steps_library/features/step_definitions/steps_lib2.rb
new file mode 100755
index 00000000..387881db
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/steps_library/features/step_definitions/steps_lib2.rb
@@ -0,0 +1,8 @@
+Given /^I defined a step 4$/ do
+end
+
+When /^I create a step 5$/ do
+end
+
+Then /^I should be too tired for step 6$/ do
+end
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/test_unit/Rakefile b/vendor/gems/gems/cucumber-0.4.4/examples/test_unit/Rakefile
new file mode 100755
index 00000000..a5cf96ac
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/test_unit/Rakefile
@@ -0,0 +1,6 @@
+$:.unshift(File.dirname(__FILE__) + '/../../lib')
+require 'cucumber/rake/task'
+
+Cucumber::Rake::Task.new do |t|
+ t.cucumber_opts = %w{--format pretty}
+end
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/test_unit/features/step_definitions/test_unit_steps.rb b/vendor/gems/gems/cucumber-0.4.4/examples/test_unit/features/step_definitions/test_unit_steps.rb
new file mode 100755
index 00000000..a153db26
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/test_unit/features/step_definitions/test_unit_steps.rb
@@ -0,0 +1,23 @@
+require 'test/unit/assertions'
+World(Test::Unit::Assertions)
+
+Given /^(\w+) = (\w+)$/ do |var, value|
+ instance_variable_set("@#{var}", value)
+end
+
+begin
+ require 'rubygems'
+ require 'matchy'
+ Then /^I can assert that (\w+) == (\w+)$/ do |var_a, var_b|
+ a = instance_variable_get("@#{var_a}")
+ b = instance_variable_get("@#{var_b}")
+ a.should == b
+ end
+rescue LoadError
+ STDERR.puts "***** You should install matchy *****"
+ Then /^I can assert that (\w+) == (\w+)$/ do |var_a, var_b|
+ a = instance_variable_get("@#{var_a}")
+ b = instance_variable_get("@#{var_b}")
+ assert_equal(a, b)
+ end
+end
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/test_unit/features/test_unit.feature b/vendor/gems/gems/cucumber-0.4.4/examples/test_unit/features/test_unit.feature
new file mode 100755
index 00000000..ed08ba42
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/test_unit/features/test_unit.feature
@@ -0,0 +1,9 @@
+Feature: Test::Unit
+ In order to please people who like Test::Unit
+ As a Cucumber user
+ I want to be able to use assert* in my step definitions
+
+ Scenario: assert_equal
+ Given x = 5
+ And y = 5
+ Then I can assert that x == y
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/tickets/Rakefile b/vendor/gems/gems/cucumber-0.4.4/examples/tickets/Rakefile
new file mode 100755
index 00000000..955bfa29
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/tickets/Rakefile
@@ -0,0 +1,20 @@
+$:.unshift(File.dirname(__FILE__) + '/../../lib')
+require 'cucumber/rake/task'
+
+Cucumber::Rake::Task.new(:pretty) do |t|
+ t.cucumber_opts = %w{--tags ~@intentional_failure --format pretty -q}
+end
+
+Cucumber::Rake::Task.new(:html) do |t|
+ t.cucumber_opts = %w{--tags ~@intentional_failure --format html --out features.html}
+end
+
+Cucumber::Rake::Task.new(:progress) do |t|
+ t.cucumber_opts = %w{--tags ~@intentional_failure --format progress -i -s}
+end
+
+Cucumber::Rake::Task.new(:rerun) do |t|
+ t.cucumber_opts = %w{--tags ~@intentional_failure --format rerun -i -s}
+end
+
+task :default => [:pretty, :html, :progress, :rerun]
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/tickets/features.html b/vendor/gems/gems/cucumber-0.4.4/examples/tickets/features.html
new file mode 100755
index 00000000..dee984f5
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/tickets/features.html
@@ -0,0 +1,138 @@
+Cucumber Feature: Login To ensure the safety of the application A regular user of the system Must authenticate before using the app
Scenario Outline: Failed Login Given the user "known_user"
When I go to the main page
Then I should see the login form
When I fill in "login" with "<login>"
And I fill in "password" with "<password>"
And I press "Log In"
Then the login request should fail
And I should see the error message "Login or Password incorrect"
Examples: login password unknown_user known_user wrong_password known_userpass unknown_user wrong_password unknown_user known_userpass known_user wrong_password
Users want to know that nobody can masquerade as them. We want to extend trust only to visitors who present the appropriate credentials. Everyone wants this identity verification to be as secure and convenient as possible. Feature: Logging in As an anonymous user with an account I want to log in to my account So that I can be myself
Scenario: Anonymous user can get a login form. Given I am logged out
When I go to "/login"
Then I should be at the "sessions/new" page
Scenario: Anonymous user can log in Given an "activated" user named "reggie" exists
And I am logged out
When I go to "/login"
And I fill in "Login" with "reggie"
And I fill in "Password" with "password"
And I press "Log in"
Then I should be at the "dashboard/index" page
Visitors may create an account, but for those who are not already in the system an someone must activate the account for them before it can be used. Feature: Activating an account As a registered, but not yet activated, user I want to be able to activate my account So that I can log in to the site
Scenario: Not-yet-activated user can activate her account Given a registered user named 'Reggie' # need to rewrite
Feature: Matt's example with a comment before a step
Scenario: Upload an image for an artist and create a concert in the process Given I am logged in to my account
And there is one Artist named "Pixies"
And there is one Venue
When I visit the page for the Artist
And I follow "add a photo"
And I upload an Image
And I press "Search Pixies concerts"
And I follow "Add a new Concert"
And I fill in new Concert information
And I press "Preview"
And I press "Add concert"
And I press "Submit"
Then my Concert should exist with 1 Image
Feature: Cucumber command line In order to write better software Developers should be able to execute requirements as tests
Scenario: Pending Scenario at the end of a file with whitespace after it
+ Feature: Tagged hooks In order to provide more flexible setups I should be able to specify exactly where hooks are executed
@i_am_so_special Scenario: Yes I am When special me goes to town
Feature: Unsubstituted argument placeholder
Scenario Outline: See Annual Leave Details (as Management & Human Resource) Given the following users exist in the system
name email role_assignments group_memberships Jane jane@fmail.com <role> Sales (manager) Max max@fmail.com Sales (member) Carol carol@fmail.com Sales (member) Cat cat@fmail.com
Users want to use cucumber, so tests are necessary to verify it is all working as expected Feature: Using the Console Formatter In order to verify this error I want to run this feature using the progress format So that it can be fixed
Scenario: A normal feature Given I have a pending step
TODO (Cucumber::Pending)
+./features/step_definitons/tickets_steps.rb:57:in `/^I have a pending step$/'
+features/241.feature:10:in `Given I have a pending step' When I run this feature with the progress format
Then I should get a no method error for 'backtrace_line'
Feature: https://rspec.lighthouseapp.com/projects/16211/tickets/246-distorted-console-output-for-slightly-complicated-step-regexp-match
Scenario: See "No Record(s) Found" for Zero Existing Given no public holiday exists in the system
Feature: pending method causes failure in Scenario Outlines
Scenario Outline: blah Given this is pending until we fix it
Given context with <Stuff>
When action
Then outcome with <Blah>
Examples: Stuff Blah Cheese Pepper Jack TODO (Cucumber::Pending)
+./features/step_definitons/248_steps.rb:2:in `/^this is pending until we fix it$/'
+features/248.feature:4:in `Given this is pending until we fix it'
Feature: Background In for background to work properly As a user I want it to run transactionally and only once when I call an individual scenario
Scenario: Barping When I barp
Scenario: Wibbling When I wibble
Feature: pystring indentaion testcase
Scenario: example of correct indentation Given multiline string
I'm a cucumber and I'm ok
I sleep all night and test all day Then string is
I'm a cucumber and I'm ok
I sleep all night and test all day Scenario: example of wrong indentation Given I am in tickets/features/279
When I run cucumber -q wrong.feature_
Then it should fail with
And STDERR should match
wrong.feature_:8:10: Parse error Feature https://rspec.lighthouseapp.com/projects/16211/tickets/301
Background: A background Given whatever
Scenario: VB is not cool Then VB should not be cool
Feature: woo yeah
Background: Given passing step without a table
Feature: Outlines In order to re-use scenario table values As a citizen of Cucumbia I want to explicitly mark the parameters in a scenario outline
Scenario Outline: controlling order Given there are <start> cucumbers
When I eat <eat> cucumbers
Then I should have <left> cucumbers
Scenario Outline: reusing place holder Given there are <start> cucumbers
When I eat <eat> cucumbers
Then I should have <left> cucumbers
And I should have <eat> cucumbers in my belly
Examples: Ridiculous amounts of cukes start eat left 120 50 70 200 50 150
Scenario Outline: no placeholders Given there are 12 cucumbers
When I eat 5 cucumbers
Then I should have 7 cucumbers
Scenario Outline: using '<' and '>' not as placeholder Given the belly space is < 12 and > 6
And there are <start> cucumbers
When I eat <eat> cucumbers
Then I should have <left> cucumbers
Scenario Outline: with step tables Given I have the following fruits in my pantry
name quantity cucumbers 10 strawberrys 5 apricots 7
When I eat <number> <fruits> from the pantry
Then I should have <left> <fruits> in the pantry
Examples: number fruits left 2 cucumbers 8 4 strawberrys 1 2 apricots 5
Scenario Outline: placeholder in a multiline string Given my shopping list
Must buy some Then my shopping list should equal
Must buy some cucumbers Scenario Outline: placeholder in step table Given I have the following fruits in my pantry
name quantity cucumbers <quant_cukes> strawberrys <quant_straw>
When I eat <number> <fruits> from the pantry
Then I should have <left> <fruits> in the pantry
Examples: quant_cukes quant_straw number fruits left 10 5 2 cucumbers 8 5 5 4 strawberrys 1
Feature: Cucumber In order to have a happy user base As a Cucumber user I don't want no stinkin bugs
Scenario: RSpec be_* Given be_empty
Scenario: Call step from step Given nested step is called
Then nested step should be executed
Scenario: Call step from step using text table Given nested step is called using text table
Then nested step should be executed
Scenario: Reading a table Given the following table
Then I should be working in London
And I should be born in Oslo
And I should see a multiline string like
A string
that spans
several lines 43 scenarios (12 undefined, 2 pending, 29 passed)
173 steps (5 skipped, 89 undefined, 2 pending, 77 passed)
0m0.701s
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/tickets/features/172.feature b/vendor/gems/gems/cucumber-0.4.4/examples/tickets/features/172.feature
new file mode 100755
index 00000000..e587faad
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/tickets/features/172.feature
@@ -0,0 +1,28 @@
+Feature: Login
+ To ensure the safety of the application
+ A regular user of the system
+ Must authenticate before using the app
+
+
+ Scenario Outline: Failed Login
+ Given the user "known_user"
+
+ When I go to the main page
+ Then I should see the login form
+
+ When I fill in "login" with ""
+ And I fill in "password" with ""
+ And I press "Log In"
+ Then the login request should fail
+ And I should see the error message "Login or Password incorrect"
+
+ Examples:
+ | login | password |
+ | | |
+ | unknown_user | |
+ | known_user | |
+ | | wrong_password |
+ | | known_userpass |
+ | unknown_user | wrong_password |
+ | unknown_user | known_userpass |
+ | known_user | wrong_password |
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/tickets/features/177/1.feature b/vendor/gems/gems/cucumber-0.4.4/examples/tickets/features/177/1.feature
new file mode 100755
index 00000000..611e2388
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/tickets/features/177/1.feature
@@ -0,0 +1,29 @@
+Users want to know that nobody can masquerade as them. We want to extend trust
+only to visitors who present the appropriate credentials. Everyone wants this
+identity verification to be as secure and convenient as possible.
+
+Feature: Logging in
+ As an anonymous user with an account
+ I want to log in to my account
+ So that I can be myself
+
+ #
+ # Log in: get form
+ #
+ Scenario: Anonymous user can get a login form.
+ Given I am logged out
+ When I go to "/login"
+ Then I should be at the "sessions/new" page
+
+ #
+ # Log in successfully, but don't remember me
+ #
+ Scenario: Anonymous user can log in
+ Given an "activated" user named "reggie" exists
+ And I am logged out
+ When I go to "/login"
+ And I fill in "Login" with "reggie"
+ And I fill in "Password" with "password"
+ And I press "Log in"
+ Then I should be at the "dashboard/index" page
+
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/tickets/features/177/2.feature b/vendor/gems/gems/cucumber-0.4.4/examples/tickets/features/177/2.feature
new file mode 100755
index 00000000..57f1dc4b
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/tickets/features/177/2.feature
@@ -0,0 +1,21 @@
+Visitors may create an account, but for those who are not already in the
+system an someone must activate the account for them before it can be used.
+
+Feature: Activating an account
+ As a registered, but not yet activated, user
+ I want to be able to activate my account
+ So that I can log in to the site
+
+ Scenario: Not-yet-activated user can activate her account
+ Given a registered user named 'Reggie' # need to rewrite
+ # And the user has activation_code: 'activate_me', activated_at: nil!
+ # And we try hard to remember the user's updated_at, and created_at
+ # When she goes to /activate/activate_me
+ # Then she should be redirected to 'login'
+ # When she follows that redirect!
+ # Then she should see a notice message 'Signup complete!'
+ # And a user with login: 'reggie' should exist
+ # And the user should have login: 'reggie', and email: 'registered@example.com'
+ # And the user's activation_code should be nil
+ # And the user's activated_at should not be nil
+ # And she should not be logged in
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/tickets/features/177/3.feature b/vendor/gems/gems/cucumber-0.4.4/examples/tickets/features/177/3.feature
new file mode 100755
index 00000000..e3d88c96
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/tickets/features/177/3.feature
@@ -0,0 +1,18 @@
+Feature: Matt's example with a comment before a step
+
+Scenario: Upload an image for an artist and create a concert in the process
+ Given I am logged in to my account
+ And there is one Artist named "Pixies"
+ And there is one Venue
+ When I visit the page for the Artist
+ And I follow "add a photo"
+ And I upload an Image
+ # Search on select concert page
+ And I press "Search Pixies concerts"
+ And I follow "Add a new Concert"
+ And I fill in new Concert information
+ And I press "Preview"
+ And I press "Add concert"
+ # No artists appear in this photo
+ And I press "Submit"
+ Then my Concert should exist with 1 Image
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/tickets/features/180.feature b/vendor/gems/gems/cucumber-0.4.4/examples/tickets/features/180.feature
new file mode 100755
index 00000000..2bd0425e
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/tickets/features/180.feature
@@ -0,0 +1,7 @@
+Feature: Cucumber command line
+ In order to write better software
+ Developers should be able to execute requirements as tests
+
+
+ Scenario: Pending Scenario at the end of a file with whitespace after it
+
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/tickets/features/229/tagged_hooks.feature b/vendor/gems/gems/cucumber-0.4.4/examples/tickets/features/229/tagged_hooks.feature
new file mode 100755
index 00000000..35384e27
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/tickets/features/229/tagged_hooks.feature
@@ -0,0 +1,8 @@
+Feature: Tagged hooks
+ In order to provide more flexible setups
+ I should be able to specify exactly
+ where hooks are executed
+
+ @i_am_so_special
+ Scenario: Yes I am
+ When special me goes to town
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/tickets/features/229/tagged_hooks.rb b/vendor/gems/gems/cucumber-0.4.4/examples/tickets/features/229/tagged_hooks.rb
new file mode 100755
index 00000000..110c34a3
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/tickets/features/229/tagged_hooks.rb
@@ -0,0 +1,14 @@
+require 'spec/expectations'
+
+Before('@i_am_so_special') do
+ @something_special = 10
+end
+
+After('@i_am_so_special') do
+ @something_special.should == 20
+end
+
+When /special me goes to town/ do
+ @something_special.should == 10
+ @something_special = 20
+end
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/tickets/features/236.feature b/vendor/gems/gems/cucumber-0.4.4/examples/tickets/features/236.feature
new file mode 100755
index 00000000..9d317719
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/tickets/features/236.feature
@@ -0,0 +1,13 @@
+Feature: Unsubstituted argument placeholder
+
+ Scenario Outline: See Annual Leave Details (as Management & Human Resource)
+ Given the following users exist in the system
+ | name | email | role_assignments | group_memberships |
+ | Jane | jane@fmail.com | | Sales (manager) |
+ | Max | max@fmail.com | | Sales (member) |
+ | Carol | carol@fmail.com | | Sales (member) |
+ | Cat | cat@fmail.com | | |
+
+ Examples:
+ | role |
+ | HUMAN RESOURCE |
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/tickets/features/241.feature b/vendor/gems/gems/cucumber-0.4.4/examples/tickets/features/241.feature
new file mode 100755
index 00000000..ec6bf2fc
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/tickets/features/241.feature
@@ -0,0 +1,13 @@
+Users want to use cucumber, so tests are necessary to verify
+it is all working as expected
+
+Feature: Using the Console Formatter
+ In order to verify this error
+ I want to run this feature using the progress format
+ So that it can be fixed
+
+ Scenario: A normal feature
+ Given I have a pending step
+ When I run this feature with the progress format
+ Then I should get a no method error for 'backtrace_line'
+
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/tickets/features/246.feature b/vendor/gems/gems/cucumber-0.4.4/examples/tickets/features/246.feature
new file mode 100755
index 00000000..a93cb4d8
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/tickets/features/246.feature
@@ -0,0 +1,4 @@
+Feature: https://rspec.lighthouseapp.com/projects/16211/tickets/246-distorted-console-output-for-slightly-complicated-step-regexp-match
+
+Scenario: See "No Record(s) Found" for Zero Existing
+ Given no public holiday exists in the system
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/tickets/features/248.feature b/vendor/gems/gems/cucumber-0.4.4/examples/tickets/features/248.feature
new file mode 100755
index 00000000..fab67b39
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/tickets/features/248.feature
@@ -0,0 +1,11 @@
+Feature: pending method causes failure in Scenario Outlines
+
+ Scenario Outline: blah
+ Given this is pending until we fix it
+ Given context with
+ When action
+ Then outcome with
+
+ Examples:
+ | Stuff | Blah |
+ | Cheese | Pepper Jack |
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/tickets/features/270/back.feature b/vendor/gems/gems/cucumber-0.4.4/examples/tickets/features/270/back.feature
new file mode 100755
index 00000000..e4191604
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/tickets/features/270/back.feature
@@ -0,0 +1,14 @@
+Feature: Background
+ In for background to work properly
+ As a user
+ I want it to run transactionally and only once when I call an individual scenario
+
+Background:
+ Given plop
+
+Scenario: Barping
+ When I barp
+
+
+Scenario: Wibbling
+ When I wibble
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/tickets/features/270/back.steps.rb b/vendor/gems/gems/cucumber-0.4.4/examples/tickets/features/270/back.steps.rb
new file mode 100755
index 00000000..f1da125a
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/tickets/features/270/back.steps.rb
@@ -0,0 +1,14 @@
+require 'spec/expectations'
+
+Given /^plop$/ do
+ raise "Only one plop!" if @plop
+ @plop = true
+end
+
+When /^I barp$/ do
+ @plop.should == true
+end
+
+When /^I wibble$/ do
+ @plop.should == true
+end
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/tickets/features/272/hooks.feature b/vendor/gems/gems/cucumber-0.4.4/examples/tickets/features/272/hooks.feature
new file mode 100755
index 00000000..948109f4
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/tickets/features/272/hooks.feature
@@ -0,0 +1,26 @@
+@intentional_failure
+Feature: Hooks
+ In order to integrate with my complex environment
+ I need to check scenario status in an After block
+
+ @272_failed
+ Scenario: Failed
+ Given I fail
+
+ @272_undefined
+ Scenario: Undefined
+ Given I am undefined
+
+ @272_passed
+ Scenario: Passed
+ Given I pass
+
+ @272_outline
+ Scenario Outline: Should work too
+ Given
+
+ Examples:
+ | something |
+ | I fail |
+ | I am undefined |
+ | I pass |
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/tickets/features/272/hooks_steps.rb b/vendor/gems/gems/cucumber-0.4.4/examples/tickets/features/272/hooks_steps.rb
new file mode 100755
index 00000000..e89f25ec
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/tickets/features/272/hooks_steps.rb
@@ -0,0 +1,53 @@
+require 'spec/expectations'
+
+Given /^I fail$/ do
+ raise "BOOM (this is expected)"
+end
+
+Given /^I pass$/ do
+end
+
+module HookChecks
+ def check_failed(scenario)
+ scenario.should be_failed
+ scenario.should_not be_passed
+ scenario.exception.message.should == "BOOM (this is expected)"
+ end
+
+ def check_undefined(scenario)
+ scenario.should_not be_failed
+ scenario.should_not be_passed
+ end
+
+ def check_passed(scenario)
+ scenario.should_not be_failed
+ scenario.should be_passed
+ end
+end
+
+World(HookChecks)
+
+After('@272_failed') do |scenario|
+ check_failed(scenario)
+end
+
+After('@272_undefined') do |scenario|
+ check_undefined(scenario)
+end
+
+After('@272_passed') do |scenario|
+ check_passed(scenario)
+end
+
+counter = 0
+After('@272_outline') do |scenario|
+ case(counter)
+ when 0
+ check_failed(scenario)
+ when 1
+ check_undefined(scenario)
+ when 2
+ check_passed(scenario)
+ end
+ counter +=1
+end
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/tickets/features/279/py_string_indent.feature b/vendor/gems/gems/cucumber-0.4.4/examples/tickets/features/279/py_string_indent.feature
new file mode 100755
index 00000000..59ab03d7
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/tickets/features/279/py_string_indent.feature
@@ -0,0 +1,25 @@
+Feature: pystring indentaion testcase
+
+ Scenario: example of correct indentation
+ Given multiline string
+ """
+ I'm a cucumber and I'm ok
+ I sleep all night and test all day
+ """
+ Then string is
+ """
+ I'm a cucumber and I'm ok
+ I sleep all night and test all day
+ """
+
+ Scenario: example of wrong indentation
+ Given I am in tickets/features/279
+ When I run cucumber -q wrong.feature_
+ Then it should fail with
+ """
+
+ """
+ And STDERR should match
+ """
+ wrong.feature_:8:10: Parse error
+ """
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/tickets/features/279/py_string_indent.steps.rb b/vendor/gems/gems/cucumber-0.4.4/examples/tickets/features/279/py_string_indent.steps.rb
new file mode 100755
index 00000000..75ad3be8
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/tickets/features/279/py_string_indent.steps.rb
@@ -0,0 +1,12 @@
+require 'spec/expectations'
+
+require File.dirname(__FILE__) + '/../../../../features/step_definitions/cucumber_steps.rb'
+require File.dirname(__FILE__) + '/../../../../features/support/env.rb'
+
+Given /^multiline string$/ do |string|
+ @string = string
+end
+
+Then /^string is$/ do |string|
+ @string.should == string
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/tickets/features/279/wrong.feature_ b/vendor/gems/gems/cucumber-0.4.4/examples/tickets/features/279/wrong.feature_
new file mode 100755
index 00000000..3b4c3c26
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/tickets/features/279/wrong.feature_
@@ -0,0 +1,11 @@
+Feature: pystring indentaion testcase
+
+ Scenario: example of wrong indentation
+ Given multiline string
+
+
+
+ """
+ I'm a cucumber and I'm ok
+ I sleep all night and test all day
+ """
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/tickets/features/301/filter_background_tagged_hooks.feature b/vendor/gems/gems/cucumber-0.4.4/examples/tickets/features/301/filter_background_tagged_hooks.feature
new file mode 100755
index 00000000..0c36947e
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/tickets/features/301/filter_background_tagged_hooks.feature
@@ -0,0 +1,6 @@
+Feature https://rspec.lighthouseapp.com/projects/16211/tickets/301
+ Background: A background
+ Given whatever
+
+ Scenario: VB is not cool
+ Then VB should not be cool
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/tickets/features/301/filter_background_tagged_hooks_steps.rb b/vendor/gems/gems/cucumber-0.4.4/examples/tickets/features/301/filter_background_tagged_hooks_steps.rb
new file mode 100755
index 00000000..16d2e377
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/tickets/features/301/filter_background_tagged_hooks_steps.rb
@@ -0,0 +1,12 @@
+require 'spec/expectations'
+
+Before('@nothing_has_this_tag') do
+ @vb = :cool
+end
+
+Given /^whatever$/ do
+end
+
+Then /^VB should not be cool$/ do
+ @vb.should_not == :cool
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/tickets/features/306/only_background.feature b/vendor/gems/gems/cucumber-0.4.4/examples/tickets/features/306/only_background.feature
new file mode 100755
index 00000000..fb1f322b
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/tickets/features/306/only_background.feature
@@ -0,0 +1,4 @@
+Feature: woo yeah
+
+ Background:
+ Given passing step without a table
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/tickets/features/lib/eatting_machine.rb b/vendor/gems/gems/cucumber-0.4.4/examples/tickets/features/lib/eatting_machine.rb
new file mode 100755
index 00000000..4b6e7c65
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/tickets/features/lib/eatting_machine.rb
@@ -0,0 +1,18 @@
+class EattingMachine
+
+ attr_reader :fruit_total, :belly_count
+ attr_accessor :belly_count
+
+ def initialize(fruit_name, fruit_total)
+ @fruit_name = fruit_name
+ @fruit_total = fruit_total.to_i
+ @belly_count = 0
+ end
+
+ def eat(count)
+ count = count.to_i
+ @fruit_total = @fruit_total - count
+ @belly_count += count
+ end
+
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/tickets/features/lib/pantry.rb b/vendor/gems/gems/cucumber-0.4.4/examples/tickets/features/lib/pantry.rb
new file mode 100755
index 00000000..e330a742
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/tickets/features/lib/pantry.rb
@@ -0,0 +1,20 @@
+class Pantry
+
+ def initialize
+ @items = {}
+ end
+
+ def add(food_name, count)
+ @items[food_name] ||= 0
+ @items[food_name] += count.to_i
+ end
+
+ def remove(food_name, count)
+ @items[food_name] -= count.to_i
+ end
+
+ def count(food_name)
+ @items[food_name]
+ end
+
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/tickets/features/scenario_outline.feature b/vendor/gems/gems/cucumber-0.4.4/examples/tickets/features/scenario_outline.feature
new file mode 100755
index 00000000..e9030e6c
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/tickets/features/scenario_outline.feature
@@ -0,0 +1,95 @@
+Feature: Outlines
+ In order to re-use scenario table values
+ As a citizen of Cucumbia
+ I want to explicitly mark the parameters in a scenario outline
+
+ Scenario Outline: controlling order
+ Given there are cucumbers
+ When I eat cucumbers
+ Then I should have cucumbers
+
+ Examples:
+ | left | start | eat |
+ | 7 | 12 | 5 |
+ | 15 | 20 | 5 |
+
+ Scenario Outline: reusing place holder
+ Given there are cucumbers
+ When I eat cucumbers
+ Then I should have cucumbers
+ And I should have cucumbers in my belly
+
+ Examples: Lots of cukes
+ | start | eat | left |
+ | 12 | 5 | 7 |
+ | 20 | 5 | 15 |
+
+ Examples: Ridiculous amounts of cukes
+ | start | eat | left |
+ | 120 | 50 | 70 |
+ | 200 | 50 | 150 |
+
+ Scenario Outline: no placeholders
+ Given there are 12 cucumbers
+ When I eat 5 cucumbers
+ Then I should have 7 cucumbers
+
+ Examples:
+ | start | eat | left |
+ | 12 | 5 | 7 |
+ | 20 | 5 | 15 |
+
+ Scenario Outline: using '<' and '>' not as placeholder
+ Given the belly space is < 12 and > 6
+ And there are cucumbers
+ When I eat cucumbers
+ Then I should have cucumbers
+
+ Examples:
+ | start | eat | left |
+ | 12 | 5 | 7 |
+ | 20 | 5 | 15 |
+
+ Scenario Outline: with step tables
+ Given I have the following fruits in my pantry
+ | name | quantity |
+ | cucumbers | 10 |
+ | strawberrys | 5 |
+ | apricots | 7 |
+
+ When I eat from the pantry
+ Then I should have in the pantry
+
+ Examples:
+ | number | fruits | left |
+ | 2 | cucumbers | 8 |
+ | 4 | strawberrys| 1 |
+ | 2 | apricots | 5 |
+
+ Scenario Outline: placeholder in a multiline string
+ Given my shopping list
+ """
+ Must buy some
+ """
+ Then my shopping list should equal
+ """
+ Must buy some cucumbers
+ """
+
+ Examples:
+ | fruits |
+ | cucumbers |
+
+ Scenario Outline: placeholder in step table
+ Given I have the following fruits in my pantry
+ | name | quantity |
+ | cucumbers | |
+ | strawberrys | |
+
+ When I eat from the pantry
+ Then I should have in the pantry
+
+ Examples:
+ | quant_cukes | quant_straw | number | fruits | left |
+ | 10 | 5 | 2 | cucumbers | 8 |
+ | 5 | 5 | 4 | strawberrys | 1 |
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/tickets/features/step_definitons/246_steps.rb b/vendor/gems/gems/cucumber-0.4.4/examples/tickets/features/step_definitons/246_steps.rb
new file mode 100755
index 00000000..4cc3f080
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/tickets/features/step_definitons/246_steps.rb
@@ -0,0 +1,3 @@
+Given /^no ([a-z]+(?: [a-z]+)*) exists in the system$/ do |resource|
+ resource.should == "public holiday"
+end
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/tickets/features/step_definitons/248_steps.rb b/vendor/gems/gems/cucumber-0.4.4/examples/tickets/features/step_definitons/248_steps.rb
new file mode 100755
index 00000000..7a142980
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/tickets/features/step_definitons/248_steps.rb
@@ -0,0 +1,15 @@
+Given /^this is pending until we fix it$/ do
+ pending
+end
+
+Given /^context with Cheese$/ do
+ pending
+end
+
+When /^action$/ do
+ pending
+end
+
+Then /^outcome with Pepper Jack$/ do
+ pending
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/tickets/features/step_definitons/scenario_outline_steps.rb b/vendor/gems/gems/cucumber-0.4.4/examples/tickets/features/step_definitons/scenario_outline_steps.rb
new file mode 100755
index 00000000..ebda51a0
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/tickets/features/step_definitons/scenario_outline_steps.rb
@@ -0,0 +1,42 @@
+Given /^there are (\d+) (\w+)$/ do |count, fruit|
+ @eattingMachine = EattingMachine.new(fruit, count)
+end
+
+Given "the belly space is < 12 and > 6" do
+end
+
+Given "I have the following fruits in my pantry" do |pantry_table|
+ @pantry = Pantry.new
+ pantry_table.hashes.each do |item|
+ @pantry.add(item['name'].downcase, item['quantity'])
+ end
+end
+
+Given "my shopping list" do |list|
+ @shopping_list = list
+end
+
+When /^I eat (\d+) (\w+)$/ do |count, fruit|
+ @eattingMachine.eat(count)
+ @eattingMachine.belly_count = count.to_i
+end
+
+When /^I eat (\d+) (\w+) from the pantry$/ do |count, fruit|
+ @pantry.remove(fruit, count.to_i)
+end
+
+Then /^I should have (\d+) (\w+)$/ do |count, fruit|
+ @eattingMachine.fruit_total.should == count.to_i
+end
+
+Then /^I should have (\d+) (\w+) in my belly$/ do |count, fruit|
+ @eattingMachine.belly_count.should == count.to_i
+end
+
+Then /^I should have (\d+) (\w+) in the pantry$/ do |count, fruit|
+ @pantry.count(fruit).should == count.to_i
+end
+
+Then /^my shopping list should equal$/ do |list|
+ @shopping_list.should == list
+end
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/tickets/features/step_definitons/tickets_steps.rb b/vendor/gems/gems/cucumber-0.4.4/examples/tickets/features/step_definitons/tickets_steps.rb
new file mode 100755
index 00000000..e8089465
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/tickets/features/step_definitons/tickets_steps.rb
@@ -0,0 +1,81 @@
+require 'spec/expectations'
+
+Given "be_empty" do
+ [1,2].should_not be_empty
+end
+
+Given "nested step is called" do
+ Given "I like mushroom", Cucumber::Ast::Table.new([
+ %w{sponge bob},
+ %w{is cool}
+ ])
+end
+
+Given 'nested step is called using text table' do
+ Given "I like mushroom", table(%{
+ | sponge | bob |
+ | is | cool |
+ })
+
+ # Alternative syntax (file and line will be reported on parse error)
+ # Given "I like mushroom", table(<<-EOT, __FILE__, __LINE__)
+ # | sponge | bob |
+ # | is | cool
+ # EOT
+end
+
+Given "I like $what" do |what, table|
+ @magic = what
+ @tool = table.raw[0][0]
+end
+
+Then "nested step should be executed" do
+ @magic.should == 'mushroom'
+ @tool.should == 'sponge'
+end
+
+Given /^the following table$/ do |table|
+ @table = table
+end
+
+Then /^I should be (\w+) in (\w+)$/ do |key, value|
+ hash = @table.hashes[0]
+ hash[key].should == value
+end
+
+Then /^I should see a multiline string like$/ do |s|
+ s.should == %{A string
+that spans
+several lines}
+end
+
+Given /^the following users exist in the system$/ do |table|
+ table.hashes[0][:role_assignments].should == 'HUMAN RESOURCE'
+end
+
+Given /^I have a pending step$/ do
+ pending
+end
+
+When /^I run this feature with the progress format$/ do
+ pending
+end
+
+Then /^I should get a no method error for 'backtrace_line'$/ do
+ pending
+end
+
+Then /the table should be different with table:/ do |expected|
+ expected.diff!(table(%{
+ | b | c | a | d |
+ | KASHA | AIIT | BOOYA | X |
+ | four | five | three | Y |
+ }), :coldiff => true)
+end
+
+Then /the table should be different with array:/ do |expected|
+ expected.diff!([
+ {'a' => 'BOOYA', 'b' => 'KASHA'},
+ {'a' => 'three', 'b' => 'four'},
+ ])
+end
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/tickets/features/table_diffing.feature b/vendor/gems/gems/cucumber-0.4.4/examples/tickets/features/table_diffing.feature
new file mode 100755
index 00000000..f68cae6e
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/tickets/features/table_diffing.feature
@@ -0,0 +1,13 @@
+@intentional_failure
+Feature: Tables
+ Scenario: Extra row with table
+ Then the table should be different with table:
+ | a | b |
+ | one | two |
+ | three | four |
+
+ Scenario: Extra row and missing column with table
+ Then the table should be different with table:
+ | a | e | b |
+ | one | Q | two |
+ | three | R | four |
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/tickets/features/tickets.feature b/vendor/gems/gems/cucumber-0.4.4/examples/tickets/features/tickets.feature
new file mode 100755
index 00000000..45f2abfc
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/tickets/features/tickets.feature
@@ -0,0 +1,28 @@
+Feature: Cucumber
+ In order to have a happy user base
+ As a Cucumber user
+ I don't want no stinkin bugs
+
+ Scenario: RSpec be_*
+ Given be_empty
+
+ Scenario: Call step from step
+ Given nested step is called
+ Then nested step should be executed
+
+ Scenario: Call step from step using text table
+ Given nested step is called using text table
+ Then nested step should be executed
+
+ Scenario: Reading a table
+ Given the following table
+ | born | working |
+ | Oslo | London |
+ Then I should be working in London
+ And I should be born in Oslo
+ And I should see a multiline string like
+ """
+ A string
+ that spans
+ several lines
+ """
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/watir/README.textile b/vendor/gems/gems/cucumber-0.4.4/examples/watir/README.textile
new file mode 100755
index 00000000..6e4a6f73
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/watir/README.textile
@@ -0,0 +1,16 @@
+Here you'll find examples for Watir, FireWatir, SafariWatir and Celerity.
+All of these browser libraries have the same API, so the example code will
+work with all of them.
+
+Just run with:
+
+ rake cucumber
+
+This will use Watir/IE if you're on Windows, and SafariWatir/Safari if you're on OS X.
+You can force the use of FireWatir/Firefox on any platform like this:
+
+ rake features FIREWATIR=true
+
+And finally, you can use Celerity by running in JRuby:
+
+ jruby -S rake cucumber
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/watir/Rakefile b/vendor/gems/gems/cucumber-0.4.4/examples/watir/Rakefile
new file mode 100755
index 00000000..600204b2
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/watir/Rakefile
@@ -0,0 +1,10 @@
+$:.unshift(File.dirname(__FILE__) + '/../../lib')
+require 'cucumber/rake/task'
+
+Cucumber::Rake::Task.new do |t|
+ t.cucumber_opts = %w{--format pretty}
+end
+
+Cucumber::Rake::Task.new(:cucumber_screenshot) do |t|
+ t.cucumber_opts = %w{--format html --out report.html}
+end
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/watir/features/search.feature b/vendor/gems/gems/cucumber-0.4.4/examples/watir/features/search.feature
new file mode 100755
index 00000000..708fc97e
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/watir/features/search.feature
@@ -0,0 +1,12 @@
+Feature: Search
+ In order to learn more
+ As an information seeker
+ I want to find more information
+
+ Scenario: Find what I'm looking for
+ Given I am on the Google search page
+ When I search for "cucumber github"
+ Then I should see
+ """
+ BDD that talks to domain experts first and code second
+ """
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/watir/features/step_definitions/search_steps.rb b/vendor/gems/gems/cucumber-0.4.4/examples/watir/features/step_definitions/search_steps.rb
new file mode 100755
index 00000000..84211519
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/watir/features/step_definitions/search_steps.rb
@@ -0,0 +1,26 @@
+# Full Watir API: http://wtr.rubyforge.org/rdoc/
+# Full RSpec API: http://rspec.rubyforge.org/
+
+Given 'I am on the Google search page' do
+ @browser.goto 'http://www.google.com/'
+end
+
+When /I search for "(.*)"/ do |query|
+ @browser.text_field(:name, 'q').set(query)
+ @browser.button(:name, 'btnG').click
+end
+
+Then /I should see/ do |text|
+ @browser.text.should =~ /#{text}/m
+end
+
+# To avoid step definitions that are tightly coupled to your user interface,
+# consider creating classes for your pages - such as this:
+# http://github.com/aslakhellesoy/cucumber/tree/v0.1.15/examples/watir/features/step_definitons/search_steps.rb
+#
+# You may keep the page classes along your steps, or even better, put them in separate files, e.g.
+# support/pages/google_search.rb
+#
+# This technique is called "Page Objects", and you can read more about it here:
+# http://github.com/marekj/watirloo/tree/master
+# We're not using this technique here, since we want to illustrate the basics only.
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/watir/features/support/env.rb b/vendor/gems/gems/cucumber-0.4.4/examples/watir/features/support/env.rb
new file mode 100755
index 00000000..2bb40fe6
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/watir/features/support/env.rb
@@ -0,0 +1,32 @@
+require 'spec/expectations'
+
+if ENV['FIREWATIR']
+ require 'firewatir'
+ Browser = FireWatir::Firefox
+else
+ case RUBY_PLATFORM
+ when /darwin/
+ require 'safariwatir'
+ Browser = Watir::Safari
+ when /win32|mingw/
+ require 'watir'
+ Browser = Watir::IE
+ when /java/
+ require 'celerity'
+ Browser = Celerity::Browser
+ else
+ raise "This platform is not supported (#{PLATFORM})"
+ end
+end
+
+# "before all"
+browser = Browser.new
+
+Before do
+ @browser = browser
+end
+
+# "after all"
+at_exit do
+ browser.close
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/watir/features/support/screenshots.rb b/vendor/gems/gems/cucumber-0.4.4/examples/watir/features/support/screenshots.rb
new file mode 100755
index 00000000..15926adf
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/watir/features/support/screenshots.rb
@@ -0,0 +1,44 @@
+# This is an example of how you can set up screenshots for your
+# browser testing. Just run cucumber with --format html --out report.html
+#
+# This examples currently only works on OS X, but adding support for other
+# platform should be easy - as long as there is a command line tool to take
+# a picture of the desktop.
+module Screenshots
+ def add_screenshot
+ id = "screenshot-#{Time.new.to_i}"
+ take_screenshot(id)
+ embed("#{id}.png", "image/png")
+ end
+
+ if Cucumber::OS_X
+ def take_screenshot(id)
+ `screencapture -t png #{id}.png`
+ end
+ else
+ # Other platforms...
+ def take_screenshot(id)
+ STDERR.puts "Sorry - no screenshots on your platform yet."
+ end
+ end
+end
+
+After do
+ add_screenshot
+end
+
+# Other variants
+#
+# Only take screenshot on failures
+#
+# After do |scenario|
+# add_screenshot if scenario.failed?
+# end
+#
+# Only take screenshot for scenarios or features tagged @screenshot
+#
+# After(@screenshot) do
+# add_screenshot
+# end
+
+World(Screenshots)
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/webrat/features/search.feature b/vendor/gems/gems/cucumber-0.4.4/examples/webrat/features/search.feature
new file mode 100755
index 00000000..625dcf7d
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/webrat/features/search.feature
@@ -0,0 +1,12 @@
+Feature: Search
+ In order to learn more
+ As an information seeker
+ I want to find more information
+
+ Scenario: Find what I'm looking for
+ Given I am on the Kvasir search page
+ When I search for "cucumber github"
+ Then I should see
+ """
+ BDD that talks to domain experts first and code second
+ """
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/webrat/features/step_definitions/kvasir_steps.rb b/vendor/gems/gems/cucumber-0.4.4/examples/webrat/features/step_definitions/kvasir_steps.rb
new file mode 100755
index 00000000..59ff5ed2
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/webrat/features/step_definitions/kvasir_steps.rb
@@ -0,0 +1,14 @@
+# Google is too hard to script with Mechanize
+# Using a Norewgian search engine instead :-)
+Given /^I am on the Kvasir search page$/ do
+ visit('http://www.kvasir.no/')
+end
+
+When /^I search for "([^\"]*)"$/ do |query|
+ fill_in('q', :with => query)
+ click_button('sokeKnapp')
+end
+
+Then /^I should see$/ do |text|
+ response_body.should contain(text)
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/examples/webrat/features/support/env.rb b/vendor/gems/gems/cucumber-0.4.4/examples/webrat/features/support/env.rb
new file mode 100755
index 00000000..5e653f75
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/examples/webrat/features/support/env.rb
@@ -0,0 +1,17 @@
+require 'webrat'
+require 'spec'
+
+Webrat.configure do |config|
+ config.mode = :mechanize
+end
+
+class WebratWorld
+ include Spec::Matchers
+ include Webrat::Methods
+ include Webrat::Matchers
+end
+
+World do
+ WebratWorld.new
+end
+
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/features/announce.feature b/vendor/gems/gems/cucumber-0.4.4/features/announce.feature
new file mode 100755
index 00000000..8e4b5e04
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/features/announce.feature
@@ -0,0 +1,122 @@
+Feature: Delayed announcement
+
+ Background:
+ Given a standard Cucumber project directory structure
+ And a file named "features/step_definitions/steps.rb" with:
+ """
+ Given /^I use announce with text "(.*)"$/ do |ann|
+ announce(ann)
+ end
+
+ Given /^I use multiple announces$/ do
+ announce("Multiple")
+ announce("Announce")
+ end
+
+ Given /^I use announcement (.+) in line (.+) (?:with result (.+))$/ do |ann, line, result|
+ announce("Last announcement") if line == "3"
+ announce("Line: #{line}: #{ann}")
+ fail if result =~ /fail/i
+ end
+
+ Given /^I use announce and step fails$/ do
+ announce("Announce with fail")
+ fail
+ end
+
+ Given /^this step works$/ do
+ end
+ """
+ And a file named "features/f.feature" with:
+ """
+ Scenario: S
+ Given I use announce with text "Ann"
+ And this step works
+
+ Scenario: S2
+ Given I use multiple announces
+ And this step works
+
+ Scenario Outline: S3
+ Given I use announcement in line
+
+ Examples:
+ | line | ann |
+ | 1 | anno1 |
+ | 2 | anno2 |
+ | 3 | anno3 |
+
+ Scenario: S4
+ Given I use announce and step fails
+ And this step works
+
+ Scenario Outline: s5
+ Given I use announcement in line with result
+
+ Examples:
+ | line | ann | result |
+ | 1 | anno1 | fail |
+ | 2 | anno2 | pass |
+ """
+
+ Scenario: Delayed announcements feature
+ When I run cucumber --format pretty features/f.feature
+ Then the output should contain
+ """
+ Scenario: S # features/f.feature:1
+ Given I use announce with text "Ann" # features/step_definitions/steps.rb:1
+ Ann
+ And this step works # features/step_definitions/steps.rb:21
+
+ Scenario: S2 # features/f.feature:5
+ Given I use multiple announces # features/step_definitions/steps.rb:5
+ Multiple
+ Announce
+ And this step works # features/step_definitions/steps.rb:21
+
+ Scenario Outline: S3 # features/f.feature:9
+ Given I use announcement in line # features/f.feature:10
+
+ Examples:
+ | line | ann |
+ | 1 | anno1 |
+ | 2 | anno2 |
+ | 3 | anno3 |
+
+ Scenario: S4 # features/f.feature:18
+ Given I use announce and step fails # features/step_definitions/steps.rb:16
+ Announce with fail
+ (RuntimeError)
+ ./features/step_definitions/steps.rb:18:in `/^I use announce and step fails$/'
+ features/f.feature:19:in `Given I use announce and step fails'
+ And this step works # features/step_definitions/steps.rb:21
+
+ Scenario Outline: s5 # features/f.feature:22
+ Given I use announcement in line with result # features/step_definitions/steps.rb:10
+
+ Examples:
+ | line | ann | result |
+ | 1 | anno1 | fail | Line: 1: anno1
+ (RuntimeError)
+ ./features/step_definitions/steps.rb:13:in `/^I use announcement (.+) in line (.+) (?:with result (.+))$/'
+ features/f.feature:23:in `Given I use announcement in line with result '
+ | 2 | anno2 | pass | Line: 2: anno2
+"""
+
+ Scenario: Non-delayed announcements feature (progress formatter)
+ When I run cucumber --format progress features/f.feature
+ Then the output should contain
+ """
+Ann
+..
+Multiple
+
+Announce
+..-UUUUUU
+Announce with fail
+F--
+Line: 1: anno1
+FFF
+Line: 2: anno2
+...
+"""
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/features/background.feature b/vendor/gems/gems/cucumber-0.4.4/features/background.feature
new file mode 100755
index 00000000..e362de27
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/features/background.feature
@@ -0,0 +1,308 @@
+Feature: backgrounds
+ In order to provide a context to my scenarios within a feature
+ As a feature editor
+ I want to write a background section in my features.
+
+ Scenario: run a specific scenario with a background
+ When I run cucumber -q features/background/passing_background.feature:9 --require features
+ Then it should pass with
+ """
+ Feature: Passing background sample
+
+ Background:
+ Given '10' cukes
+
+ Scenario: another passing background
+ Then I should have '10' cukes
+
+ 1 scenario (1 passed)
+ 2 steps (2 passed)
+
+ """
+
+ Scenario: run a feature with a background that passes
+ When I run cucumber -q features/background/passing_background.feature --require features
+ Then it should pass with
+ """
+ Feature: Passing background sample
+
+ Background:
+ Given '10' cukes
+
+ Scenario: passing background
+ Then I should have '10' cukes
+
+ Scenario: another passing background
+ Then I should have '10' cukes
+
+ 2 scenarios (2 passed)
+ 4 steps (4 passed)
+
+ """
+
+ Scenario: run a feature with scenario outlines that has a background that passes
+ When I run cucumber -q features/background/scenario_outline_passing_background.feature --require features
+ Then it should pass with
+ """
+ Feature: Passing background with scenario outlines sample
+
+ Background:
+ Given '10' cukes
+
+ Scenario Outline: passing background
+ Then I should have '' cukes
+
+ Examples:
+ | count |
+ | 10 |
+
+ Scenario Outline: another passing background
+ Then I should have '' cukes
+
+ Examples:
+ | count |
+ | 10 |
+
+ 2 scenarios (2 passed)
+ 4 steps (4 passed)
+
+ """
+
+ Scenario: run a feature with scenario outlines that has a background that passes
+ When I run cucumber -q features/background/background_tagged_before_on_outline.feature --require features
+ Then it should pass with
+ """
+ @background_tagged_before_on_outline
+ Feature: Background tagged Before on Outline
+
+ Background:
+ Given passing without a table
+
+ Scenario Outline: passing background
+ Then I should have '' cukes
+
+ Examples:
+ | count |
+ | 888 |
+
+ 1 scenario (1 passed)
+ 2 steps (2 passed)
+
+ """
+
+ Scenario: run a feature with a background that fails
+ When I run cucumber -q features/background/failing_background.feature --require features
+ Then it should fail with
+ """
+ @after_file
+ Feature: Failing background sample
+
+ Background:
+ Given failing without a table
+ FAIL (RuntimeError)
+ ./features/step_definitions/sample_steps.rb:2:in `flunker'
+ ./features/step_definitions/sample_steps.rb:16:in `/^failing without a table$/'
+ features/background/failing_background.feature:5:in `Given failing without a table'
+ And '10' cukes
+
+ Scenario: failing background
+ Then I should have '10' cukes
+
+ Scenario: another failing background
+ Then I should have '10' cukes
+
+ Failing Scenarios:
+ cucumber features/background/failing_background.feature:8 # Scenario: failing background
+
+ 2 scenarios (1 failed, 1 skipped)
+ 6 steps (1 failed, 5 skipped)
+
+ """
+ And "examples/self_test/tmp/after.txt" should exist
+
+ Scenario: run a feature with scenario outlines that has a background that fails
+ When I run cucumber -q features/background/scenario_outline_failing_background.feature --require features
+ Then it should fail with
+ """
+ Feature: Failing background with scenario outlines sample
+
+ Background:
+ Given failing without a table
+ FAIL (RuntimeError)
+ ./features/step_definitions/sample_steps.rb:2:in `flunker'
+ ./features/step_definitions/sample_steps.rb:16:in `/^failing without a table$/'
+ features/background/scenario_outline_failing_background.feature:4:in `Given failing without a table'
+
+ Scenario Outline: failing background
+ Then I should have '' cukes
+
+ Examples:
+ | count |
+ | 10 |
+
+ Scenario Outline: another failing background
+ Then I should have '' cukes
+
+ Examples:
+ | count |
+ | 10 |
+
+ 2 scenarios (1 failed, 1 skipped)
+ 4 steps (1 failed, 3 skipped)
+
+ """
+
+ Scenario: run a feature with a background that is pending
+ When I run cucumber -q features/background/pending_background.feature --require features
+ Then it should pass with
+ """
+ Feature: Pending background sample
+
+ Background:
+ Given pending
+
+ Scenario: pending background
+ Then I should have '10' cukes
+
+ Scenario: another pending background
+ Then I should have '10' cukes
+
+ 2 scenarios (2 undefined)
+ 4 steps (2 skipped, 2 undefined)
+
+ """
+
+ Scenario: background passes with first scenario but fails with second
+ When I run cucumber -q features/background/failing_background_after_success.feature --require features
+ Then it should fail with
+ """
+ Feature: Failing background after previously successful background sample
+
+ Background:
+ Given passing without a table
+ And '10' global cukes
+
+ Scenario: passing background
+ Then I should have '10' global cukes
+
+ Scenario: failing background
+ And '10' global cukes
+ FAIL (RuntimeError)
+ ./features/step_definitions/sample_steps.rb:2:in `flunker'
+ ./features/step_definitions/sample_steps.rb:37:in `/^'(.+)' global cukes$/'
+ features/background/failing_background_after_success.feature:5:in `And '10' global cukes'
+ Then I should have '10' global cukes
+
+ Failing Scenarios:
+ cucumber features/background/failing_background_after_success.feature:10 # Scenario: failing background
+
+ 2 scenarios (1 failed, 1 passed)
+ 6 steps (1 failed, 1 skipped, 4 passed)
+
+ """
+
+ Scenario: background with multline args
+ When I run cucumber -q features/background/multiline_args_background.feature --require features
+ Then it should pass with
+ """
+ Feature: Passing background with multiline args
+
+ Background:
+ Given table
+ | a | b |
+ | c | d |
+ And multiline string
+ \"\"\"
+ I'm a cucumber and I'm okay.
+ I sleep all night and I test all day
+ \"\"\"
+
+ Scenario: passing background
+ Then the table should be
+ | a | b |
+ | c | d |
+ Then the multiline string should be
+ \"\"\"
+ I'm a cucumber and I'm okay.
+ I sleep all night and I test all day
+ \"\"\"
+
+ Scenario: another passing background
+ Then the table should be
+ | a | b |
+ | c | d |
+ Then the multiline string should be
+ \"\"\"
+ I'm a cucumber and I'm okay.
+ I sleep all night and I test all day
+ \"\"\"
+
+ 2 scenarios (2 passed)
+ 8 steps (8 passed)
+
+ """
+
+ Scenario: background with name
+ When I run cucumber -q features/background/background_with_name.feature --require features
+ Then it should pass with
+ """
+ Feature: background with name
+
+ Background: I'm a background and I'm ok
+ Given '10' cukes
+
+ Scenario: example
+ Then I should have '10' cukes
+
+ 1 scenario (1 passed)
+ 2 steps (2 passed)
+
+ """
+
+ Scenario: https://rspec.lighthouseapp.com/projects/16211/tickets/329
+ Given a standard Cucumber project directory structure
+ And a file named "features/only_background_and_hooks.feature" with:
+ """
+ Feature: woo yeah
+
+ Background:
+ Given whatever
+
+ """
+ And a file named "features/only_background_and_hooks_steps.rb" with:
+ """
+ require 'spec/expectations'
+
+ Before do
+ $before = true
+ end
+
+ After do
+ $after = true
+ end
+
+ Given /^whatever$/ do
+ $before.should == true
+ $step = true
+ end
+
+ at_exit do
+ $before.should == true
+ $step.should == true
+ $after.should == true
+ end
+ """
+ When I run cucumber features/only_background_and_hooks.feature
+ Then it should pass
+ And the output should be
+ """
+ Feature: woo yeah
+
+ Background: # features/only_background_and_hooks.feature:3
+ Given whatever # features/only_background_and_hooks_steps.rb:11
+
+ 0 scenarios
+ 1 step (1 passed)
+
+ """
+ And STDERR should be empty
diff --git a/vendor/gems/gems/cucumber-0.4.4/features/bug_371.feature b/vendor/gems/gems/cucumber-0.4.4/features/bug_371.feature
new file mode 100755
index 00000000..f35d55d9
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/features/bug_371.feature
@@ -0,0 +1,32 @@
+Feature: https://rspec.lighthouseapp.com/projects/16211/tickets/371
+ Scenario: Before runs once
+ Given a standard Cucumber project directory structure
+ And a file named "features/f.feature" with:
+ """
+ Feature: F
+ Scenario: S
+ Given G
+ """
+ And a file named "features/step_definitions/steps.rb" with:
+ """
+ Before do
+ puts "B"
+ end
+ Given /G/ do
+ puts "G"
+ end
+ """
+ When I run cucumber -q --format pretty --format progress --out progress.txt features/f.feature
+ Then it should pass with
+ """
+ Feature: F
+
+ Scenario: S
+ B
+ G
+ Given G
+
+ 1 scenario (1 passed)
+ 1 step (1 passed)
+
+ """
diff --git a/vendor/gems/gems/cucumber-0.4.4/features/bug_464.feature b/vendor/gems/gems/cucumber-0.4.4/features/bug_464.feature
new file mode 100755
index 00000000..8c8571af
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/features/bug_464.feature
@@ -0,0 +1,16 @@
+Feature: https://rspec.lighthouseapp.com/projects/16211/tickets/464
+ Scenario: Limiting with tags which do not exist in the features
+ Given a standard Cucumber project directory structure
+ And a file named "features/f.feature" with:
+ """
+ Feature: Test
+ In order to test
+ As a tester
+ I want to test
+
+ @tag
+ Scenario: Testing
+ Given I'm a test
+ """
+ When I run cucumber -q features/f.feature --tag @i_dont_exist
+ Then it should pass
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/features/bug_475.feature b/vendor/gems/gems/cucumber-0.4.4/features/bug_475.feature
new file mode 100755
index 00000000..1431dbec
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/features/bug_475.feature
@@ -0,0 +1,43 @@
+Feature: https://rspec.lighthouseapp.com/projects/16211/tickets/475
+ Scenario: error on pystring in scenario outline with pretty formatter
+ Given a standard Cucumber project directory structure
+ And a file named "features/f.feature" with:
+ """
+ Feature: F
+ Scenario Outline: S
+ Given a multiline string:
+ \"\"\"
+ hello
+ \"\"\"
+ Examples:
+ | who |
+ | aslak |
+ | david |
+ """
+ And a file named "features/step_definitions/steps.rb" with:
+ """
+ Given /a multiline string:/ do |s|
+ s.should =~ /hello (\w+)/
+ end
+ """
+ When I run cucumber features/f.feature
+ Then STDERR should be empty
+ And it should pass with
+ """
+ Feature: F
+
+ Scenario Outline: S # features/f.feature:2
+ Given a multiline string: # features/step_definitions/steps.rb:1
+ \"\"\"
+ hello
+ \"\"\"
+
+ Examples:
+ | who |
+ | aslak |
+ | david |
+
+ 2 scenarios (2 passed)
+ 2 steps (2 passed)
+
+ """
diff --git a/vendor/gems/gems/cucumber-0.4.4/features/call_many_steps.feature b/vendor/gems/gems/cucumber-0.4.4/features/call_many_steps.feature
new file mode 100755
index 00000000..cf290ef5
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/features/call_many_steps.feature
@@ -0,0 +1,124 @@
+Feature: http://gist.github.com/221223
+ In order to make it easier to extract several steps from
+ a feature file to a step definition I want to be able to
+ copy and paste.
+
+ Background:
+ Given a standard Cucumber project directory structure
+ And a file named "features/f.feature" with:
+ """
+ Feature: Test
+
+ Scenario: Multiline string
+ Given a multiline string:
+ \"\"\"
+ hello
+ world
+ \"\"\"
+
+ Scenario: Call a multiline string
+ Given I call a multiline string with MAMA
+
+ Scenario: Call a table
+ Given I call a table with MAMA
+ """
+ And a file named "features/step_definitions/steps.rb" with:
+ """
+ Given /^a multiline string:$/ do |s|
+ raise "I got multiline:\n#{s}"
+ end
+
+ Given /^a table:$/ do |t|
+ raise "I got table:\n#{t.raw.inspect}"
+ end
+
+ Given /^I call a multiline string with (.*)$/ do |s|
+ steps %Q{
+ Given a multiline string:
+ \"\"\"
+ hello
+ #{s}
+ \"\"\"
+ }
+ end
+
+ Given /^I call a table with (.*)$/ do |s|
+ steps %Q{
+ Given a table:
+ |a|b|
+ |c|#{s}|
+ }
+ end
+ """
+
+ Scenario: Multiline string
+ When I run cucumber features/f.feature:6
+ Then STDERR should be empty
+ And it should fail with
+ """
+ Feature: Test
+
+ Scenario: Multiline string # features/f.feature:3
+ Given a multiline string: # features/step_definitions/steps.rb:1
+ \"\"\"
+ hello
+ world
+ \"\"\"
+ I got multiline:
+ hello
+ world (RuntimeError)
+ ./features/step_definitions/steps.rb:2:in `/^a multiline string:$/'
+ features/f.feature:4:in `Given a multiline string:'
+
+ Failing Scenarios:
+ cucumber features/f.feature:3 # Scenario: Multiline string
+
+ 1 scenario (1 failed)
+ 1 step (1 failed)
+
+ """
+
+ Scenario: Call multiline string
+ When I run cucumber features/f.feature:10
+ Then STDERR should be empty
+ And it should fail with
+ """
+ Feature: Test
+
+ Scenario: Call a multiline string # features/f.feature:10
+ Given I call a multiline string with MAMA # features/step_definitions/steps.rb:9
+ I got multiline:
+ hello
+ MAMA (RuntimeError)
+ ./features/step_definitions/steps.rb:2:in `/^a multiline string:$/'
+ features/f.feature:11:in `Given I call a multiline string with MAMA'
+
+ Failing Scenarios:
+ cucumber features/f.feature:10 # Scenario: Call a multiline string
+
+ 1 scenario (1 failed)
+ 1 step (1 failed)
+
+ """
+
+ Scenario: Call table
+ When I run cucumber features/f.feature:13
+ Then STDERR should be empty
+ And it should fail with
+ """
+ Feature: Test
+
+ Scenario: Call a table # features/f.feature:13
+ Given I call a table with MAMA # features/step_definitions/steps.rb:19
+ I got table:
+ [["a", "b"], ["c", "MAMA"]] (RuntimeError)
+ ./features/step_definitions/steps.rb:6:in `/^a table:$/'
+ features/f.feature:14:in `Given I call a table with MAMA'
+
+ Failing Scenarios:
+ cucumber features/f.feature:13 # Scenario: Call a table
+
+ 1 scenario (1 failed)
+ 1 step (1 failed)
+
+ """
diff --git a/vendor/gems/gems/cucumber-0.4.4/features/cucumber_cli.feature b/vendor/gems/gems/cucumber-0.4.4/features/cucumber_cli.feature
new file mode 100755
index 00000000..7e9fde27
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/features/cucumber_cli.feature
@@ -0,0 +1,652 @@
+Feature: Cucumber command line
+ In order to write better software
+ Developers should be able to execute requirements as tests
+
+ Scenario: Run single scenario with missing step definition
+ When I run cucumber -q features/sample.feature:5
+ Then it should pass with
+ """
+ # Feature comment
+ @one
+ Feature: Sample
+
+ @two @three
+ Scenario: Missing
+ Given missing
+
+ 1 scenario (1 undefined)
+ 1 step (1 undefined)
+
+ """
+
+ Scenario: Fail with --strict
+ When I run cucumber -q features/sample.feature:5 --strict
+ Then it should fail with
+ """
+ # Feature comment
+ @one
+ Feature: Sample
+
+ @two @three
+ Scenario: Missing
+ Given missing
+ Undefined step: "missing" (Cucumber::Undefined)
+ features/sample.feature:7:in `Given missing'
+
+ 1 scenario (1 undefined)
+ 1 step (1 undefined)
+
+ """
+
+ Scenario: Succeed with --strict
+ When I run cucumber -q features/sample.feature:10 --strict
+ Then it should pass with
+ """
+ # Feature comment
+ @one
+ Feature: Sample
+
+ # Scenario comment
+ @three
+ Scenario: Passing
+ Given passing
+ | a | b |
+ | c | d |
+
+ 1 scenario (1 passed)
+ 1 step (1 passed)
+
+ """
+
+ Scenario: Specify 2 line numbers where one is a tag
+ When I run cucumber -q features/sample.feature:5:16
+ Then it should fail with
+ """
+ # Feature comment
+ @one
+ Feature: Sample
+
+ @two @three
+ Scenario: Missing
+ Given missing
+
+ @four
+ Scenario: Failing
+ Given failing
+ \"\"\"
+ hello
+ \"\"\"
+ FAIL (RuntimeError)
+ ./features/step_definitions/sample_steps.rb:2:in `flunker'
+ ./features/step_definitions/sample_steps.rb:9:in `/^failing$/'
+ features/sample.feature:18:in `Given failing'
+
+ Failing Scenarios:
+ cucumber features/sample.feature:17 # Scenario: Failing
+
+ 2 scenarios (1 failed, 1 undefined)
+ 2 steps (1 failed, 1 undefined)
+
+ """
+
+ Scenario: Require missing step definition from elsewhere
+ When I run cucumber -q -r ../../features/step_definitions/extra_steps.rb features/sample.feature:5
+ Then it should pass with
+ """
+ # Feature comment
+ @one
+ Feature: Sample
+
+ @two @three
+ Scenario: Missing
+ Given missing
+
+ 1 scenario (1 passed)
+ 1 step (1 passed)
+
+ """
+
+ Scenario: Specify the line number of a row
+ When I run cucumber -q features/sample.feature:12
+ Then it should pass with
+ """
+ # Feature comment
+ @one
+ Feature: Sample
+
+ # Scenario comment
+ @three
+ Scenario: Passing
+ Given passing
+ | a | b |
+ | c | d |
+
+ 1 scenario (1 passed)
+ 1 step (1 passed)
+
+ """
+
+ Scenario: Use @-notation to specify a file containing feature file list
+ When I run cucumber -q @list-of-features.txt
+ Then it should pass with
+ """
+ # Feature comment
+ @one
+ Feature: Sample
+
+ # Scenario comment
+ @three
+ Scenario: Passing
+ Given passing
+ | a | b |
+ | c | d |
+
+ 1 scenario (1 passed)
+ 1 step (1 passed)
+
+ """
+
+ Scenario: Run all with progress formatter
+ When I run cucumber -q --format progress features/sample.feature
+ Then it should fail with
+ """
+ U.F
+
+ (::) failed steps (::)
+
+ FAIL (RuntimeError)
+ ./features/step_definitions/sample_steps.rb:2:in `flunker'
+ ./features/step_definitions/sample_steps.rb:9:in `/^failing$/'
+ features/sample.feature:18:in `Given failing'
+
+ Failing Scenarios:
+ cucumber features/sample.feature:17 # Scenario: Failing
+
+ 3 scenarios (1 failed, 1 undefined, 1 passed)
+ 3 steps (1 failed, 1 undefined, 1 passed)
+
+ """
+
+ Scenario: Run Norwegian
+ Given I am in i18n/no
+ When I run cucumber -q --language no features
+ Then STDERR should be empty
+ Then it should pass with
+ """
+ # language: no
+ Egenskap: Summering
+ For å slippe å gjøre dumme feil
+ Som en regnskapsfører
+ Vil jeg kunne legge sammen
+
+ Scenario: to tall
+ Gitt at jeg har tastet inn 5
+ Og at jeg har tastet inn 7
+ NÃ¥r jeg summerer
+ Så skal resultatet være 12
+
+ @iterasjon3
+ Scenario: tre tall
+ Gitt at jeg har tastet inn 5
+ Og at jeg har tastet inn 7
+ Og at jeg har tastet inn 1
+ NÃ¥r jeg summerer
+ Så skal resultatet være 13
+
+ 2 scenarios (2 passed)
+ 9 steps (9 passed)
+
+ """
+
+ Scenario: --dry-run
+ When I run cucumber --dry-run --no-source features/*.feature --tags ~@lots
+ Then it should pass with
+ """
+ Feature: Calling undefined step
+
+ Scenario: Call directly
+ Given a step definition that calls an undefined step
+
+ Scenario: Call via another
+ Given call step "a step definition that calls an undefined step"
+
+ Feature: Failing expectation
+
+ Scenario: Failing expectation
+ Given failing expectation
+
+ Feature: Lots of undefined
+
+ Scenario: Implement me
+ Given it snows in Sahara
+ Given it's 40 degrees in Norway
+ And it's 40 degrees in Norway
+ When I stop procrastinating
+ And there is world peace
+
+ Feature: multiline
+
+ Background: I'm a multiline name
+ which goes on and on and on for three lines
+ yawn
+ Given passing without a table
+
+ Scenario: I'm a multiline name
+ which goes on and on and on for three lines
+ yawn
+ Given passing without a table
+
+ Scenario Outline: I'm a multiline name
+ which goes on and on and on for three lines
+ yawn
+ Given without a table
+
+ Examples:
+ | state |
+ | passing |
+
+ Scenario Outline: name
+ Given without a table
+
+ Examples: I'm a multiline name
+ which goes on and on and on for three lines
+ yawn
+ | state |
+ | passing |
+
+ Feature: Outline Sample
+
+ Scenario: I have no steps
+
+ Scenario Outline: Test state
+ Given without a table
+ Given without a table
+
+ Examples: Rainbow colours
+ | state | other_state |
+ | missing | passing |
+ | passing | passing |
+ | failing | passing |
+
+ Examples: Only passing
+ | state | other_state |
+ | passing | passing |
+
+ # Feature comment
+ @one
+ Feature: Sample
+
+ @two @three
+ Scenario: Missing
+ Given missing
+
+ # Scenario comment
+ @three
+ Scenario: Passing
+ Given passing
+ | a | b |
+ | c | d |
+
+ @four
+ Scenario: Failing
+ Given failing
+ \"\"\"
+ hello
+ \"\"\"
+
+ Feature: search examples
+
+ Background: Hantu Pisang background match
+ Given passing without a table
+
+ Scenario: should match Hantu Pisang
+ Given passing without a table
+
+ Scenario: Ignore me
+ Given failing without a table
+
+ Scenario Outline: Ignore me
+ Given without a table
+
+ Examples:
+ | state |
+ | failing |
+
+ Scenario Outline: Hantu Pisang match
+ Given without a table
+
+ Examples:
+ | state |
+ | passing |
+
+ Scenario Outline: no match in name but in examples
+ Given without a table
+
+ Examples: Hantu Pisang
+ | state |
+ | passing |
+
+ Examples: Ignore me
+ | state |
+ | failing |
+
+ @sample_one
+ Feature: Tag samples
+
+ @sample_two @sample_four
+ Scenario: Passing
+ Given missing
+
+ @sample_three
+ Scenario Outline:
+ Given
+
+ Examples:
+ | state |
+ | missing |
+
+ @sample_three @sample_four
+ Scenario: Skipped
+ Given missing
+
+ Feature: undefined multiline args
+
+ Scenario: pystring
+ Given a pystring
+ \"\"\"
+ example
+ \"\"\"
+
+ Scenario: table
+ Given a table
+ | table |
+ | example |
+
+ 26 scenarios (17 skipped, 8 undefined, 1 passed)
+ 42 steps (30 skipped, 12 undefined)
+
+ """
+
+ Scenario: Multiple formatters and outputs
+ When I run cucumber --format progress --out tmp/progress.txt --format pretty --out tmp/pretty.txt --no-source --dry-run features/lots_of_undefined.feature
+ And "examples/self_test/tmp/progress.txt" should contain
+ """
+ UUUUU
+
+ 1 scenario (1 undefined)
+ 5 steps (5 undefined)
+
+ """
+ And "examples/self_test/tmp/pretty.txt" should contain
+ """
+ Feature: Lots of undefined
+
+ Scenario: Implement me
+ Given it snows in Sahara
+ Given it's 40 degrees in Norway
+ And it's 40 degrees in Norway
+ When I stop procrastinating
+ And there is world peace
+
+ 1 scenario (1 undefined)
+ 5 steps (5 undefined)
+
+ """
+
+ Scenario: Run feature elements which matches a name using --name
+ When I run cucumber --name Pisang -q features/
+ Then it should pass with
+ """
+ Feature: search examples
+
+ Background: Hantu Pisang background match
+ Given passing without a table
+
+ Scenario: should match Hantu Pisang
+ Given passing without a table
+
+ Scenario Outline: Hantu Pisang match
+ Given without a table
+
+ Examples:
+ | state |
+ | passing |
+
+ Scenario Outline: no match in name but in examples
+ Given without a table
+
+ Examples: Hantu Pisang
+ | state |
+ | passing |
+
+ 3 scenarios (3 passed)
+ 6 steps (6 passed)
+
+ """
+
+ Scenario: Run a single background which matches a name using --name (Useful if there is an error in it)
+ When I run cucumber --name 'Hantu Pisang background' -q features/
+ Then it should pass with
+ """
+ Feature: search examples
+
+ Background: Hantu Pisang background match
+ Given passing without a table
+
+ 0 scenarios
+ 1 step (1 passed)
+
+ """
+
+
+ Scenario: Run with a tag that exists on 2 scenarios
+ When I run cucumber -q features --tags @three
+ Then it should pass with
+ """
+ # Feature comment
+ @one
+ Feature: Sample
+
+ @two @three
+ Scenario: Missing
+ Given missing
+
+ # Scenario comment
+ @three
+ Scenario: Passing
+ Given passing
+ | a | b |
+ | c | d |
+
+ 2 scenarios (1 undefined, 1 passed)
+ 2 steps (1 undefined, 1 passed)
+
+ """
+
+ Scenario: Run with a tag that exists on 1 feature
+ When I run cucumber -q features --tags @one
+ Then it should fail with
+ """
+ # Feature comment
+ @one
+ Feature: Sample
+
+ @two @three
+ Scenario: Missing
+ Given missing
+
+ # Scenario comment
+ @three
+ Scenario: Passing
+ Given passing
+ | a | b |
+ | c | d |
+
+ @four
+ Scenario: Failing
+ Given failing
+ \"\"\"
+ hello
+ \"\"\"
+ FAIL (RuntimeError)
+ ./features/step_definitions/sample_steps.rb:2:in `flunker'
+ ./features/step_definitions/sample_steps.rb:9:in `/^failing$/'
+ features/sample.feature:18:in `Given failing'
+
+ Failing Scenarios:
+ cucumber features/sample.feature:17 # Scenario: Failing
+
+ 3 scenarios (1 failed, 1 undefined, 1 passed)
+ 3 steps (1 failed, 1 undefined, 1 passed)
+
+ """
+
+ Scenario: Run with a negative tag
+ When I run cucumber -q features/sample.feature --no-source --dry-run --tags ~@four
+ Then it should pass with
+ """
+ # Feature comment
+ @one
+ Feature: Sample
+
+ @two @three
+ Scenario: Missing
+ Given missing
+
+ # Scenario comment
+ @three
+ Scenario: Passing
+ Given passing
+ | a | b |
+ | c | d |
+
+ 2 scenarios (1 skipped, 1 undefined)
+ 2 steps (1 skipped, 1 undefined)
+
+ """
+
+ Scenario: Run with limited tag count, blowing it on scenario
+ When I run cucumber -q features/tags_sample.feature --no-source --dry-run --tags @sample_three:1
+ Then it should fail with
+ """
+ @sample_one
+ Feature: Tag samples
+
+ @sample_three
+ Scenario Outline:
+ Given
+
+ Examples:
+ | state |
+ | missing |
+
+ @sample_three @sample_four
+ Scenario: Skipped
+ Given missing
+
+ 2 scenarios (2 undefined)
+ 2 steps (2 undefined)
+
+ @sample_three occurred 2 times, but the limit was set to 1
+ features/tags_sample.feature:9
+ features/tags_sample.feature:16
+
+ """
+
+ Scenario: Run with limited tag count, blowing it via feature inheritance
+ When I run cucumber -q features/tags_sample.feature --no-source --dry-run --tags @sample_one:1
+ Then it should fail with
+ """
+ @sample_one
+ Feature: Tag samples
+
+ @sample_two @sample_four
+ Scenario: Passing
+ Given missing
+
+ @sample_three
+ Scenario Outline:
+ Given
+
+ Examples:
+ | state |
+ | missing |
+
+ @sample_three @sample_four
+ Scenario: Skipped
+ Given missing
+
+ 3 scenarios (3 undefined)
+ 3 steps (3 undefined)
+
+ @sample_one occurred 3 times, but the limit was set to 1
+ features/tags_sample.feature:5
+ features/tags_sample.feature:9
+ features/tags_sample.feature:16
+
+ """
+
+ Scenario: Reformat files with --autoformat
+ When I run cucumber --autoformat tmp/formatted features
+ Then "examples/self_test/tmp/formatted/features/sample.feature" should contain
+ """
+ # Feature comment
+ @one
+ Feature: Sample
+
+ @two @three
+ Scenario: Missing
+ Given missing
+
+ # Scenario comment
+ @three
+ Scenario: Passing
+ Given passing
+ | a | b |
+ | c | d |
+
+ @four
+ Scenario: Failing
+ Given failing
+ \"\"\"
+ hello
+ \"\"\"
+
+
+ """
+
+ Scenario: Generate PDF with pdf formatter
+ When I run cucumber --format pdf --out tmp/sample.pdf --dry-run features/sample.feature
+ Then STDERR should be empty
+ Then "examples/self_test/tmp/sample.pdf" should match "Pages 2"
+
+ Scenario: Run feature elements which match a name using -n
+ When I run cucumber -n Pisang -q features/
+ Then it should pass with
+ """
+ Feature: search examples
+
+ Background: Hantu Pisang background match
+ Given passing without a table
+
+ Scenario: should match Hantu Pisang
+ Given passing without a table
+
+ Scenario Outline: Hantu Pisang match
+ Given without a table
+
+ Examples:
+ | state |
+ | passing |
+
+ Scenario Outline: no match in name but in examples
+ Given without a table
+
+ Examples: Hantu Pisang
+ | state |
+ | passing |
+
+ 3 scenarios (3 passed)
+ 6 steps (6 passed)
+
+ """
diff --git a/vendor/gems/gems/cucumber-0.4.4/features/cucumber_cli_diff_disabled.feature b/vendor/gems/gems/cucumber-0.4.4/features/cucumber_cli_diff_disabled.feature
new file mode 100755
index 00000000..5fa1b386
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/features/cucumber_cli_diff_disabled.feature
@@ -0,0 +1,52 @@
+Feature: Cucumber command line
+ In order to write better software
+ Developers should be able to execute requirements as tests
+
+ Scenario: Run single failing scenario with default diff enabled
+ When I run cucumber -q features/failing_expectation.feature
+ Then it should fail with
+ """
+ Feature: Failing expectation
+
+ Scenario: Failing expectation
+ Given failing expectation
+ expected: "that",
+ got: "this" (using ==)
+
+ Diff:
+ @@ -1,2 +1,2 @@
+ -that
+ +this
+ (Spec::Expectations::ExpectationNotMetError)
+ ./features/step_definitions/sample_steps.rb:63:in `/^failing expectation$/'
+ features/failing_expectation.feature:4:in `Given failing expectation'
+
+ Failing Scenarios:
+ cucumber features/failing_expectation.feature:3 # Scenario: Failing expectation
+
+ 1 scenario (1 failed)
+ 1 step (1 failed)
+
+ """
+
+ Scenario: Run single failing scenario with diff output disabled
+ When I run cucumber -q --no-diff features/failing_expectation.feature
+ Then it should fail with
+ """
+ Feature: Failing expectation
+
+ Scenario: Failing expectation
+ Given failing expectation
+ expected: "that",
+ got: "this" (using ==) (Spec::Expectations::ExpectationNotMetError)
+ ./features/step_definitions/sample_steps.rb:63:in `/^failing expectation$/'
+ features/failing_expectation.feature:4:in `Given failing expectation'
+
+ Failing Scenarios:
+ cucumber features/failing_expectation.feature:3 # Scenario: Failing expectation
+
+ 1 scenario (1 failed)
+ 1 step (1 failed)
+
+ """
+
diff --git a/vendor/gems/gems/cucumber-0.4.4/features/cucumber_cli_outlines.feature b/vendor/gems/gems/cucumber-0.4.4/features/cucumber_cli_outlines.feature
new file mode 100755
index 00000000..89934ece
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/features/cucumber_cli_outlines.feature
@@ -0,0 +1,105 @@
+Feature: Cucumber command line
+ In order to write better software
+ Developers should be able to execute requirements as tests
+
+ Scenario: Run scenario outline with filtering on outline name
+ When I run cucumber -q features --name "Test state"
+ Then it should fail with
+ """
+ Feature: Outline Sample
+
+ Scenario Outline: Test state
+ Given without a table
+ Given without a table
+
+ Examples: Rainbow colours
+ | state | other_state |
+ | missing | passing |
+ | passing | passing |
+ | failing | passing |
+ FAIL (RuntimeError)
+ ./features/step_definitions/sample_steps.rb:2:in `flunker'
+ ./features/step_definitions/sample_steps.rb:16:in `/^failing without a table$/'
+ features/outline_sample.feature:6:in `Given without a table'
+
+ Examples: Only passing
+ | state | other_state |
+ | passing | passing |
+
+ 4 scenarios (1 failed, 1 undefined, 2 passed)
+ 8 steps (1 failed, 2 skipped, 1 undefined, 4 passed)
+
+ """
+
+ Scenario: Run scenario outline steps only
+ When I run cucumber -q features/outline_sample.feature:7
+ Then it should fail with
+ """
+ Feature: Outline Sample
+
+ Scenario Outline: Test state
+ Given without a table
+ Given without a table
+
+ Examples: Rainbow colours
+ | state | other_state |
+ | missing | passing |
+ | passing | passing |
+ | failing | passing |
+ FAIL (RuntimeError)
+ ./features/step_definitions/sample_steps.rb:2:in `flunker'
+ ./features/step_definitions/sample_steps.rb:16:in `/^failing without a table$/'
+ features/outline_sample.feature:6:in `Given without a table'
+
+ Examples: Only passing
+ | state | other_state |
+ | passing | passing |
+
+ 4 scenarios (1 failed, 1 undefined, 2 passed)
+ 8 steps (1 failed, 2 skipped, 1 undefined, 4 passed)
+
+ """
+
+ Scenario: Run single failing scenario outline table row
+ When I run cucumber features/outline_sample.feature:12
+ Then it should fail with
+ """
+ Feature: Outline Sample
+
+ Scenario Outline: Test state # features/outline_sample.feature:5
+ Given without a table # features/step_definitions/sample_steps.rb:15
+ Given without a table # features/step_definitions/sample_steps.rb:12
+
+ Examples: Rainbow colours
+ | state | other_state |
+ | failing | passing |
+ FAIL (RuntimeError)
+ ./features/step_definitions/sample_steps.rb:2:in `flunker'
+ ./features/step_definitions/sample_steps.rb:16:in `/^failing without a table$/'
+ features/outline_sample.feature:6:in `Given without a table'
+
+ 1 scenario (1 failed)
+ 2 steps (1 failed, 1 skipped)
+
+ """
+
+ # There are 10 characters in the progress, but only 8 reported steps. Needs investigation.
+ # Looks like we're outputting too many characters.
+ Scenario: Run all with progress formatter
+ When I run cucumber -q --format progress features/outline_sample.feature
+ Then it should fail with
+ """
+ --U-..F-..
+
+ (::) failed steps (::)
+
+ FAIL (RuntimeError)
+ ./features/step_definitions/sample_steps.rb:2:in `flunker'
+ ./features/step_definitions/sample_steps.rb:16:in `/^failing without a table$/'
+ features/outline_sample.feature:6:in `Given without a table'
+
+ 5 scenarios (1 failed, 1 undefined, 3 passed)
+ 8 steps (1 failed, 2 skipped, 1 undefined, 4 passed)
+
+ """
+
diff --git a/vendor/gems/gems/cucumber-0.4.4/features/custom_formatter.feature b/vendor/gems/gems/cucumber-0.4.4/features/custom_formatter.feature
new file mode 100755
index 00000000..aad485e9
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/features/custom_formatter.feature
@@ -0,0 +1,46 @@
+Feature: Custom Formatter
+
+ Scenario: count tags
+ When I run cucumber --format Cucumber::Formatter::TagCloud features
+ Then it should fail with
+ """
+ | @after_file | @background_tagged_before_on_outline | @four | @lots | @one | @sample_four | @sample_one | @sample_three | @sample_two | @three | @two |
+ | 1 | 1 | 1 | 1 | 1 | 2 | 1 | 2 | 1 | 2 | 1 |
+
+ """
+
+ Scenario: my own formatter
+ Given a standard Cucumber project directory structure
+ And a file named "features/f.feature" with:
+ """
+ Feature: i'll use my own
+ Scenario: just print me
+ Given this step works
+ """
+ And a file named "features/step_definitions/steps.rb" with:
+ """
+ Given /^this step works$/ do
+ end
+ """
+ And a file named "features/support/ze/formator.rb" with:
+ """
+ module Ze
+ class Formator
+ def initialize(step_mother, io, options)
+ @step_mother = step_mother
+ @io = io
+ end
+
+ def scenario_name(keyword, name, file_colon_line, source_indent)
+ @io.puts "$ #{name.upcase}"
+ end
+ end
+ end
+ """
+ When I run cucumber features/f.feature --format Ze::Formator
+ Then STDERR should be empty
+ Then it should pass with
+ """
+ $ JUST PRINT ME
+
+ """
diff --git a/vendor/gems/gems/cucumber-0.4.4/features/default_snippets.feature b/vendor/gems/gems/cucumber-0.4.4/features/default_snippets.feature
new file mode 100755
index 00000000..1ed8fc66
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/features/default_snippets.feature
@@ -0,0 +1,42 @@
+Feature: Print snippets
+ In order to make it easier to implement step definitions
+ Developers should get a scaffolding for undefined step definitions
+
+ Scenario: Cucumber doesn't know what language, and defaults to Ruby
+ Given a standard Cucumber project directory structure
+ And a file named "features/x.feature" with:
+ """
+ Feature: X
+ Scenario: Y
+ Given Z
+ Given Q
+ """
+ When I run cucumber features
+ Then STDERR should be empty
+ And it should pass with
+ """
+ Feature: X
+
+ Scenario: Y # features/x.feature:2
+ Given Z # features/x.feature:3
+ Given Q # features/x.feature:4
+
+ 1 scenario (1 undefined)
+ 2 steps (2 undefined)
+
+ You can implement step definitions for undefined steps with these snippets:
+
+ Given /^Z$/ do
+ pending # express the regexp above with the code you wish you had
+ end
+
+ Given /^Q$/ do
+ pending # express the regexp above with the code you wish you had
+ end
+
+ If you want snippets in a different programming language, just make sure a file
+ with the appropriate file extension exists where cucumber looks for step definitions.
+
+
+ """
+
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/features/drb_server_integration.feature b/vendor/gems/gems/cucumber-0.4.4/features/drb_server_integration.feature
new file mode 100755
index 00000000..4b71d568
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/features/drb_server_integration.feature
@@ -0,0 +1,174 @@
+@spork
+Feature: DRb Server Integration
+ To prevent waiting for Rails and other large Ruby applications to load their environments
+ for each feature run Cucumber ships with a DRb client that can speak to a server which
+ loads up the environment only once.
+
+ Background: App with Spork support
+ Spork is a gem that has a DRb server and the scenarios below illustrate how to use it.
+ However, any DRb server that adheres to the protocol that the client expects would work.
+
+ Given a standard Cucumber project directory structure
+ And a file named "features/support/env.rb" with:
+ """
+ require 'rubygems'
+ require 'spork'
+
+ Spork.prefork do
+ puts "I'm loading all the heavy stuff..."
+ end
+
+ Spork.each_run do
+ puts "I'm loading the stuff just for this run..."
+ end
+ """
+ And a file named "features/sample.feature" with:
+ """
+ # language: en
+ Feature: Sample
+ Scenario: this is a test
+ Given I am just testing stuff
+ """
+ And a file named "features/essai.feature" with:
+ """
+ # language: fr
+ Fonction: Essai
+ Scenario: ceci est un test
+ Soit je teste
+ """
+ And a file named "features/step_definitions/all_your_steps_are_belong_to_us.rb" with:
+ """
+ Given /^I am just testing stuff$/ do
+ # no-op
+ end
+
+ Soit /^je teste$/ do
+ # no-op
+ end
+ """
+
+ Scenario: Feature Passing with --drb flag
+ Given I am running spork in the background
+
+ When I run cucumber features --drb
+ Then it should pass
+ And STDERR should be empty
+ And the output should contain
+ """
+ 1 step (1 passed)
+ """
+ And the output should contain
+ """
+ I'm loading the stuff just for this run...
+ """
+ And the output should not contain
+ """
+ I'm loading all the heavy stuff...
+ """
+
+ Scenario: Feature Failing with --drb flag
+ Given a file named "features/step_definitions/all_your_steps_are_belong_to_us.rb" with:
+ """
+ Given /^I am just testing stuff$/ do
+ raise "Oh noes!"
+ end
+ """
+ And I am running spork in the background
+
+ When I run cucumber features --drb
+ Then it should fail
+ And the output should contain
+ """
+ 1 step (1 failed)
+ """
+ And the output should contain
+ """
+ I'm loading the stuff just for this run...
+ """
+ And the output should not contain
+ """
+ I'm loading all the heavy stuff...
+ """
+
+ Scenario: Feature Run with --drb flag with no DRb server running
+ Cucumber will fall back on running the features locally in this case.
+
+ Given I am not running a DRb server in the background
+
+ When I run cucumber features --drb
+ Then it should pass
+ And STDERR should match
+ """
+ No DRb server is running. Running features locally:
+ """
+ And the output should contain
+ """
+ I'm loading all the heavy stuff...
+ I'm loading the stuff just for this run...
+ """
+ And the output should contain
+ """
+ 1 step (1 passed)
+ """
+
+
+ Scenario: Feature Run with --drb flag *defined in a profile* with no DRb server running
+
+ Given I am not running a DRb server in the background
+ And the following profile is defined:
+ """
+ server: --drb features
+ """
+
+ When I run cucumber --profile server
+ Then it should pass
+ And STDERR should match
+ """
+ No DRb server is running. Running features locally:
+ """
+ And the output should contain
+ """
+ I'm loading all the heavy stuff...
+ I'm loading the stuff just for this run...
+ """
+
+ Scenario: Feature Run with --drb specifying a non-standard port
+
+ Given I am running spork in the background on port 9000
+
+ When I run cucumber features --drb --port 9000
+ Then it should pass
+ And STDERR should be empty
+ And the output should contain
+ """
+ 1 step (1 passed)
+ """
+ And the output should contain
+ """
+ I'm loading the stuff just for this run...
+ """
+ And the output should not contain
+ """
+ I'm loading all the heavy stuff...
+ """
+
+ Scenario: Feature Run with $CUCUMBER_DRB environment variable
+
+ Given I have environment variable CUCUMBER_DRB set to "9000"
+ And I am running spork in the background on port 9000
+
+ When I run cucumber features/ --drb
+ Then it should pass
+ And STDERR should be empty
+ And the output should contain
+ """
+ 1 step (1 passed)
+ """
+ And the output should contain
+ """
+ I'm loading the stuff just for this run...
+ """
+ And the output should not contain
+ """
+ I'm loading all the heavy stuff...
+ """
diff --git a/vendor/gems/gems/cucumber-0.4.4/features/exception_in_after_block.feature b/vendor/gems/gems/cucumber-0.4.4/features/exception_in_after_block.feature
new file mode 100755
index 00000000..b0876dc2
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/features/exception_in_after_block.feature
@@ -0,0 +1,100 @@
+Feature: Exception in After Block
+ In order to use custom assertions at the end of each scenario
+ As a developer
+ I want exceptions raised in After blocks to be handled gracefully and reported by the formatters
+
+ Background:
+ Given a standard Cucumber project directory structure
+ And a file named "features/step_definitions/steps.rb" with:
+ """
+ Given /^this step does something naughty$/ do
+ @naughty = true
+ end
+
+ Given /^this step works$/ do
+ end
+ """
+ And a file named "features/support/env.rb" with:
+ """
+ class NaughtyScenarioException < Exception; end
+ After do
+ if @naughty
+ raise NaughtyScenarioException.new("This scenario has been very very naughty")
+ end
+ end
+ """
+
+ Scenario: Handle Exception in standard scenario step and carry on
+ Given a file named "features/naughty_step_in_scenario.feature" with:
+ """
+ Feature: Sample
+
+ Scenario: Naughty Step
+ Given this step does something naughty
+
+ Scenario: Success
+ Given this step works
+ """
+ When I run cucumber features
+ Then it should fail with
+ """
+ Feature: Sample
+
+ Scenario: Naughty Step # features/naughty_step_in_scenario.feature:3
+ Given this step does something naughty # features/step_definitions/steps.rb:1
+ This scenario has been very very naughty (NaughtyScenarioException)
+ ./features/support/env.rb:4:in `After'
+
+ Scenario: Success # features/naughty_step_in_scenario.feature:6
+ Given this step works # features/step_definitions/steps.rb:5
+
+ Failing Scenarios:
+ cucumber features/naughty_step_in_scenario.feature:3 # Scenario: Naughty Step
+
+ 2 scenarios (1 failed, 1 passed)
+ 2 steps (2 passed)
+
+ """
+
+ Scenario: Handle Exception in scenario outline table row and carry on
+ Given a file named "features/naughty_step_in_scenario_outline.feature" with:
+ """
+ Feature: Sample
+
+ Scenario Outline: Naughty Step
+ Given this step
+
+ Examples:
+ | Might Work |
+ | works |
+ | does something naughty |
+ | works |
+
+ Scenario: Success
+ Given this step works
+
+ """
+ When I run cucumber features
+ Then it should fail with
+ """
+ Feature: Sample
+
+ Scenario Outline: Naughty Step # features/naughty_step_in_scenario_outline.feature:3
+ Given this step # features/step_definitions/steps.rb:5
+
+ Examples:
+ | Might Work |
+ | works |
+ | does something naughty |
+ This scenario has been very very naughty (NaughtyScenarioException)
+ ./features/support/env.rb:4:in `After'
+ | works |
+
+ Scenario: Success # features/naughty_step_in_scenario_outline.feature:12
+ Given this step works # features/step_definitions/steps.rb:5
+
+ 4 scenarios (1 failed, 3 passed)
+ 4 steps (4 passed)
+
+ """
+
diff --git a/vendor/gems/gems/cucumber-0.4.4/features/exception_in_after_step_block.feature b/vendor/gems/gems/cucumber-0.4.4/features/exception_in_after_step_block.feature
new file mode 100755
index 00000000..984de0d2
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/features/exception_in_after_step_block.feature
@@ -0,0 +1,102 @@
+Feature: Exception in AfterStep Block
+ In order to use custom assertions at the end of each step
+ As a developer
+ I want exceptions raised in AfterStep blocks to be handled gracefully and reported by the formatters
+
+ Background:
+ Given a standard Cucumber project directory structure
+ And a file named "features/step_definitions/steps.rb" with:
+ """
+ Given /^this step does something naughty$/ do
+ @naughty = true
+ end
+
+ Given /^this step works$/ do
+ end
+ """
+ And a file named "features/support/env.rb" with:
+ """
+ class NaughtyStepException < Exception; end
+ AfterStep do
+ if @naughty
+ raise NaughtyStepException.new("This step has been very very naughty")
+ end
+ end
+ """
+
+ Scenario: Handle Exception in standard scenario step and carry on
+ Given a file named "features/naughty_step_in_scenario.feature" with:
+ """
+ Feature: Sample
+
+ Scenario: Naughty Step
+ Given this step does something naughty
+
+ Scenario: Success
+ Given this step works
+ """
+ When I run cucumber features
+ Then it should fail with
+ """
+ Feature: Sample
+
+ Scenario: Naughty Step # features/naughty_step_in_scenario.feature:3
+ Given this step does something naughty # features/step_definitions/steps.rb:1
+ This step has been very very naughty (NaughtyStepException)
+ ./features/support/env.rb:4:in `AfterStep'
+ features/naughty_step_in_scenario.feature:4:in `Given this step does something naughty'
+
+ Scenario: Success # features/naughty_step_in_scenario.feature:6
+ Given this step works # features/step_definitions/steps.rb:5
+
+ Failing Scenarios:
+ cucumber features/naughty_step_in_scenario.feature:3 # Scenario: Naughty Step
+
+ 2 scenarios (1 failed, 1 passed)
+ 2 steps (1 failed, 1 passed)
+
+ """
+
+ Scenario: Handle Exception in scenario outline table row and carry on
+ Given a file named "features/naughty_step_in_scenario_outline.feature" with:
+ """
+ Feature: Sample
+
+ Scenario Outline: Naughty Step
+ Given this step
+
+ Examples:
+ | Might Work |
+ | works |
+ | does something naughty |
+ | works |
+
+ Scenario: Success
+ Given this step works
+
+ """
+ When I run cucumber features
+ Then it should fail with
+ """
+ Feature: Sample
+
+ Scenario Outline: Naughty Step # features/naughty_step_in_scenario_outline.feature:3
+ Given this step # features/step_definitions/steps.rb:5
+
+ Examples:
+ | Might Work |
+ | works |
+ | does something naughty |
+ This step has been very very naughty (NaughtyStepException)
+ ./features/support/env.rb:4:in `AfterStep'
+ features/naughty_step_in_scenario_outline.feature:4:in `Given this step '
+ | works |
+
+ Scenario: Success # features/naughty_step_in_scenario_outline.feature:12
+ Given this step works # features/step_definitions/steps.rb:5
+
+ 4 scenarios (1 failed, 3 passed)
+ 4 steps (1 failed, 3 passed)
+
+ """
+
diff --git a/vendor/gems/gems/cucumber-0.4.4/features/exception_in_before_block.feature b/vendor/gems/gems/cucumber-0.4.4/features/exception_in_before_block.feature
new file mode 100755
index 00000000..bd1b51fc
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/features/exception_in_before_block.feature
@@ -0,0 +1,78 @@
+Feature: Exception in Before Block
+ In order to know with confidence that my before blocks have run OK
+ As a developer
+ I want exceptions raised in Before blocks to be handled gracefully and reported by the formatters
+
+ Background:
+ Given a standard Cucumber project directory structure
+ And a file named "features/step_definitions/steps.rb" with:
+ """
+ Given /^this step works$/ do
+ end
+ """
+ And a file named "features/support/env.rb" with:
+ """
+ class SomeSetupException < Exception; end
+ class BadStepException < Exception; end
+ Before do
+ raise SomeSetupException.new("I cannot even start this scenario")
+ end
+ """
+
+ Scenario: Handle Exception in standard scenario step and carry on
+ Given a file named "features/naughty_step_in_scenario.feature" with:
+ """
+ Feature: Sample
+
+ Scenario: Run a good step
+ Given this step works
+ """
+ When I run cucumber features
+ Then it should fail with
+ """
+ Feature: Sample
+
+ Scenario: Run a good step # features/naughty_step_in_scenario.feature:3
+ I cannot even start this scenario (SomeSetupException)
+ ./features/support/env.rb:4:in `Before'
+ Given this step works # features/step_definitions/steps.rb:1
+
+ Failing Scenarios:
+ cucumber features/naughty_step_in_scenario.feature:3 # Scenario: Run a good step
+
+ 1 scenario (1 failed)
+ 1 step (1 skipped)
+
+ """
+
+ Scenario: Handle Exception in Before hook for Scenario with Background
+ Given a file named "features/naughty_step_in_before.feature" with:
+ """
+ Feature: Sample
+
+ Background:
+ Given this step works
+
+ Scenario: Run a good step
+ Given this step works
+ """
+ When I run cucumber features
+ Then it should fail with
+ """
+ Feature: Sample
+
+ Background: # features/naughty_step_in_before.feature:3
+ I cannot even start this scenario (SomeSetupException)
+ ./features/support/env.rb:4:in `Before'
+ Given this step works # features/step_definitions/steps.rb:1
+
+ Scenario: Run a good step # features/naughty_step_in_before.feature:6
+ Given this step works # features/step_definitions/steps.rb:1
+
+ Failing Scenarios:
+ cucumber features/naughty_step_in_before.feature:6 # Scenario: Run a good step
+
+ 1 scenario (1 failed)
+ 2 steps (1 skipped, 1 passed)
+
+ """
diff --git a/vendor/gems/gems/cucumber-0.4.4/features/exclude_files.feature b/vendor/gems/gems/cucumber-0.4.4/features/exclude_files.feature
new file mode 100755
index 00000000..5d95d52a
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/features/exclude_files.feature
@@ -0,0 +1,20 @@
+Feature: Exclude ruby and feature files from runs
+ Developers should be able to easily exclude files from cucumber runs
+ This is a nice feature to have in conjunction with profiles, so you can exclude
+ certain environment files from certain runs.
+
+ Scenario: exclude ruby files
+ Given a standard Cucumber project directory structure
+ And a file named "features/support/dont_require_me.rb"
+ And a file named "features/step_definitions/fooz.rb"
+ And a file named "features/step_definitions/foof.rb"
+ And a file named "features/step_definitions/foot.rb"
+ And a file named "features/support/require_me.rb"
+
+ When I run cucumber features -q --verbose --exclude features/support/dont --exclude foo[zf]
+
+ Then "features/support/require_me.rb" should be required
+ And "features/step_definitions/foot.rb" should be required
+ And "features/support/dont_require_me.rb" should not be required
+ And "features/step_definitions/foof.rb" should not be required
+ And "features/step_definitions/fooz.rb" should not be required
diff --git a/vendor/gems/gems/cucumber-0.4.4/features/expand.feature b/vendor/gems/gems/cucumber-0.4.4/features/expand.feature
new file mode 100755
index 00000000..5a9bb27c
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/features/expand.feature
@@ -0,0 +1,60 @@
+Feature: --expand option
+ In order to make it easier to writhe certain editor plugins
+ and also for some people to understand scenarios, Cucumber
+ should expand examples in outlines.
+
+ Background:
+ Given a standard Cucumber project directory structure
+ And a file named "features/expand_me.feature" with:
+ """
+ Feature: submit guess
+
+ Background:
+ Given the players' names:
+ | maker | breaker |
+ | Moriarty | Holmes |
+
+ Scenario Outline: submit guess
+ Given the secret code is
+ When I guess
+ Then the mark should be
+
+ Examples: all colors correct
+ | code | guess | mark |
+ | r g y c | r g y c | bbbb |
+ | r g y c | r g c y | bbww |
+ """
+
+ Scenario: Expand the outline
+ When I run cucumber -i -q --expand features/expand_me.feature
+ Then STDERR should be empty
+ And it should pass with
+ """
+ Feature: submit guess
+
+ Background:
+ Given the players' names:
+ | maker | breaker |
+ | Moriarty | Holmes |
+
+ Scenario Outline: submit guess
+ Given the secret code is
+ When I guess
+ Then the mark should be
+
+ Examples: all colors correct
+
+ Scenario: | r g y c | r g y c | bbbb |
+ Given the secret code is r g y c
+ When I guess r g y c
+ Then the mark should be bbbb
+
+ Scenario: | r g y c | r g c y | bbww |
+ Given the secret code is r g y c
+ When I guess r g c y
+ Then the mark should be bbww
+
+ 2 scenarios (2 undefined)
+ 8 steps (8 undefined)
+
+ """
diff --git a/vendor/gems/gems/cucumber-0.4.4/features/html_formatter.feature b/vendor/gems/gems/cucumber-0.4.4/features/html_formatter.feature
new file mode 100755
index 00000000..e9a1483b
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/features/html_formatter.feature
@@ -0,0 +1,7 @@
+Feature: HTML formatter
+ In order to make it easy to read Cucumber results
+ there should be a HTML formatter with an awesome CSS
+
+ Scenario: Everything in examples/self_test
+ When I run cucumber -q --format html --out tmp/a.html features
+ Then "examples/self_test/tmp/a.html" should have the same contents as "features/html_formatter/a.html"
diff --git a/vendor/gems/gems/cucumber-0.4.4/features/html_formatter/a.html b/vendor/gems/gems/cucumber-0.4.4/features/html_formatter/a.html
new file mode 100755
index 00000000..0f62d806
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/features/html_formatter/a.html
@@ -0,0 +1,183 @@
+Cucumber @background_tagged_before_on_outline Feature: Background tagged Before on Outline
Background: Given passing without a table
Scenario Outline: passing background Then I should have '<count>' cukes
Feature: background with name
Background: I'm a background and I'm ok Given '10 ' cukes
Scenario: example Then I should have '10 ' cukes
@after_file Feature: Failing background sample
Background: Given failing without a table
FAIL (RuntimeError)
+./features/step_definitions/sample_steps.rb:2:in `flunker'
+./features/step_definitions/sample_steps.rb:16:in `/^failing without a table$/'
+features/background/failing_background.feature:5:in `Given failing without a table' And '10 ' cukes
Scenario: failing background Then I should have '10 ' cukes
Scenario: another failing background Then I should have '10 ' cukes
Feature: Failing background after previously successful background sample
Background: Given passing without a table
And '10 ' global cukes
Scenario: passing background Then I should have '10 ' global cukes
Scenario: failing background FAIL (RuntimeError)
+./features/step_definitions/sample_steps.rb:2:in `flunker'
+./features/step_definitions/sample_steps.rb:37:in `/^'(.+)' global cukes$/'
+features/background/failing_background_after_success.feature:5:in `And '10' global cukes' Then I should have '10 ' global cukes
Feature: Passing background with multiline args
Background: Given table
And multiline string
I'm a cucumber and I'm okay.
I sleep all night and I test all day Scenario: passing background Then the table should be
Then the multiline string should be
I'm a cucumber and I'm okay.
I sleep all night and I test all day Scenario: another passing background Then the table should be
Then the multiline string should be
I'm a cucumber and I'm okay.
I sleep all night and I test all day Feature: Passing background sample
Background: Given '10 ' cukes
Scenario: passing background Then I should have '10 ' cukes
Scenario: another passing background Then I should have '10 ' cukes
Feature: Pending background sample
Background: Given pending
Scenario: pending background Then I should have '10 ' cukes
Scenario: another pending background Then I should have '10 ' cukes
Feature: Failing background with scenario outlines sample
Background: Given failing without a table
FAIL (RuntimeError)
+./features/step_definitions/sample_steps.rb:2:in `flunker'
+./features/step_definitions/sample_steps.rb:16:in `/^failing without a table$/'
+features/background/scenario_outline_failing_background.feature:4:in `Given failing without a table' Scenario Outline: failing background Then I should have '<count>' cukes
Examples: count 10 FAIL (RuntimeError)
+./features/step_definitions/sample_steps.rb:2:in `flunker'
+./features/step_definitions/sample_steps.rb:16:in `/^failing without a table$/'
+features/background/scenario_outline_failing_background.feature:4:in `Given failing without a table'
Scenario Outline: another failing background Then I should have '<count>' cukes
Feature: Passing background with scenario outlines sample
Background: Given '10 ' cukes
Scenario Outline: passing background Then I should have '<count>' cukes
Scenario Outline: another passing background Then I should have '<count>' cukes
Feature: Calling undefined step
Scenario: Call directly Given a step definition that calls an undefined step
Undefined step: "this does not exist" (Cucumber::Undefined)
+./features/step_definitions/sample_steps.rb:20:in `/^a step definition that calls an undefined step$/'
+features/call_undefined_step_from_step_def.feature:4:in `Given a step definition that calls an undefined step' Scenario: Call via another Given call step "a step definition that calls an undefined step "
Undefined step: "this does not exist" (Cucumber::Undefined)
+./features/step_definitions/sample_steps.rb:20:in `/^a step definition that calls an undefined step$/'
+features/call_undefined_step_from_step_def.feature:7:in `Given call step "a step definition that calls an undefined step"' Feature: Failing expectation
Scenario: Failing expectation Given failing expectation
expected: "that",
+ got: "this" (using ==)
+
+ Diff:
+@@ -1,2 +1,2 @@
+-that
++this
+ (Spec::Expectations::ExpectationNotMetError)
+./features/step_definitions/sample_steps.rb:63:in `/^failing expectation$/'
+features/failing_expectation.feature:4:in `Given failing expectation' Feature: Lots of undefined
Scenario: Implement me Given it snows in Sahara
Given it's 40 degrees in Norway
And it's 40 degrees in Norway
When I stop procrastinating
And there is world peace
Feature: multiline
Background: I'm a multiline name
+which goes on and on and on for three lines
+yawn Given passing without a table
Scenario: I'm a multiline name
+which goes on and on and on for three lines
+yawn Given passing without a table
Scenario Outline: I'm a multiline name
+which goes on and on and on for three lines
+yawn Given <state> without a table
Scenario Outline: name Given <state> without a table
Examples: I'm a multiline name
+which goes on and on and on for three lines
+yawn Feature: Outline Sample
Scenario: I have no steps Scenario Outline: Test state Given <state> without a table
Given <other_state> without a table
Examples: Rainbow colours state other_state missing passing passing passing failing passing FAIL (RuntimeError)
+./features/step_definitions/sample_steps.rb:2:in `flunker'
+./features/step_definitions/sample_steps.rb:16:in `/^failing without a table$/'
+features/outline_sample.feature:6:in `Given <state> without a table'
Examples: Only passing state other_state passing passing
@one Feature: Sample
@two @three Scenario: Missing Given missing
@three Scenario: Passing Given passing
@four Scenario: Failing Given failing
hello FAIL (RuntimeError)
+./features/step_definitions/sample_steps.rb:2:in `flunker'
+./features/step_definitions/sample_steps.rb:9:in `/^failing$/'
+features/sample.feature:18:in `Given failing' Feature: search examples
Background: Hantu Pisang background match Given passing without a table
Scenario: should match Hantu Pisang Given passing without a table
Scenario: Ignore me Given failing without a table
FAIL (RuntimeError)
+./features/step_definitions/sample_steps.rb:2:in `flunker'
+./features/step_definitions/sample_steps.rb:16:in `/^failing without a table$/'
+features/search_sample.feature:10:in `Given failing without a table' Scenario Outline: Ignore me Given <state> without a table
Examples: state failing FAIL (RuntimeError)
+./features/step_definitions/sample_steps.rb:2:in `flunker'
+./features/step_definitions/sample_steps.rb:16:in `/^failing without a table$/'
+features/search_sample.feature:13:in `Given <state> without a table'
Scenario Outline: Hantu Pisang match Given <state> without a table
Scenario Outline: no match in name but in examples Given <state> without a table
Examples: Ignore me state failing FAIL (RuntimeError)
+./features/step_definitions/sample_steps.rb:2:in `flunker'
+./features/step_definitions/sample_steps.rb:16:in `/^failing without a table$/'
+features/search_sample.feature:25:in `Given <state> without a table'
@sample_one Feature: Tag samples
@sample_two @sample_four Scenario: Passing Given missing
@sample_three Scenario Outline: Given <state>
@sample_three @sample_four Scenario: Skipped Given missing
@lots Feature: Tons of cukes
Scenario: Lots and lots Given '2 ' cukes
Given '2 ' cukes
We already have 2 cukes! (RuntimeError)
+./features/step_definitions/sample_steps.rb:28:in `/^'(.+)' cukes$/'
+features/tons_of_cukes.feature:5:in `Given '2' cukes' Given '2 ' cukes
Given '2 ' cukes
Given '2 ' cukes
Given '2 ' cukes
Given '2 ' cukes
Given '2 ' cukes
Given '2 ' cukes
Given '2 ' cukes
Given '2 ' cukes
Given '2 ' cukes
Given '2 ' cukes
Given '2 ' cukes
Given '2 ' cukes
Given '2 ' cukes
Given '2 ' cukes
Given '2 ' cukes
Given '2 ' cukes
Given '2 ' cukes
Given '2 ' cukes
Given '2 ' cukes
Given '2 ' cukes
Given '2 ' cukes
Given '2 ' cukes
Given '2 ' cukes
Given '2 ' cukes
Given '2 ' cukes
Given '2 ' cukes
Given '2 ' cukes
Given '2 ' cukes
Given '2 ' cukes
Given '2 ' cukes
Given '2 ' cukes
Given '2 ' cukes
Given '2 ' cukes
Given '2 ' cukes
Given '2 ' cukes
Given '2 ' cukes
Given '2 ' cukes
Given '2 ' cukes
Given '2 ' cukes
Given '2 ' cukes
Given '2 ' cukes
Given '2 ' cukes
Given '2 ' cukes
Given '2 ' cukes
Given '2 ' cukes
Given '2 ' cukes
Feature: undefined multiline args
Scenario: pystring Given a pystring
example Scenario: table Given a table
43 scenarios (10 failed, 2 skipped, 12 undefined, 19 passed)
131 steps (10 failed, 60 skipped, 16 undefined, 45 passed)
0m30.005s
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/features/junit_formatter.feature b/vendor/gems/gems/cucumber-0.4.4/features/junit_formatter.feature
new file mode 100755
index 00000000..02ad83f9
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/features/junit_formatter.feature
@@ -0,0 +1,88 @@
+Feature: JUnit output formatter
+ In order for developers to create test reports with ant
+ Cucumber should be able to output JUnit xml files
+
+ Background:
+ Given I am in junit
+ And the tmp directory is empty
+
+ Scenario: one feature, one passing scenario, one failing scenario
+ When I run cucumber --format junit --out tmp/ features/one_passing_one_failing.feature
+ Then it should fail with
+ """
+
+ """
+ And "examples/junit/tmp/TEST-one_passing_one_failing.xml" with junit duration "0.005" should contain
+ """
+
+
+
+
+
+
+ Scenario: Failing
+
+ Given a failing scenario
+
+ Message:
+ (RuntimeError)
+ features/one_passing_one_failing.feature:7:in `Given a failing scenario'
+
+
+
+ """
+
+ Scenario: pending steps are simply skipped
+ When I run cucumber --format junit --out tmp/ features/pending.feature
+ Then it should pass with
+ """
+
+ """
+ And "examples/junit/tmp/TEST-pending.xml" with junit duration "0.009" should contain
+ """
+
+
+
+
+ """
+
+ Scenario: pending step with strict option should fail
+ When I run cucumber --format junit --out tmp/ features/pending.feature --strict
+ Then it should fail with
+ """
+
+ """
+ And "examples/junit/tmp/TEST-pending.xml" with junit duration "0.000160" should contain
+ """
+
+
+
+
+ Scenario: Pending
+
+ TODO (Cucumber::Pending)
+ features/pending.feature:4:in `Given a pending step'
+
+
+
+ """
+
+ Scenario: run all features
+ When I run cucumber --format junit --out tmp/ features
+ Then it should fail with
+ """
+
+ """
+ And "examples/junit/tmp/TEST-one_passing_one_failing.xml" should exist
+ And "examples/junit/tmp/TEST-pending.xml" should exist
+
+ Scenario: show correct error message if no --out is passed
+ When I run cucumber --format junit features
+ Then STDERR should not match
+ """
+can't convert .* into String \(TypeError\)
+ """
+ And STDERR should match
+ """
+You \*must\* specify \-\-out DIR for the junit formatter
+ """
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/features/language_from_header.feature b/vendor/gems/gems/cucumber-0.4.4/features/language_from_header.feature
new file mode 100755
index 00000000..2950cddc
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/features/language_from_header.feature
@@ -0,0 +1,30 @@
+Feature: Language from header
+ In order to simplify command line and
+ settings in IDEs, Cucumber should pick
+ up parser language from a header.
+
+ Scenario: LOLCAT
+ Given a standard Cucumber project directory structure
+ And a file named "features/lolcat.feature" with:
+ """
+ # language: en-lol
+ OH HAI: STUFFING
+ B4: HUNGRY
+ MISHUN: CUKES
+ DEN KTHXBAI
+ """
+ When I run cucumber -i features/lolcat.feature
+ Then it should pass with
+ """
+ # language: en-lol
+ OH HAI: STUFFING
+
+ B4: HUNGRY # features/lolcat.feature:3
+
+ MISHUN: CUKES # features/lolcat.feature:4
+ DEN KTHXBAI # features/lolcat.feature:5
+
+ 1 scenario (1 undefined)
+ 1 step (1 undefined)
+
+ """
diff --git a/vendor/gems/gems/cucumber-0.4.4/features/language_help.feature b/vendor/gems/gems/cucumber-0.4.4/features/language_help.feature
new file mode 100755
index 00000000..8f430cdc
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/features/language_help.feature
@@ -0,0 +1,70 @@
+Feature: Language help
+ In order to figure out the keywords to use for a language
+ I want to be able to get help on the language from the CLI
+
+ Scenario: Get help for Portuguese language
+ When I run cucumber -l pt help
+ Then it should pass with
+ """
+ | name | 'Portuguese' |
+ | native | 'português' |
+ | encoding | 'UTF-8' |
+ | space_after_keyword | 'true' |
+ | feature | 'Funcionalidade' |
+ | background | 'Contexto' |
+ | scenario | 'Cenário' / 'Cenario' |
+ | scenario_outline | 'Esquema do Cenário' / 'Esquema do Cenario' |
+ | examples | 'Exemplos' |
+ | given | 'Dado' |
+ | when | 'Quando' |
+ | then | 'Então' / 'Entao' |
+ | and | 'E' |
+ | but | 'Mas' |
+
+ """
+ Scenario: List languages
+ When I run cucumber -l help
+ Then it should pass with
+ """
+ | ar | Arabic | العربية |
+ | bg | Bulgarian | българÑки |
+ | cat | Catalan | català |
+ | cs | Czech | ÄŒesky |
+ | cy | Welsh | Cymraeg |
+ | da | Danish | dansk |
+ | de | German | Deutsch |
+ | en | English | English |
+ | en-au | Australian | Australian |
+ | en-lol | LOLCAT | LOLCAT |
+ | en-tx | Texan | Texan |
+ | es | Spanish | español |
+ | et | Estonian | eesti keel |
+ | fi | Finnish | suomi |
+ | fr | French | français |
+ | he | Hebrew | עברית |
+ | hr | Croatian | hrvatski |
+ | hu | Hungarian | magyar |
+ | id | Indonesian | Bahasa Indonesia |
+ | it | Italian | italiano |
+ | ja | Japanese | 日本語 |
+ | ko | Korean | í•œêµì–´ |
+ | lt | Lithuanian | lietuvių kalba |
+ | lv | Latvian | latviešu |
+ | nl | Dutch | Nederlands |
+ | no | Norwegian | norsk |
+ | pl | Polish | polski |
+ | pt | Portuguese | português |
+ | ro | Romanian | română |
+ | ro2 | Romanian (diacritical) | română (diacritical) |
+ | ru | Russian | руÑÑкий |
+ | se | Swedish | Svenska |
+ | sk | Slovak | Slovensky |
+ | sr | Serbian | СрпÑки |
+ | sr-Latn | Serbian_latin | Srpski_latinica |
+ | tr | Turkish | Türkçe |
+ | uz | Uzbek | Узбекча |
+ | vi | Vietnamese | Tiếng Việt |
+ | zh-CN | Chinese simplified | 简体ä¸æ–‡ |
+ | zh-TW | Chinese traditional | ç¹é«”ä¸æ–‡ |
+
+ """
diff --git a/vendor/gems/gems/cucumber-0.4.4/features/listener_debugger_formatter.feature b/vendor/gems/gems/cucumber-0.4.4/features/listener_debugger_formatter.feature
new file mode 100755
index 00000000..af3f9e92
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/features/listener_debugger_formatter.feature
@@ -0,0 +1,41 @@
+Feature: Listener Debugger
+ In order to easily visualise the listener API
+ As a developer
+ I want a formatter that prints the calls to the listener as a feature is run
+
+ Background:
+ Given a standard Cucumber project directory structure
+
+ Scenario: title
+ Given a file named "features/sample.feature" with:
+ """
+ Feature: Sample
+
+ Scenario: Sample
+ Given Sample
+
+ """
+ When I run cucumber -f debug features/sample.feature
+ Then it should pass with
+ """
+ before_features
+ before_feature
+ before_tags
+ after_tags
+ feature_name
+ before_feature_element
+ before_tags
+ after_tags
+ scenario_name
+ before_steps
+ before_step
+ before_step_result
+ step_name
+ after_step_result
+ after_step
+ after_steps
+ after_feature_element
+ after_feature
+ after_features
+
+ """
diff --git a/vendor/gems/gems/cucumber-0.4.4/features/multiline_names.feature b/vendor/gems/gems/cucumber-0.4.4/features/multiline_names.feature
new file mode 100755
index 00000000..91e93953
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/features/multiline_names.feature
@@ -0,0 +1,43 @@
+Feature: Multiline description names
+ In order to accurately document feature elements
+ As a cucumberist
+ I want to have multiline names
+
+ Scenario: multiline scenario
+ When I run cucumber features/multiline_name.feature --no-snippets
+ Then it should pass with
+ """
+ Feature: multiline
+
+ Background: I'm a multiline name # features/multiline_name.feature:3
+ which goes on and on and on for three lines
+ yawn
+ Given passing without a table # features/step_definitions/sample_steps.rb:12
+
+ Scenario: I'm a multiline name # features/multiline_name.feature:8
+ which goes on and on and on for three lines
+ yawn
+ Given passing without a table # features/step_definitions/sample_steps.rb:12
+
+ Scenario Outline: I'm a multiline name # features/multiline_name.feature:13
+ which goes on and on and on for three lines
+ yawn
+ Given without a table # features/step_definitions/sample_steps.rb:12
+
+ Examples:
+ | state |
+ | passing |
+
+ Scenario Outline: name # features/multiline_name.feature:21
+ Given without a table # features/step_definitions/sample_steps.rb:12
+
+ Examples: I'm a multiline name
+ which goes on and on and on for three lines
+ yawn
+ | state |
+ | passing |
+
+ 3 scenarios (3 passed)
+ 6 steps (6 passed)
+
+ """
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/features/negative_tagged_hooks.feature b/vendor/gems/gems/cucumber-0.4.4/features/negative_tagged_hooks.feature
new file mode 100755
index 00000000..b7b54ecd
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/features/negative_tagged_hooks.feature
@@ -0,0 +1,61 @@
+Feature: Tagged hooks
+
+ Background:
+ Given a standard Cucumber project directory structure
+ And a file named "features/step_definitions/steps.rb" with:
+ """
+ Given /^this step works$/ do
+ end
+ """
+ And a file named "features/support/hooks.rb" with:
+ """
+ Before('~@no-boom') do
+ raise 'boom'
+ end
+ """
+ And a file named "features/f.feature" with:
+ """
+ Feature: With and without hooks
+ Scenario: using hook
+ Given this step works
+
+ @no-boom
+ Scenario: omitting hook
+ Given this step works
+ """
+
+ Scenario: omit tagged hook
+ When I run cucumber features/f.feature:2
+ Then it should fail with
+ """
+ Feature: With and without hooks
+
+ Scenario: using hook # features/f.feature:2
+ boom (RuntimeError)
+ ./features/support/hooks.rb:2:in `Before'
+ Given this step works # features/step_definitions/steps.rb:1
+
+ Failing Scenarios:
+ cucumber features/f.feature:2 # Scenario: using hook
+
+ 1 scenario (1 failed)
+ 1 step (1 skipped)
+
+ """
+
+ Scenario: omit tagged hook
+ When I run cucumber features/f.feature:6
+ Then it should pass with
+ """
+ Feature: With and without hooks
+
+ @no-boom
+ Scenario: omitting hook # features/f.feature:6
+ Given this step works # features/step_definitions/steps.rb:1
+
+ 1 scenario (1 passed)
+ 1 step (1 passed)
+
+ """
+
+
diff --git a/vendor/gems/gems/cucumber-0.4.4/features/post_configuration_hook.feature b/vendor/gems/gems/cucumber-0.4.4/features/post_configuration_hook.feature
new file mode 100755
index 00000000..f2ad32c6
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/features/post_configuration_hook.feature
@@ -0,0 +1,37 @@
+Feature: Post Configuration Hook [#423]
+
+ In order to extend Cucumber
+ As a developer
+ I want to manipulate the Cucumber configuration after it has been created
+
+ Scenario: configuration modified to use HTML formatter
+
+ Given a standard Cucumber project directory structure
+ And a file named "features/support/env.rb" with:
+ """
+ AfterConfiguration do |config|
+ config.options[:formats] << ['html', config.out_stream]
+ end
+ """
+ When I run cucumber features
+ Then STDERR should be empty
+ And the output should contain
+ """
+ html
+ """
+
+ Scenario: feature directories read from configuration
+
+ Given a standard Cucumber project directory structure
+ And a file named "features/support/env.rb" with:
+ """
+ AfterConfiguration do |config|
+ config.out_stream << "AfterConfiguration hook read feature directories: #{config.feature_dirs.join(', ')}"
+ end
+ """
+ When I run cucumber features
+ Then STDERR should be empty
+ And the output should contain
+ """
+ AfterConfiguration hook read feature directories: features
+ """
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/features/profiles.feature b/vendor/gems/gems/cucumber-0.4.4/features/profiles.feature
new file mode 100755
index 00000000..3c3625b6
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/features/profiles.feature
@@ -0,0 +1,112 @@
+Feature: Profiles
+ In order to save time and prevent carpal tunnel syndrome
+ Cucumber users can save and reuse commonly used cucumber flags in a 'cucumber.yml' file.
+ These named arguments are called profiles and the yml file should be in the root of your project.
+ Any cucumber argument is valid in a profile. To see all the available flags type 'cucumber --help'
+ For more information about profiles please see the wiki:
+ http://wiki.github.com/aslakhellesoy/cucumber/cucumberyml
+
+ Background: Basic App
+ Given a standard Cucumber project directory structure
+ And a file named "features/sample.feature" with:
+ """
+ Feature: Sample
+ Scenario: this is a test
+ Given I am just testing stuff
+ """
+ And a file named "features/support/env.rb"
+ And a file named "features/support/super_env.rb"
+ And the following profiles are defined:
+ """
+ default: features/sample.feature --require features/support/env.rb -v
+ super: features/sample.feature --require features/support/super_env.rb -v
+ """
+
+ Scenario: Explicitly defining a profile to run
+ When I run cucumber features/sample.feature --profile super
+ Then the output should contain
+ """
+ Using the super profile...
+ """
+ And exactly these files should be loaded: features/support/super_env.rb
+
+ Scenario: Explicitly defining a profile defined in an ERB formatted file
+ Given the following profiles are defined:
+ """
+ <% requires = "--require features/support/super_env.rb" %>
+ super: <%= "features/sample.feature #{requires} -v" %>
+ """
+ When I run cucumber features/sample.feature --profile super
+ Then the output should contain
+ """
+ Using the super profile...
+ """
+ And exactly these files should be loaded: features/support/super_env.rb
+
+ Scenario: Defining multiple profiles to run
+ When I run cucumber features/sample.feature --profile default --profile super
+ Then the output should contain
+ """
+ Using the default and super profiles...
+ """
+ And exactly these files should be loaded: features/support/env.rb, features/support/super_env.rb
+
+ Scenario: Arguments passed in but no profile specified
+ When I run cucumber -v
+ Then the default profile should be used
+ And exactly these files should be loaded: features/support/env.rb
+
+ Scenario: Trying to use a missing profile
+ When I run cucumber -p foo
+ Then STDERR should be
+ """
+ Could not find profile: 'foo'
+
+ Defined profiles in cucumber.yml:
+ * default
+ * super
+
+ """
+
+ Scenario Outline: Disabling the default profile
+ When I run cucumber -v features/
+ Then the output should contain
+ """
+ Disabling profiles...
+ """
+ And exactly these files should be loaded: features/support/env.rb, features/support/super_env.rb
+
+ Examples:
+ | Flag |
+ | -P |
+ | --no-profile |
+
+
+ Scenario: Overriding the profile's features to run
+ Given a file named "features/another.feature" with:
+ """
+ Feature: Just this one should be ran
+ """
+ When I run cucumber -p default features/another.feature
+ Then exactly these features should be ran: features/another.feature
+
+ Scenario: Overriding the profile's formatter
+ You will most likely want to define a formatter in your default formatter.
+ However, you often want to run your features with a different formatter
+ yet still use the other the other arguments in the profile. Cucumber will
+ allow you to do this by giving precedence to the formatter specified on the
+ command line and override the one in the profile.
+
+ Given the following profiles are defined:
+ """
+ default: features/sample.feature --require features/support/env.rb -v --format profile
+ """
+ When I run cucumber features --format pretty
+ And the output should contain
+ """
+ Feature: Sample
+ """
+
+
+
+
diff --git a/vendor/gems/gems/cucumber-0.4.4/features/rake_task.feature b/vendor/gems/gems/cucumber-0.4.4/features/rake_task.feature
new file mode 100755
index 00000000..120d060a
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/features/rake_task.feature
@@ -0,0 +1,152 @@
+Feature: Rake task
+ In order to ease the development process
+ As a developer and CI server administrator
+ Cucumber features should be executable via Rake
+
+ Background:
+ Given a standard Cucumber project directory structure
+ And a file named "features/missing_step_definitions.feature" with:
+ """
+ Feature: Sample
+
+ Scenario: Wanted
+ Given I want to run this
+
+ Scenario: Unwanted
+ Given I don't want this ran
+ """
+
+
+ Scenario: rake task with a defined profile
+ Given the following profile is defined:
+ """
+ foo: --quiet --no-color features/missing_step_definitions.feature:3
+ """
+ And a file named "Rakefile" with:
+ """
+ $LOAD_PATH.unshift(CUCUMBER_LIB)
+ require 'cucumber/rake/task'
+
+ Cucumber::Rake::Task.new do |t|
+ t.profile = "foo"
+ end
+ """
+ When I run rake cucumber
+ Then it should pass
+ And the output should contain
+ """
+ Feature: Sample
+
+ Scenario: Wanted
+ Given I want to run this
+
+ 1 scenario (1 undefined)
+ 1 step (1 undefined)
+ """
+
+ Scenario: rake task without a profile
+ Given a file named "Rakefile" with:
+ """
+ $LOAD_PATH.unshift(CUCUMBER_LIB)
+ require 'cucumber/rake/task'
+
+ Cucumber::Rake::Task.new do |t|
+ t.cucumber_opts = %w{--quiet --no-color}
+ end
+ """
+ When I run rake cucumber
+ Then it should pass
+ And the output should contain
+ """
+ Feature: Sample
+
+ Scenario: Wanted
+ Given I want to run this
+
+ Scenario: Unwanted
+ Given I don't want this ran
+
+ 2 scenarios (2 undefined)
+ 2 steps (2 undefined)
+ """
+
+ Scenario: rake task with a defined profile and cucumber_opts
+ Given the following profile is defined:
+ """
+ bar: ['features/missing_step_definitions.feature:3']
+ """
+ And a file named "Rakefile" with:
+ """
+ $LOAD_PATH.unshift(CUCUMBER_LIB)
+ require 'cucumber/rake/task'
+
+ Cucumber::Rake::Task.new do |t|
+ t.profile = "bar"
+ t.cucumber_opts = %w{--quiet --no-color}
+ end
+ """
+ When I run rake cucumber
+ Then it should pass
+ And the output should contain
+ """
+ Feature: Sample
+
+ Scenario: Wanted
+ Given I want to run this
+
+ 1 scenario (1 undefined)
+ 1 step (1 undefined)
+ """
+
+ Scenario: respect requires
+ Given a file named "features/support/env.rb"
+ And a file named "features/support/dont_require_me.rb"
+ And the following profile is defined:
+ """
+ no_bomb: features/missing_step_definitions.feature:3 --require features/support/env.rb --verbose
+ """
+ And a file named "Rakefile" with:
+ """
+ $LOAD_PATH.unshift(CUCUMBER_LIB)
+ require 'cucumber/rake/task'
+
+ Cucumber::Rake::Task.new do |t|
+ t.profile = "no_bomb"
+ t.cucumber_opts = %w{--quiet --no-color}
+ end
+ """
+
+ When I run rake cucumber
+ Then it should pass
+ And the output should not contain
+ """
+ * features/support/dont_require_me.rb
+ """
+
+ Scenario: feature files with spaces
+ Given a file named "features/spaces are nasty.feature" with:
+ """
+ Feature: The futures green
+
+ Scenario: Orange
+ Given this is missing
+ """
+ And a file named "Rakefile" with:
+ """
+ $LOAD_PATH.unshift(CUCUMBER_LIB)
+ require 'cucumber/rake/task'
+
+ Cucumber::Rake::Task.new do |t|
+ t.cucumber_opts = %w{--quiet --no-color}
+ end
+ """
+ When I run rake cucumber
+ Then it should pass
+ And the output should contain
+ """
+ Feature: The futures green
+
+ Scenario: Orange
+ Given this is missing
+
+ """
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/features/report_called_undefined_steps.feature b/vendor/gems/gems/cucumber-0.4.4/features/report_called_undefined_steps.feature
new file mode 100755
index 00000000..47619a55
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/features/report_called_undefined_steps.feature
@@ -0,0 +1,34 @@
+Feature: Cucumber command line
+ In order to find out what step definitions need to be implemented
+ Developers should always see what step definition is missing
+
+ Scenario: Get info at arbitrary levels of nesting
+ When I run cucumber features/call_undefined_step_from_step_def.feature
+ Then it should pass with
+ """
+ Feature: Calling undefined step
+
+ Scenario: Call directly # features/call_undefined_step_from_step_def.feature:3
+ Given a step definition that calls an undefined step # features/step_definitions/sample_steps.rb:19
+ Undefined step: "this does not exist" (Cucumber::Undefined)
+ ./features/step_definitions/sample_steps.rb:20:in `/^a step definition that calls an undefined step$/'
+ features/call_undefined_step_from_step_def.feature:4:in `Given a step definition that calls an undefined step'
+
+ Scenario: Call via another # features/call_undefined_step_from_step_def.feature:6
+ Given call step "a step definition that calls an undefined step" # features/step_definitions/sample_steps.rb:23
+ Undefined step: "this does not exist" (Cucumber::Undefined)
+ ./features/step_definitions/sample_steps.rb:20:in `/^a step definition that calls an undefined step$/'
+ features/call_undefined_step_from_step_def.feature:7:in `Given call step "a step definition that calls an undefined step"'
+
+ 2 scenarios (2 undefined)
+ 2 steps (2 undefined)
+
+ You can implement step definitions for undefined steps with these snippets:
+
+ Given /^this does not exist$/ do
+ pending # express the regexp above with the code you wish you had
+ end
+
+
+ """
+
diff --git a/vendor/gems/gems/cucumber-0.4.4/features/simplest.feature b/vendor/gems/gems/cucumber-0.4.4/features/simplest.feature
new file mode 100755
index 00000000..0b3cee56
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/features/simplest.feature
@@ -0,0 +1,11 @@
+Feature: Sample
+
+Background:
+ Given this step works
+
+Scenario: Run a good step
+ Given this step works
+
+
+
+
diff --git a/vendor/gems/gems/cucumber-0.4.4/features/snippet.feature b/vendor/gems/gems/cucumber-0.4.4/features/snippet.feature
new file mode 100755
index 00000000..a105d911
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/features/snippet.feature
@@ -0,0 +1,22 @@
+Feature: Snippets
+ In order to help speed up writing step definitions
+ As a feature editor
+ I want snippet suggestions for undefined step definitions
+
+ Scenario: Snippet for undefined step with a pystring
+ When I run cucumber features/undefined_multiline_args.feature:3 -s
+ Then the output should contain
+ """
+ Given /^a pystring$/ do |string|
+ pending # express the regexp above with the code you wish you had
+ end
+ """
+ Scenario: Snippet for undefined step with a step table
+ When I run cucumber features/undefined_multiline_args.feature:9 -s
+ Then the output should contain
+ """
+ Given /^a table$/ do |table|
+ # table is a Cucumber::Ast::Table
+ pending # express the regexp above with the code you wish you had
+ end
+ """
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/features/step_definitions/cucumber_steps.rb b/vendor/gems/gems/cucumber-0.4.4/features/step_definitions/cucumber_steps.rb
new file mode 100755
index 00000000..a3e2eea2
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/features/step_definitions/cucumber_steps.rb
@@ -0,0 +1,154 @@
+require 'tempfile'
+
+Given /^I am in (.*)$/ do |example_dir_relative_path|
+ @current_dir = examples_dir(example_dir_relative_path)
+end
+
+Given /^a standard Cucumber project directory structure$/ do
+ @current_dir = working_dir
+ in_current_dir do
+ FileUtils.mkdir_p 'features/support'
+ FileUtils.mkdir 'features/step_definitions'
+ end
+end
+
+Given /^the (.*) directory is empty$/ do |directory|
+ in_current_dir do
+ FileUtils.remove_dir(directory) rescue nil
+ FileUtils.mkdir 'tmp'
+ end
+end
+
+Given /^a file named "([^\"]*)"$/ do |file_name|
+ create_file(file_name, '')
+end
+
+Given /^a file named "([^\"]*)" with:$/ do |file_name, file_content|
+ create_file(file_name, file_content)
+end
+
+Given /^the following profiles? (?:are|is) defined:$/ do |profiles|
+ create_file('cucumber.yml', profiles)
+end
+
+Given /^I am running spork in the background$/ do
+ run_spork_in_background
+end
+
+Given /^I am running spork in the background on port (\d+)$/ do |port|
+ run_spork_in_background(port.to_i)
+end
+
+Given /^I am not running (?:.*) in the background$/ do
+ # no-op
+end
+
+Given /^I have environment variable (\w+) set to "([^\"]*)"$/ do |variable, value|
+ set_env_var(variable, value)
+end
+
+When /^I run cucumber (.*)$/ do |cucumber_opts|
+ run "#{Cucumber::RUBY_BINARY} #{Cucumber::BINARY} --no-color #{cucumber_opts}"
+end
+
+When /^I run rake (.*)$/ do |rake_opts|
+ run "rake #{rake_opts} --trace"
+end
+
+Then /^it should (fail|pass)$/ do |success|
+ if success == 'fail'
+ last_exit_status.should_not == 0
+ else
+ if last_exit_status != 0
+ raise "Failed with exit status #{last_exit_status}\nSTDOUT:\n#{last_stdout}\nSTDERR:\n#{last_stderr}"
+ end
+ end
+end
+
+Then /^it should (fail|pass) with$/ do |success, output|
+ Then("it should #{success}")
+ last_stdout.should == output
+end
+
+Then /^the output should contain$/ do |text|
+ last_stdout.should include(text)
+end
+
+Then /^the output should not contain$/ do |text|
+ last_stdout.should_not include(text)
+end
+
+Then /^the output should be$/ do |text|
+ last_stdout.should == text
+end
+
+
+Then /^"([^\"]*)" should contain$/ do |file, text|
+ strip_duration(IO.read(file)).should == text
+end
+
+Then /^"([^\"]*)" with junit duration "([^\"]*)" should contain$/ do |actual_file, duration_replacement, text|
+ actual = IO.read(actual_file)
+ actual = replace_junit_duration(actual, duration_replacement)
+ actual = strip_ruby186_extra_trace(actual)
+ actual.should == text
+end
+
+Then /^"([^\"]*)" should match "([^\"]*)"$/ do |file, text|
+ IO.read(file).should =~ Regexp.new(text)
+end
+
+Then /^"([^\"]*)" should have the same contents as "([^\"]*)"$/ do |actual_file, expected_file|
+ actual = IO.read(actual_file)
+ actual = replace_duration(actual, '0m30.005s')
+ # Comment out to replace expected file. Use with care!
+ # File.open(expected_file, "w") {|io| io.write(actual)}
+ actual.should == IO.read(expected_file)
+end
+
+Then /^STDERR should match$/ do |text|
+ last_stderr.should =~ /#{text}/
+end
+
+Then /^STDERR should not match$/ do |text|
+ last_stderr.should_not =~ /#{text}/
+end
+
+Then /^STDERR should be$/ do |text|
+ last_stderr.should == text
+end
+
+Then /^STDERR should be empty$/ do
+ last_stderr.should == ""
+end
+
+Then /^"([^\"]*)" should exist$/ do |file|
+ File.exists?(file).should be_true
+ FileUtils.rm(file)
+end
+
+Then /^"([^\"]*)" should not be required$/ do |file_name|
+ last_stdout.should_not include("* #{file_name}")
+end
+
+Then /^"([^\"]*)" should be required$/ do |file_name|
+ last_stdout.should include("* #{file_name}")
+end
+
+Then /^exactly these files should be loaded:\s*(.*)$/ do |files|
+ last_stdout.scan(/^ \* (.*\.rb)$/).flatten.should == files.split(/,\s+/)
+end
+
+Then /^exactly these features should be ran:\s*(.*)$/ do |files|
+ last_stdout.scan(/^ \* (.*\.feature)$/).flatten.should == files.split(/,\s+/)
+end
+
+Then /^the (.*) profile should be used$/ do |profile|
+ last_stdout.should =~ /Using the #{profile} profile/
+end
+
+Then /^print output$/ do
+ puts last_stdout
+end
+
+
diff --git a/vendor/gems/gems/cucumber-0.4.4/features/step_definitions/extra_steps.rb b/vendor/gems/gems/cucumber-0.4.4/features/step_definitions/extra_steps.rb
new file mode 100755
index 00000000..c4fadd32
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/features/step_definitions/extra_steps.rb
@@ -0,0 +1,2 @@
+Given /^missing$/ do
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/features/step_definitions/simplest_steps.rb b/vendor/gems/gems/cucumber-0.4.4/features/step_definitions/simplest_steps.rb
new file mode 100755
index 00000000..e0b95d8b
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/features/step_definitions/simplest_steps.rb
@@ -0,0 +1,3 @@
+Given /^this step works$/ do
+end
+
diff --git a/vendor/gems/gems/cucumber-0.4.4/features/step_definitions/wire_steps.rb b/vendor/gems/gems/cucumber-0.4.4/features/step_definitions/wire_steps.rb
new file mode 100755
index 00000000..eb4faa05
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/features/step_definitions/wire_steps.rb
@@ -0,0 +1,14 @@
+Given /^there is a wire server running on port (\d+) which understands the following protocol:$/ do |port, table|
+ protocol = table.hashes
+ in_current_dir do
+ @wire_pid = fork do
+ @server = FakeWireServer.new(port.to_i, protocol)
+ @server.run
+ end
+ end
+end
+
+After('@wire') do
+ Process.kill('KILL', @wire_pid)
+ Process.wait
+end
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/features/support/env.rb b/vendor/gems/gems/cucumber-0.4.4/features/support/env.rb
new file mode 100755
index 00000000..3d0ee1a1
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/features/support/env.rb
@@ -0,0 +1,141 @@
+require 'rubygems'
+require 'tempfile'
+require 'spec/expectations'
+require 'fileutils'
+require 'forwardable'
+begin
+ require 'spork'
+rescue Gem::LoadError => ex
+ gem 'spork', '>= 0.7.3' # Ensure correct spork version number to avoid false-negatives.
+end
+
+class CucumberWorld
+ extend Forwardable
+ def_delegators CucumberWorld, :examples_dir, :self_test_dir, :working_dir, :cucumber_lib_dir
+
+ def self.examples_dir(subdir=nil)
+ @examples_dir ||= File.expand_path(File.join(File.dirname(__FILE__), '../../examples'))
+ subdir ? File.join(@examples_dir, subdir) : @examples_dir
+ end
+
+ def self.self_test_dir
+ @self_test_dir ||= examples_dir('self_test')
+ end
+
+ def self.working_dir
+ @working_dir ||= examples_dir('self_test/tmp')
+ end
+
+ def cucumber_lib_dir
+ @cucumber_lib_dir ||= File.expand_path(File.join(File.dirname(__FILE__), '../../lib'))
+ end
+
+ def initialize
+ @current_dir = self_test_dir
+ end
+
+ private
+ attr_reader :last_exit_status, :last_stderr
+
+ # The last standard out, with the duration line taken out (unpredictable)
+ def last_stdout
+ strip_1_9_paths(strip_duration(@last_stdout))
+ end
+
+ def strip_duration(s)
+ s.gsub(/^\d+m\d+\.\d+s\n/m, "")
+ end
+
+ def strip_1_9_paths(s)
+ s.gsub(/#{Dir.pwd}\/examples\/self_test\/tmp/m, ".").gsub(/#{Dir.pwd}\/examples\/self_test/m, ".")
+ end
+
+ def replace_duration(s, replacement)
+ s.gsub(/\d+m\d+\.\d+s/m, replacement)
+ end
+
+ def replace_junit_duration(s, replacement)
+ s.gsub(/\d+\.\d\d+/m, replacement)
+ end
+
+ def strip_ruby186_extra_trace(s)
+ s.gsub(/^.*\.\/features\/step_definitions(.*)\n/, "")
+ end
+
+ def create_file(file_name, file_content)
+ file_content.gsub!("CUCUMBER_LIB", "'#{cucumber_lib_dir}'") # Some files, such as Rakefiles need to use the lib dir
+ in_current_dir do
+ FileUtils.mkdir_p(File.dirname(file_name)) unless File.directory?(File.dirname(file_name))
+ File.open(file_name, 'w') { |f| f << file_content }
+ end
+ end
+
+ def set_env_var(variable, value)
+ @original_env_vars ||= {}
+ @original_env_vars[variable] = ENV[variable]
+ ENV[variable] = value
+ end
+
+ def background_jobs
+ @background_jobs ||= []
+ end
+
+ def in_current_dir(&block)
+ Dir.chdir(@current_dir, &block)
+ end
+
+ def run(command)
+ stderr_file = Tempfile.new('cucumber')
+ stderr_file.close
+ in_current_dir do
+ mode = Cucumber::RUBY_1_9 ? {:external_encoding=>"UTF-8"} : 'r'
+ IO.popen("#{command} 2> #{stderr_file.path}", mode) do |io|
+ @last_stdout = io.read
+ end
+
+ @last_exit_status = $?.exitstatus
+ end
+ @last_stderr = IO.read(stderr_file.path)
+ end
+
+ def run_spork_in_background(port = nil)
+ pid = fork
+ in_current_dir do
+ if pid
+ background_jobs << pid
+ else
+ # STDOUT.close
+ # STDERR.close
+ port_arg = port ? "-p #{port}" : ''
+ cmd = "#{Cucumber::RUBY_BINARY} -I #{Cucumber::LIBDIR} #{Spork::BINARY} cuc #{port_arg}"
+ exec cmd
+ end
+ end
+ sleep (ENV["RUN_CODE_RUN"] ? 5.0 : 1.0)
+ end
+
+ def terminate_background_jobs
+ background_jobs.each do |pid|
+ Process.kill(Signal.list['TERM'], pid)
+ end
+ end
+
+ def restore_original_env_vars
+ @original_env_vars.each { |variable, value| ENV[variable] = value } if @original_env_vars
+ end
+
+end
+
+World do
+ CucumberWorld.new
+end
+
+Before do
+ FileUtils.rm_rf CucumberWorld.working_dir
+ FileUtils.mkdir CucumberWorld.working_dir
+end
+
+After do
+ terminate_background_jobs
+ restore_original_env_vars
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/features/support/env.rb.simplest b/vendor/gems/gems/cucumber-0.4.4/features/support/env.rb.simplest
new file mode 100755
index 00000000..f9ce884a
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/features/support/env.rb.simplest
@@ -0,0 +1,7 @@
+require 'rubygems'
+
+class SomeException < Exception; end
+
+Before do
+ raise SomeException.new("I cannot even start this scenario")
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/features/support/fake_wire_server.rb b/vendor/gems/gems/cucumber-0.4.4/features/support/fake_wire_server.rb
new file mode 100755
index 00000000..a0a1ed3e
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/features/support/fake_wire_server.rb
@@ -0,0 +1,63 @@
+require 'socket'
+require 'json'
+
+class FakeWireServer
+ def initialize(port, protocol_table)
+ @port, @protocol_table = port, protocol_table
+ end
+
+ def run
+ @server = TCPServer.open(@port)
+ loop { handle_connections }
+ end
+
+ private
+
+ def handle_connections
+ Thread.start(@server.accept) { |socket| open_session_on socket }
+ end
+
+ def open_session_on(socket)
+ begin
+ SocketSession.new(socket, @protocol_table).start
+ rescue Exception => e
+ raise e
+ ensure
+ socket.close
+ end
+ end
+
+ class SocketSession
+ def initialize(socket, protocol)
+ @socket = socket
+ @protocol = protocol
+ end
+
+ def start
+ while message = @socket.gets
+ handle(message)
+ end
+ end
+
+ private
+
+ def handle(data)
+ if protocol_entry = response_to(data.strip)
+ send_response(protocol_entry['response'])
+ else
+ serialized_exception = { :message => "Not understood: #{data}", :backtrace => [] }
+ send_response(['fail', serialized_exception ].to_json)
+ end
+ end
+
+ def response_to(data)
+ @protocol.detect do |entry|
+ JSON.parse(entry['request']) == JSON.parse(data)
+ end
+ end
+
+ def send_response(response)
+ @socket.puts response + "\n"
+ end
+ end
+end
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/features/table_diffing.feature b/vendor/gems/gems/cucumber-0.4.4/features/table_diffing.feature
new file mode 100755
index 00000000..efd4931e
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/features/table_diffing.feature
@@ -0,0 +1,45 @@
+Feature: Table diffing
+ In order to more easily compare data in tables
+ step definition writers should be able to diff
+ a table with expected data and see the diff inline
+
+ Scenario: Extra row
+ Given a standard Cucumber project directory structure
+ And a file named "features/tables.feature" with:
+ """
+ Feature: Tables
+ Scenario: Extra row
+ Then the table should be:
+ | x | y |
+ | a | b |
+ """
+ And a file named "features/step_definitions/table_steps.rb" with:
+ """
+ Then /the table should be:/ do |expected|
+ expected.diff!(table(%{
+ | x | y |
+ | a | c |
+ }))
+ end
+ """
+ When I run cucumber -i features/tables.feature
+ Then it should fail with
+ """
+ Feature: Tables
+
+ Scenario: Extra row # features/tables.feature:2
+ Then the table should be: # features/step_definitions/table_steps.rb:1
+ | x | y |
+ | a | b |
+ | a | c |
+ Tables were not identical (Cucumber::Ast::Table::Different)
+ ./features/step_definitions/table_steps.rb:2:in `/the table should be:/'
+ features/tables.feature:3:in `Then the table should be:'
+
+ Failing Scenarios:
+ cucumber features/tables.feature:2 # Scenario: Extra row
+
+ 1 scenario (1 failed)
+ 1 step (1 failed)
+
+ """
diff --git a/vendor/gems/gems/cucumber-0.4.4/features/table_mapping.feature b/vendor/gems/gems/cucumber-0.4.4/features/table_mapping.feature
new file mode 100755
index 00000000..bc053247
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/features/table_mapping.feature
@@ -0,0 +1,35 @@
+Feature: Table mapping
+ Scenario: Mapping table shouldn't change output
+ Given a standard Cucumber project directory structure
+ And a file named "features/f.feature" with:
+ """
+ Feature: F
+ Scenario: S
+ Given a table:
+ | who |
+ | aslak |
+ """
+ And a file named "features/step_definitions/steps.rb" with:
+ """
+ Given /a table:/ do |table|
+ table.map_headers!(/who/i => 'Who')
+ table.map_column!('Who') { |who| "Cuke" }
+ table.hashes[0]['Who'] = "Joe"
+ table.hashes.should == [{"Who"=>"Joe"}]
+ end
+ """
+ When I run cucumber features/f.feature
+ Then STDERR should be empty
+ And it should pass with
+ """
+ Feature: F
+
+ Scenario: S # features/f.feature:2
+ Given a table: # features/step_definitions/steps.rb:1
+ | who |
+ | aslak |
+
+ 1 scenario (1 passed)
+ 1 step (1 passed)
+
+ """
diff --git a/vendor/gems/gems/cucumber-0.4.4/features/tag_logic.feature b/vendor/gems/gems/cucumber-0.4.4/features/tag_logic.feature
new file mode 100755
index 00000000..e0baca06
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/features/tag_logic.feature
@@ -0,0 +1,258 @@
+Feature: Tag logic
+ In order to conveniently run subsets of features
+ As a Cuker
+ I want to select features using logical AND/OR of tags
+
+ Background:
+ Given a standard Cucumber project directory structure
+ And a file named "features/tagulicious.feature" with:
+ """
+ Feature: Sample
+
+ @one @three
+ Scenario: Example
+ Given passing
+
+ @one
+ Scenario: Another Example
+ Given passing
+
+ @three
+ Scenario: Yet another Example
+ Given passing
+
+ @ignore
+ Scenario: And yet another Example
+ """
+
+ Scenario: ANDing tags
+ When I run cucumber -q -t @one,@three features/tagulicious.feature
+ Then it should pass
+ And the output should contain
+ """
+ Feature: Sample
+
+ @one @three
+ Scenario: Example
+ Given passing
+
+ 1 scenario (1 undefined)
+ 1 step (1 undefined)
+
+ """
+
+ Scenario: ORing tags
+ When I run cucumber -q -t @one -t @three features/tagulicious.feature
+ Then it should pass
+ And the output should contain
+ """
+ Feature: Sample
+
+ @one @three
+ Scenario: Example
+ Given passing
+
+ @one
+ Scenario: Another Example
+ Given passing
+
+ @three
+ Scenario: Yet another Example
+ Given passing
+
+ 3 scenarios (3 undefined)
+ 3 steps (3 undefined)
+
+ """
+
+ Scenario: Before hooks ORing
+ Given a file named "features/support/hooks.rb" with:
+ """
+ Before('@one', '@three') do
+ raise 'boom'
+ end
+ """
+ When I run cucumber -q features/tagulicious.feature
+ Then it should fail with
+ """
+ Feature: Sample
+
+ @one @three
+ Scenario: Example
+ boom (RuntimeError)
+ ./features/support/hooks.rb:2:in `Before'
+ Given passing
+
+ @one
+ Scenario: Another Example
+ boom (RuntimeError)
+ ./features/support/hooks.rb:2:in `Before'
+ Given passing
+
+ @three
+ Scenario: Yet another Example
+ boom (RuntimeError)
+ ./features/support/hooks.rb:2:in `Before'
+ Given passing
+
+ @ignore
+ Scenario: And yet another Example
+
+ Failing Scenarios:
+ cucumber features/tagulicious.feature:4 # Scenario: Example
+ cucumber features/tagulicious.feature:8 # Scenario: Another Example
+ cucumber features/tagulicious.feature:12 # Scenario: Yet another Example
+
+ 4 scenarios (3 failed, 1 passed)
+ 3 steps (3 undefined)
+
+ """
+
+ Scenario: Before hooks ANDing
+ Given a file named "features/support/hooks.rb" with:
+ """
+ Before('@one,@three') do
+ raise 'boom'
+ end
+ """
+ When I run cucumber -q features/tagulicious.feature
+ Then it should fail with
+ """
+ Feature: Sample
+
+ @one @three
+ Scenario: Example
+ boom (RuntimeError)
+ ./features/support/hooks.rb:2:in `Before'
+ Given passing
+
+ @one
+ Scenario: Another Example
+ Given passing
+
+ @three
+ Scenario: Yet another Example
+ Given passing
+
+ @ignore
+ Scenario: And yet another Example
+
+ Failing Scenarios:
+ cucumber features/tagulicious.feature:4 # Scenario: Example
+
+ 4 scenarios (1 failed, 2 undefined, 1 passed)
+ 3 steps (3 undefined)
+
+ """
+
+ Scenario: Before hooks ANDing with a bad hook matching nothing
+ Given a file named "features/support/hooks.rb" with:
+ """
+ Before('@one,@notused') do
+ raise 'boom'
+ end
+ """
+ When I run cucumber -q features/tagulicious.feature
+ Then it should pass with
+ """
+ Feature: Sample
+
+ @one @three
+ Scenario: Example
+ Given passing
+
+ @one
+ Scenario: Another Example
+ Given passing
+
+ @three
+ Scenario: Yet another Example
+ Given passing
+
+ @ignore
+ Scenario: And yet another Example
+
+ 4 scenarios (3 undefined, 1 passed)
+ 3 steps (3 undefined)
+
+ """
+
+ Scenario: After hooks ORing
+ Given a file named "features/support/hooks.rb" with:
+ """
+ After('@one', '@three') do
+ raise 'boom'
+ end
+ """
+ When I run cucumber -q features/tagulicious.feature
+ Then it should fail with
+ """
+ Feature: Sample
+
+ @one @three
+ Scenario: Example
+ Given passing
+ boom (RuntimeError)
+ ./features/support/hooks.rb:2:in `After'
+
+ @one
+ Scenario: Another Example
+ Given passing
+ boom (RuntimeError)
+ ./features/support/hooks.rb:2:in `After'
+
+ @three
+ Scenario: Yet another Example
+ Given passing
+ boom (RuntimeError)
+ ./features/support/hooks.rb:2:in `After'
+
+ @ignore
+ Scenario: And yet another Example
+
+ Failing Scenarios:
+ cucumber features/tagulicious.feature:4 # Scenario: Example
+ cucumber features/tagulicious.feature:8 # Scenario: Another Example
+ cucumber features/tagulicious.feature:12 # Scenario: Yet another Example
+
+ 4 scenarios (3 failed, 1 passed)
+ 3 steps (3 undefined)
+
+ """
+
+ Scenario: After hooks ANDing
+ Given a file named "features/support/hooks.rb" with:
+ """
+ After('@one,@three') do
+ raise 'boom'
+ end
+ """
+ When I run cucumber -q features/tagulicious.feature
+ Then it should fail with
+ """
+ Feature: Sample
+
+ @one @three
+ Scenario: Example
+ Given passing
+ boom (RuntimeError)
+ ./features/support/hooks.rb:2:in `After'
+
+ @one
+ Scenario: Another Example
+ Given passing
+
+ @three
+ Scenario: Yet another Example
+ Given passing
+
+ @ignore
+ Scenario: And yet another Example
+
+ Failing Scenarios:
+ cucumber features/tagulicious.feature:4 # Scenario: Example
+
+ 4 scenarios (1 failed, 2 undefined, 1 passed)
+ 3 steps (3 undefined)
+
+ """
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/features/transform.feature b/vendor/gems/gems/cucumber-0.4.4/features/transform.feature
new file mode 100755
index 00000000..f5e2303f
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/features/transform.feature
@@ -0,0 +1,231 @@
+Feature: transform
+ In order to maintain modularity within step definitions
+ As a step definition editor
+ I want to register a regex to capture and tranform step definition arguments.
+
+ Background:
+ Given a standard Cucumber project directory structure
+ And a file named "features/step_definitions/steps.rb" with:
+ """
+ Then /^I should transform ('\d+' to an Integer)$/ do |integer|
+ integer.should be_kind_of(Integer)
+ end
+
+ Then /^I should transform ('\w+' to a Symbol)$/ do |symbol|
+ symbol.should be_kind_of(Symbol)
+ end
+
+ Then /^I should transform ('\d+' to a Float)$/ do |float|
+ float.should be_kind_of(Float)
+ end
+
+ Then /^I should transform ('\w+' to an Array)$/ do |array|
+ array.should be_kind_of(Array)
+ end
+
+ Then /^I should transform ('\w+' to Nil)$/ do |string|
+ string.should be_nil
+ end
+
+ Then /^I should not transform ('\d+') to an Integer$/ do |string|
+ string.should be_kind_of(String)
+ end
+ """
+ And a file named "features/support/env.rb" with:
+ """
+ Transform /^'\d+' to an Integer$/ do |step_arg|
+ /'(\d+)' to an Integer/.match(step_arg).captures[0].to_i
+ end
+
+ Transform /^'(\d+)' to a Float$/ do |integer_string|
+ Transform("'#{integer_string}' to an Integer").to_f
+ end
+
+ Transform(/^('\w+') to Nil$/) {|str| nil }
+
+ Transform(/^('\w+') to a Symbol$/) {|str| str.to_sym }
+
+ module MyHelpers
+ def fetch_array
+ @array
+ end
+ end
+
+ World(MyHelpers)
+
+ Before do
+ @array = []
+ end
+
+ Transform(/^('\w+') to an Array$/) {|str| fetch_array }
+ """
+
+ Scenario: run a specific scenario with a registered transform
+ Given a file named "features/transform_sample.feature" with:
+ """
+ Feature: Step argument transformations
+
+ Scenario: transform with matches
+ Then I should transform '10' to an Integer
+
+ Scenario: transform with matches that capture
+ Then I should transform 'abc' to a Symbol
+
+ Scenario: transform with matches that reuse transforms
+ Then I should transform '10' to a Float
+
+ Scenario: transform with matches that use current world
+ Then I should transform 'abc' to an Array
+
+ Scenario: transform with matches that return nil
+ Then I should transform 'nil' to Nil
+
+ Scenario: transform without matches
+ Then I should not transform '10' to an Integer
+ """
+ When I run cucumber -s features
+ Then it should pass with
+ """
+ Feature: Step argument transformations
+
+ Scenario: transform with matches
+ Then I should transform '10' to an Integer
+
+ Scenario: transform with matches that capture
+ Then I should transform 'abc' to a Symbol
+
+ Scenario: transform with matches that reuse transforms
+ Then I should transform '10' to a Float
+
+ Scenario: transform with matches that use current world
+ Then I should transform 'abc' to an Array
+
+ Scenario: transform with matches that return nil
+ Then I should transform 'nil' to Nil
+
+ Scenario: transform without matches
+ Then I should not transform '10' to an Integer
+
+ 6 scenarios (6 passed)
+ 6 steps (6 passed)
+
+ """
+
+ Scenario: run a table scenario with an unrelated registered transform
+ Given a file named "features/transform_sample.feature" with:
+ """
+ Feature: Step argument transformations
+
+ Scenario: A table
+ Then I should check the following table:
+ | letter | letter_plus_a |
+ | r | ra |
+ | m | ma |
+ | p | pa |
+ """
+ And a file named "features/support/table.rb" with:
+ """
+ Transform /^table:number,number_plus_a$/ do |table|
+ :not_what_you_were_expecting
+ end
+
+ Then "I should check the following table:" do |table|
+ table.hashes.each do |hash|
+ hash['letter_plus_a'].should == (hash['letter'] + 'a')
+ end
+ end
+ """
+ When I run cucumber -s features
+ Then it should pass with
+ """
+ Feature: Step argument transformations
+
+ Scenario: A table
+ Then I should check the following table:
+ | letter | letter_plus_a |
+ | r | ra |
+ | m | ma |
+ | p | pa |
+
+ 1 scenario (1 passed)
+ 1 step (1 passed)
+
+ """
+
+ Scenario: run a table scenario with an related registered transform not using table
+ Given a file named "features/transform_sample.feature" with:
+ """
+ Feature: Step argument transformations
+
+ Scenario: A table
+ Then I should check the following table:
+ | letter | letter_plus_a |
+ | r | ra |
+ | m | ma |
+ | p | pa |
+ """
+ And a file named "features/support/table.rb" with:
+ """
+ Transform /^table:letter,letter_plus_a$/ do |table|
+ 1
+ end
+
+ Then "I should check the following table:" do |columns|
+ columns.should == 1
+ end
+ """
+ When I run cucumber -s features
+ Then it should pass with
+ """
+ Feature: Step argument transformations
+
+ Scenario: A table
+ Then I should check the following table:
+ | letter | letter_plus_a |
+ | r | ra |
+ | m | ma |
+ | p | pa |
+
+ 1 scenario (1 passed)
+ 1 step (1 passed)
+
+ """
+
+ Scenario: run a table scenario with an related registered transform using table
+ Given a file named "features/transform_sample.feature" with:
+ """
+ Feature: Step argument transformations
+
+ Scenario: A table
+ Then I should check the following table:
+ | letter | letter_plus_a |
+ | r | ra |
+ | m | ma |
+ | p | pa |
+ """
+ And a file named "features/support/table.rb" with:
+ """
+ Transform /^table:letter,letter_plus_a$/ do |table|
+ table.rows.map { |row| row.join(',') }
+ end
+
+ Then "I should check the following table:" do |rows_in_table|
+ rows_in_table.should == ['r,ra','m,ma','p,pa']
+ end
+ """
+ When I run cucumber -b -s features
+ Then it should pass with
+ """
+ Feature: Step argument transformations
+
+ Scenario: A table
+ Then I should check the following table:
+ | letter | letter_plus_a |
+ | r | ra |
+ | m | ma |
+ | p | pa |
+
+ 1 scenario (1 passed)
+ 1 step (1 passed)
+
+ """
diff --git a/vendor/gems/gems/cucumber-0.4.4/features/unicode_table.feature b/vendor/gems/gems/cucumber-0.4.4/features/unicode_table.feature
new file mode 100755
index 00000000..44441bf1
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/features/unicode_table.feature
@@ -0,0 +1,35 @@
+Feature: Unicode in tables
+ In order to please the whole world,
+ unicode characters in tables should be
+ properly aligned
+
+ Scenario: All sorts of weird stuff
+ Given a standard Cucumber project directory structure
+ And a file named "features/unicode.feature" with:
+ """
+ Feature: Featuring unicode
+
+ Scenario: So what, whatever
+ Given passing
+ | Brüno | abc |
+ | Bruno | æøå |
+ """
+ And a file named "features/env.rb" with:
+ """
+ $KCODE='u'
+ """
+ When I run cucumber -q --dry-run features/unicode.feature
+ Then it should pass with
+ """
+ Feature: Featuring unicode
+
+ Scenario: So what, whatever
+ Given passing
+ | Brüno | abc |
+ | Bruno | æøå |
+
+ 1 scenario (1 undefined)
+ 1 step (1 undefined)
+
+ """
+
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/features/usage_and_stepdefs_formatter.feature b/vendor/gems/gems/cucumber-0.4.4/features/usage_and_stepdefs_formatter.feature
new file mode 100755
index 00000000..ad9a244b
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/features/usage_and_stepdefs_formatter.feature
@@ -0,0 +1,169 @@
+Feature: Cucumber command line
+ In order to be able to write an editor plugin that can jump between
+ steps and step definitions, Cucumber must provide a way to
+ display how they are related.
+
+ Scenario: List usage of step definitions
+ When I run cucumber features --format usage --dry-run
+ Then STDERR should be empty
+ And it should pass with
+ """
+ -------------------------------------UU-U--------------UUUUU---------U-------U--------------U-UU-------------------------------------------------UU
+
+ /^'(.+)' cukes$/ # features/step_definitions/sample_steps.rb:27
+ Given '10' cukes # features/background/background_with_name.feature:4
+ Given '10' cukes # features/background/background_with_name.feature:4
+ And '10' cukes # features/background/failing_background.feature:6
+ And '10' cukes # features/background/failing_background.feature:6
+ And '10' cukes # features/background/failing_background.feature:6
+ Given '10' cukes # features/background/passing_background.feature:4
+ Given '10' cukes # features/background/passing_background.feature:4
+ Given '10' cukes # features/background/passing_background.feature:4
+ Given '10' cukes # features/background/scenario_outline_passing_background.feature:4
+ Given '2' cukes # features/tons_of_cukes.feature:4
+ Given '2' cukes # features/tons_of_cukes.feature:5
+ Given '2' cukes # features/tons_of_cukes.feature:6
+ Given '2' cukes # features/tons_of_cukes.feature:7
+ Given '2' cukes # features/tons_of_cukes.feature:8
+ Given '2' cukes # features/tons_of_cukes.feature:9
+ Given '2' cukes # features/tons_of_cukes.feature:10
+ Given '2' cukes # features/tons_of_cukes.feature:11
+ Given '2' cukes # features/tons_of_cukes.feature:12
+ Given '2' cukes # features/tons_of_cukes.feature:13
+ Given '2' cukes # features/tons_of_cukes.feature:14
+ Given '2' cukes # features/tons_of_cukes.feature:15
+ Given '2' cukes # features/tons_of_cukes.feature:16
+ Given '2' cukes # features/tons_of_cukes.feature:17
+ Given '2' cukes # features/tons_of_cukes.feature:18
+ Given '2' cukes # features/tons_of_cukes.feature:19
+ Given '2' cukes # features/tons_of_cukes.feature:20
+ Given '2' cukes # features/tons_of_cukes.feature:21
+ Given '2' cukes # features/tons_of_cukes.feature:22
+ Given '2' cukes # features/tons_of_cukes.feature:23
+ Given '2' cukes # features/tons_of_cukes.feature:24
+ Given '2' cukes # features/tons_of_cukes.feature:25
+ Given '2' cukes # features/tons_of_cukes.feature:26
+ Given '2' cukes # features/tons_of_cukes.feature:27
+ Given '2' cukes # features/tons_of_cukes.feature:28
+ Given '2' cukes # features/tons_of_cukes.feature:29
+ Given '2' cukes # features/tons_of_cukes.feature:30
+ Given '2' cukes # features/tons_of_cukes.feature:31
+ Given '2' cukes # features/tons_of_cukes.feature:32
+ Given '2' cukes # features/tons_of_cukes.feature:33
+ Given '2' cukes # features/tons_of_cukes.feature:34
+ Given '2' cukes # features/tons_of_cukes.feature:35
+ Given '2' cukes # features/tons_of_cukes.feature:36
+ Given '2' cukes # features/tons_of_cukes.feature:37
+ Given '2' cukes # features/tons_of_cukes.feature:38
+ Given '2' cukes # features/tons_of_cukes.feature:39
+ Given '2' cukes # features/tons_of_cukes.feature:40
+ Given '2' cukes # features/tons_of_cukes.feature:41
+ Given '2' cukes # features/tons_of_cukes.feature:42
+ Given '2' cukes # features/tons_of_cukes.feature:43
+ Given '2' cukes # features/tons_of_cukes.feature:44
+ Given '2' cukes # features/tons_of_cukes.feature:45
+ Given '2' cukes # features/tons_of_cukes.feature:46
+ Given '2' cukes # features/tons_of_cukes.feature:47
+ Given '2' cukes # features/tons_of_cukes.feature:48
+ Given '2' cukes # features/tons_of_cukes.feature:49
+ Given '2' cukes # features/tons_of_cukes.feature:50
+ Given '2' cukes # features/tons_of_cukes.feature:51
+ Given '2' cukes # features/tons_of_cukes.feature:52
+ /^'(.+)' global cukes$/ # features/step_definitions/sample_steps.rb:35
+ And '10' global cukes # features/background/failing_background_after_success.feature:5
+ And '10' global cukes # features/background/failing_background_after_success.feature:5
+ And '10' global cukes # features/background/failing_background_after_success.feature:5
+ /^I should have '(.+)' cukes$/ # features/step_definitions/sample_steps.rb:31
+ Then I should have '10' cukes # features/background/background_with_name.feature:7
+ Then I should have '10' cukes # features/background/failing_background.feature:9
+ Then I should have '10' cukes # features/background/failing_background.feature:12
+ Then I should have '10' cukes # features/background/passing_background.feature:7
+ Then I should have '10' cukes # features/background/passing_background.feature:10
+ Then I should have '10' cukes # features/background/pending_background.feature:7
+ Then I should have '10' cukes # features/background/pending_background.feature:10
+ /^I should have '(.+)' global cukes$/ # features/step_definitions/sample_steps.rb:42
+ Then I should have '10' global cukes # features/background/failing_background_after_success.feature:8
+ Then I should have '10' global cukes # features/background/failing_background_after_success.feature:11
+ /^a step definition that calls an undefined step$/ # features/step_definitions/sample_steps.rb:19
+ Given a step definition that calls an undefined step # features/call_undefined_step_from_step_def.feature:4
+ /^another unused$/ # features/step_definitions/sample_steps.rb:69
+ NOT MATCHED BY ANY STEPS
+ /^call step "(.*)"$/ # features/step_definitions/sample_steps.rb:23
+ Given call step "a step definition that calls an undefined step" # features/call_undefined_step_from_step_def.feature:7
+ /^failing expectation$/ # features/step_definitions/sample_steps.rb:62
+ Given failing expectation # features/failing_expectation.feature:4
+ /^failing without a table$/ # features/step_definitions/sample_steps.rb:15
+ Given failing without a table # features/background/failing_background.feature:5
+ Given failing without a table # features/background/failing_background.feature:5
+ Given failing without a table # features/background/failing_background.feature:5
+ Given failing without a table # features/background/scenario_outline_failing_background.feature:4
+ Given failing without a table # features/search_sample.feature:10
+ /^failing$/ # features/step_definitions/sample_steps.rb:8
+ Given failing # features/sample.feature:18
+ /^multiline string$/ # features/step_definitions/sample_steps.rb:50
+ And multiline string # features/background/multiline_args_background.feature:7
+ And multiline string # features/background/multiline_args_background.feature:7
+ And multiline string # features/background/multiline_args_background.feature:7
+ /^passing without a table$/ # features/step_definitions/sample_steps.rb:12
+ Given passing without a table # features/background/background_tagged_before_on_outline.feature:5
+ Given passing without a table # features/background/failing_background_after_success.feature:4
+ Given passing without a table # features/background/failing_background_after_success.feature:4
+ Given passing without a table # features/background/failing_background_after_success.feature:4
+ Given passing without a table # features/multiline_name.feature:6
+ Given passing without a table # features/multiline_name.feature:6
+ Given passing without a table # features/multiline_name.feature:11
+ Given passing without a table # features/search_sample.feature:4
+ Given passing without a table # features/search_sample.feature:4
+ Given passing without a table # features/search_sample.feature:7
+ Given passing without a table # features/search_sample.feature:4
+ /^passing$/ # features/step_definitions/sample_steps.rb:5
+ Given passing # features/sample.feature:12
+ /^table$/ # features/step_definitions/sample_steps.rb:46
+ Given table # features/background/multiline_args_background.feature:4
+ Given table # features/background/multiline_args_background.feature:4
+ Given table # features/background/multiline_args_background.feature:4
+ /^the multiline string should be$/ # features/step_definitions/sample_steps.rb:58
+ Then the multiline string should be # features/background/multiline_args_background.feature:17
+ Then the multiline string should be # features/background/multiline_args_background.feature:27
+ /^the table should be$/ # features/step_definitions/sample_steps.rb:54
+ Then the table should be # features/background/multiline_args_background.feature:14
+ Then the table should be # features/background/multiline_args_background.feature:24
+ /^unused$/ # features/step_definitions/sample_steps.rb:66
+ NOT MATCHED BY ANY STEPS
+
+ 43 scenarios (32 skipped, 10 undefined, 1 passed)
+ 131 steps (117 skipped, 14 undefined)
+
+ """
+
+ Scenario: --format steps
+ When I run cucumber features --format stepdefs --dry-run
+ Then STDERR should be empty
+ And it should pass with
+ """
+ -------------------------------------UU-U--------------UUUUU---------U-------U--------------U-UU-------------------------------------------------UU
+
+ /^'(.+)' cukes$/ # features/step_definitions/sample_steps.rb:27
+ /^'(.+)' global cukes$/ # features/step_definitions/sample_steps.rb:35
+ /^I should have '(.+)' cukes$/ # features/step_definitions/sample_steps.rb:31
+ /^I should have '(.+)' global cukes$/ # features/step_definitions/sample_steps.rb:42
+ /^a step definition that calls an undefined step$/ # features/step_definitions/sample_steps.rb:19
+ /^another unused$/ # features/step_definitions/sample_steps.rb:69
+ NOT MATCHED BY ANY STEPS
+ /^call step "(.*)"$/ # features/step_definitions/sample_steps.rb:23
+ /^failing expectation$/ # features/step_definitions/sample_steps.rb:62
+ /^failing without a table$/ # features/step_definitions/sample_steps.rb:15
+ /^failing$/ # features/step_definitions/sample_steps.rb:8
+ /^multiline string$/ # features/step_definitions/sample_steps.rb:50
+ /^passing without a table$/ # features/step_definitions/sample_steps.rb:12
+ /^passing$/ # features/step_definitions/sample_steps.rb:5
+ /^table$/ # features/step_definitions/sample_steps.rb:46
+ /^the multiline string should be$/ # features/step_definitions/sample_steps.rb:58
+ /^the table should be$/ # features/step_definitions/sample_steps.rb:54
+ /^unused$/ # features/step_definitions/sample_steps.rb:66
+ NOT MATCHED BY ANY STEPS
+
+ 43 scenarios (32 skipped, 10 undefined, 1 passed)
+ 131 steps (117 skipped, 14 undefined)
+
+ """
diff --git a/vendor/gems/gems/cucumber-0.4.4/features/wire_protocol.feature b/vendor/gems/gems/cucumber-0.4.4/features/wire_protocol.feature
new file mode 100755
index 00000000..63319d66
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/features/wire_protocol.feature
@@ -0,0 +1,177 @@
+@wire
+Feature: Wire Protocol
+ In order to be allow Cucumber to touch my app in intimate places
+ As a developer on platform which doesn't support Ruby
+ I want a low-level protocol which Cucumber can use to run steps within my app
+
+ #
+ # Cucumber's wire protocol is an implementation of Cucumber's internal 'programming language' abstraction,
+ # and allows step definitions to be implemented and invoked on any platform.
+ #
+ # Communication is over a TCP socket, which Cucumber connects to when it finds a definition file with the
+ # .wire extension in the step_definitions folder (or other load path).
+ #
+ # There are currently two messages which Cucumber sends over the wire:
+ #
+ # * step_matches : this is used to find out whether the wire end has a definition for a given step
+ # * invoke : this is used to ask for a step definition to be invoked
+ #
+ # Message packets are formatted as JSON-encoded strings, with a newline character signalling the end of a
+ # packet. These messages are described below, with examples.
+ #
+
+ Background:
+ Given a standard Cucumber project directory structure
+ And a file named "features/wired.feature" with:
+ """
+ Scenario: Wired
+ Given we're all wired
+
+ """
+ And a file named "features/step_definitions/some_remote_place.wire" with:
+ """
+ host: localhost
+ port: 54321
+
+ """
+
+
+ #
+ # step_matches
+ #
+ # When the features have been parsed, Cucumber will send a step_matches message to ask the wire end
+ # if it can match a step name. This happens for each of the steps in each of the features.
+ # The wire end replies with a step_match array, containing the IDs of any step definitions that could
+ # be invoked for the given step name.
+
+ Scenario: Dry run finds no step match
+ Given there is a wire server running on port 54321 which understands the following protocol:
+ | request | response |
+ | ["step_matches",{"name_to_match":"we're all wired"}] | ["step_matches",[]] |
+ When I run cucumber --dry-run -f progress features
+ And it should pass with
+ """
+ U
+
+ 1 scenario (1 undefined)
+ 1 step (1 undefined)
+
+ """
+
+ # When a step match is returned, it contains an identifier for the step definition to be used
+ # later when referring to this step definition again if it needs to be invoked. The identifier
+ # can take any form (as long as it's within a string) and is simply used for the wire end's own
+ # reference.
+ # The step match also contains any argument values as parsed out by the wire end's own regular
+ # expression or other argument matching process.
+ Scenario: Dry run finds a step match
+ Given there is a wire server running on port 54321 which understands the following protocol:
+ | request | response |
+ | ["step_matches",{"name_to_match":"we're all wired"}] | ["step_matches",[{"id":"1", "args":[]}]] |
+ When I run cucumber --dry-run -f progress features
+ And it should pass with
+ """
+ -
+
+ 1 scenario (1 skipped)
+ 1 step (1 skipped)
+
+ """
+
+
+ #
+ # invoke
+ #
+ # Assuming a step_match was returned for a given step name, when it's time to invoke that
+ # step definition, Cucumber will send an invoke message.
+ # The message contains the ID of the step definition, as returned by the wire end from the
+ # step_matches call, along with the arguments that were parsed from the step name during the
+ # same step_matches call.
+ # The wire end will reply with either a step_failed or a success message.
+
+ Scenario: Invoke a step definition which passes
+ Given there is a wire server running on port 54321 which understands the following protocol:
+ | request | response |
+ | ["step_matches",{"name_to_match":"we're all wired"}] | ["step_matches",[{"id":"1", "args":[]}]] |
+ | ["begin_scenario",null] | ["success",null] |
+ | ["invoke",{"id":"1","args":[]}] | ["success",null] |
+ | ["end_scenario",null] | ["success",null] |
+ When I run cucumber -f progress --backtrace features
+ And it should pass with
+ """
+ .
+
+ 1 scenario (1 passed)
+ 1 step (1 passed)
+
+ """
+
+ # When a step definition fails, it can return details of the exception in the reply to invoke. These
+ # will then be passed by Cucumber to the formatters for display to the user.
+ #
+ Scenario: Invoke a step definition which fails
+ Given there is a wire server running on port 54321 which understands the following protocol:
+ | request | response |
+ | ["step_matches",{"name_to_match":"we're all wired"}] | ["step_matches",[{"id":"1", "args":[]}]] |
+ | ["begin_scenario",null] | ["success",null] |
+ | ["invoke",{"id":"1","args":[]}] | ["step_failed",{"message":"The wires are down"}] |
+ | ["end_scenario",null] | ["success",null] |
+ When I run cucumber -f progress features
+ Then STDERR should be empty
+ And it should fail with
+ """
+ F
+
+ (::) failed steps (::)
+
+ The wires are down (Cucumber::WireSupport::WireException)
+ features/wired.feature:2:in `Given we're all wired'
+
+ Failing Scenarios:
+ cucumber features/wired.feature:1 # Scenario: Wired
+
+ 1 scenario (1 failed)
+ 1 step (1 failed)
+
+ """
+
+ # Imagine we have a step definition like:
+ #
+ # Given /we're all (.*)/ do |what_we_are|
+ # end
+ #
+ # When this step definition matches the step name in our feature, the word 'wired' will be parsed as an
+ # argument.
+ #
+ # Cucumber expects this StepArgument to be returned in the StepMatch. The keys have the following meanings:
+ # * val : the value of the string captured for that argument from the step name passed in step_matches
+ # * pos : the position within the step name that the argument was matched (used for formatter highlighting)
+ #
+ Scenario: Invoke a step definition which takes arguments (and passes)
+ Given there is a wire server running on port 54321 which understands the following protocol:
+ | request | response |
+ | ["step_matches",{"name_to_match":"we're all wired"}] | ["step_matches",[{"id":"1", "args":[{"val":"wired", "pos":10}]}]] |
+ | ["begin_scenario",null] | ["success",null] |
+ | ["invoke",{"id":"1","args":["wired"]}] | ["success",null] |
+ | ["end_scenario",null] | ["success",null] |
+ When I run cucumber -f progress --backtrace features
+ Then STDERR should be empty
+ And it should pass with
+ """
+ .
+
+ 1 scenario (1 passed)
+ 1 step (1 passed)
+
+ """
+
+
+ Scenario: Unexpected response
+ Given there is a wire server running on port 54321 which understands the following protocol:
+ | request | response |
+ | ["begin_scenario",null] | ["yikes"] |
+ When I run cucumber -f progress features
+ Then STDERR should match
+ """
+ undefined method `handle_yikes'
+ """
diff --git a/vendor/gems/gems/cucumber-0.4.4/features/work_in_progress.feature b/vendor/gems/gems/cucumber-0.4.4/features/work_in_progress.feature
new file mode 100755
index 00000000..a4249075
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/features/work_in_progress.feature
@@ -0,0 +1,156 @@
+Feature: Cucumber --work-in-progress switch
+ In order to ensure that feature scenarios do not pass until they are expected to
+ Developers should be able to run cucumber in a mode that
+ - will fail if any scenario passes completely
+ - will not fail otherwise
+
+ Background: A passing and a pending feature
+ Given a standard Cucumber project directory structure
+ Given a file named "features/wip.feature" with:
+ """
+ Feature: WIP
+ @failing
+ Scenario: Failing
+ Given a failing step
+
+ @undefined
+ Scenario: Undefined
+ Given an undefined step
+
+ @pending
+ Scenario: Pending
+ Given a pending step
+
+ @passing
+ Scenario: Passing
+ Given a passing step
+ """
+ And a file named "features/passing_outline.feature" with:
+ """
+ Feature: Not WIP
+ Scenario Outline: Passing
+ Given a step
+
+ Examples:
+ | what |
+ | passing |
+ """
+ And a file named "features/step_definitions/steps.rb" with:
+ """
+ Given /^a failing step$/ do
+ raise "I fail"
+ end
+
+ Given /^a passing step$/ do
+ end
+
+ Given /^a pending step$/ do
+ pending
+ end
+ """
+
+ Scenario: Pass with Failing Scenarios
+ When I run cucumber -q -w -t @failing features/wip.feature
+ Then STDERR should be empty
+ Then it should pass with
+ """
+ Feature: WIP
+
+ @failing
+ Scenario: Failing
+ Given a failing step
+ I fail (RuntimeError)
+ ./features/step_definitions/steps.rb:2:in `/^a failing step$/'
+ features/wip.feature:4:in `Given a failing step'
+
+ Failing Scenarios:
+ cucumber features/wip.feature:3 # Scenario: Failing
+
+ 1 scenario (1 failed)
+ 1 step (1 failed)
+
+ The --wip switch was used, so the failures were expected. All is good.
+
+ """
+
+ Scenario: Pass with Undefined Scenarios
+ When I run cucumber -q -w -t @undefined features/wip.feature
+ Then it should pass with
+ """
+ Feature: WIP
+
+ @undefined
+ Scenario: Undefined
+ Given an undefined step
+
+ 1 scenario (1 undefined)
+ 1 step (1 undefined)
+
+ The --wip switch was used, so the failures were expected. All is good.
+
+ """
+
+ Scenario: Pass with Undefined Scenarios
+ When I run cucumber -q -w -t @pending features/wip.feature
+ Then it should pass with
+ """
+ Feature: WIP
+
+ @pending
+ Scenario: Pending
+ Given a pending step
+ TODO (Cucumber::Pending)
+ ./features/step_definitions/steps.rb:9:in `/^a pending step$/'
+ features/wip.feature:12:in `Given a pending step'
+
+ 1 scenario (1 pending)
+ 1 step (1 pending)
+
+ The --wip switch was used, so the failures were expected. All is good.
+
+ """
+
+ Scenario: Fail with Passing Scenarios
+ When I run cucumber -q -w -t @passing features/wip.feature
+ Then it should fail with
+ """
+ Feature: WIP
+
+ @passing
+ Scenario: Passing
+ Given a passing step
+
+ 1 scenario (1 passed)
+ 1 step (1 passed)
+
+ The --wip switch was used, so I didn't expect anything to pass. These scenarios passed:
+ (::) passed scenarios (::)
+
+ features/wip.feature:15:in `Scenario: Passing'
+
+
+ """
+
+ Scenario: Fail with Passing Scenario Outline
+ When I run cucumber -q -w features/passing_outline.feature
+ Then it should fail with
+ """
+ Feature: Not WIP
+
+ Scenario Outline: Passing
+ Given a step
+
+ Examples:
+ | what |
+ | passing |
+
+ 1 scenario (1 passed)
+ 1 step (1 passed)
+
+ The --wip switch was used, so I didn't expect anything to pass. These scenarios passed:
+ (::) passed scenarios (::)
+
+ features/passing_outline.feature:7:in `| passing |'
+
+
+ """
diff --git a/vendor/gems/gems/cucumber-0.4.4/gem_tasks/contributors.rake b/vendor/gems/gems/cucumber-0.4.4/gem_tasks/contributors.rake
new file mode 100755
index 00000000..3471ef7b
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/gem_tasks/contributors.rake
@@ -0,0 +1,13 @@
+# encoding: utf-8
+task :contributors do
+ contributors = `git log --pretty=short --no-merges | git shortlog -ne | egrep -ve '^ +' | egrep -ve '^$'`
+ puts contributors.split("\n").length
+end
+
+task :codeswarm do
+ sh "code_swarm --reload" rescue nil # Fails because of encoding - which we'll fix
+ sh "iconv -f latin1 -t utf-8 .git/.code_swarm/log.xml > tmp.xml && mv tmp.xml .git/.code_swarm/log.xml"
+ sh "sed -e 's/Aslak\ Hellesøy@.BEKK.no/aslak.hellesoy@gmail.com/g' .git/.code_swarm/log.xml > tmp.xml && mv tmp.xml .git/.code_swarm/log.xml"
+ sh "sed -e 's/josephwilk@joesniff.co.uk/joe@josephwilk.net/g' .git/.code_swarm/log.xml > tmp.xml && mv tmp.xml .git/.code_swarm/log.xml"
+ sh "code_swarm"
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/gem_tasks/environment.rake b/vendor/gems/gems/cucumber-0.4.4/gem_tasks/environment.rake
new file mode 100755
index 00000000..691ed3b6
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/gem_tasks/environment.rake
@@ -0,0 +1,7 @@
+task :ruby_env do
+ RUBY_APP = if RUBY_PLATFORM =~ /java/
+ "jruby"
+ else
+ "ruby"
+ end unless defined? RUBY_APP
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/gem_tasks/features.rake b/vendor/gems/gems/cucumber-0.4.4/gem_tasks/features.rake
new file mode 100755
index 00000000..af355a67
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/gem_tasks/features.rake
@@ -0,0 +1,16 @@
+$:.unshift(File.dirname(__FILE__) + '/../lib')
+require 'cucumber/rake/task'
+require 'cucumber/platform'
+
+Cucumber::Rake::Task.new do |t|
+ if(Cucumber::JRUBY)
+ t.profile = 'jruby'
+ elsif(Cucumber::WINDOWS_MRI)
+ t.profile = 'windows_mri'
+ end
+ t.rcov = ENV['RCOV']
+end
+
+Cucumber::Rake::Task.new('pretty') do |t|
+ t.cucumber_opts = %w{--format pretty}
+end
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/gem_tasks/fix_cr_lf.rake b/vendor/gems/gems/cucumber-0.4.4/gem_tasks/fix_cr_lf.rake
new file mode 100755
index 00000000..88f09b2a
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/gem_tasks/fix_cr_lf.rake
@@ -0,0 +1,10 @@
+desc 'Make all files use UNIX (\n) line endings'
+task :fix_cr_lf do
+ files = FileList['**/*']
+ files.each do |f|
+ next if File.directory?(f) || f =~ /dos/
+ s = IO.read(f)
+ s.gsub!(/\r?\n/, "\n")
+ File.open(f, "w") { |io| io.write(s) }
+ end
+end
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/gem_tasks/flog.rake b/vendor/gems/gems/cucumber-0.4.4/gem_tasks/flog.rake
new file mode 100755
index 00000000..504dd53c
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/gem_tasks/flog.rake
@@ -0,0 +1,4 @@
+desc "Run flog over significant files"
+task :flog do
+ sh "find lib/cucumber -name \\*.rb | grep -v parser\/feature\\.rb | xargs flog"
+end
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/gem_tasks/rspec.rake b/vendor/gems/gems/cucumber-0.4.4/gem_tasks/rspec.rake
new file mode 100755
index 00000000..c5776b7a
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/gem_tasks/rspec.rake
@@ -0,0 +1,15 @@
+begin
+ require 'spec/expectations'
+ require 'spec/rake/spectask'
+
+ desc "Run RSpec"
+ Spec::Rake::SpecTask.new do |t|
+ t.spec_opts = ['--options', "spec/spec.opts"]
+ t.spec_files = FileList['spec/**/*_spec.rb']
+ t.rcov = ENV['RCOV']
+ t.rcov_opts = %w{--exclude osx\/objc,gems\/,spec\/}
+ t.verbose = true
+ end
+rescue LoadError
+ task :spec
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/gem_tasks/sass.rake b/vendor/gems/gems/cucumber-0.4.4/gem_tasks/sass.rake
new file mode 100755
index 00000000..5fba5057
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/gem_tasks/sass.rake
@@ -0,0 +1,4 @@
+desc 'Generate the css for the html formatter from sass'
+task :sass do
+ sh 'sass -t expanded lib/cucumber/formatter/cucumber.sass > lib/cucumber/formatter/cucumber.css'
+end
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/gem_tasks/sdoc.rake b/vendor/gems/gems/cucumber-0.4.4/gem_tasks/sdoc.rake
new file mode 100755
index 00000000..c3603d24
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/gem_tasks/sdoc.rake
@@ -0,0 +1,12 @@
+begin
+ require 'rake/rdoctask'
+ require 'sdoc' # and use your RDoc task the same way you used it before
+
+ Rake::RDocTask.new(:sdoc) do |rdoc|
+ rdoc.rdoc_dir = 'doc/sdoc'
+ rdoc.title = "Cucumber"
+ rdoc.options += %w{--fmt shtml -N --webcvs=http://github.com/aslakhellesoy/cucumber/blob/v0.3.96/%s --title "Cucumber API" --threads 4 --main README --exclude cucumber/parser lib}
+ rdoc.template = 'direct' # lighter template used on railsapi.com
+ end
+rescue LoadError => ignore
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/lib/README.rdoc b/vendor/gems/gems/cucumber-0.4.4/lib/README.rdoc
new file mode 100755
index 00000000..cae1a80a
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/lib/README.rdoc
@@ -0,0 +1,12 @@
+= Cucumber API
+
+This is the public API of Cucumber. The public API includes the classes, modules
+and methods you can use if you are a user of Cucumber. It also applies to you if
+you're developing a 3rd party tool that integrates with Cucumber.
+
+== Internal API
+
+Cucumber has more classes, modules and methods than what you can see in the public
+API. If you decide to dive into the source code and make use of an API that isn't
+part of this documentation - beware that this API might change at any time. If you
+want a particular internal API to be promoted to the public API - let us know.
diff --git a/vendor/gems/gems/cucumber-0.4.4/lib/autotest/cucumber.rb b/vendor/gems/gems/cucumber-0.4.4/lib/autotest/cucumber.rb
new file mode 100755
index 00000000..28417398
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/lib/autotest/cucumber.rb
@@ -0,0 +1,6 @@
+require 'autotest'
+require 'autotest/cucumber_mixin'
+
+class Autotest::Cucumber < Autotest
+ include CucumberMixin
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/lib/autotest/cucumber_mixin.rb b/vendor/gems/gems/cucumber-0.4.4/lib/autotest/cucumber_mixin.rb
new file mode 100755
index 00000000..97f81505
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/lib/autotest/cucumber_mixin.rb
@@ -0,0 +1,131 @@
+require 'autotest'
+require 'tempfile'
+require 'yaml'
+require 'cucumber'
+
+module Autotest::CucumberMixin
+ def self.included(receiver)
+ receiver::ALL_HOOKS << [:run_features, :ran_features]
+ end
+
+ attr_accessor :features_to_run
+
+ def initialize
+ super
+ reset_features
+ end
+
+ def run
+ hook :initialize
+ reset
+ reset_features
+ add_sigint_handler
+
+ self.last_mtime = Time.now if $f
+
+ loop do # ^c handler
+ begin
+ get_to_green
+ if self.tainted then
+ rerun_all_tests
+ rerun_all_features if all_good
+ else
+ hook :all_good
+ end
+ wait_for_changes
+ # Once tests and features are green, reset features every
+ # time a file is changed to see if anything breaks.
+ reset_features
+ rescue Interrupt
+ break if self.wants_to_quit
+ reset
+ reset_features
+ end
+ end
+ hook :quit
+ end
+
+ def all_features_good
+ features_to_run == ""
+ end
+
+ def get_to_green
+ begin
+ super
+ run_features
+ wait_for_changes unless all_features_good
+ end until all_features_good
+ end
+
+ def rerun_all_features
+ reset_features
+ run_features
+ end
+
+ def reset_features
+ self.features_to_run = :all
+ end
+
+ def run_features
+ hook :run_features
+ Tempfile.open('autotest-cucumber') do |dirty_features_file|
+ cmd = self.make_cucumber_cmd(self.features_to_run, dirty_features_file.path)
+ return if cmd.empty?
+ puts cmd unless $q
+ old_sync = $stdout.sync
+ $stdout.sync = true
+ self.results = []
+ line = []
+ begin
+ open("| #{cmd}", "r") do |f|
+ until f.eof? do
+ c = f.getc
+ putc c
+ line << c
+ if c == ?\n then
+ self.results << if RUBY_VERSION >= "1.9" then
+ line.join
+ else
+ line.pack "c*"
+ end
+ line.clear
+ end
+ end
+ end
+ ensure
+ $stdout.sync = old_sync
+ end
+ self.features_to_run = dirty_features_file.read.strip
+ self.tainted = true unless self.features_to_run == ''
+ end
+ hook :ran_features
+ end
+
+ def make_cucumber_cmd(features_to_run, dirty_features_filename)
+ return '' if features_to_run == ''
+
+ profiles = YAML.load_file("cucumber.yml").keys rescue []
+
+ profile ||= "autotest-all" if profiles.include?("autotest-all") and features_to_run == :all
+ profile ||= "autotest" if profiles.include?("autotest")
+ profile ||= nil
+
+ if profile
+ args = ["--profile", profile]
+ else
+ args = %w{--format} << (features_to_run == :all ? "progress" : "pretty")
+ end
+ # No --color option as some IDEs (Netbeans) don't output them very well ([31m1 failed step[0m)
+ args += %w{--format rerun --out} << dirty_features_filename
+ args << (features_to_run == :all ? "features" : features_to_run)
+
+ # Unless I do this, all the steps turn up undefined during the rerun...
+ unless features_to_run == :all
+ args << 'features/step_definitions' << 'features/support'
+ end
+
+ args = args.join(' ')
+
+ return "#{Cucumber::RUBY_BINARY} #{Cucumber::BINARY} #{args}"
+ end
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/lib/autotest/cucumber_rails.rb b/vendor/gems/gems/cucumber-0.4.4/lib/autotest/cucumber_rails.rb
new file mode 100755
index 00000000..604f0cad
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/lib/autotest/cucumber_rails.rb
@@ -0,0 +1,6 @@
+require 'autotest/rails'
+require 'autotest/cucumber_mixin'
+
+class Autotest::CucumberRails < Autotest::Rails
+ include CucumberMixin
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/lib/autotest/cucumber_rails_rspec.rb b/vendor/gems/gems/cucumber-0.4.4/lib/autotest/cucumber_rails_rspec.rb
new file mode 100755
index 00000000..0bac8b7f
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/lib/autotest/cucumber_rails_rspec.rb
@@ -0,0 +1,6 @@
+require 'autotest/cucumber_mixin'
+require 'autotest/rails_rspec'
+
+class Autotest::CucumberRailsRspec < Autotest::RailsRspec
+ include CucumberMixin
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/lib/autotest/cucumber_rspec.rb b/vendor/gems/gems/cucumber-0.4.4/lib/autotest/cucumber_rspec.rb
new file mode 100755
index 00000000..cdd90c07
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/lib/autotest/cucumber_rspec.rb
@@ -0,0 +1,6 @@
+require 'autotest/cucumber_mixin'
+require 'autotest/rspec'
+
+class Autotest::CucumberRspec < Autotest::Rspec
+ include CucumberMixin
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/lib/autotest/discover.rb b/vendor/gems/gems/cucumber-0.4.4/lib/autotest/discover.rb
new file mode 100755
index 00000000..2ee2636f
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/lib/autotest/discover.rb
@@ -0,0 +1,9 @@
+Autotest.add_discovery do
+ if File.directory?('features')
+ if ENV['AUTOFEATURE'] =~ /true/i
+ "cucumber"
+ else
+ puts "(Not running features. To run features in autotest, set AUTOFEATURE=true.)"
+ end
+ end
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/lib/cucumber.rb b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber.rb
new file mode 100755
index 00000000..7a523577
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber.rb
@@ -0,0 +1,15 @@
+$:.unshift(File.dirname(__FILE__)) unless
+ $:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
+
+require 'yaml'
+require 'cucumber/platform'
+require 'cucumber/parser'
+require 'cucumber/step_mother'
+require 'cucumber/cli/main'
+require 'cucumber/broadcaster'
+
+module Cucumber
+ class << self
+ attr_accessor :wants_to_quit
+ end
+end
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/ast.rb b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/ast.rb
new file mode 100755
index 00000000..a90de4fd
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/ast.rb
@@ -0,0 +1,30 @@
+require 'cucumber/ast/comment'
+require 'cucumber/ast/tags'
+require 'cucumber/ast/features'
+require 'cucumber/ast/feature'
+require 'cucumber/ast/background'
+require 'cucumber/ast/scenario'
+require 'cucumber/ast/scenario_outline'
+require 'cucumber/ast/step_invocation'
+require 'cucumber/ast/step_collection'
+require 'cucumber/ast/step'
+require 'cucumber/ast/table'
+require 'cucumber/ast/py_string'
+require 'cucumber/ast/outline_table'
+require 'cucumber/ast/examples'
+require 'cucumber/ast/visitor'
+require 'cucumber/ast/tree_walker'
+
+module Cucumber
+ # Classes in this module represent the Abstract Syntax Tree (AST)
+ # that gets built when feature files are parsed.
+ #
+ # AST classes don't expose any internal data directly. This is
+ # in order to encourage a less coupled design in the classes
+ # that operate on the AST. The only public method is #accept.
+ #
+ # The AST can be traversed with a visitor. See Cucumber::Format::Pretty
+ # for an example.
+ module Ast
+ end
+end
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/ast/background.rb b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/ast/background.rb
new file mode 100755
index 00000000..bd38ad0b
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/ast/background.rb
@@ -0,0 +1,75 @@
+require 'cucumber/ast/feature_element'
+
+module Cucumber
+ module Ast
+ class Background #:nodoc:
+ include FeatureElement
+ attr_reader :feature_elements
+
+ def initialize(comment, line, keyword, name, steps)
+ @comment, @line, @keyword, @name, @steps = comment, line, keyword, name, StepCollection.new(steps)
+ attach_steps(steps)
+ @step_invocations = @steps.step_invocations(true)
+ @feature_elements = []
+ end
+
+ def step_collection(step_invocations)
+ unless(@first_collection_created)
+ @first_collection_created = true
+ @step_invocations.dup(step_invocations)
+ else
+ @steps.step_invocations(true).dup(step_invocations)
+ end
+ end
+
+ def accept(visitor)
+ return if Cucumber.wants_to_quit
+ visitor.visit_comment(@comment) unless @comment.empty?
+ visitor.visit_background_name(@keyword, @name, file_colon_line(@line), source_indent(first_line_length))
+ with_visitor(hook_context, visitor) do
+ visitor.step_mother.before(hook_context)
+ visitor.visit_steps(@step_invocations)
+ @failed = @step_invocations.detect{|step_invocation| step_invocation.exception}
+ visitor.step_mother.after(hook_context) if @failed || @feature_elements.empty?
+ end
+ end
+
+ def with_visitor(scenario, visitor)
+ if self != scenario && scenario.respond_to?(:with_visitor)
+ scenario.with_visitor(visitor) do
+ yield
+ end
+ else
+ yield
+ end
+ end
+
+ def accept_hook?(hook)
+ if hook_context != self
+ hook_context.accept_hook?(hook)
+ else
+ # We have no scenarios, just ask our feature
+ @feature.accept_hook?(hook)
+ end
+ end
+
+ def failed?
+ @failed
+ end
+
+ def hook_context
+ @feature_elements.first || self
+ end
+
+ def to_sexp
+ sexp = [:background, @line, @keyword]
+ sexp += [@name] unless @name.empty?
+ comment = @comment.to_sexp
+ sexp += [comment] if comment
+ steps = @steps.to_sexp
+ sexp += steps if steps.any?
+ sexp
+ end
+ end
+ end
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/ast/comment.rb b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/ast/comment.rb
new file mode 100755
index 00000000..79e392a0
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/ast/comment.rb
@@ -0,0 +1,31 @@
+module Cucumber
+ module Ast
+ # Holds the value of a comment parsed from a feature file:
+ #
+ # # Lorem ipsum
+ # # dolor sit amet
+ #
+ # This gets parsed into a Comment with value "# Lorem ipsum\n# dolor sit amet\n"
+ #
+ class Comment #:nodoc:
+ def initialize(value)
+ @value = value
+ end
+
+ def empty?
+ @value.nil? || @value == ""
+ end
+
+ def accept(visitor)
+ return if Cucumber.wants_to_quit
+ @value.strip.split("\n").each do |line|
+ visitor.visit_comment_line(line.strip)
+ end
+ end
+
+ def to_sexp
+ (@value.nil? || @value == '') ? nil : [:comment, @value]
+ end
+ end
+ end
+end
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/ast/examples.rb b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/ast/examples.rb
new file mode 100755
index 00000000..13849f87
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/ast/examples.rb
@@ -0,0 +1,36 @@
+module Cucumber
+ module Ast
+ class Examples #:nodoc:
+ def initialize(comment, line, keyword, name, outline_table)
+ @comment, @keyword, @name, @outline_table = comment, keyword, name, outline_table
+ end
+
+ def accept(visitor)
+ return if Cucumber.wants_to_quit
+ visitor.visit_comment(@comment) unless @comment.empty?
+ visitor.visit_examples_name(@keyword, @name)
+ visitor.visit_outline_table(@outline_table)
+ end
+
+ def skip_invoke!
+ @outline_table.skip_invoke!
+ end
+
+ def each_example_row(&proc)
+ @outline_table.cells_rows[1..-1].each(&proc)
+ end
+
+ def failed?
+ @outline_table.cells_rows[1..-1].select{|row| row.failed?}.any?
+ end
+
+ def to_sexp
+ sexp = [:examples, @keyword, @name]
+ comment = @comment.to_sexp
+ sexp += [comment] if comment
+ sexp += [@outline_table.to_sexp]
+ sexp
+ end
+ end
+ end
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/ast/feature.rb b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/ast/feature.rb
new file mode 100755
index 00000000..6924b19c
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/ast/feature.rb
@@ -0,0 +1,85 @@
+module Cucumber
+ module Ast
+ # Represents the root node of a parsed feature.
+ class Feature #:nodoc:
+ attr_accessor :file, :language
+ attr_writer :features
+ attr_reader :name
+
+ def initialize(background, comment, tags, name, feature_elements)
+ @background, @comment, @tags, @name, @feature_elements = background, comment, tags, name.strip, feature_elements
+
+ background.feature = self if background
+ @feature_elements.each do |feature_element|
+ feature_element.feature = self
+ end
+ end
+
+ def accept(visitor)
+ return if Cucumber.wants_to_quit
+ visitor.visit_comment(@comment) unless @comment.empty?
+ visitor.visit_tags(@tags)
+ visitor.visit_feature_name(@name)
+ visitor.visit_background(@background) if @background
+ @feature_elements.each do |feature_element|
+ visitor.visit_feature_element(feature_element)
+ end
+ end
+
+ def source_tag_names
+ @tags.tag_names
+ end
+
+ def accept_hook?(hook)
+ @tags.accept_hook?(hook)
+ end
+
+ def next_feature_element(feature_element, &proc)
+ index = @feature_elements.index(feature_element)
+ next_one = @feature_elements[index+1]
+ proc.call(next_one) if next_one
+ end
+
+ def backtrace_line(step_name, line)
+ "#{file_colon_line(line)}:in `#{step_name}'"
+ end
+
+ def file_colon_line(line)
+ "#{@file}:#{line}"
+ end
+
+ def tag_count(tag)
+ if @tags.respond_to?(:count)
+ @tags.count(tag) # 1.9
+ else
+ @tags.select{|t| t == tag}.length # 1.8
+ end
+ end
+
+ def feature_and_children_tag_count(tag)
+ children_tag_count = @feature_elements.inject(0){|count, feature_element| count += feature_element.tag_count(tag)}
+ children_tag_count + tag_count(tag)
+ end
+
+ def short_name
+ first_line = name.split(/\n/)[0]
+ if first_line =~ /#{language.keywords('feature', true)}:(.*)/
+ $1.strip
+ else
+ first_line
+ end
+ end
+
+ def to_sexp
+ sexp = [:feature, @file, @name]
+ comment = @comment.to_sexp
+ sexp += [comment] if comment
+ tags = @tags.to_sexp
+ sexp += tags if tags.any?
+ sexp += [@background.to_sexp] if @background
+ sexp += @feature_elements.map{|fe| fe.to_sexp}
+ sexp
+ end
+ end
+ end
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/ast/feature_element.rb b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/ast/feature_element.rb
new file mode 100755
index 00000000..3b9a66e7
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/ast/feature_element.rb
@@ -0,0 +1,68 @@
+require 'enumerator'
+require 'cucumber/ast/tags'
+
+module Cucumber
+ module Ast
+ module FeatureElement #:nodoc:
+ attr_accessor :feature
+
+ def attach_steps(steps)
+ steps.each {|step| step.feature_element = self}
+ end
+
+ def file_colon_line(line = @line)
+ @feature.file_colon_line(line) if @feature
+ end
+
+ def text_length
+ name_line_lengths.max
+ end
+
+ def first_line_length
+ name_line_lengths[0]
+ end
+
+ def name_line_lengths
+ if @name.strip.empty?
+ [@keyword.jlength]
+ else
+ @name.split("\n").enum_for(:each_with_index).map do |line, line_number|
+ line_number == 0 ? @keyword.jlength + line.jlength : line.jlength + Ast::Step::INDENT - 1 # We -1 as names which are not keyword lines are missing a space between keyword and name
+ end
+ end
+ end
+
+ def matches_scenario_names?(scenario_name_regexps)
+ scenario_name_regexps.detect{|name| name =~ @name}
+ end
+
+ def backtrace_line(name = "#{@keyword} #{@name}", line = @line)
+ @feature.backtrace_line(name, line) if @feature
+ end
+
+ def source_indent(text_length)
+ max_line_length - text_length
+ end
+
+ def max_line_length
+ @steps.max_line_length(self)
+ end
+
+ def accept_hook?(hook)
+ Tags.matches?(source_tag_names, hook.tag_name_lists)
+ end
+
+ def source_tag_names
+ (@tags.tag_names + (@feature ? @feature.source_tag_names : [])).uniq
+ end
+
+ def tag_count(tag)
+ @feature.tag_count(tag) == 0 ? @tags.count(tag) : @feature.tag_count(tag)
+ end
+
+ def language
+ @feature.language if @feature
+ end
+ end
+ end
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/ast/features.rb b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/ast/features.rb
new file mode 100755
index 00000000..c33d51cb
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/ast/features.rb
@@ -0,0 +1,40 @@
+module Cucumber
+ module Ast
+ class Features #:nodoc:
+ include Enumerable
+
+ attr_reader :duration
+
+ def initialize
+ @features = []
+ end
+
+ def [](index)
+ @features[index]
+ end
+
+ def each(&proc)
+ @features.each(&proc)
+ end
+
+ def add_feature(feature)
+ feature.features = self
+ @features << feature
+ end
+
+ def accept(visitor)
+ return if Cucumber.wants_to_quit
+ start = Time.now
+ self.each do |feature|
+ visitor.visit_feature(feature)
+ end
+ @duration = Time.now - start
+ end
+
+ def tag_count(tag)
+ @features.inject(0){|count, feature| count += feature.feature_and_children_tag_count(tag)}
+ end
+
+ end
+ end
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/ast/outline_table.rb b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/ast/outline_table.rb
new file mode 100755
index 00000000..bcebe93f
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/ast/outline_table.rb
@@ -0,0 +1,166 @@
+module Cucumber
+ module Ast
+ class OutlineTable < Table #:nodoc:
+ def initialize(raw, scenario_outline)
+ super(raw)
+ @scenario_outline = scenario_outline
+ @cells_class = ExampleRow
+ create_step_invocations_for_example_rows!(scenario_outline)
+ end
+
+ def accept(visitor)
+ return if Cucumber.wants_to_quit
+ cells_rows.each_with_index do |row, n|
+ if(visitor.options[:expand])
+ row.accept(visitor)
+ else
+ visitor.visit_table_row(row)
+ end
+ end
+ nil
+ end
+
+ def accept_hook?(hook)
+ @scenario_outline.accept_hook?(hook)
+ end
+
+ def skip_invoke!
+ example_rows.each do |cells|
+ cells.skip_invoke!
+ end
+ end
+
+ def create_step_invocations_for_example_rows!(scenario_outline)
+ example_rows.each do |cells|
+ cells.create_step_invocations!(scenario_outline)
+ end
+ end
+
+ def example_rows
+ cells_rows[1..-1]
+ end
+
+ def visit_scenario_name(visitor, row)
+ @scenario_outline.visit_scenario_name(visitor, row)
+ end
+
+ def language
+ @scenario_outline.language
+ end
+
+ class ExampleRow < Cells #:nodoc:
+ class InvalidForHeaderRowError < NoMethodError
+ def initialize(*args)
+ super 'This is a header row and cannot pass or fail'
+ end
+ end
+
+ attr_reader :scenario_outline # https://rspec.lighthouseapp.com/projects/16211/tickets/342
+
+ def initialize(table, cells)
+ super
+ @scenario_exception = nil
+ end
+
+ def create_step_invocations!(scenario_outline)
+ @scenario_outline = scenario_outline
+ @step_invocations = scenario_outline.step_invocations(self)
+ end
+
+ def skip_invoke!
+ @step_invocations.each do |step_invocation|
+ step_invocation.skip_invoke!
+ end
+ end
+
+ def accept(visitor)
+ return if Cucumber.wants_to_quit
+ visitor.options[:expand] ? accept_expand(visitor) : accept_plain(visitor)
+ end
+
+ def accept_plain(visitor)
+ if header?
+ @cells.each do |cell|
+ cell.status = :skipped_param
+ visitor.visit_table_cell(cell)
+ end
+ else
+ visitor.step_mother.before_and_after(self) do
+ @step_invocations.each do |step_invocation|
+ step_invocation.invoke(visitor.step_mother, visitor.options)
+ @exception ||= step_invocation.reported_exception
+ end
+
+ @cells.each do |cell|
+ visitor.visit_table_cell(cell)
+ end
+
+ visitor.visit_exception(@scenario_exception, :failed) if @scenario_exception
+ end
+ end
+ end
+
+ def accept_expand(visitor)
+ if header?
+ else
+ visitor.step_mother.before_and_after(self) do
+ @table.visit_scenario_name(visitor, self)
+ @step_invocations.each do |step_invocation|
+ step_invocation.invoke(visitor.step_mother, visitor.options)
+ @exception ||= step_invocation.reported_exception
+ step_invocation.visit_step_result(visitor)
+ end
+ end
+ end
+ end
+
+ def accept_hook?(hook)
+ @table.accept_hook?(hook)
+ end
+
+ def exception
+ @exception || @scenario_exception
+ end
+
+ def fail!(exception)
+ @scenario_exception = exception
+ end
+
+ # Returns true if one or more steps failed
+ def failed?
+ raise InvalidForHeaderRowError if header?
+ @step_invocations.failed? || !!@scenario_exception
+ end
+
+ # Returns true if all steps passed
+ def passed?
+ !failed?
+ end
+
+ # Returns the status
+ def status
+ return :failed if @scenario_exception
+ @step_invocations.status
+ end
+
+ def backtrace_line
+ @scenario_outline.backtrace_line(name, line)
+ end
+
+ def name
+ "| #{@cells.collect{|c| c.value }.join(' | ')} |"
+ end
+
+ def language
+ @table.language
+ end
+
+ private
+
+ def header?
+ index == 0
+ end
+ end
+ end
+ end
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/ast/py_string.rb b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/ast/py_string.rb
new file mode 100755
index 00000000..e138054d
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/ast/py_string.rb
@@ -0,0 +1,59 @@
+module Cucumber
+ module Ast
+ # Represents an inline argument in a step. Example:
+ #
+ # Given the message
+ # """
+ # I like
+ # Cucumber sandwich
+ # """
+ #
+ # The text between the pair of """ is stored inside a PyString,
+ # which is yielded to the StepDefinition block as the last argument.
+ #
+ # The StepDefinition can then access the String via the #to_s method. In the
+ # example above, that would return: "I like\nCucumber sandwich"
+ #
+ # Note how the indentation from the source is stripped away.
+ #
+ class PyString #:nodoc:
+ attr_accessor :file
+
+ def self.default_arg_name
+ "string"
+ end
+
+ def initialize(start_line, end_line, string, quotes_indent)
+ @start_line, @end_line = start_line, end_line
+ @string, @quotes_indent = string.gsub(/\\"/, '"'), quotes_indent
+ end
+
+ def to_s
+ @string.indent(-@quotes_indent)
+ end
+
+ def accept(visitor)
+ return if Cucumber.wants_to_quit
+ visitor.visit_py_string(to_s)
+ end
+
+ def arguments_replaced(arguments) #:nodoc:
+ string = @string
+ arguments.each do |name, value|
+ value ||= ''
+ string = string.gsub(name, value)
+ end
+ PyString.new(@start_line, @end_line, string, @quotes_indent)
+ end
+
+ def has_text?(text)
+ @string.index(text)
+ end
+
+ # For testing only
+ def to_sexp #:nodoc:
+ [:py_string, to_s]
+ end
+ end
+ end
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/ast/scenario.rb b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/ast/scenario.rb
new file mode 100755
index 00000000..b2326749
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/ast/scenario.rb
@@ -0,0 +1,111 @@
+require 'cucumber/ast/feature_element'
+
+module Cucumber
+ module Ast
+ class Scenario #:nodoc:
+ include FeatureElement
+
+ attr_reader :name, :line
+
+ class EmptyBackground
+ def failed?
+ false
+ end
+
+ def feature_elements
+ []
+ end
+
+ def step_collection(step_invocations)
+ StepCollection.new(step_invocations)
+ end
+ end
+
+ def initialize(background, comment, tags, line, keyword, name, steps)
+ @background = background || EmptyBackground.new
+ @comment, @tags, @line, @keyword, @name = comment, tags, line, keyword, name
+ attach_steps(steps)
+
+ step_invocations = steps.map{|step| step.step_invocation}
+ @steps = @background.step_collection(step_invocations)
+ @background.feature_elements << self
+
+ @exception = @executed = nil
+ end
+
+ def accept(visitor)
+ return if Cucumber.wants_to_quit
+
+ with_visitor(visitor) do
+ visitor.visit_comment(@comment) unless @comment.empty?
+ visitor.visit_tags(@tags)
+ visitor.visit_scenario_name(@keyword, @name, file_colon_line(@line), source_indent(first_line_length))
+
+ skip_invoke! if @background.failed?
+ visitor.step_mother.before_and_after(self, skip_hooks?) do
+ skip_invoke! if failed?
+ visitor.visit_steps(@steps)
+ end
+ @executed = true
+ end
+ end
+
+ # Returns true if one or more steps failed
+ def failed?
+ @steps.failed? || !!@exception
+ end
+
+ def fail!(exception)
+ @exception = exception
+ @current_visitor.visit_exception(@exception, :failed)
+ end
+
+ # Returns true if all steps passed
+ def passed?
+ !failed?
+ end
+
+ # Returns the first exception (if any)
+ def exception
+ @exception || @steps.exception
+ end
+
+ # Returns the status
+ def status
+ return :failed if @exception
+ @steps.status
+ end
+
+ def skip_invoke!
+ @steps.each{|step_invocation| step_invocation.skip_invoke!}
+ @feature.next_feature_element(self) do |next_one|
+ next_one.skip_invoke!
+ end
+ end
+
+ def to_sexp
+ sexp = [:scenario, @line, @keyword, @name]
+ comment = @comment.to_sexp
+ sexp += [comment] if comment
+ tags = @tags.to_sexp
+ sexp += tags if tags.any?
+ steps = @steps.to_sexp
+ sexp += steps if steps.any?
+ sexp
+ end
+
+
+ def with_visitor(visitor)
+ @current_visitor = visitor
+ yield
+ @current_visitor = nil
+ end
+
+ private
+
+ def skip_hooks?
+ @background.failed? || @executed
+ end
+ end
+ end
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/ast/scenario_outline.rb b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/ast/scenario_outline.rb
new file mode 100755
index 00000000..abefb300
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/ast/scenario_outline.rb
@@ -0,0 +1,100 @@
+module Cucumber
+ module Ast
+ class ScenarioOutline #:nodoc:
+ include FeatureElement
+
+ module ExamplesArray #:nodoc:
+ def accept(visitor)
+ return if Cucumber.wants_to_quit
+ each do |examples|
+ visitor.visit_examples(examples)
+ end
+ end
+ end
+
+ # The +example_sections+ argument must be an Array where each element is another array representing
+ # an Examples section. This array has 3 elements:
+ #
+ # * Examples keyword
+ # * Examples section name
+ # * Raw matrix
+ def initialize(background, comment, tags, line, keyword, name, steps, example_sections)
+ @background, @comment, @tags, @line, @keyword, @name = background, comment, tags, line, keyword, name
+ attach_steps(steps)
+ @steps = StepCollection.new(steps)
+
+ @examples_array = example_sections.map do |example_section|
+ examples_comment = example_section[0]
+ examples_line = example_section[1]
+ examples_keyword = example_section[2]
+ examples_name = example_section[3]
+ examples_matrix = example_section[4]
+
+ examples_table = OutlineTable.new(examples_matrix, self)
+ Examples.new(examples_comment, examples_line, examples_keyword, examples_name, examples_table)
+ end
+ @examples_array.extend(ExamplesArray)
+
+ @background.feature_elements << self if @background
+ end
+
+ def accept(visitor)
+ return if Cucumber.wants_to_quit
+ visitor.visit_comment(@comment) unless @comment.empty?
+ visitor.visit_tags(@tags)
+ visitor.visit_scenario_name(@keyword, @name, file_colon_line(@line), source_indent(first_line_length))
+ visitor.visit_steps(@steps)
+
+ skip_invoke! if @background && @background.failed?
+ visitor.visit_examples_array(@examples_array) unless @examples_array.empty?
+ end
+
+ def skip_invoke!
+ @examples_array.each{|examples| examples.skip_invoke!}
+ @feature.next_feature_element(self) do |next_one|
+ next_one.skip_invoke!
+ end
+ end
+
+ def step_invocations(cells)
+ step_invocations = @steps.step_invocations_from_cells(cells)
+ if @background
+ @background.step_collection(step_invocations)
+ else
+ StepCollection.new(step_invocations)
+ end
+ end
+
+ def each_example_row(&proc)
+ @examples_array.each do |examples|
+ examples.each_example_row(&proc)
+ end
+ end
+
+ def visit_scenario_name(visitor, row)
+ visitor.visit_scenario_name(
+ @feature.language.scenario_keyword,
+ row.name,
+ file_colon_line(row.line),
+ source_indent(first_line_length)
+ )
+ end
+
+ def failed?
+ @examples_array.select{|examples| examples.failed?}.any?
+ end
+
+ def to_sexp
+ sexp = [:scenario_outline, @keyword, @name]
+ comment = @comment.to_sexp
+ sexp += [comment] if comment
+ tags = @tags.to_sexp
+ sexp += tags if tags.any?
+ steps = @steps.to_sexp
+ sexp += steps if steps.any?
+ sexp += @examples_array.map{|e| e.to_sexp}
+ sexp
+ end
+ end
+ end
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/ast/step.rb b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/ast/step.rb
new file mode 100755
index 00000000..ec319b33
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/ast/step.rb
@@ -0,0 +1,121 @@
+require 'cucumber/core_ext/string'
+require 'cucumber/step_match'
+
+module Cucumber
+ module Ast
+ class Step #:nodoc:
+ attr_reader :line, :keyword, :name, :multiline_arg
+ attr_writer :step_collection, :options
+ attr_accessor :feature_element, :exception
+
+ INDENT = 2
+
+ def initialize(line, keyword, name, multiline_arg=nil)
+ @line, @keyword, @name, @multiline_arg = line, keyword, name, multiline_arg
+ end
+
+ def background?
+ false
+ end
+
+ def status
+ # Step always has status skipped, because Step is always in a ScenarioOutline
+ :skipped
+ end
+
+ def step_invocation
+ StepInvocation.new(self, @name, @multiline_arg, [])
+ end
+
+ def step_invocation_from_cells(cells)
+ matched_cells = matched_cells(cells)
+
+ delimited_arguments = delimit_argument_names(cells.to_hash)
+ name = replace_name_arguments(delimited_arguments)
+ multiline_arg = @multiline_arg.nil? ? nil : @multiline_arg.arguments_replaced(delimited_arguments)
+
+ StepInvocation.new(self, name, multiline_arg, matched_cells)
+ end
+
+ def accept(visitor)
+ return if Cucumber.wants_to_quit
+ # The only time a Step is visited is when it is in a ScenarioOutline.
+ # Otherwise it's always StepInvocation that gets visited instead.
+ visit_step_result(visitor, first_match(visitor), @multiline_arg, :skipped, nil, nil)
+ end
+
+ def visit_step_result(visitor, step_match, multiline_arg, status, exception, background)
+ visitor.visit_step_result(@keyword, step_match, @multiline_arg, status, exception, source_indent, background)
+ end
+
+ def first_match(visitor)
+ # @feature_element is always a ScenarioOutline in this case
+ @feature_element.each_example_row do |cells|
+ argument_hash = cells.to_hash
+ delimited_arguments = delimit_argument_names(argument_hash)
+ name = replace_name_arguments(delimited_arguments)
+ step_match = visitor.step_mother.step_match(name, @name) rescue nil
+ return step_match if step_match
+ end
+ NoStepMatch.new(self, @name)
+ end
+
+ def to_sexp
+ [:step, @line, @keyword, @name, (@multiline_arg.nil? ? nil : @multiline_arg.to_sexp)].compact
+ end
+
+ def source_indent
+ @feature_element.source_indent(text_length)
+ end
+
+ def text_length(name=@name)
+ @keyword.jlength + name.jlength + INDENT # Add indent as steps get indented more than scenarios
+ end
+
+ def backtrace_line
+ @backtrace_line ||= @feature_element.backtrace_line("#{@keyword} #{@name}", @line) unless @feature_element.nil?
+ end
+
+ def file_colon_line
+ @file_colon_line ||= @feature_element.file_colon_line(@line) unless @feature_element.nil?
+ end
+
+ def language
+ @feature_element.language
+ end
+
+ def dom_id
+ @dom_id ||= file_colon_line.gsub(/\//, '_').gsub(/\./, '_').gsub(/:/, '_')
+ end
+
+ private
+
+ def matched_cells(cells)
+ col_index = 0
+ cells.select do |cell|
+ header_cell = cell.table.header_cell(col_index)
+ col_index += 1
+ delimited = delimited(header_cell.value)
+ @name.index(delimited) || (@multiline_arg && @multiline_arg.has_text?(delimited))
+ end
+ end
+
+ def delimit_argument_names(argument_hash)
+ argument_hash.inject({}) { |h,(name,value)| h[delimited(name)] = value; h }
+ end
+
+ def delimited(s)
+ "<#{s}>"
+ end
+
+ def replace_name_arguments(argument_hash)
+ name_with_arguments_replaced = @name
+ argument_hash.each do |name, value|
+ value ||= ''
+ name_with_arguments_replaced = name_with_arguments_replaced.gsub(name, value)
+ end
+ name_with_arguments_replaced
+ end
+ end
+ end
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/ast/step_collection.rb b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/ast/step_collection.rb
new file mode 100755
index 00000000..9cb82d37
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/ast/step_collection.rb
@@ -0,0 +1,76 @@
+module Cucumber
+ module Ast
+ # Holds an Array of Step or StepDefinition
+ class StepCollection #:nodoc:
+ include Enumerable
+
+ def initialize(steps)
+ @steps = steps
+ @steps.each{|step| step.step_collection = self}
+ end
+
+ def accept(visitor, &proc)
+ return if Cucumber.wants_to_quit
+ @steps.each do |step|
+ visitor.visit_step(step) if proc.nil? || proc.call(step)
+ end
+ end
+
+ def step_invocations(background = false)
+ StepCollection.new(@steps.map{ |step|
+ i = step.step_invocation
+ i.background = background
+ i
+ })
+ end
+
+ def step_invocations_from_cells(cells)
+ @steps.map{|step| step.step_invocation_from_cells(cells)}
+ end
+
+ # Duplicates this instance and adds +step_invocations+ to the end
+ def dup(step_invocations = [])
+ StepCollection.new(@steps + step_invocations)
+ end
+
+ def each(&proc)
+ @steps.each(&proc)
+ end
+
+ def previous_step(step)
+ i = @steps.index(step) || -1
+ @steps[i-1]
+ end
+
+ def empty?
+ @steps.empty?
+ end
+
+ def max_line_length(feature_element)
+ lengths = (@steps + [feature_element]).map{|e| e.text_length}
+ lengths.max
+ end
+
+ def exception
+ @exception ||= ((failed = @steps.detect {|step| step.exception}) && failed.exception)
+ end
+
+ def failed?
+ status == :failed
+ end
+
+ def passed?
+ status == :passed
+ end
+
+ def status
+ @steps.each{|step_invocation| return step_invocation.status if step_invocation.status != :passed}
+ :passed
+ end
+
+ def to_sexp
+ @steps.map{|step| step.to_sexp}
+ end
+ end
+ end
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/ast/step_invocation.rb b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/ast/step_invocation.rb
new file mode 100755
index 00000000..a8a02d5a
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/ast/step_invocation.rb
@@ -0,0 +1,190 @@
+require 'cucumber/step_match'
+require 'cucumber/ast/table'
+
+module Cucumber
+ module Ast
+ class StepInvocation #:nodoc:
+ BACKTRACE_FILTER_PATTERNS = [
+ /vendor\/rails|lib\/cucumber|bin\/cucumber:|lib\/rspec|gems\//
+ ]
+
+ attr_writer :step_collection, :background
+ attr_reader :name, :matched_cells, :status, :reported_exception
+ attr_accessor :exception
+
+ class << self
+ SEVERITY = [:passed, :undefined, :pending, :skipped, :failed]
+ def worst_status(statuses)
+ SEVERITY[statuses.map{|status| SEVERITY.index(status)}.max]
+ end
+ end
+
+ def initialize(step, name, multiline_arg, matched_cells)
+ @step, @name, @multiline_arg, @matched_cells = step, name, multiline_arg, matched_cells
+ status!(:skipped)
+ @skip_invoke = @exception = @step_match = @different_table = @reported_exception = @background = nil
+ end
+
+ def background?
+ @background
+ end
+
+ def skip_invoke!
+ @skip_invoke = true
+ end
+
+ def accept(visitor)
+ return if Cucumber.wants_to_quit
+ invoke(visitor.step_mother, visitor.options)
+ visit_step_result(visitor)
+ end
+
+ def visit_step_result(visitor)
+ visitor.visit_step_result(
+ keyword,
+ @step_match,
+ (@different_table || @multiline_arg),
+ @status,
+ @reported_exception,
+ source_indent,
+ @background
+ )
+ end
+
+ def invoke(step_mother, options)
+ find_step_match!(step_mother)
+ unless @skip_invoke || options[:dry_run] || @exception || @step_collection.exception
+ @skip_invoke = true
+ begin
+ @step_match.invoke(@multiline_arg)
+ step_mother.after_step
+ status!(:passed)
+ rescue Pending => e
+ failed(options, e, false)
+ status!(:pending)
+ rescue Undefined => e
+ failed(options, e, false)
+ status!(:undefined)
+ rescue Cucumber::Ast::Table::Different => e
+ @different_table = e.table
+ failed(options, e, false)
+ status!(:failed)
+ rescue Exception => e
+ failed(options, e, false)
+ status!(:failed)
+ end
+ end
+ end
+
+ def find_step_match!(step_mother)
+ return if @step_match
+ begin
+ @step_match = step_mother.step_match(@name)
+ rescue Undefined => e
+ failed(step_mother.options, e, true)
+ status!(:undefined)
+ @step_match = NoStepMatch.new(@step, @name)
+ rescue Ambiguous => e
+ failed(step_mother.options, e, false)
+ status!(:failed)
+ @step_match = NoStepMatch.new(@step, @name)
+ end
+ step_mother.step_visited(self)
+ end
+
+ def failed(options, e, clear_backtrace)
+ e = filter_backtrace(e)
+ e.set_backtrace([]) if clear_backtrace
+ e.backtrace << @step.backtrace_line unless @step.backtrace_line.nil?
+ @exception = e
+ if(options[:strict] || !(Undefined === e) || e.nested?)
+ @reported_exception = e
+ else
+ @reported_exception = nil
+ end
+ end
+
+ def filter_backtrace(e)
+ return e if Cucumber.use_full_backtrace
+ pwd = /#{Dir.pwd}\//m
+ (e.backtrace || []).each{|line| line.gsub!(pwd, "./")}
+
+ filtered = (e.backtrace || []).reject do |line|
+ BACKTRACE_FILTER_PATTERNS.detect { |p| line =~ p }
+ end
+
+ if Cucumber::JRUBY && e.class.name == 'NativeException'
+ # JRuby's NativeException ignores #set_backtrace.
+ # We're fixing it.
+ e.instance_eval do
+ def set_backtrace(backtrace)
+ @backtrace = backtrace
+ end
+
+ def backtrace
+ @backtrace
+ end
+ end
+ end
+ e.set_backtrace(filtered)
+ e
+ end
+
+ def status!(status)
+ @status = status
+ @matched_cells.each do |cell|
+ cell.status = status
+ end
+ end
+
+ def previous
+ @step_collection.previous_step(self)
+ end
+
+ def actual_keyword
+ repeat_keywords = [language.but_keywords, language.and_keywords].flatten
+ if repeat_keywords.index(@step.keyword) && previous
+ previous.actual_keyword
+ else
+ keyword
+ end
+ end
+
+ def source_indent
+ @step.feature_element.source_indent(text_length)
+ end
+
+ def text_length
+ @step.text_length(@name)
+ end
+
+ def keyword
+ @step.keyword
+ end
+
+ def multiline_arg
+ @step.multiline_arg
+ end
+
+ def file_colon_line
+ @step.file_colon_line
+ end
+
+ def dom_id
+ @step.dom_id
+ end
+
+ def backtrace_line
+ @step.backtrace_line
+ end
+
+ def language
+ @step.language
+ end
+
+ def to_sexp
+ [:step_invocation, @step.line, @step.keyword, @name, (@multiline_arg.nil? ? nil : @multiline_arg.to_sexp)].compact
+ end
+ end
+ end
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/ast/table.rb b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/ast/table.rb
new file mode 100755
index 00000000..dc26820b
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/ast/table.rb
@@ -0,0 +1,655 @@
+module Cucumber
+ module Ast
+ # Step Definitions that match a plain text Step with a multiline argument table
+ # will receive it as an instance of Table. A Table object holds the data of a
+ # table parsed from a feature file and lets you access and manipulate the data
+ # in different ways.
+ #
+ # For example:
+ #
+ # Given I have:
+ # | a | b |
+ # | c | d |
+ #
+ # And a matching StepDefinition:
+ #
+ # Given /I have:/ do |table|
+ # data = table.raw
+ # end
+ #
+ # This will store [['a', 'b'], ['c', 'd']] in the data variable.
+ #
+ class Table
+ class Different < StandardError
+ attr_reader :table
+
+ def initialize(table)
+ super('Tables were not identical')
+ @table = table
+ end
+ end
+
+ include Enumerable
+
+ NULL_CONVERSIONS = Hash.new(lambda{ |cell_value| cell_value }).freeze
+
+ attr_accessor :file
+
+ def self.default_arg_name #:nodoc:
+ "table"
+ end
+
+ # Creates a new instance. +raw+ should be an Array of Array of String
+ # or an Array of Hash (similar to what #hashes returns).
+ # You don't typically create your own Table objects - Cucumber will do
+ # it internally and pass them to your Step Definitions.
+ #
+ def initialize(raw, conversion_procs = NULL_CONVERSIONS.dup)
+ @cells_class = Cells
+ @cell_class = Cell
+
+ raw = ensure_array_of_array(raw)
+ # Verify that it's square
+ transposed = raw.transpose
+ create_cell_matrix(raw)
+ @conversion_procs = conversion_procs
+ end
+
+ # JSON representation
+ def to_json
+ raw.to_json
+ end
+
+ # Creates a copy of this table, inheriting any column mappings.
+ # registered with #map_headers!
+ #
+ def dup
+ self.class.new(raw.dup, @conversion_procs.dup)
+ end
+
+ # Returns a new, transposed table. Example:
+ #
+ # | a | 7 | 4 |
+ # | b | 9 | 2 |
+ #
+ # Gets converted into the following:
+ #
+ # | a | b |
+ # | 7 | 9 |
+ # | 4 | 2 |
+ #
+ def transpose
+ self.class.new(raw.transpose, @conversion_procs.dup)
+ end
+
+ # Converts this table into an Array of Hash where the keys of each
+ # Hash are the headers in the table. For example, a Table built from
+ # the following plain text:
+ #
+ # | a | b | sum |
+ # | 2 | 3 | 5 |
+ # | 7 | 9 | 16 |
+ #
+ # Gets converted into the following:
+ #
+ # [{'a' => '2', 'b' => '3', 'sum' => '5'}, {'a' => '7', 'b' => '9', 'sum' => '16'}]
+ #
+ # Use #map_column! to specify how values in a column are converted.
+ #
+ def hashes
+ @hashes ||= cells_rows[1..-1].map do |row|
+ row.to_hash
+ end
+ end
+
+ # Converts this table into a Hash where the first column is
+ # used as keys and the second column is used as values
+ #
+ # | a | 2 |
+ # | b | 3 |
+ #
+ # Gets converted into the following:
+ #
+ # {'a' => '2', 'b' => '3'}
+ #
+ # The table must be exactly two columns wide
+ #
+ def rows_hash
+ return @rows_hash if @rows_hash
+ verify_table_width(2)
+ @rows_hash = self.transpose.hashes[0]
+ end
+
+ # Gets the raw data of this table. For example, a Table built from
+ # the following plain text:
+ #
+ # | a | b |
+ # | c | d |
+ #
+ # gets converted into the following:
+ #
+ # [['a', 'b], ['c', 'd']]
+ #
+ def raw
+ cell_matrix.map do |row|
+ row.map do |cell|
+ cell.value
+ end
+ end
+ end
+
+ # Same as #raw, but skips the first (header) row
+ def rows
+ raw[1..-1]
+ end
+
+ def each_cells_row(&proc) #:nodoc:
+ cells_rows.each(&proc)
+ end
+
+ def accept(visitor) #:nodoc:
+ return if Cucumber.wants_to_quit
+ cells_rows.each do |row|
+ visitor.visit_table_row(row)
+ end
+ nil
+ end
+
+ # Matches +pattern+ against the header row of the table.
+ # This is used especially for argument transforms.
+ #
+ # Example:
+ # | column_1_name | column_2_name |
+ # | x | y |
+ #
+ # table.match(/table:column_1_name,column_2_name/) #=> non-nil
+ #
+ # Note: must use 'table:' prefix on match
+ def match(pattern)
+ header_to_match = "table:#{headers.join(',')}"
+ pattern.match(header_to_match)
+ end
+
+ # For testing only
+ def to_sexp #:nodoc:
+ [:table, *cells_rows.map{|row| row.to_sexp}]
+ end
+
+ # Redefines the table headers. This makes it possible to use
+ # prettier and more flexible header names in the features. The
+ # keys of +mappings+ are Strings or regular expressions
+ # (anything that responds to #=== will work) that may match
+ # column headings in the table. The values of +mappings+ are
+ # desired names for the columns.
+ #
+ # Example:
+ #
+ # | Phone Number | Address |
+ # | 123456 | xyz |
+ # | 345678 | abc |
+ #
+ # A StepDefinition receiving this table can then map the columns
+ # with both Regexp and String:
+ #
+ # table.map_headers!(/phone( number)?/i => :phone, 'Address' => :address)
+ # table.hashes
+ # # => [{:phone => '123456', :address => 'xyz'}, {:phone => '345678', :address => 'abc'}]
+ #
+ # You may also pass in a block if you wish to convert all of the headers:
+ #
+ # table.map_headers! { |header| header.downcase }
+ # table.hashes.keys
+ # # => ['phone number', 'address']
+ #
+ # When a block is passed in along with a hash then the mappings in the hash take precendence:
+ #
+ # table.map_headers!('Address' => 'ADDRESS') { |header| header.downcase }
+ # table.hashes.keys
+ # # => ['phone number', 'ADDRESS']
+ #
+ def map_headers!(mappings={}, &block)
+ header_cells = cell_matrix[0]
+
+ if block_given?
+ header_values = header_cells.map { |cell| cell.value } - mappings.keys
+ mappings = mappings.merge(Hash[*header_values.zip(header_values.map(&block)).flatten])
+ end
+
+ mappings.each_pair do |pre, post|
+ mapped_cells = header_cells.select{|cell| pre === cell.value}
+ raise "No headers matched #{pre.inspect}" if mapped_cells.empty?
+ raise "#{mapped_cells.length} headers matched #{pre.inspect}: #{mapped_cells.map{|c| c.value}.inspect}" if mapped_cells.length > 1
+ mapped_cells[0].value = post
+ if @conversion_procs.has_key?(pre)
+ @conversion_procs[post] = @conversion_procs.delete(pre)
+ end
+ end
+ end
+
+ # Returns a new Table where the headers are redefined. See #map_headers!
+ def map_headers(mappings={})
+ table = self.dup
+ table.map_headers!(mappings)
+ table
+ end
+
+ # Change how #hashes converts column values. The +column_name+ argument identifies the column
+ # and +conversion_proc+ performs the conversion for each cell in that column. If +strict+ is
+ # true, an error will be raised if the column named +column_name+ is not found. If +strict+
+ # is false, no error will be raised. Example:
+ #
+ # Given /^an expense report for (.*) with the following posts:$/ do |table|
+ # posts_table.map_column!('amount') { |a| a.to_i }
+ # posts_table.hashes.each do |post|
+ # # post['amount'] is a Fixnum, rather than a String
+ # end
+ # end
+ #
+ def map_column!(column_name, strict=true, &conversion_proc)
+ verify_column(column_name) if strict
+ @conversion_procs[column_name] = conversion_proc
+ end
+
+ # Compares +other_table+ to self. If +other_table+ contains columns
+ # and/or rows that are not in self, new columns/rows are added at the
+ # relevant positions, marking the cells in those rows/columns as
+ # surplus . Likewise, if +other_table+ lacks columns and/or
+ # rows that are present in self, these are marked as missing .
+ #
+ # surplus and missing cells are recognised by formatters
+ # and displayed so that it's easy to read the differences.
+ #
+ # Cells that are different, but look identical (for example the
+ # boolean true and the string "true") are converted to their Object#inspect
+ # representation and preceded with (i) - to make it easier to identify
+ # where the difference actually is.
+ #
+ # Since all tables that are passed to StepDefinitions always have String
+ # objects in their cells, you may want to use #map_column! before calling
+ # #diff!. You can use #map_column! on either of the tables.
+ #
+ # A Different error is raised if there are missing rows or columns, or
+ # surplus rows. An error is not raised for surplus columns.
+ # Whether to raise or not raise can be changed by setting values in
+ # +options+ to true or false:
+ #
+ # * missing_row : Raise on missing rows (defaults to true)
+ # * surplus_row : Raise on surplus rows (defaults to true)
+ # * missing_col : Raise on missing columns (defaults to true)
+ # * surplus_col : Raise on surplus columns (defaults to false)
+ #
+ # The +other_table+ argument can be another Table, an Array of Array or
+ # an Array of Hash (similar to the structure returned by #hashes).
+ #
+ # Calling this method is particularly useful in Then steps that take
+ # a Table argument, if you want to compare that table to some actual values.
+ #
+ def diff!(other_table, options={})
+ options = {:missing_row => true, :surplus_row => true, :missing_col => true, :surplus_col => false}.merge(options)
+
+ other_table = ensure_table(other_table)
+ other_table.convert_columns!
+ ensure_green!
+
+ original_width = cell_matrix[0].length
+ other_table_cell_matrix = pad!(other_table.cell_matrix)
+ padded_width = cell_matrix[0].length
+
+ missing_col = cell_matrix[0].detect{|cell| cell.status == :undefined}
+ surplus_col = padded_width > original_width
+
+ require_diff_lcs
+ cell_matrix.extend(Diff::LCS)
+ convert_columns!
+ changes = cell_matrix.diff(other_table_cell_matrix).flatten
+
+ inserted = 0
+ missing = 0
+
+ row_indices = Array.new(other_table_cell_matrix.length) {|n| n}
+
+ last_change = nil
+ missing_row_pos = nil
+ insert_row_pos = nil
+
+ changes.each do |change|
+ if(change.action == '-')
+ missing_row_pos = change.position + inserted
+ cell_matrix[missing_row_pos].each{|cell| cell.status = :undefined}
+ row_indices.insert(missing_row_pos, nil)
+ missing += 1
+ else # '+'
+ insert_row_pos = change.position + missing
+ inserted_row = change.element
+ inserted_row.each{|cell| cell.status = :comment}
+ cell_matrix.insert(insert_row_pos, inserted_row)
+ row_indices[insert_row_pos] = nil
+ inspect_rows(cell_matrix[missing_row_pos], inserted_row) if last_change && last_change.action == '-'
+ inserted += 1
+ end
+ last_change = change
+ end
+
+ other_table_cell_matrix.each_with_index do |other_row, i|
+ row_index = row_indices.index(i)
+ row = cell_matrix[row_index] if row_index
+ if row
+ (original_width..padded_width).each do |col_index|
+ surplus_cell = other_row[col_index]
+ row[col_index].value = surplus_cell.value if row[col_index]
+ end
+ end
+ end
+
+ clear_cache!
+ should_raise =
+ missing_row_pos && options[:missing_row] ||
+ insert_row_pos && options[:surplus_row] ||
+ missing_col && options[:missing_col] ||
+ surplus_col && options[:surplus_col]
+ raise Different.new(self) if should_raise
+ end
+
+ def to_hash(cells) #:nodoc:
+ hash = Hash.new do |hash, key|
+ hash[key.to_s] if key.is_a?(Symbol)
+ end
+ raw[0].each_with_index do |column_name, column_index|
+ value = @conversion_procs[column_name].call(cells.value(column_index))
+ hash[column_name] = value
+ end
+ hash
+ end
+
+ def index(cells) #:nodoc:
+ cells_rows.index(cells)
+ end
+
+ def verify_column(column_name) #:nodoc:
+ raise %{The column named "#{column_name}" does not exist} unless raw[0].include?(column_name)
+ end
+
+ def verify_table_width(width) #:nodoc:
+ raise %{The table must have exactly #{width} columns} unless raw[0].size == width
+ end
+
+ def arguments_replaced(arguments) #:nodoc:
+ raw_with_replaced_args = raw.map do |row|
+ row.map do |cell|
+ cell_with_replaced_args = cell
+ arguments.each do |name, value|
+ if cell_with_replaced_args && cell_with_replaced_args.include?(name)
+ cell_with_replaced_args = value ? cell_with_replaced_args.gsub(name, value) : nil
+ end
+ end
+ cell_with_replaced_args
+ end
+ end
+ Table.new(raw_with_replaced_args)
+ end
+
+ def has_text?(text) #:nodoc:
+ raw.flatten.compact.detect{|cell_value| cell_value.index(text)}
+ end
+
+ def cells_rows #:nodoc:
+ @rows ||= cell_matrix.map do |cell_row|
+ @cells_class.new(self, cell_row)
+ end
+ end
+
+ def headers #:nodoc:
+ raw.first
+ end
+
+ def header_cell(col) #:nodoc:
+ cells_rows[0][col]
+ end
+
+ def cell_matrix #:nodoc:
+ @cell_matrix
+ end
+
+ def col_width(col) #:nodoc:
+ columns[col].__send__(:width)
+ end
+
+ def to_s(options = {}) #:nodoc:
+ options = {:color => true, :indent => 2, :prefixes => TO_S_PREFIXES}.merge(options)
+ io = StringIO.new
+
+ c = Term::ANSIColor.coloring?
+ Term::ANSIColor.coloring = options[:color]
+ formatter = Formatter::Pretty.new(nil, io, options)
+ formatter.instance_variable_set('@indent', options[:indent])
+ TreeWalker.new(nil, [formatter]).visit_multiline_arg(self)
+
+ Term::ANSIColor.coloring = c
+ io.rewind
+ s = "\n" + io.read + (" " * (options[:indent] - 2))
+ s
+ end
+
+ private
+
+ TO_S_PREFIXES = Hash.new(' ')
+ TO_S_PREFIXES[:comment] = ['(+) ']
+ TO_S_PREFIXES[:undefined] = ['(-) ']
+
+ protected
+
+ def inspect_rows(missing_row, inserted_row) #:nodoc:
+ missing_row.each_with_index do |missing_cell, col|
+ inserted_cell = inserted_row[col]
+ if(missing_cell.value != inserted_cell.value && (missing_cell.value.to_s == inserted_cell.value.to_s))
+ missing_cell.inspect!
+ inserted_cell.inspect!
+ end
+ end
+ end
+
+ def create_cell_matrix(raw) #:nodoc:
+ @cell_matrix = raw.map do |raw_row|
+ line = raw_row.line rescue -1
+ raw_row.map do |raw_cell|
+ new_cell(raw_cell, line)
+ end
+ end
+ end
+
+ def convert_columns! #:nodoc:
+ cell_matrix.transpose.each do |col|
+ conversion_proc = @conversion_procs[col[0].value]
+ col[1..-1].each do |cell|
+ cell.value = conversion_proc.call(cell.value)
+ end
+ end
+ end
+
+ def require_diff_lcs #:nodoc:
+ begin
+ require 'diff/lcs'
+ rescue LoadError => e
+ e.message << "\n Please gem install diff-lcs\n"
+ raise e
+ end
+ end
+
+ def clear_cache! #:nodoc:
+ @hashes = @rows_hash = @rows = @columns = nil
+ end
+
+ def columns #:nodoc:
+ @columns ||= cell_matrix.transpose.map do |cell_row|
+ @cells_class.new(self, cell_row)
+ end
+ end
+
+ def new_cell(raw_cell, line) #:nodoc:
+ @cell_class.new(raw_cell, self, line)
+ end
+
+ # Pads our own cell_matrix and returns a cell matrix of same
+ # column width that can be used for diffing
+ def pad!(other_cell_matrix) #:nodoc:
+ clear_cache!
+ cols = cell_matrix.transpose
+ unmapped_cols = other_cell_matrix.transpose
+
+ mapped_cols = []
+
+ cols.each_with_index do |col, col_index|
+ header = col[0]
+ candidate_cols, unmapped_cols = unmapped_cols.partition do |other_col|
+ other_col[0] == header
+ end
+ raise "More than one column has the header #{header}" if candidate_cols.size > 2
+
+ other_padded_col = if candidate_cols.size == 1
+ # Found a matching column
+ candidate_cols[0]
+ else
+ mark_as_missing(cols[col_index])
+ (0...other_cell_matrix.length).map do |row|
+ val = row == 0 ? header.value : nil
+ SurplusCell.new(val, self, -1)
+ end
+ end
+ mapped_cols.insert(col_index, other_padded_col)
+ end
+
+ unmapped_cols.each_with_index do |col, col_index|
+ empty_col = (0...cell_matrix.length).map do |row|
+ SurplusCell.new(nil, self, -1)
+ end
+ cols << empty_col
+ end
+
+ @cell_matrix = cols.transpose
+ (mapped_cols + unmapped_cols).transpose
+ end
+
+ def ensure_table(table_or_array) #:nodoc:
+ return table_or_array if Table === table_or_array
+ Table.new(table_or_array)
+ end
+
+ def ensure_array_of_array(array)
+ Hash === array[0] ? hashes_to_array(array) : array
+ end
+
+ def hashes_to_array(hashes) #:nodoc:
+ header = hashes[0].keys
+ [header] + hashes.map{|hash| header.map{|key| hash[key]}}
+ end
+
+ def ensure_green! #:nodoc:
+ each_cell{|cell| cell.status = :passed}
+ end
+
+ def each_cell(&proc) #:nodoc:
+ cell_matrix.each{|row| row.each(&proc)}
+ end
+
+ def mark_as_missing(col) #:nodoc:
+ col.each do |cell|
+ cell.status = :undefined
+ end
+ end
+
+ # Represents a row of cells or columns of cells
+ class Cells #:nodoc:
+ include Enumerable
+ attr_reader :exception
+
+ def initialize(table, cells)
+ @table, @cells = table, cells
+ end
+
+ def accept(visitor)
+ return if Cucumber.wants_to_quit
+ each do |cell|
+ visitor.visit_table_cell(cell)
+ end
+ nil
+ end
+
+ # For testing only
+ def to_sexp #:nodoc:
+ [:row, line, *@cells.map{|cell| cell.to_sexp}]
+ end
+
+ def to_hash #:nodoc:
+ @to_hash ||= @table.to_hash(self)
+ end
+
+ def value(n) #:nodoc:
+ self[n].value
+ end
+
+ def [](n)
+ @cells[n]
+ end
+
+ def line
+ @cells[0].line
+ end
+
+ def dom_id
+ "row_#{line}"
+ end
+
+ private
+
+ def index
+ @table.index(self)
+ end
+
+ def width
+ map{|cell| cell.value ? cell.value.to_s.jlength : 0}.max
+ end
+
+ def each(&proc)
+ @cells.each(&proc)
+ end
+ end
+
+ class Cell #:nodoc:
+ attr_reader :line, :table
+ attr_accessor :status, :value
+
+ def initialize(value, table, line)
+ @value, @table, @line = value, table, line
+ end
+
+ def accept(visitor)
+ return if Cucumber.wants_to_quit
+ visitor.visit_table_cell_value(value, status)
+ end
+
+ def inspect!
+ @value = "(i) #{value.inspect}"
+ end
+
+ def ==(o)
+ SurplusCell === o || value == o.value
+ end
+
+ # For testing only
+ def to_sexp #:nodoc:
+ [:cell, @value]
+ end
+ end
+
+ class SurplusCell < Cell #:nodoc:
+ def status
+ :comment
+ end
+
+ def ==(o)
+ true
+ end
+ end
+ end
+ end
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/ast/tags.rb b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/ast/tags.rb
new file mode 100755
index 00000000..ca85474c
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/ast/tags.rb
@@ -0,0 +1,122 @@
+require 'set'
+
+module Cucumber
+ module Ast
+
+ # Holds the names of tags parsed from a feature file:
+ #
+ # @invoice @release_2
+ #
+ # This gets stored internally as ["invoice", "release_2"]
+ #
+ class Tags #:nodoc:
+ class And #:nodoc:
+ def initialize(tag_names)
+ if String === tag_names # They still come in as single strings on cuke4duke some times. Not sure why...
+ raise "Commas in tags??? #{tag_names.inspect}" if tag_names =~ /,/ # just in case...
+ tag_names = [tag_names]
+ end
+ @negative_tags, @positive_tags = tag_names.partition{|tag_name| Tags.exclude_tag?(tag_name)}
+ @negative_tags = Tags.strip_negative_char(@negative_tags)
+ end
+
+ def matches?(tag_names)
+ included?(tag_names) && !excluded?(tag_names)
+ end
+
+ private
+
+ def excluded?(tag_names)
+ (@negative_tags & tag_names).any?
+ end
+
+ def included?(tag_names)
+ positive_tag_set = Set.new(@positive_tags)
+ tag_names_set = Set.new(tag_names)
+ positive_tag_set.subset?(tag_names_set)
+ end
+ end
+
+ class Or #:nodoc:
+ def initialize(tag_exp)
+ @exp = tag_exp
+ end
+
+ def matches?(tag_names)
+ @exp.inject(false){|matches, tag_exp| matches || tag_exp.matches?(tag_names)}
+ end
+ end
+
+ class << self
+ EXCLUDE_PATTERN = /^~/
+
+ def matches?(source_tag_names, tag_name_lists)
+ validate_tags(tag_name_lists)
+ tag_name_lists.empty? ? true : check_if_tags_match(source_tag_names, tag_name_lists)
+ end
+
+ def exclude_tag?(tag_name)
+ tag_name =~ EXCLUDE_PATTERN
+ end
+
+ def strip_negative_char(tag_names)
+ tag_names.map{|name| name[1..-1]}
+ end
+
+ def parse_tags(tags_string)
+ tags_string.split(',')
+ end
+
+ private
+
+ def validate_tags(tag_name_lists)
+ all_tag_names = tag_name_lists.flatten
+ exclude_tag_names, include_tag_names = all_tag_names.partition{|tag_name| exclude_tag?(tag_name)}
+ exclude_tag_names = strip_negative_char(exclude_tag_names)
+ check_at_sign_prefix(exclude_tag_names + include_tag_names)
+ end
+
+ def check_if_tags_match(source_tag_names, tag_name_lists)
+ tag_exp = Or.new(tag_name_lists.map{|tag_name_list| And.new(tag_name_list) })
+ tag_exp.matches?(source_tag_names)
+ end
+
+ def check_at_sign_prefix(tag_names)
+ tag_names.each{|tag_name| raise "Tag names must start with an @ sign. The following tag name didn't: #{tag_name.inspect}" unless tag_name[0..0] == '@'}
+ end
+
+ end
+
+ attr_reader :tag_names
+
+ def initialize(line, tag_names)
+ @line, @tag_names = line, tag_names
+ end
+
+ def accept(visitor)
+ return if Cucumber.wants_to_quit
+ @tag_names.each do |tag_name|
+ visitor.visit_tag_name(tag_name)
+ end
+ end
+
+ def accept_hook?(hook)
+ self.class.matches?(@tag_names, hook.tag_name_lists)
+ end
+
+ def count(tag)
+ # See discussion:
+ # http://github.com/weplay/cucumber/commit/2dc592acdf3f7c1a0c333a8164649936bb82d983
+ if @tag_names.respond_to?(:count) && @tag_names.method(:count).arity > 0
+ @tag_names.count(tag) # 1.9
+ else
+ @tag_names.select{|t| t == tag}.length # 1.8
+ end
+ end
+
+ def to_sexp
+ @tag_names.map{|tag_name| [:tag, tag_name]}
+ end
+ end
+ end
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/ast/tree_walker.rb b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/ast/tree_walker.rb
new file mode 100755
index 00000000..d51ab75b
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/ast/tree_walker.rb
@@ -0,0 +1,201 @@
+module Cucumber
+ module Ast
+ # Walks the AST, executing steps and notifying listeners
+ class TreeWalker
+ attr_accessor :options #:nodoc:
+ attr_reader :step_mother #:nodoc:
+
+ def initialize(step_mother, listeners = [], options = {}, io = STDOUT)
+ @step_mother, @listeners, @options, @io = step_mother, listeners, options, io
+ end
+
+ def visit_features(features)
+ broadcast(features) do
+ features.accept(self)
+ end
+ end
+
+ def visit_feature(feature)
+ broadcast(feature) do
+ feature.accept(self)
+ end
+ end
+
+ def visit_comment(comment)
+ broadcast(comment) do
+ comment.accept(self)
+ end
+ end
+
+ def visit_comment_line(comment_line)
+ broadcast(comment_line)
+ end
+
+ def visit_tags(tags)
+ broadcast(tags) do
+ tags.accept(self)
+ end
+ end
+
+ def visit_tag_name(tag_name)
+ broadcast(tag_name)
+ end
+
+ def visit_feature_name(name)
+ broadcast(name)
+ end
+
+ # +feature_element+ is either Scenario or ScenarioOutline
+ def visit_feature_element(feature_element)
+ broadcast(feature_element) do
+ feature_element.accept(self)
+ end
+ end
+
+ def visit_background(background)
+ broadcast(background) do
+ background.accept(self)
+ end
+ end
+
+ def visit_background_name(keyword, name, file_colon_line, source_indent)
+ broadcast(keyword, name, file_colon_line, source_indent)
+ end
+
+ def visit_examples_array(examples_array)
+ broadcast(examples_array) do
+ examples_array.accept(self)
+ end
+ end
+
+ def visit_examples(examples)
+ broadcast(examples) do
+ examples.accept(self)
+ end
+ end
+
+ def visit_examples_name(keyword, name)
+ unless keyword =~ /:$/
+ message = < 'default')
+ end
+
+ def parse!(args)
+ @args = args
+ @options.parse!(args)
+ arrange_formats
+ raise("You can't use both --strict and --wip") if strict? && wip?
+
+ return @args.replace(@options.expanded_args_without_drb) if drb?
+
+ set_environment_variables
+ end
+
+ def verbose?
+ @options[:verbose]
+ end
+
+ def strict?
+ @options[:strict]
+ end
+
+ def wip?
+ @options[:wip]
+ end
+
+ def guess?
+ @options[:guess]
+ end
+
+ def diff_enabled?
+ @options[:diff_enabled]
+ end
+
+ def drb?
+ @options[:drb]
+ end
+
+ def drb_port
+ @options[:drb_port].to_i if @options[:drb_port]
+ end
+
+ def build_runner(step_mother, io)
+ Ast::TreeWalker.new(step_mother, formatters(step_mother), @options, io)
+ end
+
+ def formatter_class(format)
+ if(builtin = Options::BUILTIN_FORMATS[format])
+ constantize(builtin[0])
+ else
+ constantize(format)
+ end
+ end
+
+ def all_files_to_load
+ requires = @options[:require].empty? ? require_dirs : @options[:require]
+ files = requires.map do |path|
+ path = path.gsub(/\\/, '/') # In case we're on windows. Globs don't work with backslashes.
+ path = path.gsub(/\/$/, '') # Strip trailing slash.
+ File.directory?(path) ? Dir["#{path}/**/*"] : path
+ end.flatten.uniq
+ remove_excluded_files_from(files)
+ files.reject! {|f| !File.file?(f)}
+ files.reject! {|f| File.extname(f) == '.feature' }
+ files.reject! {|f| f =~ /^http/}
+ files
+ end
+
+ def step_defs_to_load
+ all_files_to_load.reject {|f| f =~ %r{/support/} }
+ end
+
+ def support_to_load
+ support_files = all_files_to_load.select {|f| f =~ %r{/support/} }
+ env_files = support_files.select {|f| f =~ %r{/support/env\..*} }
+ other_files = support_files - env_files
+ @options[:dry_run] ? other_files : env_files + other_files
+ end
+
+ def feature_files
+ potential_feature_files = paths.map do |path|
+ path = path.gsub(/\\/, '/') # In case we're on windows. Globs don't work with backslashes.
+ path = path.chomp('/')
+ if File.directory?(path)
+ Dir["#{path}/**/*.feature"]
+ elsif path[0..0] == '@' and # @listfile.txt
+ File.file?(path[1..-1]) # listfile.txt is a file
+ IO.read(path[1..-1]).split
+ else
+ path
+ end
+ end.flatten.uniq
+ remove_excluded_files_from(potential_feature_files)
+ potential_feature_files.sort
+ end
+
+ def feature_dirs
+ paths.map { |f| File.directory?(f) ? f : File.dirname(f) }.uniq
+ end
+
+ def log
+ logger = Logger.new(@out_stream)
+ logger.formatter = LogFormatter.new
+ logger.level = Logger::INFO
+ logger.level = Logger::DEBUG if self.verbose?
+ logger
+ end
+
+ private
+
+ def formatters(step_mother)
+ return [Formatter::Pretty.new(step_mother, nil, @options)] if @options[:autoformat]
+ @options[:formats].map do |format_and_out|
+ format = format_and_out[0]
+ out = format_and_out[1]
+ if String === out # file name
+ unless File.directory?(out)
+ out = File.open(out, Cucumber.file_mode('w'))
+ at_exit do
+
+ # Since Spork "never" actually exits, I want to flush and close earlier...
+ unless out.closed?
+ out.flush
+ out.close
+ end
+
+ end
+ end
+ end
+
+ begin
+ formatter_class = formatter_class(format)
+ formatter_class.new(step_mother, out, @options)
+ rescue Exception => e
+ e.message << "\nError creating formatter: #{format}"
+ raise e
+ end
+ end
+ end
+
+ class LogFormatter < ::Logger::Formatter
+ def call(severity, time, progname, msg)
+ msg
+ end
+ end
+
+ def paths
+ @options[:paths].empty? ? ['features'] : @options[:paths]
+ end
+
+ def set_environment_variables
+ @options[:env_vars].each do |var, value|
+ ENV[var] = value
+ end
+ end
+
+ def arrange_formats
+ @options[:formats] << ['pretty', @out_stream] if @options[:formats].empty?
+ @options[:formats] = @options[:formats].sort_by{|f| f[1] == @out_stream ? -1 : 1}
+ streams = @options[:formats].map { |(_, stream)| stream }
+ if streams != streams.uniq
+ raise "All but one formatter must use --out, only one can print to each stream (or STDOUT)"
+ end
+ end
+
+ def remove_excluded_files_from(files)
+ files.reject! {|path| @options[:excludes].detect {|pattern| path =~ pattern } }
+ end
+
+ def require_dirs
+ feature_dirs + Dir['vendor/{gems,plugins}/*/cucumber']
+ end
+
+ end
+
+ end
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/cli/drb_client.rb b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/cli/drb_client.rb
new file mode 100755
index 00000000..fc354243
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/cli/drb_client.rb
@@ -0,0 +1,32 @@
+require "drb/drb"
+# This code was taken from the RSpec project and slightly modified.
+
+module Cucumber
+ module Cli
+ class DRbClientError < StandardError
+ end
+ # Runs features on a DRB server, originally created with Spork compatibility in mind.
+ class DRbClient
+ DEFAULT_PORT = 8990
+
+ def self.run(args, error_stream, out_stream, port = nil)
+ port ||= ENV["CUCUMBER_DRB"] || DEFAULT_PORT
+
+ # See http://redmine.ruby-lang.org/issues/show/496 as to why we specify localhost:0
+ begin
+ DRb.start_service("druby://localhost:0")
+ rescue SocketError
+ # Ruby-1.8.7 on snow leopard doesn't like localhost:0 - but just :0
+ # seems to work just fine
+ DRb.start_service("druby://:0")
+ end
+ feature_server = DRbObject.new_with_uri("druby://127.0.0.1:#{port}")
+ cloned_args = [] # I have no idea why this is needed, but if the regular args are sent then DRb magically transforms it into a DRb object - not an array
+ args.each { |arg| cloned_args << arg }
+ feature_server.run(cloned_args, error_stream, out_stream)
+ rescue DRb::DRbConnError => e
+ raise DRbClientError, "No DRb server is running."
+ end
+ end
+ end
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/cli/language_help_formatter.rb b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/cli/language_help_formatter.rb
new file mode 100755
index 00000000..aaa13cd6
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/cli/language_help_formatter.rb
@@ -0,0 +1,72 @@
+require 'cucumber/formatter/pretty'
+require 'cucumber/parser/natural_language'
+require 'cucumber/formatter/unicode'
+
+module Cucumber
+ module Cli
+ class LanguageHelpFormatter < Formatter::Pretty
+ INCOMPLETE = %{
+The Cucumber grammar has evolved since this translation was written.
+Please help us complete the translation by translating the missing words in
+
+#{Cucumber::LANGUAGE_FILE}
+
+Then contribute back to the Cucumber project. Details here:
+http://wiki.github.com/aslakhellesoy/cucumber/spoken-languages
+}
+
+ class << self
+ def list_languages(io)
+ raw = Cucumber::LANGUAGES.keys.sort.map do |lang|
+ [
+ lang,
+ Cucumber::LANGUAGES[lang]['name'],
+ Cucumber::LANGUAGES[lang]['native']
+ ]
+ end
+
+ print_table io, raw, :check_lang => true
+ end
+
+ def list_keywords(io, lang)
+ language = Parser::NaturalLanguage.get(nil, lang)
+ raw = Parser::NaturalLanguage::KEYWORD_KEYS.map do |key|
+ [key, language.keywords(key)]
+ end
+
+ print_table io, raw, :incomplete => language.incomplete?
+ end
+
+ private
+ def print_table(io, raw, options)
+ table = Ast::Table.new(raw)
+ formatter = new(nil, io, options)
+ Ast::TreeWalker.new(nil, [formatter]).visit_multiline_arg(table)
+ end
+ end
+
+ def before_visit_multiline_arg(table)
+ if @options[:incomplete]
+ @io.puts(format_string(INCOMPLETE, :failed))
+ end
+ end
+
+ def before_visit_table_row(table_row)
+ @col = 1
+ end
+
+ def before_visit_table_cell_value(value, status)
+ if @col == 1
+ if(@options[:check_lang])
+ @incomplete = Parser::NaturalLanguage.get(nil, value).incomplete?
+ end
+ status = :comment
+ elsif @incomplete
+ status = :undefined
+ end
+
+ @col += 1
+ end
+ end
+ end
+end
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/cli/main.rb b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/cli/main.rb
new file mode 100755
index 00000000..037cb9fb
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/cli/main.rb
@@ -0,0 +1,121 @@
+require 'optparse'
+require 'cucumber'
+require 'ostruct'
+require 'logger'
+require 'cucumber/parser'
+require 'cucumber/feature_file'
+require 'cucumber/formatter/color_io'
+require 'cucumber/cli/language_help_formatter'
+require 'cucumber/cli/configuration'
+require 'cucumber/cli/drb_client'
+require 'cucumber/ast/tags'
+
+module Cucumber
+ module Cli
+ class Main
+ FAILURE = 1
+
+ class << self
+ def step_mother
+ @step_mother ||= StepMother.new
+ end
+
+ def execute(args)
+ new(args).execute!(step_mother)
+ end
+ end
+
+ def initialize(args, out_stream = STDOUT, error_stream = STDERR)
+ @args = args
+ @out_stream = out_stream == STDOUT ? Formatter::ColorIO.new : out_stream
+ @error_stream = error_stream
+ @configuration = nil
+ end
+
+ def execute!(step_mother)
+ trap_interrupt
+ if configuration.drb?
+ begin
+ return DRbClient.run(@args, @error_stream, @out_stream, configuration.drb_port)
+ rescue DRbClientError => e
+ @error_stream.puts "WARNING: #{e.message} Running features locally:"
+ end
+ end
+ step_mother.options = configuration.options
+ step_mother.log = configuration.log
+
+ step_mother.load_code_files(configuration.support_to_load)
+ step_mother.after_configuration(configuration)
+ features = step_mother.load_plain_text_features(configuration.feature_files)
+ step_mother.load_code_files(configuration.step_defs_to_load)
+
+ enable_diffing
+
+ runner = configuration.build_runner(step_mother, @out_stream)
+ step_mother.visitor = runner # Needed to support World#announce
+ runner.visit_features(features)
+
+ failure = if exceeded_tag_limts?(features)
+ FAILURE
+ elsif configuration.wip?
+ step_mother.scenarios(:passed).any?
+ else
+ step_mother.scenarios(:failed).any? ||
+ (configuration.strict? && (step_mother.steps(:undefined).any? || step_mother.steps(:pending).any?))
+ end
+ rescue ProfilesNotDefinedError, YmlLoadError, ProfileNotFound => e
+ @error_stream.puts e.message
+ true
+ end
+
+ def exceeded_tag_limts?(features)
+ exceeded = false
+ configuration.options[:tag_names].each do |tag_list|
+ tag_list.each do |tag_name, limit|
+ if !Ast::Tags.exclude_tag?(tag_name) && limit
+ tag_count = features.tag_count(tag_name)
+ if tag_count > limit.to_i
+ exceeded = true
+ end
+ end
+ end
+ end
+ exceeded
+ end
+
+ def configuration
+ return @configuration if @configuration
+
+ @configuration = Configuration.new(@out_stream, @error_stream)
+ @configuration.parse!(@args)
+ @configuration
+ end
+
+ private
+
+ def enable_diffing
+ if configuration.diff_enabled?
+ begin
+ require 'spec/expectations'
+ begin
+ require 'spec/runner/differs/default' # RSpec >=1.2.4
+ rescue ::LoadError
+ require 'spec/expectations/differs/default' # RSpec <=1.2.3
+ end
+ options = OpenStruct.new(:diff_format => :unified, :context_lines => 3)
+ ::Spec::Expectations.differ = ::Spec::Expectations::Differs::Default.new(options)
+ rescue ::LoadError => ignore
+ end
+ end
+ end
+
+ def trap_interrupt
+ trap('INT') do
+ exit!(1) if Cucumber.wants_to_quit
+ Cucumber.wants_to_quit = true
+ STDERR.puts "\nExiting... Interrupt again to exit immediately."
+ end
+ end
+ end
+ end
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/cli/options.rb b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/cli/options.rb
new file mode 100755
index 00000000..c4bf6e6a
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/cli/options.rb
@@ -0,0 +1,403 @@
+require 'cucumber/cli/profile_loader'
+module Cucumber
+ module Cli
+
+ class Options
+ BUILTIN_FORMATS = {
+ 'html' => ['Cucumber::Formatter::Html', 'Generates a nice looking HTML report.'],
+ 'pretty' => ['Cucumber::Formatter::Pretty', 'Prints the feature as is - in colours.'],
+ 'pdf' => ['Cucumber::Formatter::Pdf', "Generates a PDF report. You need to have the\n" +
+ "#{' ' * 51}prawn gem installed. Will pick up logo from\n" +
+ "#{' ' * 51}features/support/logo.png or\n" +
+ "#{' ' * 51}features/support/logo.jpg if present."],
+ 'progress' => ['Cucumber::Formatter::Progress', 'Prints one character per scenario.'],
+ 'rerun' => ['Cucumber::Formatter::Rerun', 'Prints failing files with line numbers.'],
+ 'usage' => ['Cucumber::Formatter::Usage', "Prints where step definitions are used.\n" +
+ "#{' ' * 51}The slowest step definitions (with duration) are\n" +
+ "#{' ' * 51}listed first. If --dry-run is used the duration\n" +
+ "#{' ' * 51}is not shown, and step definitions are sorted by\n" +
+ "#{' ' * 51}filename instead."],
+ 'stepdefs' => ['Cucumber::Formatter::Stepdefs', "Prints All step definitions with their locations. Same as\n" +
+ "#{' ' * 51}the usage formatter, except that steps are not printed."],
+ 'junit' => ['Cucumber::Formatter::Junit', 'Generates a report similar to Ant+JUnit.'],
+ 'tag_cloud' => ['Cucumber::Formatter::TagCloud', 'Prints a tag cloud of tag usage.'],
+ 'debug' => ['Cucumber::Formatter::Debug', 'For developing formatters - prints the calls made to the listeners.']
+ }
+ max = BUILTIN_FORMATS.keys.map{|s| s.length}.max
+ FORMAT_HELP = (BUILTIN_FORMATS.keys.sort.map do |key|
+ " #{key}#{' ' * (max - key.length)} : #{BUILTIN_FORMATS[key][1]}"
+ end) + ["Use --format rerun --out features.txt to write out failing",
+ "features. You can rerun them with cucumber @features.txt.",
+ "FORMAT can also be the fully qualified class name of",
+ "your own custom formatter. If the class isn't loaded,",
+ "Cucumber will attempt to require a file with a relative",
+ "file name that is the underscore name of the class name.",
+ "Example: --format Foo::BarZap -> Cucumber will look for",
+ "foo/bar_zap.rb. You can place the file with this relative",
+ "path underneath your features/support directory or anywhere",
+ "on Ruby's LOAD_PATH, for example in a Ruby gem."
+ ]
+ DRB_FLAG = '--drb'
+ PROFILE_SHORT_FLAG = '-p'
+ NO_PROFILE_SHORT_FLAG = '-P'
+ PROFILE_LONG_FLAG = '--profile'
+ NO_PROFILE_LONG_FLAG = '--no-profile'
+
+
+ def self.parse(args, out_stream, error_stream, options = {})
+ new(out_stream, error_stream, options).parse!(args)
+ end
+
+ def initialize(out_stream = STDOUT, error_stream = STDERR, options = {})
+ @out_stream = out_stream
+ @error_stream = error_stream
+
+ @default_profile = options[:default_profile]
+ @skip_profile_information = options[:skip_profile_information]
+ @profiles = []
+ @overridden_paths = []
+ @options = default_options
+
+ @quiet = @disable_profile_loading = nil
+ end
+
+ def [](key)
+ @options[key]
+ end
+
+ def []=(key, value)
+ @options[key] = value
+ end
+
+ def expanded_args_without_drb
+ return @expanded_args_without_drb if @expanded_args_without_drb
+ @expanded_args_without_drb = (
+ previous_flag_was_profile = false
+ @expanded_args.reject do |arg|
+ if previous_flag_was_profile
+ previous_flag_was_profile = false
+ next true
+ end
+ if [PROFILE_SHORT_FLAG, PROFILE_LONG_FLAG].include?(arg)
+ previous_flag_was_profile = true
+ next true
+ end
+ arg == DRB_FLAG || @overridden_paths.include?(arg)
+ end
+ )
+
+ @expanded_args_without_drb.push("--no-profile") unless @expanded_args_without_drb.include?(NO_PROFILE_LONG_FLAG) || @expanded_args_without_drb.include?(NO_PROFILE_SHORT_FLAG)
+ @expanded_args_without_drb
+ end
+
+ def parse!(args)
+ @args = args
+ @expanded_args = @args.dup
+
+ @args.extend(::OptionParser::Arguable)
+
+ @args.options do |opts|
+ opts.banner = ["Usage: cucumber [options] [ [FILE|DIR|URL][:LINE[:LINE]*] ]+", "",
+ "Examples:",
+ "cucumber examples/i18n/en/features",
+ "cucumber @features.txt (See --format rerun)",
+ "cucumber --language it examples/i18n/it/features/somma.feature:6:98:113",
+ "cucumber -s -i http://rubyurl.com/eeCl", "", "",
+ ].join("\n")
+ opts.on("-r LIBRARY|DIR", "--require LIBRARY|DIR",
+ "Require files before executing the features. If this",
+ "option is not specified, all *.rb files that are",
+ "siblings or below the features will be loaded auto-",
+ "matically. Automatic loading is disabled when this",
+ "option is specified, and all loading becomes explicit.",
+ "Files under directories named \"support\" are always",
+ "loaded first.",
+ "This option can be specified multiple times.") do |v|
+ @options[:require] << v
+ end
+ opts.on("-l LANG", "--language LANG",
+ "Specify language for features (Default: #{@options[:lang]})",
+ %{Run with "--language help" to see all languages},
+ %{Run with "--language LANG help" to list keywords for LANG}) do |v|
+ if v == 'help'
+ list_languages_and_exit
+ elsif args==['help'] # I think this conditional is just cruft and can be removed
+ list_keywords_and_exit(v)
+ else
+ @options[:lang] = v
+ end
+ end
+ opts.on("-f FORMAT", "--format FORMAT",
+ "How to format features (Default: pretty). Available formats:",
+ *FORMAT_HELP) do |v|
+ @options[:formats] << [v, @out_stream]
+ end
+ opts.on("-o", "--out [FILE|DIR]",
+ "Write output to a file/directory instead of STDOUT. This option",
+ "applies to the previously specified --format, or the",
+ "default format if no format is specified. Check the specific",
+ "formatter's docs to see whether to pass a file or a dir.") do |v|
+ @options[:formats] << ['pretty', nil] if @options[:formats].empty?
+ @options[:formats][-1][1] = v
+ end
+ opts.on("-t TAGS", "--tags TAGS",
+ "Only execute the features or scenarios with the specified tags.",
+ "TAGS must be comma-separated without spaces. Example: --tags @dev\n",
+ "You can select tags using logical AND or logical OR:",
+ "To execute anything that is tagged with both @dev AND @prod\n",
+ "Example: --tags @dev,@prod",
+ "To execute anything that is tagged with @dev OR @prod\n",
+ "Example: --tags @dev --tags @prod\n",
+ "Negative tags: Prefix tags with ~ to exclude features or scenarios",
+ "having that tag. Example: --tags ~@slow\n",
+ "Limit WIP: Positive tags can be given a threshold to limit the",
+ "number of occurrences. Example: --tags @qa:3 will fail if there",
+ "are more than 3 occurrences of the @qa tag.") do |v|
+ tag_names = parse_tags(v)
+ @options[:tag_names] << tag_names
+ end
+ opts.on("-n NAME", "--name NAME",
+ "Only execute the feature elements which match part of the given name.",
+ "If this option is given more than once, it will match against all the",
+ "given names.") do |v|
+ @options[:name_regexps] << /#{v}/
+ end
+ opts.on("-e", "--exclude PATTERN", "Don't run feature files or require ruby files matching PATTERN") do |v|
+ @options[:excludes] << Regexp.new(v)
+ end
+ opts.on(PROFILE_SHORT_FLAG, "#{PROFILE_LONG_FLAG} PROFILE",
+ "Pull commandline arguments from cucumber.yml which can be defined as",
+ "strings or arrays. When a 'default' profile is defined and no profile",
+ "is specified it is always used. (Unless disabled, see -P below.)",
+ "When feature files are defined in a profile and on the command line",
+ "then only the ones from the command line are used.") do |v|
+ @profiles << v
+ end
+ opts.on(NO_PROFILE_SHORT_FLAG, NO_PROFILE_LONG_FLAG,
+ "Disables all profile laoding to avoid using the 'default' profile.") do |v|
+ @disable_profile_loading = true
+ end
+ opts.on("-c", "--[no-]color",
+ "Whether or not to use ANSI color in the output. Cucumber decides",
+ "based on your platform and the output destination if not specified.") do |v|
+ Term::ANSIColor.coloring = v
+ end
+ opts.on("-d", "--dry-run", "Invokes formatters without executing the steps.",
+ "This also omits the loading of your support/env.rb file if it exists.",
+ "Implies --no-snippets.") do
+ @options[:dry_run] = true
+ @options[:snippets] = false
+ end
+ opts.on("-a", "--autoformat DIRECTORY",
+ "Reformats (pretty prints) feature files and write them to DIRECTORY.",
+ "Be careful if you choose to overwrite the originals.",
+ "Implies --dry-run --formatter pretty.") do |directory|
+ @options[:autoformat] = directory
+ Term::ANSIColor.coloring = false
+ @options[:dry_run] = true
+ @quiet = true
+ end
+
+ opts.on("-m", "--no-multiline",
+ "Don't print multiline strings and tables under steps.") do
+ @options[:no_multiline] = true
+ end
+ opts.on("-s", "--no-source",
+ "Don't print the file and line of the step definition with the steps.") do
+ @options[:source] = false
+ end
+ opts.on("-i", "--no-snippets", "Don't print snippets for pending steps.") do
+ @options[:snippets] = false
+ end
+ opts.on("-q", "--quiet", "Alias for --no-snippets --no-source.") do
+ @quiet = true
+ end
+ opts.on("-b", "--backtrace", "Show full backtrace for all errors.") do
+ Cucumber.use_full_backtrace = true
+ end
+ opts.on("-S", "--strict", "Fail if there are any undefined steps.") do
+ @options[:strict] = true
+ end
+ opts.on("-w", "--wip", "Fail if there are any passing scenarios.") do
+ @options[:wip] = true
+ end
+ opts.on("-v", "--verbose", "Show the files and features loaded.") do
+ @options[:verbose] = true
+ end
+ opts.on("-g", "--guess", "Guess best match for Ambiguous steps.") do
+ @options[:guess] = true
+ end
+ opts.on("-x", "--expand", "Expand Scenario Outline Tables in output.") do
+ @options[:expand] = true
+ end
+ opts.on("--no-diff", "Disable diff output on failing expectations.") do
+ @options[:diff_enabled] = false
+ end
+ opts.on(DRB_FLAG, "Run features against a DRb server. (i.e. with the spork gem)") do
+ @options[:drb] = true
+ end
+ opts.on("--port PORT", "Specify DRb port. Ignored without --drb") do |port|
+ @options[:drb_port] = port
+ end
+ opts.on_tail("--version", "Show version.") do
+ @out_stream.puts Cucumber::VERSION
+ Kernel.exit(0)
+ end
+ opts.on_tail("-h", "--help", "You're looking at it.") do
+ @out_stream.puts opts.help
+ Kernel.exit(0)
+ end
+ end.parse!
+
+ if @quiet
+ @options[:snippets] = @options[:source] = false
+ else
+ @options[:snippets] = true if @options[:snippets].nil?
+ @options[:source] = true if @options[:source].nil?
+ end
+
+ extract_environment_variables
+ @options[:paths] = @args.dup #whatver is left over
+
+ merge_profiles
+ print_profile_information
+
+ self
+ end
+
+ protected
+
+ attr_reader :options, :profiles, :expanded_args
+ protected :options, :profiles, :expanded_args
+
+ private
+
+ def non_stdout_formats
+ @options[:formats].select {|format, output| output != @out_stream }
+ end
+
+ def stdout_formats
+ @options[:formats].select {|format, output| output == @out_stream }
+ end
+
+ def extract_environment_variables
+ @args.delete_if do |arg|
+ if arg =~ /^(\w+)=(.*)$/
+ @options[:env_vars][$1] = $2
+ true
+ end
+ end
+ end
+
+ def parse_tags(tag_string)
+ tag_names = Ast::Tags.parse_tags(tag_string)
+ parse_tag_limits(tag_names)
+ end
+
+ def parse_tag_limits(tag_names)
+ tag_names.inject({}) do |dict, tag|
+ tag, limit = tag.split(':')
+ dict[tag] = limit.nil? ? limit : limit.to_i
+ dict
+ end
+ end
+
+ def disable_profile_loading?
+ @disable_profile_loading
+ end
+
+ def merge_profiles
+ if @disable_profile_loading
+ @out_stream.puts "Disabling profiles..."
+ return
+ end
+
+ @profiles << @default_profile if default_profile_should_be_used?
+
+ @profiles.each do |profile|
+ profile_args = profile_loader.args_from(profile)
+ reverse_merge(
+ Options.parse(profile_args, @out_stream, @error_stream, :skip_profile_information => true)
+ )
+ end
+
+ end
+
+ def default_profile_should_be_used?
+ @profiles.empty? &&
+ profile_loader.cucumber_yml_defined? &&
+ profile_loader.has_profile?(@default_profile)
+ end
+
+ def profile_loader
+ @profile_loader ||= ProfileLoader.new
+ end
+
+ def reverse_merge(other_options)
+ @options = other_options.options.merge(@options)
+ @options[:require] += other_options[:require]
+ @options[:excludes] += other_options[:excludes]
+ @options[:name_regexps] += other_options[:name_regexps]
+ @options[:tag_names] += other_options[:tag_names]
+ @options[:env_vars] = other_options[:env_vars].merge(@options[:env_vars])
+ if @options[:paths].empty?
+ @options[:paths] = other_options[:paths]
+ else
+ @overridden_paths += (other_options[:paths] - @options[:paths])
+ end
+ @options[:source] &= other_options[:source]
+ @options[:snippets] &= other_options[:snippets]
+
+ @profiles += other_options.profiles
+ @expanded_args += other_options.expanded_args
+
+ if @options[:formats].empty?
+ @options[:formats] = other_options[:formats]
+ else
+ @options[:formats] += other_options[:formats]
+ @options[:formats] = stdout_formats[0..0] + non_stdout_formats
+ end
+
+ self
+ end
+
+ # TODO: Move to Language
+ def list_keywords_and_exit(lang)
+ unless Cucumber::LANGUAGES[lang]
+ raise("No language with key #{lang}")
+ end
+ LanguageHelpFormatter.list_keywords(@out_stream, lang)
+ Kernel.exit(0)
+ end
+
+ def list_languages_and_exit
+ LanguageHelpFormatter.list_languages(@out_stream)
+ Kernel.exit(0)
+ end
+
+ def print_profile_information
+ return if @skip_profile_information || @profiles.empty?
+ profiles_sentence = ''
+ profiles_sentence = @profiles.size == 1 ? @profiles.first :
+ "#{@profiles[0...-1].join(', ')} and #{@profiles.last}"
+
+ @out_stream.puts "Using the #{profiles_sentence} profile#{'s' if @profiles.size> 1}..."
+ end
+
+ def default_options
+ {
+ :strict => false,
+ :require => [],
+ :dry_run => false,
+ :formats => [],
+ :excludes => [],
+ :tag_names => [],
+ :name_regexps => [],
+ :env_vars => {},
+ :diff_enabled => true
+ }
+ end
+ end
+
+ end
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/cli/profile_loader.rb b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/cli/profile_loader.rb
new file mode 100755
index 00000000..1496ad7d
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/cli/profile_loader.rb
@@ -0,0 +1,82 @@
+module Cucumber
+ module Cli
+
+ class ProfileLoader
+
+ def initialize
+ @cucumber_yml = nil
+ end
+
+ def args_from(profile)
+ unless cucumber_yml.has_key?(profile)
+ raise(ProfileNotFound, <<-END_OF_ERROR)
+Could not find profile: '#{profile}'
+
+Defined profiles in cucumber.yml:
+ * #{cucumber_yml.keys.join("\n * ")}
+ END_OF_ERROR
+ end
+
+ args_from_yml = cucumber_yml[profile] || ''
+
+ case(args_from_yml)
+ when String
+ raise YmlLoadError, "The '#{profile}' profile in cucumber.yml was blank. Please define the command line arguments for the '#{profile}' profile in cucumber.yml.\n" if args_from_yml =~ /^\s*$/
+ args_from_yml = args_from_yml.split(' ')
+ when Array
+ raise YmlLoadError, "The '#{profile}' profile in cucumber.yml was empty. Please define the command line arguments for the '#{profile}' profile in cucumber.yml.\n" if args_from_yml.empty?
+ else
+ raise YmlLoadError, "The '#{profile}' profile in cucumber.yml was a #{args_from_yml.class}. It must be a String or Array"
+ end
+ args_from_yml
+ end
+
+ def has_profile?(profile)
+ cucumber_yml.has_key?(profile)
+ end
+
+ def cucumber_yml_defined?
+ cucumber_file && File.exist?(cucumber_file)
+ end
+
+ private
+
+ # Loads the profile, processing it through ERB and YAML, and returns it as a hash.
+ def cucumber_yml
+ return @cucumber_yml if @cucumber_yml
+ unless cucumber_yml_defined?
+ raise(ProfilesNotDefinedError,"cucumber.yml was not found. Please refer to cucumber's documentation on defining profiles in cucumber.yml. You must define a 'default' profile to use the cucumber command without any arguments.\nType 'cucumber --help' for usage.\n")
+ end
+
+ require 'erb'
+ require 'yaml'
+ begin
+ @cucumber_erb = ERB.new(IO.read(cucumber_file)).result
+ rescue Exception => e
+ raise(YmlLoadError,"cucumber.yml was found, but could not be parsed with ERB. Please refer to cucumber's documentation on correct profile usage.\n#{$!.inspect}")
+ end
+
+ begin
+ @cucumber_yml = YAML::load(@cucumber_erb)
+ rescue StandardError => e
+ raise(YmlLoadError,"cucumber.yml was found, but could not be parsed. Please refer to cucumber's documentation on correct profile usage.\n")
+ end
+
+ if @cucumber_yml.nil? || !@cucumber_yml.is_a?(Hash)
+ raise(YmlLoadError,"cucumber.yml was found, but was blank or malformed. Please refer to cucumber's documentation on correct profile usage.\n")
+ end
+
+ return @cucumber_yml
+ end
+
+ # Locates cucumber.yml file. The file can end in .yml or .yaml,
+ # and be located in the current directory (eg. project root) or
+ # in a .config/ or config/ subdirectory of the current directory.
+ def cucumber_file
+ @cucumber_file ||= Dir.glob('{,.config/,config/}cucumber{.yml,.yaml}').first
+ end
+
+ end
+ end
+end
+
diff --git a/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/constantize.rb b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/constantize.rb
new file mode 100755
index 00000000..7917390a
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/constantize.rb
@@ -0,0 +1,34 @@
+module Cucumber
+ module Constantize #:nodoc:
+ def constantize(camel_cased_word)
+ try = 0
+ begin
+ try += 1
+ names = camel_cased_word.split('::')
+ names.shift if names.empty? || names.first.empty?
+
+ constant = Object
+ names.each do |name|
+ constant = constant.const_defined?(name) ? constant.const_get(name) : constant.const_missing(name)
+ end
+ constant
+ rescue NameError => e
+ require underscore(camel_cased_word)
+ if try < 2
+ retry
+ else
+ raise e
+ end
+ end
+ end
+
+ # Snagged from active_support
+ def underscore(camel_cased_word)
+ camel_cased_word.to_s.gsub(/::/, '/').
+ gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
+ gsub(/([a-z\d])([A-Z])/,'\1_\2').
+ tr("-", "_").
+ downcase
+ end
+ end
+end
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/core_ext/instance_exec.rb b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/core_ext/instance_exec.rb
new file mode 100755
index 00000000..0346a348
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/core_ext/instance_exec.rb
@@ -0,0 +1,98 @@
+require 'cucumber/platform'
+
+module Cucumber
+ # Raised if the number of a StepDefinition's Regexp match groups
+ # is different from the number of Proc arguments.
+ class ArityMismatchError < StandardError
+ end
+end
+
+class Object #:nodoc:
+ unless defined? instance_exec # 1.9
+ # http://eigenclass.org/hiki/bounded+space+instance_exec
+ module InstanceExecHelper #:nodoc:
+ end
+ include InstanceExecHelper
+ def instance_exec(*args, &block)
+ begin
+ old_critical, Thread.critical = Thread.critical, true
+ n = 0
+ n += 1 while respond_to?(mname="__instance_exec#{n}")
+ InstanceExecHelper.module_eval{ define_method(mname, &block) }
+ ensure
+ Thread.critical = old_critical
+ end
+ begin
+ ret = send(mname, *args)
+ ensure
+ InstanceExecHelper.module_eval{ remove_method(mname) } rescue nil
+ end
+ ret
+ end
+ end
+
+ # TODO: Move most of this stuff out to an InstanceExecutor class.
+ def cucumber_instance_exec(check_arity, pseudo_method, *args, &block)
+ cucumber_run_with_backtrace_filtering(pseudo_method) do
+ if check_arity && !cucumber_compatible_arity?(args, block)
+ instance_exec do
+ ari = cucumber_arity(block)
+ ari = ari < 0 ? (ari.abs-1).to_s+"+" : ari
+ s1 = ari == 1 ? "" : "s"
+ s2 = args.length == 1 ? "" : "s"
+ raise Cucumber::ArityMismatchError.new(
+ "Your block takes #{ari} argument#{s1}, but the Regexp matched #{args.length} argument#{s2}."
+ )
+ end
+ else
+ instance_exec(*args, &block)
+ end
+ end
+ end
+
+ private
+
+ def cucumber_arity(block)
+ a = block.arity
+ Cucumber::RUBY_1_9 ? a : (a == -1 ? 0 : a)
+ end
+
+ def cucumber_compatible_arity?(args, block)
+ ari = cucumber_arity(block)
+ len = args.length
+ return true if ari == len or ari < 0 && len >= ari.abs-1
+ false
+ end
+
+ def cucumber_run_with_backtrace_filtering(pseudo_method)
+ begin
+ yield
+ rescue Exception => e
+ instance_exec_invocation_line = "#{__FILE__}:#{__LINE__ - 2}:in `cucumber_run_with_backtrace_filtering'"
+ replace_instance_exec_invocation_line!((e.backtrace || []), instance_exec_invocation_line, pseudo_method)
+ raise e
+ end
+ end
+
+ INSTANCE_EXEC_OFFSET = (Cucumber::RUBY_1_9 || Cucumber::RUBY_1_8_7 || Cucumber::JRUBY) ? -3 : -4
+
+ def replace_instance_exec_invocation_line!(backtrace, instance_exec_invocation_line, pseudo_method)
+ return if Cucumber.use_full_backtrace
+
+ instance_exec_pos = backtrace.index(instance_exec_invocation_line)
+ if instance_exec_pos
+ replacement_line = instance_exec_pos + INSTANCE_EXEC_OFFSET
+ if Cucumber::RUBY_1_8_7
+ backtrace[replacement_line] += ":in `#{pseudo_method}'" if pseudo_method
+ else
+ backtrace[replacement_line].gsub!(/`.*'/, "`#{pseudo_method}'") if pseudo_method
+ end
+ backtrace[replacement_line+1..-1] = nil
+
+ backtrace.compact!
+ else
+ # This happens with rails, because they screw up the backtrace
+ # before we get here (injecting erb stacktrace and such)
+ end
+ end
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/core_ext/proc.rb b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/core_ext/proc.rb
new file mode 100755
index 00000000..bf1f5b4e
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/core_ext/proc.rb
@@ -0,0 +1,30 @@
+# Proc extension to get more location info out of a proc
+class Proc #:nodoc:
+ PROC_PATTERN = /[\d\w]+@(.*):(.*)>/
+
+ def to_comment_line
+ "# #{file_colon_line}"
+ end
+
+ def backtrace_line(name)
+ "#{file_colon_line}:in `#{name}'"
+ end
+
+ if Proc.new{}.to_s =~ PROC_PATTERN
+ def file_colon_line
+ path, line = *to_s.match(PROC_PATTERN)[1..2]
+ line = line.to_i - 1 if Cucumber::RUBY_1_9
+ path = File.expand_path(path)
+ pwd = Dir.pwd
+ path = path[pwd.length+1..-1]
+ "#{path}:#{line}"
+ end
+ else
+ # This Ruby implementation doesn't implement Proc#to_s correctly
+ STDERR.puts "*** THIS RUBY IMPLEMENTATION DOESN'T REPORT FILE AND LINE FOR PROCS ***"
+
+ def file_colon_line
+ "UNKNOWN:-1"
+ end
+ end
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/core_ext/string.rb b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/core_ext/string.rb
new file mode 100755
index 00000000..1fdd3b09
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/core_ext/string.rb
@@ -0,0 +1,16 @@
+class String #:nodoc:
+ def indent(n)
+ if n >= 0
+ gsub(/^/, ' ' * n)
+ else
+ gsub(/^ {0,#{-n}}/, "")
+ end
+ end
+
+ if (Cucumber::JRUBY && Cucumber::RAILS) || Cucumber::RUBY_1_9
+ # Workaround for http://tinyurl.com/55uu3u
+ alias jlength length
+ else
+ require 'jcode'
+ end
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/feature_file.rb b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/feature_file.rb
new file mode 100755
index 00000000..a72944b0
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/feature_file.rb
@@ -0,0 +1,54 @@
+require 'cucumber/parser/natural_language'
+require 'cucumber/filter'
+
+module Cucumber
+ class FeatureFile
+ FILE_COLON_LINE_PATTERN = /^([\w\W]*?):([\d:]+)$/ #:nodoc:
+ LANGUAGE_PATTERN = /language:\s*(.*)/ #:nodoc:
+
+ # The +uri+ argument is the location of the source. It can ba a path
+ # or a path:line1:line2 etc. If +source+ is passed, +uri+ is ignored.
+ def initialize(uri, source=nil)
+ @source = source
+ _, @path, @lines = *FILE_COLON_LINE_PATTERN.match(uri)
+ if @path
+ @lines = @lines.split(':').map { |line| line.to_i }
+ else
+ @path = uri
+ end
+ end
+
+ # Parses a file and returns a Cucumber::Ast
+ # If +options+ contains tags, the result will
+ # be filtered.
+ def parse(step_mother, options)
+ filter = Filter.new(@lines, options)
+ language = Parser::NaturalLanguage.get(step_mother, (lang || options[:lang] || 'en'))
+ language.parse(source, @path, filter)
+ end
+
+ def source
+ @source ||= if @path =~ /^http/
+ require 'open-uri'
+ open(@path).read
+ else
+ begin
+ File.open(@path, Cucumber.file_mode('r')).read
+ rescue Errno::EACCES => e
+ p = File.expand_path(@path)
+ e.message << "\nCouldn't open #{p}"
+ raise e
+ end
+ end
+ end
+
+ def lang
+ line_one = source.split(/\n/)[0]
+ if line_one =~ LANGUAGE_PATTERN
+ $1.strip
+ else
+ nil
+ end
+ end
+ end
+end
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/filter.rb b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/filter.rb
new file mode 100755
index 00000000..b87811a4
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/filter.rb
@@ -0,0 +1,41 @@
+module Cucumber
+ # Filters the AST based on --tags and --name
+ class Filter #:nodoc:
+ def initialize(lines, options)
+ @lines = lines
+ @tag_name_lists = options[:tag_names] ? options[:tag_names].map{|tags_with_limit| tags_with_limit.keys } : []
+ @name_regexps = options[:name_regexps] || []
+ end
+
+ def accept?(syntax_node)
+ at_line?(syntax_node) &&
+ matches_tags?(syntax_node) &&
+ matches_names?(syntax_node)
+ end
+
+ def accept_example?(syntax_node, outline)
+ (at_line?(syntax_node) || outline_at_line?(outline)) &&
+ (matches_names?(syntax_node) || outline_matches_names?(outline))
+ end
+
+ def at_line?(syntax_node)
+ @lines.nil? || @lines.empty? || @lines.detect{|line| syntax_node.at_line?(line)}
+ end
+
+ def outline_at_line?(syntax_node)
+ @lines.nil? || @lines.empty? || @lines.detect{|line| syntax_node.outline_at_line?(line)}
+ end
+
+ def matches_tags?(syntax_node)
+ syntax_node.matches_tags?(@tag_name_lists)
+ end
+
+ def outline_matches_names?(syntax_node)
+ @name_regexps.nil? || @name_regexps.empty? || @name_regexps.detect{|name_regexp| syntax_node.outline_matches_name?(name_regexp)}
+ end
+
+ def matches_names?(syntax_node)
+ @name_regexps.nil? || @name_regexps.empty? || @name_regexps.detect{|name_regexp| syntax_node.matches_name?(name_regexp)}
+ end
+ end
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/formatter/ansicolor.rb b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/formatter/ansicolor.rb
new file mode 100755
index 00000000..36dbb70a
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/formatter/ansicolor.rb
@@ -0,0 +1,157 @@
+require 'term/ansicolor'
+require 'cucumber/platform'
+
+if Cucumber::IRONRUBY
+ begin
+ require 'iron-term-ansicolor'
+ rescue LoadError
+ STDERR.puts %{*** WARNING: You must "igem install iron-term-ansicolor" to get coloured ouput in on IronRuby}
+ end
+end
+
+if Cucumber::WINDOWS_MRI
+ begin
+ require 'Win32/Console/ANSI'
+ rescue LoadError
+ STDERR.puts %{*** WARNING: You must "gem install win32console" (1.2.0 or higher) to get coloured output on MRI/Windows}
+ Term::ANSIColor.coloring = false
+ end
+end
+
+Term::ANSIColor.coloring = false if !STDOUT.tty? and not ENV.has_key?("AUTOTEST")
+
+module Cucumber
+ module Formatter
+ # Defines aliases for coloured output. You don't invoke any methods from this
+ # module directly, but you can change the output colours by defining
+ # a CUCUMBER_COLORS variable in your shell, very much like how you can
+ # tweak the familiar POSIX command ls with
+ # $LSCOLORS/$LS_COLORS
+ #
+ # The colours that you can change are:
+ #
+ # * undefined - defaults to yellow
+ # * pending - defaults to yellow
+ # * pending_param - defaults to yellow,bold
+ # * failed - defaults to red
+ # * failed_param - defaults to red,bold
+ # * passed - defaults to green
+ # * passed_param - defaults to green,bold
+ # * outline - defaults to cyan
+ # * outline_param - defaults to cyan,bold
+ # * skipped - defaults to cyan
+ # * skipped_param - defaults to cyan,bold
+ # * comment - defaults to grey
+ # * tag - defaults to cyan
+ #
+ # For instance, if your shell has a black background and a green font (like the
+ # "Homebrew" settings for OS X' Terminal.app), you may want to override passed
+ # steps to be white instead of green. Examples:
+ #
+ # export CUCUMBER_COLORS="passed=white"
+ # export CUCUMBER_COLORS="passed=white,bold:passed_param=white,bold,underline"
+ #
+ # (If you're on Windows, use SET instead of export).
+ # To see what colours and effects are available, just run this in your shell:
+ #
+ # ruby -e "require 'rubygems'; require 'term/ansicolor'; puts Term::ANSIColor.attributes"
+ #
+ # Although not listed, you can also use grey
+ module ANSIColor
+ include Term::ANSIColor
+
+ ALIASES = Hash.new do |h,k|
+ if k.to_s =~ /(.*)_param/
+ h[$1] + ',bold'
+ end
+ end.merge({
+ 'undefined' => 'yellow',
+ 'pending' => 'yellow',
+ 'failed' => 'red',
+ 'passed' => 'green',
+ 'outline' => 'cyan',
+ 'skipped' => 'cyan',
+ 'comment' => 'grey',
+ 'tag' => 'cyan'
+ })
+
+ if ENV['CUCUMBER_COLORS'] # Example: export CUCUMBER_COLORS="passed=red:failed=yellow"
+ ENV['CUCUMBER_COLORS'].split(':').each do |pair|
+ a = pair.split('=')
+ ALIASES[a[0]] = a[1]
+ end
+ end
+
+ ALIASES.each do |method, color|
+ unless method =~ /.*_param/
+ code = <<-EOF
+ def #{method}(string=nil, &proc)
+ #{ALIASES[method].split(",").join("(") + "(string, &proc" + ")" * ALIASES[method].split(",").length}
+ end
+ # This resets the colour to the non-param colour
+ def #{method}_param(string=nil, &proc)
+ #{ALIASES[method+'_param'].split(",").join("(") + "(string, &proc" + ")" * ALIASES[method+'_param'].split(",").length} + #{ALIASES[method].split(",").join(' + ')}
+ end
+ EOF
+ eval(code)
+ end
+ end
+
+ def self.define_grey #:nodoc:
+ begin
+ gem 'genki-ruby-terminfo'
+ require 'terminfo'
+ case TermInfo.default_object.tigetnum("colors")
+ when 0
+ raise "Your terminal doesn't support colours"
+ when 1
+ ::Term::ANSIColor.coloring = false
+ alias grey white
+ when 2..8
+ alias grey white
+ else
+ define_real_grey
+ end
+ rescue Exception => e
+ if e.class.name == 'TermInfo::TermInfoError'
+ STDERR.puts "*** WARNING ***"
+ STDERR.puts "You have the genki-ruby-terminfo gem installed, but you haven't set your TERM variable."
+ STDERR.puts "Try setting it to TERM=xterm-256color to get grey colour in output"
+ STDERR.puts "\n"
+ alias grey white
+ else
+ define_real_grey
+ end
+ end
+ end
+
+ def self.define_real_grey #:nodoc:
+ def grey(m) #:nodoc:
+ if ::Term::ANSIColor.coloring?
+ "\e[90m#{m}\e[0m"
+ else
+ m
+ end
+ end
+ end
+
+ define_grey
+
+ def cukes(n)
+ ("(::) " * n).strip
+ end
+
+ def green_cukes(n)
+ blink(green(cukes(n)))
+ end
+
+ def red_cukes(n)
+ blink(red(cukes(n)))
+ end
+
+ def yellow_cukes(n)
+ blink(yellow(cukes(n)))
+ end
+ end
+ end
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/formatter/color_io.rb b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/formatter/color_io.rb
new file mode 100755
index 00000000..56c2906e
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/formatter/color_io.rb
@@ -0,0 +1,23 @@
+require 'forwardable'
+
+module Cucumber
+ module Formatter
+ # Adapter to make #puts/#print/#flush work with colours on Windows
+ class ColorIO #:nodoc:
+ extend Forwardable
+ def_delegators :@kernel, :puts, :print # win32console colours only work when sent to Kernel
+ def_delegators :@stdout, :flush, :tty?, :write, :close
+
+ def initialize
+ @kernel = Kernel
+ @stdout = STDOUT
+ end
+
+ # Ensure using << still gets colours in win32console
+ def <<(output)
+ print(output)
+ self
+ end
+ end
+ end
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/formatter/console.rb b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/formatter/console.rb
new file mode 100755
index 00000000..86a60696
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/formatter/console.rb
@@ -0,0 +1,205 @@
+require 'cucumber/formatter/ansicolor'
+require 'cucumber/formatter/duration'
+require 'cucumber/formatter/summary'
+
+module Cucumber
+ module Formatter
+ # This module contains helper methods that are used by formatters
+ # that print output to the terminal.
+ module Console
+ extend ANSIColor
+ include Duration
+ include Summary
+
+ FORMATS = Hash.new{|hash, format| hash[format] = method(format).to_proc}
+
+ def format_step(keyword, step_match, status, source_indent)
+ comment = if source_indent
+ c = (' # ' + step_match.file_colon_line).indent(source_indent)
+ format_string(c, :comment)
+ else
+ ''
+ end
+
+ format = format_for(status, :param)
+ line = keyword + " " + step_match.format_args(format) + comment
+ format_string(line, status)
+ end
+
+ def format_string(string, status)
+ fmt = format_for(status)
+ if Proc === fmt
+ fmt.call(string)
+ else
+ fmt % string
+ end
+ end
+
+ def print_steps(status)
+ print_elements(step_mother.steps(status), status, 'steps')
+ end
+
+ def print_elements(elements, status, kind)
+ if elements.any?
+ @io.puts(format_string("(::) #{status} #{kind} (::)", status))
+ @io.puts
+ @io.flush
+ end
+
+ elements.each_with_index do |element, i|
+ if status == :failed
+ print_exception(element.exception, status, 0)
+ else
+ @io.puts(format_string(element.backtrace_line, status))
+ end
+ @io.puts
+ @io.flush
+ end
+ end
+
+ def print_counts
+ STDERR.puts("The #print_counts method is deprecated and will be removed in 0.4. Use #print_stats instead")
+ print_stats(nil)
+ end
+
+ def print_stats(features)
+
+ @failures = step_mother.scenarios(:failed).select { |s| s.is_a?(Cucumber::Ast::Scenario) }
+
+ if !@failures.empty?
+ @io.puts format_string("Failing Scenarios:", :failed)
+ @failures.each do |failure|
+ @io.puts format_string("cucumber " + failure.file_colon_line, :failed) +
+ format_string(" # Scenario: " + failure.name, :comment)
+ end
+ @io.puts
+ end
+
+ @io.puts scenario_summary(step_mother) {|status_count, status| format_string(status_count, status)}
+ @io.puts step_summary(step_mother) {|status_count, status| format_string(status_count, status)}
+
+ @io.puts(format_duration(features.duration)) if features && features.duration
+
+ @io.flush
+ end
+
+ def print_exception(e, status, indent)
+ @io.puts(format_string("#{e.message} (#{e.class})\n#{e.backtrace.join("\n")}".indent(indent), status))
+ end
+
+ def print_snippets(options)
+ return unless options[:snippets]
+ undefined = step_mother.steps(:undefined)
+ return if undefined.empty?
+
+ unknown_programming_language = step_mother.unknown_programming_language?
+ snippets = undefined.map do |step|
+ step_name = Undefined === step.exception ? step.exception.step_name : step.name
+ step_multiline_class = step.multiline_arg ? step.multiline_arg.class : nil
+ snippet = @step_mother.snippet_text(step.actual_keyword, step_name, step_multiline_class)
+ snippet
+ end.compact.uniq
+
+ text = "\nYou can implement step definitions for undefined steps with these snippets:\n\n"
+ text += snippets.join("\n\n")
+ @io.puts format_string(text, :undefined)
+
+ if unknown_programming_language
+ @io.puts format_string("\nIf you want snippets in a different programming language, just make sure a file\n" +
+ "with the appropriate file extension exists where cucumber looks for step definitions.", :failed)
+ end
+
+ @io.puts
+ @io.flush
+ end
+
+ def print_passing_wip(options)
+ return unless options[:wip]
+ passed = step_mother.scenarios(:passed)
+ if passed.any?
+ @io.puts format_string("\nThe --wip switch was used, so I didn't expect anything to pass. These scenarios passed:", :failed)
+ print_elements(passed, :passed, "scenarios")
+ else
+ @io.puts format_string("\nThe --wip switch was used, so the failures were expected. All is good.\n", :passed)
+ end
+ end
+
+ def print_tag_limit_warnings(options)
+ if @tag_occurrences
+ first_tag = true
+ options[:tag_names].each do |tag_list|
+ tag_list.each do |tag_name, limit|
+ unless Ast::Tags.exclude_tag?(tag_name)
+ tag_frequency = @tag_occurrences[tag_name].size
+ if limit && tag_frequency > limit
+ @io.puts if first_tag
+ first_tag = false
+ @io.puts format_string("#{tag_name} occurred #{tag_frequency} times, but the limit was set to #{limit}", :failed)
+ @tag_occurrences[tag_name].each {|location| @io.puts format_string(" #{location}", :failed)}
+ @io.flush
+ end
+ end
+ end
+ end
+ end
+ end
+
+ def record_tag_occurrences(feature_element, options)
+ @tag_occurrences ||= Hash.new{|k,v| k[v] = []}
+ options[:tag_names].each do |tag_list|
+ tag_list.each do |tag_name, limit|
+ if !Ast::Tags.exclude_tag?(tag_name) && feature_element.tag_count(tag_name) > 0
+ @tag_occurrences[tag_name] << feature_element.file_colon_line
+ end
+ end
+ end
+ end
+
+ def embed(file, mime_type)
+ # no-op
+ end
+
+ #define @delayed_announcements = [] in your Formatter if you want to
+ #activate this feature
+ def announce(announcement)
+ if @delayed_announcements
+ @delayed_announcements << announcement
+ else
+ @io.puts
+ @io.puts(format_string(announcement, :tag))
+ @io.flush
+ end
+ end
+
+ def print_announcements()
+ @delayed_announcements.each {|ann| print_announcement(ann)}
+ empty_announcements
+ end
+
+ def print_table_row_announcements
+ return if @delayed_announcements.empty?
+ @io.print(format_string(@delayed_announcements.join(', '), :tag).indent(2))
+ @io.flush
+ empty_announcements
+ end
+
+ def print_announcement(announcement)
+ @io.puts(format_string(announcement, :tag).indent(@indent))
+ @io.flush
+ end
+
+ def empty_announcements
+ @delayed_announcements = []
+ end
+
+ private
+
+ def format_for(*keys)
+ key = keys.join('_').to_sym
+ fmt = FORMATS[key]
+ raise "No format for #{key.inspect}: #{FORMATS.inspect}" if fmt.nil?
+ fmt
+ end
+ end
+ end
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/formatter/cucumber.css b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/formatter/cucumber.css
new file mode 100755
index 00000000..74ffe583
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/formatter/cucumber.css
@@ -0,0 +1,132 @@
+
+
+.cucumber {
+ font-family: "Lucida Grande", Helvetica, sans-serif;
+ font-size: 0.7em;
+ background: white;
+ padding: 1em;
+}
+.cucumber h1, .cucumber h2, .cucumber h3, .cucumber h4, .cucumber ol, .cucumber li, .cucumber pre, .cucumber p {
+ font-size: 1em;
+ padding: 0px;
+ margin: 0px;
+}
+.cucumber div.feature {
+ border: 1px solid;
+ padding: 2px;
+ margin: 4px;
+}
+.cucumber div.feature div.background, .cucumber div.feature div.scenario, .cucumber div.feature p {
+ padding: 0em 0em 0em 1em;
+}
+.cucumber div.feature div.background div.examples, .cucumber div.feature div.scenario div.examples, .cucumber div.feature p div.examples {
+ padding: 0em 0em 0em 1em;
+}
+.cucumber .stats {
+ margin: 2em;
+}
+.cucumber .summary ul.features li {
+ display: inline;
+}
+.cucumber .backtrace {
+ margin-top: 0;
+ margin-bottom: 0;
+ margin-left: 1em;
+}
+.cucumber a {
+ text-decoration: none;
+ color: inherit;
+}
+.cucumber a:hover {
+ text-decoration: underline;
+}
+.cucumber a:visited {
+ font-weight: normal;
+}
+.cucumber a div.examples {
+ border: 1px solid;
+ padding: 2px;
+ margin: 4px;
+}
+.cucumber table {
+ border-collapse: collapse;
+}
+.cucumber table td, .cucumber table th {
+ font-size: 0.7em;
+ border: 1px solid #AAAAAA;
+}
+.cucumber table td.failed {
+ background: #FFC0CB;
+ color: #8B0000;
+}
+.cucumber table td.passed {
+ background: #98FB98;
+ color: #001111;
+}
+.cucumber table td.skipped {
+ background: #e0ffff;
+ color: #001111;
+}
+.cucumber table td.pending {
+ background: #FFFFE0;
+ color: #111100;
+}
+.cucumber table td.undefined {
+ background: #FFFFE0;
+ color: #111100;
+}
+.cucumber ol {
+ list-style: none;
+}
+.cucumber ol li {
+ margin: 0em 0em 0em 1em;
+ padding: 0em 0em 0em 0.2em;
+}
+.cucumber ol li span.param {
+ font-weight: bold;
+}
+.cucumber ol li.failed {
+ border-left: 5px solid #ff0000;
+ border-bottom: 1px solid #ff0000;
+ background: #ffc0cb;
+ color: #8b0000;
+}
+.cucumber ol li.failed span.param {
+ background: !failed_dark;
+}
+.cucumber ol li.passed {
+ border-left: 5px solid #00ff00;
+ border-bottom: 1px solid #00ff00;
+ background: #98fb98;
+ color: #001111;
+}
+.cucumber ol li.passed span.param {
+ background: #00ff00;
+}
+.cucumber ol li.skipped {
+ border-left: 5px solid #00ffff;
+ border-bottom: 1px solid #00ffff;
+ background: #e0ffff;
+ color: #001111;
+}
+.cucumber ol li.skipped span.param {
+ background: #00ffff;
+}
+.cucumber ol li.pending {
+ border-left: 5px solid #ff8000;
+ border-bottom: 1px solid #ff8000;
+ background: #ffff00;
+ color: #2a1b0a;
+}
+.cucumber ol li.pending span.param {
+ background: #ff8000;
+}
+.cucumber ol li.undefined {
+ border-left: 5px solid #ff8000;
+ border-bottom: 1px solid #ff8000;
+ background: #ffff00;
+ color: #2a1b0a;
+}
+.cucumber ol li.undefined span.param {
+ background: #ff8000;
+}
diff --git a/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/formatter/cucumber.sass b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/formatter/cucumber.sass
new file mode 100755
index 00000000..ee5210fc
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/formatter/cucumber.sass
@@ -0,0 +1,139 @@
+# cucumber.css is generated from cucumber.sass
+# Regenerate with rake sass
+
+!step_left = 5px solid
+!step_bottom = 1px solid
+
+!failed = #FFC0CB
+!failed_dark = #FF0000
+!failed_text = #8B0000
+
+!passed = #98FB98
+!passed_dark = #00FF00
+!passed_text = #001111
+
+!skipped = #E0FFFF
+!skipped_dark = #00FFFF
+!skipped_text = #001111
+
+!pending = #FFFF00
+!pending_dark = #FF8000
+!pending_text = #2A1B0A
+
+!undefined = #FFFF00
+!undefined_dark = #FF8000
+!undefined_text = #2A1B0A
+
+.cucumber
+ :font-family "Lucida Grande", Helvetica, sans-serif
+ :font-size 0.7em
+ :background white
+ :padding 1em
+
+ h1, h2, h3, h4, ol, li, pre, p
+ :font-size 1em
+ :padding 0px
+ :margin 0px
+
+ div.feature
+ :border 1px solid
+ :padding 2px
+ :margin 4px
+
+ div.background, div.scenario, p
+ :padding 0em 0em 0em 1em
+ div.examples
+ :padding 0em 0em 0em 1em
+
+ .stats
+ :margin 2em
+
+ .summary
+ ul.features
+ li
+ :display inline
+
+ .backtrace
+ :margin-top 0
+ :margin-bottom 0
+ :margin-left 1em
+
+ a
+ :text-decoration none
+ :color inherit
+
+ &:hover
+ :text-decoration underline
+ &:visited
+ :font-weight normal
+
+ div.examples
+ :border 1px solid
+ :padding 2px
+ :margin 4px
+
+ table
+ :border-collapse collapse
+
+ td, th
+ :font-size 0.7em
+ :border 1px solid #AAAAAA
+ td.failed
+ :background #FFC0CB
+ :color #8B0000
+ td.passed
+ :background #98FB98
+ :color= !passed_text
+ td.skipped
+ :background= !skipped
+ :color= !skipped_text
+ td.pending
+ :background #FFFFE0
+ :color #111100
+ td.undefined
+ :background #FFFFE0
+ :color #111100
+
+ ol
+ :list-style none
+
+ li
+ :margin 0em 0em 0em 1em
+ :padding 0em 0em 0em 0.2em
+ span.param
+ :font-weight bold
+ li.failed
+ :border-left= !step_left !failed_dark
+ :border-bottom= !step_bottom !failed_dark
+ :background= !failed
+ :color= !failed_text
+ span.param
+ :background !failed_dark
+ li.passed
+ :border-left= !step_left !passed_dark
+ :border-bottom= !step_bottom !passed_dark
+ :background= !passed
+ :color= !passed_text
+ span.param
+ :background= !passed_dark
+ li.skipped
+ :border-left= !step_left !skipped_dark
+ :border-bottom= !step_bottom !skipped_dark
+ :background= !skipped
+ :color= !skipped_text
+ span.param
+ :background= !skipped_dark
+ li.pending
+ :border-left= !step_left !pending_dark
+ :border-bottom= !step_bottom !pending_dark
+ :background= !pending
+ :color= !pending_text
+ span.param
+ :background= !pending_dark
+ li.undefined
+ :border-left= !step_left !undefined_dark
+ :border-bottom= !step_bottom !undefined_dark
+ :background= !undefined
+ :color= !undefined_text
+ span.param
+ :background= !undefined_dark
diff --git a/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/formatter/debug.rb b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/formatter/debug.rb
new file mode 100755
index 00000000..58f733e1
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/formatter/debug.rb
@@ -0,0 +1,33 @@
+require 'cucumber/formatter/progress'
+require 'cucumber/step_definition_light'
+
+module Cucumber
+ module Formatter
+ class Debug
+ def initialize(step_mother, io, options)
+ @io = io
+ @indent = 0
+ end
+
+ def respond_to?(*args)
+ true
+ end
+
+ def method_missing(name, *args)
+ @indent -= 2 if name.to_s =~ /^after/
+ print(name)
+ @indent += 2 if name.to_s =~ /^before/
+ end
+
+ private
+
+ def print(text)
+ @io.puts "#{indent}#{text}"
+ end
+
+ def indent
+ (' ' * @indent)
+ end
+ end
+ end
+end
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/formatter/duration.rb b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/formatter/duration.rb
new file mode 100755
index 00000000..19724900
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/formatter/duration.rb
@@ -0,0 +1,13 @@
+module Cucumber
+ module Formatter
+ module Duration
+ # Helper method for formatters that need to
+ # format a duration in seconds to the UNIX
+ # time format.
+ def format_duration(seconds)
+ m, s = seconds.divmod(60)
+ "#{m}m#{'%.3f' % s}s"
+ end
+ end
+ end
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/formatter/html.rb b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/formatter/html.rb
new file mode 100755
index 00000000..e47d25d3
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/formatter/html.rb
@@ -0,0 +1,369 @@
+require 'cucumber/formatter/ordered_xml_markup'
+require 'cucumber/formatter/duration'
+require 'cucumber/formatter/summary'
+
+module Cucumber
+ module Formatter
+ # The formatter used for --format html
+ class Html
+ include ERB::Util # for the #h method
+ include Duration
+ include Summary
+
+ def initialize(step_mother, io, options)
+ @io = io
+ @options = options
+ @buffer = {}
+ @step_mother = step_mother
+ @current_builder = create_builder(@io)
+ end
+
+ def before_features(features)
+ start_buffering :features
+ end
+
+ def after_features(features)
+ stop_buffering :features
+ #
+ builder.declare!(
+ :DOCTYPE,
+ :html,
+ :PUBLIC,
+ '-//W3C//DTD XHTML 1.0 Strict//EN',
+ 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd'
+ )
+ builder.html(:xmlns => 'http://www.w3.org/1999/xhtml') do
+ builder.head do
+ builder.meta(:content => 'text/html;charset=utf-8')
+ builder.title 'Cucumber'
+ inline_css
+ end
+ builder.body do
+ builder.div(:class => 'cucumber') do
+ builder << buffer(:features)
+ builder.div(scenario_summary(@step_mother) {|status_count, _| status_count}, :class => 'summary')
+ builder.div(step_summary(@step_mother) {|status_count, _| status_count}, :class => 'summary')
+ builder.div(format_duration(features.duration), :class => 'duration')
+ end
+ end
+ end
+ end
+
+ def before_feature(feature)
+ start_buffering :feature
+ @exceptions = []
+ end
+
+ def after_feature(feature)
+ stop_buffering :feature
+ builder.div(:class => 'feature') do
+ builder << buffer(:feature)
+ end
+ end
+
+ def before_comment(comment)
+ start_buffering :comment
+ end
+
+ def after_comment(comment)
+ stop_buffering :comment
+ builder.pre(:class => 'comment') do
+ builder << buffer(:comment)
+ end
+ end
+
+ def comment_line(comment_line)
+ builder.text!(comment_line)
+ builder.br
+ end
+
+ def after_tags(tags)
+ @tag_spacer = nil
+ end
+
+ def tag_name(tag_name)
+ builder.text!(@tag_spacer) if @tag_spacer
+ @tag_spacer = ' '
+ builder.span(tag_name, :class => 'tag')
+ end
+
+ def feature_name(name)
+ lines = name.split(/\r?\n/)
+ return if lines.empty?
+ builder.h2 do |h2|
+ builder.span(lines[0], :class => 'val')
+ end
+ builder.p(:class => 'narrative') do
+ lines[1..-1].each do |line|
+ builder.text!(line.strip)
+ builder.br
+ end
+ end
+ end
+
+ def before_background(background)
+ @in_background = true
+ start_buffering :background
+ end
+
+ def after_background(background)
+ stop_buffering :background
+ @in_background = nil
+ builder.div(:class => 'background') do
+ builder << buffer(:background)
+ end
+ end
+
+ def background_name(keyword, name, file_colon_line, source_indent)
+ @listing_background = true
+ builder.h3 do |h3|
+ builder.span(keyword, :class => 'keyword')
+ builder.text!(' ')
+ builder.span(name, :class => 'val')
+ end
+ end
+
+ def before_feature_element(feature_element)
+ start_buffering :feature_element
+ end
+
+ def after_feature_element(feature_element)
+ stop_buffering :feature_element
+ css_class = {
+ Ast::Scenario => 'scenario',
+ Ast::ScenarioOutline => 'scenario outline'
+ }[feature_element.class]
+
+ builder.div(:class => css_class) do
+ builder << buffer(:feature_element)
+ end
+ @open_step_list = true
+ end
+
+ def scenario_name(keyword, name, file_colon_line, source_indent)
+ @listing_background = false
+ builder.h3 do
+ builder.span(keyword, :class => 'keyword')
+ builder.text!(' ')
+ builder.span(name, :class => 'val')
+ end
+ end
+
+ def before_outline_table(outline_table)
+ @outline_row = 0
+ start_buffering :outline_table
+ end
+
+ def after_outline_table(outline_table)
+ stop_buffering :outline_table
+ builder.table do
+ builder << buffer(:outline_table)
+ end
+ @outline_row = nil
+ end
+
+ def before_examples(examples)
+ start_buffering :examples
+ end
+
+ def after_examples(examples)
+ stop_buffering :examples
+ builder.div(:class => 'examples') do
+ builder << buffer(:examples)
+ end
+ end
+
+ def examples_name(keyword, name)
+ builder.h4 do
+ builder.span(keyword, :class => 'keyword')
+ builder.text!(' ')
+ builder.span(name, :class => 'val')
+ end
+ end
+
+ def before_steps(steps)
+ start_buffering :steps
+ end
+
+ def after_steps(steps)
+ stop_buffering :steps
+ builder.ol do
+ builder << buffer(:steps)
+ end
+ end
+
+ def before_step(step)
+ @step_id = step.dom_id
+ end
+
+ def before_step_result(keyword, step_match, multiline_arg, status, exception, source_indent, background)
+ start_buffering :step_result
+ @hide_this_step = false
+ if exception
+ if @exceptions.include?(exception)
+ @hide_this_step = true
+ return
+ end
+ @exceptions << exception
+ end
+ if status != :failed && @in_background ^ background
+ @hide_this_step = true
+ return
+ end
+ @status = status
+ end
+
+ def after_step_result(keyword, step_match, multiline_arg, status, exception, source_indent, background)
+ stop_buffering :step_result
+ return if @hide_this_step
+ builder.li(:id => @step_id, :class => "step #{status}") do
+ builder << buffer(:step_result)
+ end
+ end
+
+ def step_name(keyword, step_match, status, source_indent, background)
+ @step_matches ||= []
+ background_in_scenario = background && !@listing_background
+ @skip_step = @step_matches.index(step_match) || background_in_scenario
+ @step_matches << step_match
+
+ unless @skip_step
+ build_step(keyword, step_match, status)
+ end
+ end
+
+ def exception(exception, status)
+ return if @hide_this_step
+ builder.pre(format_exception(exception), :class => status)
+ end
+
+ def before_multiline_arg(multiline_arg)
+ start_buffering :multiline_arg
+ end
+
+ def after_multiline_arg(multiline_arg)
+ stop_buffering :multiline_arg
+ return if @hide_this_step || @skip_step
+ if Ast::Table === multiline_arg
+ builder.table do
+ builder << buffer(:multiline_arg)
+ end
+ else
+ builder << buffer(:multiline_arg)
+ end
+ end
+
+ def py_string(string)
+ return if @hide_this_step
+ builder.pre(:class => 'val') do |pre|
+ builder << string.gsub("\n", '
')
+ end
+ end
+
+ def before_table_row(table_row)
+ @row_id = table_row.dom_id
+ @col_index = 0
+ start_buffering :table_row
+ end
+
+ def after_table_row(table_row)
+ stop_buffering :table_row
+ return if @hide_this_step
+ builder.tr(:id => @row_id) do
+ builder << buffer(:table_row)
+ end
+ if table_row.exception
+ builder.tr do
+ builder.td(:colspan => @col_index.to_s, :class => 'failed') do
+ builder.pre do |pre|
+ pre << format_exception(table_row.exception)
+ end
+ end
+ end
+ end
+ @outline_row += 1 if @outline_row
+ end
+
+ def table_cell_value(value, status)
+ return if @hide_this_step
+
+ cell_type = @outline_row == 0 ? :th : :td
+ attributes = {:id => "#{@row_id}_#{@col_index}", :class => 'val'}
+ attributes[:class] += " #{status}" if status
+ build_cell(cell_type, value, attributes)
+ @col_index += 1
+ end
+
+ def announce(announcement)
+ builder.pre(announcement, :class => 'announcement')
+ end
+
+ def embed(file, mime_type)
+ case(mime_type)
+ when /^image\/(png|gif|jpg)/
+ embed_image(file)
+ end
+ end
+
+ private
+
+ def embed_image(file)
+ id = file.hash
+ builder.pre(:class => 'embed') do |pre|
+ pre << %{Screenshot
+ }
+ end
+ end
+
+ def build_step(keyword, step_match, status)
+ step_name = step_match.format_args(lambda{|param| %{#{param} }})
+ builder.div do |div|
+ builder.span(keyword, :class => 'keyword')
+ builder.text!(' ')
+ builder.span(:class => 'step val') do |name|
+ name << h(step_name).gsub(/<span class="(.*?)">/, '').gsub(/<\/span>/, ' ')
+ end
+ end
+ end
+
+ def build_cell(cell_type, value, attributes)
+ builder.__send__(cell_type, value, attributes)
+ end
+
+ def inline_css
+ builder.style(:type => 'text/css') do
+ builder.text!(File.read(File.dirname(__FILE__) + '/cucumber.css'))
+ end
+ end
+
+ def format_exception(exception)
+ h((["#{exception.message} (#{exception.class})"] + exception.backtrace).join("\n"))
+ end
+
+ def builder
+ @current_builder
+ end
+
+ def buffer(label)
+ result = @buffer[label]
+ @buffer[label] = ''
+ result
+ end
+
+ def start_buffering(label)
+ @buffer[label] ||= ''
+ @parent_builder ||= {}
+ @parent_builder[label] = @current_builder
+ @current_builder = create_builder(@buffer[label])
+ end
+
+ def stop_buffering(label)
+ @current_builder = @parent_builder[label]
+ end
+
+ def create_builder(io)
+ OrderedXmlMarkup.new(:target => io, :indent => 0)
+ end
+ end
+ end
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/formatter/junit.rb b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/formatter/junit.rb
new file mode 100755
index 00000000..e1fe389d
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/formatter/junit.rb
@@ -0,0 +1,140 @@
+require 'cucumber/formatter/ordered_xml_markup'
+
+module Cucumber
+ module Formatter
+ # The formatter used for --format junit
+ class Junit
+ class UnNamedFeatureError < StandardError
+ def initialize(feature_file)
+ super("The feature in '#{feature_file}' does not have a name. The JUnit XML format requires a name for the testsuite element.")
+ end
+ end
+
+ def initialize(step_mother, io, options)
+ raise "You *must* specify --out DIR for the junit formatter" unless String === io && File.directory?(io)
+ @reportdir = io
+ @options = options
+ end
+
+ def before_feature(feature)
+ @current_feature = feature
+ @failures = @errors = @tests = 0
+ @builder = OrderedXmlMarkup.new( :indent => 2 )
+ @time = 0
+ end
+
+ def after_feature(feature)
+ @testsuite = OrderedXmlMarkup.new( :indent => 2 )
+ @testsuite.instruct!
+ @testsuite.testsuite(
+ :failures => @failures,
+ :errors => @errors,
+ :tests => @tests,
+ :time => "%.6f" % @time,
+ :name => @feature_name ) do
+ @testsuite << @builder.target!
+ end
+
+ write_file(feature_result_filename(feature.file), @testsuite.target!)
+ end
+
+ def before_background(*args)
+ @in_background = true
+ end
+
+ def after_background(*args)
+ @in_background = false
+ end
+
+ def feature_name(name)
+ raise UnNamedFeatureError.new(@current_feature.file) if name.empty?
+ lines = name.split(/\r?\n/)
+ @feature_name = lines[0].sub(/Feature\:/, '').strip
+ end
+
+ def scenario_name(keyword, name, file_colon_line, source_indent)
+ scenario_name = name.strip.delete(".\r\n")
+ scenario_name = "Unnamed scenario" if name.blank?
+ @scenario = scenario_name
+ @outline = keyword.include?('Scenario Outline')
+ @output = "Scenario#{ " outline" if @outline}: #{@scenario}\n\n"
+ end
+
+ def before_steps(steps)
+ @steps_start = Time.now
+ end
+
+ def after_steps(steps)
+ return if @in_background || @outline
+
+ duration = Time.now - @steps_start
+ if steps.failed?
+ steps.each { |step| @output += "#{step.keyword} #{step.name}\n" }
+ @output += "\nMessage:\n"
+ end
+ build_testcase(duration, steps.status, steps.exception)
+ end
+
+ def before_examples(*args)
+ @header_row = true
+ end
+
+ def before_table_row(table_row)
+ return unless @outline
+
+ @table_start = Time.now
+ end
+
+ def after_table_row(table_row)
+ return unless @outline
+ duration = Time.now - @table_start
+ unless @header_row
+ name_suffix = " (outline example : #{table_row.name})"
+ if table_row.failed?
+ @output += "Example row: #{table_row.name}\n"
+ @output += "\nMessage:\n"
+ end
+ build_testcase(duration, table_row.status, table_row.exception, name_suffix)
+ end
+
+ @header_row = false if @header_row
+ end
+
+ private
+
+ def build_testcase(duration, status, exception = nil, suffix = "")
+ @time += duration
+ classname = "#{@feature_name}.#{@scenario}"
+ name = "#{@scenario}#{suffix}"
+ failed = (status == :failed || (status == :pending && @options[:strict]))
+ #puts "FAILED:!!#{failed}"
+ if status == :passed || failed
+ @builder.testcase(:classname => classname, :name => name, :time => "%.6f" % duration) do
+ if failed
+ @builder.failure(:message => "#{status.to_s} #{name}", :type => status.to_s) do
+ @builder.text! @output
+ @builder.text!(format_exception(exception)) if exception
+ end
+ @failures += 1
+ end
+ end
+ @tests += 1
+ end
+ end
+
+ def format_exception(exception)
+ (["#{exception.message} (#{exception.class})"] + exception.backtrace).join("\n")
+ end
+
+ def feature_result_filename(feature_file)
+ ext_length = File.extname(feature_file).length
+ basename = File.basename(feature_file)[0...-ext_length]
+ File.join(@reportdir, "TEST-#{basename}.xml")
+ end
+
+ def write_file(feature_filename, data)
+ File.open(feature_filename, 'w') { |file| file.write(data) }
+ end
+ end
+ end
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/formatter/ordered_xml_markup.rb b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/formatter/ordered_xml_markup.rb
new file mode 100755
index 00000000..873a2d48
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/formatter/ordered_xml_markup.rb
@@ -0,0 +1,24 @@
+begin
+ require 'builder'
+rescue LoadError
+ gem 'builder'
+ require 'builder'
+end
+
+module Cucumber
+ module Formatter
+ # Emits attributes ordered alphabetically, so that we can predicatbly test output.
+ class OrderedXmlMarkup < Builder::XmlMarkup #:nodoc:
+ def _insert_attributes(attrs, order=[])
+ return if attrs.nil?
+ keys = attrs.keys.map{|k| k.to_s}
+ keys.sort!
+ keys.reverse! if (attrs.keys - [:version, :encoding] == []) #HACK to ensure the 'version' attribute is first in xml declaration.
+ keys.each do |k|
+ v = attrs[k.to_sym] || attrs[k]
+ @target << %{ #{k}="#{_attr_value(v)}"} if v
+ end
+ end
+ end
+ end
+end
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/formatter/pdf.rb b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/formatter/pdf.rb
new file mode 100755
index 00000000..defecbd0
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/formatter/pdf.rb
@@ -0,0 +1,234 @@
+require 'cucumber/formatter/console'
+require 'fileutils'
+require 'prawn'
+require "prawn/layout"
+require "prawn/format"
+
+module Cucumber
+ module Formatter
+
+ BLACK = '000000'
+ GREY = '999999'
+
+ class Pdf
+ include FileUtils
+ include Console
+ attr_writer :indent
+
+ def initialize(step_mother, io, options)
+ @step_mother = step_mother
+ raise "You *must* specify --out FILE for the pdf formatter" unless File === io
+
+ if(options[:dry_run])
+ @status_colors = { :passed => BLACK, :skipped => BLACK, :undefined => BLACK, :failed => BLACK}
+ else
+ @status_colors = { :passed => '055902', :skipped => GREY, :undefined => 'F27405', :failed => '730202'}
+ end
+
+ @pdf = Prawn::Document.new
+ @scrap = Prawn::Document.new
+ @doc = @scrap
+ @io = io
+ @options = options
+ @exceptions = []
+ @indent = 0
+ @buffer = []
+ puts "writing to #{io.path}"
+ load_cover_page_image
+ @pdf.text "\n\n\nCucumber features", :align => :center, :size => 32
+ @pdf.text "Generated: #{Time.now.strftime("%Y-%m-%d %H:%M")}", :size => 10, :at => [0, 24]
+ @pdf.text "Command: cucumber #{ARGV.join(" ")}
", :size => 10, :at => [0,10]
+ unless options[:dry_run]
+ @pdf.bounding_box [450,100] , :width => 100 do
+ @pdf.text 'Legend', :size => 10
+ @status_colors.each do |k,v|
+ @pdf.fill_color v
+ @pdf.text k.to_s, :size => 10
+ @pdf.fill_color BLACK
+ end
+ end
+ end
+ end
+
+ def load_cover_page_image()
+ if (!load_image("features/support/logo.png"))
+ load_image("features/support/logo.jpg")
+ end
+ end
+
+ def load_image(image_path)
+ begin
+ @pdf.image open(image_path, "rb"), :position => :center, :width => 500
+ true
+ rescue Errno::ENOENT
+ false
+ end
+ end
+
+ def after_features(features)
+ @pdf.render_file(@io.path)
+ puts "\ndone"
+ end
+
+ def feature_name(name)
+ @pdf.start_new_page
+ name["Feature:"] = "" if name["Feature:"]
+ names = name.split("\n")
+ @pdf.fill_color GREY
+ @pdf.text('Feature', :align => :center)
+ @pdf.fill_color BLACK
+ names.each_with_index do |nameline, i|
+ case i
+ when 0
+ @pdf.text(nameline.strip, :size => 30, :align => :center )
+ @pdf.text("\n")
+ else
+ @pdf.text(nameline.strip, :size => 12)
+ end
+ end
+ @pdf.move_down(30)
+ end
+
+ def before_feature_element(feature_element)
+ record_tag_occurrences(feature_element, @options)
+ end
+
+ def after_feature_element(feature_element)
+ flush
+ end
+
+ def after_feature(feature)
+ flush
+ end
+
+ def feature_element_name(keyword, name)
+ names = name.empty? ? [name] : name.split("\n")
+ print "."
+ STDOUT.flush
+
+ keep_with do
+ @doc.move_down(20)
+ @doc.fill_color GREY
+ @doc.text("#{keyword}", :size => 8)
+ @doc.fill_color BLACK
+ @doc.text("#{names[0]}", :size => 16)
+ names[1..-1].each { |s| @doc.text(s, :size => 12) }
+ @doc.text("\n")
+ end
+ end
+
+ def step_result(keyword, step_match, multiline_arg, status, exception, source_indent, background)
+ @hide_this_step = false
+ if exception
+ if @exceptions.include?(exception)
+ @hide_this_step = true
+ return
+ end
+ @exceptions << exception
+ end
+ if status != :failed && @in_background ^ background
+ @hide_this_step = true
+ return
+ end
+ end
+
+ def step_name(keyword, step_match, status, source_indent, background)
+ return if @hide_this_step
+ line = "#{keyword} #{step_match.format_args("%s").gsub('<', '<').gsub('>', '>')}"
+ colorize(line, status)
+ end
+
+ def before_background(background)
+ @in_background = true
+ end
+
+ def after_background(background)
+ @in_background = nil
+ end
+
+ def before_multiline_arg(table)
+ return if @hide_this_step
+ if(table.kind_of? Cucumber::Ast::Table)
+ keep_with do
+ @doc.table(table.rows << table.headers , :position => :center, :row_colors => ['ffffff', 'f0f0f0'])
+ end
+ end
+ end
+
+ #using row_color hack to highlight each row correctly
+ def before_outline_table(table)
+ return if @hide_this_step
+ row_colors = table.example_rows.map { |r| @status_colors[r.status] unless r.status == :skipped}
+ keep_with do
+ @doc.table(table.rows, :headers => table.headers, :position => :center, :row_colors => row_colors)
+ end
+ end
+
+ def before_py_string(string)
+ return if @hide_this_step
+ s = %{"""\n#{string}\n"""}.indent(10)
+ s = s.split("\n").map{|l| l =~ /^\s+$/ ? '' : l}
+ s.each do |line|
+ line.gsub!('<', '<')
+ line.gsub!('>', '>')
+ keep_with { @doc.text line, :size => 8 }
+ end
+ end
+
+ def tag_name(tag_name)
+ return if @hide_this_step
+ tag = format_string(tag_name, :tag).indent(@indent)
+ # TODO should we render tags at all? skipped for now. difficult to place due to page breaks
+ end
+
+ def background_name(keyword, name, file_colon_line, source_indent)
+ feature_element_name(keyword, name)
+ end
+
+ def examples_name(keyword, name)
+ feature_element_name(keyword, name)
+ end
+
+ def scenario_name(keyword, name, file_colon_line, source_indent)
+ feature_element_name(keyword, name)
+ end
+
+ private
+
+ def colorize(text, status)
+ keep_with do
+ @doc.fill_color(@status_colors[status] || BLACK)
+ @doc.text(text)
+ @doc.fill_color(BLACK)
+ end
+ end
+
+ def keep_with(&block)
+ @buffer << block
+ end
+
+ def render(doc)
+ @doc = doc
+ @buffer.each do |proc|
+ proc.call
+ end
+ end
+
+ # This method does a 'test' rendering on a blank page, to see the rendered height of the buffer
+ # if that too high for the space left on the age in the real document, we do a page break.
+ # This obviously doesn't work if a scenario is longer than a whole page (God forbid)
+ def flush
+ @scrap.start_new_page
+ oldy = @scrap.y
+ render @scrap
+ height = (oldy - @scrap.y) + 36 # whops magic number
+ if ((@pdf.y - height) < @pdf.bounds.bottom)
+ @pdf.start_new_page
+ end
+ render @pdf
+ @pdf.move_down(20)
+ @buffer = []
+ end
+ end
+ end
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/formatter/pretty.rb b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/formatter/pretty.rb
new file mode 100755
index 00000000..bc94fc2b
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/formatter/pretty.rb
@@ -0,0 +1,239 @@
+require 'cucumber/formatter/console'
+require 'fileutils'
+
+module Cucumber
+ module Formatter
+ # The formatter used for --format pretty (the default formatter).
+ #
+ # This formatter prints features to plain text - exactly how they were parsed,
+ # just prettier. That means with proper indentation and alignment of table columns.
+ #
+ # If the output is STDOUT (and not a file), there are bright colours to watch too.
+ #
+ class Pretty
+ include FileUtils
+ include Console
+ attr_writer :indent
+ attr_reader :step_mother
+
+ def initialize(step_mother, io, options)
+ @step_mother, @io, @options = step_mother, io, options
+ @exceptions = []
+ @indent = 0
+ @prefixes = options[:prefixes] || {}
+ @delayed_announcements = []
+ end
+
+ def after_features(features)
+ print_summary(features) unless @options[:autoformat]
+ end
+
+ def before_feature(feature)
+ @exceptions = []
+ @indent = 0
+ if @options[:autoformat]
+ file = File.join(@options[:autoformat], feature.file)
+ dir = File.dirname(file)
+ mkdir_p(dir) unless File.directory?(dir)
+ @io = File.open(file, Cucumber.file_mode('w'))
+ end
+ end
+
+ def after_feature(*args)
+ @io.close if @options[:autoformat]
+ end
+
+ def comment_line(comment_line)
+ @io.puts(comment_line.indent(@indent))
+ @io.flush
+ end
+
+ def after_tags(tags)
+ if @indent == 1
+ @io.puts
+ @io.flush
+ end
+ end
+
+ def tag_name(tag_name)
+ tag = format_string(tag_name, :tag).indent(@indent)
+ @io.print(tag)
+ @io.flush
+ @indent = 1
+ end
+
+ def feature_name(name)
+ @io.puts(name)
+ @io.puts
+ @io.flush
+ end
+
+ def before_feature_element(feature_element)
+ record_tag_occurrences(feature_element, @options)
+ @indent = 2
+ @scenario_indent = 2
+ end
+
+ def after_feature_element(feature_element)
+ @io.puts
+ @io.flush
+ end
+
+ def before_background(background)
+ @indent = 2
+ @scenario_indent = 2
+ @in_background = true
+ end
+
+ def after_background(background)
+ @in_background = nil
+ @io.puts
+ @io.flush
+ end
+
+ def background_name(keyword, name, file_colon_line, source_indent)
+ print_feature_element_name(keyword, name, file_colon_line, source_indent)
+ end
+
+ def before_examples_array(examples_array)
+ @indent = 4
+ @io.puts
+ @visiting_first_example_name = true
+ end
+
+ def examples_name(keyword, name)
+ puts unless @visiting_first_example_name
+ @visiting_first_example_name = false
+ names = name.strip.empty? ? [name.strip] : name.split("\n")
+ @io.puts(" #{keyword} #{names[0]}")
+ names[1..-1].each {|s| @io.puts " #{s}" } unless names.empty?
+ @io.flush
+ @indent = 6
+ @scenario_indent = 6
+ end
+
+ def before_outline_table(outline_table)
+ @table = outline_table
+ end
+
+ def after_outline_table(outline_table)
+ @table = nil
+ @indent = 4
+ end
+
+ def scenario_name(keyword, name, file_colon_line, source_indent)
+ print_feature_element_name keyword, name, file_colon_line, source_indent
+ end
+
+ def before_step(step)
+ @current_step = step
+ @indent = 6
+ end
+
+ def before_step_result(keyword, step_match, multiline_arg, status, exception, source_indent, background)
+ @hide_this_step = false
+ if exception
+ if @exceptions.include?(exception)
+ @hide_this_step = true
+ return
+ end
+ @exceptions << exception
+ end
+ if status != :failed && @in_background ^ background
+ @hide_this_step = true
+ return
+ end
+ @status = status
+ end
+
+ def step_name(keyword, step_match, status, source_indent, background)
+ return if @hide_this_step
+ source_indent = nil unless @options[:source]
+ name_to_report = format_step(keyword, step_match, status, source_indent)
+ @io.puts(name_to_report.indent(@scenario_indent + 2))
+ print_announcements
+ end
+
+ def py_string(string)
+ return if @hide_this_step
+ s = %{"""\n#{string}\n"""}.indent(@indent)
+ s = s.split("\n").map{|l| l =~ /^\s+$/ ? '' : l}.join("\n")
+ @io.puts(format_string(s, @current_step.status))
+ @io.flush
+ end
+
+ def exception(exception, status)
+ return if @hide_this_step
+ print_exception(exception, status, @indent)
+ @io.flush
+ end
+
+ def before_multiline_arg(multiline_arg)
+ return if @options[:no_multiline] || @hide_this_step
+ @table = multiline_arg
+ end
+
+ def after_multiline_arg(multiline_arg)
+ @table = nil
+ end
+
+ def before_table_row(table_row)
+ return if !@table || @hide_this_step
+ @col_index = 0
+ @io.print ' |'.indent(@indent-2)
+ end
+
+ def after_table_row(table_row)
+ return if !@table || @hide_this_step
+ print_table_row_announcements
+ @io.puts
+ if table_row.exception && !@exceptions.include?(table_row.exception)
+ print_exception(table_row.exception, :failed, @indent)
+ end
+ end
+
+ def after_table_cell(cell)
+ return unless @table
+ @col_index += 1
+ end
+
+ def table_cell_value(value, status)
+ return if !@table || @hide_this_step
+ status ||= @status || :passed
+ width = @table.col_width(@col_index)
+ cell_text = value.to_s || ''
+ padded = cell_text + (' ' * (width - cell_text.jlength))
+ prefix = cell_prefix(status)
+ @io.print(' ' + format_string("#{prefix}#{padded}", status) + ::Term::ANSIColor.reset(" |"))
+ @io.flush
+ end
+
+ private
+
+ def print_feature_element_name(keyword, name, file_colon_line, source_indent)
+ @io.puts if @scenario_indent == 6
+ names = name.empty? ? [name] : name.split("\n")
+ line = "#{keyword} #{names[0]}".indent(@scenario_indent)
+ @io.print(line)
+ if @options[:source]
+ line_comment = " # #{file_colon_line}".indent(source_indent)
+ @io.print(format_string(line_comment, :comment))
+ end
+ @io.puts
+ names[1..-1].each {|s| @io.puts " #{s}"}
+ @io.flush
+ end
+
+ def cell_prefix(status)
+ @prefixes[status]
+ end
+
+ def print_summary(features)
+ print_stats(features)
+ print_snippets(@options)
+ print_passing_wip(@options)
+ print_tag_limit_warnings(@options)
+ end
+ end
+ end
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/formatter/progress.rb b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/formatter/progress.rb
new file mode 100755
index 00000000..db7fdf09
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/formatter/progress.rb
@@ -0,0 +1,73 @@
+require 'cucumber/formatter/console'
+
+module Cucumber
+ module Formatter
+ # The formatter used for --format progress
+ class Progress
+ include Console
+ attr_reader :step_mother
+
+ def initialize(step_mother, io, options)
+ @step_mother, @io, @options = step_mother, io, options
+ end
+
+ def after_features(features)
+ @io.puts
+ @io.puts
+ print_summary(features)
+ end
+
+ def before_feature_element(feature_element)
+ record_tag_occurrences(feature_element, @options)
+ end
+
+ def after_step_result(keyword, step_match, multiline_arg, status, exception, source_indent, background)
+ progress(status)
+ @status = status
+ end
+
+ def before_outline_table(outline_table)
+ @outline_table = outline_table
+ end
+
+ def after_outline_table(outline_table)
+ @outline_table = nil
+ end
+
+ def table_cell_value(value, status)
+ return unless @outline_table
+ status ||= @status
+ progress(status) unless table_header_cell?(status)
+ end
+
+ private
+
+ def print_summary(features)
+ print_steps(:pending)
+ print_steps(:failed)
+ print_stats(features)
+ print_snippets(@options)
+ print_passing_wip(@options)
+ print_tag_limit_warnings(@options)
+ end
+
+ CHARS = {
+ :passed => '.',
+ :failed => 'F',
+ :undefined => 'U',
+ :pending => 'P',
+ :skipped => '-'
+ }
+
+ def progress(status)
+ char = CHARS[status]
+ @io.print(format_string(char, status))
+ @io.flush
+ end
+
+ def table_header_cell?(status)
+ status == :skipped_param
+ end
+ end
+ end
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/formatter/rerun.rb b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/formatter/rerun.rb
new file mode 100755
index 00000000..9a8be6ca
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/formatter/rerun.rb
@@ -0,0 +1,48 @@
+module Cucumber
+ module Formatter
+ # The formatter used for --format rerun
+ #
+ # This formatter keeps track of all failing features and print out their location.
+ # Example:
+ #
+ # features/foo.feature:34 features/bar.feature:11:76:81
+ #
+ # This formatter is used by AutoTest - it will use the output to decide what
+ # to run the next time, simply passing the output string on the command line.
+ #
+ class Rerun
+ def initialize(step_mother, io, options)
+ @io = io
+ @options = options
+ @file_names = []
+ @file_colon_lines = Hash.new{|h,k| h[k] = []}
+ end
+
+ # features() is never executed at all... ?
+ def after_features(features)
+ files = @file_names.uniq.map do |file|
+ lines = @file_colon_lines[file]
+ "#{file}:#{lines.join(':')}"
+ end
+ @io.puts files.join(' ')
+
+ # Flusing output to rerun tempfile here...
+ @io.flush
+ @io.close
+ end
+
+ # feature_element() is never executed at all, either... ?
+ def after_feature_element(feature_element)
+ if feature_element.failed?
+ file, line = *feature_element.file_colon_line.split(':')
+ @file_colon_lines[file] << line
+ @file_names << file
+ end
+ end
+
+ def step_name(keyword, step_match, status, source_indent, background)
+ @rerun = true if [:failed].index(status)
+ end
+ end
+ end
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/formatter/stepdefs.rb b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/formatter/stepdefs.rb
new file mode 100755
index 00000000..d60db22c
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/formatter/stepdefs.rb
@@ -0,0 +1,14 @@
+require 'cucumber/formatter/usage'
+
+module Cucumber
+ module Formatter
+ class Stepdefs < Usage
+ def print_steps(stepdef_key)
+ end
+
+ def max_step_length
+ 0
+ end
+ end
+ end
+end
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/formatter/steps.rb b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/formatter/steps.rb
new file mode 100755
index 00000000..cf721fd7
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/formatter/steps.rb
@@ -0,0 +1,49 @@
+module Cucumber
+ module Formatter
+ # The formatter used for --format steps
+ class Steps
+
+ def initialize(step_mother, io, options)
+ @io = io
+ @options = options
+ @step_definition_files = collect_steps(step_mother)
+ end
+
+ def after_features(features)
+ print_summary
+ end
+
+ private
+
+ def print_summary
+ count = 0
+ @step_definition_files.keys.sort.each do |step_definition_file|
+ @io.puts step_definition_file
+
+ sources = @step_definition_files[step_definition_file]
+ source_indent = source_indent(sources)
+ sources.sort.each do |file_colon_line, regexp_source|
+ @io.print regexp_source.indent(2)
+ @io.print " # #{file_colon_line}".indent(source_indent - regexp_source.jlength)
+ @io.puts
+ end
+ @io.puts
+ count += sources.size
+ end
+ @io.puts "#{count} step definition(s) in #{@step_definition_files.size} source file(s)."
+ end
+
+ def collect_steps(step_mother)
+ step_mother.step_definitions.inject({}) do |step_definitions, step_definition|
+ step_definitions[step_definition.file] ||= []
+ step_definitions[step_definition.file] << [ step_definition.file_colon_line, step_definition.regexp_source ]
+ step_definitions
+ end
+ end
+
+ def source_indent(sources)
+ sources.map { |file_colon_line, regexp| regexp.size }.max + 1
+ end
+ end
+ end
+end
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/formatter/summary.rb b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/formatter/summary.rb
new file mode 100755
index 00000000..3dd44e5a
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/formatter/summary.rb
@@ -0,0 +1,35 @@
+module Cucumber
+ module Formatter
+ module Summary
+
+ def scenario_summary(step_mother, &block)
+ scenarios_proc = lambda{|status| step_mother.scenarios(status)}
+ dump_count(step_mother.scenarios.length, "scenario") + dump_status_counts(scenarios_proc, &block)
+ end
+
+ def step_summary(step_mother, &block)
+ steps_proc = lambda{|status| step_mother.steps(status)}
+ dump_count(step_mother.steps.length, "step") + dump_status_counts(steps_proc, &block)
+ end
+
+ private
+
+ def dump_status_counts(find_elements_proc)
+ counts = [:failed, :skipped, :undefined, :pending, :passed].map do |status|
+ elements = find_elements_proc.call(status)
+ elements.any? ? yield("#{elements.length} #{status.to_s}", status) : nil
+ end.compact
+ if counts.any?
+ " (#{counts.join(', ')})"
+ else
+ ""
+ end
+ end
+
+ def dump_count(count, what, state=nil)
+ [count, state, "#{what}#{count == 1 ? '' : 's'}"].compact.join(" ")
+ end
+
+ end
+ end
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/formatter/tag_cloud.rb b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/formatter/tag_cloud.rb
new file mode 100755
index 00000000..e277cf38
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/formatter/tag_cloud.rb
@@ -0,0 +1,30 @@
+module Cucumber
+ module Formatter
+ # The formatter used for --format tag_cloud
+ # Custom formatter that prints a tag cloud as a table.
+ class TagCloud
+ def initialize(step_mother, io, options)
+ @io = io
+ @options = options
+ @counts = Hash.new{|h,k| h[k] = 0}
+ end
+
+ def after_features(features)
+ print_summary(features)
+ end
+
+ def tag_name(tag_name)
+ @counts[tag_name] += 1
+ end
+
+ private
+
+ def print_summary(features)
+ matrix = @counts.to_a.sort{|paira, pairb| paira[0] <=> pairb[0]}.transpose
+ table = Cucumber::Ast::Table.new(matrix)
+ formatter = Cucumber::Formatter::Pretty.new(@step_mother, @io, {})
+ Cucumber::Ast::TreeWalker.new(@step_mother, [formatter], {}).visit_multiline_arg(table)
+ end
+ end
+ end
+end
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/formatter/unicode.rb b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/formatter/unicode.rb
new file mode 100755
index 00000000..f286406b
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/formatter/unicode.rb
@@ -0,0 +1,35 @@
+# Require this file if you need Unicode support.
+require 'cucumber/platform'
+require 'cucumber/formatter/ansicolor'
+
+$KCODE='u' unless Cucumber::RUBY_1_9
+
+if Cucumber::WINDOWS_MRI && `chcp` =~ /(\d+)/
+ codepage = $1.to_i
+ codepages = (1251..1252)
+
+ if codepages.include?(codepage)
+ Cucumber::CODEPAGE = "cp#{codepage}"
+
+ require 'iconv'
+ module Kernel #:nodoc:
+ alias cucumber_print print
+ def print(*a)
+ begin
+ cucumber_print(*Iconv.iconv(Cucumber::CODEPAGE, "UTF-8", *a))
+ rescue Iconv::IllegalSequence
+ cucumber_print(*a)
+ end
+ end
+
+ alias cucumber_puts puts
+ def puts(*a)
+ begin
+ cucumber_puts(*Iconv.iconv(Cucumber::CODEPAGE, "UTF-8", *a))
+ rescue Iconv::IllegalSequence
+ cucumber_puts(*a)
+ end
+ end
+ end
+ end
+end
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/formatter/usage.rb b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/formatter/usage.rb
new file mode 100755
index 00000000..e3a16a92
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/formatter/usage.rb
@@ -0,0 +1,127 @@
+require 'cucumber/formatter/progress'
+require 'cucumber/step_definition_light'
+
+module Cucumber
+ module Formatter
+ class Usage < Progress
+ include Console
+
+ class StepDefKey < StepDefinitionLight
+ attr_accessor :mean_duration, :status
+ end
+
+ def initialize(step_mother, io, options)
+ @step_mother = step_mother
+ @io = io
+ @options = options
+ @stepdef_to_match = Hash.new{|h,stepdef_key| h[stepdef_key] = []}
+ end
+
+ def before_step(step)
+ @step = step
+ @start_time = Time.now
+ end
+
+ def before_step_result(*args)
+ @duration = Time.now - @start_time
+ end
+
+ def after_step_result(keyword, step_match, multiline_arg, status, exception, source_indent, background)
+ if step_match.name.nil? # nil if it's from a scenario outline
+ stepdef_key = StepDefKey.new(step_match.step_definition.regexp_source, step_match.step_definition.file_colon_line)
+
+ @stepdef_to_match[stepdef_key] << {
+ :keyword => keyword,
+ :step_match => step_match,
+ :status => status,
+ :file_colon_line => @step.file_colon_line,
+ :duration => @duration
+ }
+ end
+ super
+ end
+
+ def print_summary(features)
+ add_unused_stepdefs
+ aggregate_info
+
+ if @options[:dry_run]
+ keys = @stepdef_to_match.keys.sort {|a,b| a.regexp_source <=> b.regexp_source}
+ else
+ keys = @stepdef_to_match.keys.sort {|a,b| a.mean_duration <=> b.mean_duration}.reverse
+ end
+
+ keys.each do |stepdef_key|
+ print_step_definition(stepdef_key)
+
+ if @stepdef_to_match[stepdef_key].any?
+ print_steps(stepdef_key)
+ else
+ @io.puts(" " + format_string("NOT MATCHED BY ANY STEPS", :failed))
+ end
+ end
+ @io.puts
+ super
+ end
+
+ def print_step_definition(stepdef_key)
+ @io.print format_string(sprintf("%.7f", stepdef_key.mean_duration), :skipped) + " " unless @options[:dry_run]
+ @io.print format_string(stepdef_key.regexp_source, stepdef_key.status)
+ if @options[:source]
+ indent = max_length - stepdef_key.regexp_source.jlength
+ line_comment = " # #{stepdef_key.file_colon_line}".indent(indent)
+ @io.print(format_string(line_comment, :comment))
+ end
+ @io.puts
+ end
+
+ def print_steps(stepdef_key)
+ @stepdef_to_match[stepdef_key].each do |step|
+ @io.print " "
+ @io.print format_string(sprintf("%.7f", step[:duration]), :skipped) + " " unless @options[:dry_run]
+ @io.print format_step(step[:keyword], step[:step_match], step[:status], nil)
+ if @options[:source]
+ indent = max_length - (step[:keyword].jlength + step[:step_match].format_args.jlength)
+ line_comment = " # #{step[:file_colon_line]}".indent(indent)
+ @io.print(format_string(line_comment, :comment))
+ end
+ @io.puts
+ end
+ end
+
+ def max_length
+ [max_stepdef_length, max_step_length].compact.max
+ end
+
+ def max_stepdef_length
+ @stepdef_to_match.keys.flatten.map{|key| key.regexp_source.jlength}.max
+ end
+
+ def max_step_length
+ @stepdef_to_match.values.flatten.map do |step|
+ step[:keyword].jlength + step[:step_match].format_args.jlength
+ end.max
+ end
+
+ def aggregate_info
+ @stepdef_to_match.each do |key, steps|
+ if steps.empty?
+ key.status = :skipped
+ key.mean_duration = 0
+ else
+ key.status = Ast::StepInvocation.worst_status(steps.map{|step| step[:status]})
+ total_duration = steps.inject(0) {|sum, step| step[:duration] + sum}
+ key.mean_duration = total_duration / steps.length
+ end
+ end
+ end
+
+ def add_unused_stepdefs
+ @step_mother.unmatched_step_definitions.each do |step_definition|
+ stepdef_key = StepDefKey.new(step_definition.regexp_source, step_definition.file_colon_line)
+ @stepdef_to_match[stepdef_key] = []
+ end
+ end
+ end
+ end
+end
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/language_support.rb b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/language_support.rb
new file mode 100755
index 00000000..5a42e6de
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/language_support.rb
@@ -0,0 +1,30 @@
+module Cucumber
+ # This module defines the API for programming panguage support in Cucumber.
+ # While Cucumber itself is written in Ruby, any programming language can
+ # be supported by implementing this API.
+ #
+ # For the sake of illustration we'll consider an imaginary language called
+ # _why. _why files have the .why extension, so we need to put support for
+ # this language in the Cucumber::WhySupport::WhyLanguage . This
+ # class must be defined in a file called cucumber/why_support/why_language.rb
+ # and be available on Ruby's $LOAD_PATH :
+ #
+ # module Cucumber
+ # module WhySupport
+ # class WhyLanguage
+ #
+ # # Uses whatever available language bridge to load
+ # # +why_file+ and returns an Array of StepDefinition.
+ # def load_code_file(why_file)
+ # end
+ # end
+ # end
+ # end
+ #
+ # Each language implementation manages its own hooks, and must execute them
+ # at appropriate times.
+ #
+ #
+ module LanguageSupport
+ end
+end
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/language_support/language_methods.rb b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/language_support/language_methods.rb
new file mode 100755
index 00000000..9854d47d
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/language_support/language_methods.rb
@@ -0,0 +1,110 @@
+require 'cucumber/step_match'
+require 'cucumber/step_definition_light'
+
+module Cucumber
+ module LanguageSupport
+ module LanguageMethods
+ def create_step_match(step_definition, step_name, name_to_report, step_arguments)
+ StepMatch.new(step_definition, step_name, name_to_report, step_arguments)
+ end
+
+ def before(scenario)
+ begin_scenario(scenario)
+ execute_before(scenario)
+ end
+
+ def after(scenario)
+ execute_after(scenario)
+ end_scenario
+ end
+
+ def after_configuration(configuration)
+ hooks[:after_configuration].each do |hook|
+ hook.invoke('AfterConfiguration', configuration)
+ end
+ end
+
+ def execute_after_step(scenario)
+ hooks_for(:after_step, scenario).each do |hook|
+ invoke(hook, 'AfterStep', scenario, false)
+ end
+ end
+
+ def execute_transforms(args)
+ args.map do |arg|
+ matching_transform = transforms.detect {|transform| transform.match(arg) }
+ matching_transform ? matching_transform.invoke(arg) : arg
+ end
+ end
+
+ def add_hook(phase, hook)
+ hook.tag_name_lists = hook.tag_names.map {|tag_string| Ast::Tags.parse_tags(tag_string)}
+ hooks[phase.to_sym] << hook
+ hook
+ end
+
+ def add_transform(transform)
+ transforms.unshift transform
+ transform
+ end
+
+ def hooks_for(phase, scenario) #:nodoc:
+ hooks[phase.to_sym].select{|hook| scenario.accept_hook?(hook)}
+ end
+
+ def unmatched_step_definitions
+ available_step_definition_hash.keys - invoked_step_definition_hash.keys
+ end
+
+ def available_step_definition(regexp_source, file_colon_line)
+ available_step_definition_hash[StepDefinitionLight.new(regexp_source, file_colon_line)] = nil
+ end
+
+ def invoked_step_definition(regexp_source, file_colon_line)
+ invoked_step_definition_hash[StepDefinitionLight.new(regexp_source, file_colon_line)] = nil
+ end
+
+ private
+
+ def available_step_definition_hash
+ @available_step_definition_hash ||= {}
+ end
+
+ def invoked_step_definition_hash
+ @invoked_step_definition_hash ||= {}
+ end
+
+ def hooks
+ @hooks ||= Hash.new{|h,k| h[k] = []}
+ end
+
+ def transforms
+ @transforms ||= []
+ end
+
+ def execute_before(scenario)
+ hooks_for(:before, scenario).each do |hook|
+ invoke(hook, 'Before', scenario, true)
+ end
+ end
+
+ def execute_after(scenario)
+ hooks_for(:after, scenario).reverse_each do |hook|
+ invoke(hook, 'After', scenario, true)
+ end
+ end
+
+ def invoke(hook, location, scenario, exception_fails_scenario)
+ begin
+ hook.invoke(location, scenario)
+ rescue Exception => exception
+ if exception_fails_scenario
+ scenario.fail!(exception)
+ else
+ raise
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/languages.yml b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/languages.yml
new file mode 100755
index 00000000..467fc941
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/languages.yml
@@ -0,0 +1,611 @@
+# encoding: UTF-8
+# We use the codes here (prefer 2 letters when possible)
+# http://en.wikipedia.org/wiki/List_of_ISO_639-2_codes
+#
+# If you want several aliases for a keyword, just separate them
+# with a | character. Make sure there are no ambiguities in the
+# keywords.
+#
+"en":
+ name: English
+ native: English
+ encoding: UTF-8
+ feature: Feature
+ background: Background
+ scenario: Scenario
+ scenario_outline: Scenario Outline
+ examples: Examples|Scenarios
+ given: Given
+ when: When
+ then: Then
+ and: And
+ but: But
+ space_after_keyword: true
+
+# Please help us keeping the languages below uptodate. The parsers for a language
+# that is missing a keyword will expect the English word until the missing word(s)
+# are added.
+#
+# Please keep the grammars in alphabetical order by name from here and down.
+
+"ar":
+ name: Arabic
+ native: العربية
+ encoding: UTF-8
+ feature: خاصية
+ background: الخلÙية
+ scenario: سيناريو
+ scenario_outline: سيناريو مخطط
+ examples: امثلة
+ given: بÙرض
+ when: متى|عندما
+ then: اذاً|ثم
+ and: Ùˆ
+ but: لكن
+ space_after_keyword: true
+"bg":
+ name: Bulgarian
+ native: българÑки
+ encoding: UTF-8
+ feature: ФункционалноÑÑ‚
+ background: ПредиÑториÑ
+ scenario: Сценарий
+ scenario_outline: Рамка на Ñценарий
+ examples: Примери
+ given: Дадено
+ when: Когато
+ then: То
+ and: И
+ but: Ðо
+ space_after_keyword: true
+"cat":
+ name: Catalan
+ native: catalÃ
+ encoding: UTF-8
+ background: Rerefons|Antecedents
+ feature: CaracterÃstica
+ scenario: Escenari
+ scenario_outline: Esquema de l\'escenari
+ examples: Exemples
+ given: Donat|Donada
+ when: Quan
+ then: Aleshores
+ and: I
+ but: Però
+ space_after_keyword: true
+"cy":
+ name: Welsh
+ native: Cymraeg
+ encoding: UTF-8
+ feature: Arwedd
+ scenario: Scenario
+ examples: Enghreifftiau
+ given: anrhegedig a
+ when: Pryd
+ then: Yna
+ and: A
+ but: Ond
+ space_after_keyword: true
+"cs":
+ name: Czech
+ native: ÄŒesky
+ encoding: UTF-8
+ feature: Požadavek
+ background: PozadÃ|Kontext
+ scenario: Scénář
+ scenario_outline: NáÄrt Scénáře|Osnova scénáře
+ examples: PÅ™Ãklady
+ given: Pokud
+ when: Když
+ then: Pak
+ and: A|A také
+ but: Ale
+ space_after_keyword: true
+"da":
+ name: Danish
+ native: dansk
+ encoding: UTF-8
+ feature: Egenskab
+ background: Baggrund
+ scenario: Scenarie
+ scenario_outline: Abstrakt Scenario
+ examples: Eksempler
+ given: Givet
+ when: NÃ¥r
+ then: SÃ¥
+ and: Og
+ but: Men
+ space_after_keyword: true
+"de":
+ name: German
+ native: Deutsch
+ encoding: UTF-8
+ feature: Funktionalität
+ background: Grundlage
+ scenario: Szenario
+ scenario_outline: Szenariogrundriss
+ examples: Beispiele
+ given: Gegeben sei
+ when: Wenn
+ then: Dann
+ and: Und
+ but: Aber
+ space_after_keyword: true
+"en-au":
+ name: Australian
+ native: Australian
+ encoding: UTF-8
+ feature: Crikey
+ background: Background
+ scenario: Mate
+ scenario_outline: Blokes
+ examples: Cobber
+ given: Ya know how
+ when: When
+ then: Ya gotta
+ and: N
+ but: Cept
+ space_after_keyword: true
+"en-lol":
+ name: LOLCAT
+ native: LOLCAT
+ encoding: UTF-8
+ feature: OH HAI
+ background: B4
+ scenario: MISHUN
+ scenario_outline: MISHUN SRSLY
+ examples: EXAMPLZ
+ given: I CAN HAZ
+ when: WEN
+ then: DEN
+ and: AN
+ but: BUT
+ space_after_keyword: true
+"en-tx":
+ name: Texan
+ native: Texan
+ encoding: UTF-8
+ feature: Feature
+ background: Background
+ scenario: Scenario
+ scenario_outline: All y\'all
+ examples: Examples
+ given: Given y\'all
+ when: When y\'all
+ then: Then y\'all
+ and: And y\'all
+ but: But y\'all
+ space_after_keyword: true
+"es":
+ name: Spanish
+ native: español
+ encoding: UTF-8
+ background: Antecedentes
+ feature: CaracterÃstica
+ scenario: Escenario
+ scenario_outline: Esquema del escenario
+ examples: Ejemplos
+ given: Dado
+ when: Cuando
+ then: Entonces
+ and: Y
+ but: Pero
+ space_after_keyword: true
+"et":
+ name: Estonian
+ native: eesti keel
+ encoding: UTF-8
+ feature: Omadus
+ background: Taust
+ scenario: Stsenaarium
+ scenario_outline: Raamstsenaarium
+ examples: Juhtumid
+ given: Eeldades
+ when: Kui
+ then: Siis
+ and: Ja
+ but: Kuid
+ space_after_keyword: true
+"fi":
+ name: Finnish
+ native: suomi
+ encoding: UTF-8
+ feature: Ominaisuus
+ background: Tausta
+ scenario: Tapaus
+ scenario_outline: Tapausaihio
+ examples: Tapaukset
+ given: Oletetaan
+ when: Kun
+ then: Niin
+ and: Ja
+ but: Mutta
+ space_after_keyword: true
+"fr":
+ name: French
+ native: français
+ encoding: UTF-8
+ feature: Fonctionnalité
+ background: Contexte
+ scenario: Scénario
+ scenario_outline: Plan du Scénario
+ examples: Exemples
+ given: Soit
+ when: Lorsque
+ then: Alors
+ and: Et
+ but: Mais
+ space_after_keyword: true
+"he":
+ name: Hebrew
+ native: עברית
+ encoding: UTF-8
+ feature: ×ª×›×•× ×”
+ background: רקע
+ scenario: תרחיש
+ scenario_outline: ×ª×‘× ×™×ª תרחיש
+ examples: דוגמ×ות
+ given: ×‘×”×™× ×ª×Ÿ
+ when: ×›×שר
+ then: ××–|××–×™
+ and: וג×
+ but: ×בל
+ space_after_keyword: true
+"hr":
+ name: Croatian
+ native: hrvatski
+ encoding: UTF-8
+ feature: Osobina|Mogućnost|Mogucnost
+ background: Pozadina
+ scenario: Scenarij
+ scenario_outline: Skica|Koncept
+ examples: Primjeri|Scenariji
+ given: Zadan|Zadani|Zadano
+ when: Kada|Kad
+ then: Onda
+ and: I
+ but: Ali
+ space_after_keyword: true
+"hu":
+ name: Hungarian
+ native: magyar
+ encoding: UTF-8
+ feature: Jellemző
+ background: Háttér
+ scenario: Forgatókönyv
+ scenario_outline: Forgatókönyv vázlat
+ examples: Példák
+ given: Ha
+ when: Majd
+ then: Akkor
+ and: És
+ but: De
+ space_after_keyword: true
+"id":
+ name: Indonesian
+ native: Bahasa Indonesia
+ encoding: UTF-8
+ feature: Fitur
+ background: Dasar
+ scenario: Skenario
+ scenario_outline: Skenario konsep
+ examples: Contoh
+ given: Dengan
+ when: Ketika
+ then: Maka
+ and: Dan
+ but: Tapi
+ space_after_keyword: true
+"it":
+ name: Italian
+ native: italiano
+ encoding: UTF-8
+ feature: FunzionalitÃ
+ background: Contesto
+ scenario: Scenario
+ scenario_outline: Schema dello scenario
+ examples: Esempi
+ given: Dato
+ when: Quando
+ then: Allora
+ and: E
+ but: Ma
+ space_after_keyword: true
+"ja":
+ name: Japanese
+ native: 日本語
+ encoding: UTF-8
+ feature: フィーãƒãƒ£|機能
+ background: 背景
+ scenario: シナリオ
+ scenario_outline: シナリオアウトライン|シナリオテンプレート|テンプレ|シナリオテンプレ
+ examples: 例|サンプル
+ given: å‰æ
+ when: ã‚‚ã—
+ then: ãªã‚‰ã°
+ and: ã‹ã¤
+ but: ã—ã‹ã—|但ã—|ãŸã ã—
+ space_after_keyword: false
+"ko":
+ name: Korean
+ native: í•œêµì–´
+ encoding: UTF-8
+ background: ë°°ê²½
+ feature: 기능
+ scenario: 시나리오
+ scenario_outline: 시나리오 개요
+ examples: 예
+ given: ì¡°ê±´
+ when: 만ì¼
+ then: 그러면
+ and: 그리ê³
+ but: 하지만
+ space_after_keyword: false
+"lt":
+ name: Lithuanian
+ native: lietuvių kalba
+ encoding: UTF-8
+ feature: SavybÄ—
+ background: Kontekstas
+ scenario: Scenarijus
+ scenario_outline: Scenarijaus Å¡ablonas
+ examples: Pavyzdžiai|Scenarijai|Variantai
+ given: Duota
+ when: Kai
+ then: Tada
+ and: Ir
+ but: Bet
+ space_after_keyword: true
+"lv":
+ name: Latvian
+ native: latviešu
+ encoding: UTF-8
+ feature: FunkcionalitÄte|FÄ«Äa
+ background: Konteksts|SituÄcija
+ scenario: ScenÄrijs
+ scenario_outline: ScenÄrijs pÄ“c parauga
+ examples: Piemēri|Paraugs
+ given: Kad
+ when: Ja
+ then: Tad
+ and: Un
+ but: Bet
+ space_after_keyword: true
+"nl":
+ name: Dutch
+ native: Nederlands
+ encoding: UTF-8
+ feature: Functionaliteit
+ background: Achtergrond
+ scenario: Scenario
+ scenario_outline: Abstract Scenario
+ examples: Voorbeelden
+ given: Gegeven
+ when: Als
+ then: Dan
+ and: En
+ but: Maar
+ space_after_keyword: true
+"no":
+ name: Norwegian
+ native: norsk
+ encoding: UTF-8
+ feature: Egenskap
+ background: Bakgrunn
+ scenario: Scenario
+ scenario_outline: Abstrakt Scenario
+ examples: Eksempler
+ given: Gitt
+ when: NÃ¥r
+ then: SÃ¥
+ and: Og
+ but: Men
+ space_after_keyword: true
+"pl":
+ name: Polish
+ native: polski
+ encoding: UTF-8
+ feature: Właściwość
+ background: Założenia
+ scenario: Scenariusz
+ scenario_outline: Szablon scenariusza
+ examples: Przykłady
+ given: Zakładając
+ when: Jeżeli
+ then: Wtedy
+ and: Oraz
+ but: Ale
+ space_after_keyword: true
+"pt":
+ name: Portuguese
+ native: português
+ encoding: UTF-8
+ background: Contexto
+ feature: Funcionalidade
+ scenario: Cenário|Cenario
+ scenario_outline: Esquema do Cenário|Esquema do Cenario
+ examples: Exemplos
+ given: Dado
+ when: Quando
+ then: Então|Entao
+ and: E
+ but: Mas
+ space_after_keyword: true
+"ro":
+ name: Romanian
+ native: română
+ encoding: UTF-8
+ background: Conditii
+ feature: Functionalitate
+ scenario: Scenariu
+ scenario_outline: Scenariul de sablon
+ examples: Exemplele
+ given: Daca
+ when: Cand
+ then: Atunci
+ and: Si
+ but: Dar
+ space_after_keyword: true
+"ro2":
+ name: Romanian (diacritical)
+ native: română (diacritical)
+ encoding: UTF-8
+ background: Condiţii
+ feature: Funcționalitate
+ scenario: Scenariu
+ scenario_outline: Scenariul de ÅŸablon
+ examples: Exemplele
+ given: Dacă
+ when: Când
+ then: Atunci
+ and: Și
+ but: Dar
+ space_after_keyword: true
+"ru":
+ name: Russian
+ native: руÑÑкий
+ encoding: UTF-8
+ feature: Функционал
+ background: ПредыÑториÑ
+ scenario: Сценарий
+ scenario_outline: Структура ÑценариÑ
+ examples: ЗначениÑ
+ given: ДопуÑтим
+ when: ЕÑли
+ then: То
+ and: И|К тому же
+ but: Ðо|Ð
+ space_after_keyword: true
+"se":
+ name: Swedish
+ native: Svenska
+ encoding: UTF-8
+ feature: Egenskap
+ background: Bakgrund
+ scenario: Scenario
+ scenario_outline: Abstrakt Scenario
+ examples: Exempel
+ given: Givet
+ when: När
+ then: SÃ¥
+ and: Och
+ but: Men
+ space_after_keyword: true
+"sk":
+ name: Slovak
+ native: Slovensky
+ encoding: UTF-8
+ feature: Požiadavka
+ background: Pozadie
+ scenario: Scenár
+ scenario_outline: NáÄrt Scenáru
+ examples: PrÃklady
+ given: Pokiaľ
+ when: KeÄ
+ then: Tak
+ and: A
+ but: Ale
+ space_after_keyword: true
+"sr-Latn":
+ name: Serbian_latin
+ native: Srpski_latinica
+ encoding: UTF-8
+ feature: Funkcionalnost|Mogućnost|Mogucnost|Osobina
+ background: Kontekst|Osnova|Pozadina
+ scenario: Scenario|Primer
+ scenario_outline: Struktura scenarija|Skica|Koncept
+ examples: Primeri|Scenariji
+ given: Zadato|Zadate|Zatati
+ when: Kada|Kad
+ then: Onda
+ and: I
+ but: Ali
+ space_after_keyword: true
+"sr":
+ name: Serbian
+ native: СрпÑки
+ encoding: UTF-8
+ feature: ФункционалноÑÑ‚|МогућноÑÑ‚|ОÑобина
+ background: КонтекÑÑ‚|ОÑнова|Позадина
+ scenario: Сценарио|Пример
+ scenario_outline: Структура Ñценарија|Скица|Концепт
+ examples: Примери|Сценарији
+ given: Задато|Задате|Задати
+ when: Када|Кад
+ then: Онда
+ and: И
+ but: Ðли
+ space_after_keyword: true
+"tr":
+ name: Turkish
+ native: Türkçe
+ encoding: UTF-8
+ feature: Özellik
+ background: Geçmiş
+ scenario: Senaryo
+ scenario_outline: Senaryo taslağı
+ examples: Örnekler
+ given: Diyelim ki
+ when: EÄŸer ki
+ then: O zaman
+ and: Ve
+ but: Fakat|Ama
+"uz":
+ name: Uzbek
+ native: Узбекча
+ encoding: UTF-8
+ feature: Функционал
+ background: Тарих
+ scenario: Сценарий
+ scenario_outline: Сценарий ÑтруктураÑи
+ examples: МиÑоллар
+ given: Ðгар
+ when: Ðгар
+ then: Унда
+ and: Ва
+ but: Лекин|Бирок|Ðммо
+"vi":
+ name: Vietnamese
+ native: Tiếng Việt
+ encoding: UTF-8
+ feature: TÃnh năng
+ background: Bối cảnh
+ scenario: Tình huống|Kịch bản
+ scenario_outline: Khung tình huống|Khung kịch bản
+ examples: Dữ liệu
+ given: Biết|Cho
+ when: Khi
+ then: Thì
+ and: VÃ
+ but: NhÆ°ng
+ space_after_keyword: true
+"zh-CN":
+ name: Chinese simplified
+ native: 简体ä¸æ–‡
+ encoding: UTF-8
+ feature: 功能
+ background: 背景
+ scenario: 场景
+ scenario_outline: 场景大纲
+ examples: 例å
+ given: å‡å¦‚
+ when: 当
+ then: 那么
+ and: 而且
+ but: 但是
+ space_after_keyword: false
+"zh-TW":
+ name: Chinese traditional
+ native: ç¹é«”ä¸æ–‡
+ encoding: UTF-8
+ feature: 功能
+ background: 背景
+ scenario: å ´æ™¯|劇本
+ scenario_outline: å ´æ™¯å¤§ç¶±|劇本大綱
+ examples: 例å
+ given: å‡è¨
+ when: 當
+ then: 那麼
+ and: 而且|並且
+ but: 但是
+ space_after_keyword: false
diff --git a/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/parser.rb b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/parser.rb
new file mode 100755
index 00000000..d8945443
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/parser.rb
@@ -0,0 +1,8 @@
+require 'erb'
+require 'cucumber/platform'
+require 'cucumber/ast'
+require 'cucumber/parser/treetop_ext'
+require 'cucumber/parser/common'
+require 'cucumber/parser/table'
+require 'cucumber/parser/py_string'
+require 'cucumber/parser/feature'
diff --git a/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/parser/common.rb b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/parser/common.rb
new file mode 100755
index 00000000..a0b1e17a
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/parser/common.rb
@@ -0,0 +1,170 @@
+# Autogenerated from a Treetop grammar. Edits may be lost.
+
+
+module Cucumber
+ module Parser
+ module Common
+ include Treetop::Runtime
+
+ def root
+ @root || :white
+ end
+
+ def _nt_white
+ start_index = index
+ if node_cache[:white].has_key?(index)
+ cached = node_cache[:white][index]
+ @index = cached.interval.end if cached
+ return cached
+ end
+
+ s0, i0 = [], index
+ loop do
+ i1 = index
+ r2 = _nt_space
+ if r2
+ r1 = r2
+ else
+ r3 = _nt_eol
+ if r3
+ r1 = r3
+ else
+ @index = i1
+ r1 = nil
+ end
+ end
+ if r1
+ s0 << r1
+ else
+ break
+ end
+ end
+ r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
+
+ node_cache[:white][start_index] = r0
+
+ r0
+ end
+
+ def _nt_space
+ start_index = index
+ if node_cache[:space].has_key?(index)
+ cached = node_cache[:space][index]
+ @index = cached.interval.end if cached
+ return cached
+ end
+
+ if has_terminal?('\G[ \\t]', true, index)
+ r0 = instantiate_node(SyntaxNode,input, index...(index + 1))
+ @index += 1
+ else
+ r0 = nil
+ end
+
+ node_cache[:space][start_index] = r0
+
+ r0
+ end
+
+ module Eol0
+ end
+
+ def _nt_eol
+ start_index = index
+ if node_cache[:eol].has_key?(index)
+ cached = node_cache[:eol][index]
+ @index = cached.interval.end if cached
+ return cached
+ end
+
+ i0 = index
+ if has_terminal?("\n", false, index)
+ r1 = instantiate_node(SyntaxNode,input, index...(index + 1))
+ @index += 1
+ else
+ terminal_parse_failure("\n")
+ r1 = nil
+ end
+ if r1
+ r0 = r1
+ else
+ i2, s2 = index, []
+ if has_terminal?("\r", false, index)
+ r3 = instantiate_node(SyntaxNode,input, index...(index + 1))
+ @index += 1
+ else
+ terminal_parse_failure("\r")
+ r3 = nil
+ end
+ s2 << r3
+ if r3
+ if has_terminal?("\n", false, index)
+ r5 = instantiate_node(SyntaxNode,input, index...(index + 1))
+ @index += 1
+ else
+ terminal_parse_failure("\n")
+ r5 = nil
+ end
+ if r5
+ r4 = r5
+ else
+ r4 = instantiate_node(SyntaxNode,input, index...index)
+ end
+ s2 << r4
+ end
+ if s2.last
+ r2 = instantiate_node(SyntaxNode,input, i2...index, s2)
+ r2.extend(Eol0)
+ else
+ @index = i2
+ r2 = nil
+ end
+ if r2
+ r0 = r2
+ else
+ @index = i0
+ r0 = nil
+ end
+ end
+
+ node_cache[:eol][start_index] = r0
+
+ r0
+ end
+
+ def _nt_eof
+ start_index = index
+ if node_cache[:eof].has_key?(index)
+ cached = node_cache[:eof][index]
+ @index = cached.interval.end if cached
+ return cached
+ end
+
+ i0 = index
+ if index < input_length
+ r1 = instantiate_node(SyntaxNode,input, index...(index + 1))
+ @index += 1
+ else
+ terminal_parse_failure("any character")
+ r1 = nil
+ end
+ if r1
+ r0 = nil
+ else
+ @index = i0
+ r0 = instantiate_node(SyntaxNode,input, index...index)
+ end
+
+ node_cache[:eof][start_index] = r0
+
+ r0
+ end
+
+ end
+
+ class CommonParser < Treetop::Runtime::CompiledParser
+ include Common
+ end
+
+ end
+end
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/parser/common.tt b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/parser/common.tt
new file mode 100755
index 00000000..9d546c8b
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/parser/common.tt
@@ -0,0 +1,21 @@
+module Cucumber
+ module Parser
+ grammar Common
+ rule white
+ (space / eol)*
+ end
+
+ rule space
+ [ \t]
+ end
+
+ rule eol
+ "\n" / ("\r" "\n"?)
+ end
+
+ rule eof
+ !.
+ end
+ end
+ end
+end
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/parser/feature.rb b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/parser/feature.rb
new file mode 100755
index 00000000..c215200a
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/parser/feature.rb
@@ -0,0 +1,1517 @@
+# Autogenerated from a Treetop grammar. Edits may be lost.
+
+
+module Cucumber
+ module Parser
+ # TIP: When you hack on the grammar, just delete feature.rb in this directory.
+ # Also make sure you have uninstalled all cucumber gems (don't forget xxx-cucumber
+ # github gems).
+ #
+ # Treetop will then generate the parser in-memory. When you're happy, just generate
+ # the rb file with tt feature.tt
+ module Feature
+ include Treetop::Runtime
+
+ def root
+ @root || :feature_sub
+ end
+
+ module FeatureSub0
+ end
+
+ module FeatureSub1
+ def white1
+ elements[0]
+ end
+
+ def comment
+ elements[1]
+ end
+
+ def white2
+ elements[2]
+ end
+
+ def tags
+ elements[3]
+ end
+
+ def white3
+ elements[4]
+ end
+
+ def header
+ elements[5]
+ end
+
+ def bg
+ elements[6]
+ end
+
+ def feature_elements
+ elements[7]
+ end
+
+ end
+
+ module FeatureSub2
+ def build(filter)
+ if(filter.nil? || feature_elements.accept?(filter) || (!bg.empty? && filter.accept?(bg)))
+ background = bg.respond_to?(:build) ? bg.build : nil
+ Ast::Feature.new(
+ background,
+ comment.build,
+ tags.build,
+ header.text_value,
+ feature_elements.build(background, filter)
+ )
+ end
+ end
+ end
+
+ def _nt_feature_sub
+ start_index = index
+ if node_cache[:feature_sub].has_key?(index)
+ cached = node_cache[:feature_sub][index]
+ @index = cached.interval.end if cached
+ return cached
+ end
+
+ i0, s0 = index, []
+ r1 = _nt_white
+ s0 << r1
+ if r1
+ r2 = _nt_comment
+ s0 << r2
+ if r2
+ r3 = _nt_white
+ s0 << r3
+ if r3
+ r4 = _nt_tags
+ s0 << r4
+ if r4
+ r5 = _nt_white
+ s0 << r5
+ if r5
+ s6, i6 = [], index
+ loop do
+ i7, s7 = index, []
+ i8 = index
+ i9 = index
+ r10 = _nt_scenario_outline
+ if r10
+ r9 = r10
+ else
+ r11 = _nt_scenario
+ if r11
+ r9 = r11
+ else
+ r12 = _nt_background
+ if r12
+ r9 = r12
+ else
+ @index = i9
+ r9 = nil
+ end
+ end
+ end
+ if r9
+ r8 = nil
+ else
+ @index = i8
+ r8 = instantiate_node(SyntaxNode,input, index...index)
+ end
+ s7 << r8
+ if r8
+ if index < input_length
+ r13 = instantiate_node(SyntaxNode,input, index...(index + 1))
+ @index += 1
+ else
+ terminal_parse_failure("any character")
+ r13 = nil
+ end
+ s7 << r13
+ end
+ if s7.last
+ r7 = instantiate_node(SyntaxNode,input, i7...index, s7)
+ r7.extend(FeatureSub0)
+ else
+ @index = i7
+ r7 = nil
+ end
+ if r7
+ s6 << r7
+ else
+ break
+ end
+ end
+ r6 = instantiate_node(SyntaxNode,input, i6...index, s6)
+ s0 << r6
+ if r6
+ r15 = _nt_background
+ if r15
+ r14 = r15
+ else
+ r14 = instantiate_node(SyntaxNode,input, index...index)
+ end
+ s0 << r14
+ if r14
+ r16 = _nt_feature_elements
+ s0 << r16
+ if r16
+ r18 = _nt_comment
+ if r18
+ r17 = r18
+ else
+ r17 = instantiate_node(SyntaxNode,input, index...index)
+ end
+ s0 << r17
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ if s0.last
+ r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
+ r0.extend(FeatureSub1)
+ r0.extend(FeatureSub2)
+ else
+ @index = i0
+ r0 = nil
+ end
+
+ node_cache[:feature_sub][start_index] = r0
+
+ r0
+ end
+
+ module Tags0
+ def tag
+ elements[0]
+ end
+
+ end
+
+ module Tags1
+ def white
+ elements[0]
+ end
+
+ def ts
+ elements[1]
+ end
+ end
+
+ module Tags2
+ def at_line?(line)
+ ts.elements.detect{|e| e.tag.line == line}
+ end
+
+ def build
+ Ast::Tags.new(ts.line, tag_names)
+ end
+
+ def tag_names
+ @tag_names ||= ts.elements.map{|e| e.tag.text_value}
+ end
+ end
+
+ def _nt_tags
+ start_index = index
+ if node_cache[:tags].has_key?(index)
+ cached = node_cache[:tags][index]
+ @index = cached.interval.end if cached
+ return cached
+ end
+
+ i0, s0 = index, []
+ r1 = _nt_white
+ s0 << r1
+ if r1
+ s2, i2 = [], index
+ loop do
+ i3, s3 = index, []
+ r4 = _nt_tag
+ s3 << r4
+ if r4
+ s5, i5 = [], index
+ loop do
+ i6 = index
+ r7 = _nt_space
+ if r7
+ r6 = r7
+ else
+ r8 = _nt_eol
+ if r8
+ r6 = r8
+ else
+ @index = i6
+ r6 = nil
+ end
+ end
+ if r6
+ s5 << r6
+ else
+ break
+ end
+ end
+ if s5.empty?
+ @index = i5
+ r5 = nil
+ else
+ r5 = instantiate_node(SyntaxNode,input, i5...index, s5)
+ end
+ s3 << r5
+ end
+ if s3.last
+ r3 = instantiate_node(SyntaxNode,input, i3...index, s3)
+ r3.extend(Tags0)
+ else
+ @index = i3
+ r3 = nil
+ end
+ if r3
+ s2 << r3
+ else
+ break
+ end
+ end
+ r2 = instantiate_node(SyntaxNode,input, i2...index, s2)
+ s0 << r2
+ end
+ if s0.last
+ r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
+ r0.extend(Tags1)
+ r0.extend(Tags2)
+ else
+ @index = i0
+ r0 = nil
+ end
+
+ node_cache[:tags][start_index] = r0
+
+ r0
+ end
+
+ module Tag0
+ end
+
+ def _nt_tag
+ start_index = index
+ if node_cache[:tag].has_key?(index)
+ cached = node_cache[:tag][index]
+ @index = cached.interval.end if cached
+ return cached
+ end
+
+ i0, s0 = index, []
+ if has_terminal?('@', false, index)
+ r1 = instantiate_node(SyntaxNode,input, index...(index + 1))
+ @index += 1
+ else
+ terminal_parse_failure('@')
+ r1 = nil
+ end
+ s0 << r1
+ if r1
+ s2, i2 = [], index
+ loop do
+ if has_terminal?('\G[^@\\r\\n\\t ]', true, index)
+ r3 = true
+ @index += 1
+ else
+ r3 = nil
+ end
+ if r3
+ s2 << r3
+ else
+ break
+ end
+ end
+ if s2.empty?
+ @index = i2
+ r2 = nil
+ else
+ r2 = instantiate_node(SyntaxNode,input, i2...index, s2)
+ end
+ s0 << r2
+ end
+ if s0.last
+ r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
+ r0.extend(Tag0)
+ else
+ @index = i0
+ r0 = nil
+ end
+
+ node_cache[:tag][start_index] = r0
+
+ r0
+ end
+
+ module Comment0
+ def comment_line
+ elements[0]
+ end
+
+ def white
+ elements[1]
+ end
+ end
+
+ module Comment1
+ def build
+ Ast::Comment.new(text_value)
+ end
+ end
+
+ def _nt_comment
+ start_index = index
+ if node_cache[:comment].has_key?(index)
+ cached = node_cache[:comment][index]
+ @index = cached.interval.end if cached
+ return cached
+ end
+
+ s0, i0 = [], index
+ loop do
+ i1, s1 = index, []
+ r2 = _nt_comment_line
+ s1 << r2
+ if r2
+ r3 = _nt_white
+ s1 << r3
+ end
+ if s1.last
+ r1 = instantiate_node(SyntaxNode,input, i1...index, s1)
+ r1.extend(Comment0)
+ else
+ @index = i1
+ r1 = nil
+ end
+ if r1
+ s0 << r1
+ else
+ break
+ end
+ end
+ r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
+ r0.extend(Comment1)
+
+ node_cache[:comment][start_index] = r0
+
+ r0
+ end
+
+ module CommentLine0
+ def line_to_eol
+ elements[2]
+ end
+ end
+
+ def _nt_comment_line
+ start_index = index
+ if node_cache[:comment_line].has_key?(index)
+ cached = node_cache[:comment_line][index]
+ @index = cached.interval.end if cached
+ return cached
+ end
+
+ i0, s0 = index, []
+ s1, i1 = [], index
+ loop do
+ r2 = _nt_space
+ if r2
+ s1 << r2
+ else
+ break
+ end
+ end
+ r1 = instantiate_node(SyntaxNode,input, i1...index, s1)
+ s0 << r1
+ if r1
+ if has_terminal?('#', false, index)
+ r3 = instantiate_node(SyntaxNode,input, index...(index + 1))
+ @index += 1
+ else
+ terminal_parse_failure('#')
+ r3 = nil
+ end
+ s0 << r3
+ if r3
+ r4 = _nt_line_to_eol
+ s0 << r4
+ end
+ end
+ if s0.last
+ r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
+ r0.extend(CommentLine0)
+ else
+ @index = i0
+ r0 = nil
+ end
+
+ node_cache[:comment_line][start_index] = r0
+
+ r0
+ end
+
+ module Background0
+ def comment
+ elements[0]
+ end
+
+ def white
+ elements[1]
+ end
+
+ def background_keyword
+ elements[2]
+ end
+
+ def name
+ elements[4]
+ end
+
+ def steps
+ elements[6]
+ end
+ end
+
+ module Background1
+ def matches_name?(regexp_to_match)
+ name.build =~ regexp_to_match
+ end
+
+ def at_line?(line)
+ background_keyword.line == line ||
+ steps.at_line?(line)
+ end
+
+ def matches_tags?(tag_name_lists)
+ Ast::Tags.matches?(self.parent.tags.tag_names, tag_name_lists)
+ end
+
+ def build
+ Ast::Background.new(
+ comment.build,
+ background_keyword.line,
+ background_keyword.text_value,
+ name.build,
+ steps.build
+ )
+ end
+ end
+
+ def _nt_background
+ start_index = index
+ if node_cache[:background].has_key?(index)
+ cached = node_cache[:background][index]
+ @index = cached.interval.end if cached
+ return cached
+ end
+
+ i0, s0 = index, []
+ r1 = _nt_comment
+ s0 << r1
+ if r1
+ r2 = _nt_white
+ s0 << r2
+ if r2
+ r3 = _nt_background_keyword
+ s0 << r3
+ if r3
+ s4, i4 = [], index
+ loop do
+ r5 = _nt_space
+ if r5
+ s4 << r5
+ else
+ break
+ end
+ end
+ r4 = instantiate_node(SyntaxNode,input, i4...index, s4)
+ s0 << r4
+ if r4
+ r7 = _nt_lines_to_keyword
+ if r7
+ r6 = r7
+ else
+ r6 = instantiate_node(SyntaxNode,input, index...index)
+ end
+ s0 << r6
+ if r6
+ i8 = index
+ s9, i9 = [], index
+ loop do
+ r10 = _nt_eol
+ if r10
+ s9 << r10
+ else
+ break
+ end
+ end
+ if s9.empty?
+ @index = i9
+ r9 = nil
+ else
+ r9 = instantiate_node(SyntaxNode,input, i9...index, s9)
+ end
+ if r9
+ r8 = r9
+ else
+ r11 = _nt_eof
+ if r11
+ r8 = r11
+ else
+ @index = i8
+ r8 = nil
+ end
+ end
+ s0 << r8
+ if r8
+ r12 = _nt_steps
+ s0 << r12
+ end
+ end
+ end
+ end
+ end
+ end
+ if s0.last
+ r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
+ r0.extend(Background0)
+ r0.extend(Background1)
+ else
+ @index = i0
+ r0 = nil
+ end
+
+ node_cache[:background][start_index] = r0
+
+ r0
+ end
+
+ module FeatureElements0
+ def accept?(filter)
+ filter.nil? || elements.empty? || elements.detect{|feature_element| filter.accept?(feature_element)}
+ end
+
+ def build(background, filter)
+ elements.map do |feature_element|
+ if filter.nil? || filter.accept?(feature_element)
+ feature_element.build(background, filter)
+ end
+ end.compact
+ end
+ end
+
+ def _nt_feature_elements
+ start_index = index
+ if node_cache[:feature_elements].has_key?(index)
+ cached = node_cache[:feature_elements][index]
+ @index = cached.interval.end if cached
+ return cached
+ end
+
+ s0, i0 = [], index
+ loop do
+ i1 = index
+ r2 = _nt_scenario
+ if r2
+ r1 = r2
+ else
+ r3 = _nt_scenario_outline
+ if r3
+ r1 = r3
+ else
+ @index = i1
+ r1 = nil
+ end
+ end
+ if r1
+ s0 << r1
+ else
+ break
+ end
+ end
+ r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
+ r0.extend(FeatureElements0)
+
+ node_cache[:feature_elements][start_index] = r0
+
+ r0
+ end
+
+ module Scenario0
+ def comment
+ elements[0]
+ end
+
+ def tags
+ elements[1]
+ end
+
+ def white1
+ elements[2]
+ end
+
+ def scenario_keyword
+ elements[3]
+ end
+
+ def name
+ elements[5]
+ end
+
+ def white2
+ elements[6]
+ end
+
+ def steps
+ elements[7]
+ end
+
+ def white3
+ elements[8]
+ end
+ end
+
+ module Scenario1
+ def at_line?(line)
+ scenario_keyword.line == line ||
+ steps.at_line?(line) ||
+ tags.at_line?(line)
+ end
+
+ def matches_tags?(tag_name_lists)
+ feature_tag_names = self.parent.parent.tags.tag_names
+ source_tag_names = (feature_tag_names + tags.tag_names).uniq
+ Ast::Tags.matches?(source_tag_names, tag_name_lists)
+ end
+
+ def matches_name?(regexp_to_match)
+ name.build =~ regexp_to_match
+ end
+
+ def build(background, filter)
+ Ast::Scenario.new(
+ background,
+ comment.build,
+ tags.build,
+ scenario_keyword.line,
+ scenario_keyword.text_value,
+ name.build,
+ steps.build
+ )
+ end
+ end
+
+ def _nt_scenario
+ start_index = index
+ if node_cache[:scenario].has_key?(index)
+ cached = node_cache[:scenario][index]
+ @index = cached.interval.end if cached
+ return cached
+ end
+
+ i0, s0 = index, []
+ r1 = _nt_comment
+ s0 << r1
+ if r1
+ r2 = _nt_tags
+ s0 << r2
+ if r2
+ r3 = _nt_white
+ s0 << r3
+ if r3
+ r4 = _nt_scenario_keyword
+ s0 << r4
+ if r4
+ s5, i5 = [], index
+ loop do
+ r6 = _nt_space
+ if r6
+ s5 << r6
+ else
+ break
+ end
+ end
+ r5 = instantiate_node(SyntaxNode,input, i5...index, s5)
+ s0 << r5
+ if r5
+ r7 = _nt_lines_to_keyword
+ s0 << r7
+ if r7
+ r8 = _nt_white
+ s0 << r8
+ if r8
+ r9 = _nt_steps
+ s0 << r9
+ if r9
+ r10 = _nt_white
+ s0 << r10
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ if s0.last
+ r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
+ r0.extend(Scenario0)
+ r0.extend(Scenario1)
+ else
+ @index = i0
+ r0 = nil
+ end
+
+ node_cache[:scenario][start_index] = r0
+
+ r0
+ end
+
+ module ScenarioOutline0
+ def comment
+ elements[0]
+ end
+
+ def tags
+ elements[1]
+ end
+
+ def white1
+ elements[2]
+ end
+
+ def scenario_outline_keyword
+ elements[3]
+ end
+
+ def name
+ elements[5]
+ end
+
+ def white2
+ elements[6]
+ end
+
+ def steps
+ elements[7]
+ end
+
+ def examples_sections
+ elements[8]
+ end
+
+ def white3
+ elements[9]
+ end
+ end
+
+ module ScenarioOutline1
+ def at_line?(line)
+ outline_at_line?(line) ||
+ examples_sections.at_line?(line) ||
+ tags.at_line?(line)
+ end
+
+ def outline_at_line?(line)
+ scenario_outline_keyword.line == line ||
+ steps.at_line?(line)
+ end
+
+ def matches_tags?(tag_name_lists)
+ feature_tag_names = self.parent.parent.tags.tag_names
+ source_tag_names = (feature_tag_names + tags.tag_names).uniq
+ Ast::Tags.matches?(source_tag_names, tag_name_lists)
+ end
+
+ def matches_name?(regexp_to_match)
+ outline_matches_name?(regexp_to_match) || examples_sections.matches_name?(regexp_to_match)
+ end
+
+ def outline_matches_name?(regexp_to_match)
+ name.build =~ regexp_to_match
+ end
+
+ def build(background, filter)
+ Ast::ScenarioOutline.new(
+ background,
+ comment.build,
+ tags.build,
+ scenario_outline_keyword.line,
+ scenario_outline_keyword.text_value,
+ name.build,
+ steps.build,
+ examples_sections.build(filter, self)
+ )
+ end
+ end
+
+ def _nt_scenario_outline
+ start_index = index
+ if node_cache[:scenario_outline].has_key?(index)
+ cached = node_cache[:scenario_outline][index]
+ @index = cached.interval.end if cached
+ return cached
+ end
+
+ i0, s0 = index, []
+ r1 = _nt_comment
+ s0 << r1
+ if r1
+ r2 = _nt_tags
+ s0 << r2
+ if r2
+ r3 = _nt_white
+ s0 << r3
+ if r3
+ r4 = _nt_scenario_outline_keyword
+ s0 << r4
+ if r4
+ s5, i5 = [], index
+ loop do
+ r6 = _nt_space
+ if r6
+ s5 << r6
+ else
+ break
+ end
+ end
+ r5 = instantiate_node(SyntaxNode,input, i5...index, s5)
+ s0 << r5
+ if r5
+ r7 = _nt_lines_to_keyword
+ s0 << r7
+ if r7
+ r8 = _nt_white
+ s0 << r8
+ if r8
+ r9 = _nt_steps
+ s0 << r9
+ if r9
+ r10 = _nt_examples_sections
+ s0 << r10
+ if r10
+ r11 = _nt_white
+ s0 << r11
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ if s0.last
+ r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
+ r0.extend(ScenarioOutline0)
+ r0.extend(ScenarioOutline1)
+ else
+ @index = i0
+ r0 = nil
+ end
+
+ node_cache[:scenario_outline][start_index] = r0
+
+ r0
+ end
+
+ module Steps0
+ def at_line?(line)
+ elements.detect{|e| e.at_line?(line)}
+ end
+
+ def build
+ elements.map{|e| e.build}
+ end
+ end
+
+ def _nt_steps
+ start_index = index
+ if node_cache[:steps].has_key?(index)
+ cached = node_cache[:steps][index]
+ @index = cached.interval.end if cached
+ return cached
+ end
+
+ s0, i0 = [], index
+ loop do
+ r1 = _nt_step
+ if r1
+ s0 << r1
+ else
+ break
+ end
+ end
+ r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
+ r0.extend(Steps0)
+
+ node_cache[:steps][start_index] = r0
+
+ r0
+ end
+
+ module Step0
+ def comment
+ elements[0]
+ end
+
+ def step_keyword
+ elements[2]
+ end
+
+ def keyword_space
+ elements[3]
+ end
+
+ def name
+ elements[4]
+ end
+
+ def multi
+ elements[6]
+ end
+
+ def white
+ elements[7]
+ end
+ end
+
+ module Step1
+ def at_line?(line)
+ step_keyword.line == line ||
+ (multi.respond_to?(:at_line?) && multi.at_line?(line))
+ end
+
+ def build
+ if multi.respond_to?(:build)
+ Ast::Step.new(step_keyword.line, step_keyword.text_value, name.text_value.strip, multi.build)
+ else
+ Ast::Step.new(step_keyword.line, step_keyword.text_value, name.text_value.strip)
+ end
+ end
+ end
+
+ def _nt_step
+ start_index = index
+ if node_cache[:step].has_key?(index)
+ cached = node_cache[:step][index]
+ @index = cached.interval.end if cached
+ return cached
+ end
+
+ i0, s0 = index, []
+ r1 = _nt_comment
+ s0 << r1
+ if r1
+ s2, i2 = [], index
+ loop do
+ r3 = _nt_space
+ if r3
+ s2 << r3
+ else
+ break
+ end
+ end
+ r2 = instantiate_node(SyntaxNode,input, i2...index, s2)
+ s0 << r2
+ if r2
+ r4 = _nt_step_keyword
+ s0 << r4
+ if r4
+ r5 = _nt_keyword_space
+ s0 << r5
+ if r5
+ r6 = _nt_line_to_eol
+ s0 << r6
+ if r6
+ i7 = index
+ s8, i8 = [], index
+ loop do
+ r9 = _nt_eol
+ if r9
+ s8 << r9
+ else
+ break
+ end
+ end
+ if s8.empty?
+ @index = i8
+ r8 = nil
+ else
+ r8 = instantiate_node(SyntaxNode,input, i8...index, s8)
+ end
+ if r8
+ r7 = r8
+ else
+ r10 = _nt_eof
+ if r10
+ r7 = r10
+ else
+ @index = i7
+ r7 = nil
+ end
+ end
+ s0 << r7
+ if r7
+ r12 = _nt_multiline_arg
+ if r12
+ r11 = r12
+ else
+ r11 = instantiate_node(SyntaxNode,input, index...index)
+ end
+ s0 << r11
+ if r11
+ r13 = _nt_white
+ s0 << r13
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ if s0.last
+ r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
+ r0.extend(Step0)
+ r0.extend(Step1)
+ else
+ @index = i0
+ r0 = nil
+ end
+
+ node_cache[:step][start_index] = r0
+
+ r0
+ end
+
+ module ExamplesSections0
+ def at_line?(line)
+ elements.detect { |e| e.at_line?(line) }
+ end
+
+ def matches_name?(regexp_to_match)
+ elements.detect { |e| e.matches_name?(regexp_to_match) }
+ end
+
+ def build(filter, scenario_outline)
+ elements.map do |e|
+ if(filter.nil? || filter.accept_example?(e, scenario_outline))
+ e.build(filter, scenario_outline)
+ end
+ end.compact
+ end
+ end
+
+ def _nt_examples_sections
+ start_index = index
+ if node_cache[:examples_sections].has_key?(index)
+ cached = node_cache[:examples_sections][index]
+ @index = cached.interval.end if cached
+ return cached
+ end
+
+ s0, i0 = [], index
+ loop do
+ r1 = _nt_examples
+ if r1
+ s0 << r1
+ else
+ break
+ end
+ end
+ r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
+ r0.extend(ExamplesSections0)
+
+ node_cache[:examples_sections][start_index] = r0
+
+ r0
+ end
+
+ module Examples0
+ def comment
+ elements[0]
+ end
+
+ def examples_keyword
+ elements[2]
+ end
+
+ def name
+ elements[4]
+ end
+
+ def eol
+ elements[5]
+ end
+
+ def table
+ elements[6]
+ end
+
+ def white
+ elements[7]
+ end
+ end
+
+ module Examples1
+ def at_line?(line)
+ examples_keyword.line == line ||
+ table.at_line?(line)
+ end
+
+ def matches_tags?(tag_name_lists)
+ true
+ end
+
+ def outline_at_line?(line)
+ true
+ end
+
+ def matches_name?(regexp_to_match)
+ name.build =~ regexp_to_match
+ end
+
+ def build(filter, scenario_outline)
+ [comment.build, examples_keyword.line, examples_keyword.text_value, name.build, table.raw(filter, scenario_outline)]
+ end
+ end
+
+ def _nt_examples
+ start_index = index
+ if node_cache[:examples].has_key?(index)
+ cached = node_cache[:examples][index]
+ @index = cached.interval.end if cached
+ return cached
+ end
+
+ i0, s0 = index, []
+ r1 = _nt_comment
+ s0 << r1
+ if r1
+ s2, i2 = [], index
+ loop do
+ r3 = _nt_space
+ if r3
+ s2 << r3
+ else
+ break
+ end
+ end
+ r2 = instantiate_node(SyntaxNode,input, i2...index, s2)
+ s0 << r2
+ if r2
+ r4 = _nt_examples_keyword
+ s0 << r4
+ if r4
+ s5, i5 = [], index
+ loop do
+ r6 = _nt_space
+ if r6
+ s5 << r6
+ else
+ break
+ end
+ end
+ r5 = instantiate_node(SyntaxNode,input, i5...index, s5)
+ s0 << r5
+ if r5
+ r8 = _nt_lines_to_keyword
+ if r8
+ r7 = r8
+ else
+ r7 = instantiate_node(SyntaxNode,input, index...index)
+ end
+ s0 << r7
+ if r7
+ r9 = _nt_eol
+ s0 << r9
+ if r9
+ r10 = _nt_table
+ s0 << r10
+ if r10
+ r11 = _nt_white
+ s0 << r11
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ if s0.last
+ r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
+ r0.extend(Examples0)
+ r0.extend(Examples1)
+ else
+ @index = i0
+ r0 = nil
+ end
+
+ node_cache[:examples][start_index] = r0
+
+ r0
+ end
+
+ def _nt_multiline_arg
+ start_index = index
+ if node_cache[:multiline_arg].has_key?(index)
+ cached = node_cache[:multiline_arg][index]
+ @index = cached.interval.end if cached
+ return cached
+ end
+
+ i0 = index
+ r1 = _nt_table
+ if r1
+ r0 = r1
+ else
+ r2 = _nt_py_string
+ if r2
+ r0 = r2
+ else
+ @index = i0
+ r0 = nil
+ end
+ end
+
+ node_cache[:multiline_arg][start_index] = r0
+
+ r0
+ end
+
+ module LineToEol0
+ end
+
+ def _nt_line_to_eol
+ start_index = index
+ if node_cache[:line_to_eol].has_key?(index)
+ cached = node_cache[:line_to_eol][index]
+ @index = cached.interval.end if cached
+ return cached
+ end
+
+ s0, i0 = [], index
+ loop do
+ i1, s1 = index, []
+ i2 = index
+ r3 = _nt_eol
+ if r3
+ r2 = nil
+ else
+ @index = i2
+ r2 = instantiate_node(SyntaxNode,input, index...index)
+ end
+ s1 << r2
+ if r2
+ if index < input_length
+ r4 = instantiate_node(SyntaxNode,input, index...(index + 1))
+ @index += 1
+ else
+ terminal_parse_failure("any character")
+ r4 = nil
+ end
+ s1 << r4
+ end
+ if s1.last
+ r1 = instantiate_node(SyntaxNode,input, i1...index, s1)
+ r1.extend(LineToEol0)
+ else
+ @index = i1
+ r1 = nil
+ end
+ if r1
+ s0 << r1
+ else
+ break
+ end
+ end
+ r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
+
+ node_cache[:line_to_eol][start_index] = r0
+
+ r0
+ end
+
+ module LinesToKeyword0
+ def eol
+ elements[0]
+ end
+
+ def reserved_words_and_symbols
+ elements[2]
+ end
+ end
+
+ module LinesToKeyword1
+ end
+
+ module LinesToKeyword2
+ def build
+ self.text_value.split("\n").map{|s| s.strip}.join("\n")
+ end
+ end
+
+ def _nt_lines_to_keyword
+ start_index = index
+ if node_cache[:lines_to_keyword].has_key?(index)
+ cached = node_cache[:lines_to_keyword][index]
+ @index = cached.interval.end if cached
+ return cached
+ end
+
+ s0, i0 = [], index
+ loop do
+ i1, s1 = index, []
+ i2 = index
+ i3, s3 = index, []
+ r4 = _nt_eol
+ s3 << r4
+ if r4
+ s5, i5 = [], index
+ loop do
+ r6 = _nt_space
+ if r6
+ s5 << r6
+ else
+ break
+ end
+ end
+ r5 = instantiate_node(SyntaxNode,input, i5...index, s5)
+ s3 << r5
+ if r5
+ r7 = _nt_reserved_words_and_symbols
+ s3 << r7
+ end
+ end
+ if s3.last
+ r3 = instantiate_node(SyntaxNode,input, i3...index, s3)
+ r3.extend(LinesToKeyword0)
+ else
+ @index = i3
+ r3 = nil
+ end
+ if r3
+ r2 = nil
+ else
+ @index = i2
+ r2 = instantiate_node(SyntaxNode,input, index...index)
+ end
+ s1 << r2
+ if r2
+ if index < input_length
+ r8 = instantiate_node(SyntaxNode,input, index...(index + 1))
+ @index += 1
+ else
+ terminal_parse_failure("any character")
+ r8 = nil
+ end
+ s1 << r8
+ end
+ if s1.last
+ r1 = instantiate_node(SyntaxNode,input, i1...index, s1)
+ r1.extend(LinesToKeyword1)
+ else
+ @index = i1
+ r1 = nil
+ end
+ if r1
+ s0 << r1
+ else
+ break
+ end
+ end
+ r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
+ r0.extend(LinesToKeyword2)
+
+ node_cache[:lines_to_keyword][start_index] = r0
+
+ r0
+ end
+
+ module ReservedWordsAndSymbols0
+ def step_keyword
+ elements[0]
+ end
+
+ def keyword_space
+ elements[1]
+ end
+ end
+
+ def _nt_reserved_words_and_symbols
+ start_index = index
+ if node_cache[:reserved_words_and_symbols].has_key?(index)
+ cached = node_cache[:reserved_words_and_symbols][index]
+ @index = cached.interval.end if cached
+ return cached
+ end
+
+ i0 = index
+ i1, s1 = index, []
+ r2 = _nt_step_keyword
+ s1 << r2
+ if r2
+ r3 = _nt_keyword_space
+ s1 << r3
+ end
+ if s1.last
+ r1 = instantiate_node(SyntaxNode,input, i1...index, s1)
+ r1.extend(ReservedWordsAndSymbols0)
+ else
+ @index = i1
+ r1 = nil
+ end
+ if r1
+ r0 = r1
+ else
+ r4 = _nt_scenario_keyword
+ if r4
+ r0 = r4
+ else
+ r5 = _nt_scenario_outline_keyword
+ if r5
+ r0 = r5
+ else
+ r6 = _nt_table
+ if r6
+ r0 = r6
+ else
+ r7 = _nt_tag
+ if r7
+ r0 = r7
+ else
+ r8 = _nt_comment_line
+ if r8
+ r0 = r8
+ else
+ @index = i0
+ r0 = nil
+ end
+ end
+ end
+ end
+ end
+ end
+
+ node_cache[:reserved_words_and_symbols][start_index] = r0
+
+ r0
+ end
+
+ end
+
+ class FeatureParser < Treetop::Runtime::CompiledParser
+ include Feature
+ end
+
+ end
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/parser/feature.tt b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/parser/feature.tt
new file mode 100755
index 00000000..5b8cfe74
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/parser/feature.tt
@@ -0,0 +1,281 @@
+module Cucumber
+ module Parser
+ # TIP: When you hack on the grammar, just delete feature.rb in this directory.
+ # Also make sure you have uninstalled all cucumber gems (don't forget xxx-cucumber
+ # github gems).
+ #
+ # Treetop will then generate the parser in-memory. When you're happy, just generate
+ # the rb file with tt feature.tt
+ grammar Feature
+
+ rule feature_sub
+ white
+ comment
+ white
+ tags
+ white
+ header:(!(scenario_outline / scenario / background) .)*
+ bg:background?
+ feature_elements
+ comment? {
+ def build(filter)
+ if(filter.nil? || feature_elements.accept?(filter) || (!bg.empty? && filter.accept?(bg)))
+ background = bg.respond_to?(:build) ? bg.build : nil
+ Ast::Feature.new(
+ background,
+ comment.build,
+ tags.build,
+ header.text_value,
+ feature_elements.build(background, filter)
+ )
+ end
+ end
+ }
+ end
+
+ rule tags
+ white ts:(tag (space/eol)+)* {
+ def at_line?(line)
+ ts.elements.detect{|e| e.tag.line == line}
+ end
+
+ def build
+ Ast::Tags.new(ts.line, tag_names)
+ end
+
+ def tag_names
+ @tag_names ||= ts.elements.map{|e| e.tag.text_value}
+ end
+ }
+ end
+
+ rule tag
+ '@' [^@\r\n\t ]+
+ end
+
+ rule comment
+ (comment_line white)* {
+ def build
+ Ast::Comment.new(text_value)
+ end
+ }
+ end
+
+ rule comment_line
+ space* '#' line_to_eol
+ end
+
+ rule background
+ comment white background_keyword space* name:lines_to_keyword? (eol+ / eof) steps {
+ def matches_name?(regexp_to_match)
+ name.build =~ regexp_to_match
+ end
+
+ def at_line?(line)
+ background_keyword.line == line ||
+ steps.at_line?(line)
+ end
+
+ def matches_tags?(tag_name_lists)
+ Ast::Tags.matches?(self.parent.tags.tag_names, tag_name_lists)
+ end
+
+ def build
+ Ast::Background.new(
+ comment.build,
+ background_keyword.line,
+ background_keyword.text_value,
+ name.build,
+ steps.build
+ )
+ end
+ }
+ end
+
+ rule feature_elements
+ (scenario / scenario_outline)* {
+ def accept?(filter)
+ filter.nil? || elements.empty? || elements.detect{|feature_element| filter.accept?(feature_element)}
+ end
+
+ def build(background, filter)
+ elements.map do |feature_element|
+ if filter.nil? || filter.accept?(feature_element)
+ feature_element.build(background, filter)
+ end
+ end.compact
+ end
+ }
+ end
+
+ rule scenario
+ comment tags white scenario_keyword space* name:lines_to_keyword white steps white {
+ def at_line?(line)
+ scenario_keyword.line == line ||
+ steps.at_line?(line) ||
+ tags.at_line?(line)
+ end
+
+ def matches_tags?(tag_name_lists)
+ feature_tag_names = self.parent.parent.tags.tag_names
+ source_tag_names = (feature_tag_names + tags.tag_names).uniq
+ Ast::Tags.matches?(source_tag_names, tag_name_lists)
+ end
+
+ def matches_name?(regexp_to_match)
+ name.build =~ regexp_to_match
+ end
+
+ def build(background, filter)
+ Ast::Scenario.new(
+ background,
+ comment.build,
+ tags.build,
+ scenario_keyword.line,
+ scenario_keyword.text_value,
+ name.build,
+ steps.build
+ )
+ end
+ }
+ end
+
+ rule scenario_outline
+ comment tags white scenario_outline_keyword space* name:lines_to_keyword white steps examples_sections white {
+ def at_line?(line)
+ outline_at_line?(line) ||
+ examples_sections.at_line?(line) ||
+ tags.at_line?(line)
+ end
+
+ def outline_at_line?(line)
+ scenario_outline_keyword.line == line ||
+ steps.at_line?(line)
+ end
+
+ def matches_tags?(tag_name_lists)
+ feature_tag_names = self.parent.parent.tags.tag_names
+ source_tag_names = (feature_tag_names + tags.tag_names).uniq
+ Ast::Tags.matches?(source_tag_names, tag_name_lists)
+ end
+
+ def matches_name?(regexp_to_match)
+ outline_matches_name?(regexp_to_match) || examples_sections.matches_name?(regexp_to_match)
+ end
+
+ def outline_matches_name?(regexp_to_match)
+ name.build =~ regexp_to_match
+ end
+
+ def build(background, filter)
+ Ast::ScenarioOutline.new(
+ background,
+ comment.build,
+ tags.build,
+ scenario_outline_keyword.line,
+ scenario_outline_keyword.text_value,
+ name.build,
+ steps.build,
+ examples_sections.build(filter, self)
+ )
+ end
+ }
+ end
+
+ rule steps
+ step* {
+ def at_line?(line)
+ elements.detect{|e| e.at_line?(line)}
+ end
+
+ def build
+ elements.map{|e| e.build}
+ end
+ }
+ end
+
+ rule step
+ comment space* step_keyword keyword_space name:line_to_eol (eol+ / eof) multi:multiline_arg? white {
+ def at_line?(line)
+ step_keyword.line == line ||
+ (multi.respond_to?(:at_line?) && multi.at_line?(line))
+ end
+
+ def build
+ if multi.respond_to?(:build)
+ Ast::Step.new(step_keyword.line, step_keyword.text_value, name.text_value.strip, multi.build)
+ else
+ Ast::Step.new(step_keyword.line, step_keyword.text_value, name.text_value.strip)
+ end
+ end
+ }
+ end
+
+ rule examples_sections
+ examples* {
+ def at_line?(line)
+ elements.detect { |e| e.at_line?(line) }
+ end
+
+ def matches_name?(regexp_to_match)
+ elements.detect { |e| e.matches_name?(regexp_to_match) }
+ end
+
+ def build(filter, scenario_outline)
+ elements.map do |e|
+ if(filter.nil? || filter.accept_example?(e, scenario_outline))
+ e.build(filter, scenario_outline)
+ end
+ end.compact
+ end
+ }
+ end
+
+ rule examples
+ comment space* examples_keyword space* name:lines_to_keyword? eol table white {
+ def at_line?(line)
+ examples_keyword.line == line ||
+ table.at_line?(line)
+ end
+
+ def matches_tags?(tag_name_lists)
+ true
+ end
+
+ def outline_at_line?(line)
+ true
+ end
+
+ def matches_name?(regexp_to_match)
+ name.build =~ regexp_to_match
+ end
+
+ def build(filter, scenario_outline)
+ [comment.build, examples_keyword.line, examples_keyword.text_value, name.build, table.raw(filter, scenario_outline)]
+ end
+ }
+ end
+
+ rule multiline_arg
+ table / py_string
+ end
+
+ rule line_to_eol
+ (!eol .)*
+ end
+
+ rule lines_to_keyword
+ (!(eol space* reserved_words_and_symbols) .)* {
+ def build
+ self.text_value.split("\n").map{|s| s.strip}.join("\n")
+ end
+ }
+ end
+
+ rule reserved_words_and_symbols
+ (step_keyword keyword_space) / scenario_keyword / scenario_outline_keyword / table / tag / comment_line
+ end
+
+ end
+ end
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/parser/i18n.tt b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/parser/i18n.tt
new file mode 100755
index 00000000..a2e82245
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/parser/i18n.tt
@@ -0,0 +1,44 @@
+module Cucumber
+ module Parser
+ module I18n
+ grammar <%= keywords('grammar_name', true) %>
+ include Common
+ include Feature
+ include Table
+ include PyString
+
+ rule feature
+ feature_sub
+ end
+
+ rule background_keyword
+ (<%= keywords('background') %>) ':'
+ end
+
+ rule scenario_keyword
+ (<%= keywords('scenario') %>) ':'
+ end
+
+ rule scenario_outline_keyword
+ (<%= keywords('scenario_outline') %>) ':'
+ end
+
+ rule step_keyword
+ (<%= keywords('given') %>) /
+ (<%= keywords('when') %>) /
+ (<%= keywords('then') %>) /
+ (<%= keywords('and') %>) /
+ (<%= keywords('but') %>)
+ end
+
+ rule keyword_space
+ <%= keywords('space_after_keyword', true) ? 'space+' : 'space*' %>
+ end
+
+ rule examples_keyword
+ (<%= keywords('examples') %>) ':'?
+ end
+ end
+ end
+ end
+end
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/parser/natural_language.rb b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/parser/natural_language.rb
new file mode 100755
index 00000000..f885dc88
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/parser/natural_language.rb
@@ -0,0 +1,81 @@
+module Cucumber
+ module Parser
+ class NaturalLanguage
+ KEYWORD_KEYS = %w{name native encoding space_after_keyword feature background scenario scenario_outline examples given when then and but}
+
+ class << self
+ def get(step_mother, lang)
+ languages[lang] ||= new(step_mother, lang)
+ end
+
+ def languages
+ @languages ||= {}
+ end
+ end
+
+ def initialize(step_mother, lang)
+ @keywords = Cucumber::LANGUAGES[lang]
+ raise "Language not supported: #{lang.inspect}" if @keywords.nil?
+ @keywords['grammar_name'] = @keywords['name'].gsub(/\s/, '')
+ register_adverbs(step_mother) if step_mother
+ @parser = nil
+ end
+
+ def register_adverbs(step_mother)
+ adverbs = %w{given when then and but}.map{|keyword| @keywords[keyword].split('|').map{|w| w.gsub(/\s/, '')}}.flatten
+ step_mother.register_adverbs(adverbs) if step_mother
+ end
+
+ def parser
+ return @parser if @parser
+ i18n_tt = File.expand_path(File.dirname(__FILE__) + '/i18n.tt')
+ template = File.open(i18n_tt, Cucumber.file_mode('r')).read
+ erb = ERB.new(template)
+ grammar = erb.result(binding)
+ Treetop.load_from_string(grammar)
+ @parser = Parser::I18n.const_get("#{@keywords['grammar_name']}Parser").new
+ def @parser.inspect
+ "#<#{self.class.name}>"
+ end
+ @parser
+ end
+
+ def parse(source, path, filter)
+ feature = parser.parse_or_fail(source, path, filter)
+ feature.language = self if feature
+ feature
+ end
+
+ def keywords(key, raw=false)
+ return @keywords[key] if raw
+ return nil unless @keywords[key]
+ values = @keywords[key].to_s.split('|')
+ values.map{|value| "'#{value}'"}.join(" / ")
+ end
+
+ def incomplete?
+ KEYWORD_KEYS.detect{|key| @keywords[key].nil?}
+ end
+
+ def scenario_keyword
+ @keywords['scenario'].split('|')[0] + ':'
+ end
+
+ def but_keywords
+ @keywords['but'].split('|')
+ end
+
+ def and_keywords
+ @keywords['and'].split('|')
+ end
+
+ def step_keywords
+ %w{given when then and but}.map{|key| @keywords[key].split('|')}.flatten.uniq
+ end
+
+ def space_after_keyword
+ @keywords['space_after_keyword']
+ end
+ end
+ end
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/parser/py_string.rb b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/parser/py_string.rb
new file mode 100755
index 00000000..4b0e9d14
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/parser/py_string.rb
@@ -0,0 +1,276 @@
+# Autogenerated from a Treetop grammar. Edits may be lost.
+
+
+module Cucumber
+ module Parser
+ # TIP: When you hack on the grammar, just delete py_string.rb in this directory.
+ # Also make sure you have uninstalled all cucumber gems (don't forget xxx-cucumber
+ # github gems).
+ #
+ # Treetop will then generate the parser in-memory. When you're happy, just generate
+ # the rb file with tt feature.tt
+ module PyString
+ include Treetop::Runtime
+
+ def root
+ @root || :py_string
+ end
+
+ include Common
+
+ module PyString0
+ end
+
+ module PyString1
+ def open_py_string
+ elements[0]
+ end
+
+ def s
+ elements[1]
+ end
+
+ def close_py_string
+ elements[2]
+ end
+ end
+
+ module PyString2
+ def at_line?(line)
+ line >= open_py_string.line && line <= close_py_string.line
+ end
+
+ def build(filter=nil)
+ Ast::PyString.new(open_py_string.line, close_py_string.line, s.text_value, open_py_string.indentation)
+ end
+ end
+
+ def _nt_py_string
+ start_index = index
+ if node_cache[:py_string].has_key?(index)
+ cached = node_cache[:py_string][index]
+ @index = cached.interval.end if cached
+ return cached
+ end
+
+ i0, s0 = index, []
+ r1 = _nt_open_py_string
+ s0 << r1
+ if r1
+ s2, i2 = [], index
+ loop do
+ i3, s3 = index, []
+ i4 = index
+ r5 = _nt_close_py_string
+ if r5
+ r4 = nil
+ else
+ @index = i4
+ r4 = instantiate_node(SyntaxNode,input, index...index)
+ end
+ s3 << r4
+ if r4
+ if index < input_length
+ r6 = instantiate_node(SyntaxNode,input, index...(index + 1))
+ @index += 1
+ else
+ terminal_parse_failure("any character")
+ r6 = nil
+ end
+ s3 << r6
+ end
+ if s3.last
+ r3 = instantiate_node(SyntaxNode,input, i3...index, s3)
+ r3.extend(PyString0)
+ else
+ @index = i3
+ r3 = nil
+ end
+ if r3
+ s2 << r3
+ else
+ break
+ end
+ end
+ r2 = instantiate_node(SyntaxNode,input, i2...index, s2)
+ s0 << r2
+ if r2
+ r7 = _nt_close_py_string
+ s0 << r7
+ end
+ end
+ if s0.last
+ r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
+ r0.extend(PyString1)
+ r0.extend(PyString2)
+ else
+ @index = i0
+ r0 = nil
+ end
+
+ node_cache[:py_string][start_index] = r0
+
+ r0
+ end
+
+ module OpenPyString0
+ def indent
+ elements[0]
+ end
+
+ def eol
+ elements[3]
+ end
+ end
+
+ module OpenPyString1
+ def indentation
+ indent.text_value.length
+ end
+
+ def line
+ indent.line
+ end
+ end
+
+ def _nt_open_py_string
+ start_index = index
+ if node_cache[:open_py_string].has_key?(index)
+ cached = node_cache[:open_py_string][index]
+ @index = cached.interval.end if cached
+ return cached
+ end
+
+ i0, s0 = index, []
+ s1, i1 = [], index
+ loop do
+ r2 = _nt_space
+ if r2
+ s1 << r2
+ else
+ break
+ end
+ end
+ r1 = instantiate_node(SyntaxNode,input, i1...index, s1)
+ s0 << r1
+ if r1
+ if has_terminal?('"""', false, index)
+ r3 = instantiate_node(SyntaxNode,input, index...(index + 3))
+ @index += 3
+ else
+ terminal_parse_failure('"""')
+ r3 = nil
+ end
+ s0 << r3
+ if r3
+ s4, i4 = [], index
+ loop do
+ r5 = _nt_space
+ if r5
+ s4 << r5
+ else
+ break
+ end
+ end
+ r4 = instantiate_node(SyntaxNode,input, i4...index, s4)
+ s0 << r4
+ if r4
+ r6 = _nt_eol
+ s0 << r6
+ end
+ end
+ end
+ if s0.last
+ r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
+ r0.extend(OpenPyString0)
+ r0.extend(OpenPyString1)
+ else
+ @index = i0
+ r0 = nil
+ end
+
+ node_cache[:open_py_string][start_index] = r0
+
+ r0
+ end
+
+ module ClosePyString0
+ def eol
+ elements[0]
+ end
+
+ def quotes
+ elements[2]
+ end
+
+ def white
+ elements[3]
+ end
+ end
+
+ module ClosePyString1
+ def line
+ quotes.line
+ end
+ end
+
+ def _nt_close_py_string
+ start_index = index
+ if node_cache[:close_py_string].has_key?(index)
+ cached = node_cache[:close_py_string][index]
+ @index = cached.interval.end if cached
+ return cached
+ end
+
+ i0, s0 = index, []
+ r1 = _nt_eol
+ s0 << r1
+ if r1
+ s2, i2 = [], index
+ loop do
+ r3 = _nt_space
+ if r3
+ s2 << r3
+ else
+ break
+ end
+ end
+ r2 = instantiate_node(SyntaxNode,input, i2...index, s2)
+ s0 << r2
+ if r2
+ if has_terminal?('"""', false, index)
+ r4 = instantiate_node(SyntaxNode,input, index...(index + 3))
+ @index += 3
+ else
+ terminal_parse_failure('"""')
+ r4 = nil
+ end
+ s0 << r4
+ if r4
+ r5 = _nt_white
+ s0 << r5
+ end
+ end
+ end
+ if s0.last
+ r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
+ r0.extend(ClosePyString0)
+ r0.extend(ClosePyString1)
+ else
+ @index = i0
+ r0 = nil
+ end
+
+ node_cache[:close_py_string][start_index] = r0
+
+ r0
+ end
+
+ end
+
+ class PyStringParser < Treetop::Runtime::CompiledParser
+ include PyString
+ end
+
+ end
+end
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/parser/py_string.tt b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/parser/py_string.tt
new file mode 100755
index 00000000..2829d39b
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/parser/py_string.tt
@@ -0,0 +1,45 @@
+module Cucumber
+ module Parser
+ # TIP: When you hack on the grammar, just delete py_string.rb in this directory.
+ # Also make sure you have uninstalled all cucumber gems (don't forget xxx-cucumber
+ # github gems).
+ #
+ # Treetop will then generate the parser in-memory. When you're happy, just generate
+ # the rb file with tt feature.tt
+ grammar PyString
+ include Common
+
+ rule py_string
+ open_py_string s:(!close_py_string .)* close_py_string {
+ def at_line?(line)
+ line >= open_py_string.line && line <= close_py_string.line
+ end
+
+ def build(filter=nil)
+ Ast::PyString.new(open_py_string.line, close_py_string.line, s.text_value, open_py_string.indentation)
+ end
+ }
+ end
+
+ rule open_py_string
+ indent:space* '"""' space* eol {
+ def indentation
+ indent.text_value.length
+ end
+
+ def line
+ indent.line
+ end
+ }
+ end
+
+ rule close_py_string
+ eol space* quotes:'"""' white {
+ def line
+ quotes.line
+ end
+ }
+ end
+ end
+ end
+end
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/parser/table.rb b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/parser/table.rb
new file mode 100755
index 00000000..cf7bb80f
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/parser/table.rb
@@ -0,0 +1,305 @@
+# Autogenerated from a Treetop grammar. Edits may be lost.
+
+
+module Cucumber
+ module Parser
+ # TIP: When you hack on the grammar, just delete table.rb in this directory.
+ # Also make sure you have uninstalled all cucumber gems (don't forget xxx-cucumber
+ # github gems).
+ #
+ # Treetop will then generate the parser in-memory. When you're happy, just generate
+ # the rb file with tt feature.tt
+ module Table
+ include Treetop::Runtime
+
+ def root
+ @root || :table
+ end
+
+ include Common
+
+ module Table0
+ def at_line?(line)
+ elements.detect{|table_row| table_row.at_line?(line)}
+ end
+
+ def build(filter=nil)
+ Ast::Table.new(raw)
+ end
+
+ def raw(filter=nil, scenario_outline=nil)
+ elements.map do |table_row|
+ if(filter.nil? || table_row == elements[0] || filter.at_line?(table_row) || (scenario_outline && filter.outline_at_line?(scenario_outline)))
+ table_row.build
+ end
+ end.compact
+ end
+ end
+
+ def _nt_table
+ start_index = index
+ if node_cache[:table].has_key?(index)
+ cached = node_cache[:table][index]
+ @index = cached.interval.end if cached
+ return cached
+ end
+
+ s0, i0 = [], index
+ loop do
+ r1 = _nt_table_row
+ if r1
+ s0 << r1
+ else
+ break
+ end
+ end
+ if s0.empty?
+ @index = i0
+ r0 = nil
+ else
+ r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
+ r0.extend(Table0)
+ end
+
+ node_cache[:table][start_index] = r0
+
+ r0
+ end
+
+ module TableRow0
+ def cell
+ elements[0]
+ end
+
+ end
+
+ module TableRow1
+ def cells
+ elements[2]
+ end
+
+ end
+
+ module TableRow2
+ def at_line?(line)
+ cells.line == line
+ end
+
+ def build
+ row = cells.elements.map do |elt|
+ value = elt.cell.text_value.strip
+ value
+ end
+
+ class << row
+ attr_accessor :line
+ end
+ row.line = cells.line
+
+ row
+ end
+ end
+
+ def _nt_table_row
+ start_index = index
+ if node_cache[:table_row].has_key?(index)
+ cached = node_cache[:table_row][index]
+ @index = cached.interval.end if cached
+ return cached
+ end
+
+ i0, s0 = index, []
+ s1, i1 = [], index
+ loop do
+ r2 = _nt_space
+ if r2
+ s1 << r2
+ else
+ break
+ end
+ end
+ r1 = instantiate_node(SyntaxNode,input, i1...index, s1)
+ s0 << r1
+ if r1
+ if has_terminal?('|', false, index)
+ r3 = instantiate_node(SyntaxNode,input, index...(index + 1))
+ @index += 1
+ else
+ terminal_parse_failure('|')
+ r3 = nil
+ end
+ s0 << r3
+ if r3
+ s4, i4 = [], index
+ loop do
+ i5, s5 = index, []
+ r6 = _nt_cell
+ s5 << r6
+ if r6
+ if has_terminal?('|', false, index)
+ r7 = instantiate_node(SyntaxNode,input, index...(index + 1))
+ @index += 1
+ else
+ terminal_parse_failure('|')
+ r7 = nil
+ end
+ s5 << r7
+ end
+ if s5.last
+ r5 = instantiate_node(SyntaxNode,input, i5...index, s5)
+ r5.extend(TableRow0)
+ else
+ @index = i5
+ r5 = nil
+ end
+ if r5
+ s4 << r5
+ else
+ break
+ end
+ end
+ if s4.empty?
+ @index = i4
+ r4 = nil
+ else
+ r4 = instantiate_node(SyntaxNode,input, i4...index, s4)
+ end
+ s0 << r4
+ if r4
+ s8, i8 = [], index
+ loop do
+ r9 = _nt_space
+ if r9
+ s8 << r9
+ else
+ break
+ end
+ end
+ r8 = instantiate_node(SyntaxNode,input, i8...index, s8)
+ s0 << r8
+ if r8
+ i10 = index
+ s11, i11 = [], index
+ loop do
+ r12 = _nt_eol
+ if r12
+ s11 << r12
+ else
+ break
+ end
+ end
+ if s11.empty?
+ @index = i11
+ r11 = nil
+ else
+ r11 = instantiate_node(SyntaxNode,input, i11...index, s11)
+ end
+ if r11
+ r10 = r11
+ else
+ r13 = _nt_eof
+ if r13
+ r10 = r13
+ else
+ @index = i10
+ r10 = nil
+ end
+ end
+ s0 << r10
+ end
+ end
+ end
+ end
+ if s0.last
+ r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
+ r0.extend(TableRow1)
+ r0.extend(TableRow2)
+ else
+ @index = i0
+ r0 = nil
+ end
+
+ node_cache[:table_row][start_index] = r0
+
+ r0
+ end
+
+ module Cell0
+ end
+
+ def _nt_cell
+ start_index = index
+ if node_cache[:cell].has_key?(index)
+ cached = node_cache[:cell][index]
+ @index = cached.interval.end if cached
+ return cached
+ end
+
+ s0, i0 = [], index
+ loop do
+ i1, s1 = index, []
+ i2 = index
+ i3 = index
+ if has_terminal?('|', false, index)
+ r4 = instantiate_node(SyntaxNode,input, index...(index + 1))
+ @index += 1
+ else
+ terminal_parse_failure('|')
+ r4 = nil
+ end
+ if r4
+ r3 = r4
+ else
+ r5 = _nt_eol
+ if r5
+ r3 = r5
+ else
+ @index = i3
+ r3 = nil
+ end
+ end
+ if r3
+ r2 = nil
+ else
+ @index = i2
+ r2 = instantiate_node(SyntaxNode,input, index...index)
+ end
+ s1 << r2
+ if r2
+ if index < input_length
+ r6 = instantiate_node(SyntaxNode,input, index...(index + 1))
+ @index += 1
+ else
+ terminal_parse_failure("any character")
+ r6 = nil
+ end
+ s1 << r6
+ end
+ if s1.last
+ r1 = instantiate_node(SyntaxNode,input, i1...index, s1)
+ r1.extend(Cell0)
+ else
+ @index = i1
+ r1 = nil
+ end
+ if r1
+ s0 << r1
+ else
+ break
+ end
+ end
+ r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
+
+ node_cache[:cell][start_index] = r0
+
+ r0
+ end
+
+ end
+
+ class TableParser < Treetop::Runtime::CompiledParser
+ include Table
+ end
+
+ end
+end
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/parser/table.tt b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/parser/table.tt
new file mode 100755
index 00000000..d42df129
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/parser/table.tt
@@ -0,0 +1,60 @@
+module Cucumber
+ module Parser
+ # TIP: When you hack on the grammar, just delete table.rb in this directory.
+ # Also make sure you have uninstalled all cucumber gems (don't forget xxx-cucumber
+ # github gems).
+ #
+ # Treetop will then generate the parser in-memory. When you're happy, just generate
+ # the rb file with tt feature.tt
+ grammar Table
+ include Common
+
+ rule table
+ table_row+ {
+ def at_line?(line)
+ elements.detect{|table_row| table_row.at_line?(line)}
+ end
+
+ def build(filter=nil)
+ Ast::Table.new(raw)
+ end
+
+ def raw(filter=nil, scenario_outline=nil)
+ elements.map do |table_row|
+ if(filter.nil? || table_row == elements[0] || filter.at_line?(table_row) || (scenario_outline && filter.outline_at_line?(scenario_outline)))
+ table_row.build
+ end
+ end.compact
+ end
+ }
+ end
+
+ rule table_row
+ space* '|' cells:(cell '|')+ space* (eol+ / eof) {
+ def at_line?(line)
+ cells.line == line
+ end
+
+ def build
+ row = cells.elements.map do |elt|
+ value = elt.cell.text_value.strip
+ value
+ end
+
+ class << row
+ attr_accessor :line
+ end
+ row.line = cells.line
+
+ row
+ end
+ }
+ end
+
+ rule cell
+ (!('|' / eol) .)*
+ end
+
+ end
+ end
+end
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/parser/treetop_ext.rb b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/parser/treetop_ext.rb
new file mode 100755
index 00000000..e825928d
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/parser/treetop_ext.rb
@@ -0,0 +1,53 @@
+begin
+ require 'treetop'
+ require 'treetop/runtime'
+ require 'treetop/ruby_extensions'
+rescue LoadError
+ require "rubygems"
+ gem "treetop"
+ require 'treetop'
+ require 'treetop/runtime'
+ require 'treetop/ruby_extensions'
+end
+
+module Cucumber
+ module Parser
+ # Raised if Cucumber fails to parse a feature file
+ class SyntaxError < StandardError
+ def initialize(parser, file, line_offset)
+ tf = parser.terminal_failures
+ expected = tf.size == 1 ? tf[0].expected_string.inspect : "one of #{tf.map{|f| f.expected_string.inspect}.uniq*', '}"
+ line = parser.failure_line + line_offset
+ message = "#{file}:#{line}:#{parser.failure_column}: Parse error, expected #{expected}."
+ super(message)
+ end
+ end
+
+ module TreetopExt #:nodoc:
+ def parse_or_fail(source, file=nil, filter=nil, line_offset=0)
+ parse_tree = parse(source)
+ if parse_tree.nil?
+ raise Cucumber::Parser::SyntaxError.new(self, file, line_offset)
+ else
+ ast = parse_tree.build(filter) # may return nil if it doesn't match filter.
+ ast.file = file unless ast.nil?
+ ast
+ end
+ end
+ end
+ end
+end
+
+module Treetop #:nodoc:
+ module Runtime #:nodoc:
+ class SyntaxNode #:nodoc:
+ def line
+ input.line_of(interval.first)
+ end
+ end
+
+ class CompiledParser #:nodoc:
+ include Cucumber::Parser::TreetopExt
+ end
+ end
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/platform.rb b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/platform.rb
new file mode 100755
index 00000000..7aa32077
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/platform.rb
@@ -0,0 +1,31 @@
+# Detect the platform we're running on so we can tweak behaviour
+# in various places.
+require 'rbconfig'
+require 'yaml'
+
+module Cucumber
+ version = YAML.load_file(File.dirname(__FILE__) + '/../../VERSION.yml')
+ VERSION = "#{version[:major]}.#{version[:minor]}.#{version[:patch]}"
+ LANGUAGE_FILE = File.expand_path(File.dirname(__FILE__) + '/languages.yml')
+ LANGUAGES = YAML.load_file(LANGUAGE_FILE)
+ BINARY = File.expand_path(File.dirname(__FILE__) + '/../../bin/cucumber')
+ LIBDIR = File.expand_path(File.dirname(__FILE__) + '/../../lib')
+ JRUBY = defined?(JRUBY_VERSION)
+ IRONRUBY = defined?(RUBY_ENGINE) && RUBY_ENGINE == "ironruby"
+ WINDOWS = Config::CONFIG['host_os'] =~ /mswin|mingw/
+ OS_X = Config::CONFIG['host_os'] =~ /darwin/
+ WINDOWS_MRI = WINDOWS && !JRUBY && !IRONRUBY
+ RAILS = defined?(Rails)
+ RUBY_BINARY = File.join(Config::CONFIG['bindir'], Config::CONFIG['ruby_install_name'])
+ RUBY_1_9 = RUBY_VERSION =~ /^1\.9/
+ RUBY_1_8_7 = RUBY_VERSION =~ /^1\.8\.7/
+
+ class << self
+ attr_accessor :use_full_backtrace
+
+ def file_mode(m) #:nodoc:
+ RUBY_1_9 ? "#{m}:UTF-8" : m
+ end
+ end
+ self.use_full_backtrace = false
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/py_support/py_dsl.py b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/py_support/py_dsl.py
new file mode 100755
index 00000000..143b9620
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/py_support/py_dsl.py
@@ -0,0 +1,10 @@
+import py_language
+
+class Given(object):
+ def __init__(self, regexp):
+ self.regexp = regexp
+
+ def __call__(self, f):
+ py_language.register_step_def(self.regexp, f)
+ return f
+
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/py_support/py_language.py b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/py_support/py_language.py
new file mode 100755
index 00000000..0671ed95
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/py_support/py_language.py
@@ -0,0 +1,10 @@
+import py_dsl
+
+step_defs = {}
+
+def register_step_def(regexp, f):
+ print "Got a step def: ", regexp
+ step_defs[regexp] = f
+
+def step_matches(step_name, name_to_report):
+ print "WTF: " + step_name
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/py_support/py_language.rb b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/py_support/py_language.rb
new file mode 100755
index 00000000..1b3d1364
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/py_support/py_language.rb
@@ -0,0 +1,81 @@
+require 'rubypython'
+
+module Cucumber
+ module PySupport
+ class PyLanguage
+ include LanguageSupport::LanguageMethods
+
+ def initialize(step_mother)
+ @step_def_files = []
+ #
+ # @python_path = ENV['PYTHONPATH'] ? ENV['PYTHONPATH'].split(':') : []
+ # add_to_python_path(File.dirname(__FILE__))
+ #
+ # RubyPython.start
+ # at_exit{RubyPython.stop}
+ #
+ # import(File.dirname(__FILE__) + '/py_language.py')
+ end
+
+ def load_code_file(py_file)
+ @step_def_files << py_file
+ end
+
+ def alias_adverbs(adverbs)
+ end
+
+ def step_definitions_for(py_file)
+ mod = import(py_file)
+ end
+
+ def snippet_text(step_keyword, step_name, multiline_arg_class)
+ "python snippet: #{step_keyword}, #{step_name}"
+ end
+
+ def begin_scenario
+ @python_path = []
+ add_to_python_path(File.dirname(__FILE__))
+ @step_def_files.each{|f| add_to_python_path(File.dirname(f))}
+
+ RubyPython.start
+
+ @delegate = import(File.dirname(__FILE__) + '/py_language.py')
+ @step_def_files.each{|f| import(f)}
+ end
+
+ def step_matches(step_name, name_to_report)
+ @delegate.step_matches(step_name, name_to_report)
+ end
+
+ private
+
+ def import(path)
+ modname = File.basename(path)[0...-File.extname(path).length]
+ begin
+ mod = RubyPython.import(modname)
+ rescue PythonError => e
+# e.message << "Couldn't load #{path}\nConsider adding #{File.expand_path(File.dirname(path))} to your PYTHONPATH"
+ raise e
+ end
+ end
+
+ def add_to_python_path(dir)
+ dir = File.expand_path(dir)
+ @python_path.unshift(dir)
+ @python_path.uniq!
+ ENV['PYTHONPATH'] = @python_path.join(':')
+ end
+ end
+ end
+end
+
+class String #:nodoc:
+ # RubyPython incorrectly to expects String#end_with? to exist.
+ unless defined? end_with? # 1.9
+ def end_with?(str) #:nodoc:
+ str = str.to_str
+ tail = self[-str.length, str.length]
+ tail == str
+ end
+ end
+end
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/rails/action_controller.rb b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/rails/action_controller.rb
new file mode 100755
index 00000000..7d80b550
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/rails/action_controller.rb
@@ -0,0 +1,38 @@
+ActionController::Base.class_eval do
+ cattr_accessor :allow_rescue
+
+ alias_method :rescue_action_without_bypass, :rescue_action
+
+ def rescue_action(exception)
+ if ActionController::Base.allow_rescue
+ rescue_action_without_bypass(exception)
+ else
+ raise exception
+ end
+ end
+end
+
+begin
+ ActionController::Failsafe.class_eval do
+ alias_method :failsafe_response_without_bypass, :failsafe_response
+
+ def failsafe_response(exception)
+ raise exception
+ end
+ end
+rescue NameError # Failsafe was introduced in Rails 2.3.2
+ ActionController::Dispatcher.class_eval do
+ def self.failsafe_response(output, status, exception = nil)
+ raise exception
+ end
+ end
+end
+
+Before('@allow-rescue') do
+ @__orig_allow_rescue = ActionController::Base.allow_rescue
+ ActionController::Base.allow_rescue = true
+end
+
+After('@allow-rescue') do
+ ActionController::Base.allow_rescue = @__orig_allow_rescue
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/rails/active_record.rb b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/rails/active_record.rb
new file mode 100755
index 00000000..8ea475b2
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/rails/active_record.rb
@@ -0,0 +1,30 @@
+if defined?(ActiveRecord::Base)
+ Before do
+ $__cucumber_global_use_txn = !!Cucumber::Rails::World.use_transactional_fixtures if $__cucumber_global_use_txn.nil?
+ end
+
+ Before('~@no-txn') do
+ Cucumber::Rails::World.use_transactional_fixtures = $__cucumber_global_use_txn
+ end
+
+ Before('@no-txn') do
+ Cucumber::Rails::World.use_transactional_fixtures = false
+ end
+
+ Before do
+ if Cucumber::Rails::World.use_transactional_fixtures
+ run_callbacks :setup if respond_to?(:run_callbacks)
+ end
+ ActionMailer::Base.deliveries = [] if defined?(ActionMailer::Base)
+ end
+
+ After do
+ if Cucumber::Rails::World.use_transactional_fixtures
+ run_callbacks :teardown if respond_to?(:run_callbacks)
+ end
+ end
+else
+ module Cucumber::Rails
+ def World.fixture_table_names; []; end # Workaround for projects that don't use ActiveRecord
+ end
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/rails/rspec.rb b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/rails/rspec.rb
new file mode 100755
index 00000000..33bf373f
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/rails/rspec.rb
@@ -0,0 +1,10 @@
+require 'cucumber/rails/world'
+require 'spec/expectations'
+require 'spec/rails'
+
+[Cucumber::Rails::World, ActionController::Integration::Session].each do |klass|
+ klass.class_eval do
+ include Spec::Matchers
+ include Spec::Rails::Matchers
+ end
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/rails/test_unit.rb b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/rails/test_unit.rb
new file mode 100755
index 00000000..2f3e5065
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/rails/test_unit.rb
@@ -0,0 +1,9 @@
+begin
+ require 'test/unit/testresult'
+rescue LoadError => e
+ e.message << "\nYou must gem install test-unit. For more info see https://rspec.lighthouseapp.com/projects/16211/tickets/292"
+ e.message << "\nAlso make sure you have rack 1.0.0 or higher."
+ raise e
+end
+# So that Test::Unit doesn't launch at the end - makes it think it has already been run.
+Test::Unit.run = true if Test::Unit.respond_to?(:run=)
diff --git a/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/rails/world.rb b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/rails/world.rb
new file mode 100755
index 00000000..b65c5d7c
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/rails/world.rb
@@ -0,0 +1,30 @@
+if defined?(ActiveRecord::Base)
+ require 'test_help'
+else
+ require 'action_controller/test_process'
+ require 'action_controller/integration'
+end
+
+require 'cucumber/rails/test_unit'
+require 'cucumber/rails/action_controller'
+
+if ::Rails.respond_to?(:configuration) && !(::Rails.configuration.cache_classes)
+ warn "WARNING: You have set Rails' config.cache_classes to false (most likely in config/environments/cucumber.rb). This setting is known to break Cucumber's use_transactional_fixtures method. Set config.cache_classes to true if you want to use transactional fixtures. For more information see https://rspec.lighthouseapp.com/projects/16211/tickets/165."
+end
+
+module Cucumber #:nodoc:
+ module Rails
+ class World < ActionController::IntegrationTest
+ include ActiveSupport::Testing::SetupAndTeardown
+ def initialize #:nodoc:
+ @_result = Test::Unit::TestResult.new
+ end
+ end
+ end
+end
+
+require 'cucumber/rails/active_record'
+
+World do
+ Cucumber::Rails::World.new
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/rake/task.rb b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/rake/task.rb
new file mode 100755
index 00000000..620e1d89
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/rake/task.rb
@@ -0,0 +1,166 @@
+require 'cucumber/platform'
+
+module Cucumber
+ module Rake
+ # Defines a Rake task for running features.
+ #
+ # The simplest use of it goes something like:
+ #
+ # Cucumber::Rake::Task.new
+ #
+ # This will define a task named cucumber described as 'Run Cucumber features'.
+ # It will use steps from 'features/**/*.rb' and features in 'features/**/*.feature'.
+ #
+ # To further configure the task, you can pass a block:
+ #
+ # Cucumber::Rake::Task.new do |t|
+ # t.cucumber_opts = %w{--format progress}
+ # end
+ #
+ # This task can also be configured to be run with RCov:
+ #
+ # Cucumber::Rake::Task.new do |t|
+ # t.rcov = true
+ # end
+ #
+ # See the attributes for additional configuration possibilities.
+ class Task
+ class InProcessCucumberRunner #:nodoc:
+ attr_reader :args
+
+ def initialize(libs, cucumber_opts, feature_files)
+ raise "libs must be an Array when running in-process" unless Array === libs
+ libs.reverse.each{|lib| $LOAD_PATH.unshift(lib)}
+ @args = (
+ cucumber_opts +
+ feature_files
+ ).flatten.compact
+ end
+
+ def run
+ require 'cucumber/cli/main'
+ failure = Cucumber::Cli::Main.execute(args)
+ raise "Cucumber failed" if failure
+ end
+ end
+
+ class ForkedCucumberRunner #:nodoc:
+ attr_reader :args
+
+ def initialize(libs, cucumber_bin, cucumber_opts, feature_files)
+ @args = (
+ ['-I'] + load_path(libs) +
+ quoted_binary(cucumber_bin) +
+ cucumber_opts +
+ feature_files
+ ).flatten
+ end
+
+ def load_path(libs)
+ ['"%s"' % libs.join(File::PATH_SEPARATOR)]
+ end
+
+ def quoted_binary(cucumber_bin)
+ ['"%s"' % cucumber_bin]
+ end
+
+ def run
+ ruby(args.join(" ")) # ruby(*args) is broken on Windows
+ end
+ end
+
+ class RCovCucumberRunner < ForkedCucumberRunner #:nodoc:
+ def initialize(libs, cucumber_bin, cucumber_opts, feature_files, rcov_opts)
+ @args = (
+ ['-I'] + load_path(libs) +
+ ['-S', 'rcov'] + rcov_opts +
+ quoted_binary(cucumber_bin) +
+ ['--'] +
+ cucumber_opts +
+ feature_files
+ ).flatten
+ end
+ end
+
+ LIB = File.expand_path(File.dirname(__FILE__) + '/../..') #:nodoc:
+
+ # Directories to add to the Ruby $LOAD_PATH
+ attr_accessor :libs
+
+ # Name of the cucumber binary to use for running features. Defaults to Cucumber::BINARY
+ attr_accessor :binary
+
+ # Extra options to pass to the cucumber binary. Can be overridden by the CUCUMBER_OPTS environment variable.
+ # It's recommended to pass an Array, but if it's a String it will be #split by ' '.
+ attr_accessor :cucumber_opts
+ def cucumber_opts=(opts) #:nodoc:
+ @cucumber_opts = String === opts ? opts.split(' ') : opts
+ end
+
+ # Run cucumber with RCov? Defaults to false. If you set this to
+ # true, +fork+ is implicit.
+ attr_accessor :rcov
+
+ # Extra options to pass to rcov.
+ # It's recommended to pass an Array, but if it's a String it will be #split by ' '.
+ attr_accessor :rcov_opts
+ def rcov_opts=(opts) #:nodoc:
+ @rcov_opts = String === opts ? opts.split(' ') : opts
+ end
+
+ # Whether or not to fork a new ruby interpreter. Defaults to true. You may gain
+ # some startup speed if you set it to false, but this may also cause issues with
+ # your load path and gems.
+ attr_accessor :fork
+
+ # Define what profile to be used. When used with cucumber_opts it is simply appended
+ # to it. Will be ignored when CUCUMBER_OPTS is used.
+ attr_accessor :profile
+
+ # Define Cucumber Rake task
+ def initialize(task_name = "cucumber", desc = "Run Cucumber features")
+ @task_name, @desc = task_name, desc
+ @fork = true
+ @libs = ['lib']
+ @rcov_opts = %w{--rails --exclude osx\/objc,gems\/}
+
+ yield self if block_given?
+
+ @binary = binary.nil? ? Cucumber::BINARY : File.expand_path(binary)
+ @libs.insert(0, LIB) if binary == Cucumber::BINARY
+
+ define_task
+ end
+
+ def define_task #:nodoc:
+ desc @desc
+ task @task_name do
+ runner.run
+ end
+ end
+
+ def runner(task_args = nil) #:nodoc:
+ cucumber_opts = [(ENV['CUCUMBER_OPTS'] ? ENV['CUCUMBER_OPTS'].split(/\s+/) : nil) || cucumber_opts_with_profile]
+ if(@rcov)
+ RCovCucumberRunner.new(libs, binary, cucumber_opts, feature_files, rcov_opts)
+ elsif(@fork)
+ ForkedCucumberRunner.new(libs, binary, cucumber_opts, feature_files)
+ else
+ InProcessCucumberRunner.new(libs, cucumber_opts, feature_files)
+ end
+ end
+
+ def cucumber_opts_with_profile #:nodoc:
+ @profile ? [cucumber_opts, '--profile', @profile] : cucumber_opts
+ end
+
+ def feature_files #:nodoc:
+ make_command_line_safe(FileList[ ENV['FEATURE'] || [] ])
+ end
+
+ def make_command_line_safe(list)
+ list.map{|string| string.gsub(' ', '\ ')}
+ end
+ end
+ end
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/rb_support/rb_dsl.rb b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/rb_support/rb_dsl.rb
new file mode 100755
index 00000000..e7304cf1
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/rb_support/rb_dsl.rb
@@ -0,0 +1,102 @@
+module Cucumber
+ module RbSupport
+ # This module defines the methods you can use to define pure Ruby
+ # Step Definitions and Hooks. This module is mixed into the toplevel
+ # object.
+ module RbDsl
+ class << self
+ attr_writer :rb_language
+
+ def alias_adverb(adverb)
+ alias_method adverb, :register_rb_step_definition
+ end
+
+ def build_rb_world_factory(world_modules, proc)
+ @rb_language.build_rb_world_factory(world_modules, proc)
+ end
+
+ def register_rb_hook(phase, tag_names, proc)
+ @rb_language.register_rb_hook(phase, tag_names, proc)
+ end
+
+ def register_rb_transform(regexp, proc)
+ @rb_language.register_rb_transform(regexp, proc)
+ end
+
+ def register_rb_step_definition(regexp, proc)
+ @rb_language.register_rb_step_definition(regexp, proc)
+ end
+ end
+
+ # Registers any number of +world_modules+ (Ruby Modules) and/or a Proc.
+ # The +proc+ will be executed once before each scenario to create an
+ # Object that the scenario's steps will run within. Any +world_modules+
+ # will be mixed into this Object (via Object#extend).
+ #
+ # This method is typically called from one or more Ruby scripts under
+ # features/support . You can call this method as many times as you
+ # like (to register more modules), but if you try to register more than
+ # one Proc you will get an error.
+ #
+ # Cucumber will not yield anything to the +proc+. Examples:
+ #
+ # World do
+ # MyClass.new
+ # end
+ #
+ # World(MyModule)
+ #
+ def World(*world_modules, &proc)
+ RbDsl.build_rb_world_factory(world_modules, proc)
+ end
+
+ # Registers a proc that will run before each Scenario. You can register as
+ # as you want (typically from ruby scripts under support/hooks.rb ).
+ def Before(*tag_names, &proc)
+ RbDsl.register_rb_hook('before', tag_names, proc)
+ end
+
+ # Registers a proc that will run after each Scenario. You can register as
+ # as you want (typically from ruby scripts under support/hooks.rb ).
+ def After(*tag_names, &proc)
+ RbDsl.register_rb_hook('after', tag_names, proc)
+ end
+
+ # Registers a proc that will run after each Step. You can register as
+ # as you want (typically from ruby scripts under support/hooks.rb ).
+ def AfterStep(*tag_names, &proc)
+ RbDsl.register_rb_hook('after_step', tag_names, proc)
+ end
+
+ # Registers a proc that will be called with a step definition argument if it
+ # matches the pattern passed as the first argument to Transform. Alternatively, if
+ # the pattern contains captures then they will be yielded as arguments to the
+ # provided proc. The return value of the proc is consequently yielded to the
+ # step definition.
+ def Transform(regexp, &proc)
+ RbDsl.register_rb_transform(regexp, proc)
+ end
+
+ # Registers a proc that will run after Cucumber is configured. You can register as
+ # as you want (typically from ruby scripts under support/hooks.rb ).
+ def AfterConfiguration(&proc)
+ RbDsl.register_rb_hook('after_configuration', [], proc)
+ end
+
+ # Registers a new Ruby StepDefinition. This method is aliased
+ # to Given , When and Then , and
+ # also to the i18n translations whenever a feature of a
+ # new language is loaded.
+ #
+ # The +&proc+ gets executed in the context of a World
+ # object, which is defined by #World. A new World
+ # object is created for each scenario and is shared across
+ # step definitions within that scenario.
+ def register_rb_step_definition(regexp, &proc)
+ RbDsl.register_rb_step_definition(regexp, proc)
+ end
+ end
+ end
+end
+
+extend(Cucumber::RbSupport::RbDsl)
diff --git a/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/rb_support/rb_hook.rb b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/rb_support/rb_hook.rb
new file mode 100755
index 00000000..0f44e170
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/rb_support/rb_hook.rb
@@ -0,0 +1,19 @@
+module Cucumber
+ module RbSupport
+ # Wrapper for Before, After and AfterStep hooks
+ class RbHook
+ attr_accessor :tag_name_lists
+ attr_reader :tag_names
+
+ def initialize(rb_language, tag_names, proc)
+ @rb_language = rb_language
+ @tag_names = tag_names
+ @proc = proc
+ end
+
+ def invoke(location, argument)
+ @rb_language.current_world.cucumber_instance_exec(false, location, argument, &@proc)
+ end
+ end
+ end
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/rb_support/rb_language.rb b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/rb_support/rb_language.rb
new file mode 100755
index 00000000..1f28f566
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/rb_support/rb_language.rb
@@ -0,0 +1,179 @@
+require 'cucumber/rb_support/rb_dsl'
+require 'cucumber/rb_support/rb_world'
+require 'cucumber/rb_support/rb_step_definition'
+require 'cucumber/rb_support/rb_hook'
+require 'cucumber/rb_support/rb_transform'
+
+module Cucumber
+ module RbSupport
+ # Raised if a World block returns Nil.
+ class NilWorld < StandardError
+ def initialize
+ super("World procs should never return nil")
+ end
+ end
+
+ # Raised if there are 2 or more World blocks.
+ class MultipleWorld < StandardError
+ def initialize(first_proc, second_proc)
+ message = "You can only pass a proc to #World once, but it's happening\n"
+ message << "in 2 places:\n\n"
+ message << first_proc.backtrace_line('World') << "\n"
+ message << second_proc.backtrace_line('World') << "\n\n"
+ message << "Use Ruby modules instead to extend your worlds. See the Cucumber::RbSupport::RbDsl#World RDoc\n"
+ message << "or http://wiki.github.com/aslakhellesoy/cucumber/a-whole-new-world.\n\n"
+ super(message)
+ end
+ end
+
+ # The Ruby implementation of the programming language API.
+ class RbLanguage
+ include LanguageSupport::LanguageMethods
+ attr_reader :current_world
+
+ def initialize(step_mother)
+ @step_mother = step_mother
+ @step_definitions = []
+ RbDsl.rb_language = self
+ @world_proc = @world_modules = nil
+ end
+
+ # Tell the language about other i18n translations so that
+ # they can alias Given, When Then etc. Only useful if the language
+ # has a mechanism for this - typically a dynamic language.
+ def alias_adverbs(adverbs)
+ adverbs.each do |adverb|
+ RbDsl.alias_adverb(adverb)
+ RbWorld.alias_adverb(adverb)
+ end
+ end
+
+ # Gets called for each file under features (or whatever is overridden
+ # with --require).
+ def step_definitions_for(rb_file)
+ begin
+ require rb_file # This will cause self.add_step_definition and self.add_hook to be called from RbDsl
+ step_definitions
+ rescue LoadError => e
+ e.message << "\nFailed to load #{code_file}"
+ raise e
+ ensure
+ @step_definitions = nil
+ end
+ end
+
+ def step_matches(name_to_match, name_to_format)
+ @step_definitions.map do |step_definition|
+ if(arguments = step_definition.arguments_from(name_to_match))
+ StepMatch.new(step_definition, name_to_match, name_to_format, arguments)
+ else
+ nil
+ end
+ end.compact
+ end
+
+ def snippet_text(step_keyword, step_name, multiline_arg_class)
+ escaped = Regexp.escape(step_name).gsub('\ ', ' ').gsub('/', '\/')
+ escaped = escaped.gsub(PARAM_PATTERN, ESCAPED_PARAM_PATTERN)
+
+ n = 0
+ block_args = escaped.scan(ESCAPED_PARAM_PATTERN).map do |a|
+ n += 1
+ "arg#{n}"
+ end
+ block_args << multiline_arg_class.default_arg_name unless multiline_arg_class.nil?
+ block_arg_string = block_args.empty? ? "" : " |#{block_args.join(", ")}|"
+ multiline_class_comment = ""
+ if(multiline_arg_class == Ast::Table)
+ multiline_class_comment = "# #{multiline_arg_class.default_arg_name} is a #{multiline_arg_class.to_s}\n "
+ end
+
+ "#{step_keyword} /^#{escaped}$/ do#{block_arg_string}\n #{multiline_class_comment}pending # express the regexp above with the code you wish you had\nend"
+ end
+
+ def begin_rb_scenario(scenario)
+ create_world
+ extend_world
+ connect_world(scenario)
+ end
+
+ def register_rb_hook(phase, tag_names, proc)
+ add_hook(phase, RbHook.new(self, tag_names, proc))
+ end
+
+ def register_rb_transform(regexp, proc)
+ add_transform(RbTransform.new(self, regexp, proc))
+ end
+
+ def register_rb_step_definition(regexp, proc)
+ step_definition = RbStepDefinition.new(self, regexp, proc)
+ @step_definitions << step_definition
+ step_definition
+ end
+
+ def build_rb_world_factory(world_modules, proc)
+ if(proc)
+ raise MultipleWorld.new(@world_proc, proc) if @world_proc
+ @world_proc = proc
+ end
+ @world_modules ||= []
+ @world_modules += world_modules
+ end
+
+ def load_code_file(code_file)
+ require code_file # This will cause self.add_step_definition, self.add_hook, and self.add_transform to be called from RbDsl
+ end
+
+ protected
+
+ def begin_scenario(scenario)
+ begin_rb_scenario(scenario)
+ end
+
+ def end_scenario
+ @current_world = nil
+ end
+
+ private
+
+ PARAM_PATTERN = /"([^\"]*)"/
+ ESCAPED_PARAM_PATTERN = '"([^\\"]*)"'
+
+ def create_world
+ if(@world_proc)
+ @current_world = @world_proc.call
+ check_nil(@current_world, @world_proc)
+ else
+ @current_world = Object.new
+ end
+ end
+
+ def extend_world
+ @current_world.extend(RbWorld)
+ @current_world.extend(::Spec::Matchers) if defined?(::Spec::Matchers)
+ (@world_modules || []).each do |mod|
+ @current_world.extend(mod)
+ end
+ end
+
+ def connect_world(scenario)
+ @current_world.__cucumber_step_mother = @step_mother
+ @current_world.__natural_language = scenario.language
+ end
+
+ def check_nil(o, proc)
+ if o.nil?
+ begin
+ raise NilWorld.new
+ rescue NilWorld => e
+ e.backtrace.clear
+ e.backtrace.push(proc.backtrace_line("World"))
+ raise e
+ end
+ else
+ o
+ end
+ end
+ end
+ end
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/rb_support/rb_step_definition.rb b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/rb_support/rb_step_definition.rb
new file mode 100755
index 00000000..b55222df
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/rb_support/rb_step_definition.rb
@@ -0,0 +1,75 @@
+require 'cucumber/step_match'
+require 'cucumber/core_ext/string'
+require 'cucumber/core_ext/proc'
+require 'cucumber/rb_support/regexp_argument_matcher'
+
+module Cucumber
+ module RbSupport
+ # A Ruby Step Definition holds a Regexp and a Proc, and is created
+ # by calling Given , When or Then
+ # in the step_definitions ruby files. See also RbDsl.
+ #
+ # Example:
+ #
+ # Given /I have (\d+) cucumbers in my belly/ do
+ # # some code here
+ # end
+ #
+ class RbStepDefinition
+
+ class MissingProc < StandardError
+ def message
+ "Step definitions must always have a proc"
+ end
+ end
+
+ def initialize(rb_language, regexp, proc)
+ raise MissingProc if proc.nil?
+ if String === regexp
+ p = Regexp.escape(regexp)
+ p = p.gsub(/\\\$\w+/, '(.*)') # Replace $var with (.*)
+ regexp = Regexp.new("^#{p}$")
+ end
+ @rb_language, @regexp, @proc = rb_language, regexp, proc
+ @rb_language.available_step_definition(regexp_source, file_colon_line)
+ end
+
+ def regexp_source
+ @regexp.inspect
+ end
+
+ def ==(step_definition)
+ regexp_source == step_definition.regexp_source
+ end
+
+ def arguments_from(step_name)
+ args = RegexpArgumentMatcher.arguments_from(@regexp, step_name)
+ @rb_language.invoked_step_definition(regexp_source, file_colon_line) if args
+ args
+ end
+
+ def invoke(args)
+ args = args.map{|arg| Ast::PyString === arg ? arg.to_s : arg}
+ begin
+ args = @rb_language.execute_transforms(args)
+ @rb_language.current_world.cucumber_instance_exec(true, regexp_source, *args, &@proc)
+ rescue Cucumber::ArityMismatchError => e
+ e.backtrace.unshift(self.backtrace_line)
+ raise e
+ end
+ end
+
+ def backtrace_line
+ @proc.backtrace_line(regexp_source)
+ end
+
+ def file_colon_line
+ @proc.file_colon_line
+ end
+
+ def file
+ @file ||= file_colon_line.split(':')[0]
+ end
+ end
+ end
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/rb_support/rb_transform.rb b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/rb_support/rb_transform.rb
new file mode 100755
index 00000000..3b28debd
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/rb_support/rb_transform.rb
@@ -0,0 +1,37 @@
+module Cucumber
+ module RbSupport
+ # A Ruby Transform holds a Regexp and a Proc, and is created
+ # by calling Transform in the support ruby files.
+ # See also RbDsl.
+ #
+ # Example:
+ #
+ # Transform /^(\d+) cucumbers$/ do |cucumbers_string|
+ # cucumbers_string.to_i
+ # end
+ #
+ class RbTransform
+ class MissingProc < StandardError
+ def message
+ "Transforms must always have a proc with at least one argument"
+ end
+ end
+
+ def initialize(rb_language, pattern, proc)
+ raise MissingProc if proc.nil? || proc.arity < 1
+ @rb_language, @regexp, @proc = rb_language, Regexp.new(pattern), proc
+ end
+
+ def match(arg)
+ arg.match(@regexp)
+ end
+
+ def invoke(arg)
+ if matched = match(arg)
+ args = matched.captures.empty? ? [arg] : matched.captures
+ @rb_language.current_world.cucumber_instance_exec(true, @regexp.inspect, *args, &@proc)
+ end
+ end
+ end
+ end
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/rb_support/rb_world.rb b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/rb_support/rb_world.rb
new file mode 100755
index 00000000..924d0703
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/rb_support/rb_world.rb
@@ -0,0 +1,81 @@
+module Cucumber
+ module RbSupport
+ # All steps are run in the context of an object that extends this module.
+ module RbWorld
+ class << self
+ def alias_adverb(adverb)
+ alias_method adverb, :__cucumber_invoke
+ end
+ end
+
+ # Call a Transform with a string from another Transform definition
+ def Transform(arg)
+ rb = @__cucumber_step_mother.load_programming_language('rb')
+ rb.execute_transforms([arg]).first
+ end
+
+ attr_writer :__cucumber_step_mother, :__natural_language
+
+ # Call a step from within a step definition. This method is aliased to
+ # the same i18n as RbDsl.
+ def __cucumber_invoke(name, multiline_argument=nil) #:nodoc:
+ @__cucumber_step_mother.invoke(name, multiline_argument)
+ end
+
+ # See StepMother#invoke_steps
+ def steps(steps_text)
+ @__cucumber_step_mother.invoke_steps(steps_text, @__natural_language)
+ end
+
+ # See StepMother#table
+ def table(text_or_table, file=nil, line_offset=0)
+ @__cucumber_step_mother.table(text_or_table, file, line_offset)
+ end
+
+ # See StepMother#py_string
+ def py_string(string_with_triple_quotes, file=nil, line_offset=0)
+ @__cucumber_step_mother.py_string(text_or_table, file, line_offset)
+ end
+
+ # See StepMother#announce
+ def announce(announcement)
+ @__cucumber_step_mother.announce(announcement)
+ end
+
+ # See StepMother#embed
+ def embed(file, mime_type)
+ @__cucumber_step_mother.embed(file, mime_type)
+ end
+
+ # Mark the matched step as pending.
+ def pending(message = "TODO")
+ if block_given?
+ begin
+ yield
+ rescue Exception => e
+ raise Pending.new(message)
+ end
+ raise Pending.new("Expected pending '#{message}' to fail. No Error was raised. No longer pending?")
+ else
+ raise Pending.new(message)
+ end
+ end
+
+ # The default implementation of Object#inspect recursively
+ # traverses all instance variables and invokes inspect.
+ # This can be time consuming if the object graph is large.
+ #
+ # This can cause unnecessary delays when certain exceptions
+ # occur. For example, MRI internally invokes #inspect on an
+ # object that raises a NoMethodError. (JRuby does not do this).
+ #
+ # A World object can have many references created by the user
+ # or frameworks (Rails), so to avoid long waiting times on
+ # such errors in World we define it to just return a simple String.
+ #
+ def inspect #:nodoc:
+ sprintf("#<%s:0x%x>", self.class, self.object_id)
+ end
+ end
+ end
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/rb_support/regexp_argument_matcher.rb b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/rb_support/regexp_argument_matcher.rb
new file mode 100755
index 00000000..da9737d4
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/rb_support/regexp_argument_matcher.rb
@@ -0,0 +1,21 @@
+require 'cucumber/step_argument'
+
+module Cucumber
+ module RbSupport
+ class RegexpArgumentMatcher
+ def self.arguments_from(regexp, step_name)
+ match = regexp.match(step_name)
+ if match
+ n = 0
+ match.captures.map do |val|
+ n += 1
+ start = match.offset(n)[0]
+ StepArgument.new(val, start)
+ end
+ else
+ nil
+ end
+ end
+ end
+ end
+end
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/rspec_neuter.rb b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/rspec_neuter.rb
new file mode 100755
index 00000000..820cf6df
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/rspec_neuter.rb
@@ -0,0 +1,23 @@
+require 'optparse'
+
+module Spec #:nodoc:
+ module Runner #:nodoc:
+ # Neuters RSpec's option parser.
+ # (RSpec's option parser tries to parse ARGV, which
+ # will fail when running cucumber)
+ class OptionParser < ::OptionParser #:nodoc:
+ NEUTERED_RSPEC = Object.new
+ def NEUTERED_RSPEC.method_missing(m, *args); self; end
+
+ def self.method_added(m)
+ unless @__neutering_rspec
+ @__neutering_rspec = true
+ define_method(m) do |*a|
+ NEUTERED_RSPEC
+ end
+ @__neutering_rspec = false
+ end
+ end
+ end
+ end
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/step_argument.rb b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/step_argument.rb
new file mode 100755
index 00000000..9b7aa83e
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/step_argument.rb
@@ -0,0 +1,9 @@
+module Cucumber
+ class StepArgument
+ attr_reader :val, :pos
+
+ def initialize(val, pos)
+ @val, @pos = val, pos
+ end
+ end
+end
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/step_definition_light.rb b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/step_definition_light.rb
new file mode 100755
index 00000000..5ae398ac
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/step_definition_light.rb
@@ -0,0 +1,20 @@
+module Cucumber
+ # Only used for keeping track of available and invoked step definitions
+ # in a way that also works for other programming languages (i.e. cuke4duke)
+ # Used for reporting purposes only (usage formatter).
+ class StepDefinitionLight
+ attr_reader :regexp_source, :file_colon_line
+
+ def initialize(regexp_source, file_colon_line)
+ @regexp_source, @file_colon_line = regexp_source, file_colon_line
+ end
+
+ def eql?(o)
+ regexp_source == o.regexp_source && file_colon_line == o.file_colon_line
+ end
+
+ def hash
+ regexp_source.hash + 31*file_colon_line.hash
+ end
+ end
+end
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/step_match.rb b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/step_match.rb
new file mode 100755
index 00000000..97dded2b
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/step_match.rb
@@ -0,0 +1,107 @@
+module Cucumber
+ class StepMatch #:nodoc:
+ attr_reader :step_definition
+
+ # Creates a new StepMatch. The +name_to_report+ argument is what's reported, unless it's is,
+ # in which case +name_to_report+ is used instead.
+ #
+ def initialize(step_definition, name_to_match, name_to_report, step_arguments)
+ raise "name_to_match can't be nil" if name_to_match.nil?
+ @step_definition, @name_to_match, @name_to_report, @step_arguments = step_definition, name_to_match, name_to_report, step_arguments
+ end
+
+ def args
+ @step_arguments.map{|g| g.val}
+ end
+
+ def name
+ @name_to_report
+ end
+
+ def invoke(multiline_arg)
+ all_args = args
+ all_args << multiline_arg.dup if multiline_arg
+ @step_definition.invoke(all_args)
+ end
+
+ # Formats the matched arguments of the associated Step. This method
+ # is usually called from visitors, which render output.
+ #
+ # The +format+ can either be a String or a Proc.
+ #
+ # If it is a String it should be a format string according to
+ # Kernel#sprinf , for example:
+ #
+ # '%s '
+ #
+ # If it is a Proc, it should take one argument and return the formatted
+ # argument, for example:
+ #
+ # lambda { |param| "[#{param}]" }
+ #
+ def format_args(format = lambda{|a| a}, &proc)
+ @name_to_report || replace_arguments(@name_to_match, @step_arguments, format, &proc)
+ end
+
+ def file_colon_line
+ @step_definition.file_colon_line
+ end
+
+ def backtrace_line
+ "#{file_colon_line}:in `#{@step_definition.regexp_source}'"
+ end
+
+ def text_length
+ @step_definition.regexp_source.jlength
+ end
+
+ def replace_arguments(string, step_arguments, format, &proc)
+ s = string.dup
+ offset = 0
+ step_arguments.each do |step_argument|
+ next if step_argument.pos.nil?
+ replacement = if block_given?
+ proc.call(step_argument.val)
+ elsif Proc === format
+ format.call(step_argument.val)
+ else
+ format % step_argument.val
+ end
+
+ s[step_argument.pos + offset, step_argument.val.length] = replacement
+ offset += replacement.jlength - step_argument.val.jlength
+ end
+ s
+ end
+
+ def inspect #:nodoc:
+ sprintf("#<%s:0x%x>", self.class, self.object_id)
+ end
+ end
+
+ class NoStepMatch #:nodoc:
+ attr_reader :step_definition, :name
+
+ def initialize(step, name)
+ @step = step
+ @name = name
+ end
+
+ def format_args(format)
+ @name
+ end
+
+ def file_colon_line
+ raise "No file:line for #{@step}" unless @step.file_colon_line
+ @step.file_colon_line
+ end
+
+ def backtrace_line
+ @step.backtrace_line
+ end
+
+ def text_length
+ @step.text_length
+ end
+ end
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/step_mother.rb b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/step_mother.rb
new file mode 100755
index 00000000..8c4627ff
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/step_mother.rb
@@ -0,0 +1,351 @@
+require 'cucumber/constantize'
+require 'cucumber/core_ext/instance_exec'
+require 'cucumber/parser/natural_language'
+require 'cucumber/language_support/language_methods'
+require 'cucumber/formatter/duration'
+
+module Cucumber
+ # Raised when there is no matching StepDefinition for a step.
+ class Undefined < StandardError
+ attr_reader :step_name
+
+ def initialize(step_name)
+ super %{Undefined step: "#{step_name}"}
+ @step_name = step_name
+ end
+
+ def nested!
+ @nested = true
+ end
+
+ def nested?
+ @nested
+ end
+ end
+
+ # Raised when a StepDefinition's block invokes World#pending
+ class Pending < StandardError
+ end
+
+ # Raised when a step matches 2 or more StepDefinitions
+ class Ambiguous < StandardError
+ def initialize(step_name, step_definitions, used_guess)
+ message = "Ambiguous match of \"#{step_name}\":\n\n"
+ message << step_definitions.map{|sd| sd.backtrace_line}.join("\n")
+ message << "\n\n"
+ message << "You can run again with --guess to make Cucumber be more smart about it\n" unless used_guess
+ super(message)
+ end
+ end
+
+ # This is the meaty part of Cucumber that ties everything together.
+ class StepMother
+ include Constantize
+ include Formatter::Duration
+ attr_writer :options, :visitor, :log
+
+ def initialize
+ @unsupported_programming_languages = []
+ @programming_languages = []
+ @language_map = {}
+ load_natural_language('en')
+ @current_scenario = nil
+ end
+
+ def load_plain_text_features(feature_files)
+ features = Ast::Features.new
+
+ start = Time.new
+ log.debug("Features:\n")
+ feature_files.each do |f|
+ feature_file = FeatureFile.new(f)
+ feature = feature_file.parse(self, options)
+ if feature
+ features.add_feature(feature)
+ log.debug(" * #{f}\n")
+ end
+ end
+ duration = Time.now - start
+ log.debug("Parsing feature files took #{format_duration(duration)}\n\n")
+ features
+ end
+
+ def load_code_files(step_def_files)
+ log.debug("Code:\n")
+ step_def_files.each do |step_def_file|
+ load_code_file(step_def_file)
+ end
+ log.debug("\n")
+ end
+
+ def load_code_file(step_def_file)
+ if programming_language = programming_language_for(step_def_file)
+ log.debug(" * #{step_def_file}\n")
+ programming_language.load_code_file(step_def_file)
+ else
+ log.debug(" * #{step_def_file} [NOT SUPPORTED]\n")
+ end
+ end
+
+ # Loads and registers programming language implementation.
+ # Instances are cached, so calling with the same argument
+ # twice will return the same instance.
+ #
+ def load_programming_language(ext)
+ return @language_map[ext] if @language_map[ext]
+ programming_language_class = constantize("Cucumber::#{ext.capitalize}Support::#{ext.capitalize}Language")
+ programming_language = programming_language_class.new(self)
+ programming_language.alias_adverbs(@adverbs || [])
+ @programming_languages << programming_language
+ @language_map[ext] = programming_language
+ programming_language
+ end
+
+ # Loads a natural language. This has the effect of aliasing
+ # Step Definition keywords for all of the registered programming
+ # languages (if they support aliasing). See #load_programming_language
+ #
+ def load_natural_language(lang)
+ Parser::NaturalLanguage.get(self, lang)
+ end
+
+ # Returns the options passed on the command line.
+ def options
+ @options ||= {}
+ end
+
+ def step_visited(step) #:nodoc:
+ steps << step unless steps.index(step)
+ end
+
+ def steps(status = nil) #:nodoc:
+ @steps ||= []
+ if(status)
+ @steps.select{|step| step.status == status}
+ else
+ @steps
+ end
+ end
+
+ # Output +announcement+ alongside the formatted output.
+ # This is an alternative to using Kernel#puts - it will display
+ # nicer, and in all outputs (in case you use several formatters)
+ #
+ # Beware that the output will be printed *before* the corresponding
+ # step. This is because the step itself will not be printed until
+ # after it has run, so it can be coloured according to its status.
+ #
+ def announce(msg)
+ @visitor.announce(msg)
+ end
+
+ # Embed +file+ of MIME type +mime_type+ into the output. This may or may
+ # not be ignored, depending on what kind of formatter(s) are active.
+ #
+ def embed(file, mime_type)
+ @visitor.embed(file, mime_type)
+ end
+
+ def scenarios(status = nil) #:nodoc:
+ @scenarios ||= []
+ if(status)
+ @scenarios.select{|scenario| scenario.status == status}
+ else
+ @scenarios
+ end
+ end
+
+ def invoke(step_name, multiline_argument=nil)
+ begin
+ step_match(step_name).invoke(multiline_argument)
+ rescue Exception => e
+ e.nested! if Undefined === e
+ raise e
+ end
+ end
+
+ # Invokes a series of steps +steps_text+. Example:
+ #
+ # invoke(%Q{
+ # Given I have 8 cukes in my belly
+ # Then I should not be thirsty
+ # })
+ def invoke_steps(steps_text, natural_language)
+ ored_keywords = natural_language.step_keywords.join("|")
+ after_keyword = natural_language.space_after_keyword ? ' ' : ''
+ # TODO Gherkin:
+ # This a bit hacky and fragile. When we move to Gherkin we should replace this entire method body
+ # with a call to the parser - parsing the body of a scenario. We may need to put the parser/policy in the
+ # appropriate state (the same state it's in after parsing a Scenario: line).
+ steps_text.strip.split(/(?=^\s*(?:#{ored_keywords}))/).map { |step| step.strip }.each do |step|
+ output = step.match(/^\s*(#{ored_keywords})#{after_keyword}([^\n]+)(\n.*)?$/m)
+
+ action, step_name, table_or_string = output[1], output[2], output[3]
+ if table_or_string.to_s.strip =~ /^\|/
+ table_or_string = table(table_or_string)
+ elsif table_or_string.to_s.strip =~ /^"""/
+ table_or_string = py_string(table_or_string.gsub(/^\n/, ""))
+ end
+ args = [step_name, table_or_string].compact
+ invoke(*args)
+ end
+ end
+
+ # Returns a Cucumber::Ast::Table for +text_or_table+, which can either
+ # be a String:
+ #
+ # table(%{
+ # | account | description | amount |
+ # | INT-100 | Taxi | 114 |
+ # | CUC-101 | Peeler | 22 |
+ # })
+ #
+ # or a 2D Array:
+ #
+ # table([
+ # %w{ account description amount },
+ # %w{ INT-100 Taxi 114 },
+ # %w{ CUC-101 Peeler 22 }
+ # ])
+ #
+ def table(text_or_table, file=nil, line_offset=0)
+ if Array === text_or_table
+ Ast::Table.new(text_or_table)
+ else
+ @table_parser ||= Parser::TableParser.new
+ @table_parser.parse_or_fail(text_or_table.strip, file, line_offset)
+ end
+ end
+
+ # Returns a regular String for +string_with_triple_quotes+. Example:
+ #
+ # """
+ # hello
+ # world
+ # """
+ #
+ # Is retured as: " hello\nworld"
+ #
+ def py_string(string_with_triple_quotes, file=nil, line_offset=0)
+ @py_string_parser ||= Parser::PyStringParser.new
+ @py_string_parser.parse_or_fail(string_with_triple_quotes, file, line_offset).to_s
+ end
+
+ def step_match(step_name, name_to_report=nil) #:nodoc:
+ matches = @programming_languages.map do |programming_language|
+ programming_language.step_matches(step_name, name_to_report)
+ end.flatten
+ raise Undefined.new(step_name) if matches.empty?
+ matches = best_matches(step_name, matches) if matches.size > 1 && options[:guess]
+ raise Ambiguous.new(step_name, matches, options[:guess]) if matches.size > 1
+ matches[0]
+ end
+
+ def best_matches(step_name, step_matches) #:nodoc:
+ no_groups = step_matches.select {|step_match| step_match.args.length == 0}
+ max_arg_length = step_matches.map {|step_match| step_match.args.length }.max
+ top_groups = step_matches.select {|step_match| step_match.args.length == max_arg_length }
+
+ if no_groups.any?
+ longest_regexp_length = no_groups.map {|step_match| step_match.text_length }.max
+ no_groups.select {|step_match| step_match.text_length == longest_regexp_length }
+ elsif top_groups.any?
+ shortest_capture_length = top_groups.map {|step_match| step_match.args.inject(0) {|sum, c| sum + c.length } }.min
+ top_groups.select {|step_match| step_match.args.inject(0) {|sum, c| sum + c.length } == shortest_capture_length }
+ else
+ top_groups
+ end
+ end
+
+ def unmatched_step_definitions
+ @programming_languages.map do |programming_language|
+ programming_language.unmatched_step_definitions
+ end.flatten
+ end
+
+ def snippet_text(step_keyword, step_name, multiline_arg_class) #:nodoc:
+ load_programming_language('rb') if unknown_programming_language?
+ @programming_languages.map do |programming_language|
+ programming_language.snippet_text(step_keyword, step_name, multiline_arg_class)
+ end.join("\n")
+ end
+
+ def unknown_programming_language?
+ @programming_languages.empty?
+ end
+
+ def before_and_after(scenario, skip_hooks=false) #:nodoc:
+ before(scenario) unless skip_hooks
+ yield scenario
+ after(scenario) unless skip_hooks
+ scenario_visited(scenario)
+ end
+
+ def register_adverbs(adverbs) #:nodoc:
+ @adverbs ||= []
+ @adverbs += adverbs
+ @adverbs.uniq!
+ @programming_languages.each do |programming_language|
+ programming_language.alias_adverbs(@adverbs)
+ end
+ end
+
+ def before(scenario) #:nodoc:
+ return if options[:dry_run] || @current_scenario
+ @current_scenario = scenario
+ @programming_languages.each do |programming_language|
+ programming_language.before(scenario)
+ end
+ end
+
+ def after(scenario) #:nodoc:
+ @current_scenario = nil
+ return if options[:dry_run]
+ @programming_languages.each do |programming_language|
+ programming_language.after(scenario)
+ end
+ end
+
+ def after_step #:nodoc:
+ return if options[:dry_run]
+ @programming_languages.each do |programming_language|
+ programming_language.execute_after_step(@current_scenario)
+ end
+ end
+
+ def after_configuration(configuration) #:nodoc
+ @programming_languages.each do |programming_language|
+ programming_language.after_configuration(configuration)
+ end
+ end
+
+ private
+
+ def programming_language_for(step_def_file) #:nodoc:
+ if ext = File.extname(step_def_file)[1..-1]
+ return nil if @unsupported_programming_languages.index(ext)
+ begin
+ load_programming_language(ext)
+ rescue LoadError => e
+ log.debug("Failed to load '#{ext}' programming language for file #{step_def_file}: #{e.message}\n")
+ @unsupported_programming_languages << ext
+ nil
+ end
+ else
+ nil
+ end
+ end
+
+ def max_step_definition_length #:nodoc:
+ @max_step_definition_length ||= step_definitions.map{|step_definition| step_definition.text_length}.max
+ end
+
+ def scenario_visited(scenario) #:nodoc:
+ scenarios << scenario unless scenarios.index(scenario)
+ end
+
+ def log
+ @log ||= Logger.new(STDOUT)
+ end
+ end
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/webrat/element_locator.rb b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/webrat/element_locator.rb
new file mode 100755
index 00000000..373cfdb5
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/webrat/element_locator.rb
@@ -0,0 +1,89 @@
+require 'webrat'
+
+module Webrat
+ class Element
+ # Returns an Array of Array of String where each String is a
+ # "cell" in the table-like structure represented by this Element.
+ #
+ # Supported elements are table, dl, ol and ul. Different conversion
+ # strategies are used depending on the kind of element:
+ #
+ # * table : Each tr becomes a row. The innerHTML of each td or th inside becomes a cell. The number
+ # of columns is determined by the number of cells in the first row.
+ # * dl : Each dt becomes a row with 2 cells. The innerHTML of the dt itself and the next dd become cells.
+ # * ul or ol : Each li becomes a row with one cell, the innerHTML of the li.
+ #
+ def to_table
+ case element.name
+ when 'table'
+ table_from_table
+ when 'dl'
+ table_from_dl
+ when /ul|ol/
+ table_from_list
+ else
+ raise "#to_table not supported for #{element.name} elements"
+ end
+ end
+
+ def table_from_table #:nodoc:
+ col_count = nil
+ Webrat::XML.css_search(element, 'tr').map do |row|
+ cols = Webrat::XML.css_search(row, 'th,td')
+ col_count ||= cols.length
+ cols[0...col_count].map do |col|
+ col.inner_html
+ end
+ end
+ end
+
+ def table_from_dl #:nodoc:
+ Webrat::XML.css_search(@element, 'dt').map do |dt|
+ next_node = dt.next_sibling
+ while next_node.name != 'dd'
+ next_node = next_node.next_sibling
+ end
+ [dt.inner_html, next_node.inner_html]
+ end
+ end
+
+ def table_from_list #:nodoc:
+ Webrat::XML.css_search(@element, 'li').map do |li|
+ [li.inner_html]
+ end
+ end
+
+ alias to_a to_table # Backwards compatibility with Cucumber
+ end
+
+ module Locators
+ class ElementLocator < Locator #:nodoc:
+ def locate
+ Element.load(@session, table_element)
+ end
+
+ def table_element
+ Webrat::XML.css_search(@dom, @value)[0]
+ end
+
+ def error_message
+ "Could not find anything matching '#{@value}'"
+ end
+ end
+
+ # Returns a Webrat DOM element located by +css_selector+.
+ def element_at(css_selector)
+ ElementLocator.new(@session, dom, css_selector).locate!
+ end
+
+ alias table_at element_at # Backwards compatibility with Cucumber
+ end
+
+ module Methods #:nodoc:
+ delegate_to_session :element_at, :table_at
+ end
+
+ class Session #:nodoc:
+ def_delegators :current_scope, :element_at, :table_at
+ end
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/webrat/table_locator.rb b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/webrat/table_locator.rb
new file mode 100755
index 00000000..f6b12388
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/webrat/table_locator.rb
@@ -0,0 +1 @@
+require 'cucumber/webrat/element_locator'
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/wire_support/connection.rb b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/wire_support/connection.rb
new file mode 100755
index 00000000..0fcff354
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/wire_support/connection.rb
@@ -0,0 +1,42 @@
+require 'timeout'
+require 'cucumber/wire_support/wire_protocol'
+
+module Cucumber
+ module WireSupport
+ class Connection
+ include WireProtocol
+
+ def initialize(config)
+ @host, @port = config['host'], config['port']
+ end
+
+ def call_remote(response_handler, message, params)
+ timeout = 3
+ packet = WirePacket.new(message, params)
+
+ begin
+ send_data_to_socket(packet.to_json, timeout)
+ response = fetch_data_from_socket(timeout)
+ response.handle_with(response_handler)
+ rescue Timeout::Error
+ raise "Timed out calling server with message #{message}"
+ end
+ end
+
+ private
+
+ def send_data_to_socket(data, timeout)
+ Timeout.timeout(timeout) { socket.puts(data) }
+ end
+
+ def fetch_data_from_socket(timeout)
+ raw_response = Timeout.timeout(timeout) { socket.gets }
+ WirePacket.parse(raw_response)
+ end
+
+ def socket
+ @socket ||= TCPSocket.new(@host, @port)
+ end
+ end
+ end
+end
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/wire_support/request_handler.rb b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/wire_support/request_handler.rb
new file mode 100755
index 00000000..21bff901
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/wire_support/request_handler.rb
@@ -0,0 +1,19 @@
+module Cucumber
+ module WireSupport
+ class RequestHandler
+ def initialize(connection, message, &block)
+ @connection = connection
+ @message = message
+ instance_eval(&block) if block
+ end
+
+ def execute(request_params)
+ @connection.call_remote(self, @message, request_params)
+ end
+
+ def handle_fail(params)
+ raise WireException.new(params)
+ end
+ end
+ end
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/wire_support/wire_exception.rb b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/wire_support/wire_exception.rb
new file mode 100755
index 00000000..7c8e5a6e
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/wire_support/wire_exception.rb
@@ -0,0 +1,10 @@
+module Cucumber
+ module WireSupport
+ # Proxy for an exception that occured at the remote end of the wire
+ class WireException < StandardError
+ def initialize(args)
+ super args['message']
+ end
+ end
+ end
+end
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/wire_support/wire_language.rb b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/wire_support/wire_language.rb
new file mode 100755
index 00000000..e0f4c2d2
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/wire_support/wire_language.rb
@@ -0,0 +1,52 @@
+require 'socket'
+require 'json'
+require 'cucumber/wire_support/connection'
+require 'cucumber/wire_support/wire_packet'
+require 'cucumber/wire_support/wire_exception'
+require 'cucumber/wire_support/wire_step_definition'
+
+module Cucumber
+ module WireSupport
+
+ # The wire-protocol (lanugage independent) implementation of the programming language API.
+ class WireLanguage
+ include LanguageSupport::LanguageMethods
+
+ def load_code_file(wire_file)
+ config = YAML.load_file(wire_file)
+ @connections << Connection.new(config)
+ end
+
+ def step_matches(step_name, formatted_step_name)
+ @connections.map{ |remote| remote.step_matches(step_name, formatted_step_name)}.flatten
+ end
+
+ def initialize(step_mother)
+ @connections = []
+ end
+
+ def alias_adverbs(adverbs)
+ end
+
+ def snippet_text(step_keyword, step_name, multiline_arg_class)
+ "Snippets are not implemented for the wire yet"
+ end
+
+ protected
+
+ def begin_scenario(scenario)
+ @connections.each { |remote| remote.begin_scenario(scenario) }
+ end
+
+ def end_scenario
+ @connections.each { |remote| remote.end_scenario }
+ end
+
+ private
+
+ def step_definitions
+ @step_definitions ||= {}
+ end
+ end
+ end
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/wire_support/wire_packet.rb b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/wire_support/wire_packet.rb
new file mode 100755
index 00000000..630dc553
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/wire_support/wire_packet.rb
@@ -0,0 +1,34 @@
+module Cucumber
+ module WireSupport
+ # Represents the packet of data sent over the wire as JSON data, containing
+ # a message and a hash of arguments
+ class WirePacket
+ class << self
+ def parse(raw)
+ attributes = JSON.parse(raw.strip)
+ message = attributes[0]
+ params = attributes[1]
+ new(message, params)
+ end
+ end
+
+ attr_reader :message, :params
+
+ def initialize(message, params)
+ @message, @params = message, params
+ end
+
+ def to_json
+ [@message, @params].to_json
+ end
+
+ def raise_if_bad
+ raise WireException.new(@params) if @message == 'fail' || @message == 'step_failed'
+ end
+
+ def handle_with(handler)
+ handler.send("handle_#{@message}", @params)
+ end
+ end
+ end
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/wire_support/wire_protocol.rb b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/wire_support/wire_protocol.rb
new file mode 100755
index 00000000..ffc6bbf7
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/wire_support/wire_protocol.rb
@@ -0,0 +1,64 @@
+require 'cucumber/step_argument'
+require 'cucumber/wire_support/request_handler'
+
+module Cucumber
+ module WireSupport
+ module WireProtocol
+ def step_matches(name_to_match, name_to_report)
+ @name_to_match, @name_to_report = name_to_match, name_to_report
+ make_request(:step_matches, :name_to_match => name_to_match) do
+ def handle_step_matches(params)
+ params.map do |raw_step_match|
+ step_definition = WireStepDefinition.new(raw_step_match['id'], @connection)
+ step_args = raw_step_match['args'].map do |raw_arg|
+ StepArgument.new(raw_arg['val'], raw_arg['pos'])
+ end
+ @connection.step_match(step_definition, step_args) # convoluted!
+ end
+ end
+ end
+ end
+
+ def step_match(step_definition, step_args)
+ StepMatch.new(step_definition, @name_to_match, @name_to_report, step_args)
+ end
+
+ def invoke(step_definition_id, args)
+ request_params = { :id => step_definition_id, :args => args }
+
+ make_request(:invoke, request_params) do
+ def handle_success(params)
+ end
+
+ def handle_step_failed(params)
+ handle_fail(params)
+ end
+ end
+ end
+
+ def begin_scenario(scenario)
+ make_request(:begin_scenario) do
+ def handle_success(params)
+ end
+ end
+ end
+
+ def end_scenario
+ make_request(:end_scenario) do
+ def handle_success(params)
+ end
+ end
+ end
+
+ private
+
+ def handler(request_message, &block)
+ RequestHandler.new(self, request_message, &block)
+ end
+
+ def make_request(request_message, params = nil, &block)
+ handler(request_message, &block).execute(params)
+ end
+ end
+ end
+end
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/wire_support/wire_step_definition.rb b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/wire_support/wire_step_definition.rb
new file mode 100755
index 00000000..abf655ba
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/lib/cucumber/wire_support/wire_step_definition.rb
@@ -0,0 +1,21 @@
+module Cucumber
+ module WireSupport
+ class WireStepDefinition
+ def initialize(id, connection)
+ @id, @connection = id, connection
+ end
+
+ def invoke(args)
+ @connection.invoke(@id, args)
+ end
+
+ def regexp_source
+ "/FIXME/"
+ end
+
+ def file_colon_line
+ "FIXME:0"
+ end
+ end
+ end
+end
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/rails_generators/cucumber/USAGE b/vendor/gems/gems/cucumber-0.4.4/rails_generators/cucumber/USAGE
new file mode 100755
index 00000000..11e6c9e0
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/rails_generators/cucumber/USAGE
@@ -0,0 +1,11 @@
+Description:
+ Sets up Cucumber in your Rails project. After running this generator you will
+ get a new rake task called features.
+
+ This also generates the necessary files in the features directory.
+
+ Also see the feature generator, which you can use to generate skeletons
+ for new features.
+
+Examples:
+ `./script/generate cucumber`
diff --git a/vendor/gems/gems/cucumber-0.4.4/rails_generators/cucumber/cucumber_generator.rb b/vendor/gems/gems/cucumber-0.4.4/rails_generators/cucumber/cucumber_generator.rb
new file mode 100755
index 00000000..700da65a
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/rails_generators/cucumber/cucumber_generator.rb
@@ -0,0 +1,117 @@
+require 'rbconfig'
+require 'cucumber/platform'
+
+# This generator bootstraps a Rails project for use with Cucumber
+class CucumberGenerator < Rails::Generator::Base
+ DEFAULT_SHEBANG = File.join(Config::CONFIG['bindir'],
+ Config::CONFIG['ruby_install_name'])
+
+ attr_accessor :framework
+
+ def manifest
+ record do |m|
+ m.directory 'features/step_definitions'
+ m.template 'webrat_steps.rb', 'features/step_definitions/webrat_steps.rb'
+ m.template'cucumber_environment.rb', 'config/environments/cucumber.rb',
+ :assigns => { :cucumber_version => ::Cucumber::VERSION }
+
+ m.gsub_file 'config/database.yml', /test:.*\n/, "test: &TEST\n"
+ unless File.read('config/database.yml').include? 'cucumber:'
+ m.gsub_file 'config/database.yml', /\z/, "\ncucumber:\n <<: *TEST"
+ end
+
+ m.directory 'features/support'
+ if spork?
+ m.template'spork_env.rb', 'features/support/env.rb'
+ else
+ m.template 'env.rb', 'features/support/env.rb'
+ end
+ m.template 'paths.rb', 'features/support/paths.rb'
+ m.template 'version_check.rb', 'features/support/version_check.rb'
+
+ m.directory 'lib/tasks'
+ m.template'cucumber.rake', 'lib/tasks/cucumber.rake'
+
+ m.file 'cucumber', 'script/cucumber', {
+ :chmod => 0755, :shebang => options[:shebang] == DEFAULT_SHEBANG ? nil : options[:shebang]
+ }
+ end
+ end
+
+ def framework
+ options[:framework] ||= detect_default_framework!
+ end
+
+ def spork?
+ options[:spork]
+ end
+
+protected
+
+ def detect_default_framework!
+ require 'rubygems'
+ rspec! || testunit!
+ raise "I don't know what test framework you want. Use --rspec or --testunit, or gem install rspec or test-unit." unless @default_framework
+ @default_framework
+ end
+
+ def rspec!
+ begin
+ require 'spec'
+ @default_framework = :rspec
+ rescue LoadError
+ false
+ end
+ end
+
+ def testunit!
+ begin
+ require 'test/unit'
+ @default_framework = :testunit
+ rescue LoadError
+ false
+ end
+ end
+
+ def banner
+ "Usage: #{$0} cucumber"
+ end
+
+ def after_generate
+ require 'cucumber/formatter/ansicolor'
+ extend Cucumber::Formatter::ANSIColor
+
+ if @default_framework
+ puts <<-WARNING
+
+#{yellow_cukes(15)}
+
+ #{yellow_cukes(1)} T E S T F R A M E W O R K A L E R T #{yellow_cukes(1)}
+
+You didn't explicitly generate with --rspec or --testunit, so I looked at
+your gems and saw that you had #{green(@default_framework.to_s)} installed, so I went with that.
+If you want something else, be specific about it. Otherwise, relax.
+
+#{yellow_cukes(15)}
+
+WARNING
+ end
+ end
+
+ def add_options!(opt)
+ opt.separator ''
+ opt.separator 'Options:'
+ opt.on('--rspec', "Setup cucumber for use with RSpec") do |value|
+ options[:framework] = :rspec
+ end
+
+ opt.on('--testunit', "Setup cucumber for use with test/unit") do |value|
+ options[:framework] = :testunit
+ end
+
+ opt.on('--spork', 'Setup cucumber for use with Spork') do |value|
+ options[:spork] = true
+ end
+ end
+
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/rails_generators/cucumber/templates/cucumber b/vendor/gems/gems/cucumber-0.4.4/rails_generators/cucumber/templates/cucumber
new file mode 100755
index 00000000..9dd05ab2
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/rails_generators/cucumber/templates/cucumber
@@ -0,0 +1,17 @@
+#!/usr/bin/env ruby
+
+vendored_cucumber_binary = Dir[File.join(File.dirname(__FILE__),
+ '..',
+ 'vendor',
+ '{gems,plugins}',
+ 'cucumber*',
+ 'bin',
+ 'cucumber')].first
+
+if vendored_cucumber_binary
+ load File.expand_path(vendored_cucumber_binary)
+else
+ require 'rubygems' unless ENV['NO_RUBYGEMS']
+ require 'cucumber'
+ load Cucumber::BINARY
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/rails_generators/cucumber/templates/cucumber.rake b/vendor/gems/gems/cucumber-0.4.4/rails_generators/cucumber/templates/cucumber.rake
new file mode 100755
index 00000000..d5cb5816
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/rails_generators/cucumber/templates/cucumber.rake
@@ -0,0 +1,46 @@
+# This file was generated by
+# Find vendored gem or plugin of cucumber
+vendored_cucumber_dir = Dir["#{RAILS_ROOT}/vendor/{gems,plugins}/cucumber*"].first
+$LOAD_PATH.unshift("#{vendored_cucumber_dir}/lib") unless vendored_cucumber_dir.nil?
+
+unless ARGV.any? {|a| a =~ /^gems/}
+
+begin
+ require 'cucumber/rake/task'
+
+ # Use vendored cucumber binary if possible. If it's not vendored,
+ # Cucumber::Rake::Task will automatically use installed gem's cucumber binary
+ vendored_cucumber_binary = "#{vendored_cucumber_dir}/bin/cucumber" unless vendored_cucumber_dir.nil?
+
+ namespace :cucumber do
+ Cucumber::Rake::Task.new({:ok => 'db:test:prepare'}, 'Run features that should pass') do |t|
+ t.binary = vendored_cucumber_binary
+ t.fork = true # You may get faster startup if you set this to false
+ t.cucumber_opts = "--color --tags ~@wip --strict --format #{ENV['CUCUMBER_FORMAT'] || 'pretty'}<%= spork? ? ' --drb' : '' %>"
+ end
+
+ Cucumber::Rake::Task.new({:wip => 'db:test:prepare'}, 'Run features that are being worked on') do |t|
+ t.binary = vendored_cucumber_binary
+ t.fork = true # You may get faster startup if you set this to false
+ t.cucumber_opts = "--color --tags @wip:2 --wip --format #{ENV['CUCUMBER_FORMAT'] || 'pretty'}<%= spork? ? ' --drb' : '' %>"
+ end
+
+ desc 'Run all features'
+ task :all => [:ok, :wip]
+ end
+ desc 'Alias for cucumber:ok'
+ task :cucumber => 'cucumber:ok'
+
+ task :default => :cucumber
+
+ task :features => :cucumber do
+ STDERR.puts "*** The 'features' task is deprecated. See rake -T cucumber ***"
+ end
+rescue LoadError
+ desc 'cucumber rake task not available (cucumber not installed)'
+ task :cucumber do
+ abort 'Cucumber rake task is not available. Be sure to install cucumber as a gem or plugin'
+ end
+end
+
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/rails_generators/cucumber/templates/cucumber_environment.rb b/vendor/gems/gems/cucumber-0.4.4/rails_generators/cucumber/templates/cucumber_environment.rb
new file mode 100755
index 00000000..7972f1c8
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/rails_generators/cucumber/templates/cucumber_environment.rb
@@ -0,0 +1,30 @@
+# IMPORTANT: This file was generated by Cucumber <%= Cucumber::VERSION %>
+# Edit at your own peril - it's recommended to regenerate this file
+# in the future when you upgrade to a newer version of Cucumber.
+
+config.cache_classes = true # This must be true for Cucumber to operate correctly!
+
+# Log error messages when you accidentally call methods on nil.
+config.whiny_nils = true
+
+# Show full error reports and disable caching
+config.action_controller.consider_all_requests_local = true
+config.action_controller.perform_caching = false
+
+# Disable request forgery protection in test environment
+config.action_controller.allow_forgery_protection = false
+
+# Tell Action Mailer not to deliver emails to the real world.
+# The :test delivery method accumulates sent emails in the
+# ActionMailer::Base.deliveries array.
+config.action_mailer.delivery_method = :test
+
+config.gem 'cucumber', :lib => false, :version => '>=<%= cucumber_version %>' unless File.directory?(File.join(Rails.root, 'vendor/plugins/cucumber'))
+config.gem 'webrat', :lib => false, :version => '>=0.5.3' unless File.directory?(File.join(Rails.root, 'vendor/plugins/webrat'))
+<% if framework == :rspec -%>
+config.gem 'rspec', :lib => false, :version => '>=1.2.9' unless File.directory?(File.join(Rails.root, 'vendor/plugins/rspec'))
+config.gem 'rspec-rails', :lib => false, :version => '>=1.2.9' unless File.directory?(File.join(Rails.root, 'vendor/plugins/rspec-rails'))
+<% end %>
+<% if spork? -%>
+config.gem 'spork', :lib => false, :version => '>=0.7.3' unless File.directory?(File.join(Rails.root, 'vendor/plugins/spork'))
+<% end %>
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/rails_generators/cucumber/templates/env.rb b/vendor/gems/gems/cucumber-0.4.4/rails_generators/cucumber/templates/env.rb
new file mode 100755
index 00000000..ad06697d
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/rails_generators/cucumber/templates/env.rb
@@ -0,0 +1,49 @@
+# IMPORTANT: This file was generated by Cucumber <%= Cucumber::VERSION %>
+# Edit at your own peril - it's recommended to regenerate this file
+# in the future when you upgrade to a newer version of Cucumber.
+# Consider adding your own code to a new file instead of editing this one.
+
+# Sets up the Rails environment for Cucumber
+ENV["RAILS_ENV"] ||= "cucumber"
+require File.expand_path(File.dirname(__FILE__) + '/../../config/environment')
+require 'cucumber/rails/world'
+
+# If you set this to true, each scenario will run in a database transaction.
+# You can still turn off transactions on a per-scenario basis, simply tagging
+# a feature or scenario with the @no-txn tag.
+#
+# If you set this to false, transactions will be off for all scenarios,
+# regardless of whether you use @no-txn or not.
+#
+# Beware that turning transactions off will leave data in your database
+# after each scenario, which can lead to hard-to-debug failures in
+# subsequent scenarios. If you do this, we recommend you create a Before
+# block that will explicitly put your database in a known state.
+Cucumber::Rails::World.use_transactional_fixtures = true
+
+# If you set this to false, any error raised from within your app will bubble
+# up to your step definition and out to cucumber unless you catch it somewhere
+# on the way. You can make Rails rescue errors and render error pages on a
+# per-scenario basis by tagging a scenario or feature with the @allow-rescue tag.
+#
+# If you set this to true, Rails will rescue all errors and render error
+# pages, more or less in the same way your application would behave in the
+# default production environment. It's not recommended to do this for all
+# of your scenarios, as this makes it hard to discover errors in your application.
+ActionController::Base.allow_rescue = false
+
+require 'cucumber'
+# Comment out the next line if you don't want Cucumber Unicode support
+require 'cucumber/formatter/unicode'
+require 'cucumber/webrat/element_locator' # Lets you do table.diff!(element_at('#my_table_or_dl_or_ul_or_ol').to_table)
+<% if framework == :rspec -%>
+require 'cucumber/rails/rspec'
+<% end -%>
+
+require 'webrat'
+require 'webrat/core/matchers'
+Webrat.configure do |config|
+ config.mode = :rails
+ config.open_error_files = false # Set to true if you want error pages to pop up in the browser
+end
+
diff --git a/vendor/gems/gems/cucumber-0.4.4/rails_generators/cucumber/templates/paths.rb b/vendor/gems/gems/cucumber-0.4.4/rails_generators/cucumber/templates/paths.rb
new file mode 100755
index 00000000..7587dc15
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/rails_generators/cucumber/templates/paths.rb
@@ -0,0 +1,27 @@
+module NavigationHelpers
+ # Maps a name to a path. Used by the
+ #
+ # When /^I go to (.+)$/ do |page_name|
+ #
+ # step definition in webrat_steps.rb
+ #
+ def path_to(page_name)
+ case page_name
+
+ when /the home\s?page/
+ '/'
+
+ # Add more mappings here.
+ # Here is a more fancy example:
+ #
+ # when /^(.*)'s profile page$/i
+ # user_profile_path(User.find_by_login($1))
+
+ else
+ raise "Can't find mapping from \"#{page_name}\" to a path.\n" +
+ "Now, go and add a mapping in #{__FILE__}"
+ end
+ end
+end
+
+World(NavigationHelpers)
diff --git a/vendor/gems/gems/cucumber-0.4.4/rails_generators/cucumber/templates/spork_env.rb b/vendor/gems/gems/cucumber-0.4.4/rails_generators/cucumber/templates/spork_env.rb
new file mode 100755
index 00000000..55d4bb49
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/rails_generators/cucumber/templates/spork_env.rb
@@ -0,0 +1,57 @@
+# IMPORTANT: This file was generated by Cucumber <%= Cucumber::VERSION %>
+# Edit at your own peril - it's recommended to regenerate this file
+# in the future when you upgrade to a newer version of Cucumber.
+# Consider adding your own code to a new file instead of editing this one.
+
+require 'rubygems'
+require 'spork'
+
+Spork.prefork do
+ # Sets up the Rails environment for Cucumber
+ ENV["RAILS_ENV"] = "cucumber"
+ require File.expand_path(File.dirname(__FILE__) + '/../../config/environment')
+ require 'cucumber/rails/world'
+
+ require 'cucumber'
+ # Comment out the next line if you don't want Cucumber Unicode support
+ require 'cucumber/formatter/unicode'
+ require 'cucumber/webrat/element_locator' # Lets you do table.diff!(element_at('#my_table_or_dl_or_ul_or_ol').to_table)
+ <% if framework == :rspec -%>
+ require 'cucumber/rails/rspec'
+ <% end -%>
+
+ require 'webrat'
+ require 'webrat/core/matchers'
+ Webrat.configure do |config|
+ config.mode = :rails
+ config.open_error_files = false # Set to true if you want error pages to pop up in the browser
+ end
+end
+
+Spork.each_run do
+ # This code will be run each time you start cucumber.
+
+ # If you set this to true, each scenario will run in a database transaction.
+ # You can still turn off transactions on a per-scenario basis, simply tagging
+ # a feature or scenario with the @no-txn tag.
+ #
+ # If you set this to false, transactions will be off for all scenarios,
+ # regardless of whether you use @no-txn or not.
+ #
+ # Beware that turning transactions off will leave data in your database
+ # after each scenario, which can lead to hard-to-debug failures in
+ # subsequent scenarios. If you do this, we recommend you create a Before
+ # block that will explicitly put your database in a known state.
+ Cucumber::Rails::World.use_transactional_fixtures = true
+
+ # If you set this to false, any error raised from within your app will bubble
+ # up to your step definition and out to cucumber unless you catch it somewhere
+ # on the way. You can make Rails rescue errors and render error pages on a
+ # per-scenario basis by tagging a scenario or feature with the @allow-rescue tag.
+ #
+ # If you set this to true, Rails will rescue all errors and render error
+ # pages, more or less in the same way your application would behave in the
+ # default production environment. It's not recommended to do this for all
+ # of your scenarions, as this makes it hard to discover errors in your application.
+ ActionController::Base.allow_rescue = false
+end
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/rails_generators/cucumber/templates/version_check.rb b/vendor/gems/gems/cucumber-0.4.4/rails_generators/cucumber/templates/version_check.rb
new file mode 100755
index 00000000..b2486037
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/rails_generators/cucumber/templates/version_check.rb
@@ -0,0 +1,31 @@
+require 'cucumber/formatter/ansicolor'
+extend Cucumber::Formatter::ANSIColor
+if Cucumber::VERSION != '<%= Cucumber::VERSION %>'
+warning = <<-WARNING
+#{red_cukes(15)}
+
+ #{red_cukes(1)} R O T T E N C U C U M B E R A L E R T #{red_cukes(1)}
+
+Your #{__FILE__.gsub(/version_check.rb$/, 'env.rb')} file was generated with Cucumber <%= Cucumber::VERSION %>,
+but you seem to be running Cucumber #{Cucumber::VERSION}. If you're running an older
+version than #{Cucumber::VERSION}, just upgrade your gem. If you're running a newer
+version than #{Cucumber::VERSION} you should:
+
+ 1) Read http://wiki.github.com/aslakhellesoy/cucumber/upgrading
+
+ 2) Regenerate your cucumber environment with the following command:
+
+ ruby script/generate cucumber
+
+If you get prompted to replace a file, hit 'd' to see the difference.
+When you're sure you have captured any personal edits, confirm that you
+want to overwrite #{__FILE__.gsub(/version_check.rb$/, 'env.rb')} by pressing 'y'. Then reapply any
+personal changes that may have been overwritten, preferably in separate files.
+
+This message will then self destruct.
+
+#{red_cukes(15)}
+WARNING
+warn(warning)
+at_exit {warn(warning)}
+end
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/rails_generators/cucumber/templates/webrat_steps.rb b/vendor/gems/gems/cucumber-0.4.4/rails_generators/cucumber/templates/webrat_steps.rb
new file mode 100755
index 00000000..98249295
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/rails_generators/cucumber/templates/webrat_steps.rb
@@ -0,0 +1,241 @@
+# IMPORTANT: This file was generated by Cucumber <%= Cucumber::VERSION %>
+# Edit at your own peril - it's recommended to regenerate this file
+# in the future when you upgrade to a newer version of Cucumber.
+# Consider adding your own code to a new file instead of editing this one.
+
+require File.expand_path(File.join(File.dirname(__FILE__), "..", "support", "paths"))
+
+# Commonly used webrat steps
+# http://github.com/brynary/webrat
+
+Given /^(?:|I )am on (.+)$/ do |page_name|
+ visit path_to(page_name)
+end
+
+When /^(?:|I )go to (.+)$/ do |page_name|
+ visit path_to(page_name)
+end
+
+When /^(?:|I )press "([^\"]*)"$/ do |button|
+ click_button(button)
+end
+
+When /^(?:|I )follow "([^\"]*)"$/ do |link|
+ click_link(link)
+end
+
+When /^(?:|I )follow "([^\"]*)" within "([^\"]*)"$/ do |link, parent|
+ click_link_within(parent, link)
+end
+
+When /^(?:|I )fill in "([^\"]*)" with "([^\"]*)"$/ do |field, value|
+ fill_in(field, :with => value)
+end
+
+When /^(?:|I )fill in "([^\"]*)" for "([^\"]*)"$/ do |value, field|
+ fill_in(field, :with => value)
+end
+
+# Use this to fill in an entire form with data from a table. Example:
+#
+# When I fill in the following:
+# | Account Number | 5002 |
+# | Expiry date | 2009-11-01 |
+# | Note | Nice guy |
+# | Wants Email? | |
+#
+# TODO: Add support for checkbox, select og option
+# based on naming conventions.
+#
+When /^(?:|I )fill in the following:$/ do |fields|
+ fields.rows_hash.each do |name, value|
+ When %{I fill in "#{name}" with "#{value}"}
+ end
+end
+
+When /^(?:|I )select "([^\"]*)" from "([^\"]*)"$/ do |value, field|
+ select(value, :from => field)
+end
+
+# Use this step in conjunction with Rail's datetime_select helper. For example:
+# When I select "December 25, 2008 10:00" as the date and time
+When /^(?:|I )select "([^\"]*)" as the date and time$/ do |time|
+ select_datetime(time)
+end
+
+# Use this step when using multiple datetime_select helpers on a page or
+# you want to specify which datetime to select. Given the following view:
+# <%%= f.label :preferred %>
+# <%%= f.datetime_select :preferred %>
+# <%%= f.label :alternative %>
+# <%%= f.datetime_select :alternative %>
+# The following steps would fill out the form:
+# When I select "November 23, 2004 11:20" as the "Preferred" date and time
+# And I select "November 25, 2004 10:30" as the "Alternative" date and time
+When /^(?:|I )select "([^\"]*)" as the "([^\"]*)" date and time$/ do |datetime, datetime_label|
+ select_datetime(datetime, :from => datetime_label)
+end
+
+# Use this step in conjunction with Rail's time_select helper. For example:
+# When I select "2:20PM" as the time
+# Note: Rail's default time helper provides 24-hour time-- not 12 hour time. Webrat
+# will convert the 2:20PM to 14:20 and then select it.
+When /^(?:|I )select "([^\"]*)" as the time$/ do |time|
+ select_time(time)
+end
+
+# Use this step when using multiple time_select helpers on a page or you want to
+# specify the name of the time on the form. For example:
+# When I select "7:30AM" as the "Gym" time
+When /^(?:|I )select "([^\"]*)" as the "([^\"]*)" time$/ do |time, time_label|
+ select_time(time, :from => time_label)
+end
+
+# Use this step in conjunction with Rail's date_select helper. For example:
+# When I select "February 20, 1981" as the date
+When /^(?:|I )select "([^\"]*)" as the date$/ do |date|
+ select_date(date)
+end
+
+# Use this step when using multiple date_select helpers on one page or
+# you want to specify the name of the date on the form. For example:
+# When I select "April 26, 1982" as the "Date of Birth" date
+When /^(?:|I )select "([^\"]*)" as the "([^\"]*)" date$/ do |date, date_label|
+ select_date(date, :from => date_label)
+end
+
+When /^(?:|I )check "([^\"]*)"$/ do |field|
+ check(field)
+end
+
+When /^(?:|I )uncheck "([^\"]*)"$/ do |field|
+ uncheck(field)
+end
+
+When /^(?:|I )choose "([^\"]*)"$/ do |field|
+ choose(field)
+end
+
+When /^(?:|I )attach the file at "([^\"]*)" to "([^\"]*)"$/ do |path, field|
+ attach_file(field, path)
+end
+
+Then /^(?:|I )should see "([^\"]*)"$/ do |text|
+<% if framework == :rspec -%>
+ response.should contain(text)
+<% else -%>
+ assert_contain text
+<% end -%>
+end
+
+Then /^(?:|I )should see "([^\"]*)" within "([^\"]*)"$/ do |text, selector|
+ within(selector) do |content|
+<% if framework == :rspec -%>
+ content.should contain(text)
+<% else -%>
+ assert content.include?(text)
+<% end -%>
+ end
+end
+
+Then /^(?:|I )should see \/([^\/]*)\/$/ do |regexp|
+ regexp = Regexp.new(regexp)
+<% if framework == :rspec -%>
+ response.should contain(regexp)
+<% else -%>
+ assert_contain regexp
+<% end -%>
+end
+
+Then /^(?:|I )should see \/([^\/]*)\/ within "([^\"]*)"$/ do |regexp, selector|
+ within(selector) do |content|
+ regexp = Regexp.new(regexp)
+<% if framework == :rspec -%>
+ content.should contain(regexp)
+<% else -%>
+ assert content =~ regexp
+<% end -%>
+ end
+end
+
+Then /^(?:|I )should not see "([^\"]*)"$/ do |text|
+<% if framework == :rspec -%>
+ response.should_not contain(text)
+<% else -%>
+ assert_not_contain text
+<% end -%>
+end
+
+Then /^(?:|I )should not see "([^\"]*)" within "([^\"]*)"$/ do |text, selector|
+ within(selector) do |content|
+<% if framework == :rspec -%>
+ content.should_not contain(text)
+<% else -%>
+ assert !content.include?(text)
+<% end -%>
+ end
+end
+
+Then /^(?:|I )should not see \/([^\/]*)\/$/ do |regexp|
+ regexp = Regexp.new(regexp)
+<% if framework == :rspec -%>
+ response.should_not contain(regexp)
+<% else -%>
+ assert_not_contain regexp
+<% end -%>
+end
+
+Then /^(?:|I )should not see \/([^\/]*)\/ within "([^\"]*)"$/ do |regexp, selector|
+ within(selector) do |content|
+ regexp = Regexp.new(regexp)
+<% if framework == :rspec -%>
+ content.should_not contain(regexp)
+<% else -%>
+ assert content !~ regexp
+<% end -%>
+ end
+end
+
+Then /^the "([^\"]*)" field should contain "([^\"]*)"$/ do |field, value|
+<% if framework == :rspec -%>
+ field_labeled(field).value.should =~ /#{value}/
+<% else -%>
+ assert_match(/#{value}/, field_labeled(field).value)
+<% end -%>
+end
+
+Then /^the "([^\"]*)" field should not contain "([^\"]*)"$/ do |field, value|
+<% if framework == :rspec -%>
+ field_labeled(field).value.should_not =~ /#{value}/
+<% else -%>
+ assert_no_match(/#{value}/, field_labeled(field).value)
+<% end -%>
+end
+
+Then /^the "([^\"]*)" checkbox should be checked$/ do |label|
+<% if framework == :rspec -%>
+ field_labeled(label).should be_checked
+<% else -%>
+ assert field_labeled(label).checked?
+<% end -%>
+end
+
+Then /^the "([^\"]*)" checkbox should not be checked$/ do |label|
+<% if framework == :rspec -%>
+ field_labeled(label).should_not be_checked
+<% else -%>
+ assert !field_labeled(label).checked?
+<% end -%>
+end
+
+Then /^(?:|I )should be on (.+)$/ do |page_name|
+<% if framework == :rspec -%>
+ URI.parse(current_url).path.should == path_to(page_name)
+<% else -%>
+ assert_equal path_to(page_name), URI.parse(current_url).path
+<% end -%>
+end
+
+Then /^show me the page$/ do
+ save_and_open_page
+end
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/rails_generators/feature/USAGE b/vendor/gems/gems/cucumber-0.4.4/rails_generators/feature/USAGE
new file mode 100755
index 00000000..5ea2da56
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/rails_generators/feature/USAGE
@@ -0,0 +1,12 @@
+Description:
+ Generates a skeleton for a new feature. Both a simple .feature file and
+ a steps.rb file is generated. This generator should be used with moderation.
+ See http://github.com/aslakhellesoy/cucumber/wikis/feature-coupled-steps-antipattern
+ for details about the dangers involved.
+
+ This generator can take an optional list of attribute pairs similar to Rails'
+ built-in resource generator.
+
+Examples:
+ `./script/generate feature post` # no attributes
+ `./script/generate feature post title:string body:text published:boolean`
diff --git a/vendor/gems/gems/cucumber-0.4.4/rails_generators/feature/feature_generator.rb b/vendor/gems/gems/cucumber-0.4.4/rails_generators/feature/feature_generator.rb
new file mode 100755
index 00000000..6f9f878d
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/rails_generators/feature/feature_generator.rb
@@ -0,0 +1,40 @@
+# This generator generates a baic feature.
+class FeatureGenerator < Rails::Generator::NamedBase
+ def manifest
+ record do |m|
+ m.directory 'features/step_definitions'
+ m.template 'feature.erb', "features/manage_#{plural_name}.feature"
+ m.template 'steps.erb', "features/step_definitions/#{singular_name}_steps.rb"
+
+ m.gsub_file 'features/support/paths.rb', /'\/'/mi do |match|
+ "#{match}\n when /the new #{singular_name} page/\n new_#{singular_name}_path\n"
+ end
+ end
+ end
+
+ class NamedArg
+ attr_reader :name
+
+ def initialize(s)
+ @name, @type = *s.split(':')
+ end
+
+ def value(n)
+ if @type == 'boolean'
+ (n % 2) == 0
+ else
+ "#{@name} #{n}"
+ end
+ end
+ end
+
+ def named_args
+ args.map{|arg| NamedArg.new(arg)}
+ end
+
+ protected
+
+ def banner
+ "Usage: #{$0} feature ModelName [field:type, field:type]"
+ end
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/rails_generators/feature/templates/feature.erb b/vendor/gems/gems/cucumber-0.4.4/rails_generators/feature/templates/feature.erb
new file mode 100755
index 00000000..551c26bc
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/rails_generators/feature/templates/feature.erb
@@ -0,0 +1,31 @@
+Feature: Manage <%= plural_name %>
+ In order to [goal]
+ [stakeholder]
+ wants [behaviour]
+
+ Scenario: Register new <%= singular_name %>
+ Given I am on the new <%= singular_name %> page
+<% keyword = 'When' -%>
+<% named_args.each do |arg| -%>
+ <%= keyword %> I fill in "<%= arg.name.humanize %>" with "<%= arg.value(1) %>"
+<% keyword = 'And' -%>
+<% end -%>
+ And I press "Create"
+<% keyword = 'Then' -%>
+<% named_args.each do |arg| -%>
+ <%= keyword %> I should see "<%= arg.value(1) %>"
+<% keyword = 'And' -%>
+<% end -%>
+
+ Scenario: Delete <%= singular_name %>
+ Given the following <%= plural_name %>:
+ |<%= named_args.map(&:name).join('|') %>|
+<% (1..4).each do |n| -%>
+ |<%= named_args.map{|arg| arg.value(n)}.join('|') %>|
+<% end -%>
+ When I delete the 3rd <%= singular_name %>
+ Then I should see the following <%= plural_name %>:
+ |<%= named_args.map{|arg| arg.name.humanize}.join('|') %>|
+<% [1,2,4].each do |n| -%>
+ |<%= named_args.map{|arg| arg.value(n)}.join('|') %>|
+<% end -%>
diff --git a/vendor/gems/gems/cucumber-0.4.4/rails_generators/feature/templates/steps.erb b/vendor/gems/gems/cucumber-0.4.4/rails_generators/feature/templates/steps.erb
new file mode 100755
index 00000000..ad8e9e29
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/rails_generators/feature/templates/steps.erb
@@ -0,0 +1,14 @@
+Given /^the following <%= plural_name %>:$/ do |<%= plural_name %>|
+ <%= class_name %>.create!(<%= plural_name %>.hashes)
+end
+
+When /^I delete the (\d+)(?:st|nd|rd|th) <%= singular_name %>$/ do |pos|
+ visit <%= plural_name %>_url
+ within("table > tr:nth-child(#{pos.to_i+1})") do
+ click_link "Destroy"
+ end
+end
+
+Then /^I should see the following <%= plural_name %>:$/ do |expected_<%= plural_name %>_table|
+ expected_<%= plural_name %>_table.diff!(table_at('table').to_a)
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/spec/cucumber/ast/background_spec.rb b/vendor/gems/gems/cucumber-0.4.4/spec/cucumber/ast/background_spec.rb
new file mode 100755
index 00000000..0192c9c1
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/spec/cucumber/ast/background_spec.rb
@@ -0,0 +1,54 @@
+require File.dirname(__FILE__) + '/../../spec_helper'
+require 'cucumber/ast'
+require 'cucumber/rb_support/rb_language'
+
+module Cucumber
+ module Ast
+ describe Background do
+
+ before do
+ extend(RbSupport::RbDsl)
+ @step_mother = StepMother.new
+ @step_mother.load_natural_language('en')
+ @rb = @step_mother.load_programming_language('rb')
+
+ $x = $y = nil
+ Before do
+ $x = 2
+ end
+ Given /y is (\d+)/ do |n|
+ $y = $x * n.to_i
+ end
+
+ @visitor = TreeWalker.new(@step_mother)
+
+ @feature = mock('feature', :visit? => true).as_null_object
+ end
+
+ it "should execute Before blocks before background steps" do
+ background = Background.new(
+ comment=Comment.new(''),
+ line=2,
+ keyword="",
+ name="",
+ steps=[
+ Step.new(7, "Given", "y is 5")
+ ])
+
+ scenario = Scenario.new(
+ background,
+ comment=Comment.new(""),
+ tags=Tags.new(98,[]),
+ line=99,
+ keyword="",
+ name="",
+ steps=[]
+ )
+ background.feature = @feature
+ @visitor.visit_background(background)
+ $x.should == 2
+ $y.should == 10
+ end
+ end
+ end
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/spec/cucumber/ast/feature_element_spec.rb b/vendor/gems/gems/cucumber-0.4.4/spec/cucumber/ast/feature_element_spec.rb
new file mode 100755
index 00000000..9c42969f
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/spec/cucumber/ast/feature_element_spec.rb
@@ -0,0 +1,41 @@
+require File.dirname(__FILE__) + '/../../spec_helper'
+require 'cucumber/step_mother'
+require 'cucumber/ast'
+
+module Cucumber
+ module Ast
+ describe FeatureElement do
+ include FeatureElement
+
+ describe "with multiline names" do
+ it "should select the longest line as the text length" do
+ @keyword = "key"
+ @name = "short\nvery longer\ntiny"
+ text_length.should == 11 + Ast::Step::INDENT - 1
+ end
+
+ it "should add keyword to first lines length" do
+ @keyword = "key"
+ @name = "short\nvery longer\ntiny"
+
+ first_line_length.should == (@keyword.jlength) + (first_line_name_length = 5)
+ end
+ end
+
+ describe "with empty name" do
+ it "should only return the length of the keyword" do
+ @name = ""
+ @keyword = "key"
+
+ text_length.should == 3
+ end
+ end
+
+ it "should support checking if its name matches a list of regexps" do
+ @name = 'test'
+ matches_scenario_names?([/es/]).should be_true
+ end
+ end
+ end
+end
+
diff --git a/vendor/gems/gems/cucumber-0.4.4/spec/cucumber/ast/feature_factory.rb b/vendor/gems/gems/cucumber-0.4.4/spec/cucumber/ast/feature_factory.rb
new file mode 100755
index 00000000..926c3dd0
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/spec/cucumber/ast/feature_factory.rb
@@ -0,0 +1,62 @@
+require 'cucumber/ast'
+require 'cucumber/step_mother'
+
+module Cucumber
+ module Ast
+ module FeatureFactory
+ class MyWorld
+ def flunk
+ raise "I flunked"
+ end
+ end
+
+ def create_feature(dsl)
+ dsl.Given /^a (.*) step with an inline arg:$/ do |what, table|
+ end
+ dsl.Given /^a (.*) step$/ do |what|
+ flunk if what == 'failing'
+ end
+ dsl.World do
+ MyWorld.new
+ end
+
+ table = Ast::Table.new([
+ %w{1 22 333},
+ %w{4444 55555 666666}
+ ])
+ py_string = Ast::PyString.new(21, 22, %{
+ I like
+ Cucumber sandwich
+ }, 10)
+
+ background = Ast::Background.new(Ast::Comment.new(""), 2, "Background:", "",
+ [
+ Step.new(3, "Given", "a passing step")
+ ]
+ )
+
+ f = Ast::Feature.new(
+ background,
+ Ast::Comment.new("# My feature comment\n"),
+ Ast::Tags.new(6, ['one', 'two']),
+ "Pretty printing",
+ [Ast::Scenario.new(
+ background,
+ Ast::Comment.new(" # My scenario comment \n# On two lines \n"),
+ Ast::Tags.new(8, ['three', 'four']),
+ 9,
+ "Scenario:", "A Scenario",
+ [
+ Step.new(10, "Given", "a passing step with an inline arg:", table),
+ Step.new(11, "Given", "a happy step with an inline arg:", py_string),
+ Step.new(12, "Given", "a failing step")
+ ]
+ )]
+ )
+ f.file = 'features/pretty_printing.feature'
+ f.features = Features.new
+ f
+ end
+ end
+ end
+end
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/spec/cucumber/ast/feature_spec.rb b/vendor/gems/gems/cucumber-0.4.4/spec/cucumber/ast/feature_spec.rb
new file mode 100755
index 00000000..97d0c113
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/spec/cucumber/ast/feature_spec.rb
@@ -0,0 +1,44 @@
+require File.dirname(__FILE__) + '/../../spec_helper'
+require 'cucumber/ast/feature_factory'
+
+module Cucumber
+ module Ast
+ describe Feature do
+ include FeatureFactory
+
+ it "should convert to sexp" do
+ step_mother = StepMother.new
+ step_mother.load_natural_language('en')
+ step_mother.load_programming_language('rb')
+ dsl = Object.new
+ dsl.extend RbSupport::RbDsl
+
+ feature = create_feature(dsl)
+ feature.to_sexp.should ==
+ [:feature,
+ "features/pretty_printing.feature",
+ "Pretty printing",
+ [:comment, "# My feature comment\n"],
+ [:tag, "one"],
+ [:tag, "two"],
+ [:background, 2, 'Background:',
+ [:step, 3, "Given", "a passing step"]],
+ [:scenario, 9, "Scenario:",
+ "A Scenario",
+ [:comment, " # My scenario comment \n# On two lines \n"],
+ [:tag, "three"],
+ [:tag, "four"],
+ [:step_invocation, 3, "Given", "a passing step"], # From the background
+ [:step_invocation, 10, "Given", "a passing step with an inline arg:",
+ [:table,
+ [:row, -1,
+ [:cell, "1"], [:cell, "22"], [:cell, "333"]],
+ [:row, -1,
+ [:cell, "4444"], [:cell, "55555"], [:cell, "666666"]]]],
+ [:step_invocation, 11, "Given", "a happy step with an inline arg:",
+ [:py_string, "\n I like\nCucumber sandwich\n"]],
+ [:step_invocation, 12, "Given", "a failing step"]]]
+ end
+ end
+ end
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/spec/cucumber/ast/outline_table_spec.rb b/vendor/gems/gems/cucumber-0.4.4/spec/cucumber/ast/outline_table_spec.rb
new file mode 100755
index 00000000..df697f99
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/spec/cucumber/ast/outline_table_spec.rb
@@ -0,0 +1,21 @@
+require File.dirname(__FILE__) + '/../../spec_helper'
+
+module Cucumber::Ast
+ describe OutlineTable do
+ describe OutlineTable::ExampleRow do
+ describe "a header row" do
+ before(:each) do
+ @row = OutlineTable::ExampleRow.new(
+ mock('table', :index => 0),
+ [mock('cell', :status= => nil)]
+ )
+ end
+
+ it "should raise an error if you try to call #failed?" do
+ @row.accept_plain mock('visitor', :visit_table_cell => nil)
+ lambda{ @row.failed? }.should raise_error(NoMethodError, /cannot pass or fail/)
+ end
+ end
+ end
+ end
+end
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/spec/cucumber/ast/py_string_spec.rb b/vendor/gems/gems/cucumber-0.4.4/spec/cucumber/ast/py_string_spec.rb
new file mode 100755
index 00000000..04274b5d
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/spec/cucumber/ast/py_string_spec.rb
@@ -0,0 +1,51 @@
+require File.dirname(__FILE__) + '/../../spec_helper'
+require 'cucumber/ast/py_string'
+
+module Cucumber
+ module Ast
+ describe PyString do
+ it "should handle unindented" do
+ ps = PyString.new(10, 13, "4.1\n4.2\n", 0)
+ ps.to_s.should == "4.1\n4.2\n"
+ end
+
+ it "should handle indented" do
+ # """
+ ps = PyString.new(10, 13, " 4.1\n 4.2\n", 2)
+ ps.to_s.should == " 4.1\n 4.2\n"
+ end
+
+ describe "replacing arguments" do
+
+ before(:each) do
+ @ps = PyString.new(10, 13, "\n\n", 0)
+ end
+
+ it "should return a new py_string with arguments replaced with values" do
+ py_string_with_replaced_arg = @ps.arguments_replaced({'' => 'Life is elsewhere', '' => '5'})
+
+ py_string_with_replaced_arg.to_s.should == "Life is elsewhere\n5\n"
+ end
+
+ it "should not change the original py_string" do
+ py_string_with_replaced_arg = @ps.arguments_replaced({'' => 'Life is elsewhere'})
+
+ @ps.to_s.should_not include("Life is elsewhere")
+ end
+
+ it "should replaced nil with empty string" do
+ ps = PyString.new(10, 13, "''", 0)
+ py_string_with_replaced_arg = ps.arguments_replaced({'' => nil})
+
+ py_string_with_replaced_arg.to_s.should == "''"
+ end
+
+ it "should recognise when just a subset of a cell is delimited" do
+ @ps.should have_text('')
+ end
+
+ end
+
+ end
+ end
+end
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/spec/cucumber/ast/scenario_outline_spec.rb b/vendor/gems/gems/cucumber-0.4.4/spec/cucumber/ast/scenario_outline_spec.rb
new file mode 100755
index 00000000..ecfb9364
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/spec/cucumber/ast/scenario_outline_spec.rb
@@ -0,0 +1,73 @@
+require File.dirname(__FILE__) + '/../../spec_helper'
+require 'cucumber/step_mother'
+require 'cucumber/ast'
+require 'cucumber/core_ext/string'
+require 'cucumber/rb_support/rb_language'
+
+module Cucumber
+ module Ast
+ describe ScenarioOutline do
+ before do
+ @step_mother = StepMother.new
+ @step_mother.load_programming_language('rb')
+ @step_mother.load_natural_language('en')
+ @dsl = Object.new
+ @dsl.extend(RbSupport::RbDsl)
+
+ @dsl.Given(/^there are (\d+) cucumbers$/) do |n|
+ @initial = n.to_i
+ end
+ @dsl.When(/^I eat (\d+) cucumbers$/) do |n|
+ @eaten = n.to_i
+ end
+ @dsl.Then(/^I should have (\d+) cucumbers$/) do |n|
+ (@initial - @eaten).should == n.to_i
+ end
+ @dsl.Then(/^I should have (\d+) cucumbers in my belly$/) do |n|
+ @eaten.should == n.to_i
+ end
+
+ @scenario_outline = ScenarioOutline.new(
+ background=nil,
+ Comment.new(""),
+ Tags.new(18, []),
+ 19,
+ "Scenario:", "My outline",
+ [
+ Step.new(20, 'Given', 'there are cucumbers'),
+ Step.new(21, 'When', 'I eat cucumbers'),
+ Step.new(22, 'Then', 'I should have cucumbers'),
+ Step.new(23, 'And', 'I should have cucumbers in my belly')
+ ],
+ [
+ [
+ Comment.new("#Mmmm... cucumbers\n"),
+ 24,
+ 'Examples:',
+ 'First table',
+ [
+ %w{start eat left},
+ %w{12 5 7},
+ %w{20 6 14}
+ ]
+ ]
+ ]
+
+ )
+ end
+
+ it "should replace all variables and call outline once for each table row" do
+ visitor = TreeWalker.new(@step_mother)
+ visitor.should_receive(:visit_table_row).exactly(3).times
+ visitor.visit_feature_element(@scenario_outline)
+ end
+
+ it "should pretty print" do
+ require 'cucumber/formatter/pretty'
+ formatter = Formatter::Pretty.new(@step_mother, STDOUT, {:comment => true, :tag_names => {}})
+ visitor = TreeWalker.new(@step_mother, [formatter])
+ visitor.visit_feature_element(@scenario_outline)
+ end
+ end
+ end
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/spec/cucumber/ast/scenario_spec.rb b/vendor/gems/gems/cucumber-0.4.4/spec/cucumber/ast/scenario_spec.rb
new file mode 100755
index 00000000..7d9646de
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/spec/cucumber/ast/scenario_spec.rb
@@ -0,0 +1,45 @@
+require File.dirname(__FILE__) + '/../../spec_helper'
+require 'cucumber/step_mother'
+require 'cucumber/ast'
+require 'cucumber/rb_support/rb_language'
+
+module Cucumber
+ module Ast
+ describe Scenario do
+ before do
+ @step_mother = StepMother.new
+ @step_mother.load_natural_language('en')
+ @step_mother.load_programming_language('rb')
+ @dsl = Object.new
+ @dsl.extend(RbSupport::RbDsl)
+
+ $x = $y = nil
+ @dsl.Given /y is (\d+)/ do |n|
+ $y = n.to_i
+ end
+ @visitor = TreeWalker.new(@step_mother)
+ @visitor.options = {}
+ end
+
+ it "should skip steps when previous is not passed" do
+ scenario = Scenario.new(
+ background=nil,
+ comment=Comment.new(""),
+ tags=Tags.new(98, []),
+ line=99,
+ keyword="",
+ name="",
+ steps=[
+ Step.new(7, "Given", "this is missing"),
+ Step.new(8, "Given", "y is 5")
+ ]
+ )
+ scenario.feature = mock('feature', :null_object => true)
+ @visitor.visit_feature_element(scenario)
+
+ $y.should == nil
+ end
+
+ end
+ end
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/spec/cucumber/ast/step_collection_spec.rb b/vendor/gems/gems/cucumber-0.4.4/spec/cucumber/ast/step_collection_spec.rb
new file mode 100755
index 00000000..fb07e778
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/spec/cucumber/ast/step_collection_spec.rb
@@ -0,0 +1,17 @@
+require File.dirname(__FILE__) + '/../../spec_helper'
+
+module Cucumber
+ module Ast
+ describe StepCollection do
+ it "should convert And to Given in snippets" do
+ s1 = Step.new(1, 'Given', 'cukes')
+ s2 = Step.new(2, 'And', 'turnips')
+ s1.stub!(:language).and_return(Parser::NaturalLanguage.get(nil, 'en'))
+ s2.stub!(:language).and_return(Parser::NaturalLanguage.get(nil, 'en'))
+ c = StepCollection.new([s1, s2])
+ actual_keywords = c.step_invocations.map{|i| i.actual_keyword}
+ actual_keywords.should == %w{Given Given}
+ end
+ end
+ end
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/spec/cucumber/ast/step_spec.rb b/vendor/gems/gems/cucumber-0.4.4/spec/cucumber/ast/step_spec.rb
new file mode 100755
index 00000000..05e1ae83
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/spec/cucumber/ast/step_spec.rb
@@ -0,0 +1,66 @@
+require File.dirname(__FILE__) + '/../../spec_helper'
+require 'cucumber/step_mother'
+require 'cucumber/ast'
+require 'cucumber/core_ext/string'
+
+module Cucumber
+ module Ast
+ describe Step do
+ it "should replace arguments in name" do
+ step = Step.new(1, 'Given', 'a cucumber')
+
+ invocation_table = Table.new([
+ %w{color taste},
+ %w{green juicy}
+ ])
+ cells = invocation_table.cells_rows[1]
+ step_invocation = step.step_invocation_from_cells(cells)
+
+ step_invocation.name.should == 'a green cucumber'
+ end
+
+ it "should use empty string for the replacement of arguments in name when replace value is nil" do
+ step = Step.new(1, 'Given', 'a cucumber')
+
+ invocation_table = Table.new([
+ ['color'],
+ [nil]
+ ])
+ cells = invocation_table.cells_rows[1]
+ step_invocation = step.step_invocation_from_cells(cells)
+
+ step_invocation.name.should == 'a cucumber'
+ end
+
+ it "should replace arguments in table arg" do
+ arg_table = Table.new([%w{taste_ color_}])
+
+ step = Step.new(1, 'Given', 'a cucumber', arg_table)
+
+ invocation_table = Table.new([
+ %w{color taste},
+ %w{green juicy}
+ ])
+ cells = invocation_table.cells_rows[1]
+ step_invocation = step.step_invocation_from_cells(cells)
+
+ step_invocation.instance_variable_get('@multiline_arg').raw.should == [%w{taste_juicy color_green}]
+ end
+
+ it "should replace arguments in py string arg" do
+ py_string = PyString.new(1, 2, 'taste_ color_', 0)
+
+ step = Step.new(1, 'Given', 'a cucumber', py_string)
+
+ invocation_table = Table.new([
+ %w{color taste},
+ %w{green juicy}
+ ])
+ cells = invocation_table.cells_rows[1]
+ step_invocation = step.step_invocation_from_cells(cells)
+
+ step_invocation.instance_variable_get('@multiline_arg').to_s.should == 'taste_juicy color_green'
+ end
+ end
+ end
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/spec/cucumber/ast/table_spec.rb b/vendor/gems/gems/cucumber-0.4.4/spec/cucumber/ast/table_spec.rb
new file mode 100755
index 00000000..8ffc5557
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/spec/cucumber/ast/table_spec.rb
@@ -0,0 +1,422 @@
+# encoding: utf-8
+require File.dirname(__FILE__) + '/../../spec_helper'
+require 'cucumber/ast/table'
+
+module Cucumber
+ module Ast
+ describe Table do
+ before do
+ @table = Table.new([
+ %w{one four seven},
+ %w{4444 55555 666666}
+ ])
+ def @table.cells_rows; super; end
+ def @table.columns; super; end
+ end
+
+ it "should have rows" do
+ @table.cells_rows[0].map{|cell| cell.value}.should == %w{one four seven}
+ end
+
+ it "should have columns" do
+ @table.columns[1].map{|cell| cell.value}.should == %w{four 55555}
+ end
+
+ it "should have headers" do
+ @table.headers.should == %w{one four seven}
+ end
+
+ it "should have same cell objects in rows and columns" do
+ # 666666
+ @table.cells_rows[1].__send__(:[], 2).should equal(@table.columns[2].__send__(:[], 1))
+ end
+
+ it "should know about max width of a row" do
+ @table.columns[1].__send__(:width).should == 5
+ end
+
+ it "should be convertible to an array of hashes" do
+ @table.hashes.should == [
+ {'one' => '4444', 'four' => '55555', 'seven' => '666666'}
+ ]
+ end
+
+ it "should accept symbols as keys for the hashes" do
+ @table.hashes.first[:one].should == '4444'
+ end
+
+ it "should allow map'ing columns" do
+ @table.map_column!('one') { |v| v.to_i }
+ @table.hashes.first['one'].should == 4444
+ end
+
+ it "should pass silently if a mapped column does not exist in non-strict mode" do
+ lambda {
+ @table.map_column!('two', false) { |v| v.to_i }
+ }.should_not raise_error
+ end
+
+ it "should fail if a mapped column does not exist in strict mode" do
+ lambda {
+ @table.map_column!('two', true) { |v| v.to_i }
+ }.should raise_error('The column named "two" does not exist')
+ end
+
+ describe "#match" do
+ before(:each) do
+ @table = Table.new([
+ %w{one four seven},
+ %w{4444 55555 666666}
+ ])
+ end
+
+ it "returns nil if headers do not match" do
+ @table.match('does,not,match').should be_nil
+ end
+ it "requires a table: prefix on match" do
+ @table.match('table:one,four,seven').should_not be_nil
+ end
+ it "does not match if no table: prefix on match" do
+ @table.match('one,four,seven').should be_nil
+ end
+ end
+ describe "#transpose" do
+ before(:each) do
+ @table = Table.new([
+ %w{one 1111},
+ %w{two 22222}
+ ])
+ end
+
+ it "should be convertible in to an array where each row is a hash" do
+ @table.transpose.hashes[0].should == {'one' => '1111', 'two' => '22222'}
+ end
+ end
+
+ describe "#rows_hash" do
+
+ it "should return a hash of the rows" do
+ table = Table.new([
+ %w{one 1111},
+ %w{two 22222}
+ ])
+ table.rows_hash.should == {'one' => '1111', 'two' => '22222'}
+ end
+
+ it "should fail if the table doesn't have two columns" do
+ faulty_table = Table.new([
+ %w{one 1111 abc},
+ %w{two 22222 def}
+ ])
+ lambda {
+ faulty_table.rows_hash
+ }.should raise_error('The table must have exactly 2 columns')
+ end
+ end
+
+ describe '#map_headers' do
+ it "renames the columns to the specified values in the provided hash" do
+ table2 = @table.map_headers('one' => :three)
+ table2.hashes.first[:three].should == '4444'
+ end
+
+ it "allows renaming columns using regexp" do
+ table2 = @table.map_headers(/one|uno/ => :three)
+ table2.hashes.first[:three].should == '4444'
+ end
+
+ it "copies column mappings" do
+ @table.map_column!('one') { |v| v.to_i }
+ table2 = @table.map_headers('one' => 'three')
+ table2.hashes.first['three'].should == 4444
+ end
+
+ it "takes a block and operates on all the headers with it" do
+ table = Table.new([
+ ['HELLO', 'WORLD'],
+ %w{4444 55555}
+ ])
+
+ table.map_headers! do |header|
+ header.downcase
+ end
+
+ table.hashes.first.keys.should =~ %w[hello world]
+ end
+
+ it "treats the mappings in the provided hash as overrides when used with a block" do
+ table = Table.new([
+ ['HELLO', 'WORLD'],
+ %w{4444 55555}
+ ])
+
+ table.map_headers!('WORLD' => 'foo') do |header|
+ header.downcase
+ end
+
+ table.hashes.first.keys.should =~ %w[hello foo]
+ end
+
+ end
+
+ describe "replacing arguments" do
+
+ before(:each) do
+ @table = Table.new([
+ %w{qty book},
+ %w{ }
+ ])
+ end
+
+ it "should return a new table with arguments replaced with values" do
+ table_with_replaced_args = @table.arguments_replaced({'' => 'Unbearable lightness of being', '' => '5'})
+
+ table_with_replaced_args.hashes[0]['book'].should == 'Unbearable lightness of being'
+ table_with_replaced_args.hashes[0]['qty'].should == '5'
+ end
+
+ it "should recognise when entire cell is delimited" do
+ @table.should have_text('')
+ end
+
+ it "should recognise when just a subset of a cell is delimited" do
+ table = Table.new([
+ %w{qty book},
+ [nil, "This is 's book"]
+ ])
+ table.should have_text('')
+ end
+
+ it "should replace nil values with nil" do
+ table_with_replaced_args = @table.arguments_replaced({'' => nil})
+
+ table_with_replaced_args.hashes[0]['book'].should == nil
+ end
+
+ it "should preserve values which don't match a placeholder when replacing with nil" do
+ table = Table.new([
+ %w{book},
+ %w{cat}
+ ])
+ table_with_replaced_args = table.arguments_replaced({'' => nil})
+
+ table_with_replaced_args.hashes[0]['book'].should == 'cat'
+ end
+
+ it "should not change the original table" do
+ @table.arguments_replaced({'' => 'Unbearable lightness of being'})
+
+ @table.hashes[0]['book'].should_not == 'Unbearable lightness of being'
+ end
+
+ it "should not raise an error when there are nil values in the table" do
+ table = Table.new([
+ ['book', 'qty'],
+ ['', nil],
+ ])
+ lambda{
+ table.arguments_replaced({'' => nil, '' => '5'})
+ }.should_not raise_error
+ end
+
+ end
+
+ describe "diff!" do
+ it "should detect a complex diff" do
+ t1 = table(%{
+ | 1 | 22 | 333 | 4444 |
+ | 55555 | 666666 | 7777777 | 88888888 |
+ | 999999999 | 0000000000 | 01010101010 | 121212121212 |
+ | 4000 | ABC | DEF | 50000 |
+ })
+
+ t2 = table(%{
+ | a | 4444 | 1 |
+ | bb | 88888888 | 55555 |
+ | ccc | xxxxxxxx | 999999999 |
+ | dddd | 4000 | 300 |
+ | e | 50000 | 4000 |
+ })
+ lambda{t1.diff!(t2)}.should raise_error
+ t1.to_s(:indent => 12, :color => false).should == %{
+ | 1 | (-) 22 | (-) 333 | 4444 | (+) a |
+ | 55555 | (-) 666666 | (-) 7777777 | 88888888 | (+) bb |
+ | (-) 999999999 | (-) 0000000000 | (-) 01010101010 | (-) 121212121212 | (+) |
+ | (+) 999999999 | (+) | (+) | (+) xxxxxxxx | (+) ccc |
+ | (+) 300 | (+) | (+) | (+) 4000 | (+) dddd |
+ | 4000 | (-) ABC | (-) DEF | 50000 | (+) e |
+ }
+ end
+
+ it "should not change table when diffed with identical" do
+ t = table(%{
+ |a|b|c|
+ |d|e|f|
+ |g|h|i|
+ })
+ t.diff!(t.dup)
+ t.to_s(:indent => 12, :color => false).should == %{
+ | a | b | c |
+ | d | e | f |
+ | g | h | i |
+ }
+ end
+
+ it "should inspect missing and surplus cells" do
+ t1 = Table.new([
+ ['name', 'male', 'lastname', 'swedish'],
+ ['aslak', 'true', 'hellesøy', 'false']
+ ])
+ t2 = Table.new([
+ ['name', 'male', 'lastname', 'swedish'],
+ ['aslak', true, 'hellesøy', false]
+ ])
+ lambda{t1.diff!(t2)}.should raise_error
+ t1.to_s(:indent => 12, :color => false).should == %{
+ | name | male | lastname | swedish |
+ | (-) aslak | (-) (i) "true" | (-) hellesøy | (-) (i) "false" |
+ | (+) aslak | (+) (i) true | (+) hellesøy | (+) (i) false |
+ }
+ end
+
+ it "should allow column mapping of target before diffing" do
+ t1 = Table.new([
+ ['name', 'male'],
+ ['aslak', 'true']
+ ])
+ t1.map_column!('male') { |m| m == 'true' }
+ t2 = Table.new([
+ ['name', 'male'],
+ ['aslak', true]
+ ])
+ t1.diff!(t2)
+ t1.to_s(:indent => 12, :color => false).should == %{
+ | name | male |
+ | aslak | true |
+ }
+ end
+
+ it "should allow column mapping of argument before diffing" do
+ t1 = Table.new([
+ ['name', 'male'],
+ ['aslak', true]
+ ])
+ t1.map_column!('male') {
+ 'true'
+ }
+ t2 = Table.new([
+ ['name', 'male'],
+ ['aslak', 'true']
+ ])
+ t2.diff!(t1)
+ t1.to_s(:indent => 12, :color => false).should == %{
+ | name | male |
+ | aslak | true |
+ }
+ end
+
+ it "should allow header mapping before diffing" do
+ t1 = Table.new([
+ ['Name', 'Male'],
+ ['aslak', 'true']
+ ])
+ t1.map_headers!('Name' => 'name', 'Male' => 'male')
+ t1.map_column!('male') { |m| m == 'true' }
+ t2 = Table.new([
+ ['name', 'male'],
+ ['aslak', true]
+ ])
+ t1.diff!(t2)
+ t1.to_s(:indent => 12, :color => false).should == %{
+ | name | male |
+ | aslak | true |
+ }
+ end
+
+ it "should not allow mappings that match more than 1 column" do
+ t1 = Table.new([
+ ['Cuke', 'Duke'],
+ ['Foo', 'Bar']
+ ])
+ lambda do
+ t1.map_headers!(/uk/ => 'u')
+ end.should raise_error(%{2 headers matched /uk/: ["Cuke", "Duke"]})
+ end
+
+ describe "raising" do
+ before do
+ @t = table(%{
+ | a | b |
+ | c | d |
+ })
+ end
+
+ it "should raise on missing rows" do
+ t = table(%{
+ | a | b |
+ })
+ lambda { @t.dup.diff!(t) }.should raise_error
+ lambda { @t.dup.diff!(t, :missing_row => false) }.should_not raise_error
+ end
+
+ it "should raise on surplus rows" do
+ t = table(%{
+ | a | b |
+ | c | d |
+ | e | f |
+ })
+ lambda { @t.dup.diff!(t) }.should raise_error
+ lambda { @t.dup.diff!(t, :surplus_row => false) }.should_not raise_error
+ end
+
+ it "should raise on missing columns" do
+ t = table(%{
+ | a |
+ | c |
+ })
+ lambda { @t.dup.diff!(t) }.should raise_error
+ lambda { @t.dup.diff!(t, :missing_col => false) }.should_not raise_error
+ end
+
+ it "should not raise on surplus columns" do
+ t = table(%{
+ | a | b | x |
+ | c | d | y |
+ })
+ lambda { @t.dup.diff!(t) }.should_not raise_error
+ lambda { @t.dup.diff!(t, :surplus_col => true) }.should raise_error
+ end
+ end
+
+ def table(text, file=nil, line_offset=0)
+ @table_parser ||= Parser::TableParser.new
+ @table_parser.parse_or_fail(text.strip, file, line_offset)
+ end
+ end
+
+ describe "#new" do
+ it "should allow Array of Hash" do
+ t1 = Table.new([{'name' => 'aslak', 'male' => 'true'}])
+ t1.to_s(:indent => 12, :color => false).should == %{
+ | name | male |
+ | aslak | true |
+ }
+ end
+ end
+
+ it "should convert to sexp" do
+ @table.to_sexp.should ==
+ [:table,
+ [:row, -1,
+ [:cell, "one"],
+ [:cell, "four"],
+ [:cell, "seven"]
+ ],
+ [:row, -1,
+ [:cell, "4444"],
+ [:cell, "55555"],
+ [:cell, "666666"]]]
+ end
+ end
+ end
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/spec/cucumber/ast/tags_spec.rb b/vendor/gems/gems/cucumber-0.4.4/spec/cucumber/ast/tags_spec.rb
new file mode 100755
index 00000000..3ae2f265
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/spec/cucumber/ast/tags_spec.rb
@@ -0,0 +1,29 @@
+require File.dirname(__FILE__) + '/../../spec_helper'
+require 'cucumber/ast/tags'
+
+module Cucumber
+ module Ast
+ describe Tags do
+ describe "#matches" do
+ it "should AND tags which are are in a list" do
+ Tags.matches?(['@one','@two','@three'], [['@one','@two']]).should == true
+ Tags.matches?(['@one','@three'], [['@one','@two']]).should == false
+ end
+
+ it "should OR tags in different lists" do
+ Tags.matches?(['@one'], [['@one'], ['@two']]).should == true
+ end
+
+ it "should AND and OR tags" do
+ Tags.matches?(['@one','@two'], [['@one'],['@two','@four']]).should == true
+ end
+
+ it "should NOT tags" do
+ Tags.matches?(['@one','@three'], [['@one', '~@two']]).should == true
+ Tags.matches?(['@one','@three'], [['~@one']]).should == false
+ end
+
+ end
+ end
+ end
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/spec/cucumber/ast/tree_walker_spec.rb b/vendor/gems/gems/cucumber-0.4.4/spec/cucumber/ast/tree_walker_spec.rb
new file mode 100755
index 00000000..a82cb306
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/spec/cucumber/ast/tree_walker_spec.rb
@@ -0,0 +1,11 @@
+require File.dirname(__FILE__) + '/../../spec_helper'
+
+module Cucumber::Ast
+ describe TreeWalker do
+ it "should visit features" do
+ tw = TreeWalker.new(nil, [mock('listener', :before_visit_features => nil)], {})
+ tw.should_not_receive(:warn)
+ tw.visit_features(mock('features', :accept => nil))
+ end
+ end
+end
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/spec/cucumber/broadcaster_spec.rb b/vendor/gems/gems/cucumber-0.4.4/spec/cucumber/broadcaster_spec.rb
new file mode 100755
index 00000000..1314dbde
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/spec/cucumber/broadcaster_spec.rb
@@ -0,0 +1,15 @@
+require File.dirname(__FILE__) + '/../spec_helper'
+
+module Cucumber
+ describe Broadcaster do
+ before do
+ @receiver = mock('receiver')
+ @broadcaster = Broadcaster.new([@receiver])
+ end
+
+ it "should broadcast methods to registered objects" do
+ @receiver.should_receive(:konbanwa).with('good evening')
+ @broadcaster.konbanwa('good evening')
+ end
+ end
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/spec/cucumber/cli/configuration_spec.rb b/vendor/gems/gems/cucumber-0.4.4/spec/cucumber/cli/configuration_spec.rb
new file mode 100755
index 00000000..485afd9d
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/spec/cucumber/cli/configuration_spec.rb
@@ -0,0 +1,396 @@
+require File.dirname(__FILE__) + '/../../spec_helper'
+require 'yaml'
+
+module Cucumber
+module Cli
+ describe Configuration do
+
+ def given_cucumber_yml_defined_as(hash_or_string)
+ File.stub!(:exist?).and_return(true)
+ cucumber_yml = hash_or_string.is_a?(Hash) ? hash_or_string.to_yaml : hash_or_string
+ IO.stub!(:read).with('cucumber.yml').and_return(cucumber_yml)
+ end
+
+ def given_the_following_files(*files)
+ File.stub!(:directory?).and_return(true)
+ File.stub!(:file?).and_return(true)
+ Dir.stub!(:[]).and_return(files)
+ end
+
+ before(:each) do
+ File.stub!(:exist?).and_return(false) # Meaning, no cucumber.yml exists
+ Kernel.stub!(:exit).and_return(nil)
+ end
+
+ def config
+ @config ||= Configuration.new(@out = StringIO.new, @error = StringIO.new)
+ end
+
+ def reset_config
+ @config = nil
+ end
+
+ attr_reader :out, :error
+
+ it "should require env.rb files first" do
+ given_the_following_files("/features/support/a_file.rb","/features/support/env.rb")
+
+ config.parse!(%w{--require /features})
+
+ config.support_to_load.should == [
+ "/features/support/env.rb",
+ "/features/support/a_file.rb"
+ ]
+ end
+
+ it "should not require env.rb files when --dry-run" do
+ given_the_following_files("/features/support/a_file.rb","/features/support/env.rb")
+
+ config.parse!(%w{--require /features --dry-run})
+
+ config.support_to_load.should == [
+ "/features/support/a_file.rb"
+ ]
+ end
+
+ it "should require files in vendor/{plugins,gems}/*/cucumber/*.rb" do
+ given_the_following_files("/vendor/plugins/plugin_a/cucumber/foo.rb",
+ "/vendor/gems/gem_a/cucumber/bar.rb")
+
+ config.parse!(%w{--require /features})
+
+ config.step_defs_to_load.should == [
+ "/vendor/plugins/plugin_a/cucumber/foo.rb",
+ "/vendor/gems/gem_a/cucumber/bar.rb"
+ ]
+ end
+
+ describe "--exclude" do
+
+ it "excludes a ruby file from requiring when the name matches exactly" do
+ given_the_following_files("/features/support/a_file.rb","/features/support/env.rb")
+
+ config.parse!(%w{--require /features --exclude a_file.rb})
+
+ config.all_files_to_load.should == [
+ "/features/support/env.rb"
+ ]
+ end
+
+ it "excludes all ruby files that match the provided patterns from requiring" do
+ given_the_following_files("/features/support/foof.rb","/features/support/bar.rb",
+ "/features/support/food.rb","/features/blah.rb",
+ "/features/support/fooz.rb")
+
+ config.parse!(%w{--require /features --exclude foo[df] --exclude blah})
+
+ config.all_files_to_load.should == [
+ "/features/support/bar.rb",
+ "/features/support/fooz.rb"
+ ]
+ end
+ end
+
+ describe '#drb?' do
+ it "indicates whether the --drb flag was passed in or not" do
+ config.parse!(%w{features})
+ config.should_not be_drb
+
+
+ config.parse!(%w{features --drb})
+ config.should be_drb
+ end
+ end
+
+ describe "#drb_port" do
+ it "is nil when not configured" do
+ config.parse!([])
+ config.drb_port.should be_nil
+ end
+
+ it "is numeric when configured" do
+ config.parse!(%w{features --port 1000})
+ config.drb_port.should == 1000
+ end
+
+
+ end
+
+ it "uses the default profile when no profile is defined" do
+ given_cucumber_yml_defined_as({'default' => '--require some_file'})
+
+ config.parse!(%w{--format progress})
+ config.options[:require].should include('some_file')
+ end
+
+ context '--profile' do
+
+ it "expands args from profiles in the cucumber.yml file" do
+ given_cucumber_yml_defined_as({'bongo' => '--require from/yml'})
+
+ config.parse!(%w{--format progress --profile bongo})
+ config.options[:formats].should == [['progress', out]]
+ config.options[:require].should == ['from/yml']
+ end
+
+ it "expands args from the default profile when no flags are provided" do
+ given_cucumber_yml_defined_as({'default' => '--require from/yml'})
+
+ config.parse!([])
+ config.options[:require].should == ['from/yml']
+ end
+
+ it "parses ERB syntax in the cucumber.yml file" do
+ given_cucumber_yml_defined_as({'default' => '<%="--require some_file"%>'})
+
+ config.parse!([])
+ config.options[:require].should include('some_file')
+ end
+
+ it "provides a helpful error message when a specified profile does not exists in cucumber.yml" do
+ given_cucumber_yml_defined_as({'default' => '--require from/yml', 'html_report' => '--format html'})
+
+ expected_message = <<-END_OF_MESSAGE
+Could not find profile: 'i_do_not_exist'
+
+Defined profiles in cucumber.yml:
+ * default
+ * html_report
+END_OF_MESSAGE
+
+ lambda{config.parse!(%w{--profile i_do_not_exist})}.should raise_error(ProfileNotFound, expected_message)
+ end
+
+ it "allows profiles to be defined in arrays" do
+ given_cucumber_yml_defined_as({'foo' => ['-f','progress']})
+
+ config.parse!(%w{--profile foo})
+ config.options[:formats].should == [['progress', out]]
+ end
+
+ it "disregards default STDOUT formatter defined in profile when another is passed in (via cmd line)" do
+ given_cucumber_yml_defined_as({'foo' => %w[--format pretty]})
+ config.parse!(%w{--format progress --profile foo})
+ config.options[:formats].should == [['progress', out]]#, ['pretty', 'pretty.txt']]
+ end
+
+
+
+ ["--no-profile", "-P"].each do |flag|
+ context 'when none is specified with #{flag}' do
+ it "disables profiles" do
+ given_cucumber_yml_defined_as({'default' => '-v --require file_specified_in_default_profile.rb'})
+
+ config.parse!("#{flag} --require some_file.rb".split(" "))
+ config.options[:require].should == ['some_file.rb']
+ end
+
+ it "notifies the user that the profiles are being disabled" do
+ given_cucumber_yml_defined_as({'default' => '-v'})
+
+ config.parse!("#{flag} --require some_file.rb".split(" "))
+ out.string.should =~ /Disabling profiles.../
+ end
+ end
+ end
+
+ it "issues a helpful error message when a specified profile exists but is nil or blank" do
+ [nil, ' '].each do |bad_input|
+ given_cucumber_yml_defined_as({'foo' => bad_input})
+
+ expected_error = /The 'foo' profile in cucumber.yml was blank. Please define the command line arguments for the 'foo' profile in cucumber.yml./
+ lambda{config.parse!(%w{--profile foo})}.should raise_error(expected_error)
+ end
+ end
+
+ it "issues a helpful error message when no YAML file exists and a profile is specified" do
+ File.should_receive(:exist?).with('cucumber.yml').and_return(false)
+
+ expected_error = /cucumber.yml was not found. Please refer to cucumber's documentation on defining profiles in cucumber.yml./
+ lambda{config.parse!(%w{--profile i_do_not_exist})}.should raise_error(expected_error)
+ end
+
+ it "issues a helpful error message when cucumber.yml is blank or malformed" do
+ expected_error_message = /cucumber.yml was found, but was blank or malformed. Please refer to cucumber's documentation on correct profile usage./
+
+ ['', 'sfsadfs', "--- \n- an\n- array\n", "---dddfd"].each do |bad_input|
+ given_cucumber_yml_defined_as(bad_input)
+ lambda{config.parse!([])}.should raise_error(expected_error_message)
+ reset_config
+ end
+ end
+
+ it "issues a helpful error message when cucumber.yml can not be parsed" do
+ expected_error_message = /cucumber.yml was found, but could not be parsed. Please refer to cucumber's documentation on correct profile usage./
+
+ given_cucumber_yml_defined_as("input that causes an exception in YAML loading")
+ YAML.should_receive(:load).and_raise ArgumentError
+
+ lambda{config.parse!([])}.should raise_error(expected_error_message)
+ end
+
+ it "issues a helpful error message when cucumber.yml can not be parsed by ERB" do
+ expected_error_message = /cucumber.yml was found, but could not be parsed with ERB. Please refer to cucumber's documentation on correct profile usage./
+ given_cucumber_yml_defined_as("<% this_fails %>")
+
+ lambda{config.parse!([])}.should raise_error(expected_error_message)
+ end
+ end
+
+
+ it "should accept --dry-run option" do
+ config.parse!(%w{--dry-run})
+ config.options[:dry_run].should be_true
+ end
+
+ it "should accept --no-source option" do
+ config.parse!(%w{--no-source})
+
+ config.options[:source].should be_false
+ end
+
+ it "should accept --no-snippets option" do
+ config.parse!(%w{--no-snippets})
+
+ config.options[:snippets].should be_false
+ end
+
+ it "should set snippets and source to false with --quiet option" do
+ config.parse!(%w{--quiet})
+
+ config.options[:snippets].should be_false
+ config.options[:source].should be_false
+ end
+
+ it "should accept --verbose option" do
+ config.parse!(%w{--verbose})
+
+ config.options[:verbose].should be_true
+ end
+
+ it "should accept --out option" do
+ config.parse!(%w{--out jalla.txt})
+ config.options[:formats].should == [['pretty', 'jalla.txt']]
+ end
+
+ it "should accept multiple --out options" do
+ config.parse!(%w{--format progress --out file1 --out file2})
+ config.options[:formats].should == [['progress', 'file2']]
+ end
+
+ it "should accept multiple --format options and put the STDOUT one first so progress is seen" do
+ config.parse!(%w{--format pretty --out pretty.txt --format progress})
+ config.options[:formats].should == [['progress', out], ['pretty', 'pretty.txt']]
+ end
+
+ it "should not accept multiple --format options when both use implicit STDOUT" do
+ lambda do
+ config.parse!(%w{--format pretty --format progress})
+ end.should raise_error("All but one formatter must use --out, only one can print to each stream (or STDOUT)")
+ end
+
+ it "should not accept multiple --out streams pointing to the same place" do
+ lambda do
+ config.parse!(%w{--format pretty --out file1 --format progress --out file1})
+ end.should raise_error("All but one formatter must use --out, only one can print to each stream (or STDOUT)")
+ end
+
+ it "should associate --out to previous --format" do
+ config.parse!(%w{--format progress --out file1 --format profile --out file2})
+ config.options[:formats].should == [["progress", "file1"], ["profile" ,"file2"]]
+ end
+
+ it "should accept --color option" do
+ Term::ANSIColor.should_receive(:coloring=).with(true)
+ config.parse!(['--color'])
+ end
+
+ it "should accept --no-color option" do
+ Term::ANSIColor.should_receive(:coloring=).with(false)
+ config = Configuration.new(StringIO.new)
+ config.parse!(['--no-color'])
+ end
+
+ describe "--backtrace" do
+ before do
+ Cucumber.use_full_backtrace = false
+ end
+
+ it "should show full backtrace when --backtrace is present" do
+ config = Main.new(['--backtrace'])
+ begin
+ "x".should == "y"
+ rescue => e
+ e.backtrace[0].should_not == "#{__FILE__}:#{__LINE__ - 2}"
+ end
+ end
+
+ after do
+ Cucumber.use_full_backtrace = false
+ end
+ end
+
+ describe "diff output" do
+
+ it "is enabled by default" do
+ config.diff_enabled?.should be_true
+ end
+
+ it "is disabled when the --no-diff option is supplied" do
+ config.parse!(%w{--no-diff})
+
+ config.diff_enabled?.should be_false
+ end
+
+ end
+
+ it "should accept multiple --name options" do
+ config.parse!(['--name', "User logs in", '--name', "User signs up"])
+
+ config.options[:name_regexps].should include(/User logs in/)
+ config.options[:name_regexps].should include(/User signs up/)
+ end
+
+ it "should accept multiple -n options" do
+ config.parse!(['-n', "User logs in", '-n', "User signs up"])
+
+ config.options[:name_regexps].should include(/User logs in/)
+ config.options[:name_regexps].should include(/User signs up/)
+ end
+
+ it "should search for all features in the specified directory" do
+ File.stub!(:directory?).and_return(true)
+ Dir.should_receive(:[]).with("feature_directory/**/*.feature").
+ any_number_of_times.and_return(["cucumber.feature"])
+
+ config.parse!(%w{feature_directory/})
+
+ config.feature_files.should == ["cucumber.feature"]
+ end
+
+ it "defaults to the features directory when no feature file are provided" do
+ File.stub!(:directory?).and_return(true)
+ Dir.should_receive(:[]).with("features/**/*.feature").
+ any_number_of_times.and_return(["cucumber.feature"])
+
+ config.parse!(%w{})
+
+ config.feature_files.should == ["cucumber.feature"]
+ end
+
+ it "should allow specifying environment variables on the command line" do
+ config.parse!(["foo=bar"])
+ ENV["foo"].should == "bar"
+ config.feature_files.should_not include('foo=bar')
+ end
+
+ it "should allow specifying environment variables in profiles" do
+ given_cucumber_yml_defined_as({'selenium' => 'RAILS_ENV=selenium'})
+ config.parse!(["--profile", "selenium"])
+ ENV["RAILS_ENV"].should == "selenium"
+ config.feature_files.should_not include('RAILS_ENV=selenium')
+ end
+
+ end
+end
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/spec/cucumber/cli/drb_client_spec.rb b/vendor/gems/gems/cucumber-0.4.4/spec/cucumber/cli/drb_client_spec.rb
new file mode 100755
index 00000000..f0e477c5
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/spec/cucumber/cli/drb_client_spec.rb
@@ -0,0 +1,77 @@
+require File.dirname(__FILE__) + '/../../spec_helper'
+
+
+module Cucumber
+ module Cli
+ describe DRbClient do
+ before(:each) do
+ @args = ['features']
+ @error_stream = StringIO.new
+ @out_stream = StringIO.new
+
+ @drb_object = mock('DRbObject', :run => true)
+ DRbObject.stub!(:new_with_uri).and_return(@drb_object)
+ end
+
+ it "starts up a druby service" do
+ DRb.should_receive(:start_service).with("druby://localhost:0")
+ DRbClient.run(@args, @error_stream, @out_stream)
+ end
+
+ it "connects to the DRb server" do
+ DRbObject.should_receive(:new_with_uri).with("druby://127.0.0.1:8990")
+ DRbClient.run(@args, @error_stream, @out_stream)
+ end
+
+ it "runs the features on the DRb server" do
+ @drb_object.should_receive(:run).with(@args, @error_stream, @out_stream)
+ DRbClient.run(@args, @error_stream, @out_stream)
+ end
+
+ it "returns raises an error when it can't connect to the server" do
+ DRbObject.stub!(:new_with_uri).and_raise(DRb::DRbConnError)
+ running { DRbClient.run(@args, @error_stream, @out_stream) }.should raise_error(DRbClientError, "No DRb server is running.")
+ end
+
+ it "returns the result from the DRb server call" do
+ @drb_object.should_receive(:run).and_return('foo')
+ DRbClient.run(@args, @error_stream, @out_stream).should == 'foo'
+ end
+
+ context "with $CUCUMBER_DRB set" do
+ before do
+ @original_env = ENV['CUCUMBER_DRB']
+ ENV['CUCUMBER_DRB'] = '90000'
+ end
+ after do
+ ENV['CUCUMBER_DRB'] = @original_env
+ end
+ it "connects to specified DRb server" do
+ DRbObject.should_receive(:new_with_uri).with("druby://127.0.0.1:90000")
+ DRbClient.run(@args, @error_stream, @out_stream)
+ end
+ end
+
+ context "with provided drb_port" do
+ before do
+ @args = @args + ['--port', '8000']
+ end
+ it "connects to specified drb port" do
+ DRbObject.should_receive(:new_with_uri).with("druby://127.0.0.1:8000")
+ DRbClient.run(@args, @error_stream, @out_stream, 8000)
+ end
+ it "prefers configuration to environment" do
+ original = ENV['CUCUMBER_DRB'] = original
+ begin
+ ENV['CUCUMBER_DRB'] = "4000"
+ DRbObject.should_receive(:new_with_uri).with("druby://127.0.0.1:8000")
+ DRbClient.run(@args, @error_stream, @out_stream, 8000)
+ ensure
+ ENV['CUCUMBER_DRB'] = original
+ end
+ end
+ end
+
+ end
+ end
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/spec/cucumber/cli/main_spec.rb b/vendor/gems/gems/cucumber-0.4.4/spec/cucumber/cli/main_spec.rb
new file mode 100755
index 00000000..4791d29f
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/spec/cucumber/cli/main_spec.rb
@@ -0,0 +1,172 @@
+require File.dirname(__FILE__) + '/../../spec_helper'
+require 'yaml'
+begin
+ require 'spec/runner/differs/default' # RSpec >=1.2.4
+rescue ::LoadError
+ require 'spec/expectations/differs/default' # RSpec <=1.2.3
+end
+
+module Cucumber
+ module Cli
+ describe Main do
+ before(:each) do
+ @out = StringIO.new
+ @err = StringIO.new
+ Kernel.stub!(:exit).and_return(nil)
+ File.stub!(:exist?).and_return(false) # When Configuration checks for cucumber.yml
+ Dir.stub!(:[]).and_return([]) # to prevent cucumber's features dir to being laoded
+ end
+
+ describe "verbose mode" do
+
+ before(:each) do
+ @empty_feature = Ast::Feature.new(nil, Ast::Comment.new(''), Ast::Tags.new(2, []), "Feature", [])
+ end
+
+ it "should show feature files parsed" do
+ @cli = Main.new(%w{--verbose example.feature}, @out)
+ @cli.stub!(:require)
+
+ FeatureFile.stub!(:new).and_return(mock("feature file", :parse => @empty_feature))
+
+ @cli.execute!(StepMother.new)
+
+ @out.string.should include('example.feature')
+ end
+
+ end
+
+ describe "diffing" do
+
+ before :each do
+ @configuration = mock('Configuration', :null_object => true, :drb? => false)
+ Configuration.should_receive(:new).and_return(@configuration)
+
+ @step_mother = mock('StepMother', :null_object => true)
+
+ @cli = Main.new(nil, @out)
+ end
+
+ it "uses Spec Differ::Default when diff is enabled" do
+ @configuration.should_receive(:diff_enabled?).and_return(true)
+
+ ::Spec::Expectations::Differs::Default.should_receive(:new)
+
+ @cli.execute!(@step_mother)
+ end
+
+ it "does not use Spec Differ::Default when diff is disabled" do
+ @configuration.should_receive(:diff_enabled?).and_return(false)
+
+ ::Spec::Expectations::Differs::Default.should_not_receive(:new)
+
+ @cli.execute!(@step_mother)
+ end
+
+ end
+
+ describe "--format with class" do
+
+ describe "in module" do
+
+ it "should resolve each module until it gets Formatter class" do
+ cli = Main.new(%w{--format ZooModule::MonkeyFormatterClass}, nil)
+ mock_module = mock('module')
+ Object.stub!(:const_defined?).and_return(true)
+ mock_module.stub!(:const_defined?).and_return(true)
+
+ f = stub('formatter', :null_object => true)
+
+ Object.should_receive(:const_get).with('ZooModule').and_return(mock_module)
+ mock_module.should_receive(:const_get).with('MonkeyFormatterClass').and_return(mock('formatter class', :new => f))
+
+ cli.execute!(StepMother.new)
+ end
+
+ end
+ end
+
+ describe "setup step sequence" do
+
+ it "should load files and execute hooks in order" do
+ Configuration.stub!(:new).and_return(configuration = mock('configuration', :null_object => true))
+ step_mother = mock('step mother', :null_object => true)
+ configuration.stub!(:drb?).and_return false
+ cli = Main.new(%w{--verbose example.feature}, @out)
+ cli.stub!(:require)
+
+ configuration.stub!(:support_to_load).and_return(['support'])
+ configuration.stub!(:step_defs_to_load).and_return(['step defs'])
+
+ # Support must be loaded first to ensure post configuration hook can
+ # run before anything else.
+ step_mother.should_receive(:load_code_files).with(['support']).ordered
+ # The post configuration hook/s (if any) need to be run next to enable
+ # extensions to do their thing before features are loaded
+ step_mother.should_receive(:after_configuration).with(configuration).ordered
+ # Feature files must be loaded before step definitions are required.
+ # This is because i18n step methods are only aliased when
+ # features are loaded. If we swap the order, the requires
+ # will fail.
+ step_mother.should_receive(:load_plain_text_features).ordered
+ step_mother.should_receive(:load_code_files).with(['step defs']).ordered
+
+ cli.execute!(step_mother)
+ end
+
+ end
+
+ [ProfilesNotDefinedError, YmlLoadError, ProfileNotFound].each do |exception_klass|
+
+ it "rescues #{exception_klass}, prints the message to the error stream and returns true" do
+ Configuration.stub!(:new).and_return(configuration = mock('configuration'))
+ configuration.stub!(:parse!).and_raise(exception_klass.new("error message"))
+
+ main = Main.new('', out = StringIO.new, error = StringIO.new)
+ main.execute!(StepMother.new).should be_true
+ error.string.should == "error message\n"
+ end
+ end
+
+
+ context "--drb" do
+ before(:each) do
+ @configuration = mock('Configuration', :drb? => true, :null_object => true)
+ Configuration.stub!(:new).and_return(@configuration)
+
+ @args = ['features']
+
+ @cli = Main.new(@args, @out, @err)
+ @step_mother = mock('StepMother', :null_object => true)
+ end
+
+ it "delegates the execution to the DRB client passing the args and streams" do
+ @configuration.stub :drb_port => 1450
+ DRbClient.should_receive(:run).with(@args, @err, @out, 1450).and_return(true)
+ @cli.execute!(@step_mother)
+ end
+
+ it "returns the result from the DRbClient" do
+ DRbClient.stub!(:run).and_return('foo')
+ @cli.execute!(@step_mother).should == 'foo'
+ end
+
+ it "ceases execution if the DrbClient is able to perform the execution" do
+ DRbClient.stub!(:run).and_return(true)
+ @configuration.should_not_receive(:build_formatter_broadcaster)
+ @cli.execute!(@step_mother)
+ end
+
+ context "when the DrbClient is unable to perfrom the execution" do
+ before { DRbClient.stub!(:run).and_raise(DRbClientError.new('error message.')) }
+
+ it "alerts the user that execution will be performed locally" do
+ @cli.execute!(@step_mother)
+ @err.string.should include("WARNING: error message. Running features locally:")
+ end
+
+ end
+ end
+ end
+ end
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/spec/cucumber/cli/options_spec.rb b/vendor/gems/gems/cucumber-0.4.4/spec/cucumber/cli/options_spec.rb
new file mode 100755
index 00000000..8706347c
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/spec/cucumber/cli/options_spec.rb
@@ -0,0 +1,338 @@
+require File.dirname(__FILE__) + '/../../spec_helper'
+require 'yaml'
+
+module Cucumber
+module Cli
+ describe Options do
+
+ def given_cucumber_yml_defined_as(hash_or_string)
+ File.stub!(:exist?).and_return(true)
+ cucumber_yml = hash_or_string.is_a?(Hash) ? hash_or_string.to_yaml : hash_or_string
+ IO.stub!(:read).with('cucumber.yml').and_return(cucumber_yml)
+ end
+
+ before(:each) do
+ File.stub!(:exist?).and_return(false) # Meaning, no cucumber.yml exists
+ Kernel.stub!(:exit).and_return(nil)
+ end
+
+ def output_stream
+ @output_stream ||= StringIO.new
+ end
+
+ def error_stream
+ @error_stream ||= StringIO.new
+ end
+
+ def options
+ @options ||= Options.new(output_stream, error_stream)
+ end
+
+ def prepare_args(args)
+ args.is_a?(Array) ? args : args.split(' ')
+ end
+
+ describe 'parsing' do
+
+ def when_parsing(args)
+ yield
+ options.parse!(prepare_args(args))
+ end
+
+ def after_parsing(args)
+ options.parse!(prepare_args(args))
+ yield
+ end
+
+ context '-r or --require' do
+ it "collects all specified files into an array" do
+ after_parsing('--require some_file.rb -r another_file.rb') do
+ options[:require].should == ['some_file.rb', 'another_file.rb']
+ end
+ end
+ end
+
+ context '-l LANG or --language LANG' do
+ context "with LANG specified as 'help'" do
+ it "lists all known langues" do
+ when_parsing '-l help' do
+ LanguageHelpFormatter.should_receive(:list_languages).with(output_stream)
+ end
+ end
+ it "exits the program" do
+ when_parsing('--language help') { Kernel.should_receive(:exit) }
+ end
+ end
+ it "sets the langauge" do
+ after_parsing('-l en') { options[:lang].should == 'en' }
+ end
+ end
+
+ context "--port PORT" do
+ it "sets the drb_port to the provided option" do
+ after_parsing('--port 4500') { options[:drb_port].should == '4500' }
+ end
+ end
+
+ context '-f FORMAT or --format FORMAT' do
+ it "defaults the output for the formatter to the output stream (STDOUT)" do
+ after_parsing('-f pretty') { options[:formats].should == [['pretty', output_stream]] }
+ end
+ end
+
+ context '-o [FILE|DIR] or --out [FILE|DIR]' do
+ it "defaults the formatter to 'pretty' when not specified earlier" do
+ after_parsing('-o file.txt') { options[:formats].should == [['pretty', 'file.txt']] }
+ end
+ it "sets the output for the formatter defined immediatly before it" do
+ after_parsing('-f profile --out file.txt -f pretty -o file2.txt') do
+ options[:formats].should == [['profile', 'file.txt'], ['pretty', 'file2.txt']]
+ end
+ end
+ end
+
+ context '-t TAGS --tags TAGS' do
+ it "designates tags prefixed with ~ as tags to be excluded" do
+ after_parsing('--tags ~@foo,@bar') { options[:tag_names].should == [{'~@foo' => nil, '@bar' => nil}] }
+ end
+
+ it "stores tags passed with different --tags seperately" do
+ after_parsing('--tags @foo --tags @bar') { options[:tag_names].should == [{'@foo' => nil}, {'@bar' => nil}] }
+ end
+ end
+
+ context '-n NAME or --name NAME' do
+ it "stores the provided names as regular expressions" do
+ after_parsing('-n foo --name bar') { options[:name_regexps].should == [/foo/,/bar/] }
+ end
+ end
+
+ context '-e PATTERN or --exclude PATTERN' do
+ it "stores the provided exclusions as regular expressions" do
+ after_parsing('-e foo --exclude bar') { options[:excludes].should == [/foo/,/bar/] }
+ end
+ end
+
+ context '-p PROFILE or --profile PROFILE' do
+
+ it "notifies the user that an individual profile is being used" do
+ given_cucumber_yml_defined_as({'foo' => [1,2,3]})
+ options.parse!(%w{--profile foo})
+ output_stream.string.should =~ /Using the foo profile...\n/
+ end
+
+ it "notifies the user when multiple profiles are being used" do
+ given_cucumber_yml_defined_as({'foo' => [1,2,3], 'bar' => ['v'], 'dog' => ['v']})
+ options.parse!(%w{--profile foo --profile bar --profile dog})
+ output_stream.string.should =~ /Using the foo, bar and dog profiles...\n/
+ end
+
+ it "notifies the user of all profiles being used, even when they are nested" do
+ given_cucumber_yml_defined_as('foo' => '-p bar', 'bar' => 'features')
+ after_parsing('-p foo') do
+ output_stream.string.should =~ /Using the foo and bar profiles.../
+ end
+ end
+
+ it "uses the default profile passed in during initialization if none are specified by the user" do
+ given_cucumber_yml_defined_as({'default' => '--require some_file'})
+
+ options = Options.new(output_stream, error_stream, :default_profile => 'default')
+ options.parse!(%w{--format progress})
+ options[:require].should include('some_file')
+ end
+
+ it "merges all uniq values from both cmd line and the profile" do
+ given_cucumber_yml_defined_as('foo' => %w[--verbose])
+ options.parse!(%w[--wip --profile foo])
+ options[:wip].should be_true
+ options[:verbose].should be_true
+ end
+
+ it "gives precendene to the origianl options' paths" do
+ given_cucumber_yml_defined_as('foo' => %w[features])
+ options.parse!(%w[my.feature -p foo])
+ options[:paths].should == %w[my.feature]
+ end
+
+ it "combines the require files of both" do
+ given_cucumber_yml_defined_as('bar' => %w[--require features -r dog.rb])
+ options.parse!(%w[--require foo.rb -p bar])
+ options[:require].should == %w[foo.rb features dog.rb]
+ end
+
+ it "combines the tag names of both" do
+ given_cucumber_yml_defined_as('baz' => %w[-t @bar])
+ options.parse!(%w[--tags @foo -p baz])
+ options[:tag_names].should == [{'@foo' => nil}, {'@bar' => nil}]
+ end
+
+ it "only takes the paths from the original options, and disgregards the profiles" do
+ given_cucumber_yml_defined_as('baz' => %w[features])
+ options.parse!(%w[my.feature -p baz])
+ options[:paths].should == ['my.feature']
+ end
+
+ it "uses the paths from the profile when none are specified originally" do
+ given_cucumber_yml_defined_as('baz' => %w[some.feature])
+ options.parse!(%w[-p baz])
+ options[:paths].should == ['some.feature']
+ end
+
+ it "combines environment variables from the profile but gives precendene to cmd line args" do
+ given_cucumber_yml_defined_as('baz' => %w[FOO=bar CHEESE=swiss])
+ options.parse!(%w[-p baz CHEESE=cheddar BAR=foo])
+ options[:env_vars].should == {'BAR' => 'foo', 'FOO' => 'bar', 'CHEESE' => 'cheddar'}
+ end
+
+ it "disregards STDOUT formatter defined in profile when another is passed in (via cmd line)" do
+ given_cucumber_yml_defined_as({'foo' => %w[--format pretty]})
+ options.parse!(%w{--format progress --profile foo})
+ options[:formats].should == [['progress', output_stream]]
+ end
+
+ it "includes any non-STDOUT formatters from the profile" do
+ given_cucumber_yml_defined_as({'html' => %w[--format html -o features.html]})
+ options.parse!(%w{--format progress --profile html})
+ options[:formats].should == [['progress', output_stream], ['html', 'features.html']]
+ end
+
+ it "does not include STDOUT formatters from the profile if there is a STDOUT formatter in command line" do
+ given_cucumber_yml_defined_as({'html' => %w[--format html -o features.html --format pretty]})
+ options.parse!(%w{--format progress --profile html})
+ options[:formats].should == [['progress', output_stream], ['html', 'features.html']]
+ end
+
+ it "includes any STDOUT formatters from the profile if no STDOUT formatter was specified in command line" do
+ given_cucumber_yml_defined_as({'html' => %w[--format html]})
+ options.parse!(%w{--format rerun -o rerun.txt --profile html})
+ options[:formats].should == [['html', output_stream], ['rerun', 'rerun.txt']]
+ end
+
+ it "assumes all of the formatters defined in the profile when none are specified on cmd line" do
+ given_cucumber_yml_defined_as({'html' => %w[--format progress --format html -o features.html]})
+ options.parse!(%w{--profile html})
+ options[:formats].should == [['progress', output_stream], ['html', 'features.html']]
+ end
+
+ it "respects --quiet when defined in the profile" do
+ given_cucumber_yml_defined_as('foo' => '-q')
+ options.parse!(%w[-p foo])
+ options[:snippets].should be_false
+ options[:source].should be_false
+ end
+
+ it "uses the language from profile when none is specified on the command line" do
+ given_cucumber_yml_defined_as({'foo' => '--language fr'})
+ after_parsing('-p foo') {options[:lang].should == 'fr'}
+ end
+ end
+
+ context '-P or --no-profile' do
+
+ it "disables profiles" do
+ given_cucumber_yml_defined_as({'default' => '-v --require file_specified_in_default_profile.rb'})
+
+ after_parsing("-P --require some_file.rb") do
+ options[:require].should == ['some_file.rb']
+ end
+ end
+
+ it "notifies the user that the profiles are being disabled" do
+ given_cucumber_yml_defined_as({'default' => '-v'})
+
+ after_parsing("--no-profile --require some_file.rb") do
+ output_stream.string.should =~ /Disabling profiles.../
+ end
+ end
+
+ end
+
+ context '-b or --backtrace' do
+ it "turns on cucumber's full backtrace" do
+ when_parsing("-b") do
+ Cucumber.should_receive(:use_full_backtrace=).with(true)
+ end
+ end
+ end
+
+ context '--version' do
+ it "displays Cucumber's version" do
+ after_parsing('--version') do
+ output_stream.string.should =~ /#{Cucumber::VERSION}/
+ end
+ end
+ it "exits the program" do
+ when_parsing('--version') { Kernel.should_receive(:exit) }
+ end
+ end
+
+ context 'environment variables (i.e. MODE=webrat)' do
+ it "places all of the environment variables into a hash" do
+ after_parsing('MODE=webrat FOO=bar') do
+ options[:env_vars].should == {'MODE' => 'webrat', 'FOO' => 'bar'}
+ end
+ end
+ end
+
+ it "assigns any extra arguments as paths to features" do
+ after_parsing('-f pretty my_feature.feature my_other_features') do
+ options[:paths].should == ['my_feature.feature', 'my_other_features']
+ end
+ end
+
+ it "does not mistake environment variables as feature paths" do
+ after_parsing('my_feature.feature FOO=bar') do
+ options[:paths].should == ['my_feature.feature']
+ end
+ end
+ end
+
+ describe '#expanded_args_without_drb' do
+ it "returns the orginal args in additon to the args from any profiles" do
+ given_cucumber_yml_defined_as('foo' => '-v',
+ 'bar' => '--wip -p baz',
+ 'baz' => '-r some_file.rb')
+ options.parse!(%w[features -p foo --profile bar])
+
+ options.expanded_args_without_drb.should == %w[features -v --wip -r some_file.rb --no-profile]
+ end
+
+ it "removes the --drb flag so that the args can be safely passed to the drb server" do
+ given_cucumber_yml_defined_as('default' => 'features -f pretty --drb')
+ options.parse!(%w[--profile default])
+
+ options.expanded_args_without_drb.should == %w[features -f pretty --no-profile]
+ end
+
+ it "contains the environment variables" do
+ options.parse!(%w[features FOO=bar])
+ options.expanded_args_without_drb.should == %w[features FOO=bar --no-profile]
+ end
+
+ it "ignores the paths from the profiles if one was specified on the command line" do
+ given_cucumber_yml_defined_as('foo' => 'features --drb')
+ options.parse!(%w[some_feature.feature -p foo])
+ options.expanded_args_without_drb.should == %w[some_feature.feature --no-profile]
+ end
+
+
+ it "appends the --no-profile flag so that the DRb server doesn't reload the profiles" do
+ given_cucumber_yml_defined_as('foo' => 'features --drb')
+ options.parse!(%w[some_feature.feature -p foo])
+ options.expanded_args_without_drb.should == %w[some_feature.feature --no-profile]
+ end
+
+ it "does not append --no-profile if already present" do
+ options.parse!(%w[some_feature.feature -P])
+ options.expanded_args_without_drb.should == %w[some_feature.feature -P]
+ end
+
+
+ end
+
+ end
+
+end
+end
+
diff --git a/vendor/gems/gems/cucumber-0.4.4/spec/cucumber/cli/profile_loader_spec.rb b/vendor/gems/gems/cucumber-0.4.4/spec/cucumber/cli/profile_loader_spec.rb
new file mode 100755
index 00000000..ab7c5585
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/spec/cucumber/cli/profile_loader_spec.rb
@@ -0,0 +1,10 @@
+require File.dirname(__FILE__) + '/../../spec_helper'
+require 'yaml'
+
+module Cucumber
+module Cli
+ describe ProfileLoader do
+ it "should have all of its specs migrated from configuration_spec"
+ end
+end
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/spec/cucumber/core_ext/proc_spec.rb b/vendor/gems/gems/cucumber-0.4.4/spec/cucumber/core_ext/proc_spec.rb
new file mode 100755
index 00000000..b35b5f30
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/spec/cucumber/core_ext/proc_spec.rb
@@ -0,0 +1,68 @@
+require File.dirname(__FILE__) + '/../../spec_helper'
+require 'cucumber/core_ext/proc'
+
+describe Proc do
+ it "should remove extraneous path info for file" do
+ proc = lambda {|a,b|}
+ proc.file_colon_line.should =~ /^spec\/cucumber\/core_ext\/proc_spec\.rb:6/
+ end
+
+ it "should raise ArityMismatchError for too many args (expecting 0)" do
+ lambda {
+ Object.new.cucumber_instance_exec(true, 'foo', 1) do
+ end
+ }.should raise_error(Cucumber::ArityMismatchError, "Your block takes 0 arguments, but the Regexp matched 1 argument.")
+ end
+
+ it "should raise ArityMismatchError for too many args (expecting 1)" do
+ lambda {
+ Object.new.cucumber_instance_exec(true, 'foo', 1,2) do |a|
+ end
+ }.should raise_error(Cucumber::ArityMismatchError, "Your block takes 1 argument, but the Regexp matched 2 arguments.")
+ end
+
+ it "should raise ArityMismatchError for too few args (expecting 1)" do
+ lambda {
+ Object.new.cucumber_instance_exec(true, 'foo') do |a|
+ end
+ }.should raise_error(Cucumber::ArityMismatchError, "Your block takes 1 argument, but the Regexp matched 0 arguments.")
+ end
+
+ it "should raise ArityMismatchError for too few args (expecting 2)" do
+ lambda {
+ Object.new.cucumber_instance_exec(true, 'foo', 1) do |a,b|
+ end
+ }.should raise_error(Cucumber::ArityMismatchError, "Your block takes 2 arguments, but the Regexp matched 1 argument.")
+ end
+
+ if Cucumber::RUBY_1_9
+ it "should allow varargs (expecting 0+)" do
+ lambda {
+ Object.new.cucumber_instance_exec(true, 'foo', 1) do |*args|
+ end
+ }.should_not raise_error(Cucumber::ArityMismatchError)
+ end
+ else
+ # Ruby 1.8
+ it "should not allow varargs 0+ because Ruby 1.8 reports same arity as with no args, so we can't really tell the difference." do
+ lambda {
+ Object.new.cucumber_instance_exec(true, 'foo', 1) do |*args|
+ end
+ }.should raise_error(Cucumber::ArityMismatchError, "Your block takes 0 arguments, but the Regexp matched 1 argument.")
+ end
+ end
+
+ it "should allow varargs (expecting 1+)" do
+ lambda {
+ Object.new.cucumber_instance_exec(true, 'foo', 1) do |arg,*args|
+ end
+ }.should_not raise_error(Cucumber::ArityMismatchError)
+ end
+
+ it "should raise ArityMismatchError for too few required args when using varargs (expecting 1+)" do
+ lambda {
+ Object.new.cucumber_instance_exec(true, nil) do |arg,*args|
+ end
+ }.should raise_error(Cucumber::ArityMismatchError, "Your block takes 1+ arguments, but the Regexp matched 0 arguments.")
+ end
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/spec/cucumber/formatter/ansicolor_spec.rb b/vendor/gems/gems/cucumber-0.4.4/spec/cucumber/formatter/ansicolor_spec.rb
new file mode 100755
index 00000000..8a175109
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/spec/cucumber/formatter/ansicolor_spec.rb
@@ -0,0 +1,31 @@
+require File.dirname(__FILE__) + '/../../spec_helper'
+require 'cucumber/formatter/ansicolor'
+
+module Cucumber
+ module Formatter
+ describe ANSIColor do
+ include ANSIColor
+
+ it "should wrap passed_param with bold green and reset to green" do
+ passed_param("foo").should == "\e[32m\e[1mfoo\e[0m\e[0m\e[32m"
+ end
+
+ it "should wrap passed in green" do
+ passed("foo").should == "\e[32mfoo\e[0m"
+ end
+
+ it "should not reset passed if there are no arguments" do
+ passed.should == "\e[32m"
+ end
+
+ it "should wrap comments in grey" do
+ comment("foo").should == "\e[90mfoo\e[0m"
+ end
+
+ it "should not generate ansi codes when colors are disabled" do
+ ::Term::ANSIColor.coloring = false
+ passed("foo").should == "foo"
+ end
+ end
+ end
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/spec/cucumber/formatter/color_io_spec.rb b/vendor/gems/gems/cucumber-0.4.4/spec/cucumber/formatter/color_io_spec.rb
new file mode 100755
index 00000000..c2945010
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/spec/cucumber/formatter/color_io_spec.rb
@@ -0,0 +1,27 @@
+require File.dirname(__FILE__) + '/../../spec_helper'
+require 'cucumber/formatter/color_io'
+
+module Cucumber
+ module Formatter
+ describe ColorIO do
+ describe "<<" do
+ it "should convert to a print using kernel" do
+ color_io = ColorIO.new
+
+ Kernel.should_receive(:print).with("monkeys")
+
+ color_io << "monkeys"
+ end
+
+ it "should allow chained <<" do
+ color_io = ColorIO.new
+
+ Kernel.should_receive(:print).with("monkeys")
+ Kernel.should_receive(:print).with(" are tasty")
+
+ color_io << "monkeys" << " are tasty"
+ end
+ end
+ end
+ end
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/spec/cucumber/formatter/console_spec.rb b/vendor/gems/gems/cucumber-0.4.4/spec/cucumber/formatter/console_spec.rb
new file mode 100755
index 00000000..81a1cbd9
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/spec/cucumber/formatter/console_spec.rb
@@ -0,0 +1,20 @@
+require File.dirname(__FILE__) + '/../../spec_helper'
+require 'cucumber/formatter/console'
+
+module Cucumber
+ module Formatter
+ describe Console do
+ include Console
+
+ before(:each) do
+ @io = mock('console output')
+ end
+
+ it "should not raise an error when there are no tags" do
+ @tag_occurrences = nil
+
+ lambda{print_tag_limit_warnings(:tag_names => {'@wip' => 2})}.should_not raise_error
+ end
+ end
+ end
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/spec/cucumber/formatter/duration_spec.rb b/vendor/gems/gems/cucumber-0.4.4/spec/cucumber/formatter/duration_spec.rb
new file mode 100755
index 00000000..c1c1115b
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/spec/cucumber/formatter/duration_spec.rb
@@ -0,0 +1,22 @@
+require File.dirname(__FILE__) + '/../../spec_helper'
+require 'cucumber/formatter/duration'
+
+module Cucumber
+ module Formatter
+ describe Duration do
+ include Duration
+
+ it "should format ms" do
+ format_duration(0.002103).should == '0m0.002s'
+ end
+
+ it "should format m" do
+ format_duration(61.002503).should == '1m1.003s'
+ end
+
+ it "should format h" do
+ format_duration(3661.002503).should == '61m1.003s'
+ end
+ end
+ end
+end
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/spec/cucumber/formatter/html_spec.rb b/vendor/gems/gems/cucumber-0.4.4/spec/cucumber/formatter/html_spec.rb
new file mode 100755
index 00000000..f142aeb0
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/spec/cucumber/formatter/html_spec.rb
@@ -0,0 +1,200 @@
+require File.dirname(__FILE__) + '/../../spec_helper'
+require File.dirname(__FILE__) + '/spec_helper'
+require 'cucumber/formatter/html'
+require 'nokogiri'
+require 'cucumber/rb_support/rb_language'
+
+module Cucumber
+ module Formatter
+
+ describe Html do
+ extend SpecHelperDsl
+ include SpecHelper
+
+ Spec::Matchers.define :have_css_node do |css, regexp|
+ match do |doc|
+ nodes = doc.css(css)
+ nodes.detect{ |node| node.text =~ regexp }
+ end
+ end
+
+ before(:each) do
+ @out = StringIO.new
+ @formatter = Html.new(step_mother, @out, {})
+ end
+
+ it "should not raise an error when visiting a blank feature name" do
+ lambda { @formatter.feature_name("") }.should_not raise_error
+ end
+
+ describe "given a single feature" do
+ before(:each) do
+ run_defined_feature
+ @doc = Nokogiri.HTML(@out.string)
+ end
+
+ describe "with a comment" do
+ define_feature <<-FEATURE
+ # Healthy
+ FEATURE
+
+ it { @out.string.should =~ /^\$/ }
+ it { @doc.should have_css_node('.feature .comment', /Healthy/) }
+ end
+
+ describe "with a tag" do
+ define_feature <<-FEATURE
+ @foo
+ FEATURE
+
+ it { @doc.should have_css_node('.feature .tag', /foo/) }
+ end
+
+ describe "with a narrative" do
+ define_feature <<-FEATURE
+ Feature: Bananas
+ In order to find my inner monkey
+ As a human
+ I must eat bananas
+ FEATURE
+
+ it { @doc.should have_css_node('.feature h2', /Bananas/) }
+ it { @doc.should have_css_node('.feature .narrative', /must eat bananas/) }
+ end
+
+ describe "with a background" do
+ define_feature <<-FEATURE
+ Feature: Bananas
+
+ Background:
+ Given there are bananas
+ FEATURE
+
+ it { @doc.should have_css_node('.feature .background', /there are bananas/) }
+ end
+
+ describe "with a scenario" do
+ define_feature <<-FEATURE
+ Scenario: Monkey eats banana
+ Given there are bananas
+ FEATURE
+
+ it { @doc.should have_css_node('.feature h3', /Monkey eats banana/) }
+ it { @doc.should have_css_node('.feature .scenario .step', /there are bananas/) }
+ end
+
+ describe "with a scenario outline" do
+ define_feature <<-FEATURE
+ Scenario Outline: Monkey eats a balanced diet
+ Given there are
+
+ Examples: Fruit
+ | Things |
+ | apples |
+ | bananas |
+ Examples: Vegetables
+ | Things |
+ | broccoli |
+ | carrots |
+ FEATURE
+
+ it { @doc.should have_css_node('.feature .scenario.outline h4', /Fruit/) }
+ it { @doc.should have_css_node('.feature .scenario.outline h4', /Vegetables/) }
+ it { @doc.css('.feature .scenario.outline h4').length.should == 2}
+ it { @doc.should have_css_node('.feature .scenario.outline table', //) }
+ it { @doc.should have_css_node('.feature .scenario.outline table td', /carrots/) }
+ end
+
+ describe "with a step with a py string" do
+ define_feature <<-FEATURE
+ Scenario: Monkey goes to town
+ Given there is a monkey called:
+ """
+ foo
+ """
+ FEATURE
+
+ it { @doc.should have_css_node('.feature .scenario .val', /foo/) }
+ end
+
+ describe "with a multiline step arg" do
+ define_feature <<-FEATURE
+ Scenario: Monkey goes to town
+ Given there are monkeys:
+ | name |
+ | foo |
+ | bar |
+ FEATURE
+
+ it { @doc.should have_css_node('.feature .scenario table td', /foo/) }
+ end
+
+ describe "with a table in the background and the scenario" do
+ define_feature <<-FEATURE
+ Background:
+ Given table:
+ | a | b |
+ | c | d |
+ Scenario:
+ Given another table:
+ | e | f |
+ | g | h |
+ FEATURE
+
+ it { @doc.css('td').length.should == 8 }
+ end
+
+ describe "with a py string in the background and the scenario" do
+ define_feature <<-FEATURE
+ Background:
+ Given stuff:
+ """
+ foo
+ """
+ Scenario:
+ Given more stuff:
+ """
+ bar
+ """
+ FEATURE
+
+ it { @doc.css('.feature .background pre.val').length.should == 1 }
+ it { @doc.css('.feature .scenario pre.val').length.should == 1 }
+ end
+
+ describe "with a step that fails in the scenario" do
+ define_steps do
+ Given(/boo/) { raise 'eek' }
+ end
+
+ define_feature(<<-FEATURE)
+ Scenario: Monkey gets a fright
+ Given boo
+ FEATURE
+
+ it { @doc.should have_css_node('.feature .scenario .step.failed', /eek/) }
+ end
+
+ describe "with a step that fails in the backgound" do
+ define_steps do
+ Given(/boo/) { raise 'eek' }
+ end
+
+ define_feature(<<-FEATURE)
+ Background:
+ Given boo
+ Scenario:
+ Given yay
+ FEATURE
+
+ it { @doc.should have_css_node('.feature .background .step.failed', /eek/) }
+ it { @doc.should_not have_css_node('.feature .scenario .step.failed', //) }
+ it { @doc.should have_css_node('.feature .scenario .step.undefined', /yay/) }
+ end
+
+ end
+ end
+ end
+end
+
diff --git a/vendor/gems/gems/cucumber-0.4.4/spec/cucumber/formatter/junit_spec.rb b/vendor/gems/gems/cucumber-0.4.4/spec/cucumber/formatter/junit_spec.rb
new file mode 100755
index 00000000..8207b4b5
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/spec/cucumber/formatter/junit_spec.rb
@@ -0,0 +1,107 @@
+require File.dirname(__FILE__) + '/../../spec_helper'
+require File.dirname(__FILE__) + '/spec_helper'
+
+require 'cucumber/formatter/junit'
+require 'nokogiri'
+
+module Cucumber::Formatter
+ describe Junit do
+ extend SpecHelperDsl
+ include SpecHelper
+
+ class TestDoubleJunitFormatter < Junit
+ attr_reader :written_files
+
+ def write_file(feature_filename, data)
+ @written_files ||= {}
+ @written_files[feature_filename] = data
+ end
+ end
+
+ before(:each) do
+ File.stub!(:directory?).and_return(true)
+ @formatter = TestDoubleJunitFormatter.new(step_mother, '', {})
+ end
+
+ describe "a feature with no name" do
+ define_feature <<-FEATURE
+ Scenario: Passing
+ Given a passing scenario
+ FEATURE
+
+ it "should raise an exception" do
+ lambda { run_defined_feature }.should raise_error(Junit::UnNamedFeatureError)
+ end
+ end
+
+ describe "given a single feature" do
+ before(:each) do
+ run_defined_feature
+ @doc = Nokogiri.XML(@formatter.written_files.values.first)
+ end
+
+ describe "with a single scenario" do
+ define_feature <<-FEATURE
+ Feature: One passing scenario, one failing scenario
+
+ Scenario: Passing
+ Given a passing scenario
+ FEATURE
+
+ it { @doc.to_s.should =~ /One passing scenario, one failing scenario/ }
+ end
+
+ describe "with a scenario outline table" do
+ define_steps do
+ Given(/.*/) { }
+ end
+
+ define_feature <<-FEATURE
+ Feature: Eat things when hungry
+
+ Scenario Outline: Eat things
+ Given
+
+ Examples: Good
+ | Things |
+ | Cucumber |
+ | Whisky |
+ Examples: Evil
+ | Things |
+ | Big Mac |
+ FEATURE
+
+ it { @doc.to_s.should =~ /Eat things when hungry/ }
+ it { @doc.to_s.should =~ /Cucumber/ }
+ it { @doc.to_s.should =~ /Whisky/ }
+ it { @doc.to_s.should =~ /Big Mac/ }
+ it { @doc.to_s.should_not =~ /Things/ }
+ it { @doc.to_s.should_not =~ /Good|Evil/ }
+ end
+
+ describe "with a regular data table scenario" do
+ define_steps do
+ Given(/the following items on a shortlist/) { |table| }
+ When(/I go.*/) { }
+ Then(/I should have visited at least/) { |table| }
+ end
+
+ define_feature <<-FEATURE
+ Feature: Shortlist
+
+ Scenario: Procure items
+ Given the following items on a shortlist:
+ | item |
+ | milk |
+ | cookies |
+ When I get some..
+ Then I'll eat 'em
+
+ FEATURE
+ # these type of tables shouldn't crash (or generate test cases)
+ it { @doc.to_s.should_not =~ /milk/ }
+ it { @doc.to_s.should_not =~ /cookies/ }
+ end
+ end
+ end
+end
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/spec/cucumber/formatter/progress_spec.rb b/vendor/gems/gems/cucumber-0.4.4/spec/cucumber/formatter/progress_spec.rb
new file mode 100755
index 00000000..24f7c624
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/spec/cucumber/formatter/progress_spec.rb
@@ -0,0 +1,38 @@
+require File.dirname(__FILE__) + '/../../spec_helper'
+require 'cucumber/formatter/progress'
+
+module Cucumber
+ module Formatter
+ describe Progress do
+
+ before(:each) do
+ Term::ANSIColor.coloring = false
+ @out = StringIO.new
+ progress = Progress.new(mock("step mother"), @out, {})
+ @visitor = Ast::TreeWalker.new(nil, [progress])
+ end
+
+ describe "visiting a table cell value without a status" do
+ it "should take the status from the last run step" do
+ @visitor.visit_step_result('', '', nil, :failed, nil, 10, nil)
+ outline_table = mock()
+ outline_table.should_receive(:accept) do |visitor|
+ visitor.visit_table_cell_value('value', nil)
+ end
+ @visitor.visit_outline_table(outline_table)
+
+ @out.string.should == "FF"
+ end
+ end
+
+ describe "visiting a table cell which is a table header" do
+ it "should not output anything" do
+ @visitor.visit_table_cell_value('value', :skipped_param)
+
+ @out.string.should == ""
+ end
+ end
+
+ end
+ end
+end
diff --git a/vendor/gems/gems/cucumber-0.4.4/spec/cucumber/formatter/spec_helper.rb b/vendor/gems/gems/cucumber-0.4.4/spec/cucumber/formatter/spec_helper.rb
new file mode 100755
index 00000000..1abdcef5
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/spec/cucumber/formatter/spec_helper.rb
@@ -0,0 +1,50 @@
+module Cucumber
+ module Formatter
+
+ module SpecHelperDsl
+ attr_reader :feature_content, :step_defs
+
+ def define_feature(string)
+ @feature_content = string
+ end
+
+ def define_steps(&block)
+ @step_defs = block
+ end
+ end
+
+ module SpecHelper
+ def run_defined_feature
+ define_steps
+ features = load_features(self.class.feature_content || raise("No feature content defined!"))
+ run(features)
+ end
+
+ def step_mother
+ @step_mother ||= StepMother.new
+ end
+
+ def load_features(content)
+ feature_file = FeatureFile.new('spec.feature', content)
+ features = Ast::Features.new
+ features.add_feature feature_file.parse(@step_mother, {})
+ features
+ end
+
+ def run(features)
+ # options = { :verbose => true }
+ options = {}
+ tree_walker = Cucumber::Ast::TreeWalker.new(@step_mother, [@formatter], options, STDOUT)
+ tree_walker.visit_features(features)
+ end
+
+ def define_steps
+ return unless step_defs = self.class.step_defs
+ rb = @step_mother.load_programming_language('rb')
+ dsl = Object.new
+ dsl.extend RbSupport::RbDsl
+ dsl.instance_exec &step_defs
+ end
+ end
+ end
+end
\ No newline at end of file
diff --git a/vendor/gems/gems/cucumber-0.4.4/spec/cucumber/parser/feature_parser_spec.rb b/vendor/gems/gems/cucumber-0.4.4/spec/cucumber/parser/feature_parser_spec.rb
new file mode 100755
index 00000000..c25e50af
--- /dev/null
+++ b/vendor/gems/gems/cucumber-0.4.4/spec/cucumber/parser/feature_parser_spec.rb
@@ -0,0 +1,400 @@
+require File.dirname(__FILE__) + '/../../spec_helper'
+require 'cucumber/parser/natural_language'
+
+module Cucumber
+ module Parser
+ describe Feature do
+ before do
+ @step_mother = StepMother.new
+ @parser = NaturalLanguage.get(@step_mother, 'en').parser
+ end
+
+ after do
+ NaturalLanguage.instance_variable_set(:@languages, nil) # So that new StepMothers can be created and have adverbs registered
+ end
+
+ def parse(text)
+ feature = @parser.parse_or_fail(text)
+ end
+
+ def parse_file(file)
+ FeatureFile.new(File.dirname(__FILE__) + "/../treetop_parser/" + file).parse(@step_mother, {})
+ end
+
+ def parse_example_file(file)
+ FeatureFile.new(File.dirname(__FILE__) + "/../../../examples/" + file).parse(@step_mother, {})
+ end
+
+ describe "Comments" do
+ it "should parse a file with only a one line comment" do
+ parse(%{# My comment
+Feature: hi
+}).to_sexp.should ==
+ [:feature, nil, "Feature: hi",
+ [:comment, "# My comment\n"]]
+ end
+
+ it "should parse a file with only a multiline comment" do
+ parse(%{# Hello
+# World
+Feature: hi
+}).to_sexp.should ==
+ [:feature, nil, "Feature: hi",
+ [:comment, "# Hello\n# World\n"]]
+ end
+
+ it "should parse a file with no comments" do
+ parse("Feature: hi\n").to_sexp.should ==
+ [:feature, nil, "Feature: hi"]
+ end
+
+ it "should parse a file with only a multiline comment with newlines" do
+ parse("# Hello\n\n# World\n").to_sexp.should ==
+ [:feature, nil, "",
+ [:comment, "# Hello\n\n# World\n"]]
+ end
+
+ it "should not consume comments as part of a multiline name" do
+ parse("Feature: hi\n Scenario: test\n\n#hello\n Scenario: another").to_sexp.should ==
+ [:feature, nil, "Feature: hi",
+ [:scenario, 2, "Scenario:", "test"],
+ [:scenario, 5, "Scenario:", "another",
+ [:comment, "#hello\n "]]]
+ end
+ end
+
+ describe "Tags" do
+ it "should parse a file with tags on a feature" do
+ parse("# My comment\n@hello @world Feature: hi\n").to_sexp.should ==
+ [:feature, nil, "Feature: hi",
+ [:comment, "# My comment\n"],
+ [:tag, "@hello"],
+ [:tag, "@world"]]
+ end
+
+ it "should not take the tags as part of a multiline name feature element" do
+ parse("Feature: hi\n Scenario: test\n\n@hello Scenario: another").to_sexp.should ==
+ [:feature, nil, "Feature: hi",
+ [:scenario, 2, "Scenario:", "test"],
+ [:scenario, 4, "Scenario:", "another",
+ [:tag, "@hello"]]]
+ end
+
+ it "should parse a file with tags on a scenario" do
+ parse(%{# FC
+ @ft
+Feature: hi
+
+ @st1 @st2
+ Scenario: First
+ Given Pepper
+
+@st3
+ @st4 @ST5 @#^%&ST6**!
+ Scenario: Second}).to_sexp.should ==
+ [:feature, nil, "Feature: hi",
+ [:comment, "# FC\n "],
+ [:tag, "@ft"],
+ [:scenario, 6, 'Scenario:', 'First',
+ [:tag, "@st1"], [:tag, "@st2"],
+ [:step_invocation, 7, "Given", "Pepper"]
+ ],
+ [:scenario, 11, 'Scenario:', 'Second',
+ [:tag, "@st3"], [:tag, "@st4"], [:tag, "@ST5"], [:tag, "@#^%&ST6**!"]]]
+ end
+ end
+
+ describe "Background" do
+ it "should have steps" do
+ parse("Feature: Hi\nBackground:\nGiven I am a step\n").to_sexp.should ==
+ [:feature, nil, "Feature: Hi",
+ [:background, 2, "Background:",
+ [:step, 3, "Given", "I am a step"]]]
+ end
+
+ it "should allow multiline names" do
+ parse(%{Feature: Hi
+Background: It is my ambition to say
+ in ten sentences
+ what others say
+ in a whole book.
+Given I am a step}).to_sexp.should ==
+ [:feature, nil, "Feature: Hi",
+ [:background, 2, "Background:", "It is my ambition to say\nin ten sentences\nwhat others say\nin a whole book.",
+ [:step, 6, "Given", "I am a step"]]]
+ end
+ end
+
+ describe "Scenarios" do
+ it "can be empty" do
+ parse("Feature: Hi\n\nScenario: Hello\n").to_sexp.should ==
+ [:feature, nil, "Feature: Hi",
+ [:scenario, 3, "Scenario:", "Hello"]]
+ end
+
+ it "should allow whitespace lines after the Scenario line" do
+ parse(%{Feature: Foo
+
+Scenario: bar
+
+ Given baz})
+ end
+
+ it "should have steps" do
+ parse("Feature: Hi\nScenario: Hello\nGiven I am a step\n").to_sexp.should ==
+ [:feature, nil, "Feature: Hi",
+ [:scenario, 2, "Scenario:", "Hello",
+ [:step_invocation, 3, "Given", "I am a step"]]]
+ end
+
+ it "should have steps with inline table" do
+ parse(%{Feature: Hi
+Scenario: Hello
+Given I have a table
+|a|b|
+}).to_sexp.should ==
+ [:feature, nil, "Feature: Hi",
+ [:scenario, 2, "Scenario:", "Hello",
+ [:step_invocation, 3, "Given", "I have a table",
+ [:table,
+ [:row, 4,
+ [:cell, "a"],
+ [:cell, "b"]]]]]]
+ end
+
+ it "should have steps with inline py_string" do
+ parse(%{Feature: Hi
+Scenario: Hello
+Given I have a string
+
+
+ """
+ hello
+ world
+ """
+
+}).to_sexp.should ==
+ [:feature, nil, "Feature: Hi",
+ [:scenario, 2, "Scenario:", "Hello",
+ [:step_invocation, 3, "Given", "I have a string",
+ [:py_string, "hello\nworld"]]]]
+ end
+
+ it "should allow multiline names" do
+ parse(%{Feature: Hi
+Scenario: It is my ambition to say
+ in ten sentences
+ what others say
+ in a whole book.
+Given I am a step
+
+}).to_sexp.should ==
+ [:feature, nil, "Feature: Hi",
+ [:scenario, 2, "Scenario:", "It is my ambition to say\nin ten sentences\nwhat others say\nin a whole book.",
+ [:step_invocation, 6, "Given", "I am a step"]]]
+ end
+
+ it "should ignore gherkin keywords which are parts of other words in the name" do
+ parse(%{Feature: Parser bug
+Scenario: I have a Button
+ Buttons are great
+ Given I have it
+}).to_sexp.should ==
+ [:feature, nil, "Feature: Parser bug",
+ [:scenario, 2, "Scenario:", "I have a Button\nButtons are great",
+ [:step_invocation, 4, "Given", "I have it"]]]
+
+ end
+ end
+
+ describe "Scenario Outlines" do
+ it "can be empty" do
+ parse(%{Feature: Hi
+Scenario Outline: Hello
+Given a cucumber
+Examples:
+|what|
+|green|
+}).to_sexp.should ==
+ [:feature, nil, "Feature: Hi",
+ [:scenario_outline, "Scenario Outline:", "Hello",
+ [:step, 3, "Given", "a