the_wizard_of_api 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +17 -0
- data/.ruby-version +1 -0
- data/.travis.yml +7 -0
- data/Gemfile +8 -0
- data/LICENSE.txt +22 -0
- data/README.md +59 -0
- data/Rakefile +25 -0
- data/features/readme.feature +37 -0
- data/features/step_definitions/readme_steps.rb +7 -0
- data/features/step_definitions/streaming_requests_to_the_throne_room_steps.rb +37 -0
- data/features/streaming_requests_to_the_throne_room.feature +17 -0
- data/features/support/debugging_pry_helper.rb +18 -0
- data/features/support/env.rb +28 -0
- data/features/support/process_helper.rb +25 -0
- data/features/support/the_wizard_of_api_helper.rb +5 -0
- data/features/support/thin_helper.rb +31 -0
- data/features/support/timing_error_helper.rb +31 -0
- data/lib/the_wizard_of_api/version.rb +3 -0
- data/lib/the_wizard_of_api.rb +92 -0
- data/spec/lib/the_wizard_of_api_spec.rb +41 -0
- data/the_wizard_of_api.gemspec +35 -0
- metadata +272 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 50ab35a4980c81c2c69856d11f701d0c683c01fd
|
4
|
+
data.tar.gz: b4f603e747ecc067862a9cb8b32da266054a118c
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 2378dcd49d94569c1535dedef2abce102305c8f373ff58fc46b65f4364ddca697bc75a8e91eeca42a15833de2c61b211aaf60c5b279ca04fdd372600aea6e5fb
|
7
|
+
data.tar.gz: ff4d9aa86eb79d62f6c434407160e2627b425378384f9e0d71ff8f1a6c537c038995c1224c4175d0d68947638e0e8460f7f2026d82d14a098d9ededfff2f8106
|
data/.gitignore
ADDED
data/.ruby-version
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
2.0.0-p247
|
data/.travis.yml
ADDED
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2013 Caleb Buxton
|
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,59 @@
|
|
1
|
+
TheWizardOfApi ![Build Status](https://travis-ci.org/cpb/the_wizard_of_api.png)
|
2
|
+
===
|
3
|
+
|
4
|
+
[Wizard of Oz experiments](http://en.wikipedia.org/wiki/Wizard_of_Oz_experiment) help early on in the [design of novel services](http://www.deaneckles.com/blog/305_aardvarks-use-of-wizard-of-oz-prototyping-to-design-their-social-interfaces/).
|
5
|
+
|
6
|
+
From [Usability Net](http://www.usabilitynet.org/tools/wizard.htm)
|
7
|
+
|
8
|
+
> The Wizard of Oz technique enables unimplemented technology to be evaluated by using a human to simulate the response of a system.
|
9
|
+
|
10
|
+
TheWizardOfApi helps you build Wizard of Oz experiments by providing a human an interface that enables them to create API responses for incoming requests. Keeping with the metaphore, this interface is called the Throne Room. The human operator, or Wizard, observes incoming HTTP requests, and uses a form to create a JSON response document.
|
11
|
+
|
12
|
+
## Installation
|
13
|
+
|
14
|
+
Add this line to your application's Gemfile:
|
15
|
+
|
16
|
+
gem 'the_wizard_of_api'
|
17
|
+
|
18
|
+
And then execute:
|
19
|
+
|
20
|
+
$ bundle
|
21
|
+
|
22
|
+
### In an existing Rack app
|
23
|
+
|
24
|
+
Add this to your config.ru file:
|
25
|
+
|
26
|
+
require 'the_wizard_of_api'
|
27
|
+
use TheWizardOfApi
|
28
|
+
# Counts on having a run statement
|
29
|
+
|
30
|
+
### As a stand alone Rack app
|
31
|
+
|
32
|
+
Start your config.ru file like this:
|
33
|
+
|
34
|
+
require 'bundler/setup'
|
35
|
+
require 'the_wizard_of_api'
|
36
|
+
run TheWizardOfApi.new
|
37
|
+
|
38
|
+
## Usage
|
39
|
+
|
40
|
+
Having installed TheWizardOfApi to your Rack application, you can now access the Throne Room in your favoured browser at http://localhost:3000/throne
|
41
|
+
|
42
|
+
By default, TheWizardOfApi mounts the API request handler at a wild card path starting with /api/. So, requests like
|
43
|
+
|
44
|
+
* POST /api/wishes
|
45
|
+
* GET /api/wish/heart
|
46
|
+
* PUT /api/dorothy/home
|
47
|
+
* DELETE /api/witches
|
48
|
+
|
49
|
+
are satisifed by TheWizardOfApi. You can customize the mount point in your Rackup file like so:
|
50
|
+
|
51
|
+
use TheWizardOfApi, mount: "/kansas"
|
52
|
+
|
53
|
+
## Contributing
|
54
|
+
|
55
|
+
1. Fork it
|
56
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
57
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
58
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
59
|
+
5. Create new Pull Request
|
data/Rakefile
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
2
|
+
|
3
|
+
require 'cucumber/rake/task'
|
4
|
+
Cucumber::Rake::Task.new(:features)
|
5
|
+
|
6
|
+
Cucumber::Rake::Task.new(:run_aruba_features, nil) do |t|
|
7
|
+
t.cucumber_opts = "ARUBA_REPORT_DIR=doc --format progress"
|
8
|
+
end
|
9
|
+
|
10
|
+
task :check_for_pygments do
|
11
|
+
unless system("pygmentize", [:err,:out]=>"/dev/null")
|
12
|
+
raise "You're missing pygmentize, try:\n sudo easy_install Pygments"
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
desc "Run Cucumber features generating Aruba Report using Pygments"
|
17
|
+
task :aruba_features => [:check_for_pygments, :run_aruba_features]
|
18
|
+
|
19
|
+
require 'rspec/core'
|
20
|
+
require 'rspec/core/rake_task'
|
21
|
+
RSpec::Core::RakeTask.new(:spec) do |spec|
|
22
|
+
spec.pattern = FileList['spec/**/*_spec.rb']
|
23
|
+
end
|
24
|
+
|
25
|
+
task :default => [:spec, :features]
|
@@ -0,0 +1,37 @@
|
|
1
|
+
Feature: The public interface documented in the README
|
2
|
+
|
3
|
+
@disable-bundler @thin
|
4
|
+
Scenario: First installation using Bundler in an existing Rack Application
|
5
|
+
Given a file named "Gemfile" with:
|
6
|
+
"""
|
7
|
+
gem 'the_wizard_of_api', path: '../../'
|
8
|
+
"""
|
9
|
+
And a file named "config.ru" with:
|
10
|
+
"""
|
11
|
+
require 'bundler/setup'
|
12
|
+
require 'the_wizard_of_api'
|
13
|
+
use TheWizardOfApi
|
14
|
+
|
15
|
+
run Proc.new {|env| [200, {"Content-type" => "text/html"}, ["Run Rack!"]]}
|
16
|
+
"""
|
17
|
+
And I run `bundle`
|
18
|
+
When I successfully run `thin -d -P thin.pid -l thin.log -R config.ru start`
|
19
|
+
Then I should see the "Throne Room" at "http://localhost:3000/throne"
|
20
|
+
|
21
|
+
@disable-bundler @thin
|
22
|
+
Scenario: First installation using Bundler as a stand alone Rack Application
|
23
|
+
Given a file named "Gemfile" with:
|
24
|
+
"""
|
25
|
+
gem 'the_wizard_of_api', path: '../../'
|
26
|
+
"""
|
27
|
+
And a file named "config.ru" with:
|
28
|
+
"""
|
29
|
+
require 'bundler/setup'
|
30
|
+
require 'the_wizard_of_api'
|
31
|
+
run TheWizardOfApi.new
|
32
|
+
"""
|
33
|
+
And I run `bundle`
|
34
|
+
When I successfully run `thin -d -P thin.pid -l thin.log -R config.ru start`
|
35
|
+
Then I should see the "Throne Room" at "http://localhost:3000/throne"
|
36
|
+
|
37
|
+
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'restclient'
|
2
|
+
|
3
|
+
Given(/^TheWizardOfApi is running with defaults$/) do
|
4
|
+
unset_bundler_env_vars
|
5
|
+
|
6
|
+
write_file("Gemfile", <<-GEMFILE)
|
7
|
+
gem 'the_wizard_of_api', path: '../../'
|
8
|
+
GEMFILE
|
9
|
+
|
10
|
+
write_file("config.ru",<<-RACKUP)
|
11
|
+
require 'bundler/setup'
|
12
|
+
require 'the_wizard_of_api'
|
13
|
+
run TheWizardOfApi.new
|
14
|
+
RACKUP
|
15
|
+
|
16
|
+
run_simple("bundle")
|
17
|
+
|
18
|
+
run_process(start: thin("-R config.ru start"),
|
19
|
+
stop: thin("-R config.ru stop"))
|
20
|
+
|
21
|
+
until thin_pid_path.exist?
|
22
|
+
$stdout.write('.') if ENV['DEBUG']
|
23
|
+
end
|
24
|
+
|
25
|
+
visit throne_url
|
26
|
+
end
|
27
|
+
|
28
|
+
When(/^someone else makes a GET request to "(.*?)"$/) do |path|
|
29
|
+
last_response = avoid_timing_errors do
|
30
|
+
run_process(start: "curl -s localhost:3000#{path} & echo $! > curl.pid",
|
31
|
+
stop: "kill -9 `cat curl.pid`")
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
Then(/^I should see:$/) do |string|
|
36
|
+
expect(page).to have_text(string)
|
37
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
Feature: The Wizard sees all requests
|
2
|
+
In order to create the illusion of a service
|
3
|
+
As The Wizard
|
4
|
+
I want to see all the requests coming to me
|
5
|
+
|
6
|
+
Scenario: A GET request to the default mount point
|
7
|
+
Given TheWizardOfApi is running with defaults
|
8
|
+
When someone else makes a GET request to "/api"
|
9
|
+
Then I should see:
|
10
|
+
"""
|
11
|
+
GET / HTTP/1.1
|
12
|
+
Accept: */*; q=0.5, application/xml
|
13
|
+
Accept-Encoding: gzip, deflate
|
14
|
+
User-Agent: Ruby
|
15
|
+
Host: 0.0.0.0:9292
|
16
|
+
"""
|
17
|
+
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module DebuggingPryHelper
|
2
|
+
def pry(beynding)
|
3
|
+
if ENV['DEBUG'] && !ENV['TRAVIS']
|
4
|
+
begin
|
5
|
+
beynding.pry
|
6
|
+
rescue NoMethodError => e
|
7
|
+
require 'pry'
|
8
|
+
beynding.pry
|
9
|
+
end
|
10
|
+
else
|
11
|
+
puts caller.first
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
After = lambda do |scenario|
|
16
|
+
pry(binding) if ENV['DEBUG'] && scenario.failed?
|
17
|
+
end.freeze
|
18
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'aruba/cucumber'
|
2
|
+
require 'capybara/cucumber'
|
3
|
+
require 'capybara-webkit'
|
4
|
+
|
5
|
+
Capybara.default_driver = :webkit
|
6
|
+
|
7
|
+
$: << "./features/support/"
|
8
|
+
|
9
|
+
|
10
|
+
require 'thin_helper'
|
11
|
+
Before("@thin",&ThinHelper::Before)
|
12
|
+
After("@thin",&ThinHelper::After)
|
13
|
+
|
14
|
+
require 'debugging_pry_helper'
|
15
|
+
After(&DebuggingPryHelper::After)
|
16
|
+
|
17
|
+
require 'timing_error_helper'
|
18
|
+
|
19
|
+
require 'process_helper'
|
20
|
+
After(&ProcessHelper::After)
|
21
|
+
|
22
|
+
require 'the_wizard_of_api_helper'
|
23
|
+
|
24
|
+
World(DebuggingPryHelper,
|
25
|
+
ProcessHelper,
|
26
|
+
ThinHelper,
|
27
|
+
TimingErrorHelper,
|
28
|
+
TheWizardOfApiHelper)
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module ProcessHelper
|
2
|
+
def run_process(options = {})
|
3
|
+
in_current_dir do
|
4
|
+
system(options.fetch(:start))
|
5
|
+
end
|
6
|
+
queue_shutdown(options.fetch(:stop))
|
7
|
+
end
|
8
|
+
|
9
|
+
def queue_shutdown(command)
|
10
|
+
@services ||= Set.new
|
11
|
+
@services << command
|
12
|
+
end
|
13
|
+
|
14
|
+
def stop_services
|
15
|
+
@services.each do |stop_service|
|
16
|
+
in_current_dir do
|
17
|
+
system(stop_service + " &", [:out, :err]=>"/dev/null")
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
After = lambda do |scenario|
|
23
|
+
stop_services
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module ThinHelper
|
2
|
+
def thin_log_path
|
3
|
+
Pathname.new(current_dir) + "thin.log"
|
4
|
+
end
|
5
|
+
|
6
|
+
def thin_pid_path
|
7
|
+
Pathname.new(current_dir) + "thin.pid"
|
8
|
+
end
|
9
|
+
|
10
|
+
def thin_log
|
11
|
+
thin_log_path.read.split(/\n\t?/)
|
12
|
+
end
|
13
|
+
|
14
|
+
def thin_pid
|
15
|
+
thin_pid_path.read.to_i
|
16
|
+
end
|
17
|
+
|
18
|
+
def thin(command)
|
19
|
+
"thin -d -P #{thin_pid_path.basename} -l #{thin_log_path.basename} #{command}"
|
20
|
+
end
|
21
|
+
|
22
|
+
Before = lambda do |scenario|
|
23
|
+
queue_shutdown(thin("stop"))
|
24
|
+
end
|
25
|
+
|
26
|
+
After = lambda do |scenario|
|
27
|
+
if scenario.failed?
|
28
|
+
warn thin_log
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module TimingErrorHelper
|
2
|
+
def debug(string)
|
3
|
+
if ENV['DEBUG'] == true
|
4
|
+
if string.length == 1
|
5
|
+
$stdout.write(string)
|
6
|
+
else
|
7
|
+
$stdout.puts(string)
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
def avoid_timing_errors
|
13
|
+
begin
|
14
|
+
yield
|
15
|
+
rescue Timeout::Error => e
|
16
|
+
debug('.')
|
17
|
+
retry
|
18
|
+
rescue Errno::ECONNREFUSED => e
|
19
|
+
debug(',')
|
20
|
+
retry
|
21
|
+
rescue Capybara::Webkit::InvalidResponseError => e
|
22
|
+
if e.message.include?("Unable to load URL")
|
23
|
+
debug('!')
|
24
|
+
retry
|
25
|
+
end
|
26
|
+
rescue => e
|
27
|
+
pry(binding)
|
28
|
+
raise e
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,92 @@
|
|
1
|
+
require "the_wizard_of_api/version"
|
2
|
+
require 'faye'
|
3
|
+
|
4
|
+
class DeferrableBody
|
5
|
+
include EventMachine::Deferrable
|
6
|
+
|
7
|
+
def call(body)
|
8
|
+
body.each do |chunk|
|
9
|
+
@body_callback.call(chunk)
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
def each &blk
|
14
|
+
@body_callback = blk
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
module TheWizardOfApi
|
19
|
+
ASYNC = [-1, {}, []].freeze
|
20
|
+
|
21
|
+
def self.new(app = nil)
|
22
|
+
wizard = Rack::Builder.new do
|
23
|
+
|
24
|
+
self.class.class_eval do
|
25
|
+
def stream_line(body, shown_key, env, http_key)
|
26
|
+
value = env[http_key]
|
27
|
+
|
28
|
+
if value
|
29
|
+
line = ["#{shown_key}:",value].join(" ")
|
30
|
+
puts line
|
31
|
+
body.call [line+"\n"]
|
32
|
+
else
|
33
|
+
puts
|
34
|
+
puts env.inspect
|
35
|
+
puts
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
map "/throne" do
|
41
|
+
run Proc.new { |env|
|
42
|
+
|
43
|
+
body = DeferrableBody.new
|
44
|
+
|
45
|
+
client = env.fetch('faye.client')
|
46
|
+
|
47
|
+
EventMachine::next_tick {
|
48
|
+
env['async.callback'].call([200, {'Content-Type' => 'text/plain'}, body])
|
49
|
+
body.call [" " * 1024]
|
50
|
+
}
|
51
|
+
|
52
|
+
EventMachine::add_timer(0.5) {
|
53
|
+
body.call ["Throne Room\n"]
|
54
|
+
}
|
55
|
+
|
56
|
+
client.subscribe('/api') do |message|
|
57
|
+
first_line = message.values_at("REQUEST_METHOD","REQUEST_PATH","HTTP_VERSION").join(" ")+"\n"
|
58
|
+
|
59
|
+
puts first_line
|
60
|
+
body.call [first_line]
|
61
|
+
|
62
|
+
stream_line(body, "Accept", message, "HTTP_ACCEPT")
|
63
|
+
stream_line(body, "Accept-Encoding", message, "HTTP_ACCEPT_ENCODING")
|
64
|
+
stream_line(body, "User-Agent", message, "HTTP_USER_AGENT")
|
65
|
+
stream_line(body, "Host", message, "HTTP_HOST")
|
66
|
+
end
|
67
|
+
ASYNC
|
68
|
+
}
|
69
|
+
end
|
70
|
+
|
71
|
+
map "/api" do
|
72
|
+
run Proc.new { |env|
|
73
|
+
client = env.fetch('faye.client')
|
74
|
+
|
75
|
+
client.publish('/api', env)
|
76
|
+
|
77
|
+
callback = env['async.callback']
|
78
|
+
|
79
|
+
client.subscribe('/wizard_response') do |message|
|
80
|
+
callback.call(message)
|
81
|
+
end
|
82
|
+
|
83
|
+
ASYNC
|
84
|
+
}
|
85
|
+
end
|
86
|
+
|
87
|
+
run app if app
|
88
|
+
end.to_app
|
89
|
+
|
90
|
+
Faye::RackAdapter.new wizard, mount: "/faye"
|
91
|
+
end
|
92
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
require 'rack'
|
2
|
+
require 'rack/test'
|
3
|
+
|
4
|
+
require 'the_wizard_of_api'
|
5
|
+
|
6
|
+
require 'pry'
|
7
|
+
|
8
|
+
describe TheWizardOfApi do
|
9
|
+
include Rack::Test::Methods
|
10
|
+
|
11
|
+
def app
|
12
|
+
TheWizardOfApi.new
|
13
|
+
end
|
14
|
+
|
15
|
+
context "Throne Room" do
|
16
|
+
subject { get "/throne" }
|
17
|
+
|
18
|
+
it "should stream the response" do
|
19
|
+
expect(subject.status).to eql(-1)
|
20
|
+
end
|
21
|
+
|
22
|
+
pending "this isn't the actual feature-value i'm looking for" do
|
23
|
+
it "should stream Throne Room first" do
|
24
|
+
expect(subject.body).to include("Throne Room")
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
context "api mount point" do
|
30
|
+
# default
|
31
|
+
let(:api_mount_point) { "/api" }
|
32
|
+
|
33
|
+
context "GET" do
|
34
|
+
subject { get api_mount_point }
|
35
|
+
|
36
|
+
it "should stream the response" do
|
37
|
+
expect(subject.status).to eql(-1)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'the_wizard_of_api/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "the_wizard_of_api"
|
8
|
+
spec.version = TheWizardOfApi::VERSION
|
9
|
+
spec.authors = ["Caleb Buxton"]
|
10
|
+
spec.email = ["me@cpb.ca"]
|
11
|
+
spec.description = %q{A API Service for Wizard of Oz style testing.}
|
12
|
+
spec.summary = %q{Enables a human-wizard to craft each response for a yet unimplemented API.}
|
13
|
+
spec.homepage = ""
|
14
|
+
spec.license = "MIT"
|
15
|
+
|
16
|
+
spec.files = `git ls-files`.split($/)
|
17
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
18
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
|
+
spec.require_paths = ["lib"]
|
20
|
+
|
21
|
+
spec.add_dependency "faye"
|
22
|
+
spec.add_dependency "rack"
|
23
|
+
spec.add_dependency "thin"
|
24
|
+
spec.add_development_dependency "bcat"
|
25
|
+
spec.add_development_dependency "capybara"
|
26
|
+
spec.add_development_dependency "capybara-webkit"
|
27
|
+
spec.add_development_dependency "bundler", "~> 1.3"
|
28
|
+
spec.add_development_dependency "pry"
|
29
|
+
spec.add_development_dependency "rack-test"
|
30
|
+
spec.add_development_dependency "rake"
|
31
|
+
spec.add_development_dependency "rdiscount"
|
32
|
+
spec.add_development_dependency "rest-client"
|
33
|
+
spec.add_development_dependency "rspec"
|
34
|
+
spec.add_development_dependency "travis-lint"
|
35
|
+
end
|
metadata
ADDED
@@ -0,0 +1,272 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: the_wizard_of_api
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Caleb Buxton
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2013-08-31 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: faye
|
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: rack
|
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: thin
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - '>='
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: bcat
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - '>='
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: capybara
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - '>='
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - '>='
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: capybara-webkit
|
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: bundler
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - ~>
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '1.3'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - ~>
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '1.3'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: pry
|
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-test
|
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: rake
|
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
|
+
- !ruby/object:Gem::Dependency
|
154
|
+
name: rdiscount
|
155
|
+
requirement: !ruby/object:Gem::Requirement
|
156
|
+
requirements:
|
157
|
+
- - '>='
|
158
|
+
- !ruby/object:Gem::Version
|
159
|
+
version: '0'
|
160
|
+
type: :development
|
161
|
+
prerelease: false
|
162
|
+
version_requirements: !ruby/object:Gem::Requirement
|
163
|
+
requirements:
|
164
|
+
- - '>='
|
165
|
+
- !ruby/object:Gem::Version
|
166
|
+
version: '0'
|
167
|
+
- !ruby/object:Gem::Dependency
|
168
|
+
name: rest-client
|
169
|
+
requirement: !ruby/object:Gem::Requirement
|
170
|
+
requirements:
|
171
|
+
- - '>='
|
172
|
+
- !ruby/object:Gem::Version
|
173
|
+
version: '0'
|
174
|
+
type: :development
|
175
|
+
prerelease: false
|
176
|
+
version_requirements: !ruby/object:Gem::Requirement
|
177
|
+
requirements:
|
178
|
+
- - '>='
|
179
|
+
- !ruby/object:Gem::Version
|
180
|
+
version: '0'
|
181
|
+
- !ruby/object:Gem::Dependency
|
182
|
+
name: rspec
|
183
|
+
requirement: !ruby/object:Gem::Requirement
|
184
|
+
requirements:
|
185
|
+
- - '>='
|
186
|
+
- !ruby/object:Gem::Version
|
187
|
+
version: '0'
|
188
|
+
type: :development
|
189
|
+
prerelease: false
|
190
|
+
version_requirements: !ruby/object:Gem::Requirement
|
191
|
+
requirements:
|
192
|
+
- - '>='
|
193
|
+
- !ruby/object:Gem::Version
|
194
|
+
version: '0'
|
195
|
+
- !ruby/object:Gem::Dependency
|
196
|
+
name: travis-lint
|
197
|
+
requirement: !ruby/object:Gem::Requirement
|
198
|
+
requirements:
|
199
|
+
- - '>='
|
200
|
+
- !ruby/object:Gem::Version
|
201
|
+
version: '0'
|
202
|
+
type: :development
|
203
|
+
prerelease: false
|
204
|
+
version_requirements: !ruby/object:Gem::Requirement
|
205
|
+
requirements:
|
206
|
+
- - '>='
|
207
|
+
- !ruby/object:Gem::Version
|
208
|
+
version: '0'
|
209
|
+
description: A API Service for Wizard of Oz style testing.
|
210
|
+
email:
|
211
|
+
- me@cpb.ca
|
212
|
+
executables: []
|
213
|
+
extensions: []
|
214
|
+
extra_rdoc_files: []
|
215
|
+
files:
|
216
|
+
- .gitignore
|
217
|
+
- .ruby-version
|
218
|
+
- .travis.yml
|
219
|
+
- Gemfile
|
220
|
+
- LICENSE.txt
|
221
|
+
- README.md
|
222
|
+
- Rakefile
|
223
|
+
- features/readme.feature
|
224
|
+
- features/step_definitions/readme_steps.rb
|
225
|
+
- features/step_definitions/streaming_requests_to_the_throne_room_steps.rb
|
226
|
+
- features/streaming_requests_to_the_throne_room.feature
|
227
|
+
- features/support/debugging_pry_helper.rb
|
228
|
+
- features/support/env.rb
|
229
|
+
- features/support/process_helper.rb
|
230
|
+
- features/support/the_wizard_of_api_helper.rb
|
231
|
+
- features/support/thin_helper.rb
|
232
|
+
- features/support/timing_error_helper.rb
|
233
|
+
- lib/the_wizard_of_api.rb
|
234
|
+
- lib/the_wizard_of_api/version.rb
|
235
|
+
- spec/lib/the_wizard_of_api_spec.rb
|
236
|
+
- the_wizard_of_api.gemspec
|
237
|
+
homepage: ''
|
238
|
+
licenses:
|
239
|
+
- MIT
|
240
|
+
metadata: {}
|
241
|
+
post_install_message:
|
242
|
+
rdoc_options: []
|
243
|
+
require_paths:
|
244
|
+
- lib
|
245
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
246
|
+
requirements:
|
247
|
+
- - '>='
|
248
|
+
- !ruby/object:Gem::Version
|
249
|
+
version: '0'
|
250
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
251
|
+
requirements:
|
252
|
+
- - '>='
|
253
|
+
- !ruby/object:Gem::Version
|
254
|
+
version: '0'
|
255
|
+
requirements: []
|
256
|
+
rubyforge_project:
|
257
|
+
rubygems_version: 2.0.3
|
258
|
+
signing_key:
|
259
|
+
specification_version: 4
|
260
|
+
summary: Enables a human-wizard to craft each response for a yet unimplemented API.
|
261
|
+
test_files:
|
262
|
+
- features/readme.feature
|
263
|
+
- features/step_definitions/readme_steps.rb
|
264
|
+
- features/step_definitions/streaming_requests_to_the_throne_room_steps.rb
|
265
|
+
- features/streaming_requests_to_the_throne_room.feature
|
266
|
+
- features/support/debugging_pry_helper.rb
|
267
|
+
- features/support/env.rb
|
268
|
+
- features/support/process_helper.rb
|
269
|
+
- features/support/the_wizard_of_api_helper.rb
|
270
|
+
- features/support/thin_helper.rb
|
271
|
+
- features/support/timing_error_helper.rb
|
272
|
+
- spec/lib/the_wizard_of_api_spec.rb
|