guard-ecukes 0.0.1

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.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: c7bc03ba288039da3677e10cbf783be5ab18021f
4
+ data.tar.gz: a79a1878d260b9715e365da00aef773b309b4db1
5
+ SHA512:
6
+ metadata.gz: 0310a40a5745bfa39e7fa4b375418785f16897cc9ef0a9a3702bee81743e3af80c34b9d9c447c1adda15d61e5ec5a763281b38b0f18af713a978b649529384a8
7
+ data.tar.gz: 54a1ac552640419a4561ec124e295df3a83ada746d649f49a5b21f8857849b6f706560ca32a57c3a7b25a63326210d5259dbe25fd428b5d70faba0aad006191d
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2010-2013 Michael Kessler
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,151 @@
1
+ # Guard::Ecukes [![Build Status](https://secure.travis-ci.org/dillonkearns/guard-ecukes.png)](http://travis-ci.org/dillonkearns/guard-ecukes)
2
+
3
+ Guard::Ecukes allows you to automatically run [Ecukes](http://ecukes.info/) features when files are modified.
4
+
5
+ Tested on MRI Ruby 1.8.7, 1.9.2, 1.9.3, REE and the latest versions of JRuby & Rubinius.
6
+
7
+ If you have any questions please join us on our [Google group](http://groups.google.com/group/guard-dev) or on `#guard` (irc.freenode.net).
8
+
9
+ ## Install
10
+
11
+ The simplest way to install Guard is to use [Bundler](http://gembundler.com/).
12
+ Please make sure to have [Guard](https://github.com/guard/guard) installed before continue.
13
+
14
+ Add Guard::Ecukes to your `Gemfile`:
15
+
16
+ ```bash
17
+ group :development do
18
+ gem 'guard-ecukes
19
+ end
20
+ ```
21
+
22
+ Add the default Guard::Ecukes template to your `Guardfile` by running:
23
+
24
+ ```bash
25
+ $ guard init ecukes
26
+ ```
27
+
28
+ ## Usage
29
+
30
+ Please read the [Guard usage documentation](https://github.com/guard/guard#readme).
31
+
32
+ ## Guardfile
33
+
34
+ Guard::Ecukes can be adapted to all kind of projects and comes with a default template that looks like this:
35
+
36
+ ```ruby
37
+ guard 'ecukes' do
38
+ watch(%r{^features/.+\.feature$})
39
+ watch(%r{^([^\/]*\.el|features/support/.+\.el)$}) { 'features' }
40
+ watch(%r{^features/step_definitions/(.+)_steps\.el$}) { |m| Dir[File.join("**/#{m[1]}.feature")][0] || 'features' }
41
+ end
42
+ ```
43
+
44
+ Expressed in plain English, this configuration tells Guard::Ecukes:
45
+
46
+ 1. When a file within the features directory that ends in feature is modified, just run that single feature.
47
+ 2. When any file within features/support directory is modified, run all features.
48
+ 3. When a file within the features/step_definitions directory that ends in \_steps.rb is modified,
49
+ run the first feature that matches the name (\_steps.rb replaced by .feature) and when no feature is found,
50
+ then run all features.
51
+
52
+ Please read the [Guard documentation](http://github.com/guard/guard#readme) for more information about the Guardfile DSL.
53
+
54
+ ## Options
55
+
56
+ You can pass any of the standard Ecukes CLI options using the :cli option:
57
+
58
+ ```ruby
59
+ guard 'ecukes', :cli => '--reporter magnars --timeout 10'
60
+ ```
61
+
62
+ ### List of available options
63
+
64
+ ```ruby
65
+ :cli => '--reporter magnars --timeout 10' # Pass arbitrary Ecukes CLI arguments,
66
+ # default: none
67
+
68
+ :all_after_pass => false # Don't run all features after changed features pass
69
+ # default: true
70
+
71
+ :all_on_start => false # Don't run all the features at startup
72
+ # default: true
73
+
74
+ :run_all => { :cli => "-r progress" } # Override any option when running all specs
75
+ # default: {}
76
+
77
+ :command_prefix => 'xvfb-run' # Add a prefix to the ecukes command such as 'xvfb-run' or any
78
+ # other shell script.
79
+ # The example generates: 'xvfb-run bundle exec ecukes ...'
80
+ # default: nil
81
+ ```
82
+
83
+ Issues
84
+ ------
85
+
86
+ You can report issues and feature requests to [GitHub Issues](https://github.com/dillonkearns/guard-ecukes/issues). Try to figure out
87
+ where the issue belongs to: Is it an issue with Guard itself or with Guard::Ecukes? Please don't
88
+ ask question in the issue tracker, instead join us in our [Google group](http://groups.google.com/group/guard-dev) or on
89
+ `#guard` (irc.freenode.net).
90
+
91
+ When you file an issue, please try to follow to these simple rules if applicable:
92
+
93
+ * Make sure you run Guard with `bundle exec` first.
94
+ * Add debug information to the issue by running Guard with the `--debug` option.
95
+ * Add your `Guardfile` and `Gemfile` to the issue.
96
+ * Make sure that the issue is reproducible with your description.
97
+
98
+ ## Development
99
+
100
+ - Source hosted at [GitHub](https://github.com/dillonkearns/guard-ecukes).
101
+
102
+ Pull requests are very welcome! Please try to follow these simple rules if applicable:
103
+
104
+ * Please create a topic branch for every separate change you make.
105
+ * Make sure your patches are well tested.
106
+ * Update the README.
107
+ * Please **do not change** the version number.
108
+
109
+ For questions please join us in our [Google group](http://groups.google.com/group/guard-dev) or on
110
+ `#guard` (irc.freenode.net).
111
+
112
+ ## Author
113
+
114
+ Forked from [@netzpirat](https://twitter.com/#!/netzpirat)'s [guard-cucumber](https://github.com/netzpirat/guard-cucumber), developed by Michael Kessler, sponsored by [mksoft.ch](https://mksoft.ch).
115
+
116
+ ## Contributors
117
+
118
+ See the GitHub list of [contributors](https://github.com/dillonkearns/guard-ecukes/contributors).
119
+
120
+ ## Acknowledgment
121
+
122
+ The [Guard Team](https://github.com/guard/guard/contributors) for giving us such a nice pice of software
123
+ that is so easy to extend, one *has* to make a plugin for it!
124
+
125
+ All the authors of the numerous [Guards](http://github.com/guard) available for making the Guard ecosystem
126
+ so much growing and comprehensive.
127
+
128
+ ## License
129
+
130
+ (The MIT License)
131
+
132
+ Copyright (c) 2010-2013 Michael Kessler
133
+
134
+ Permission is hereby granted, free of charge, to any person obtaining
135
+ a copy of this software and associated documentation files (the
136
+ 'Software'), to deal in the Software without restriction, including
137
+ without limitation the rights to use, copy, modify, merge, publish,
138
+ distribute, sublicense, and/or sell copies of the Software, and to
139
+ permit persons to whom the Software is furnished to do so, subject to
140
+ the following conditions:
141
+
142
+ The above copyright notice and this permission notice shall be
143
+ included in all copies or substantial portions of the Software.
144
+
145
+ THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
146
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
147
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
148
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
149
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
150
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
151
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,84 @@
1
+ require 'guard'
2
+ require 'guard/guard'
3
+ require 'guard/ecukes/version'
4
+
5
+ module Guard
6
+
7
+ # The Ecukes guard that gets notifications about the following
8
+ # Guard events: `start`, `stop`, `reload`, `run_all` and `run_on_change`.
9
+ #
10
+ class Ecukes < Guard
11
+
12
+ autoload :Runner, 'guard/ecukes/runner'
13
+ autoload :Inspector, 'guard/ecukes/inspector'
14
+ autoload :Focuser, 'guard/ecukes/focuser'
15
+
16
+ # Initialize Guard::Ecukes.
17
+ #
18
+ # @param [Array<Guard::Watcher>] watchers the watchers in the Guard block
19
+ # @param [Hash] options the options for the Guard
20
+ # @option options [String] :cli any arbitrary Ecukes CLI arguments
21
+ # @option options [Boolean] :all_after_pass run all features after changed features pass
22
+ # @option options [Boolean] :all_on_start run all the features at startup
23
+ # @option options [Boolean] :run_all run override any option when running all specs
24
+ #
25
+ def initialize(watchers = [], options = {})
26
+ super
27
+
28
+ @options = {
29
+ :all_after_pass => true,
30
+ :all_on_start => true,
31
+ }.update(options)
32
+
33
+ @last_failed = false
34
+ end
35
+
36
+ # Gets called once when Guard starts.
37
+ #
38
+ # @raise [:task_has_failed] when stop has failed
39
+ #
40
+ def start
41
+ run_all if @options[:all_on_start]
42
+ end
43
+
44
+ # Gets called when all specs should be run.
45
+ #
46
+ # @raise [:task_has_failed] when stop has failed
47
+ #
48
+ def run_all
49
+ passed = Runner.run(['features'], @options.merge(@options[:run_all] || {}).merge(:message => 'Running all features'))
50
+
51
+ @last_failed = !passed
52
+
53
+ throw :task_has_failed unless passed
54
+ end
55
+
56
+ # Gets called when the Guard should reload itself.
57
+ #
58
+ # @raise [:task_has_failed] when stop has failed
59
+ #
60
+ def reload
61
+ end
62
+
63
+ # Gets called when watched paths and files have changes.
64
+ #
65
+ # @param [Array<String>] paths the changed paths and files
66
+ # @raise [:task_has_failed] when stop has failed
67
+ #
68
+ def run_on_changes(paths)
69
+ paths = Inspector.clean(paths)
70
+ passed = Runner.run(paths, paths.include?('features') ? @options.merge({ :message => 'Running all features' }) : @options)
71
+
72
+ if passed
73
+ # run all the specs if the changed specs failed, like autotest
74
+ run_all if @last_failed && @options[:all_after_pass]
75
+ else
76
+ # track whether the changed feature failed for the next change
77
+ @last_failed = true
78
+ end
79
+
80
+ throw :task_has_failed unless passed
81
+ end
82
+
83
+ end
84
+ end
@@ -0,0 +1,75 @@
1
+ module Guard
2
+ class Ecukes
3
+
4
+ # The inspector verifies of the changed paths are valid
5
+ # for Guard::Ecukes.
6
+ #
7
+ module Inspector
8
+ class << self
9
+
10
+ # Clean the changed paths and return only valid
11
+ # Ecukes features.
12
+ #
13
+ # @param [Array<String>] paths the changed paths
14
+ # @return [Array<String>] the valid feature files
15
+ #
16
+ def clean(paths)
17
+ paths.uniq!
18
+ paths.compact!
19
+ paths = paths.select { |p| ecukes_file?(p) || ecukes_folder?(p) }
20
+ paths = paths.delete_if { |p| included_in_other_path?(p, paths) }
21
+ clear_ecukes_files_list
22
+ paths
23
+ end
24
+
25
+ private
26
+
27
+ # Tests if the file is the features folder.
28
+ #
29
+ # @param [String] path the file
30
+ # @return [Boolean] when the file is the feature folder
31
+ #
32
+ def ecukes_folder?(path)
33
+ path.match(/^\/?features/) && !path.match(/\..+$/)
34
+ end
35
+
36
+ # Tests if the file is valid.
37
+ #
38
+ # @param [String] path the file
39
+ # @return [Boolean] when the file valid
40
+ #
41
+ def ecukes_file?(path)
42
+ ecukes_files.include?(path.split(':').first)
43
+ end
44
+
45
+ # Scans the project and keeps a list of all
46
+ # feature files in the `features` directory.
47
+ #
48
+ # @see #clear_jasmine_specs
49
+ # @return [Array<String>] the valid files
50
+ #
51
+ def ecukes_files
52
+ @ecukes_files ||= Dir.glob("features/**/*.feature")
53
+ end
54
+
55
+ # Clears the list of features in this project.
56
+ #
57
+ def clear_ecukes_files_list
58
+ @ecukes_files = nil
59
+ end
60
+
61
+ # Checks if the given path is already contained
62
+ # in the paths list.
63
+ #
64
+ # @param [Sting] path the path to test
65
+ # @param [Array<String>] paths the list of paths
66
+ #
67
+ def included_in_other_path?(path, paths)
68
+ paths = paths.select { |p| p != path }
69
+ massaged = path[0...(path.index(':') || path.size)]
70
+ paths.any? { |p| (path.include?(p) && (path.gsub(p, '')).include?('/')) || massaged.include?(p) }
71
+ end
72
+ end
73
+ end
74
+ end
75
+ end
@@ -0,0 +1,46 @@
1
+ module Guard
2
+ class Ecukes
3
+
4
+ # The Ecukes runner handles the execution of the ecukes binary.
5
+ #
6
+ module Runner
7
+ class << self
8
+
9
+ # Run the supplied features.
10
+ #
11
+ # @param [Array<String>] paths the feature files or directories
12
+ # @param [Hash] options the options for the execution
13
+ # @option options [String] :command_prefix allows adding an additional prefix to the ecukes command.
14
+ # @return [Boolean] the status of the execution
15
+ #
16
+ def run(paths, options = { })
17
+ return false if paths.empty?
18
+
19
+ message = options[:message] || (paths == ['features'] ? "Running all Ecukes features: #{ ecukes_command(paths, options) }" : "Running Ecukes features: #{ ecukes_command(paths, options) }")
20
+
21
+ UI.info message, :reset => true
22
+
23
+ system(ecukes_command(paths, options))
24
+ end
25
+
26
+ private
27
+
28
+ # Assembles the Ecukes command from the passed options.
29
+ #
30
+ # @param [Array<String>] paths the feature files or directories
31
+ # @param [Hash] options the options for the execution
32
+ # @option options [String] :command_prefix allows adding an additional prefix to the ecukes command.
33
+ # @return [String] the Ecukes command
34
+ #
35
+ def ecukes_command(paths, options)
36
+ cmd = []
37
+ cmd << options[:command_prefix] if options[:command_prefix]
38
+ cmd << 'cask exec ecukes'
39
+ cmd << options[:cli] if options[:cli]
40
+ (cmd + paths).join(' ')
41
+ end
42
+
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,5 @@
1
+ guard 'ecukes' do
2
+ watch(%r{^features/.+\.feature$})
3
+ watch(%r{^([^\/]*\.el|features/support/.+\.el)$}) { 'features' }
4
+ watch(%r{^features/step_definitions/(.+)_steps\.el$}) { |m| Dir[File.join("**/#{m[1]}.feature")][0] || 'features' }
5
+ end
@@ -0,0 +1,6 @@
1
+ module Guard
2
+ module EcukesVersion
3
+ # Guard::Ecukes version that is used for the Gem specification
4
+ VERSION = '0.0.1'
5
+ end
6
+ end
metadata ADDED
@@ -0,0 +1,79 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: guard-ecukes
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Dillon Kearns
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2013-10-20 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: guard
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - '>='
18
+ - !ruby/object:Gem::Version
19
+ version: 1.1.0
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - '>='
25
+ - !ruby/object:Gem::Version
26
+ version: 1.1.0
27
+ - !ruby/object:Gem::Dependency
28
+ name: bundler
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ~>
32
+ - !ruby/object:Gem::Version
33
+ version: '1.1'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ~>
39
+ - !ruby/object:Gem::Version
40
+ version: '1.1'
41
+ description: Guard::Ecukes automatically runs your features (much like autotest)
42
+ email:
43
+ - dillon@dillonkearns.com
44
+ executables: []
45
+ extensions: []
46
+ extra_rdoc_files: []
47
+ files:
48
+ - lib/guard/ecukes/inspector.rb
49
+ - lib/guard/ecukes/runner.rb
50
+ - lib/guard/ecukes/templates/Guardfile
51
+ - lib/guard/ecukes/version.rb
52
+ - lib/guard/ecukes.rb
53
+ - LICENSE
54
+ - README.md
55
+ homepage: http://github.com/dillonkearns/guard-ecukes
56
+ licenses: []
57
+ metadata: {}
58
+ post_install_message:
59
+ rdoc_options: []
60
+ require_paths:
61
+ - lib
62
+ required_ruby_version: !ruby/object:Gem::Requirement
63
+ requirements:
64
+ - - '>='
65
+ - !ruby/object:Gem::Version
66
+ version: '0'
67
+ required_rubygems_version: !ruby/object:Gem::Requirement
68
+ requirements:
69
+ - - '>='
70
+ - !ruby/object:Gem::Version
71
+ version: 1.3.6
72
+ requirements: []
73
+ rubyforge_project:
74
+ rubygems_version: 2.0.3
75
+ signing_key:
76
+ specification_version: 4
77
+ summary: Guard plugin for the Emacs Ecukes integration testing framework
78
+ test_files: []
79
+ has_rdoc: