spinach 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore ADDED
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
data/.rvmrc ADDED
@@ -0,0 +1 @@
1
+ rvm --create use 1.9.2@spinach
data/Gemfile ADDED
@@ -0,0 +1,8 @@
1
+ source 'http://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in spinach.gemspec
4
+ gemspec
5
+
6
+ group :docs do
7
+ gem 'yard'
8
+ end
data/Rakefile ADDED
@@ -0,0 +1,12 @@
1
+ # encoding: utf-8
2
+ require 'bundler'
3
+ Bundler::GemHelper.install_tasks
4
+
5
+ require 'rake/testtask'
6
+ Rake::TestTask.new do |t|
7
+ t.libs << "test"
8
+ t.test_files = FileList['test/**/*_test.rb']
9
+ t.verbose = true
10
+ end
11
+
12
+ task :default => [:test]
data/Readme.md ADDED
@@ -0,0 +1,9 @@
1
+ # About Spinach
2
+ Spinach is a BDD framework on top of gherkin
3
+
4
+ ![](http://farm1.static.flickr.com/58/200481513_a1a0aa265a.jpg)
5
+
6
+ # Testimonials
7
+ ![](http://www.80stees.com/images/products/Popeye_the_Sailor_Man_I_Popeye_Spinach-T-link.jpg)
8
+
9
+ *Popeye the Sailor*
data/bin/spinach ADDED
@@ -0,0 +1,18 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ begin
4
+ require 'spinach'
5
+ rescue LoadError
6
+ require_relative '../lib/spinach'
7
+ Dir.glob(
8
+ File.expand_path File.join(Spinach.config[:step_definitions_path], '**', '*.rb')
9
+ ).each do |file|
10
+ require file
11
+ end
12
+ end
13
+
14
+ ARGV.each do |file|
15
+ Spinach::Runner.new(
16
+ Spinach::Parser.new(file).parse
17
+ ).run
18
+ end
@@ -0,0 +1,23 @@
1
+ class UserLogsIn < Spinach::Feature
2
+ feature "User logs in"
3
+
4
+ Given 'I am not logged in' do
5
+ 123
6
+ end
7
+
8
+ When 'I log in' do
9
+ @a = 'hey'
10
+ end
11
+
12
+ Then 'I should be logged in' do
13
+ user.must_equal 'heyo'
14
+ end
15
+
16
+ private
17
+
18
+ def user
19
+ @user ||= User.make
20
+ end
21
+
22
+ end
23
+
@@ -0,0 +1,6 @@
1
+ Feature: User logs in
2
+
3
+ Scenario: User logs in
4
+ Given I am not logged in
5
+ When I log in
6
+ Then I should be logged in
@@ -0,0 +1,23 @@
1
+ class UserLogsIn < Spinach::Feature
2
+ feature "User logs in"
3
+
4
+ Given 'I am not logged in' do
5
+ 123
6
+ end
7
+
8
+ When 'I log in' do
9
+ @a = 'hey'
10
+ end
11
+
12
+ Then 'I should be logged in' do
13
+ user.must_equal 'heyo'
14
+ end
15
+
16
+ private
17
+
18
+ def user
19
+ @user ||= User.make
20
+ end
21
+
22
+ end
23
+
@@ -0,0 +1,17 @@
1
+ module Spinach
2
+ def self.config
3
+ @config ||= Config.new
4
+ end
5
+ class Config
6
+ attr_writer :step_definitions_path
7
+ def step_definitions_path
8
+ @step_definitions_path || 'features/steps'
9
+ end
10
+ def [](attribute)
11
+ self.send(attribute)
12
+ end
13
+ def []=(attribute, params)
14
+ self.send("#{attribute}=", params)
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,19 @@
1
+ module Spinach
2
+ module DSL
3
+ def When(string, &block)
4
+ define_method(string, &block)
5
+ end
6
+ alias_method :Given, :When
7
+ alias_method :Then, :When
8
+ alias_method :And, :When
9
+ alias_method :But, :When
10
+
11
+ def feature(name)
12
+ @feature_name = name
13
+ end
14
+
15
+ def feature_name
16
+ @feature_name
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,13 @@
1
+ require 'minitest/spec'
2
+ MiniTest::Spec.new nil
3
+
4
+ module Spinach
5
+ class Feature
6
+ extend DSL
7
+ include MiniTest::Assertions
8
+
9
+ def self.inherited(base)
10
+ Spinach.features << base
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,21 @@
1
+ require 'gherkin'
2
+ require 'gherkin/formatter/json_formatter'
3
+
4
+ module Spinach
5
+ class Parser
6
+ def initialize(filename)
7
+ @filename = filename
8
+ @formatter = Gherkin::Formatter::JSONFormatter.new(nil)
9
+ @parser = Gherkin::Parser::Parser.new(@formatter)
10
+ end
11
+
12
+ def content
13
+ File.read(@filename)
14
+ end
15
+
16
+ def parse
17
+ @parser.parse(content, @filename, __LINE__-1)
18
+ @formatter.gherkin_object
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,41 @@
1
+ module Spinach
2
+ class Runner
3
+ def initialize(data)
4
+ @feature_name = data['name']
5
+ @scenarios = data['elements']
6
+ end
7
+
8
+ def feature
9
+ @feature ||= Spinach.find_feature(@feature_name)
10
+ end
11
+
12
+ def scenarios
13
+ @scenarios
14
+ end
15
+
16
+ def run
17
+ step_count = 0
18
+ reports = []
19
+
20
+ scenarios.each do |scenario|
21
+ instance = feature.new
22
+ scenario['steps'].each do |step|
23
+ begin
24
+ instance.send(step['name'])
25
+ print "\e[32m."
26
+ rescue MiniTest::Assertion=>e
27
+ reports << e
28
+ print "\e[31mF"
29
+ end
30
+ end
31
+ end
32
+
33
+ print "\e[0m\n"
34
+ puts
35
+ reports.each do |report|
36
+ puts "* #{report.message}\n\t"
37
+ puts report.backtrace.reverse.join("\n")
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,3 @@
1
+ module Spinach
2
+ VERSION = "0.0.1"
3
+ end
data/lib/spinach.rb ADDED
@@ -0,0 +1,24 @@
1
+ require_relative 'spinach/version'
2
+ require_relative 'spinach/config'
3
+ require_relative 'spinach/runner'
4
+ require_relative 'spinach/parser'
5
+ require_relative 'spinach/dsl'
6
+ require_relative 'spinach/feature'
7
+
8
+ module Spinach
9
+ @@features = []
10
+
11
+ def self.features
12
+ @@features
13
+ end
14
+
15
+ def self.reset_features
16
+ @@features = []
17
+ end
18
+
19
+ def self.find_feature(name)
20
+ @@features.detect do |feature|
21
+ feature.feature_name.to_s == name.to_s
22
+ end
23
+ end
24
+ end
data/spinach.gemspec ADDED
@@ -0,0 +1,23 @@
1
+ # -*- encoding: utf-8 -*-
2
+ require File.expand_path('../lib/spinach/version', __FILE__)
3
+
4
+ Gem::Specification.new do |gem|
5
+ gem.authors = ["Josep Jaume Rey", "Josep M. Bach", "Oriol Gual"]
6
+ gem.email = ["info@codegram.com"]
7
+ gem.description = %q{Spinach is a BDD framework on top of gherkin}
8
+ gem.summary = %q{Spinach is a BDD framework on top of gherkin}
9
+ gem.homepage = "http://github.com/codegram/spinach"
10
+
11
+ gem.add_runtime_dependency 'gherkin'
12
+ gem.add_runtime_dependency 'minitest'
13
+ gem.add_development_dependency 'purdytest'
14
+ gem.add_development_dependency 'rake'
15
+ gem.add_development_dependency 'mocha'
16
+
17
+ gem.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
18
+ gem.files = `git ls-files`.split("\n")
19
+ gem.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
20
+ gem.name = "spinach"
21
+ gem.require_paths = ["lib"]
22
+ gem.version = Spinach::VERSION
23
+ end
@@ -0,0 +1,13 @@
1
+ require_relative '../test_helper'
2
+
3
+ describe Spinach::Config do
4
+ describe "#step_definitions_path" do
5
+ it "returns a default" do
6
+ (Spinach.config[:step_definitions_path].kind_of? String).must_equal true
7
+ end
8
+ it "can be overwritten" do
9
+ Spinach.config[:step_definitions_path] = 'steps'
10
+ Spinach.config[:step_definitions_path].must_equal 'steps'
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,30 @@
1
+ require_relative '../test_helper'
2
+
3
+ describe Spinach::DSL do
4
+ before do
5
+ @feature = Class.new do
6
+ extend Spinach::DSL
7
+ end
8
+ end
9
+ describe "#When" do
10
+ it "should define a method with the step name" do
11
+ @feature.When("I say goodbye") do
12
+ "You say hello"
13
+ end
14
+ @feature.new.send("I say goodbye").must_equal "You say hello"
15
+ end
16
+ end
17
+ describe "#Given, #Then, #And, #But" do
18
+ it "should be #When aliases" do
19
+ %w{Given Then And But}.each do |m|
20
+ @feature.must_respond_to m
21
+ end
22
+ end
23
+ end
24
+ describe "#feature" do
25
+ it "should set the name for this feature" do
26
+ @feature.feature("User salutes")
27
+ @feature.feature_name.must_equal "User salutes"
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,22 @@
1
+ require_relative '../test_helper'
2
+
3
+ describe Spinach::Feature do
4
+ describe "ancestors" do
5
+ it "should include minitest helpers" do
6
+ Spinach::Feature.ancestors.must_include MiniTest::Assertions
7
+ end
8
+ it "should be extended by the DSL" do
9
+ (class << Spinach::Feature; self; end).ancestors.must_include Spinach::DSL
10
+ end
11
+ end
12
+ describe "#inherited" do
13
+ it "should register any feature subclass" do
14
+ @feature1 = Class.new(Spinach::Feature)
15
+ @feature2 = Class.new(Spinach::Feature)
16
+ @feature3 = Class.new
17
+ Spinach.features.must_include @feature1
18
+ Spinach.features.must_include @feature2
19
+ Spinach.features.wont_include @feature3
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,37 @@
1
+ require_relative '../test_helper'
2
+
3
+ describe Spinach::Parser do
4
+ before do
5
+ @parser = Spinach::Parser.new("feature_definition.feature")
6
+ @parser.stubs(:content).returns('
7
+ Feature: User authentication
8
+ Scenario: User logs in
9
+ Given I am on the front page
10
+ When I fill in the login form and press "login"
11
+ Then I should be on my dashboard
12
+ ')
13
+ end
14
+ describe "#parse" do
15
+ before do
16
+ @parsed = @parser.parse
17
+ end
18
+ it "parses the feature name" do
19
+ @parsed['name'].must_equal "User authentication"
20
+ end
21
+ describe "scenario" do
22
+ before do
23
+ @scenario = @parsed['elements'][0]
24
+ end
25
+ it "parses the scenario name" do
26
+ @scenario['name'].must_equal "User logs in"
27
+ end
28
+ it "parses the scenario steps" do
29
+ @scenario['steps'][0]['name'].must_equal "I am on the front page"
30
+ @scenario['steps'][1]['name'].must_equal(
31
+ "I fill in the login form and press \"login\""
32
+ )
33
+ @scenario['steps'][2]['name'].must_equal "I should be on my dashboard"
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,38 @@
1
+ require_relative '../test_helper'
2
+
3
+ describe Spinach::Runner do
4
+ before do
5
+ Spinach.reset_features
6
+ @feature = Class.new(Spinach::Feature) do
7
+ feature "A new feature"
8
+ When "I say hello" do
9
+ end
10
+ Then "You say goodbye" do
11
+ end
12
+ end
13
+ data = {
14
+ 'name' => "A new feature",
15
+ 'elements' => [{'steps' => [
16
+ {'name' => "I say hello"}, {'name' => "You say goodbye"}
17
+ ]}]
18
+ }
19
+ @runner = Spinach::Runner.new(data)
20
+ end
21
+ describe "#feature" do
22
+ it "returns a Spinach feature" do
23
+ @runner.feature.name == @feature.name
24
+ end
25
+ end
26
+ describe "#scenarios" do
27
+ it "should return the scenarios" do
28
+ @runner.scenarios.must_equal [{'steps' => [
29
+ {'name' => "I say hello"}, {'name' => "You say goodbye"}
30
+ ]}]
31
+ end
32
+ end
33
+ describe "#run" do
34
+ it "should call every step on the feature" do
35
+ @runner.run
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,34 @@
1
+ require_relative 'test_helper'
2
+
3
+ describe Spinach do
4
+ before do
5
+ @feature1 = OpenStruct.new(feature_name: "User authentication")
6
+ @feature2 = OpenStruct.new(feature_name: "Slip management")
7
+ @feature3 = OpenStruct.new(feature_name: "File attachments")
8
+ [@feature1, @feature2, @feature3].each do |feature|
9
+ Spinach.features << feature
10
+ end
11
+ end
12
+ describe "#features" do
13
+ it "returns all the loaded features" do
14
+ Spinach.features.must_include @feature1
15
+ Spinach.features.must_include @feature2
16
+ Spinach.features.must_include @feature3
17
+ end
18
+ end
19
+ describe "#reset_features" do
20
+ it "resets the features to a pristine state" do
21
+ Spinach.reset_features
22
+ [@feature1, @feature3, @feature3].each do |feature|
23
+ Spinach.features.wont_include feature
24
+ end
25
+ end
26
+ end
27
+ describe "#find_feature" do
28
+ it "finds a feature by name" do
29
+ Spinach.find_feature("User authentication").must_equal @feature1
30
+ Spinach.find_feature("Slip management").must_equal @feature2
31
+ Spinach.find_feature("File attachments").must_equal @feature3
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,8 @@
1
+ gem 'minitest'
2
+ require 'minitest/unit'
3
+ require 'minitest/autorun'
4
+ require 'mocha'
5
+ require 'ostruct'
6
+ require 'purdytest'
7
+
8
+ require 'spinach'
metadata ADDED
@@ -0,0 +1,134 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: spinach
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Josep Jaume Rey
9
+ - Josep M. Bach
10
+ - Oriol Gual
11
+ autorequire:
12
+ bindir: bin
13
+ cert_chain: []
14
+ date: 2011-09-24 00:00:00.000000000Z
15
+ dependencies:
16
+ - !ruby/object:Gem::Dependency
17
+ name: gherkin
18
+ requirement: &70306015799560 !ruby/object:Gem::Requirement
19
+ none: false
20
+ requirements:
21
+ - - ! '>='
22
+ - !ruby/object:Gem::Version
23
+ version: '0'
24
+ type: :runtime
25
+ prerelease: false
26
+ version_requirements: *70306015799560
27
+ - !ruby/object:Gem::Dependency
28
+ name: minitest
29
+ requirement: &70306015799140 !ruby/object:Gem::Requirement
30
+ none: false
31
+ requirements:
32
+ - - ! '>='
33
+ - !ruby/object:Gem::Version
34
+ version: '0'
35
+ type: :runtime
36
+ prerelease: false
37
+ version_requirements: *70306015799140
38
+ - !ruby/object:Gem::Dependency
39
+ name: purdytest
40
+ requirement: &70306015798720 !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
46
+ type: :development
47
+ prerelease: false
48
+ version_requirements: *70306015798720
49
+ - !ruby/object:Gem::Dependency
50
+ name: rake
51
+ requirement: &70306015798300 !ruby/object:Gem::Requirement
52
+ none: false
53
+ requirements:
54
+ - - ! '>='
55
+ - !ruby/object:Gem::Version
56
+ version: '0'
57
+ type: :development
58
+ prerelease: false
59
+ version_requirements: *70306015798300
60
+ - !ruby/object:Gem::Dependency
61
+ name: mocha
62
+ requirement: &70306015828840 !ruby/object:Gem::Requirement
63
+ none: false
64
+ requirements:
65
+ - - ! '>='
66
+ - !ruby/object:Gem::Version
67
+ version: '0'
68
+ type: :development
69
+ prerelease: false
70
+ version_requirements: *70306015828840
71
+ description: Spinach is a BDD framework on top of gherkin
72
+ email:
73
+ - info@codegram.com
74
+ executables:
75
+ - spinach
76
+ extensions: []
77
+ extra_rdoc_files: []
78
+ files:
79
+ - .gitignore
80
+ - .rvmrc
81
+ - Gemfile
82
+ - Rakefile
83
+ - Readme.md
84
+ - bin/spinach
85
+ - examples/steps/user_logs_in.rb
86
+ - examples/user_logs_in.feature
87
+ - examples/user_logs_in.rb
88
+ - lib/spinach.rb
89
+ - lib/spinach/config.rb
90
+ - lib/spinach/dsl.rb
91
+ - lib/spinach/feature.rb
92
+ - lib/spinach/parser.rb
93
+ - lib/spinach/runner.rb
94
+ - lib/spinach/version.rb
95
+ - spinach.gemspec
96
+ - test/spinach/config_test.rb
97
+ - test/spinach/dsl_test.rb
98
+ - test/spinach/feature_test.rb
99
+ - test/spinach/parser_test.rb
100
+ - test/spinach/runner_test.rb
101
+ - test/spinach_test.rb
102
+ - test/test_helper.rb
103
+ homepage: http://github.com/codegram/spinach
104
+ licenses: []
105
+ post_install_message:
106
+ rdoc_options: []
107
+ require_paths:
108
+ - lib
109
+ required_ruby_version: !ruby/object:Gem::Requirement
110
+ none: false
111
+ requirements:
112
+ - - ! '>='
113
+ - !ruby/object:Gem::Version
114
+ version: '0'
115
+ required_rubygems_version: !ruby/object:Gem::Requirement
116
+ none: false
117
+ requirements:
118
+ - - ! '>='
119
+ - !ruby/object:Gem::Version
120
+ version: '0'
121
+ requirements: []
122
+ rubyforge_project:
123
+ rubygems_version: 1.8.6
124
+ signing_key:
125
+ specification_version: 3
126
+ summary: Spinach is a BDD framework on top of gherkin
127
+ test_files:
128
+ - test/spinach/config_test.rb
129
+ - test/spinach/dsl_test.rb
130
+ - test/spinach/feature_test.rb
131
+ - test/spinach/parser_test.rb
132
+ - test/spinach/runner_test.rb
133
+ - test/spinach_test.rb
134
+ - test/test_helper.rb