cucumber-pro 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 360d700355a6242a32b3bc1158413bb28631b78f
4
+ data.tar.gz: 62714230f4f2b5705019573dc6e1e6c0a73efd01
5
+ SHA512:
6
+ metadata.gz: e774893274297e0d247c25ef63d2781c9f30be102feb663a96c9591f923ce52f11228944b5957f8bbd82dae382c710d42a6b95be8c114f2ad9fb8170d787f117
7
+ data.tar.gz: dcad02c537dba40d9ebce9f6c5b1238896bc7f1a36edf656573abd87511f8d997f3f65d541c2a06dcb7220215f358b76a474e4c204a92eaab0e1418821971a12
data/Gemfile ADDED
@@ -0,0 +1,2 @@
1
+ source 'https://rubygems.org'
2
+ gemspec
data/LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ The MIT License
2
+
3
+ Copyright (c) 2013 Cucumber Ltd
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.
@@ -0,0 +1,19 @@
1
+ # Cucumber Pro Client Gem
2
+
3
+ This gem provides a formatter for Cucumber that publishes results to
4
+ the [Cucumber Pro](https://cucumber.pro) web service.
5
+
6
+ ## Usage
7
+
8
+ Add the following line to your gemfile:
9
+
10
+ ```
11
+ gem 'cucumber-pro'
12
+ ```
13
+
14
+ Now run Cucumber using the `Cucumber::Pro` formatter:
15
+
16
+ ```
17
+ CUCUMBER_PRO_TOKEN=<your auth token> cucumber -f Cucumber::Pro -f pretty
18
+ ```
19
+
@@ -0,0 +1,24 @@
1
+ require 'rubygems'
2
+ require 'bundler'
3
+ Bundler::GemHelper.install_tasks
4
+
5
+ desc 'Run tests'
6
+ task default: :cucumber
7
+
8
+ ENV['cucumber_pro_log_path'] = File.dirname(__FILE__) + '/tmp/test.log'
9
+
10
+ task :cucumber do
11
+ sh 'cucumber'
12
+ end
13
+
14
+ desc 'Run repeated tests to check for async bugs'
15
+ task :soak, :repetitions do |task, args|
16
+ reps = args[:repetitions] || 10
17
+ results = reps.to_i.times.map do
18
+ `cucumber`
19
+ print $? == 0 ? '.' : 'x'
20
+ $?
21
+ end
22
+ num_failed = results.count { |r| r != 0 }
23
+ fail "#{num_failed}/#{reps} failed" if num_failed > 0
24
+ end
data/TODO.md ADDED
@@ -0,0 +1,4 @@
1
+ - Scenario for when the token is invalid
2
+ - Gemspec etc
3
+ - Better (more unique) run ID
4
+
@@ -0,0 +1,34 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $LOAD_PATH.unshift File.expand_path("../lib", __FILE__)
3
+ require "cucumber/pro/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = 'cucumber-pro'
7
+ s.version = Cucumber::Pro::Version
8
+ s.authors = ["Matt Wynne"]
9
+ s.description = "Client library for publishing results to the Cucumber Pro service"
10
+ s.summary = "cucumber-pro-#{s.version}"
11
+ s.email = "hello@cucumber.pro"
12
+ s.homepage = "https://cucumber.pro"
13
+ s.platform = Gem::Platform::RUBY
14
+ s.license = "MIT"
15
+ s.required_ruby_version = ">= 1.9.3"
16
+
17
+ s.add_dependency 'grit'
18
+ s.add_dependency 'faye-websocket'
19
+
20
+ s.add_development_dependency 'bundler', '>= 1.3.5'
21
+ s.add_development_dependency 'rake', '>= 0.9.2'
22
+ s.add_development_dependency 'rspec', '>= 2.14.1'
23
+ s.add_development_dependency 'cucumber'
24
+ s.add_development_dependency 'aruba'
25
+ s.add_development_dependency 'thin'
26
+ s.add_development_dependency 'rack'
27
+ s.add_development_dependency 'anticipate'
28
+
29
+ s.rubygems_version = ">= 1.6.1"
30
+ s.files = `git ls-files`.split("\n").reject {|path| path =~ /\.gitignore$/ }
31
+ s.test_files = `git ls-files -- {spec,features}/*`.split("\n")
32
+ s.rdoc_options = ["--charset=UTF-8"]
33
+ s.require_path = "lib"
34
+ end
@@ -0,0 +1,49 @@
1
+ @announce
2
+ Feature: Publish results
3
+
4
+ Scenario: A couple of scenarios
5
+ Given a git repo
6
+ And a feature "features/test.feature" with:
7
+ """
8
+ Feature:
9
+ Scenario:
10
+ Given passing
11
+
12
+ Scenario:
13
+ Given failing
14
+ """
15
+ When I run `cucumber -f Cucumber::Pro -o /dev/null -f pretty`
16
+ Then the results service should receive a header
17
+ And the results service should receive these test-step results:
18
+ | status | path | location |
19
+ | passed | features/test.feature | 3 |
20
+ | failed | features/test.feature | 6 |
21
+ And the results service should receive these test-case results:
22
+ | status | path | location |
23
+ | passed | features/test.feature | 2 |
24
+ | failed | features/test.feature | 5 |
25
+
26
+ Scenario: A scenario outline
27
+
28
+ Note that we don't specify how step results will be published. This is because it's hard to get
29
+ a location for steps when a scenario outline executes.
30
+
31
+ Given a git repo
32
+ And a feature "features/test.feature" with:
33
+ """
34
+ Feature:
35
+ Scenario Outline:
36
+ Given <result>
37
+
38
+ Examples:
39
+ | result |
40
+ | passing |
41
+ | failing |
42
+ """
43
+ When I run `cucumber -f Cucumber::Pro -o /dev/null -f pretty`
44
+ Then the results service should receive a header
45
+ And the results service should receive these test-case results:
46
+ | status | path | location |
47
+ | passed | features/test.feature | 7 |
48
+ | failed | features/test.feature | 8 |
49
+
@@ -0,0 +1,53 @@
1
+ Before do
2
+ write_file 'features/step_definitions/steps.rb', <<-END
3
+ Given(/pass/) { }
4
+ Given(/fail/) { fail }
5
+ END
6
+ end
7
+
8
+ After do
9
+ terminate_processes!
10
+ end
11
+
12
+ Given(/^a git repo$/) do
13
+ run_simple "git init"
14
+ run_simple "git commit --allow-empty -m 'Initial commit'"
15
+ run_simple "git remote add origin #{repo_url}"
16
+ run_simple "git config --get remote.origin.url"
17
+ end
18
+
19
+ Given(/^a feature "(.*?)" with:$/) do |path, content|
20
+ write_file path, content
21
+ end
22
+
23
+ Then(/^the results service should receive a header$/) do
24
+ eventually do
25
+ results_service.messages.length.should > 0
26
+ end
27
+ results_service.messages.first['repo_url'].should == repo_url
28
+ end
29
+
30
+ Then(/^the results service should receive these ([\w\-]+) results:$/) do |type, results|
31
+ expected_results = results.hashes
32
+ actual_results = eventually {
33
+ results = results_service.messages.select { |msg| msg['mime_type'] =~ /#{type}/ }
34
+ expect( results.length ).to eq expected_results.length
35
+ results
36
+ }
37
+ expected_statuses = expected_results.map { |result| [result['status'], result['path'], result['location'].to_i ] }
38
+ actual_statuses = actual_results.map { |result| [result['body']['status'], result['path'], result['location']] }
39
+ expect( actual_statuses ).to eq expected_statuses
40
+ end
41
+
42
+ require 'anticipate'
43
+ module Eventually
44
+ include Anticipate
45
+ def eventually(&block)
46
+ result = nil
47
+ sleeping(0.1).seconds.between_tries.failing_after(30).tries do
48
+ result = block.call
49
+ end
50
+ result
51
+ end
52
+ end
53
+ World(Eventually)
@@ -0,0 +1,11 @@
1
+ require 'aruba/cucumber'
2
+
3
+ Before do
4
+ # ensure Cucumber's Ruby process can require the plugin as though it were a gem
5
+ path = File.expand_path(File.dirname(__FILE__) + '/../../lib')
6
+ set_env 'RUBYLIB', path
7
+ end
8
+
9
+ Before do
10
+ @aruba_timeout_seconds = 5
11
+ end
@@ -0,0 +1,2 @@
1
+ $logger = Logger.new(ENV['cucumber_pro_log_path'] || STDOUT)
2
+ $logger.debug '--- starting tests ---'
@@ -0,0 +1,98 @@
1
+ require 'faye/websocket'
2
+ require 'json'
3
+
4
+ module FakeResultsService
5
+ PORT = 5000
6
+ VALID_TOKEN = 'valid-cucumber-pro-token'
7
+
8
+ class << self
9
+ def messages
10
+ @messages ||= []
11
+ end
12
+
13
+ def reset
14
+ @messages = nil
15
+ end
16
+
17
+ def logger
18
+ $logger
19
+ end
20
+ end
21
+
22
+ logger = self.logger
23
+
24
+ SocketApp = lambda do |env|
25
+ logger.debug [:server, :starting]
26
+ ws = Faye::WebSocket.new(env)
27
+
28
+ ws.on :open do |event|
29
+ logger.debug [:server, :open]
30
+ end
31
+
32
+ ws.on :message do |event|
33
+ logger.debug [:server, :message, event.data]
34
+ FakeResultsService.messages << JSON.parse(event.data)
35
+ ws.send 'ok'
36
+ end
37
+
38
+ ws.on :close do |event|
39
+ logger.debug [:server, :close]
40
+ end
41
+
42
+ # Return async Rack response
43
+ ws.rack_response
44
+ end
45
+
46
+ class Security
47
+ def initialize(app)
48
+ @app = app
49
+ end
50
+
51
+ def call(env)
52
+ request = Rack::Request.new(env)
53
+ params = request.params
54
+ return [401, [], {}] unless params['token'] == VALID_TOKEN
55
+ @app.call(env)
56
+ end
57
+ end
58
+
59
+ require 'thin'
60
+ require 'rack'
61
+ require 'eventmachine'
62
+ Faye::WebSocket.load_adapter 'thin'
63
+ Thin::Logging.logger = logger
64
+ $em = Thread.new do
65
+ begin
66
+ EM.run do
67
+ thin = Rack::Handler.get('thin')
68
+ app = Security.new(SocketApp)
69
+ thin.run app, :Port => PORT
70
+ trap("INT") { exit }
71
+ end
72
+ rescue => exception
73
+ logger.fatal(exception)
74
+ $stderr.puts exception, exception.backtrace
75
+ exit 1
76
+ end
77
+ end
78
+
79
+ loop until EM.reactor_running?
80
+ end
81
+
82
+ if !respond_to?(:Before)
83
+ # Standalone (manual test) mode
84
+ $em.join
85
+ else
86
+ # Cucumber mode
87
+ Before { FakeResultsService.reset }
88
+ After { FakeResultsService.logger.debug [:server, :messages, FakeResultsService.messages] }
89
+ Before do
90
+ write_file 'features/step_definitions/cucumber_pro.rb', <<-END
91
+ require 'cucumber/pro'
92
+ Cucumber::Pro.configure do |c|
93
+ c.url = 'ws://localhost:#{FakeResultsService::PORT}'
94
+ c.token = "#{FakeResultsService::VALID_TOKEN}"
95
+ end
96
+ END
97
+ end
98
+ end
@@ -0,0 +1,9 @@
1
+ World Module.new {
2
+ def repo_url
3
+ "git@github.com:cucumber-ltd/cucumber-pro-test"
4
+ end
5
+
6
+ def results_service
7
+ FakeResultsService
8
+ end
9
+ }
@@ -0,0 +1,40 @@
1
+ require 'logger'
2
+ require 'cucumber/pro/formatter'
3
+ require 'cucumber/pro/web_socket_session'
4
+
5
+ module Cucumber
6
+ module Pro
7
+
8
+ class << self
9
+ def new(*)
10
+ url = config.url + "?token=#{config.token}"
11
+ session = WebSocketSession.new(url, config.logger)
12
+ Formatter.new(session)
13
+ end
14
+
15
+ def configure
16
+ yield config
17
+ end
18
+
19
+ private
20
+
21
+ def config
22
+ @config ||= Config.new
23
+ end
24
+ end
25
+
26
+ class Config
27
+ attr_accessor :url, :logger, :token
28
+ end
29
+
30
+ # Default config
31
+ configure do |config|
32
+ config.url = 'ws://metarepo.cucumber.pro/ws'
33
+ config.logger = Logger.new(ENV['cucumber_pro_log_path'] || STDOUT)
34
+ config.token = ENV['CUCUMBER_PRO_TOKEN']
35
+ end
36
+
37
+ end
38
+ end
39
+
40
+
@@ -0,0 +1,88 @@
1
+ require 'cucumber/pro/scm'
2
+
3
+ module Cucumber
4
+ module Pro
5
+
6
+ class Formatter
7
+ def initialize(session)
8
+ @session = session
9
+ send_header
10
+ end
11
+
12
+ def before_feature(feature)
13
+ @path = feature.file # we need this because table_row doens't have a file_colon_line
14
+ end
15
+
16
+ def before_step_result(*args)
17
+ keyword, step_match, multiline_arg, status, exception, source_indent, background, file_colon_line = *args
18
+ path, line = *file_colon_line.split(':')
19
+ send_step_result(path, line, status)
20
+ end
21
+
22
+ def after_feature_element(feature_element)
23
+ return if Cucumber::Ast::ScenarioOutline === feature_element
24
+ scenario = feature_element
25
+ path, line = *scenario.file_colon_line.split(':')
26
+ send_test_case_result(path, line, scenario.status)
27
+ end
28
+
29
+ def before_examples(*args)
30
+ @header_row = true
31
+ @in_examples = true
32
+ end
33
+
34
+ def after_examples(*args)
35
+ @in_examples = false
36
+ end
37
+
38
+ def after_table_row(table_row)
39
+ return unless @in_examples and Cucumber::Ast::OutlineTable::ExampleRow === table_row
40
+ if @header_row
41
+ @header_row = false
42
+ return
43
+ end
44
+ send_test_case_result(@path, table_row.line, table_row.status)
45
+ end
46
+
47
+ def after_features(*args)
48
+ @session.close
49
+ end
50
+
51
+ private
52
+
53
+ def send_header
54
+ scm = Scm::Repo.find
55
+ @session.send({
56
+ repo_url: scm.remote,
57
+ branch: scm.branch,
58
+ rev: scm.rev,
59
+ group: get_run_id
60
+ })
61
+ end
62
+
63
+ def send_step_result(path, line, status)
64
+ @session.send({
65
+ path: path,
66
+ location: line.to_i,
67
+ mime_type: 'application/vnd.cucumber.test-step-result+json',
68
+ body: { status: status }
69
+ })
70
+ end
71
+
72
+ def send_test_case_result(path, line, status)
73
+ @session.send({
74
+ path: path,
75
+ location: line.to_i,
76
+ mime_type: 'application/vnd.cucumber.test-case-result+json',
77
+ body: { status: status }
78
+ })
79
+ end
80
+
81
+ def get_run_id
82
+ Time.now.to_i
83
+ end
84
+
85
+ end
86
+
87
+ end
88
+ end
@@ -0,0 +1,38 @@
1
+ module Cucumber
2
+ module Pro
3
+
4
+ module Scm
5
+
6
+ require 'grit'
7
+ class Repo
8
+
9
+ NoGitRepoFound = Class.new(StandardError)
10
+
11
+ def self.find(path = Dir.pwd)
12
+ if Dir.entries(path).include? '.git'
13
+ new(path)
14
+ else
15
+ raise NoGitRepoFound if path == '/'
16
+ find File.expand_path(path + '/..')
17
+ end
18
+ end
19
+
20
+ def initialize(path)
21
+ @repo = Grit::Repo.new(path)
22
+ end
23
+
24
+ def remote
25
+ @repo.config['remote.origin.url']
26
+ end
27
+
28
+ def branch
29
+ @repo.head.name
30
+ end
31
+
32
+ def rev
33
+ @repo.head.commit.id
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,9 @@
1
+ module Cucumber
2
+ module Pro
3
+ class Version
4
+ def self.to_s
5
+ "0.0.1"
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,111 @@
1
+ require 'json'
2
+ require 'faye/websocket'
3
+ require 'eventmachine'
4
+
5
+ module Cucumber
6
+ module Pro
7
+ module Error
8
+ AccessDenied = Class.new(StandardError) {
9
+ def initialize
10
+ super "Access denied."
11
+ end
12
+ }
13
+ end
14
+
15
+ class WebSocketSession
16
+
17
+
18
+ class SendMessage
19
+ def initialize(data)
20
+ @data = data
21
+ end
22
+
23
+ def send_to(ws)
24
+ ws.send(@data.to_json)
25
+ end
26
+ end
27
+
28
+ class Close
29
+ def send_to(ws)
30
+ ws.close
31
+ end
32
+ end
33
+
34
+ def initialize(url, logger)
35
+ @url, @logger = url, logger
36
+ @queue = Queue.new
37
+ start
38
+ end
39
+
40
+ def send(message)
41
+ logger.debug [:session, :send, message]
42
+ queue.push(SendMessage.new(message))
43
+ end
44
+
45
+ def close
46
+ logger.debug [:session, :close]
47
+ queue.push(Close.new)
48
+ @em.join
49
+ if @ws_error
50
+ puts "Cucumber Pro failed to send results: #{@ws_error}"
51
+ end
52
+ end
53
+
54
+ private
55
+
56
+ attr_reader :logger, :queue
57
+
58
+ def start
59
+ @em = Thread.new do
60
+ begin
61
+ EM.run { start_ws_client }
62
+ rescue => exception
63
+ logger.fatal exception
64
+ @ws_error = exception
65
+ end
66
+ end
67
+ end
68
+
69
+ def start_ws_client
70
+ logger.debug [:ws, :start]
71
+ ws = Faye::WebSocket::Client.new(@url)
72
+
73
+ ws.on(:open) do
74
+ logger.debug [:ws, :open]
75
+ process_queue(ws)
76
+ end
77
+
78
+ ws.on(:error) do
79
+ logger.error [:ws, :error]
80
+ end
81
+
82
+ ws.on(:message) do |event|
83
+ logger.debug [:ws, :message, event.data]
84
+ end
85
+
86
+ ws.on(:close) do |event|
87
+ logger.debug [:ws, :close]
88
+ @ws_error = Error::AccessDenied.new
89
+ ws = nil
90
+ EM.stop_event_loop
91
+ end
92
+ self
93
+ end
94
+
95
+ def process_queue(ws)
96
+ process_next_message(ws)
97
+ EM.next_tick do
98
+ process_queue(ws)
99
+ end
100
+ end
101
+
102
+ def process_next_message(ws)
103
+ return if queue.empty?
104
+ message = queue.pop
105
+ message.send_to(ws)
106
+ logger.debug [:ws, :send, message]
107
+ end
108
+
109
+ end
110
+ end
111
+ end
metadata ADDED
@@ -0,0 +1,208 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: cucumber-pro
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Matt Wynne
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-05-15 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: grit
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: faye-websocket
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: bundler
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: 1.3.5
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: 1.3.5
55
+ - !ruby/object:Gem::Dependency
56
+ name: rake
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: 0.9.2
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: 0.9.2
69
+ - !ruby/object:Gem::Dependency
70
+ name: rspec
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: 2.14.1
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: 2.14.1
83
+ - !ruby/object:Gem::Dependency
84
+ name: cucumber
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: aruba
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: thin
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: rack
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ - !ruby/object:Gem::Dependency
140
+ name: anticipate
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ">="
144
+ - !ruby/object:Gem::Version
145
+ version: '0'
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - ">="
151
+ - !ruby/object:Gem::Version
152
+ version: '0'
153
+ description: Client library for publishing results to the Cucumber Pro service
154
+ email: hello@cucumber.pro
155
+ executables: []
156
+ extensions: []
157
+ extra_rdoc_files: []
158
+ files:
159
+ - Gemfile
160
+ - LICENSE
161
+ - README.md
162
+ - Rakefile
163
+ - TODO.md
164
+ - cucumber-pro.gemspec
165
+ - features/publish_results.feature
166
+ - features/step_definitions/steps.rb
167
+ - features/support/aruba.rb
168
+ - features/support/env.rb
169
+ - features/support/fake_results_service.rb
170
+ - features/support/world.rb
171
+ - lib/cucumber/pro.rb
172
+ - lib/cucumber/pro/formatter.rb
173
+ - lib/cucumber/pro/scm.rb
174
+ - lib/cucumber/pro/version.rb
175
+ - lib/cucumber/pro/web_socket_session.rb
176
+ homepage: https://cucumber.pro
177
+ licenses:
178
+ - MIT
179
+ metadata: {}
180
+ post_install_message:
181
+ rdoc_options:
182
+ - "--charset=UTF-8"
183
+ require_paths:
184
+ - lib
185
+ required_ruby_version: !ruby/object:Gem::Requirement
186
+ requirements:
187
+ - - ">="
188
+ - !ruby/object:Gem::Version
189
+ version: 1.9.3
190
+ required_rubygems_version: !ruby/object:Gem::Requirement
191
+ requirements:
192
+ - - ">="
193
+ - !ruby/object:Gem::Version
194
+ version: '0'
195
+ requirements: []
196
+ rubyforge_project:
197
+ rubygems_version: 2.0.14
198
+ signing_key:
199
+ specification_version: 4
200
+ summary: cucumber-pro-0.0.1
201
+ test_files:
202
+ - features/publish_results.feature
203
+ - features/step_definitions/steps.rb
204
+ - features/support/aruba.rb
205
+ - features/support/env.rb
206
+ - features/support/fake_results_service.rb
207
+ - features/support/world.rb
208
+ has_rdoc: