vagrant-cucumber 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG.md ADDED
@@ -0,0 +1,3 @@
1
+ ## 0.0.1 (June 12, 2013)
2
+
3
+ Initial release - supports Virtualbox and VMWare Fusion
data/README.md ADDED
@@ -0,0 +1,116 @@
1
+ Vagrant Cucumber
2
+ ================
3
+
4
+ Description
5
+ -----------
6
+
7
+ This plugin allows Vagrant to run cucumber features, and provides some glue
8
+ for working with vagrant boxes within your cucumber steps.
9
+
10
+ It was originally developed to help us test configuration management scripts,
11
+ and with the following workflow in mind:
12
+
13
+ * Start one or more Vagrant boxes
14
+ * Configure these boxes with some default state
15
+ * Snapshot each box in this default state.
16
+ * In each cucumber scenario
17
+ - Run config management tools inside the box to make configuration changes
18
+ - Test that these changes produce the desired result
19
+ - Roll the VM state back, ready for the next scenario
20
+
21
+
22
+ Requirements
23
+ ------------
24
+
25
+ The plugin requires cucumber and vagrant-zz-multiprovider-snap gems, but will
26
+ install these itself if required.
27
+
28
+ Vagrant Cucumber currently works only with the current Vagrant providers:
29
+
30
+ * VirtualBox
31
+ * VMWare Fusion (using the commercial VMWare plugin for Vagrant)
32
+
33
+
34
+
35
+ Installation
36
+ ------------
37
+
38
+ Assuming you're running the packaged version of Vagrant, the easiest way to
39
+ install this plugin is via the published gem:
40
+
41
+ ```
42
+ vagrant plugin install vagrant-cucumber
43
+ ```
44
+
45
+ As well as the vagrant-cucumber plugin, this will also install the
46
+ vagrant-zz-multiprovider-snap plugin if you don't already have it.
47
+
48
+ vagrant-cucumber will also install a version of cucumber >= 1.3.2 under the
49
+ Ruby environment provided by Vagrant.
50
+
51
+
52
+ Usage
53
+ -----
54
+
55
+ This plugin adds a subcommand, ```vagrant cucumber``` - this simply wraps
56
+ the usual ```cucumber``` commandline handler - refer to the documentation for
57
+ cucumber for details, or use ```vagrant cucumber -h``` for a full list of
58
+ options.
59
+
60
+
61
+ Example
62
+ -------
63
+
64
+ The git source of the plugin includes a folder called "example", which contains
65
+ a Vagrantfile and features directory which demonstrates the plugin in action.
66
+
67
+ The Vagrantfile defines two basic VMs which will be used to run our tests.
68
+ It will work with either the Virtualbox or the VMWare Fusion provider.
69
+
70
+ Use ```vagrant up``` in that folder in order to start the default VM. (In the
71
+ current version of the plugin, VMs must be running before they can be used
72
+ in tests). If you don't already have the standard precise64 vagrant box, it
73
+ will be fetched from the Vagrant website. If you prefer to use the VMWare
74
+ provider, add ```--provider=vmware_fusion``` to the commandline.
75
+
76
+ To run all the tests, run
77
+
78
+ ```vagrant cucumber```.
79
+
80
+ The tests are split between multiple feature files. You can run one feature
81
+ file at a time by specifying it on the commandline:
82
+
83
+ ```vagrant cucumber features/basic.feature```
84
+
85
+ ```basic.feature``` demonstrates running basic shell commands inside the VM
86
+ both as the standard vagrant user, and as root. It also contains a test to show
87
+ that snapshot rollback is working correctly.
88
+
89
+ ```multivm.feature``` shows how steps can reference different VMs. For details
90
+ on how to write your own step definitions which can work on multiple VMs,
91
+ see the next section.
92
+
93
+ The test in ```multivm.feature``` also demonstrates use of cucumber tags.
94
+ The test scenario is preceded with the tag ```@vagrant-cucumber-debug```. This
95
+ causes debug output to be emitted.
96
+
97
+ We also provide a ```@norollback``` tag, which prevents the VMs from being
98
+ rolled back at the end of the scenario. This is useful for debugging.
99
+
100
+
101
+
102
+ Implementation Detail
103
+ ---------------------
104
+
105
+ The best place to gain an understanding of the implementation of Cucumber steps
106
+ is in ```example/features/step_definitions/process.rb```. I've heavily
107
+ commented this in order to be a good working example.
108
+
109
+ ```example/features/process.feature``` uses these step definitions.
110
+
111
+ Other step definitions and hooks are defined in ```lib/vagrant-cucumber/step_definitions.rb```.
112
+
113
+
114
+
115
+
116
+
@@ -0,0 +1,19 @@
1
+ Vagrant.configure("2") do |config|
2
+
3
+ config.vm.box = "precise64"
4
+ config.vm.box_url = "http://files.vagrantup.com/precise64.box"
5
+
6
+ config.vm.provider :vmware_fusion do |fusion,override|
7
+ override.vm.box = "precise64_vmware_fusion"
8
+ override.vm.box_url = "http://files.vagrantup.com/precise64_vmware_fusion.box"
9
+ end
10
+
11
+ config.vm.define :vm1 do |vm1|
12
+ vm1.vm.hostname = 'vm1'
13
+ end
14
+
15
+ config.vm.define :vm2 do |vm2|
16
+ vm2.vm.hostname = 'vm2'
17
+ end
18
+
19
+ end
@@ -0,0 +1,32 @@
1
+ Feature: VM Running
2
+
3
+ Scenario: Check we can run simple commands
4
+
5
+ Given there is a running VM called "vm1"
6
+ Then running the shell command `id` should succeed
7
+ And the stdout of that shell command should match /vagrant/
8
+ And the stdout of that shell command should not match /root/
9
+ And the stderr of that shell command should match /^$/
10
+
11
+
12
+ Scenario: Check we can run commands as root
13
+
14
+ Given there is a running VM called "vm1"
15
+ Then running the shell command `id` as root should succeed
16
+ And the stdout of that shell command should match /root/
17
+ And the stdout of that shell command should not match /vagrant/
18
+
19
+
20
+ Scenario: Write a file so that we can check we're rolling back properly
21
+
22
+ Given there is a running VM called "vm1"
23
+
24
+ Then running the shell command `grep test /tmp/cucumber-written-file` should fail
25
+
26
+ When I run the shell command `echo test > /tmp/cucumber-written-file`, it should succeed
27
+ And running the shell command `grep test /tmp/cucumber-written-file` should succeed
28
+
29
+ When I roll back the VM called "vm1"
30
+ Then running the shell command `grep test /tmp/cucumber-written-file` should fail
31
+
32
+
@@ -0,0 +1,18 @@
1
+ Feature: Testing on multiple VMs
2
+
3
+ @vagrant-cucumber-debug
4
+ Scenario: Check we can run simple commands on multiple VMs
5
+
6
+ Given there is a running VM called "vm1"
7
+ And there is a running VM called "vm2"
8
+
9
+ # The following four steps are equivalent
10
+ Then running the shell command `hostname` on the VM called "vm1" should succeed
11
+ Then running the shell command `hostname` on the VM "vm1" should succeed
12
+ And running the shell command `hostname` on the last VM should succeed
13
+ And running the shell command `hostname` should succeed
14
+
15
+ And running the shell command `hostname` on the VM "vm2" should succeed
16
+
17
+
18
+
@@ -0,0 +1,9 @@
1
+ Feature: Check to see if processes are running in the VM
2
+
3
+ Scenario: Check that init is running
4
+ Given there is a running VM called "vm1"
5
+ Then there should be a process called "init" running
6
+
7
+ Scenario: Check that non-existant process check also works
8
+ Given there is a running VM called "vm1"
9
+ Then there should not be a process called "i-dont-exist" running
@@ -0,0 +1,77 @@
1
+ # Cucumber step definitions are defined like function definitions, and start
2
+ # with a preposition or adverb (Given, When, Then, And, But).
3
+ #
4
+ # The regular expression defined will be matched against steps in the feature
5
+ # files when cucumber runs. The matched groups in the regex will be passed
6
+ # in order as variables to the block. In this case, the three groups are
7
+ # assigned to "condition", "process_name" and "vmre"
8
+ #
9
+ # More information on step definitions can be found at
10
+ # https://github.com/cucumber/cucumber/wiki/Step-Definitions
11
+
12
+ Then /there should(| not) be a process called "([^"]*)" running(#{VMRE})$/ do |condition, process_name, vmre|
13
+
14
+ # First, we work out what virtual machine we're going to be dealing with
15
+ # in this step. The VMRE variable in the regex above is defined by
16
+ # vagrant-cucumber to match various English-language ways in which we
17
+ # might refer to a vagrant box:
18
+ #
19
+ # String matched VM identified
20
+ # -------------------------------------------------------------------
21
+ # '' Last referenced
22
+ # 'on the last VM' Last referenced
23
+ # 'on the VM "<vmname>"' Named <vmname>
24
+ # 'on the VM called "<vmname>"' Named <vmname>
25
+ #
26
+ # The call to vagrant_glue.identified_vm returns a Vagrant::Machine
27
+ # object to the relevant VM.
28
+
29
+ machine = vagrant_glue.identified_vm(vmre)
30
+
31
+
32
+ # Now we use the machine's communication interface (probably ssh, though
33
+ # this is provider-dependent) to execute a shell command inside the VM.
34
+
35
+ machine.communicate.tap do |comm|
36
+
37
+ rv = comm.execute(
38
+ "pidof #{process_name}", {
39
+ :error_check => false, # stop vagrant throwing an exception
40
+ } # if the command returns non-zero
41
+
42
+ ) do |type,data|
43
+
44
+ # Execute takes a block, which is yielded to whenever there's
45
+ # output on stdout or stderr. We handle any output in this block.
46
+ #
47
+ # In this case, we'll put all output onto stdout, but only if
48
+ # @vagrant_cucumber_debug has been set. This class variable will
49
+ # be set to true in the Before hook defined in
50
+ # lib/vagrant-cucumber/step_definitions.rb
51
+
52
+ if @vagrant_cucumber_debug
53
+ puts "[:#{type}] #{data.chomp}"
54
+ end
55
+
56
+ end
57
+
58
+ # Output the status from the command if we're in debugging mode
59
+ if @vagrant_cucumber_debug
60
+ puts "Exit status of pidof command: #{rv}"
61
+ end
62
+
63
+ # Cucumber steps are expected to exit cleanly if they worked ok, and
64
+ # raise exceptions if they fail. The following logic implements
65
+ # the conditions in which we want to fail the step.
66
+
67
+ if rv != 0 and condition == ''
68
+ raise "There was no proces called #{process_name} running on #{machine.name}"
69
+ end
70
+
71
+ if rv == 0 and condition == ' not'
72
+ raise "There was a process called #{process_name} running on #{machine.name}"
73
+ end
74
+
75
+ end
76
+
77
+ end
@@ -0,0 +1,3 @@
1
+ require 'vagrant-cucumber/step_definitions'
2
+
3
+ World( VagrantPlugins::Cucumber::Glue )
@@ -0,0 +1,20 @@
1
+ module VagrantPlugins
2
+ module Cucumber
3
+ class CucumberCommand < Vagrant.plugin(2, :command)
4
+
5
+ def execute
6
+
7
+ require 'cucumber/rspec/disable_option_parser'
8
+ require 'cucumber/cli/main'
9
+
10
+ require 'vagrant-cucumber/cucumber/formatter/pretty'
11
+ require 'vagrant-cucumber/cucumber/formatter/html'
12
+
13
+ failure = ::Cucumber::Cli::Main.execute(@argv)
14
+
15
+ end
16
+
17
+ end
18
+ end
19
+ end
20
+
@@ -0,0 +1,24 @@
1
+ require 'cucumber/formatter/html'
2
+
3
+ module VagrantPlugins
4
+
5
+ module Cucumber
6
+
7
+ module Formatter
8
+
9
+ class Html < ::Cucumber::Formatter::Html
10
+
11
+ def puts(message)
12
+ # TODO Strip ansi escape codes
13
+ @delayed_messages << message
14
+ end
15
+
16
+ end
17
+
18
+ end
19
+
20
+ end
21
+
22
+ end
23
+
24
+
@@ -0,0 +1,33 @@
1
+ require 'cucumber/formatter/pretty'
2
+
3
+ module VagrantPlugins
4
+
5
+ module Cucumber
6
+
7
+ module Formatter
8
+
9
+ class Pretty < ::Cucumber::Formatter::Pretty
10
+
11
+ # Use the Pretty formatter, but disable use of
12
+ # delayed messages (ie. output each line at once)
13
+
14
+ def initialize(*args)
15
+ super
16
+ @delayed_messages = nil
17
+ end
18
+
19
+ # print_messages is only used to output the delayed_messages
20
+ # and fails because of the above hack, so make it a noop
21
+
22
+ def print_messages
23
+ end
24
+
25
+ end
26
+
27
+ end
28
+
29
+ end
30
+
31
+ end
32
+
33
+
@@ -0,0 +1,99 @@
1
+ unless defined?(VMRE)
2
+ VMRE = /(?: on the last VM| on the VM(?: called|) "(?:[^"]+)"|)/
3
+ end
4
+
5
+ module VagrantPlugins
6
+
7
+ module Cucumber
8
+
9
+ module Glue
10
+
11
+ # This glue module will be used in the cucumber World for
12
+ # tests run with vagrant-cucumber. It's used to hide interaction
13
+ # with the messier parts of the vagrant environment so the
14
+ # step definitions don't need to care about them.
15
+
16
+ def vagrant_glue
17
+ VagrantGlue.instance
18
+ end
19
+
20
+ class VagrantGlue
21
+
22
+ def initialize
23
+
24
+ @vagrant_env = Vagrant::Environment.new(
25
+ :ui_class => Vagrant::UI::Basic
26
+ )
27
+
28
+ @last_machine_mentioned = nil
29
+
30
+ end
31
+
32
+ def self.instance
33
+ return @@instance ||= VagrantGlue.new
34
+ end
35
+
36
+ def vagrant_env
37
+ @vagrant_env
38
+ end
39
+
40
+ def get_last_vm
41
+ get_vm( @last_machine_mentioned )
42
+ end
43
+
44
+ def get_vm( vmname )
45
+
46
+ machine_provider = nil
47
+ machine_name = nil
48
+
49
+ # If this machine name is not configured, blow up
50
+ if ! @vagrant_env.machine_names.index(vmname.to_sym)
51
+ raise Vagrant::Errors::VMNotFoundError, :name => vmname
52
+ end
53
+
54
+ @vagrant_env.active_machines.each do |a_name, a_provider|
55
+
56
+ if a_name == vmname.to_sym
57
+ machine_provider = a_provider
58
+ machine_name = a_name
59
+ end
60
+
61
+ end
62
+
63
+ if !machine_name
64
+
65
+ raise "The VM '#{vmname}' is configured in the Vagrantfile "+
66
+ "but has not been started. Run 'vagrant up #{vmname}' and "+
67
+ "specify a provider if necessary."
68
+
69
+ end
70
+
71
+ machine_provider ||= vagrant_env.default_provider
72
+ machine = @vagrant_env.machine(
73
+ machine_name, machine_provider
74
+ )
75
+
76
+ @last_machine_mentioned = vmname
77
+
78
+ machine
79
+
80
+ end
81
+
82
+ def identified_vm( str )
83
+ case str
84
+ when /^( on the last VM|)$/
85
+ get_last_vm
86
+ when /^ on the VM(?: called|) "([^"]+)"$/
87
+ get_vm( $1 )
88
+ end
89
+ end
90
+
91
+ end
92
+
93
+
94
+ end
95
+
96
+ end
97
+
98
+ end
99
+
@@ -0,0 +1,24 @@
1
+ begin
2
+ require "vagrant"
3
+ rescue LoadError
4
+ raise "The Vagrant Cucumber plugin must be run within Vagrant."
5
+ end
6
+
7
+ module VagrantPlugins
8
+ module Cucumber
9
+ class Plugin < Vagrant.plugin("2")
10
+
11
+ name "Cucumber"
12
+
13
+ description <<-DESC
14
+ This plugin makes it possible for Cucumber to interact with Vagrant
15
+ DESC
16
+
17
+ command "cucumber" do
18
+ require_relative "commands/cucumber"
19
+ CucumberCommand
20
+ end
21
+
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,106 @@
1
+ require 'to_regexp'
2
+
3
+ Given /^there is a running VM called "([^"]*)"$/ do |vmname|
4
+
5
+ machine = vagrant_glue.get_vm( vmname )
6
+
7
+ machine.action(:up)
8
+
9
+ unless machine.provider.driver.has_snapshot?
10
+ machine.action(:snapshot_take)
11
+ end
12
+
13
+ end
14
+
15
+ When /^I roll back the VM called "([^"]*)"$/ do |vmname|
16
+
17
+ machine = vagrant_glue.get_vm( vmname )
18
+ vagrant_glue.vagrant_env.cli('snap', 'rollback', vmname )
19
+
20
+ end
21
+
22
+ Then /^(?:running|I run) the shell command `(.*)`(| as root)(#{VMRE})(?:|, it) should (succeed|fail)$/ do |command,as_root,vmre,condition|
23
+
24
+ @last_shell_command_output = {
25
+ :stdout => '',
26
+ :stderr => '',
27
+ }
28
+
29
+ @last_shell_command_status = nil
30
+
31
+ machine = vagrant_glue.identified_vm(vmre)
32
+ machine.communicate.tap do |comm|
33
+
34
+ @last_shell_command_status = comm.execute(
35
+ command, {
36
+ :error_check => false,
37
+ :sudo => as_root == ' as root',
38
+ }
39
+ ) do |type,data|
40
+
41
+ if @vagrant_cucumber_debug
42
+ puts "[:#{type}] #{data.chomp}"
43
+ end
44
+
45
+ @last_shell_command_output[type] += data
46
+
47
+ end
48
+
49
+ end
50
+
51
+ if @last_shell_command_status == 0 and condition == 'fail'
52
+ raise "Expected command to fail, but got 0 exit status"
53
+ end
54
+
55
+ if @last_shell_command_status != 0 and condition == 'succeed'
56
+ raise "Expected command to succeed but got #{@last_shell_command_status} exit status"
57
+ end
58
+
59
+ end
60
+
61
+ Then /^the (.+) of that shell command should(| not) match (\/.+\/)$/ do |stream,condition,re|
62
+
63
+ stream.downcase!
64
+
65
+ unless @last_shell_command_output.has_key?( stream.to_sym )
66
+ raise "@last_shell_command_output structure has no #{stream}"
67
+ end
68
+
69
+ re_result = ( @last_shell_command_output[stream.to_sym] =~ re.to_regexp )
70
+ re_matched = !re_result.nil?
71
+
72
+ should_match = condition != ' not'
73
+
74
+ if re_matched and !should_match
75
+ raise "Regular expression matched, but shouldn't have"
76
+ end
77
+
78
+ if !re_matched and should_match
79
+ raise "Regular expression didn't match, but should have"
80
+ end
81
+
82
+ end
83
+
84
+ Before('@norollback') do |scenario|
85
+ puts "Saw @norollback tag:"
86
+ puts " * Won't roll back snapshot at end of scenario"
87
+ puts " * Will roll back explicit snapshots in the scenario"
88
+ end
89
+
90
+
91
+
92
+ After('~@norollback') do |scenario|
93
+
94
+ puts "Rolling back VM states"
95
+ vagrant_glue.vagrant_env.cli('snap', 'rollback' )
96
+
97
+ end
98
+
99
+ After('@norollback') do |scenario|
100
+ puts "Saw @norollback tag - not rolling back"
101
+ end
102
+
103
+ Before('@vagrant-cucumber-debug') do |scenario|
104
+ puts "Enabling debugging for vagrant-cucumber scenarios"
105
+ @vagrant_cucumber_debug = true
106
+ end
@@ -0,0 +1,5 @@
1
+ module VagrantPlugins
2
+ module Cucumber
3
+ VERSION = "0.0.1"
4
+ end
5
+ end
@@ -0,0 +1,9 @@
1
+ require "vagrant-cucumber/version"
2
+ require "vagrant-cucumber/plugin"
3
+ require "vagrant-cucumber/glue"
4
+
5
+ module VagrantPlugins
6
+ module Cucumber
7
+ # ...
8
+ end
9
+ end
@@ -0,0 +1,33 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "vagrant-cucumber/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "vagrant-cucumber"
7
+ s.version = VagrantPlugins::Cucumber::VERSION
8
+ s.authors = ["Jon Topper"]
9
+ s.email = ["jon@scalefactory.com"]
10
+ s.homepage = "https://github.com/scalefactory/vagrant-cucumber"
11
+ s.summary = %q{Cucumber support for Vagrant}
12
+ s.description = %q{This plugin makes it possible for Cucumber to interact with Vagrant}
13
+
14
+ s.rubyforge_project = "vagrant-cucumber"
15
+
16
+ files = `git ls-files`.split("\n")
17
+ ignore = %w{Gemfile Rakefile .gitignore}
18
+
19
+ files.delete_if do |f|
20
+ ignore.any? do |i|
21
+ File.fnmatch(i, f, File::FNM_PATHNAME) ||
22
+ File.fnmatch(i, File.basename(f), File::FNM_PATHNAME)
23
+ end
24
+ end
25
+
26
+ s.add_runtime_dependency "cucumber", ">=1.3.2"
27
+ s.add_runtime_dependency "vagrant-zz-multiprovider-snap", ">=0.0.3"
28
+
29
+ s.files = files
30
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
31
+ s.require_paths = ["lib"]
32
+
33
+ end
metadata ADDED
@@ -0,0 +1,84 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: vagrant-cucumber
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Jon Topper
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2013-07-02 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: cucumber
16
+ requirement: &70146505916660 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: 1.3.2
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: *70146505916660
25
+ - !ruby/object:Gem::Dependency
26
+ name: vagrant-zz-multiprovider-snap
27
+ requirement: &70146505916160 !ruby/object:Gem::Requirement
28
+ none: false
29
+ requirements:
30
+ - - ! '>='
31
+ - !ruby/object:Gem::Version
32
+ version: 0.0.3
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: *70146505916160
36
+ description: This plugin makes it possible for Cucumber to interact with Vagrant
37
+ email:
38
+ - jon@scalefactory.com
39
+ executables: []
40
+ extensions: []
41
+ extra_rdoc_files: []
42
+ files:
43
+ - CHANGELOG.md
44
+ - README.md
45
+ - example/Vagrantfile
46
+ - example/features/basic.feature
47
+ - example/features/multivm.feature
48
+ - example/features/process.feature
49
+ - example/features/step_definitions/process.rb
50
+ - example/features/support/env.rb
51
+ - lib/vagrant-cucumber.rb
52
+ - lib/vagrant-cucumber/commands/cucumber.rb
53
+ - lib/vagrant-cucumber/cucumber/formatter/html.rb
54
+ - lib/vagrant-cucumber/cucumber/formatter/pretty.rb
55
+ - lib/vagrant-cucumber/glue.rb
56
+ - lib/vagrant-cucumber/plugin.rb
57
+ - lib/vagrant-cucumber/step_definitions.rb
58
+ - lib/vagrant-cucumber/version.rb
59
+ - vagrant-cucumber.gemspec
60
+ homepage: https://github.com/scalefactory/vagrant-cucumber
61
+ licenses: []
62
+ post_install_message:
63
+ rdoc_options: []
64
+ require_paths:
65
+ - lib
66
+ required_ruby_version: !ruby/object:Gem::Requirement
67
+ none: false
68
+ requirements:
69
+ - - ! '>='
70
+ - !ruby/object:Gem::Version
71
+ version: '0'
72
+ required_rubygems_version: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ! '>='
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
78
+ requirements: []
79
+ rubyforge_project: vagrant-cucumber
80
+ rubygems_version: 1.8.11
81
+ signing_key:
82
+ specification_version: 3
83
+ summary: Cucumber support for Vagrant
84
+ test_files: []