rspectacles 0.2.2 → 0.3.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.
- checksums.yaml +4 -4
- data/.jshintrc +3 -0
- data/Gemfile.lock +48 -17
- data/README.md +20 -31
- data/Rakefile +7 -0
- data/db/migrate/20170907205819_create_examples_table.rb +10 -0
- data/db/schema.rb +24 -0
- data/lib/rspectacles/adapter/{batched_redis_logger.rb → batched_logger.rb} +9 -6
- data/lib/rspectacles/adapter/{redis_logger.rb → logger.rb} +17 -22
- data/lib/rspectacles/app/models/example.rb +7 -0
- data/lib/rspectacles/app/public/js/exampleStream.js +4 -42
- data/lib/rspectacles/app/public/js/script.js +2 -12
- data/lib/rspectacles/app/views/index.erb +1 -1
- data/lib/rspectacles/app.rb +13 -20
- data/lib/rspectacles/config/database.yml +29 -0
- data/lib/rspectacles/config.rb +9 -8
- data/lib/rspectacles/formatter/{redis.rb → base.rb} +6 -7
- data/lib/rspectacles/formatter/{batched_redis.rb → batched.rb} +4 -4
- data/lib/rspectacles/formatter/legacy/{redis.rb → base.rb} +10 -12
- data/lib/rspectacles/version.rb +1 -1
- data/rspectacles.gemspec +4 -2
- metadata +52 -19
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bed36b5ed54e49e097fc5acd5c1f76a9c38f871b
|
4
|
+
data.tar.gz: fe4eb46b844447fefc22fcbf47262003f4603123
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d42a3ef4e41aed539941636df7ad9424a569c872c2ee70bd151746ad4b2e16027662688fea01aac6e3ecd2f4154792bbe347b178df38ae13ca5931a6f15b4ef2
|
7
|
+
data.tar.gz: 4694609c39573db2cd5d222f9ba6cf135e9c016962dd9bd15934e77e30eb33e9e6966daa8632e3b8f00f534f3c971856d4781b644d58c305bcda2872d6995842
|
data/.jshintrc
ADDED
data/Gemfile.lock
CHANGED
@@ -1,28 +1,50 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
rspectacles (0.
|
5
|
-
|
4
|
+
rspectacles (0.3.0)
|
5
|
+
httparty
|
6
|
+
pg
|
6
7
|
rake
|
7
|
-
redis
|
8
8
|
sinatra (>= 1.4.5)
|
9
|
+
sinatra-activerecord
|
9
10
|
thin (>= 1.5.1)
|
10
11
|
|
11
12
|
GEM
|
12
13
|
remote: https://rubygems.org/
|
13
14
|
specs:
|
15
|
+
activemodel (5.1.3)
|
16
|
+
activesupport (= 5.1.3)
|
17
|
+
activerecord (5.1.3)
|
18
|
+
activemodel (= 5.1.3)
|
19
|
+
activesupport (= 5.1.3)
|
20
|
+
arel (~> 8.0)
|
21
|
+
activesupport (5.1.3)
|
22
|
+
concurrent-ruby (~> 1.0, >= 1.0.2)
|
23
|
+
i18n (~> 0.7)
|
24
|
+
minitest (~> 5.1)
|
25
|
+
tzinfo (~> 1.1)
|
26
|
+
arel (8.0.0)
|
27
|
+
coderay (1.1.1)
|
28
|
+
concurrent-ruby (1.0.5)
|
14
29
|
daemons (1.2.4)
|
15
30
|
diff-lcs (1.1.3)
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
31
|
+
eventmachine (1.2.5)
|
32
|
+
httparty (0.15.6)
|
33
|
+
multi_xml (>= 0.5.2)
|
34
|
+
i18n (0.8.6)
|
35
|
+
method_source (0.8.2)
|
36
|
+
minitest (5.10.3)
|
37
|
+
multi_xml (0.6.0)
|
38
|
+
mustermann (1.0.1)
|
39
|
+
pg (0.21.0)
|
40
|
+
pry (0.10.4)
|
41
|
+
coderay (~> 1.1.0)
|
42
|
+
method_source (~> 0.8.1)
|
43
|
+
slop (~> 3.4)
|
44
|
+
rack (2.0.3)
|
45
|
+
rack-protection (2.0.0)
|
23
46
|
rack
|
24
47
|
rake (12.0.0)
|
25
|
-
redis (3.3.3)
|
26
48
|
rspec (2.12.0)
|
27
49
|
rspec-core (~> 2.12.0)
|
28
50
|
rspec-expectations (~> 2.12.0)
|
@@ -31,20 +53,29 @@ GEM
|
|
31
53
|
rspec-expectations (2.12.1)
|
32
54
|
diff-lcs (~> 1.1.3)
|
33
55
|
rspec-mocks (2.12.2)
|
34
|
-
sinatra (
|
35
|
-
|
36
|
-
rack
|
37
|
-
|
38
|
-
|
56
|
+
sinatra (2.0.0)
|
57
|
+
mustermann (~> 1.0)
|
58
|
+
rack (~> 2.0)
|
59
|
+
rack-protection (= 2.0.0)
|
60
|
+
tilt (~> 2.0)
|
61
|
+
sinatra-activerecord (2.0.13)
|
62
|
+
activerecord (>= 3.2)
|
63
|
+
sinatra (>= 1.0)
|
64
|
+
slop (3.6.0)
|
65
|
+
thin (1.7.2)
|
39
66
|
daemons (~> 1.0, >= 1.0.9)
|
40
67
|
eventmachine (~> 1.0, >= 1.0.4)
|
41
68
|
rack (>= 1, < 3)
|
42
|
-
|
69
|
+
thread_safe (0.3.6)
|
70
|
+
tilt (2.0.8)
|
71
|
+
tzinfo (1.2.3)
|
72
|
+
thread_safe (~> 0.1)
|
43
73
|
|
44
74
|
PLATFORMS
|
45
75
|
ruby
|
46
76
|
|
47
77
|
DEPENDENCIES
|
78
|
+
pry
|
48
79
|
rspec
|
49
80
|
rspectacles!
|
50
81
|
|
data/README.md
CHANGED
@@ -1,9 +1,8 @@
|
|
1
1
|
[](http://badge.fury.io/rb/rspectacles)
|
2
2
|
# RSpectacles
|
3
3
|
|
4
|
-
RSpectacles is an in-browser visualizer and profiler for RSpec. It uses
|
5
|
-
|
6
|
-
[partition](http://bl.ocks.org/mbostock/4063423) of your specs in real time, so
|
4
|
+
RSpectacles is an in-browser visualizer and profiler for RSpec. It uses d3.js to render a
|
5
|
+
[partition](http://bl.ocks.org/mbostock/4063423) of your specs based on time to complete, so
|
7
6
|
that you can tell at a glance where the time is spent in your test suite.
|
8
7
|
|
9
8
|

|
@@ -22,24 +21,30 @@ Or in your Gemfile:
|
|
22
21
|
|
23
22
|
Then add the formatter to your .rspec file:
|
24
23
|
|
25
|
-
--require rspectacles/formatter/
|
26
|
-
--format RSpectacles::Formatter::
|
24
|
+
--require rspectacles/formatter/batched
|
25
|
+
--format RSpectacles::Formatter::Batched
|
27
26
|
|
28
27
|
--format progress # or whatever other formatters you want to use
|
29
28
|
|
30
29
|
The formatter assumes you are using RSpec3. If you use RSpec 2:
|
31
30
|
|
32
|
-
--require rspectacles/formatter/legacy/
|
33
|
-
--format RSpectacles::Formatter::Legacy::
|
31
|
+
--require rspectacles/formatter/legacy/base
|
32
|
+
--format RSpectacles::Formatter::Legacy::Base
|
34
33
|
|
35
|
-
##
|
34
|
+
## Batched Formatter
|
36
35
|
|
37
|
-
|
38
|
-
|
39
|
-
|
36
|
+
The `Batched` formatter is preferred, as it will send fewer web requests and will be less likely to
|
37
|
+
slow down your specs if the connection to the server is slow. You can change the batch
|
38
|
+
sizes by changing the `batch_size` in config settings.
|
40
39
|
|
41
|
-
|
42
|
-
|
40
|
+
## Storage
|
41
|
+
|
42
|
+
RSpectacles depends on ActiveRecord for persistence. You
|
43
|
+
can quickly get an instance up and running by configuring the database.yml file,
|
44
|
+
and running the standard rake commands:
|
45
|
+
|
46
|
+
rake db:create
|
47
|
+
rake db:migrate
|
43
48
|
|
44
49
|
Start the server and connect to it in your browser:
|
45
50
|
|
@@ -72,27 +77,11 @@ export RSPECTACLES_CONFIG='/path/to/config/rspectacles.yml'
|
|
72
77
|
And in ```rspectacles.yml```:
|
73
78
|
```yaml
|
74
79
|
sinatra_port: 4567
|
75
|
-
|
76
|
-
|
80
|
+
batch_size: 500
|
81
|
+
rspectacles_url: 'http://127.0.0.1:4567/'
|
77
82
|
last_run_primary_key: 'redis-rspec-last-run'
|
78
83
|
```
|
79
84
|
|
80
|
-
## Realtime Results
|
81
|
-
|
82
|
-
RSpectacles will attempt to stream spec results into the browser in realtime.
|
83
|
-
This optional feature depends on EventMachine, and so will only work on servers
|
84
|
-
with EM support. So if you mount RSpectacles on an app that uses
|
85
|
-
[thin](http://code.macournoyer.com/thin/) or
|
86
|
-
[rainbows](http://rainbows.rubyforge.org/) then
|
87
|
-
you should be able to see the realtime results.
|
88
|
-
|
89
|
-
If you use a server that doesn't support EventMachine - no sweat. You'll still
|
90
|
-
be able to see the visualization. You'll just need to refresh your browser
|
91
|
-
from time to time.
|
92
|
-
|
93
|
-
Or you could always spin up an instance in standalone mode, which uses thin by
|
94
|
-
default.
|
95
|
-
|
96
85
|
## Contributing
|
97
86
|
|
98
87
|
1. Fork it
|
data/Rakefile
CHANGED
data/db/schema.rb
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
# This file is auto-generated from the current state of the database. Instead
|
2
|
+
# of editing this file, please use the migrations feature of Active Record to
|
3
|
+
# incrementally modify your database, and then regenerate this schema definition.
|
4
|
+
#
|
5
|
+
# Note that this schema.rb definition is the authoritative source for your
|
6
|
+
# database schema. If you need to create the application database on another
|
7
|
+
# system, you should be using db:schema:load, not running all the migrations
|
8
|
+
# from scratch. The latter is a flawed and unsustainable approach (the more migrations
|
9
|
+
# you'll amass, the slower it'll run and the greater likelihood for issues).
|
10
|
+
#
|
11
|
+
# It's strongly recommended that you check this file into your version control system.
|
12
|
+
|
13
|
+
ActiveRecord::Schema.define(version: 20170907205819) do
|
14
|
+
|
15
|
+
# These are extensions that must be enabled in order to support this database
|
16
|
+
enable_extension "plpgsql"
|
17
|
+
|
18
|
+
create_table "examples", force: :cascade do |t|
|
19
|
+
t.string "rspec_run", null: false
|
20
|
+
t.text "properties"
|
21
|
+
t.index ["rspec_run"], name: "index_examples_on_rspec_run"
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
@@ -1,8 +1,8 @@
|
|
1
|
-
require 'rspectacles/adapter/
|
1
|
+
require 'rspectacles/adapter/logger'
|
2
2
|
|
3
3
|
module RSpectacles
|
4
4
|
module Adapter
|
5
|
-
class
|
5
|
+
class BatchedLogger < Logger
|
6
6
|
def queued_messages
|
7
7
|
@queued_messages ||= []
|
8
8
|
end
|
@@ -17,15 +17,18 @@ module RSpectacles
|
|
17
17
|
end
|
18
18
|
|
19
19
|
def queue(message)
|
20
|
+
return unless active?
|
20
21
|
queued_messages << message
|
21
22
|
flush_queue if queued_messages.count > batch_size
|
22
23
|
end
|
23
24
|
|
24
25
|
def flush_queue
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
26
|
+
return unless active?
|
27
|
+
return unless queued_messages.size > 0
|
28
|
+
|
29
|
+
HTTParty.post(full_uri, timeout: 5,
|
30
|
+
body: { examples: queued_messages }.to_json,
|
31
|
+
headers: { 'Content-Type' => 'application/json' })
|
29
32
|
|
30
33
|
@queued_messages = []
|
31
34
|
end
|
@@ -1,15 +1,14 @@
|
|
1
1
|
require 'rspectacles/config'
|
2
|
-
require 'redis'
|
3
2
|
require 'uri'
|
4
3
|
require 'json'
|
4
|
+
require 'httparty'
|
5
5
|
|
6
6
|
module RSpectacles
|
7
7
|
module Adapter
|
8
|
-
class
|
9
|
-
attr_reader :
|
8
|
+
class Logger
|
9
|
+
attr_reader :test_run_key
|
10
10
|
|
11
11
|
def initialize(test_run_key: nil)
|
12
|
-
@redis = ::Redis.new host: uri.host, port: uri.port, password: uri.password, username: uri.user
|
13
12
|
@test_run_key = test_run_key || config.last_run_primary_key
|
14
13
|
end
|
15
14
|
|
@@ -18,37 +17,33 @@ module RSpectacles
|
|
18
17
|
end
|
19
18
|
|
20
19
|
def uri
|
21
|
-
@uri ||=
|
22
|
-
end
|
23
|
-
|
24
|
-
def delete_last_log
|
25
|
-
redis.del config.last_run_primary_key
|
20
|
+
@uri ||= config.rspectacles_url
|
26
21
|
end
|
27
22
|
|
28
23
|
def stop
|
29
|
-
log 'status:stop'
|
30
24
|
end
|
31
25
|
|
32
26
|
def start
|
33
|
-
log 'status:start'
|
34
27
|
end
|
35
28
|
|
36
|
-
def
|
37
|
-
|
29
|
+
def log(example)
|
30
|
+
message = format_example(example)
|
31
|
+
queue message
|
38
32
|
end
|
39
33
|
|
40
|
-
|
41
|
-
|
34
|
+
private
|
35
|
+
|
36
|
+
def queue(message)
|
37
|
+
return unless active?
|
38
|
+
HTTParty.post(uri, timeout: 5, data: { examples: Array.wrap(message) })
|
42
39
|
end
|
43
40
|
|
44
|
-
def
|
45
|
-
|
46
|
-
queue message
|
41
|
+
def active?
|
42
|
+
!!uri
|
47
43
|
end
|
48
44
|
|
49
|
-
def
|
50
|
-
|
51
|
-
redis.lpush test_run_key, message
|
45
|
+
def full_uri
|
46
|
+
"#{uri}/examples"
|
52
47
|
end
|
53
48
|
|
54
49
|
def format_example(example)
|
@@ -60,7 +55,7 @@ module RSpectacles
|
|
60
55
|
duration: example.execution_result.run_time,
|
61
56
|
file_path: example.metadata[:file_path],
|
62
57
|
line_number: example.metadata[:line_number]
|
63
|
-
}
|
58
|
+
}
|
64
59
|
end
|
65
60
|
end
|
66
61
|
end
|
@@ -2,25 +2,12 @@
|
|
2
2
|
define(['riffle'], function (riffle) {
|
3
3
|
'use strict';
|
4
4
|
|
5
|
-
return function streams(
|
5
|
+
return function streams(ajaxUri) {
|
6
6
|
var stream = riffle.stream
|
7
|
-
, me
|
8
|
-
, serverEvents
|
9
|
-
, ajaxEvents
|
10
|
-
, matching
|
11
|
-
, toJson
|
12
7
|
, each
|
13
|
-
,
|
14
|
-
, allEvents
|
15
|
-
, allExamples
|
16
|
-
, scopedExamples
|
17
|
-
, eventToString
|
8
|
+
, jsonEvents
|
18
9
|
;
|
19
10
|
|
20
|
-
serverEvents = stream(function (o, i) {
|
21
|
-
new EventSource(serverUri).addEventListener('message', o);
|
22
|
-
}).invoke();
|
23
|
-
|
24
11
|
function ajaxStream(url, args) {
|
25
12
|
return stream(function (o) {
|
26
13
|
$.get(url, args, function (d) {
|
@@ -29,20 +16,6 @@ define(['riffle'], function (riffle) {
|
|
29
16
|
});
|
30
17
|
}
|
31
18
|
|
32
|
-
eventToString = stream(function (o, i) {
|
33
|
-
o(i.data);
|
34
|
-
});
|
35
|
-
|
36
|
-
matching = function (regex) {
|
37
|
-
return stream(function (o, i) {
|
38
|
-
if (i.match(regex)) { o(i); }
|
39
|
-
});
|
40
|
-
};
|
41
|
-
|
42
|
-
toJson = stream(function (o, i) {
|
43
|
-
o(JSON.parse(i));
|
44
|
-
});
|
45
|
-
|
46
19
|
each = stream(function (o, i) {
|
47
20
|
i.forEach(function (item) { o(item); });
|
48
21
|
});
|
@@ -69,19 +42,8 @@ define(['riffle'], function (riffle) {
|
|
69
42
|
});
|
70
43
|
}
|
71
44
|
|
72
|
-
|
73
|
-
ajaxEvents = each.input(ajaxStream(ajaxUri).invoke());
|
74
|
-
allEvents = stream().input(stringEvents, ajaxEvents);
|
75
|
-
allExamples = toJson.input(matching(/^\{/).input(allEvents));
|
76
|
-
scopedExamples = stream(function (o, i) {
|
77
|
-
if (i.rspec_run === currentRun) { o(i); }
|
78
|
-
}).input(allExamples);
|
45
|
+
jsonEvents = each.input(ajaxStream(ajaxUri).invoke());
|
79
46
|
|
80
|
-
return
|
81
|
-
message: matching(new RegExp('^' + currentRun + ':message:')).input(stringEvents)
|
82
|
-
, start: matching(new RegExp('^' + currentRun + ':status:start')).input(stringEvents)
|
83
|
-
, stop: matching(new RegExp('^' + currentRun + ':status:stop')).input(stringEvents)
|
84
|
-
, example: batched().input(scopedExamples)
|
85
|
-
};
|
47
|
+
return { example: batched().input(jsonEvents) };
|
86
48
|
};
|
87
49
|
});
|
@@ -4,21 +4,11 @@ require(['chart', 'exampleStream'], function (chart, examples) {
|
|
4
4
|
|
5
5
|
var
|
6
6
|
bodyEl = document.querySelector('body')
|
7
|
-
,
|
8
|
-
,
|
9
|
-
, currentRun = bodyEl.dataset.currentRun
|
10
|
-
, streams = examples(uri, ajaxUri, currentRun)
|
7
|
+
, ajaxUri = bodyEl.dataset.ajaxUrl
|
8
|
+
, streams = examples(ajaxUri)
|
11
9
|
, c = chart()
|
12
10
|
;
|
13
11
|
|
14
|
-
streams.start.onOutput(function (data) {
|
15
|
-
c.reset();
|
16
|
-
});
|
17
|
-
|
18
|
-
streams.message.onOutput(function (data) {
|
19
|
-
console.log('message logged', data);
|
20
|
-
});
|
21
|
-
|
22
12
|
streams.example.onOutput(function (data) {
|
23
13
|
c.push(data);
|
24
14
|
});
|
@@ -5,7 +5,7 @@
|
|
5
5
|
<title>RSpectacles</title>
|
6
6
|
<link rel='stylesheet' href='<%= versioned_stylesheet 'style' %>' />
|
7
7
|
</head>
|
8
|
-
<body data-
|
8
|
+
<body data-ajax-url=<%= url "/examples/#{params['key']}" %>>
|
9
9
|
<form>
|
10
10
|
<label><input type="radio" name="mode" value="size" checked> Time</label>
|
11
11
|
<label><input type="radio" name="mode" value="count"> Count</label>
|
data/lib/rspectacles/app.rb
CHANGED
@@ -1,15 +1,17 @@
|
|
1
1
|
require 'rubygems'
|
2
2
|
require 'sinatra/base'
|
3
3
|
require 'json'
|
4
|
-
require '
|
5
|
-
require 'redis'
|
6
|
-
require 'uri'
|
4
|
+
require 'sinatra/activerecord'
|
7
5
|
require 'thin'
|
8
6
|
require 'rspectacles/config.rb'
|
7
|
+
require 'rspectacles/app/models/example'
|
9
8
|
|
10
9
|
module RSpectacles
|
11
10
|
class App < Sinatra::Base
|
12
11
|
require 'rspectacles/app/helpers'
|
12
|
+
register Sinatra::ActiveRecordExtension
|
13
|
+
|
14
|
+
set :database_file, 'config/database.yml'
|
13
15
|
|
14
16
|
connections = []
|
15
17
|
config = RSpectacles.config
|
@@ -25,9 +27,6 @@ module RSpectacles
|
|
25
27
|
set :public, "#{dir}/app/public"
|
26
28
|
end
|
27
29
|
|
28
|
-
uri = URI.parse config.redis_uri
|
29
|
-
redis = Redis.new host: uri.host, port: uri.port, password: uri.password, username: uri.user
|
30
|
-
|
31
30
|
# Routes
|
32
31
|
get '/watch/:key' do
|
33
32
|
erb :index
|
@@ -38,24 +37,18 @@ module RSpectacles
|
|
38
37
|
erb :index
|
39
38
|
end
|
40
39
|
|
41
|
-
get '/
|
42
|
-
|
43
|
-
connections << out
|
44
|
-
out.callback { connections.delete(out) }
|
45
|
-
end
|
46
|
-
end
|
47
|
-
|
48
|
-
get '/last/:key' do
|
49
|
-
redis.lrange(params['key'], 0, -1).to_json
|
40
|
+
get '/examples/:key' do
|
41
|
+
Example.where(rspec_run: params['key']).to_json
|
50
42
|
end
|
51
43
|
|
52
|
-
|
53
|
-
|
54
|
-
emredis = EM::Hiredis.connect(uri)
|
44
|
+
post '/examples' do
|
45
|
+
payload = JSON.parse(request.body.read)
|
55
46
|
|
56
|
-
|
57
|
-
|
47
|
+
data = payload['examples'].map do |args|
|
48
|
+
{ rspec_run: args['rspec_run'], properties: args }
|
58
49
|
end
|
50
|
+
|
51
|
+
Example.create(data)
|
59
52
|
end
|
60
53
|
end
|
61
54
|
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
development:
|
2
|
+
adapter: postgresql
|
3
|
+
database: rspectacles_dev
|
4
|
+
username: postgres
|
5
|
+
pool: 5
|
6
|
+
host: localhost
|
7
|
+
timeout: 5000
|
8
|
+
variables:
|
9
|
+
statement_timeout: 3600000
|
10
|
+
|
11
|
+
test: &test
|
12
|
+
adapter: <%= ENV['DB_ADAPTER'] || 'postgresql' %>
|
13
|
+
database: rspectacles_test
|
14
|
+
username: postgres
|
15
|
+
pool: 5
|
16
|
+
host: <%= ENV['DB_HOST'] || 'localhost' %>
|
17
|
+
timeout: 5000
|
18
|
+
variables:
|
19
|
+
statement_timeout: 3600000
|
20
|
+
|
21
|
+
production: &production
|
22
|
+
adapter: postgresql
|
23
|
+
database: rspectacles_prod
|
24
|
+
username: postgres
|
25
|
+
pool: 10
|
26
|
+
host: localhost
|
27
|
+
timeout: 5000
|
28
|
+
variables:
|
29
|
+
statement_timeout: 3600000
|
data/lib/rspectacles/config.rb
CHANGED
@@ -5,16 +5,15 @@ require 'erb'
|
|
5
5
|
module RSpectacles
|
6
6
|
class Config
|
7
7
|
def initialize
|
8
|
-
@opts = OpenStruct.new defaults.merge(yml
|
8
|
+
@opts = OpenStruct.new defaults.merge(yml.symbolize_keys)
|
9
9
|
end
|
10
10
|
|
11
11
|
def defaults
|
12
12
|
{
|
13
13
|
sinatra_port: ENV['RSPECTACLES_PORT'] || ENV['PORT'] || 4567,
|
14
14
|
batch_size: (ENV['RSPECTACLES_BATCH_SIZE'] || 100).to_i,
|
15
|
-
|
16
|
-
|
17
|
-
redis_uri: ENV['RSPECTACLES_REDIS_URL'] || 'redis://127.0.0.1:6379/'
|
15
|
+
last_run_primary_key: ENV['RSPECTACLES_LAST_RUN_KEY'] || ENV['CIRCLE_BUILD_NUM'] || 'rspec-last-run',
|
16
|
+
rspectacles_url: ENV['RSPECTACLES_URL']
|
18
17
|
}
|
19
18
|
end
|
20
19
|
|
@@ -25,9 +24,7 @@ module RSpectacles
|
|
25
24
|
private
|
26
25
|
|
27
26
|
def yml_path
|
28
|
-
if ENV['RSPECTACLES_CONFIG']
|
29
|
-
::File.expand_path(ENV['RSPECTACLES_CONFIG'])
|
30
|
-
end
|
27
|
+
::File.expand_path(ENV['RSPECTACLES_CONFIG']) if ENV['RSPECTACLES_CONFIG']
|
31
28
|
end
|
32
29
|
|
33
30
|
def yml_exists?
|
@@ -35,7 +32,11 @@ module RSpectacles
|
|
35
32
|
end
|
36
33
|
|
37
34
|
def yml
|
38
|
-
|
35
|
+
if yml_exists?
|
36
|
+
@yml ||= ::YAML.load(::ERB.new(IO.read(yml_path)).result)
|
37
|
+
else
|
38
|
+
{}
|
39
|
+
end
|
39
40
|
end
|
40
41
|
end
|
41
42
|
|
@@ -1,8 +1,8 @@
|
|
1
|
-
require 'rspectacles/adapter/
|
1
|
+
require 'rspectacles/adapter/logger'
|
2
2
|
|
3
3
|
module RSpectacles
|
4
4
|
module Formatter
|
5
|
-
class
|
5
|
+
class Base
|
6
6
|
RSpec::Core::Formatters.register self,
|
7
7
|
*%i(example_passed
|
8
8
|
example_failed
|
@@ -16,11 +16,10 @@ module RSpectacles
|
|
16
16
|
end
|
17
17
|
|
18
18
|
def logger
|
19
|
-
@logger ||= RSpectacles::Adapter::
|
19
|
+
@logger ||= RSpectacles::Adapter::Logger.new(test_run_key: current_run_key)
|
20
20
|
end
|
21
21
|
|
22
22
|
def message(notification)
|
23
|
-
logger.message notification.message
|
24
23
|
end
|
25
24
|
|
26
25
|
def start(_)
|
@@ -32,15 +31,15 @@ module RSpectacles
|
|
32
31
|
end
|
33
32
|
|
34
33
|
def example_passed(notification)
|
35
|
-
logger.
|
34
|
+
logger.log notification.example
|
36
35
|
end
|
37
36
|
|
38
37
|
def example_pending(notification)
|
39
|
-
logger.
|
38
|
+
logger.log notification.example
|
40
39
|
end
|
41
40
|
|
42
41
|
def example_failed(notification)
|
43
|
-
logger.
|
42
|
+
logger.log notification.example
|
44
43
|
end
|
45
44
|
|
46
45
|
def current_run_key
|
@@ -1,9 +1,9 @@
|
|
1
|
-
require 'rspectacles/adapter/
|
2
|
-
require 'rspectacles/formatter/
|
1
|
+
require 'rspectacles/adapter/batched_logger'
|
2
|
+
require 'rspectacles/formatter/base'
|
3
3
|
|
4
4
|
module RSpectacles
|
5
5
|
module Formatter
|
6
|
-
class
|
6
|
+
class Batched < RSpectacles::Formatter::Base
|
7
7
|
RSpec::Core::Formatters.register self,
|
8
8
|
*%i(example_passed
|
9
9
|
example_failed
|
@@ -12,7 +12,7 @@ module RSpectacles
|
|
12
12
|
message)
|
13
13
|
|
14
14
|
def logger
|
15
|
-
@logger ||= RSpectacles::Adapter::
|
15
|
+
@logger ||= RSpectacles::Adapter::BatchedLogger.new(test_run_key: current_run_key)
|
16
16
|
end
|
17
17
|
end
|
18
18
|
end
|
@@ -1,45 +1,43 @@
|
|
1
1
|
require 'rspec/core/formatters/base_formatter'
|
2
|
-
require 'rspectacles/adapter/
|
2
|
+
require 'rspectacles/adapter/logger'
|
3
3
|
|
4
4
|
module RSpectacles
|
5
5
|
module Formatter
|
6
6
|
module Legacy
|
7
|
-
class
|
7
|
+
class Base < RSpec::Core::Formatters::BaseFormatter
|
8
8
|
attr_reader :output
|
9
9
|
|
10
10
|
def initialize(_)
|
11
11
|
end
|
12
12
|
|
13
13
|
def logger
|
14
|
-
@logger ||= RSpectacles::Adapter::
|
14
|
+
@logger ||= RSpectacles::Adapter::Logger.new
|
15
15
|
end
|
16
16
|
|
17
|
-
def message(
|
18
|
-
logger.log "message:#{message}"
|
17
|
+
def message(_message)
|
19
18
|
end
|
20
19
|
|
21
|
-
def start(
|
22
|
-
logger.
|
23
|
-
logger.delete_last_log
|
20
|
+
def start(_example_count)
|
21
|
+
logger.start
|
24
22
|
end
|
25
23
|
|
26
24
|
def stop
|
27
|
-
logger.
|
25
|
+
logger.stop
|
28
26
|
end
|
29
27
|
|
30
28
|
def example_started(example)
|
31
29
|
end
|
32
30
|
|
33
31
|
def example_passed(example)
|
34
|
-
logger.
|
32
|
+
logger.log example
|
35
33
|
end
|
36
34
|
|
37
35
|
def example_pending(example)
|
38
|
-
logger.
|
36
|
+
logger.log example
|
39
37
|
end
|
40
38
|
|
41
39
|
def example_failed(example)
|
42
|
-
logger.
|
40
|
+
logger.log example
|
43
41
|
end
|
44
42
|
|
45
43
|
def close
|
data/lib/rspectacles/version.rb
CHANGED
data/rspectacles.gemspec
CHANGED
@@ -21,9 +21,11 @@ Gem::Specification.new do |s|
|
|
21
21
|
|
22
22
|
# specify any dependencies here; for example:
|
23
23
|
s.add_development_dependency 'rspec'
|
24
|
+
s.add_development_dependency 'pry'
|
24
25
|
s.add_dependency 'rake'
|
26
|
+
s.add_dependency 'pg'
|
27
|
+
s.add_dependency 'sinatra-activerecord'
|
25
28
|
s.add_dependency 'thin', '>= 1.5.1'
|
26
29
|
s.add_dependency 'sinatra', '>= 1.4.5'
|
27
|
-
s.add_dependency '
|
28
|
-
s.add_dependency 'em-hiredis', '>= 0.3.0'
|
30
|
+
s.add_dependency 'httparty'
|
29
31
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rspectacles
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Michael Wheeler
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-09-
|
11
|
+
date: 2017-09-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rspec
|
@@ -25,13 +25,13 @@ dependencies:
|
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
|
-
name:
|
28
|
+
name: pry
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
33
|
version: '0'
|
34
|
-
type: :
|
34
|
+
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
@@ -39,35 +39,35 @@ dependencies:
|
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
|
-
name:
|
42
|
+
name: rake
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
45
|
- - ">="
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version:
|
47
|
+
version: '0'
|
48
48
|
type: :runtime
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
52
|
- - ">="
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version:
|
54
|
+
version: '0'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
|
-
name:
|
56
|
+
name: pg
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
59
|
- - ">="
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version:
|
61
|
+
version: '0'
|
62
62
|
type: :runtime
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
66
|
- - ">="
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version:
|
68
|
+
version: '0'
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
|
-
name:
|
70
|
+
name: sinatra-activerecord
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
72
72
|
requirements:
|
73
73
|
- - ">="
|
@@ -81,19 +81,47 @@ dependencies:
|
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: '0'
|
83
83
|
- !ruby/object:Gem::Dependency
|
84
|
-
name:
|
84
|
+
name: thin
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: 1.5.1
|
90
|
+
type: :runtime
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ">="
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: 1.5.1
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: sinatra
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - ">="
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: 1.4.5
|
104
|
+
type: :runtime
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - ">="
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: 1.4.5
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: httparty
|
85
113
|
requirement: !ruby/object:Gem::Requirement
|
86
114
|
requirements:
|
87
115
|
- - ">="
|
88
116
|
- !ruby/object:Gem::Version
|
89
|
-
version: 0
|
117
|
+
version: '0'
|
90
118
|
type: :runtime
|
91
119
|
prerelease: false
|
92
120
|
version_requirements: !ruby/object:Gem::Requirement
|
93
121
|
requirements:
|
94
122
|
- - ">="
|
95
123
|
- !ruby/object:Gem::Version
|
96
|
-
version: 0
|
124
|
+
version: '0'
|
97
125
|
description: Visualize rspec test running in the browser
|
98
126
|
email:
|
99
127
|
- mwheeler@g2crowd.com
|
@@ -103,6 +131,7 @@ extensions: []
|
|
103
131
|
extra_rdoc_files: []
|
104
132
|
files:
|
105
133
|
- ".gitignore"
|
134
|
+
- ".jshintrc"
|
106
135
|
- Gemfile
|
107
136
|
- Gemfile.lock
|
108
137
|
- LICENSE
|
@@ -110,11 +139,14 @@ files:
|
|
110
139
|
- Rakefile
|
111
140
|
- bin/rspectacles
|
112
141
|
- config.ru
|
142
|
+
- db/migrate/20170907205819_create_examples_table.rb
|
143
|
+
- db/schema.rb
|
113
144
|
- lib/rspectacles.rb
|
114
|
-
- lib/rspectacles/adapter/
|
115
|
-
- lib/rspectacles/adapter/
|
145
|
+
- lib/rspectacles/adapter/batched_logger.rb
|
146
|
+
- lib/rspectacles/adapter/logger.rb
|
116
147
|
- lib/rspectacles/app.rb
|
117
148
|
- lib/rspectacles/app/helpers.rb
|
149
|
+
- lib/rspectacles/app/models/example.rb
|
118
150
|
- lib/rspectacles/app/public/css/style.css
|
119
151
|
- lib/rspectacles/app/public/js/chart.js
|
120
152
|
- lib/rspectacles/app/public/js/d3.js
|
@@ -128,9 +160,10 @@ files:
|
|
128
160
|
- lib/rspectacles/app/public/js/script.js
|
129
161
|
- lib/rspectacles/app/views/index.erb
|
130
162
|
- lib/rspectacles/config.rb
|
131
|
-
- lib/rspectacles/
|
132
|
-
- lib/rspectacles/formatter/
|
133
|
-
- lib/rspectacles/formatter/
|
163
|
+
- lib/rspectacles/config/database.yml
|
164
|
+
- lib/rspectacles/formatter/base.rb
|
165
|
+
- lib/rspectacles/formatter/batched.rb
|
166
|
+
- lib/rspectacles/formatter/legacy/base.rb
|
134
167
|
- lib/rspectacles/version.rb
|
135
168
|
- rspectacles.gemspec
|
136
169
|
- spec/javascripts/resources/qunit.css
|