test_server 0.0.11 → 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/README.md CHANGED
@@ -1,9 +1,31 @@
1
- # TestServer
1
+ # TestServer - the endpoint for your proxy server tests
2
2
 
3
- TODO: Write a gem description
3
+ [![Build Status](https://travis-ci.org/dg-vrnetze/test_server.png?branch=master)](https://travis-ci.org/dg-vrnetze/test_server)
4
+ [![Code Climate](https://codeclimate.com/github/dg-vrnetze/test_server.png)](https://codeclimate.com/github/dg-vrnetze/test_server)
5
+ [![Coverage Status](https://coveralls.io/repos/dg-vrnetze/test_server/badge.png?branch=master)](https://coveralls.io/r/dg-vrnetze/test_server?branch=master)
6
+ [![Gem Version](https://badge.fury.io/rb/test_server.png)](http://badge.fury.io/rb/test_server)
7
+
8
+
9
+ `test_server` *serves two main purposes:*
10
+
11
+ * end point for your proxy tests.
12
+ * load generator via simple website driven by javascript
13
+
14
+ *Behind the scenes it mainly uses ...*
15
+
16
+ * [jquery](http://jquery.com/)
17
+ * [sinatra](http://www.sinatrarb.com)
18
+ * and other wonderfull gems
19
+
20
+ *Possible use cases:*
21
+
22
+ * Provide static data via web application to make your tests reliable
23
+ * Generate load via browsers typically used by your users
4
24
 
5
25
  ## Installation
6
26
 
27
+ ### Rubygems
28
+
7
29
  Add this line to your application's Gemfile:
8
30
 
9
31
  gem 'test_server'
@@ -16,9 +38,81 @@ Or install it yourself as:
16
38
 
17
39
  $ gem install test_server
18
40
 
41
+ ### Archlinux
42
+
43
+ ```bash
44
+ # Install via yaourt
45
+ yaourt -S test_server
46
+
47
+ # Install via cower + makepkg
48
+ cower -d test_server
49
+ cd <dir>
50
+ makepkg -is
51
+ ```
52
+
53
+ ### Firewall rules
54
+
55
+ Following you can find an example configuration for iptables to secure your server. It
56
+ opens ports only for your proxy servers to access `test_server`.
57
+
58
+ ```bash
59
+ # default policies
60
+ iptables -P INPUT -j DROP
61
+ iptables -P FORWARD -j DROP
62
+ iptables -P OUTPUT -j ACCEPT
63
+
64
+ # user defined chains
65
+ iptables -N TCP
66
+ iptables -N UDP
67
+
68
+ # rules
69
+ iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
70
+ iptables -A INPUT -i lo -j ACCEPT
71
+ iptables -A INPUT -m conntrack --ctstate INVALID -j DROP
72
+ iptables -A INPUT -p icmp -m icmp --icmp-type 8 -m conntrack --ctstate NEW -j ACCEPT
73
+ iptables -A INPUT -p udp -m conntrack --ctstate NEW -j UDP
74
+ iptables -A INPUT -p tcp -m conntrack --ctstate NEW -j TCP
75
+ iptables -A INPUT -p tcp -m recent --set --name TCP-PORTSCAN --mask 255.255.255.255 --rsource -j REJECT --reject-with tcp-reset
76
+ iptables -A INPUT -p udp -m recent --set --name UDP-PORTSCAN --mask 255.255.255.255 --rsource -j REJECT --reject-with icmp-port-unreachable
77
+ iptables -A INPUT -j REJECT --reject-with icmp-proto-unreachable
78
+ iptables -A TCP -p tcp -m recent --update --seconds 60 --name TCP-PORTSCAN --mask 255.255.255.255 --rsource -j REJECT --reject-with tcp-reset
79
+ iptables -A TCP -s <public ips proxies> -p tcp -m tcp --dport 8000 -j ACCEPT
80
+ iptables -A UDP -p udp -m recent --update --seconds 60 --name UDP-PORTSCAN --mask 255.255.255.255 --rsource -j REJECT --reject-with icmp-port-unreachable
81
+ COMMIT
82
+ ```
83
+
84
+ ## Screenshots
85
+
86
+ To be defined...
87
+
19
88
  ## Usage
20
89
 
21
- TODO: Write usage instructions here
90
+ *Starting Web Application*
91
+
92
+ ```
93
+ % test_server serve
94
+ ```
95
+
96
+ *Load testing*
97
+
98
+ Point your browser to `http://<your-domain.org>/v1/test/javascript/xhr/string`.
99
+ Fill out the form and run test.
100
+
101
+ *Testing your proxies*
102
+
103
+ * Write tests using `capybara` + `rspec`.
104
+
105
+ or
106
+
107
+ * Use [`proxy_tester`](https://github.com/dg-vrnetze/proxy_tester) for a fully
108
+ featured solution for writing proxy tests (**RECOMMENDED**). `proxy_tester` uses
109
+ `capybara` and `rspec`, but provides lots of helpers for writing proxy tests
110
+ to reduce the work on your site.
111
+
112
+ ## List of test end points
113
+
114
+ To be defined. Hopefully I can provide a `controller` which handles this within
115
+ the application.
22
116
 
23
117
  ## Contributing
24
118
 
data/Rakefile CHANGED
@@ -68,7 +68,7 @@ end
68
68
  namespace :package do
69
69
  desc 'build arch linux package'
70
70
  task :archlinux => [gem_file, archlinux_build_directory] do
71
- FileUtils.mv ::File.join(pkg_directory, "#{software}-#{version}.gem"), archlinux_build_directory
71
+ #FileUtils.mv ::File.join(pkg_directory, "#{software}-#{version}.gem"), archlinux_build_directory
72
72
 
73
73
  generator = Filegen::Rubygen.new
74
74
  template = File.read(File.expand_path('../share/archlinux/PKGBUILD.sh.erb', __FILE__))
Binary file
@@ -1,14 +1,6 @@
1
1
  //= require jquery
2
2
  //= require bootstrap-sass/dist/js/bootstrap
3
3
 
4
- //$(document).ready(function(){
5
- // $(".lp_show_fields").click(function(e){
6
- // e.preventDefault()
7
- // $(".lp_fields_close, .lp_fields_open").toggle();
8
- // $(".lp_button_show_fields_close, .lp_button_show_fields_open").toggle();
9
- // });
10
- //});
11
-
12
4
  function escapeHTML(s) {
13
5
  return String(s).replace(/&(?!\w+;)/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;');
14
6
  }
@@ -24,13 +16,15 @@ function result(url, timeout, start_time, result) {
24
16
  }
25
17
 
26
18
  $('#result').toggle(true);
27
- $('#result tr:last').after('<tr class="ts-result-row ' + result_klass + '"><td>' + url + '</td><td>' + timeout + '</td><td>' + run_time + '</td><td>' + result + '</td></tr>');
19
+ $('#result_table_header').after('<tr class="ts-result-row ' + result_klass + '"><td>' + url + '</td><td>' + timeout + '</td><td>' + run_time + '</td><td>' + result + '</td></tr>');
20
+
28
21
  }
29
22
 
30
23
  $(document).ready(function(){
31
24
  $("#reset").click(function () {
32
25
  $('#form')[0].reset();
33
26
  $('.ts-result-row').remove();
27
+ $('#result').toggle(false);
34
28
  });
35
29
  });
36
30
 
@@ -38,28 +32,53 @@ $(document).ready(function(){
38
32
  $("#submit").click(function (e) {
39
33
  e.preventDefault();
40
34
 
41
- var url = escapeHTML($('#url').val())
42
- var timeout = escapeHTML($('#timeout').val() * 1000)
43
- var count = escapeHTML($('#count').val())
35
+ var url = escapeHTML($('#url').val());
36
+ var timeout = escapeHTML($('#timeout').val() * 1000);
37
+ var count = escapeHTML($('#count').val());
44
38
 
45
- for (var i = 0, limit = count ; i < limit; i++) {
39
+ repeat_requests(url, count, timeout);
40
+ });
41
+ });
46
42
 
47
- var start_time = new Date().getTime();
43
+ function repeat_requests(url, count, timeout) {
44
+ var repeat = $('#repeat').is(":checked");
45
+ var requests = [];
48
46
 
49
- $.ajax({
50
- url: url,
51
- timeout: timeout,
52
- cache: false,
53
- success: function() {
54
- result(url, timeout, start_time, 'ok');
55
- },
56
- error: function(){
57
- result(url, timeout, start_time, 'fail');
58
- }
59
- });
47
+ var success_callback = function() {
48
+ $('#request-spinner').toggle(false);
49
+
50
+ if (repeat == true) {
51
+ setTimeout(repeat_requests(url, count, timeout), 1000);
60
52
  }
53
+ };
61
54
 
62
- });
63
- });
55
+ var failure_callback = function() {
56
+ $('#request-spinner').toggle(false);
57
+ };
58
+
59
+ $('#request-spinner').toggle(true);
64
60
 
65
- $('#notification').modal('hide');
61
+ for(i = 0; i < count; i++) {
62
+ requests.push(sendAjax(url, timeout));
63
+ }
64
+
65
+ $.when.apply(undefined, requests).then(function(results){success_callback()}, function(results){failure_callback()});
66
+ }
67
+
68
+ function sendAjax(url, timeout) {
69
+ var start_time = new Date().getTime();
70
+
71
+ return $.ajax(
72
+ {
73
+ url: url,
74
+ timeout: timeout,
75
+ cache: false,
76
+ success: function() {
77
+ result(url, timeout, start_time, 'ok');
78
+ },
79
+ error: function(){
80
+ result(url, timeout, start_time, 'fail');
81
+ }
82
+ }
83
+ );
84
+ }
@@ -110,6 +110,10 @@ a:focus {
110
110
  display: inline-block;
111
111
  }
112
112
 
113
+ .ts-field-repeat {
114
+ @extend .checkbox;
115
+ }
116
+
113
117
  .ts-field-count {
114
118
  @extend .form-control;
115
119
  display: inline-block;
@@ -148,3 +152,12 @@ a:focus {
148
152
  .ts-result-failed-request {
149
153
  color: red;
150
154
  }
155
+
156
+ #request-spinner {
157
+ margin: 20px;
158
+ display: none;
159
+ }
160
+
161
+ .ts-inline {
162
+ display: inline;
163
+ }
@@ -2,6 +2,12 @@
2
2
  module TestServer
3
3
  module App
4
4
  class JavascriptController < ApplicationController
5
+ use Rack::Cors do
6
+ allow do
7
+ origins '*'
8
+ resource '*', :headers => :any, :methods => [:get, :post]
9
+ end
10
+ end
5
11
 
6
12
  before do
7
13
  param :no_cache, Boolean, default: false
@@ -11,18 +17,17 @@ module TestServer
11
17
 
12
18
  configure_caching(params)
13
19
  end
14
- get '/xhr/string' do
20
+
21
+ get '/xhr/url/?' do
15
22
  param :count, Integer, default: 10
16
23
  param :timeout, Integer, default: 10
17
24
  param :url, String
25
+ param :repeat, Boolean, default: false
18
26
 
19
27
  @count = params[:count]
20
28
  @url = params[:url]
21
29
  @timeout = params[:timeout]
22
-
23
- #@data = encode do
24
- # generate_string(params[:count])
25
- #end
30
+ @repeat = params[:repeat]
26
31
 
27
32
  haml :'xhr/show', layout: :application
28
33
  end
@@ -10,29 +10,22 @@
10
10
  .ts-form-group
11
11
  %label{ for: :url}
12
12
  = t('views.javascript.xhr.fields.url')
13
- %input#url.ts-field-url{ type: :url, name: :url, value: @url }
14
- %button#submit.ts-button-submit{type: 'submit', value: t('views.application.buttons.submit'), 'data-toggle' => 'modal', 'data-target' => '#notification'}
13
+ %input#url.ts-field-url{ type: :url, name: :url, value: @url, placeholder: 'http://www.example.org' }
14
+ .ts-field-repeat
15
+ %label
16
+ %input#repeat{ type: :checkbox, value: @repeat }
17
+ = t('views.javascript.xhr.fields.repeat')
18
+ %button#submit.ts-button-submit{type: 'submit', name: 'submit', value: t('views.application.buttons.submit'), 'data-toggle' => 'modal', 'data-target' => '#notification'}
15
19
  = t('views.application.buttons.submit')
16
- %a#reset.ts-button-reset{href: '#'}
20
+ %a#reset.ts-button-reset{href: '#', name: 'reset'}
17
21
  = t('views.application.buttons.reset')
22
+ %span.ts-inline#request-spinner
23
+ %img{ src: '/assets/ajax-loader.gif', alt: t('views.javascript.xhr.spinner.text') }
24
+ = t('views.javascript.xhr.spinner.text')
18
25
 
19
26
  %table#result.ts-result-table
20
- %th= t('views.javascript.xhr.result_table.url')
21
- %th= t('views.javascript.xhr.result_table.timeout')
22
- %th= t('views.javascript.xhr.result_table.runtime')
23
- %th= t('views.javascript.xhr.result_table.status')
24
-
25
- .modal#notification{ role: 'dialog' , tabindex: '-1'}
26
- .modal-dialog
27
- .modal-content
28
- .modal-header
29
- %button.ts-button-close-headline{ type: 'button', 'data-dismiss' => 'modal', 'aria-hidden' => 'true'}
30
- &times;
31
- %h4
32
- = t('views.dialogs.notification.title')
33
- .modal-body
34
- %p.ts-text-centered
35
- = t('views.javascript.xhr.notification.text')
36
- .modal-footer
37
- %button.ts-button-close{ type: 'button', 'data-dismiss' => 'modal' }
38
- = t('views.application.buttons.close')
27
+ %tr#result_table_header
28
+ %th= t('views.javascript.xhr.result_table.url')
29
+ %th= t('views.javascript.xhr.result_table.timeout')
30
+ %th= t('views.javascript.xhr.result_table.runtime')
31
+ %th= t('views.javascript.xhr.result_table.status')
@@ -62,11 +62,12 @@ en:
62
62
  url: URL
63
63
  count: Count
64
64
  timeout: Timeout (s)
65
+ repeat: Repeat Requests
65
66
  result_table:
66
67
  url: URL
67
68
  runtime: Runtime (ms)
68
69
  timeout: Timeout (ms)
69
70
  status: Status
70
- notification:
71
- text: You asked me to send out requests.
71
+ spinner:
72
+ text: Requests were sent. Waiting for results.
72
73
 
@@ -1,4 +1,4 @@
1
1
  #main TestServer
2
2
  module TestServer
3
- VERSION = '0.0.11'
3
+ VERSION = '0.1.0'
4
4
  end
@@ -1,6 +1,14 @@
1
1
  # encoding: utf-8
2
2
  module TestServer
3
3
  module WebHelper
4
+ def base_url
5
+ mutex = Mutex.new
6
+
7
+ mutex.synchronize do
8
+ @base_url ||= "#{request.env['rack.url_scheme']}://#{request.env['HTTP_HOST']}"
9
+ end
10
+ end
11
+
4
12
  def h(text)
5
13
  Rack::Utils.escape_html(text)
6
14
  end
data/lib/test_server.rb CHANGED
@@ -14,6 +14,7 @@ require 'sinatra/streaming'
14
14
  require 'json'
15
15
  require 'uglifier'
16
16
  require 'rack/protection'
17
+ require 'rack/cors'
17
18
  require 'thor'
18
19
  require 'base64'
19
20
  require 'zlib'
@@ -0,0 +1,4 @@
1
+ #!/bin/sh
2
+
3
+ bundle exec cucumber
4
+ bundle exec rspec spec/features
data/script/bootstrap ADDED
@@ -0,0 +1,63 @@
1
+ #!/bin/sh
2
+
3
+ function puts() {
4
+ echo -e $1 >&2
5
+ }
6
+
7
+ function install_package() {
8
+ if which pacman > /dev/null; then
9
+ if [ -z "$(pacman -Ss "^$1\$" | grep installed)" ]; then
10
+ puts "Installing $1"
11
+ sudo pacman -S --noconfirm $1
12
+ fi
13
+ else
14
+ puts "Please install $1 from your operating system repository."
15
+ fi
16
+ }
17
+
18
+ function install_gem() {
19
+ if which gem > /dev/null; then
20
+ if [ -z "$(gem list -l "^$1\$")" ]; then
21
+ puts "Installing $1"
22
+ gem install --no-ri --no-rdoc $1
23
+ fi
24
+ else
25
+ puts "Please install $1 via rubygems."
26
+ fi
27
+ }
28
+
29
+ function install_node() {
30
+ if which npm > /dev/null; then
31
+ if [ -z "$(npm list -g $1 | grep bower)" ]; then
32
+ puts "Installing $1"
33
+ npm install -g $1
34
+ fi
35
+ else
36
+ puts "Please install $1 via npm"
37
+ fi
38
+ }
39
+
40
+ function file_exist() {
41
+ if [ -f $1 ]; then
42
+ puts "$2"
43
+ return 0
44
+ else
45
+ puts "Warning file \"$1\" does not exist. Maybe this can cause problems during bootstrapping"
46
+ return 1
47
+ fi
48
+ }
49
+
50
+ echo "Bootstrapping development environment for application.." >&2
51
+
52
+ install_package ruby
53
+ install_package nodejs
54
+ install_package phantomjs
55
+
56
+ install_gem bundler
57
+ bundle install
58
+
59
+ file_exist "$HOME/.npmrc" "I found a .npmrc. Please make sure your npm configuration works with global install for users. If not please add something like \"prefix = /home/user/.local/share/npm\" to your .bashrc/.zshrc + export PATH=/home/user/.local/share/npm/bin:\$PATH"
60
+
61
+ install_node bower
62
+
63
+ bower install
data/script/ci ADDED
@@ -0,0 +1,7 @@
1
+ #!/bin/sh
2
+
3
+ bundle exec script/test_web &
4
+
5
+ bundle exec rake test:coveralls
6
+
7
+ pkill -P $$
data/script/console ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ $LOAD_PATH << ::File.expand_path('../../lib', __FILE__)
4
+
5
+ # Pull in all of the gems including those in the `test` group
6
+ require 'bundler'
7
+ Bundler.require :default, :test, :development
8
+
9
+ require 'irb'
10
+ require 'irb/completion'
11
+ require 'test_server'
12
+
13
+ ARGV.clear
14
+ IRB.start
data/script/release ADDED
@@ -0,0 +1,3 @@
1
+ #!/bin/sh
2
+
3
+ bundle exec rake gem:release
data/script/test_web ADDED
@@ -0,0 +1,23 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'sinatra/base'
4
+
5
+ class Webserver < Sinatra::Base
6
+ set :logging, :true
7
+
8
+ post '/rspec/:test' do
9
+ case params[:test]
10
+ when 'send'
11
+ return params[:data]
12
+ else
13
+ not_found
14
+ end
15
+ end
16
+
17
+ get '/rspec/:test' do
18
+ params[:test]
19
+ end
20
+ end
21
+
22
+ Webserver.set :bind,'127.0.0.1'
23
+ Webserver.run!
data/script/unit_test ADDED
@@ -0,0 +1,7 @@
1
+ #!/bin/sh
2
+
3
+ bundle exec script/test_web &
4
+
5
+ bundle exec rspec
6
+
7
+ pkill -P $$
@@ -9,9 +9,9 @@ license=('MIT')
9
9
  depends=('ruby' 'libatomic_ops')
10
10
  install=${pkgname}.install
11
11
  makedepends=(rubygems filegen phantomjs)
12
- #source=(http://gems.rubyforge.org/gems/$pkgname-$pkgver.gem)
12
+ source=(http://gems.rubyforge.org/gems/$pkgname-$pkgver.gem)
13
13
  backup=etc/${pkgname}/config.yaml
14
- source=($pkgname-$pkgver.gem)
14
+ #source=($pkgname-$pkgver.gem)
15
15
  noextract=($pkgname-$pkgver.gem)
16
16
  <%= lookup('sha') %>
17
17
 
@@ -2,17 +2,56 @@
2
2
  require 'spec_helper'
3
3
 
4
4
  describe 'Fetch data via javascript', :js do
5
- context '/xhr/string/' do
6
- it 'submits requests to url' do
5
+ before :each do
6
+ config = Class.new do
7
+ include FeduxOrg::Stdlib::Filesystem
8
+
9
+ def root_directory
10
+ ::File.expand_path('../../../', __FILE__)
11
+ end
12
+
13
+ def log_level
14
+ :unknown
15
+ end
16
+
17
+ def access_log
18
+ File.join(working_directory, 'access.log')
19
+ end
20
+
21
+ def reload_config_signal
22
+ 'USR1'
23
+ end
24
+ end.new
25
+
26
+ TestServer.config = config
7
27
 
8
- visit '/xhr/string/'
28
+ Capybara.app = Rack::Builder.new do
29
+ map '/' do
30
+ run TestServer::App::JavascriptController
31
+ end
32
+
33
+ map '/assets' do
34
+ run TestServer::App::AssetsController.assets
35
+ end
36
+ end
37
+ end
38
+
39
+ context '/xhr/url/' do
40
+ it 'submits requests to url' do
41
+ url = '/v1/test/javascript/xhr/url'
42
+ visit '/xhr/url/'
9
43
 
10
44
  within '#form' do
11
- fill_in 'url', :with => '§ASDF$$'
45
+ fill_in 'url', :with => url
46
+ fill_in 'count', :with => 1
12
47
  end
13
48
 
14
- click_button '#submit'
15
- click_on('Search')
49
+
50
+ click_button('submit')
51
+
52
+ first '.ts-result-row'
53
+
54
+ expect(page).to have_content(url)
16
55
  end
17
56
 
18
57
  end
@@ -8,9 +8,9 @@ end
8
8
 
9
9
  RSpec.configure do |c|
10
10
  c.include TestServer::SpecHelper::Capybara
11
- c.beforc(:all) do
12
- Capybara.default_engine = :rack_test
13
- Capybara.javascript_engine = :poltergeist
11
+ c.before(:all) do
12
+ Capybara.default_driver = :rack_test
13
+ Capybara.javascript_driver = :poltergeist
14
14
  end
15
15
  end
16
16
 
data/test_server.gemspec CHANGED
@@ -36,5 +36,7 @@ Gem::Specification.new do |spec|
36
36
  spec.add_runtime_dependency 'pager'
37
37
  spec.add_runtime_dependency 'sinatra-param'
38
38
  spec.add_runtime_dependency 'sinatra-contrib'
39
+ spec.add_runtime_dependency 'sinatra-advanced-routes'
40
+ spec.add_runtime_dependency 'rack-cors'
39
41
  spec.add_runtime_dependency 'thor'
40
42
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: test_server
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.11
4
+ version: 0.1.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2014-04-03 00:00:00.000000000 Z
12
+ date: 2014-04-04 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bundler
@@ -299,6 +299,38 @@ dependencies:
299
299
  - - ! '>='
300
300
  - !ruby/object:Gem::Version
301
301
  version: '0'
302
+ - !ruby/object:Gem::Dependency
303
+ name: sinatra-advanced-routes
304
+ requirement: !ruby/object:Gem::Requirement
305
+ none: false
306
+ requirements:
307
+ - - ! '>='
308
+ - !ruby/object:Gem::Version
309
+ version: '0'
310
+ type: :runtime
311
+ prerelease: false
312
+ version_requirements: !ruby/object:Gem::Requirement
313
+ none: false
314
+ requirements:
315
+ - - ! '>='
316
+ - !ruby/object:Gem::Version
317
+ version: '0'
318
+ - !ruby/object:Gem::Dependency
319
+ name: rack-cors
320
+ requirement: !ruby/object:Gem::Requirement
321
+ none: false
322
+ requirements:
323
+ - - ! '>='
324
+ - !ruby/object:Gem::Version
325
+ version: '0'
326
+ type: :runtime
327
+ prerelease: false
328
+ version_requirements: !ruby/object:Gem::Requirement
329
+ none: false
330
+ requirements:
331
+ - - ! '>='
332
+ - !ruby/object:Gem::Version
333
+ version: '0'
302
334
  - !ruby/object:Gem::Dependency
303
335
  name: thor
304
336
  requirement: !ruby/object:Gem::Requirement
@@ -334,6 +366,7 @@ files:
334
366
  - LICENSE.md
335
367
  - README.md
336
368
  - Rakefile
369
+ - app/assets/images/ajax-loader.gif
337
370
  - app/assets/javascripts/application.js
338
371
  - app/assets/stylesheets/application.scss
339
372
  - app/controllers/application_controller.rb
@@ -383,6 +416,13 @@ files:
383
416
  - lib/test_server/ui_logger.rb
384
417
  - lib/test_server/version.rb
385
418
  - lib/test_server/web_helper.rb
419
+ - script/acceptance_test
420
+ - script/bootstrap
421
+ - script/ci
422
+ - script/console
423
+ - script/release
424
+ - script/test_web
425
+ - script/unit_test
386
426
  - share/archlinux/Makefile
387
427
  - share/archlinux/PKGBUILD.sh.erb
388
428
  - share/archlinux/config.yaml.erb