saffron 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (135) hide show
  1. data/.gitignore +5 -0
  2. data/.travis.yml +5 -0
  3. data/Gemfile +4 -0
  4. data/Gemfile.lock +43 -0
  5. data/MIT +21 -0
  6. data/README.md +63 -0
  7. data/Rakefile +16 -0
  8. data/app/assets/stylesheets/_variables.scss +18 -0
  9. data/app/assets/stylesheets/entrances/_drop-in.scss +19 -0
  10. data/app/assets/stylesheets/entrances/_fade-in-down.scss +13 -0
  11. data/app/assets/stylesheets/entrances/_fade-in-left.scss +13 -0
  12. data/app/assets/stylesheets/entrances/_fade-in-right.scss +13 -0
  13. data/app/assets/stylesheets/entrances/_fade-in-up.scss +13 -0
  14. data/app/assets/stylesheets/entrances/_fade-in-zoom-big.scss +20 -0
  15. data/app/assets/stylesheets/entrances/_fade-in-zoom.scss +14 -0
  16. data/app/assets/stylesheets/entrances/_fade-in.scss +13 -0
  17. data/app/assets/stylesheets/entrances/_newspaper.scss +14 -0
  18. data/app/assets/stylesheets/entrances/_pop-in.scss +14 -0
  19. data/app/assets/stylesheets/entrances/_rise-in.scss +13 -0
  20. data/app/assets/stylesheets/entrances/_slide-in.scss +35 -0
  21. data/app/assets/stylesheets/entrances/_stretch.scss +33 -0
  22. data/app/assets/stylesheets/entrances/_turn-in.scss +31 -0
  23. data/app/assets/stylesheets/exits/_compress.scss +25 -0
  24. data/app/assets/stylesheets/exits/_drop-out.scss +14 -0
  25. data/app/assets/stylesheets/exits/_explode.scss +14 -0
  26. data/app/assets/stylesheets/exits/_fade-out-down.scss +14 -0
  27. data/app/assets/stylesheets/exits/_fade-out-left.scss +13 -0
  28. data/app/assets/stylesheets/exits/_fade-out-right.scss +13 -0
  29. data/app/assets/stylesheets/exits/_fade-out-up.scss +14 -0
  30. data/app/assets/stylesheets/exits/_fade-out-zoom-big.scss +19 -0
  31. data/app/assets/stylesheets/exits/_fade-out-zoom.scss +14 -0
  32. data/app/assets/stylesheets/exits/_fade-out.scss +13 -0
  33. data/app/assets/stylesheets/exits/_poof.scss +17 -0
  34. data/app/assets/stylesheets/exits/_rise-out.scss +14 -0
  35. data/app/assets/stylesheets/exits/_slide-out.scss +29 -0
  36. data/app/assets/stylesheets/exits/_turn-out.scss +33 -0
  37. data/app/assets/stylesheets/helpers/_animation.scss +3 -0
  38. data/app/assets/stylesheets/helpers/_contains.scss +4 -0
  39. data/app/assets/stylesheets/helpers/_keyframes.scss +25 -0
  40. data/app/assets/stylesheets/helpers/_prefix.scss +39 -0
  41. data/app/assets/stylesheets/helpers/_transform.scss +9 -0
  42. data/app/assets/stylesheets/helpers/_transition.scss +7 -0
  43. data/app/assets/stylesheets/in-place/_around-the-world.scss +12 -0
  44. data/app/assets/stylesheets/in-place/_bounce.scss +24 -0
  45. data/app/assets/stylesheets/in-place/_colors.scss +23 -0
  46. data/app/assets/stylesheets/in-place/_contract.scss +7 -0
  47. data/app/assets/stylesheets/in-place/_cube-flip.scss +55 -0
  48. data/app/assets/stylesheets/in-place/_enlarge.scss +7 -0
  49. data/app/assets/stylesheets/in-place/_expand.scss +6 -0
  50. data/app/assets/stylesheets/in-place/_flip.scss +19 -0
  51. data/app/assets/stylesheets/in-place/_float.scss +17 -0
  52. data/app/assets/stylesheets/in-place/_ping.scss +13 -0
  53. data/app/assets/stylesheets/in-place/_pulsate.scss +14 -0
  54. data/app/assets/stylesheets/in-place/_quiver.scss +42 -0
  55. data/app/assets/stylesheets/in-place/_shake.scss +24 -0
  56. data/app/assets/stylesheets/in-place/_spin.scss +12 -0
  57. data/app/assets/stylesheets/in-place/_square-dance.scss +18 -0
  58. data/app/assets/stylesheets/in-place/_sunrise.scss +12 -0
  59. data/app/assets/stylesheets/in-place/_sway.scss +17 -0
  60. data/app/assets/stylesheets/in-place/_teeter.scss +29 -0
  61. data/app/assets/stylesheets/saffron.scss +62 -0
  62. data/bin/saffron +9 -0
  63. data/features/install.feature +28 -0
  64. data/features/step_definitions/saffron.rb +37 -0
  65. data/features/support/env.rb +1 -0
  66. data/features/update.feature +37 -0
  67. data/features/version.feature +10 -0
  68. data/lib/saffron.rb +13 -0
  69. data/lib/saffron/engine.rb +4 -0
  70. data/lib/saffron/installer.rb +55 -0
  71. data/lib/saffron/version.rb +3 -0
  72. data/saffron.gemspec +31 -0
  73. data/saffron/_variables.scss +18 -0
  74. data/saffron/entrances/_drop-in.scss +19 -0
  75. data/saffron/entrances/_fade-in-down.scss +13 -0
  76. data/saffron/entrances/_fade-in-left.scss +13 -0
  77. data/saffron/entrances/_fade-in-right.scss +13 -0
  78. data/saffron/entrances/_fade-in-up.scss +13 -0
  79. data/saffron/entrances/_fade-in-zoom-big.scss +20 -0
  80. data/saffron/entrances/_fade-in-zoom.scss +14 -0
  81. data/saffron/entrances/_fade-in.scss +13 -0
  82. data/saffron/entrances/_newspaper.scss +14 -0
  83. data/saffron/entrances/_pop-in.scss +14 -0
  84. data/saffron/entrances/_rise-in.scss +13 -0
  85. data/saffron/entrances/_slide-in.scss +35 -0
  86. data/saffron/entrances/_stretch.scss +33 -0
  87. data/saffron/entrances/_turn-in.scss +31 -0
  88. data/saffron/exits/_compress.scss +25 -0
  89. data/saffron/exits/_drop-out.scss +14 -0
  90. data/saffron/exits/_explode.scss +14 -0
  91. data/saffron/exits/_fade-out-down.scss +14 -0
  92. data/saffron/exits/_fade-out-left.scss +13 -0
  93. data/saffron/exits/_fade-out-right.scss +13 -0
  94. data/saffron/exits/_fade-out-up.scss +14 -0
  95. data/saffron/exits/_fade-out-zoom-big.scss +19 -0
  96. data/saffron/exits/_fade-out-zoom.scss +14 -0
  97. data/saffron/exits/_fade-out.scss +13 -0
  98. data/saffron/exits/_poof.scss +17 -0
  99. data/saffron/exits/_rise-out.scss +14 -0
  100. data/saffron/exits/_slide-out.scss +29 -0
  101. data/saffron/exits/_turn-out.scss +33 -0
  102. data/saffron/helpers/_animation.scss +3 -0
  103. data/saffron/helpers/_contains.scss +4 -0
  104. data/saffron/helpers/_keyframes.scss +25 -0
  105. data/saffron/helpers/_prefix.scss +39 -0
  106. data/saffron/helpers/_transform.scss +9 -0
  107. data/saffron/helpers/_transition.scss +7 -0
  108. data/saffron/in-place/_around-the-world.scss +12 -0
  109. data/saffron/in-place/_bounce.scss +24 -0
  110. data/saffron/in-place/_colors.scss +23 -0
  111. data/saffron/in-place/_contract.scss +7 -0
  112. data/saffron/in-place/_cube-flip.scss +55 -0
  113. data/saffron/in-place/_enlarge.scss +7 -0
  114. data/saffron/in-place/_expand.scss +6 -0
  115. data/saffron/in-place/_flip.scss +19 -0
  116. data/saffron/in-place/_float.scss +17 -0
  117. data/saffron/in-place/_ping.scss +13 -0
  118. data/saffron/in-place/_pulsate.scss +14 -0
  119. data/saffron/in-place/_quiver.scss +42 -0
  120. data/saffron/in-place/_shake.scss +24 -0
  121. data/saffron/in-place/_spin.scss +12 -0
  122. data/saffron/in-place/_square-dance.scss +18 -0
  123. data/saffron/in-place/_sunrise.scss +12 -0
  124. data/saffron/in-place/_sway.scss +17 -0
  125. data/saffron/in-place/_teeter.scss +29 -0
  126. data/saffron/saffron.scss +62 -0
  127. data/tasks/.csscomb.json +297 -0
  128. data/tasks/.csslintrc +19 -0
  129. data/tasks/Gruntfile.js +111 -0
  130. data/tasks/compiled/index.html +11 -0
  131. data/tasks/compiled/saffron.css +3049 -0
  132. data/tasks/compiled/test.css +3086 -0
  133. data/tasks/package.json +32 -0
  134. data/tasks/test.scss +13 -0
  135. metadata +278 -0
