saffron 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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
+