gitnesse 0.1.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.
- data/.gitignore +17 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +66 -0
- data/Rakefile +13 -0
- data/bin/gitnesse +33 -0
- data/gitnesse.gemspec +25 -0
- data/lib/gitnesse/railtie.rb +12 -0
- data/lib/gitnesse/tasks.rake +28 -0
- data/lib/gitnesse/tasks.rb +8 -0
- data/lib/gitnesse/version.rb +3 -0
- data/lib/gitnesse.rb +300 -0
- data/test/lib/gitnesse/build_page_content_test.rb +80 -0
- data/test/lib/gitnesse/check_dependencies_test.rb +45 -0
- data/test/lib/gitnesse/commit_info_test.rb +28 -0
- data/test/lib/gitnesse/config_to_hash_test.rb +24 -0
- data/test/lib/gitnesse/custom_branch_test.rb +25 -0
- data/test/lib/gitnesse/extract_features_test.rb +44 -0
- data/test/lib/gitnesse/gather_features_test.rb +30 -0
- data/test/lib/gitnesse/load_feature_files_into_wiki_test.rb +34 -0
- data/test/lib/gitnesse/read_git_config_test.rb +35 -0
- data/test/lib/gitnesse/version_test.rb +7 -0
- data/test/lib/gitnesse/write_feature_file_test.rb +18 -0
- data/test/test_helper.rb +26 -0
- data/test/wiki_test_helper.rb +11 -0
- metadata +186 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2012 The Hybrid Group, All Rights Reserved
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,66 @@
|
|
1
|
+
# Gitnesse
|
2
|
+
|
3
|
+
Gitnesse is a Cucumber-wiki integration tool.
|
4
|
+
It enables a project to store cucumber features in a git-based wiki, and then test them against your code.
|
5
|
+
Conceptually influenced by Fitnesse http://fitnesse.org/
|
6
|
+
|
7
|
+
## Installation
|
8
|
+
|
9
|
+
Add this line to your application's Gemfile:
|
10
|
+
|
11
|
+
gem 'gitnesse'
|
12
|
+
|
13
|
+
And then execute:
|
14
|
+
|
15
|
+
$ bundle
|
16
|
+
|
17
|
+
Or install it yourself as:
|
18
|
+
|
19
|
+
$ gem install gitnesse
|
20
|
+
|
21
|
+
Create a `gitnesse.rb` file somewhere in your project, and add something like
|
22
|
+
the following to it:
|
23
|
+
|
24
|
+
Gitnesse.config do
|
25
|
+
repository_url "git@github.com:hybridgroup/gitnesse-demo.wiki"
|
26
|
+
end
|
27
|
+
|
28
|
+
## rake tasks
|
29
|
+
|
30
|
+
$ rake gitnesse:pull
|
31
|
+
$ rake gitnesse:push
|
32
|
+
$ rake gitnesse:run
|
33
|
+
$ rake gitnesse:info
|
34
|
+
|
35
|
+
## Usage In Rails 3
|
36
|
+
|
37
|
+
For Rails 3 the rake tasks should automatically just appear, as long as you have added the gitnesse gem to your Gemfile.
|
38
|
+
|
39
|
+
There is an example application using Rails 3 located here: [https://github.com/hybridgroup/gitnesse-example-rails](https://github.com/hybridgroup/gitnesse-example-rails)
|
40
|
+
|
41
|
+
## Usage In Sinatra
|
42
|
+
|
43
|
+
To use gitnesse in a Sinatra application, simple add this line of code to your Rakefile:
|
44
|
+
|
45
|
+
require "gitnesse/tasks"
|
46
|
+
|
47
|
+
There is an example application using Sinatra located here: [https://github.com/hybridgroup/gitnesse-example-sinatra](https://github.com/hybridgroup/gitnesse-example-sinatra)
|
48
|
+
|
49
|
+
## Other Usage
|
50
|
+
|
51
|
+
Want to use plain old Gitnesse? There is an executable that requires the path to the configuration file:
|
52
|
+
|
53
|
+
$ GITNESSE_CONFIG='./gitnesse_config.rb' gitnesse
|
54
|
+
|
55
|
+
## TODO
|
56
|
+
|
57
|
+
- test git push back to git wiki
|
58
|
+
- pluggable feature runners, so can be used with Spinach, Cucumber-JS, or ?
|
59
|
+
|
60
|
+
## Contributing
|
61
|
+
|
62
|
+
1. Fork it
|
63
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
64
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
65
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
66
|
+
5. Create new Pull Request
|
data/Rakefile
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
#!/usr/bin/env rake
|
2
|
+
require "bundler/gem_tasks"
|
3
|
+
require 'rake/testtask'
|
4
|
+
require_relative 'lib/gitnesse'
|
5
|
+
require_relative 'lib/gitnesse/tasks'
|
6
|
+
|
7
|
+
Rake::TestTask.new do |t|
|
8
|
+
t.libs << 'lib/gitnesse'
|
9
|
+
t.test_files = FileList['test/lib/gitnesse/*_test.rb']
|
10
|
+
t.verbose = true
|
11
|
+
end
|
12
|
+
task :default => :test
|
13
|
+
|
data/bin/gitnesse
ADDED
@@ -0,0 +1,33 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'rubygems'
|
4
|
+
require 'gitnesse'
|
5
|
+
|
6
|
+
Gitnesse.load_config
|
7
|
+
|
8
|
+
if ARGV[0].nil?
|
9
|
+
Gitnesse.run
|
10
|
+
end
|
11
|
+
|
12
|
+
def print_help
|
13
|
+
puts "Gitnesse commands:"
|
14
|
+
puts " run: pull remote features from git-based wiki to local, and run Cucumber"
|
15
|
+
puts " push: push local features to git-based wiki"
|
16
|
+
puts " pull: pull remote features from git-based wiki to local"
|
17
|
+
puts " info: print current Gitnesse configuration"
|
18
|
+
end
|
19
|
+
|
20
|
+
case ARGV[0]
|
21
|
+
when "push"
|
22
|
+
Gitnesse.push
|
23
|
+
when "pull"
|
24
|
+
Gitnesse.pull
|
25
|
+
when "run"
|
26
|
+
Gitnesse.run
|
27
|
+
when "info"
|
28
|
+
puts Gitnesse.config_to_hash.to_yaml
|
29
|
+
when "help"
|
30
|
+
print_help
|
31
|
+
else
|
32
|
+
print_help
|
33
|
+
end
|
data/gitnesse.gemspec
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'gitnesse/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |gem|
|
7
|
+
gem.name = "gitnesse"
|
8
|
+
gem.version = Gitnesse::VERSION
|
9
|
+
gem.authors = ["www.hybridgroup.com"]
|
10
|
+
gem.email = ["info@hybridgroup.com"]
|
11
|
+
gem.description = %q{Use github wiki to store feature stories, then execute then using Cucumber}
|
12
|
+
gem.summary = %q{Features on git-based Wiki!}
|
13
|
+
gem.homepage = "https://github.com/hybridgroup/gitnesse"
|
14
|
+
|
15
|
+
gem.files = `git ls-files`.split($/)
|
16
|
+
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
17
|
+
gem.require_paths = ["lib"]
|
18
|
+
gem.add_dependency("bundler")
|
19
|
+
gem.add_dependency("gollum","~> 2.3.12")
|
20
|
+
gem.add_development_dependency("minitest-matchers")
|
21
|
+
gem.add_development_dependency("mocha")
|
22
|
+
gem.add_development_dependency("cucumber")
|
23
|
+
gem.add_development_dependency("rake")
|
24
|
+
gem.executables = ['gitnesse']
|
25
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
namespace :gitnesse do
|
2
|
+
task :environment do
|
3
|
+
end
|
4
|
+
|
5
|
+
desc "Pull features from remote repository and run cucumber."
|
6
|
+
task :run => :environment do
|
7
|
+
Gitnesse.load_config
|
8
|
+
Gitnesse.run
|
9
|
+
end
|
10
|
+
|
11
|
+
desc "Pull features from remote git wiki repository."
|
12
|
+
task :pull => :environment do
|
13
|
+
Gitnesse.load_config
|
14
|
+
Gitnesse.pull
|
15
|
+
end
|
16
|
+
|
17
|
+
desc "Push features to remote git wiki repository."
|
18
|
+
task :push => :environment do
|
19
|
+
Gitnesse.load_config
|
20
|
+
Gitnesse.push
|
21
|
+
end
|
22
|
+
|
23
|
+
desc "Dump the current config info to the console."
|
24
|
+
task :info => :environment do
|
25
|
+
Gitnesse.load_config
|
26
|
+
puts Gitnesse.config_to_hash.to_yaml
|
27
|
+
end
|
28
|
+
end
|
data/lib/gitnesse.rb
ADDED
@@ -0,0 +1,300 @@
|
|
1
|
+
require 'bundler/setup'
|
2
|
+
require 'gollum'
|
3
|
+
require 'fileutils'
|
4
|
+
require 'tmpdir'
|
5
|
+
require 'gitnesse/railtie' if defined?(Rails)
|
6
|
+
|
7
|
+
# core module
|
8
|
+
module Gitnesse
|
9
|
+
|
10
|
+
extend self
|
11
|
+
|
12
|
+
# Public: Set url of the git-based wiki repo containing features.
|
13
|
+
#
|
14
|
+
# repository_url - A String containing your repo's url.
|
15
|
+
#
|
16
|
+
# Example:
|
17
|
+
#
|
18
|
+
# Gitnesse.config do
|
19
|
+
# repository_url "git@github.com:luishurtado/gitnesse-wiki.wiki"
|
20
|
+
# end
|
21
|
+
#
|
22
|
+
def self.repository_url(repository_url = false)
|
23
|
+
if repository_url == false
|
24
|
+
unless defined?(@@repository_url)
|
25
|
+
puts "---"
|
26
|
+
puts "No repository_url has been defined for Gitnesse."
|
27
|
+
puts "Add a gitnesse.rb file to your project and use it to configure Gitnesse."
|
28
|
+
puts "For more details, check out gitnesse.com"
|
29
|
+
auts "---"
|
30
|
+
exit 1
|
31
|
+
end
|
32
|
+
return @@repository_url
|
33
|
+
else
|
34
|
+
@@repository_url = repository_url
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
# Public: Set branch of the git-based wiki repo containing features.
|
39
|
+
#
|
40
|
+
# branch - A String containing which branch of your repo to use.
|
41
|
+
#
|
42
|
+
# Example:
|
43
|
+
#
|
44
|
+
# Gitnesse.config do
|
45
|
+
# branch "master"
|
46
|
+
# end
|
47
|
+
#
|
48
|
+
def self.branch(branch = false)
|
49
|
+
if branch == false
|
50
|
+
@@branch ||= "master"
|
51
|
+
else
|
52
|
+
@@branch = branch
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
# Public: Set local directory used to sync with git-wiki stored feature stories.
|
57
|
+
#
|
58
|
+
# target_directory - A String containing which directory to use.
|
59
|
+
#
|
60
|
+
# Example:
|
61
|
+
#
|
62
|
+
# Gitnesse.config do
|
63
|
+
# target_directory "features"
|
64
|
+
# end
|
65
|
+
#
|
66
|
+
def self.target_directory(target_directory = false)
|
67
|
+
if target_directory == false
|
68
|
+
@@target_directory ||= File.join(Dir.pwd, 'features')
|
69
|
+
else
|
70
|
+
@@target_directory = target_directory
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
def self.config(&block)
|
75
|
+
instance_eval &block
|
76
|
+
end
|
77
|
+
|
78
|
+
# -- all methods after this are module functions --
|
79
|
+
module_function
|
80
|
+
|
81
|
+
def run
|
82
|
+
if pull
|
83
|
+
puts "Now going to run cucumber..."
|
84
|
+
exec("cucumber #{Gitnesse.target_directory}/*.feature")
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
# pull features from git wiki, and sync up with features dir
|
89
|
+
def pull
|
90
|
+
ensure_git_available
|
91
|
+
ensure_cucumber_available
|
92
|
+
ensure_repository
|
93
|
+
|
94
|
+
puts "Pulling features into #{Gitnesse.target_directory} from #{Gitnesse.repository_url}..."
|
95
|
+
Dir.mktmpdir do |tmp_dir|
|
96
|
+
if clone_feature_repo(tmp_dir)
|
97
|
+
FileUtils.mkdir(Gitnesse.target_directory) unless File.exists?(Gitnesse.target_directory)
|
98
|
+
|
99
|
+
wiki_pages = Gollum::Wiki.new(tmp_dir).pages
|
100
|
+
wiki_pages.each do |wiki_page|
|
101
|
+
page_features = extract_features(wiki_page.raw_data)
|
102
|
+
write_feature_file(wiki_page.name, page_features) unless page_features.empty?
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
106
|
+
puts "DONE."
|
107
|
+
end
|
108
|
+
|
109
|
+
# push features back up to git wiki from features directory
|
110
|
+
def push
|
111
|
+
ensure_git_available
|
112
|
+
ensure_cucumber_available
|
113
|
+
ensure_repository
|
114
|
+
commit_info
|
115
|
+
|
116
|
+
puts "Pushing features from #{Gitnesse.target_directory} to #{Gitnesse.repository_url}..."
|
117
|
+
Dir.mktmpdir do |tmp_dir|
|
118
|
+
if clone_feature_repo(tmp_dir)
|
119
|
+
load_feature_files_into_wiki(tmp_dir)
|
120
|
+
|
121
|
+
# push the changes to the remote git
|
122
|
+
Dir.chdir(tmp_dir) do
|
123
|
+
puts `git push origin master`
|
124
|
+
end
|
125
|
+
end
|
126
|
+
end
|
127
|
+
puts "DONE."
|
128
|
+
end
|
129
|
+
|
130
|
+
def load_feature_files_into_wiki(tmp_dir)
|
131
|
+
wiki = Gollum::Wiki.new(tmp_dir)
|
132
|
+
feature_files = Dir.glob("#{Gitnesse.target_directory}/*.feature")
|
133
|
+
|
134
|
+
feature_files.each do |feature_file|
|
135
|
+
feature_name = File.basename(feature_file, ".feature")
|
136
|
+
feature_content = File.read(feature_file)
|
137
|
+
wiki_page = wiki.page(feature_name)
|
138
|
+
|
139
|
+
if wiki_page
|
140
|
+
update_wiki_page(wiki, wiki_page, feature_name, feature_content)
|
141
|
+
else
|
142
|
+
create_wiki_page(wiki, feature_name, feature_content)
|
143
|
+
end
|
144
|
+
end
|
145
|
+
end
|
146
|
+
|
147
|
+
def create_wiki_page(wiki, page_name, feature_content)
|
148
|
+
new_page_content = build_page_content(feature_content)
|
149
|
+
|
150
|
+
wiki.write_page(page_name, :markdown, new_page_content, commit_info)
|
151
|
+
puts "==== Created page: #{page_name} ==="
|
152
|
+
end
|
153
|
+
|
154
|
+
def update_wiki_page(wiki, wiki_page, page_name, feature_content)
|
155
|
+
wiki_page_content = wiki_page.raw_data
|
156
|
+
new_page_content = build_page_content(feature_content, wiki_page_content)
|
157
|
+
|
158
|
+
if new_page_content == wiki_page_content
|
159
|
+
puts "=== Page #{page_name} didn't change ==="
|
160
|
+
else
|
161
|
+
wiki.update_page(wiki_page, page_name, :markdown, new_page_content, commit_info)
|
162
|
+
puts "==== Updated page: #{page_name} ==="
|
163
|
+
end
|
164
|
+
end
|
165
|
+
|
166
|
+
def build_page_content(feature_content, wiki_page_content = nil)
|
167
|
+
return "```gherkin\n#{feature_content}\n```" if wiki_page_content.nil? || wiki_page_content.empty?
|
168
|
+
features = extract_features(wiki_page_content)
|
169
|
+
|
170
|
+
# replace the first feature found in the wiki page
|
171
|
+
_, old_feature_content = features.shift
|
172
|
+
wiki_page_content.sub(old_feature_content, feature_content)
|
173
|
+
end
|
174
|
+
|
175
|
+
# look thru wiki page for features
|
176
|
+
def extract_features(data)
|
177
|
+
features = {}
|
178
|
+
|
179
|
+
if match_result = data.match(/\u0060{3}(.+)\u0060{3}/m)
|
180
|
+
captures = match_result.captures
|
181
|
+
|
182
|
+
# create hash with feature name as key and feature text as value
|
183
|
+
captures.each do |capture|
|
184
|
+
feature_definition_at = capture.index('Feature:')
|
185
|
+
feature_text = capture[feature_definition_at,capture.size-1]
|
186
|
+
feature_lines = feature_text.split("\n")
|
187
|
+
feature_definition = feature_lines.grep(/^Feature:/).first
|
188
|
+
|
189
|
+
if feature_definition
|
190
|
+
feature_name = feature_definition.split(":").last.strip.gsub(" ","-").downcase
|
191
|
+
features[feature_name] = feature_text
|
192
|
+
end
|
193
|
+
end
|
194
|
+
end
|
195
|
+
|
196
|
+
features
|
197
|
+
end
|
198
|
+
|
199
|
+
def clone_feature_repo(dir)
|
200
|
+
output = `git clone #{Gitnesse.repository_url} #{dir} 2>&1`
|
201
|
+
puts output
|
202
|
+
$?.success?
|
203
|
+
end
|
204
|
+
|
205
|
+
def commit_info
|
206
|
+
@commit_info ||= begin
|
207
|
+
user_name = read_git_config("user.name")
|
208
|
+
email = read_git_config("user.email")
|
209
|
+
raise "Can't read git's user.name config" if user_name.nil? || user_name.empty?
|
210
|
+
raise "Can't read git's user.email config" if email.nil? || email.empty?
|
211
|
+
|
212
|
+
{:name => user_name, :email => email, :message => "Update features with Gitnesse"}
|
213
|
+
end
|
214
|
+
end
|
215
|
+
|
216
|
+
def commit_info=(commit_info)
|
217
|
+
@commit_info = commit_info
|
218
|
+
end
|
219
|
+
|
220
|
+
def read_git_config(config_name)
|
221
|
+
config_value = ""
|
222
|
+
config_value = `git config --get #{config_name}`
|
223
|
+
config_value = `git config --get --global #{config_name}` unless $?.success?
|
224
|
+
config_value.strip
|
225
|
+
end
|
226
|
+
|
227
|
+
# we are going to support only one feature per page
|
228
|
+
def gather_features(page_features)
|
229
|
+
return "" if page_features.nil? or page_features.empty?
|
230
|
+
|
231
|
+
features = ''
|
232
|
+
feature_name, feature_content = page_features.shift
|
233
|
+
puts "============================== Pulling Feature: #{feature_name} =============================="
|
234
|
+
features = features + feature_content
|
235
|
+
|
236
|
+
page_features.each do |_feature_name, _feature_content|
|
237
|
+
puts "============================== WARNING! Discarded Feature: #{_feature_name} =============================="
|
238
|
+
puts _feature_content
|
239
|
+
end
|
240
|
+
|
241
|
+
features
|
242
|
+
end
|
243
|
+
|
244
|
+
def write_feature_file(page_name, page_features)
|
245
|
+
File.open("#{Gitnesse.target_directory}/#{page_name}.feature","w") {|f| f.write(gather_features(page_features)) }
|
246
|
+
end
|
247
|
+
|
248
|
+
def ensure_git_available
|
249
|
+
raise "git not found or not working." unless Kernel.system("git --version")
|
250
|
+
end
|
251
|
+
|
252
|
+
def ensure_cucumber_available
|
253
|
+
raise "cucumber not found or not working." unless Kernel.system("cucumber --version")
|
254
|
+
end
|
255
|
+
|
256
|
+
def ensure_repository
|
257
|
+
raise "You must select a repository_url to run Gitnesse." if Gitnesse.repository_url.nil?
|
258
|
+
end
|
259
|
+
|
260
|
+
def load_config
|
261
|
+
load(ENV['GITNESSE_CONFIG']) and return if ENV['GITNESSE_CONFIG']
|
262
|
+
|
263
|
+
possible_config_files = Dir.glob(File.join("**", "gitnesse.rb"))
|
264
|
+
|
265
|
+
files_with_config = possible_config_files.select do |file_name|
|
266
|
+
if FileUtils.compare_file(__FILE__, file_name)
|
267
|
+
false
|
268
|
+
elsif File.fnmatch("vendor/**/*.rb", file_name)
|
269
|
+
false
|
270
|
+
else
|
271
|
+
file_content = File.read(file_name)
|
272
|
+
file_content.match("Gitnesse.config")
|
273
|
+
end
|
274
|
+
end
|
275
|
+
|
276
|
+
case files_with_config.length
|
277
|
+
when 0
|
278
|
+
raise "Can't find a gitnesse.rb file with Gitnesse configuration."
|
279
|
+
when 1
|
280
|
+
load(File.absolute_path(files_with_config.first))
|
281
|
+
else
|
282
|
+
raise "Several config files found: #{files_with_config.join(", ")}"
|
283
|
+
end
|
284
|
+
end
|
285
|
+
|
286
|
+
def config_to_hash
|
287
|
+
{ "repository_url" => Gitnesse.repository_url,
|
288
|
+
"branch" => Gitnesse.branch,
|
289
|
+
"target_directory" => Gitnesse.target_directory }
|
290
|
+
end
|
291
|
+
|
292
|
+
def method_missing(sym, *args, &block)
|
293
|
+
unless ["to_str", "to_ary"].contains?(sym)
|
294
|
+
raise "Invalid variable name for Gitnesse configuration.
|
295
|
+
Allowed variables are repository_url, branch, and target_directory."
|
296
|
+
else
|
297
|
+
super
|
298
|
+
end
|
299
|
+
end
|
300
|
+
end
|
@@ -0,0 +1,80 @@
|
|
1
|
+
require_relative '../../test_helper'
|
2
|
+
|
3
|
+
describe Gitnesse do
|
4
|
+
describe ".build_page_content" do
|
5
|
+
let(:wiki_page_content) do
|
6
|
+
<<-EOS
|
7
|
+
# Addition is Awesome
|
8
|
+
|
9
|
+
```gherkin
|
10
|
+
Feature: Addition
|
11
|
+
In order to avoid silly mistakes
|
12
|
+
I want to be told the sum of two numbers
|
13
|
+
|
14
|
+
Scenario: Add two single digit numbers
|
15
|
+
Given I have entered 7 into the calculator
|
16
|
+
And I have entered 5 into the calculator
|
17
|
+
When I add
|
18
|
+
Then the result should be 12 on the screen
|
19
|
+
```
|
20
|
+
EOS
|
21
|
+
end
|
22
|
+
|
23
|
+
let(:new_feature_content) do
|
24
|
+
<<-EOS
|
25
|
+
Feature: Addition
|
26
|
+
In order to avoid silly mistakes
|
27
|
+
I want to be told the sum of two numbers
|
28
|
+
|
29
|
+
Scenario: Add two double digit numbers
|
30
|
+
Given I have entered 50 into the calculator
|
31
|
+
And I have entered 70 into the calculator
|
32
|
+
When I add
|
33
|
+
Then the result should be 120 on the screen
|
34
|
+
EOS
|
35
|
+
end
|
36
|
+
|
37
|
+
describe "without existing wiki page content" do
|
38
|
+
let(:method) { lambda { Gitnesse.build_page_content(new_feature_content) } }
|
39
|
+
let(:expected_result) do
|
40
|
+
"```gherkin
|
41
|
+
Feature: Addition
|
42
|
+
In order to avoid silly mistakes
|
43
|
+
I want to be told the sum of two numbers
|
44
|
+
|
45
|
+
Scenario: Add two double digit numbers
|
46
|
+
Given I have entered 50 into the calculator
|
47
|
+
And I have entered 70 into the calculator
|
48
|
+
When I add
|
49
|
+
Then the result should be 120 on the screen
|
50
|
+
|
51
|
+
```"
|
52
|
+
end
|
53
|
+
|
54
|
+
it { method.call.must_equal expected_result }
|
55
|
+
end
|
56
|
+
|
57
|
+
describe "with existing wiki page content" do
|
58
|
+
let(:method) { lambda { Gitnesse.build_page_content(new_feature_content, wiki_page_content) } }
|
59
|
+
let(:expected_result) do
|
60
|
+
<<-EOS
|
61
|
+
# Addition is Awesome
|
62
|
+
|
63
|
+
```gherkin
|
64
|
+
Feature: Addition
|
65
|
+
In order to avoid silly mistakes
|
66
|
+
I want to be told the sum of two numbers
|
67
|
+
|
68
|
+
Scenario: Add two double digit numbers
|
69
|
+
Given I have entered 50 into the calculator
|
70
|
+
And I have entered 70 into the calculator
|
71
|
+
When I add
|
72
|
+
Then the result should be 120 on the screen
|
73
|
+
```
|
74
|
+
EOS
|
75
|
+
end
|
76
|
+
|
77
|
+
it { method.call.must_equal expected_result }
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
require_relative '../../test_helper'
|
2
|
+
|
3
|
+
describe Gitnesse do
|
4
|
+
describe "#ensure_repository" do
|
5
|
+
let(:method) { lambda { Gitnesse.ensure_repository } }
|
6
|
+
|
7
|
+
describe "when repository was defined" do
|
8
|
+
before { Gitnesse.repository_url("git://github.com/hybridgroup/gitnesse-demo.wiki") }
|
9
|
+
it { method.call.must_be_nil }
|
10
|
+
end
|
11
|
+
|
12
|
+
describe "when repository was not defined" do
|
13
|
+
before { Gitnesse.repository_url(nil) }
|
14
|
+
it { method.must_raise(RuntimeError) }
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
describe "#ensure_git_available" do
|
19
|
+
let(:method) { lambda { Gitnesse.ensure_git_available } }
|
20
|
+
|
21
|
+
describe "when git is not installed" do
|
22
|
+
before { Kernel.expects(:system).with("git --version").returns(false) }
|
23
|
+
it { method.must_raise(RuntimeError) }
|
24
|
+
end
|
25
|
+
|
26
|
+
describe "when git is installed" do
|
27
|
+
before { Kernel.expects(:system).with("git --version").returns(true) }
|
28
|
+
it { method.call.must_be_nil }
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
describe "#ensure_cucumber_available" do
|
33
|
+
let(:method) { lambda { Gitnesse.ensure_cucumber_available } }
|
34
|
+
|
35
|
+
describe "when cucumber is not installed" do
|
36
|
+
before { Kernel.expects(:system).with("cucumber --version").returns(false) }
|
37
|
+
it { method.must_raise(RuntimeError) }
|
38
|
+
end
|
39
|
+
|
40
|
+
describe "when cucumber is installed" do
|
41
|
+
before { Kernel.expects(:system).with("cucumber --version").returns(true) }
|
42
|
+
it { method.call.must_be_nil }
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require_relative '../../test_helper'
|
2
|
+
|
3
|
+
describe Gitnesse do
|
4
|
+
describe "#commit_info" do
|
5
|
+
let(:method) { lambda { Gitnesse.commit_info } }
|
6
|
+
|
7
|
+
describe "with a defined git username and email" do
|
8
|
+
before do
|
9
|
+
Gitnesse.expects(:read_git_config).with("user.name").returns("Bob Smith")
|
10
|
+
Gitnesse.expects(:read_git_config).with("user.email").returns("bob@bobsmith.com")
|
11
|
+
end
|
12
|
+
|
13
|
+
it { method.call.must_equal({ :name => "Bob Smith",
|
14
|
+
:email => "bob@bobsmith.com",
|
15
|
+
:message => "Update features with Gitnesse" }) }
|
16
|
+
end
|
17
|
+
|
18
|
+
describe "without a defined git username and email" do
|
19
|
+
before do
|
20
|
+
Gitnesse.commit_info = nil
|
21
|
+
Gitnesse.expects(:read_git_config).with("user.name").returns('')
|
22
|
+
Gitnesse.expects(:read_git_config).with("user.email").returns('')
|
23
|
+
end
|
24
|
+
|
25
|
+
it { method.must_raise RuntimeError }
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require_relative '../../test_helper'
|
2
|
+
|
3
|
+
describe Gitnesse do
|
4
|
+
describe ".config_to_hash" do
|
5
|
+
let(:method) { lambda { Gitnesse.config_to_hash } }
|
6
|
+
before do
|
7
|
+
Gitnesse.config do
|
8
|
+
repository_url "git://github.com/hybridgroup/gitnesse-demo.wiki.git"
|
9
|
+
branch "wiki"
|
10
|
+
target_directory "feature_files"
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
it { method.call.must_be_instance_of Hash }
|
15
|
+
|
16
|
+
it "contains the configuration data" do
|
17
|
+
hash = method.call
|
18
|
+
|
19
|
+
hash["repository_url"].must_equal "git://github.com/hybridgroup/gitnesse-demo.wiki.git"
|
20
|
+
hash["branch"].must_equal "wiki"
|
21
|
+
hash["target_directory"].must_equal "feature_files"
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require_relative '../../test_helper'
|
2
|
+
|
3
|
+
describe Gitnesse do
|
4
|
+
describe "#branch" do
|
5
|
+
describe "defaults to 'master'" do
|
6
|
+
before { Gitnesse.branch nil }
|
7
|
+
it { Gitnesse.branch.must_equal "master" }
|
8
|
+
end
|
9
|
+
|
10
|
+
describe "when changed" do
|
11
|
+
before { Gitnesse.branch "wiki" }
|
12
|
+
it { Gitnesse.branch.must_equal "wiki" }
|
13
|
+
end
|
14
|
+
|
15
|
+
describe "when changed through #config" do
|
16
|
+
before do
|
17
|
+
Gitnesse.config do
|
18
|
+
branch "wiki"
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
it { Gitnesse.branch.must_equal "wiki" }
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
require_relative '../../test_helper'
|
2
|
+
|
3
|
+
describe Gitnesse do
|
4
|
+
describe ".extract_features" do
|
5
|
+
let(:data) do
|
6
|
+
<<-EOS
|
7
|
+
# Addition is Awesome
|
8
|
+
|
9
|
+
```gherkin
|
10
|
+
Feature: Addition
|
11
|
+
In order to avoid silly mistakes
|
12
|
+
I want to be told the sum of two numbers
|
13
|
+
|
14
|
+
Scenario: Add two single digit numbers
|
15
|
+
Given I have entered 7 into the calculator
|
16
|
+
And I have entered 5 into the calculator
|
17
|
+
When I add
|
18
|
+
Then the result should be 12 on the screen
|
19
|
+
```
|
20
|
+
EOS
|
21
|
+
end
|
22
|
+
|
23
|
+
let(:expected_result) do
|
24
|
+
{ "addition" => "Feature: Addition
|
25
|
+
In order to avoid silly mistakes
|
26
|
+
I want to be told the sum of two numbers
|
27
|
+
|
28
|
+
Scenario: Add two single digit numbers
|
29
|
+
Given I have entered 7 into the calculator
|
30
|
+
And I have entered 5 into the calculator
|
31
|
+
When I add
|
32
|
+
Then the result should be 12 on the screen
|
33
|
+
"}
|
34
|
+
end
|
35
|
+
|
36
|
+
let(:method) { lambda { Gitnesse.extract_features(data) } }
|
37
|
+
|
38
|
+
it { method.call.must_be_instance_of Hash }
|
39
|
+
|
40
|
+
it "extracts feature data" do
|
41
|
+
method.call.must_equal expected_result
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require_relative '../../test_helper'
|
2
|
+
|
3
|
+
describe Gitnesse do
|
4
|
+
describe ".gather_features" do
|
5
|
+
|
6
|
+
describe "when several features" do
|
7
|
+
let(:page_features) { {"test-feature" => "feature content", "another-test-feature" => "another feature content"} }
|
8
|
+
|
9
|
+
it { Gitnesse.gather_features(page_features).must_equal "feature content" }
|
10
|
+
end
|
11
|
+
|
12
|
+
describe "when one single feature" do
|
13
|
+
let(:page_features) { {"test-feature" => "feature content"} }
|
14
|
+
|
15
|
+
it { Gitnesse.gather_features(page_features).must_equal "feature content" }
|
16
|
+
end
|
17
|
+
|
18
|
+
describe "when no features" do
|
19
|
+
let(:page_features) { Hash.new }
|
20
|
+
|
21
|
+
it { Gitnesse.gather_features(page_features).must_equal "" }
|
22
|
+
end
|
23
|
+
|
24
|
+
describe "when nil" do
|
25
|
+
let(:page_features) { nil }
|
26
|
+
|
27
|
+
it { Gitnesse.gather_features(page_features).must_equal "" }
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require_relative '../../test_helper'
|
2
|
+
|
3
|
+
describe Gitnesse do
|
4
|
+
describe "#load_feature_files_into_wiki" do
|
5
|
+
let(:wiki) { mock() }
|
6
|
+
let(:wiki_page) { mock() }
|
7
|
+
let(:tmpdir) { Dir.mktmpdir }
|
8
|
+
let(:feature_file_dir) { Dir.mktmpdir }
|
9
|
+
|
10
|
+
before do
|
11
|
+
# create test feature
|
12
|
+
File.open(File.join(feature_file_dir, "test.feature"), "w") do |file|
|
13
|
+
feature = <<-EOF
|
14
|
+
Feature: Addition
|
15
|
+
In order to avoid silly mistakes
|
16
|
+
As a math idiot
|
17
|
+
I want to be told the sum of two numbers
|
18
|
+
|
19
|
+
Scenario: Add two numbers
|
20
|
+
Given I have entered 50 into the calculator
|
21
|
+
And I have entered 70 into the calculator
|
22
|
+
When I press add
|
23
|
+
Then the result should be 120 on the screen
|
24
|
+
EOF
|
25
|
+
|
26
|
+
file.write(feature)
|
27
|
+
end
|
28
|
+
|
29
|
+
Dir.expects(:glob).with("#{Gitnesse.target_directory}/*.feature").returns(:feature_file_dir)
|
30
|
+
wiki.expects(:page).with("testing").returns(wiki_page)
|
31
|
+
Gitnesse.expects(:update_wiki_page).with(wiki_page, "testing", "blarg")
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require_relative '../../test_helper'
|
2
|
+
|
3
|
+
describe Gitnesse do
|
4
|
+
describe "#read_git_config" do
|
5
|
+
let(:method) { lambda { Gitnesse.read_git_config("user.email") } }
|
6
|
+
|
7
|
+
describe "when a gitconfig value is not set" do
|
8
|
+
before do
|
9
|
+
$?.stubs(:success?).returns(false)
|
10
|
+
Gitnesse.stubs(:`).with("git config --get user.email").returns("")
|
11
|
+
Gitnesse.stubs(:`).with("git config --get --global user.email").returns("")
|
12
|
+
end
|
13
|
+
|
14
|
+
it { method.call.must_equal "" }
|
15
|
+
end
|
16
|
+
|
17
|
+
describe "when a gitconfig value is set" do
|
18
|
+
before do
|
19
|
+
$?.stubs(:success?).returns(true)
|
20
|
+
Gitnesse.stubs(:`).with("git config --get user.email").returns("bob@bobsmith.com\n")
|
21
|
+
end
|
22
|
+
|
23
|
+
it { method.call.must_equal "bob@bobsmith.com" }
|
24
|
+
end
|
25
|
+
|
26
|
+
describe "when a gitconfig value is set globally" do
|
27
|
+
before do
|
28
|
+
Gitnesse.stubs(:`).with("git config --get user.email").returns("")
|
29
|
+
Gitnesse.stubs(:`).with("git config --get --global user.email").returns("bob@bobsmith.com\n")
|
30
|
+
end
|
31
|
+
|
32
|
+
it { method.call.must_equal "bob@bobsmith.com" }
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require_relative '../../test_helper'
|
2
|
+
|
3
|
+
describe Gitnesse do
|
4
|
+
describe "#write_feature_file" do
|
5
|
+
let(:method) { lambda { Gitnesse.write_feature_file } }
|
6
|
+
let(:file) { StringIO.new }
|
7
|
+
|
8
|
+
before do
|
9
|
+
File.expects(:open).with("#{Gitnesse.target_directory}/test.feature", "w").yields(file)
|
10
|
+
Gitnesse.expects(:gather_features).with({ "test-feature" => "feature content" }).returns("feature content")
|
11
|
+
end
|
12
|
+
|
13
|
+
it "writes to the file" do
|
14
|
+
Gitnesse.write_feature_file("test", { "test-feature" => "feature content" })
|
15
|
+
file.string.must_equal "feature content"
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
data/test/test_helper.rb
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
require "minitest/matchers"
|
2
|
+
require "minitest/autorun"
|
3
|
+
require "minitest/pride"
|
4
|
+
require "mocha"
|
5
|
+
require File.expand_path('../../lib/gitnesse.rb', __FILE__)
|
6
|
+
|
7
|
+
module FeatureTestMethods
|
8
|
+
|
9
|
+
# Creates a basic test feature
|
10
|
+
#
|
11
|
+
# Returns a string
|
12
|
+
def create_test_feature
|
13
|
+
<<-EOF
|
14
|
+
Feature: Addition
|
15
|
+
In order to avoid silly mistakes
|
16
|
+
As a math idiot
|
17
|
+
I want to be told the sum of two numbers
|
18
|
+
|
19
|
+
Scenario: Add two numbers
|
20
|
+
Given I have entered 50 into the calculator
|
21
|
+
And I have entered 70 into the calculator
|
22
|
+
When I press add
|
23
|
+
Then the result should be 120 on the screen
|
24
|
+
EOF
|
25
|
+
end
|
26
|
+
end
|
metadata
ADDED
@@ -0,0 +1,186 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: gitnesse
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- www.hybridgroup.com
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2012-11-14 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: bundler
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '0'
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: gollum
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ~>
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: 2.3.12
|
38
|
+
type: :runtime
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ~>
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: 2.3.12
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
name: minitest-matchers
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
50
|
+
requirements:
|
51
|
+
- - ! '>='
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '0'
|
54
|
+
type: :development
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ! '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
- !ruby/object:Gem::Dependency
|
63
|
+
name: mocha
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
65
|
+
none: false
|
66
|
+
requirements:
|
67
|
+
- - ! '>='
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '0'
|
70
|
+
type: :development
|
71
|
+
prerelease: false
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ! '>='
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: '0'
|
78
|
+
- !ruby/object:Gem::Dependency
|
79
|
+
name: cucumber
|
80
|
+
requirement: !ruby/object:Gem::Requirement
|
81
|
+
none: false
|
82
|
+
requirements:
|
83
|
+
- - ! '>='
|
84
|
+
- !ruby/object:Gem::Version
|
85
|
+
version: '0'
|
86
|
+
type: :development
|
87
|
+
prerelease: false
|
88
|
+
version_requirements: !ruby/object:Gem::Requirement
|
89
|
+
none: false
|
90
|
+
requirements:
|
91
|
+
- - ! '>='
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: '0'
|
94
|
+
- !ruby/object:Gem::Dependency
|
95
|
+
name: rake
|
96
|
+
requirement: !ruby/object:Gem::Requirement
|
97
|
+
none: false
|
98
|
+
requirements:
|
99
|
+
- - ! '>='
|
100
|
+
- !ruby/object:Gem::Version
|
101
|
+
version: '0'
|
102
|
+
type: :development
|
103
|
+
prerelease: false
|
104
|
+
version_requirements: !ruby/object:Gem::Requirement
|
105
|
+
none: false
|
106
|
+
requirements:
|
107
|
+
- - ! '>='
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: '0'
|
110
|
+
description: Use github wiki to store feature stories, then execute then using Cucumber
|
111
|
+
email:
|
112
|
+
- info@hybridgroup.com
|
113
|
+
executables:
|
114
|
+
- gitnesse
|
115
|
+
extensions: []
|
116
|
+
extra_rdoc_files: []
|
117
|
+
files:
|
118
|
+
- .gitignore
|
119
|
+
- Gemfile
|
120
|
+
- LICENSE.txt
|
121
|
+
- README.md
|
122
|
+
- Rakefile
|
123
|
+
- bin/gitnesse
|
124
|
+
- gitnesse.gemspec
|
125
|
+
- lib/gitnesse.rb
|
126
|
+
- lib/gitnesse/railtie.rb
|
127
|
+
- lib/gitnesse/tasks.rake
|
128
|
+
- lib/gitnesse/tasks.rb
|
129
|
+
- lib/gitnesse/version.rb
|
130
|
+
- test/lib/gitnesse/build_page_content_test.rb
|
131
|
+
- test/lib/gitnesse/check_dependencies_test.rb
|
132
|
+
- test/lib/gitnesse/commit_info_test.rb
|
133
|
+
- test/lib/gitnesse/config_to_hash_test.rb
|
134
|
+
- test/lib/gitnesse/custom_branch_test.rb
|
135
|
+
- test/lib/gitnesse/extract_features_test.rb
|
136
|
+
- test/lib/gitnesse/gather_features_test.rb
|
137
|
+
- test/lib/gitnesse/load_feature_files_into_wiki_test.rb
|
138
|
+
- test/lib/gitnesse/read_git_config_test.rb
|
139
|
+
- test/lib/gitnesse/version_test.rb
|
140
|
+
- test/lib/gitnesse/write_feature_file_test.rb
|
141
|
+
- test/test_helper.rb
|
142
|
+
- test/wiki_test_helper.rb
|
143
|
+
homepage: https://github.com/hybridgroup/gitnesse
|
144
|
+
licenses: []
|
145
|
+
post_install_message:
|
146
|
+
rdoc_options: []
|
147
|
+
require_paths:
|
148
|
+
- lib
|
149
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
150
|
+
none: false
|
151
|
+
requirements:
|
152
|
+
- - ! '>='
|
153
|
+
- !ruby/object:Gem::Version
|
154
|
+
version: '0'
|
155
|
+
segments:
|
156
|
+
- 0
|
157
|
+
hash: -126475923394680174
|
158
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
159
|
+
none: false
|
160
|
+
requirements:
|
161
|
+
- - ! '>='
|
162
|
+
- !ruby/object:Gem::Version
|
163
|
+
version: '0'
|
164
|
+
segments:
|
165
|
+
- 0
|
166
|
+
hash: -126475923394680174
|
167
|
+
requirements: []
|
168
|
+
rubyforge_project:
|
169
|
+
rubygems_version: 1.8.24
|
170
|
+
signing_key:
|
171
|
+
specification_version: 3
|
172
|
+
summary: Features on git-based Wiki!
|
173
|
+
test_files:
|
174
|
+
- test/lib/gitnesse/build_page_content_test.rb
|
175
|
+
- test/lib/gitnesse/check_dependencies_test.rb
|
176
|
+
- test/lib/gitnesse/commit_info_test.rb
|
177
|
+
- test/lib/gitnesse/config_to_hash_test.rb
|
178
|
+
- test/lib/gitnesse/custom_branch_test.rb
|
179
|
+
- test/lib/gitnesse/extract_features_test.rb
|
180
|
+
- test/lib/gitnesse/gather_features_test.rb
|
181
|
+
- test/lib/gitnesse/load_feature_files_into_wiki_test.rb
|
182
|
+
- test/lib/gitnesse/read_git_config_test.rb
|
183
|
+
- test/lib/gitnesse/version_test.rb
|
184
|
+
- test/lib/gitnesse/write_feature_file_test.rb
|
185
|
+
- test/test_helper.rb
|
186
|
+
- test/wiki_test_helper.rb
|