@@ -0,0 +1,7 @@
1
+ @mixin enlarge($selector: ":hover", $duration: 0.5s, $delay: 0s, $timing: cubic-bezier(1.000, -0.600, 0.595, 0.835)) {
2
+ @include transition(all $duration $delay $timing);
3
+ @include transform(translateY(0) scale(1) translateZ(0));
4
+ &#{$selector} {
5
+ @include transform(translateY($enlarge-contract-jump * -1) scale($enlarge-contract-multiple));
6
+ }
7
+ }
@@ -0,0 +1,6 @@
1
+ @mixin expand($direction, $amount: 1em, $selector: ":hover", $duration: 0.5s, $delay: 0s, $timing: cubic-bezier(0.680, -0.550, 0.275, 1.465)) {
2
+ @include transition(padding-#{$direction} $duration $delay $timing);
3
+ &#{$selector} {
4
+ padding-#{$direction}: $amount;
5
+ }
6
+ }
@@ -0,0 +1,19 @@
1
+ @mixin flip($selector: ".flipped", $duration: 0.5s, $delay: 0s, $fill-mode: both, $count: 1, $timing: ease-in) {
2
+ position: relative;
3
+ @include prefix(transform-style, preserve-3d, webkit spec);
4
+ @include transition(all $duration $delay $timing);
5
+ @include prefix(backface-visibility, hidden, webkit moz spec);
6
+ &#{$selector} {
7
+ @include transform(rotateY(180deg)translateZ(0));
8
+ }
9
+ &::after {
10
+ content: '';
11
+ position: absolute;
12
+ left: 0;
13
+ height: 100%;
14
+ width: 100%;
15
+ @include prefix(backface-visibility, inherit, webkit moz spec);
16
+ @include transform(rotateY(180deg));
17
+ }
18
+ }
19
+
@@ -0,0 +1,17 @@
1
+ @include keyframes(float) {
2
+ 0%, 50%, 100% {
3
+ @include transform(translateY($float-bob-distance * -1) translateZ(0));
4
+ }
5
+ 25% {
6
+ @include transform(translateY($float-bob-distance) rotate($float-bob-angle));
7
+ }
8
+ 75% {
9
+ @include transform(translateY($float-bob-distance) rotate($float-bob-angle * -1));
10
+ }
11
+ }
12
+
13
+ @mixin float($duration: 5s, $delay: 0s, $fill-mode: none, $count: infinite, $timing: ease-in-out) {
14
+ // hack to fix jagged edges
15
+ outline: 1px solid transparent;
16
+ @include animation(float $count $duration $delay $fill-mode $timing);
17
+ }
@@ -0,0 +1,13 @@
1
+ @include keyframes(ping) {
2
+ 0% {
3
+ @include transform(scale(0));
4
+ }
5
+ 100% {
6
+ @include transform(scale(1));
7
+ opacity: 0;
8
+ }
9
+ }
10
+
11
+ @mixin ping($duration: 1.5s, $delay: 0s, $fill-mode: none, $count: infinite, $timing: ease-in-out) {
12
+ @include animation(ping $count $duration $delay $fill-mode $timing);
13
+ }
@@ -0,0 +1,14 @@
1
+ @include keyframes(pulsate) {
2
+ 0%, 100% {
3
+ opacity: 1;
4
+ @include transform(scale(1) translateZ(0));
5
+ }
6
+ 50% {
7
+ opacity: 0.85;
8
+ @include transform(scale($pulsate-scale));
9
+ }
10
+ }
11
+
12
+ @mixin pulsate($duration: 1.5s, $delay: 0s, $fill-mode: none, $count: 3) {
13
+ @include animation(pulsate $count $duration $delay $fill-mode);
14
+ }
@@ -0,0 +1,42 @@
1
+ @include keyframes(quiver) {
2
+ 0%{
3
+ @include transform(translate3d(2px, 1px, 0) rotate(0deg));
4
+ }
5
+ 10% {
6
+ @include transform(translate3d(-1px, 2px, 0) rotate($quiver-angle));
7
+ }
8
+ 20% {
9
+ @include transform(translate3d(-3px, 0) rotate($quiver-angle * -1));
10
+ }
11
+ 30% {
12
+ @include transform(translate3d(0, 2px, 0) rotate(0deg));
13
+ }
14
+ 40% {
15
+ @include transform(translate3d(1px, -1px, 0) rotate($quiver-angle));
16
+ }
17
+ 50% {
18
+ @include transform(translate3d(-1px, 2px, 0) rotate($quiver-angle * -1));
19
+ }
20
+ 60% {
21
+ @include transform(translate3d(-3px, 1px, 0) rotate(0deg));
22
+ }
23
+ 70% {
24
+ @include transform(translate3d(2px, 1px, 0) rotate($quiver-angle));
25
+ }
26
+ 80% {
27
+ @include transform(translate3d(-1px, -1px, 0) rotate($quiver-angle * -1));
28
+ }
29
+ 90% {
30
+ @include transform(translate3d(2px, 2px, 0) rotate(0deg));
31
+ }
32
+ 100% {
33
+ @include transform(translate3d(1px, -2px, 0) rotate($quiver-angle));
34
+ }
35
+
36
+ }
37
+
38
+ @mixin quiver($duration: 0.75s, $delay: 0s, $fill-mode: none, $count: infinite) {
39
+ // hack to fix jagged edges
40
+ outline: 1px solid transparent;
41
+ @include animation(quiver $duration $delay $fill-mode $count);
42
+ }
@@ -0,0 +1,24 @@
1
+ @include keyframes(shake) {
2
+ 0%, 100% {
3
+ @include transform(translateX(0) translateZ(0));
4
+ }
5
+ 15% {
6
+ @include transform(translateX($shake-distance));
7
+ }
8
+ 35% {
9
+ @include transform(translateX($shake-distance * -1));
10
+ }
11
+ 50% {
12
+ @include transform(translateX($shake-distance / 2));
13
+ }
14
+ 65% {
15
+ @include transform(translateX($shake-distance / 2 * -1));
16
+ }
17
+ 85% {
18
+ @include transform(translateX($shake-distance / 3));
19
+ }
20
+ }
21
+
22
+ @mixin shake($duration: 0.5s, $delay: 0s, $fill-mode: none, $count: 1) {
23
+ @include animation(shake $duration $delay $fill-mode $count);
24
+ }
@@ -0,0 +1,12 @@
1
+ @include keyframes(spin) {
2
+ 0% {
3
+ @include transform(rotate(0deg) translateZ(0));
4
+ }
5
+ 100% {
6
+ @include transform(rotate(360deg));
7
+ }
8
+ }
9
+
10
+ @mixin spin($duration: 0.5s, $delay: 0s, $fill-mode: none, $count: 1, $timing: ease-in-out) {
11
+ @include animation(spin $count $duration $delay $fill-mode $timing);
12
+ }
@@ -0,0 +1,18 @@
1
+ @include keyframes(squareDance) {
2
+ 0%, 100% {
3
+ @include transform(translate3d(100%, 0, 0));
4
+ }
5
+ 25% {
6
+ @include transform(translate3d(100%, 100%, 0));
7
+ }
8
+ 50% {
9
+ @include transform(translate3d(0, 100%, 0));
10
+ }
11
+ 75% {
12
+ @include transform(translate3d(0, 0, 0));
13
+ }
14
+ }
15
+
16
+ @mixin squareDance($duration: 3s, $delay: 0s, $fill-mode: none, $count: infinite, $timing: ease-in-out) {
17
+ @include animation(squareDance $count $duration $delay $fill-mode $timing);
18
+ }
@@ -0,0 +1,12 @@
1
+ @include keyframes(sunrise) {
2
+ 0% {
3
+ @include transform(rotate(0deg) translate($sunrise-arch) rotate(0deg));
4
+ }
5
+ 100% {
6
+ @include transform(rotate(180deg) translate($sunrise-arch) rotate(-180deg));
7
+ }
8
+ }
9
+
10
+ @mixin sunrise($duration: 4s, $delay: 0s, $fill-mode: both, $count: 1, $timing: ease-in-out) {
11
+ @include animation(sunrise $count $duration $delay $fill-mode $timing);
12
+ }
@@ -0,0 +1,17 @@
1
+ @include keyframes(sway) {
2
+ 0%, 50%, 100% {
3
+ @include transform(rotate($sway-angle) translateZ(0));
4
+ }
5
+ 25% {
6
+ @include transform(rotate($sway-angle * -1));
7
+ }
8
+ 75% {
9
+ @include transform(rotate($sway-angle * -1));
10
+ }
11
+ }
12
+
13
+ @mixin sway($duration: 6.5s, $delay: 0s, $fill-mode: none, $count: infinite, $timing: ease-in-out) {
14
+ // hack to fix jagged edges
15
+ outline: 1px solid transparent;
16
+ @include animation(sway $count $duration $delay $fill-mode $timing);
17
+ }
@@ -0,0 +1,29 @@
1
+ @include keyframes(teeter) {
2
+ 0%, 100% {
3
+ @include transform(rotate(0deg) translateZ(0));
4
+ }
5
+ 15% {
6
+ @include transform(rotate($teeter-angle));
7
+ }
8
+ 30% {
9
+ @include transform(rotate($teeter-angle * -1));
10
+ }
11
+ 45% {
12
+ @include transform(rotate($teeter-angle / 2));
13
+ }
14
+ 60% {
15
+ @include transform(rotate($teeter-angle / 2 * -1));
16
+ }
17
+ 73% {
18
+ @include transform(rotate($teeter-angle / 3));
19
+ }
20
+ 86% {
21
+ @include transform(rotate($teeter-angle / 3 * -1));
22
+ }
23
+ }
24
+
25
+ @mixin teeter($duration: 1s, $delay: 0s, $fill-mode: none, $count: 1) {
26
+ // hack to fix jagged edges
27
+ outline: 1px solid transparent;
28
+ @include animation(teeter $duration $delay $fill-mode $count);
29
+ }
@@ -0,0 +1,62 @@
1
+ // Variables
2
+ @import "variables";
3
+
4
+ // Helper Mixins and Functions
5
+ @import "helpers/contains";
6
+ @import "helpers/prefix";
7
+ @import "helpers/animation";
8
+ @import "helpers/transition";
9
+ @import "helpers/transform";
10
+ @import "helpers/keyframes";
11
+
12
+ // Entrances
13
+ @import "entrances/fade-in";
14
+ @import "entrances/fade-in-up";
15
+ @import "entrances/fade-in-down";
16
+ @import "entrances/fade-in-left";
17
+ @import "entrances/fade-in-right";
18
+ @import "entrances/fade-in-zoom";
19
+ @import "entrances/fade-in-zoom-big";
20
+ @import "entrances/slide-in";
21
+ @import "entrances/drop-in";
22
+ @import "entrances/rise-in";
23
+ @import "entrances/pop-in";
24
+ @import "entrances/turn-in";
25
+ @import "entrances/stretch";
26
+ @import "entrances/newspaper";
27
+
28
+ // Exits
29
+ @import "exits/fade-out";
30
+ @import "exits/fade-out-down";
31
+ @import "exits/fade-out-up";
32
+ @import "exits/fade-out-left";
33
+ @import "exits/fade-out-right";
34
+ @import "exits/fade-out-zoom";
35
+ @import "exits/fade-out-zoom-big";
36
+ @import "exits/slide-out";
37
+ @import "exits/explode";
38
+ @import "exits/drop-out";
39
+ @import "exits/rise-out";
40
+ @import "exits/poof";
41
+ @import "exits/turn-out";
42
+ @import "exits/compress";
43
+
44
+ // In Place
45
+ @import "in-place/float";
46
+ @import "in-place/shake";
47
+ @import "in-place/expand";
48
+ @import "in-place/teeter";
49
+ @import "in-place/quiver";
50
+ @import "in-place/sway";
51
+ @import "in-place/spin";
52
+ @import "in-place/bounce";
53
+ @import "in-place/pulsate";
54
+ @import "in-place/colors";
55
+ @import "in-place/around-the-world";
56
+ @import "in-place/ping";
57
+ @import "in-place/square-dance";
58
+ @import "in-place/sunrise";
59
+ @import "in-place/enlarge";
60
+ @import "in-place/contract";
61
+ @import "in-place/flip";
62
+ @import "in-place/cube-flip";
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ begin
4
+ require File.dirname(__FILE__) + "/../lib/saffron"
5
+ rescue LoadError
6
+ require "saffron"
7
+ end
8
+
9
+ Saffron::Installer.start
@@ -0,0 +1,28 @@
1
+ @disable-bundler
2
+ Feature: Install saffron
3
+ As a user
4
+ I want to easily generate the Saffron files and directories
5
+ So I can use them in my project
6
+
7
+ Scenario: Installing Saffron by default
8
+ When I run `bundle exec saffron install`
9
+ Then the output should contain "Saffron succesfully installed in saffron/"
10
+ And a directory named "saffron" should exist
11
+ And the sub directories should exist inside "saffron/"
12
+ And the following files should exist:
13
+ | saffron/saffron.scss |
14
+ | saffron/_variables.scss |
15
+
16
+ Scenario: Installing Saffron into a specific directory
17
+ When I run `bundle exec saffron install -p path/to/directory`
18
+ Then the output should contain "Saffron succesfully installed in path/to/directory/saffron"
19
+ And a directory named "path/to/directory/saffron" should exist
20
+ And the sub directories should exist inside "path/to/directory/saffron/"
21
+ And the following files should exist:
22
+ | path/to/directory/saffron/saffron.scss |
23
+ | path/to/directory/saffron/_variables.scss |
24
+
25
+ Scenario: Saffron is already installed
26
+ When I run `bundle exec saffron install`
27
+ And I run `bundle exec saffron install`
28
+ Then the output should contain "Saffron already exists"
@@ -0,0 +1,37 @@
1
+ Then(/^the output should contain the current version number$/) do
2
+ assert_partial_output Saffron::VERSION, all_output
3
+ end
4
+
5
+ Then(/^the sub directories should exist inside "(.*?)"$/) do |directory|
6
+ sub_dirs = %w{entrances exits helpers in-place}.map do |sub_dir|
7
+ "#{directory}#{sub_dir}"
8
+ end
9
+ check_directory_presence sub_dirs, true
10
+ end
11
+
12
+ Given(/^Saffron already exists$/) do
13
+ run_simple "bundle exec saffron install"
14
+ end
15
+
16
+ When(/^I modify saffron at "(.*?)" with "(.*?)"$/) do |path, mod|
17
+ append_to_file "#{path}/saffron.scss", mod
18
+ end
19
+
20
+ Given(/^Saffron was installed into a specific directory$/) do
21
+ run_simple "bundle exec saffron install -p path/to/directory"
22
+ end
23
+
24
+ Then(/^saffron at "(.*?)" should still be modified with "(.*?)"$/) do |path, mod|
25
+ run_simple "cat #{path}/saffron.scss"
26
+ assert_partial_output mod, all_output
27
+ end
28
+
29
+ Then(/^saffron at "(.*?)" should no longer contain "(.*?)"$/) do |path, mod|
30
+ run_simple "cat #{path}/saffron.scss"
31
+ assert_no_partial_output mod, all_output
32
+ end
33
+
34
+ Given(/^Saffron does not yet exist$/) do
35
+ check_directory_presence(["saffron/"], false)
36
+ end
37
+
@@ -0,0 +1 @@
1
+ require 'aruba/cucumber'
@@ -0,0 +1,37 @@
1
+ @disable-bundler
2
+ Feature: Update saffron
3
+ As a user
4
+ I want to easily update my Saffron files
5
+ So I can maintain the most up-to-date functionality
6
+
7
+ Scenario: Updating Saffron at the default directory
8
+ Given Saffron does not yet exist
9
+ When I run `bundle exec saffron update`
10
+ Then the output should contain "Saffron not found. No updates occured."
11
+ And a directory named "saffron/" should not exist
12
+ And a file named "saffron/saffron.scss" should not exist
13
+
14
+ Given Saffron already exists
15
+ When I modify saffron at "saffron/" with "modification text"
16
+ And I run `bundle exec saffron update`
17
+ Then the output should contain "Saffron succesfully updated in saffron/"
18
+ And a directory named "saffron" should exist
19
+ And the sub directories should exist inside "saffron/"
20
+ And the following files should exist:
21
+ | saffron/saffron.scss |
22
+ | saffron/_variables.scss |
23
+ And saffron at "saffron/" should no longer contain "modification text"
24
+
25
+ Scenario: Updating Saffron at a specific directory
26
+ Given Saffron was installed into a specific directory
27
+ When I modify saffron at "path/to/directory/saffron/" with "modification text"
28
+ And I run `bundle exec saffron update`
29
+ Then saffron at "path/to/directory/saffron/" should still be modified with "modification text"
30
+ And the output should contain "Saffron not found. No updates occured."
31
+ And I run `bundle exec saffron update -p path/to/directory`
32
+ Then the output should contain "Saffron succesfully updated in path/to/directory/saffron"
33
+ And a directory named "path/to/directory/saffron" should exist
34
+ And the sub directories should exist inside "path/to/directory/saffron/"
35
+ And the following files should exist:
36
+ | path/to/directory/saffron/saffron.scss |
37
+ | path/to/directory/saffron/_variables.scss |
@@ -0,0 +1,10 @@
1
+ @disable-bundler
2
+ Feature: Output version
3
+ As a user
4
+ I want to know the current version of Saffron I have installed
5
+ So I can keep it up to date
6
+
7
+ Scenario: Viewing the current version of Saffron
8
+ When I run `bundle exec saffron version`
9
+ Then the output should contain the current version number
10
+