haiti 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.
- data/Readme.md +51 -0
- data/haiti.gemspec +24 -0
- data/lib/haiti.rb +14 -0
- data/lib/haiti/command_line_helpers.rb +64 -0
- data/lib/haiti/config.rb +11 -0
- data/lib/haiti/step_definitions.rb +12 -0
- data/lib/haiti/version.rb +3 -0
- data/test/Gemfile +5 -0
- data/test/Gemfile.lock +36 -0
- data/test/features/given_i_have_stdin_content.feature +18 -0
- data/test/features/given_the_file.feature +13 -0
- data/test/features/support/env.rb +6 -0
- data/test/features/then_exit_status_is.feature +8 -0
- data/test/features/then_stream_is.feature +63 -0
- data/test/features/when_i_run.feature +8 -0
- metadata +105 -0
data/Readme.md
ADDED
@@ -0,0 +1,51 @@
|
|
1
|
+
Haiti
|
2
|
+
=====
|
3
|
+
|
4
|
+
Aruba provides Cucumber helpers for command line programs, but it's way more sophisticated than I can understand,
|
5
|
+
so I wind up reinventing that wheel in miniature for a lot of projects. This is just an extraction of that.
|
6
|
+
It aims to be simple and easy to understand/extend.
|
7
|
+
|
8
|
+
It's barely featured, currently the only features are what I extracted from SeeingIsBelieving's test suite. I'll
|
9
|
+
add more to it as I need them, or you're welcome to. Its testing is entirely in cucumber at the moment, and there
|
10
|
+
are no negative tests to assert that things don't work, so if anyone winds up working on it, I wouldn't mind that.
|
11
|
+
|
12
|
+
|
13
|
+
To run tests
|
14
|
+
============
|
15
|
+
|
16
|
+
cd tests
|
17
|
+
bundle
|
18
|
+
bundle exec cucumber
|
19
|
+
|
20
|
+
Todo
|
21
|
+
====
|
22
|
+
|
23
|
+
* Add tests showing that curlies get interpreted where expected
|
24
|
+
* Add tests proving that bin gets stuck in the path
|
25
|
+
* Add tests for negative assertions (currently if all step defs were empty, this would pass the suite)
|
26
|
+
|
27
|
+
Things that would be nice, but probably won't ever happen, b/c honestly, how often am I really going to touch this lib?
|
28
|
+
=======================================================================================================================
|
29
|
+
|
30
|
+
* all step defs work with single or double quotes
|
31
|
+
* multiple bin directories
|
32
|
+
* don't fucking pollute the World (currently this is how I get `eval_curlies` in there)
|
33
|
+
* assertions about the existence and contents of files
|
34
|
+
* a "given I'm in a clean directory" which wipes out the proving grounds
|
35
|
+
|
36
|
+
License
|
37
|
+
=======
|
38
|
+
|
39
|
+
DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
|
40
|
+
Version 2, December 2004
|
41
|
+
|
42
|
+
Copyright (C) 2013 Josh Cheek <josh.cheek@gmail.com>
|
43
|
+
|
44
|
+
Everyone is permitted to copy and distribute verbatim or modified
|
45
|
+
copies of this license document, and changing it is allowed as long
|
46
|
+
as the name is changed.
|
47
|
+
|
48
|
+
DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
|
49
|
+
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
50
|
+
|
51
|
+
0. You just DO WHAT THE FUCK YOU WANT TO.
|
data/haiti.gemspec
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "haiti/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "haiti"
|
7
|
+
s.version = Haiti::VERSION
|
8
|
+
s.authors = ["Josh Cheek"]
|
9
|
+
s.email = ["josh.cheek@gmail.com"]
|
10
|
+
s.homepage = "https://github.com/JoshCheek/haiti"
|
11
|
+
s.summary = %q{Simple Cucumber steps for command line programs}
|
12
|
+
s.description = "Aruba provides Cucumber helpers for command line programs, but it's way more sophisticated than I can understand, " \
|
13
|
+
"so I wind up reinventing that wheel in miniature for a lot of projects. This is just an extraction of that. " \
|
14
|
+
"It aims to be simple and easy to understand/extend."
|
15
|
+
s.license = "WTFPL"
|
16
|
+
|
17
|
+
s.files = `git ls-files`.split("\n")
|
18
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
19
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
20
|
+
s.require_paths = ["lib"]
|
21
|
+
|
22
|
+
s.add_dependency "cucumber", "~> 1.0"
|
23
|
+
s.add_dependency "rspec", "~> 2.0" # I don't actually know where the cutoff is, but I'm not doing anything fancy here
|
24
|
+
end
|
data/lib/haiti.rb
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
require 'haiti/config'
|
2
|
+
require 'haiti/command_line_helpers'
|
3
|
+
require 'haiti/step_definitions'
|
4
|
+
|
5
|
+
# move this somewhere better
|
6
|
+
Before { Haiti::CommandLineHelpers.make_proving_grounds }
|
7
|
+
|
8
|
+
module GeneralHelpers
|
9
|
+
def eval_curlies(string)
|
10
|
+
string.gsub(/{{(.*?)}}/) { eval $1 }
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
World GeneralHelpers
|
@@ -0,0 +1,64 @@
|
|
1
|
+
require 'fileutils'
|
2
|
+
require 'open3'
|
3
|
+
|
4
|
+
module Haiti
|
5
|
+
module CommandLineHelpers
|
6
|
+
Invocation = Struct.new :stdout, :stderr, :status do
|
7
|
+
def exitstatus
|
8
|
+
status.exitstatus
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
extend self
|
13
|
+
|
14
|
+
def write_file(filename, body)
|
15
|
+
in_proving_grounds do
|
16
|
+
FileUtils.mkdir_p File.dirname filename
|
17
|
+
File.open(filename, 'w') { |file| file.write body }
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def execute(command, stdin_data=nil)
|
22
|
+
stdin_data ||= ''
|
23
|
+
in_proving_grounds do
|
24
|
+
with_bin_in_path do
|
25
|
+
Invocation.new *Open3.capture3(command, stdin_data: stdin_data)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def in_proving_grounds(&block)
|
31
|
+
Dir.chdir proving_grounds_dir, &block
|
32
|
+
end
|
33
|
+
|
34
|
+
def proving_grounds_dir
|
35
|
+
config.proving_grounds_dir
|
36
|
+
end
|
37
|
+
|
38
|
+
def make_proving_grounds
|
39
|
+
FileUtils.mkdir_p proving_grounds_dir
|
40
|
+
end
|
41
|
+
|
42
|
+
def bin_dir
|
43
|
+
config.bin_dir
|
44
|
+
end
|
45
|
+
|
46
|
+
def path_to(filename)
|
47
|
+
in_proving_grounds { File.join proving_grounds_dir, filename }
|
48
|
+
end
|
49
|
+
|
50
|
+
# workaround for Ruby 2.0 bug where passing the new path as the first arg wasn't working
|
51
|
+
# bug report submitted here: http://bugs.ruby-lang.org/issues/8004
|
52
|
+
def with_bin_in_path
|
53
|
+
original_path = ENV['PATH']
|
54
|
+
ENV['PATH'] = "#{bin_dir}:#{ENV['PATH']}"
|
55
|
+
yield
|
56
|
+
ensure
|
57
|
+
ENV['PATH'] = original_path
|
58
|
+
end
|
59
|
+
|
60
|
+
def config
|
61
|
+
Haiti.config
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
data/lib/haiti/config.rb
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
Given('the file "$filename" "$body"') { |filename, body| Haiti::CommandLineHelpers.write_file filename, eval_curlies(body) }
|
2
|
+
Given('the file "$filename":') { |filename, body| Haiti::CommandLineHelpers.write_file filename, eval_curlies(body) }
|
3
|
+
Given('I have the stdin content "$content"') { |content| @stdin_data = eval_curlies(content) }
|
4
|
+
Given('I have the stdin content:') { |content| @stdin_data = eval_curlies(content) }
|
5
|
+
When('I run "$command"') { |command| @last_executed = Haiti::CommandLineHelpers.execute command, @stdin_data }
|
6
|
+
When("I run '$command'") { |command| @last_executed = Haiti::CommandLineHelpers.execute command, @stdin_data }
|
7
|
+
Then(/^(stderr|stdout) is:$/) { |stream_name, output| @last_executed.send(stream_name).chomp.should == eval_curlies(output) }
|
8
|
+
Then(/^(stderr|stdout) is ["'](.*?)["']$/) { |stream_name, output| @last_executed.send(stream_name).chomp.should == eval_curlies(output) }
|
9
|
+
Then(/^(stderr|stdout) is empty$/) { |stream_name| @last_executed.send(stream_name).should == '' }
|
10
|
+
Then(/^(stderr|stdout) is not empty$/) { |stream_name| @last_executed.send(stream_name).chomp.should_not be_empty }
|
11
|
+
Then(/^(stderr|stdout) includes "([^"]*)"$/) { |stream_name, content| @last_executed.send(stream_name).should include eval_curlies(content) }
|
12
|
+
Then('the exit status is $status') { |status| @last_executed.exitstatus.to_s.should == status }
|
data/test/Gemfile
ADDED
data/test/Gemfile.lock
ADDED
@@ -0,0 +1,36 @@
|
|
1
|
+
PATH
|
2
|
+
remote: ..
|
3
|
+
specs:
|
4
|
+
haiti (1.0.0)
|
5
|
+
cucumber (~> 1.0)
|
6
|
+
rspec (~> 2.0)
|
7
|
+
|
8
|
+
GEM
|
9
|
+
remote: http://rubygems.org/
|
10
|
+
specs:
|
11
|
+
builder (3.2.0)
|
12
|
+
cucumber (1.2.1)
|
13
|
+
builder (>= 2.1.2)
|
14
|
+
diff-lcs (>= 1.1.3)
|
15
|
+
gherkin (~> 2.11.0)
|
16
|
+
json (>= 1.4.6)
|
17
|
+
diff-lcs (1.2.4)
|
18
|
+
gherkin (2.11.6)
|
19
|
+
json (>= 1.7.6)
|
20
|
+
json (1.7.7)
|
21
|
+
rspec (2.13.0)
|
22
|
+
rspec-core (~> 2.13.0)
|
23
|
+
rspec-expectations (~> 2.13.0)
|
24
|
+
rspec-mocks (~> 2.13.0)
|
25
|
+
rspec-core (2.13.1)
|
26
|
+
rspec-expectations (2.13.0)
|
27
|
+
diff-lcs (>= 1.1.3, < 2.0)
|
28
|
+
rspec-mocks (2.13.1)
|
29
|
+
|
30
|
+
PLATFORMS
|
31
|
+
ruby
|
32
|
+
|
33
|
+
DEPENDENCIES
|
34
|
+
cucumber
|
35
|
+
haiti!
|
36
|
+
rspec
|
@@ -0,0 +1,18 @@
|
|
1
|
+
Feature:
|
2
|
+
Scenario:
|
3
|
+
Given I have the stdin content "content"
|
4
|
+
When I run "cat"
|
5
|
+
Then stdout is "content"
|
6
|
+
|
7
|
+
Scenario:
|
8
|
+
Given I have the stdin content:
|
9
|
+
"""
|
10
|
+
some
|
11
|
+
content
|
12
|
+
"""
|
13
|
+
When I run "cat"
|
14
|
+
Then stdout is:
|
15
|
+
"""
|
16
|
+
some
|
17
|
+
content
|
18
|
+
"""
|
@@ -0,0 +1,63 @@
|
|
1
|
+
Feature:
|
2
|
+
|
3
|
+
# stdout is ...
|
4
|
+
Scenario: stdout single quotes
|
5
|
+
When I run "ruby -e 'puts %(hi)'"
|
6
|
+
Then stdout is 'hi'
|
7
|
+
|
8
|
+
Scenario: stdout double quotes
|
9
|
+
When I run "ruby -e 'puts %(hi)'"
|
10
|
+
Then stdout is "hi"
|
11
|
+
|
12
|
+
Scenario: stdout multiline
|
13
|
+
When I run "ruby -e 'puts %(hi), %(bye)'"
|
14
|
+
Then stdout is:
|
15
|
+
"""
|
16
|
+
hi
|
17
|
+
bye
|
18
|
+
"""
|
19
|
+
|
20
|
+
# stderr is ...
|
21
|
+
Scenario: stderr single quotes
|
22
|
+
When I run "ruby -e '$stderr.puts %(hi)'"
|
23
|
+
Then stderr is 'hi'
|
24
|
+
|
25
|
+
Scenario: stderr double quotes
|
26
|
+
When I run "ruby -e '$stderr.puts %(hi)'"
|
27
|
+
Then stderr is "hi"
|
28
|
+
|
29
|
+
Scenario: stderr multiline
|
30
|
+
When I run "ruby -e '$stderr.puts %(hi), %(bye)'"
|
31
|
+
Then stderr is:
|
32
|
+
"""
|
33
|
+
hi
|
34
|
+
bye
|
35
|
+
"""
|
36
|
+
|
37
|
+
# stdout is / is not empty
|
38
|
+
Scenario: stdout is empty
|
39
|
+
When I run "ruby -e ''"
|
40
|
+
Then stdout is empty
|
41
|
+
|
42
|
+
Scenario: stdout is not empty
|
43
|
+
When I run "ruby -e '$stdout.puts %(a)'"
|
44
|
+
Then stdout is not empty
|
45
|
+
|
46
|
+
# stderr is / is not empty
|
47
|
+
Scenario: stderr is empty
|
48
|
+
When I run "ruby -e ''"
|
49
|
+
Then stdout is empty
|
50
|
+
|
51
|
+
Scenario: stderr is not empty
|
52
|
+
When I run "ruby -e '$stderr.puts %(a)'"
|
53
|
+
Then stderr is not empty
|
54
|
+
|
55
|
+
# stdout includes
|
56
|
+
Scenario: stdout includes
|
57
|
+
When I run "ruby -e '$stdout.puts %(abc)'"
|
58
|
+
Then stdout includes "b"
|
59
|
+
|
60
|
+
# stderr includes
|
61
|
+
Scenario: stderr includes
|
62
|
+
When I run "ruby -e '$stderr.puts %(abc)'"
|
63
|
+
Then stderr includes "b"
|
metadata
ADDED
@@ -0,0 +1,105 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: haiti
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
prerelease:
|
5
|
+
version: 0.0.1
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Josh Cheek
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2013-05-26 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
version_requirements: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ~>
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.0'
|
20
|
+
none: false
|
21
|
+
name: cucumber
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
requirement: !ruby/object:Gem::Requirement
|
25
|
+
requirements:
|
26
|
+
- - ~>
|
27
|
+
- !ruby/object:Gem::Version
|
28
|
+
version: '1.0'
|
29
|
+
none: false
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
version_requirements: !ruby/object:Gem::Requirement
|
32
|
+
requirements:
|
33
|
+
- - ~>
|
34
|
+
- !ruby/object:Gem::Version
|
35
|
+
version: '2.0'
|
36
|
+
none: false
|
37
|
+
name: rspec
|
38
|
+
type: :runtime
|
39
|
+
prerelease: false
|
40
|
+
requirement: !ruby/object:Gem::Requirement
|
41
|
+
requirements:
|
42
|
+
- - ~>
|
43
|
+
- !ruby/object:Gem::Version
|
44
|
+
version: '2.0'
|
45
|
+
none: false
|
46
|
+
description: Aruba provides Cucumber helpers for command line programs, but it's way
|
47
|
+
more sophisticated than I can understand, so I wind up reinventing that wheel in
|
48
|
+
miniature for a lot of projects. This is just an extraction of that. It aims to
|
49
|
+
be simple and easy to understand/extend.
|
50
|
+
email:
|
51
|
+
- josh.cheek@gmail.com
|
52
|
+
executables: []
|
53
|
+
extensions: []
|
54
|
+
extra_rdoc_files: []
|
55
|
+
files:
|
56
|
+
- Readme.md
|
57
|
+
- haiti.gemspec
|
58
|
+
- lib/haiti.rb
|
59
|
+
- lib/haiti/command_line_helpers.rb
|
60
|
+
- lib/haiti/config.rb
|
61
|
+
- lib/haiti/step_definitions.rb
|
62
|
+
- lib/haiti/version.rb
|
63
|
+
- test/Gemfile
|
64
|
+
- test/Gemfile.lock
|
65
|
+
- test/features/given_i_have_stdin_content.feature
|
66
|
+
- test/features/given_the_file.feature
|
67
|
+
- test/features/support/env.rb
|
68
|
+
- test/features/then_exit_status_is.feature
|
69
|
+
- test/features/then_stream_is.feature
|
70
|
+
- test/features/when_i_run.feature
|
71
|
+
homepage: https://github.com/JoshCheek/haiti
|
72
|
+
licenses:
|
73
|
+
- WTFPL
|
74
|
+
post_install_message:
|
75
|
+
rdoc_options: []
|
76
|
+
require_paths:
|
77
|
+
- lib
|
78
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ! '>='
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
none: false
|
84
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
85
|
+
requirements:
|
86
|
+
- - ! '>='
|
87
|
+
- !ruby/object:Gem::Version
|
88
|
+
version: '0'
|
89
|
+
none: false
|
90
|
+
requirements: []
|
91
|
+
rubyforge_project:
|
92
|
+
rubygems_version: 1.8.23
|
93
|
+
signing_key:
|
94
|
+
specification_version: 3
|
95
|
+
summary: Simple Cucumber steps for command line programs
|
96
|
+
test_files:
|
97
|
+
- test/Gemfile
|
98
|
+
- test/Gemfile.lock
|
99
|
+
- test/features/given_i_have_stdin_content.feature
|
100
|
+
- test/features/given_the_file.feature
|
101
|
+
- test/features/support/env.rb
|
102
|
+
- test/features/then_exit_status_is.feature
|
103
|
+
- test/features/then_stream_is.feature
|
104
|
+
- test/features/when_i_run.feature
|
105
|
+
has_rdoc:
|