rspectacles 0.1.3 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 036f403d5d6ce0d712e8da685836a27e7ed668d0
4
- data.tar.gz: ca29ea924c129b9e215b64291f5a2a89df920c20
3
+ metadata.gz: 003d7cba8ab931d6de4f17920e73607ef342b36a
4
+ data.tar.gz: 816b05b8c5cfd7a43f8b48ca516ec319e5e073ef
5
5
  SHA512:
6
- metadata.gz: ee7dd6b6a26913e5f113b1a8c33e2d7f1652647e2d0cb6837482457182c9912cdeb9f20847d081271947b67f38c1154897d6f72ad8c8085cecb4e64b172dc413
7
- data.tar.gz: f276b04aa124ed5bd3d393ed01b2d77ab7c17807e3388290c477fb270dd26079f074d36105ea13b98f6298a9f0a696b9f09f773b293d8118d912eecca25da113
6
+ metadata.gz: 67f223e3cc98eb61f017226d41885b37d014c5f49b5fbb4df68db26d6252d8d49f4878a4980b533be433974930a2c199c36f619a5bda2ab36cf2882342deebed
7
+ data.tar.gz: b21d65f9c4bdc5b9372b3c4d1c58da21ba823b9bbccf31497863dc3ab47ac95a94d81b064604869c06aea9afb220f4318838ac6e8f41b700b6fc923c3b385acb
data/Gemfile.lock CHANGED
@@ -1,27 +1,28 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- rspectacles (0.1.0)
5
- em-hiredis (>= 0.2.1)
4
+ rspectacles (0.2.0)
5
+ em-hiredis (>= 0.3.0)
6
6
  rake
7
7
  redis
8
- sinatra (~> 1.4.5)
8
+ sinatra (>= 1.4.5)
9
9
  thin (>= 1.5.1)
10
10
 
11
11
  GEM
12
12
  remote: https://rubygems.org/
13
13
  specs:
14
- daemons (1.1.9)
14
+ daemons (1.2.4)
15
15
  diff-lcs (1.1.3)
16
- em-hiredis (0.2.1)
17
- hiredis (~> 0.4.0)
18
- eventmachine (1.0.3)
19
- hiredis (0.4.5)
20
- rack (1.5.2)
16
+ em-hiredis (0.3.1)
17
+ eventmachine (~> 1.0)
18
+ hiredis (~> 0.6.0)
19
+ eventmachine (1.2.3)
20
+ hiredis (0.6.1)
21
+ rack (1.6.8)
21
22
  rack-protection (1.5.3)
22
23
  rack
23
- rake (10.3.1)
24
- redis (3.0.7)
24
+ rake (12.0.0)
25
+ redis (3.3.3)
25
26
  rspec (2.12.0)
26
27
  rspec-core (~> 2.12.0)
27
28
  rspec-expectations (~> 2.12.0)
@@ -30,15 +31,15 @@ GEM
30
31
  rspec-expectations (2.12.1)
31
32
  diff-lcs (~> 1.1.3)
32
33
  rspec-mocks (2.12.2)
33
- sinatra (1.4.5)
34
- rack (~> 1.4)
34
+ sinatra (1.4.7)
35
+ rack (~> 1.5)
35
36
  rack-protection (~> 1.4)
36
- tilt (~> 1.3, >= 1.3.4)
37
- thin (1.6.2)
38
- daemons (>= 1.0.9)
39
- eventmachine (>= 1.0.0)
40
- rack (>= 1.0.0)
41
- tilt (1.4.1)
37
+ tilt (>= 1.3, < 3)
38
+ thin (1.7.0)
39
+ daemons (~> 1.0, >= 1.0.9)
40
+ eventmachine (~> 1.0, >= 1.0.4)
41
+ rack (>= 1, < 3)
42
+ tilt (2.0.7)
42
43
 
43
44
  PLATFORMS
44
45
  ruby
@@ -46,3 +47,6 @@ PLATFORMS
46
47
  DEPENDENCIES
47
48
  rspec
48
49
  rspectacles!
50
+
51
+ BUNDLED WITH
52
+ 1.14.6
@@ -0,0 +1,34 @@
1
+ require 'rspectacles/adapter/redis_logger'
2
+
3
+ module RSpectacles
4
+ module Adapter
5
+ class BatchedRedisLogger < RedisLogger
6
+ def queued_messages
7
+ @queued_messages ||= []
8
+ end
9
+
10
+ def stop
11
+ super
12
+ flush_queue
13
+ end
14
+
15
+ def batch_size
16
+ config.batch_size
17
+ end
18
+
19
+ def queue(message)
20
+ puts test_run_key, message
21
+ queued_messages << message
22
+ end
23
+
24
+ def flush_queue
25
+ queued_messages.each do |message|
26
+ redis.publish config.pubsub_channel_name, message
27
+ redis.lpush test_run_key, message
28
+ end
29
+
30
+ @queued_messages = []
31
+ end
32
+ end
33
+ end
34
+ end
@@ -6,10 +6,11 @@ require 'json'
6
6
  module RSpectacles
7
7
  module Adapter
8
8
  class RedisLogger
9
- attr_reader :redis
9
+ attr_reader :redis, :test_run_key
10
10
 
11
- def initialize
12
- @redis = ::Redis.new host: uri.host, port: uri.port, password: uri.password
11
+ def initialize(test_run_key: nil)
12
+ @redis = ::Redis.new host: uri.host, port: uri.port, password: uri.password, username: uri.user
13
+ @test_run_key = test_run_key || config.last_run_primary_key
13
14
  end
14
15
 
15
16
  def config
@@ -24,25 +25,41 @@ module RSpectacles
24
25
  redis.del config.last_run_primary_key
25
26
  end
26
27
 
28
+ def stop
29
+ log 'status:stop'
30
+ end
31
+
32
+ def start
33
+ log 'status:start'
34
+ end
35
+
36
+ def message(text)
37
+ log "message:#{text}"
38
+ end
39
+
27
40
  def log(message)
28
- redis.publish config.pubsub_channel_name, message
29
- redis.lpush config.last_run_primary_key, message
41
+ queue "#{test_run_key}:#{message}"
30
42
  end
31
43
 
32
44
  def log_formatted(example)
33
45
  message = format_example(example)
46
+ queue message
47
+ end
48
+
49
+ def queue(message)
34
50
  redis.publish config.pubsub_channel_name, message
35
- redis.lpush config.last_run_primary_key, message
51
+ redis.lpush test_run_key, message
36
52
  end
37
53
 
38
54
  def format_example(example)
39
55
  {
40
- :description => example.description,
41
- :full_description => example.full_description,
42
- :status => example.execution_result.status,
43
- :duration => example.execution_result.run_time,
44
- :file_path => example.metadata[:file_path],
45
- :line_number => example.metadata[:line_number]
56
+ rspec_run: test_run_key,
57
+ description: example.description,
58
+ full_description: example.full_description,
59
+ status: example.execution_result.status,
60
+ duration: example.execution_result.run_time,
61
+ file_path: example.metadata[:file_path],
62
+ line_number: example.metadata[:line_number]
46
63
  }.to_json
47
64
  end
48
65
  end
@@ -26,10 +26,15 @@ module RSpectacles
26
26
  end
27
27
 
28
28
  uri = URI.parse config.redis_uri
29
- redis = Redis.new host: uri.host, port: uri.port
29
+ redis = Redis.new host: uri.host, port: uri.port, password: uri.password, username: uri.user
30
30
 
31
31
  # Routes
32
- get '/' do
32
+ get '/watch/:key' do
33
+ erb :index
34
+ end
35
+
36
+ get '/watch' do
37
+ params['key'] = config.last_run_primary_key
33
38
  erb :index
34
39
  end
35
40
 
@@ -40,8 +45,8 @@ module RSpectacles
40
45
  end
41
46
  end
42
47
 
43
- get '/last' do
44
- redis.lrange(config.last_run_primary_key, 0, -1).to_json
48
+ get '/last/:key' do
49
+ redis.lrange(params['key'], 0, -1).to_json
45
50
  end
46
51
 
47
52
  # pubsub and streaming - EventMachine support only
@@ -2,7 +2,7 @@
2
2
  define(['riffle'], function (riffle) {
3
3
  'use strict';
4
4
 
5
- return function streams(serverUri, ajaxUri) {
5
+ return function streams(serverUri, ajaxUri, currentRun) {
6
6
  var stream = riffle.stream
7
7
  , me
8
8
  , serverEvents
@@ -12,6 +12,8 @@ define(['riffle'], function (riffle) {
12
12
  , each
13
13
  , stringEvents
14
14
  , allEvents
15
+ , allExamples
16
+ , scopedExamples
15
17
  , eventToString
16
18
  ;
17
19
 
@@ -70,12 +72,16 @@ define(['riffle'], function (riffle) {
70
72
  stringEvents = eventToString.input(serverEvents);
71
73
  ajaxEvents = each.input(ajaxStream(ajaxUri).invoke());
72
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);
73
79
 
74
80
  return me = {
75
- message: matching(/^message:/).input(stringEvents)
76
- , start: matching(/^status:start/).input(stringEvents)
77
- , stop: matching(/^status:stop/).input(stringEvents)
78
- , example: batched().input(toJson.input(matching(/^\{/).input(allEvents)))
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)
79
85
  };
80
86
  };
81
87
  });
@@ -6,7 +6,8 @@ require(['chart', 'exampleStream'], function (chart, examples) {
6
6
  bodyEl = document.querySelector('body')
7
7
  , uri = bodyEl.dataset.streamUrl
8
8
  , ajaxUri = bodyEl.dataset.lastUrl
9
- , streams = examples(uri, ajaxUri)
9
+ , currentRun = bodyEl.dataset.currentRun
10
+ , streams = examples(uri, ajaxUri, currentRun)
10
11
  , c = chart()
11
12
  ;
12
13
 
@@ -5,7 +5,7 @@
5
5
  <title>RSpectacles</title>
6
6
  <link rel='stylesheet' href='<%= versioned_stylesheet 'style' %>' />
7
7
  </head>
8
- <body data-stream-url=<%= url '/stream' %> data-last-url=<%= url '/last' %>>
8
+ <body data-stream-url=<%= url '/stream' %> data-last-url=<%= url "/last/#{params['key']}" %> data-current-run=<%= 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>
@@ -1,32 +1,41 @@
1
1
  require 'ostruct'
2
2
  require 'yaml'
3
+ require 'erb'
3
4
 
4
5
  module RSpectacles
5
6
  class Config
6
7
  def initialize
7
- user_options = load_user_opts
8
- @opts = OpenStruct.new defaults.merge(user_options)
8
+ @opts = OpenStruct.new defaults.merge(yml || {})
9
9
  end
10
10
 
11
11
  def defaults
12
12
  {
13
- sinatra_port: 4567,
14
- pubsub_channel_name: 'redis-rspec-examples',
15
- last_run_primary_key: 'redis-rspec-last-run',
16
- redis_uri: 'redis://127.0.0.1:6379/'
13
+ sinatra_port: ENV['RSPECTACLES_PORT'] || ENV['PORT'] || 4567,
14
+ batch_size: (ENV['RSPECTACLES_BATCH_SIZE'] || 100).to_i,
15
+ pubsub_channel_name: ENV['RSPECTACLES_CHANNEL'] || 'redis-rspec-examples',
16
+ last_run_primary_key: ENV['RSPECTACLES_LAST_RUN_KEY'] || 'redis-rspec-last-run',
17
+ redis_uri: ENV['RSPECTACLES_REDIS_URL'] || 'redis://127.0.0.1:6379/'
17
18
  }
18
19
  end
19
20
 
20
- def load_user_opts
21
- if ENV['RSPECTACLES_CONFIG'] && ::File.exists?(::File.expand_path(ENV['RSPECTACLES_CONFIG']))
22
- YAML.load_file(::File.expand_path(ENV['RSPECTACLES_CONFIG']))
23
- else
24
- {}
21
+ def method_missing(method, *args)
22
+ @opts.send method, *args
23
+ end
24
+
25
+ private
26
+
27
+ def yml_path
28
+ if ENV['RSPECTACLES_CONFIG']
29
+ ::File.expand_path(ENV['RSPECTACLES_CONFIG'])
25
30
  end
26
31
  end
27
32
 
28
- def method_missing(method, *args)
29
- @opts.send method, *args
33
+ def yml_exists?
34
+ yml_path && ::File.exist?(yml_path)
35
+ end
36
+
37
+ def yml
38
+ @yml ||= ::YAML.load(::ERB.new(IO.read(yml_path)).result) if yml_exists?
30
39
  end
31
40
  end
32
41
 
@@ -0,0 +1,19 @@
1
+ require 'rspectacles/adapter/batched_redis_logger'
2
+ require 'rspectacles/formatter/redis'
3
+
4
+ module RSpectacles
5
+ module Formatter
6
+ class BatchedRedis < RSpectacles::Formatter::Redis
7
+ RSpec::Core::Formatters.register self,
8
+ *%i(example_passed
9
+ example_failed
10
+ start
11
+ stop
12
+ message)
13
+
14
+ def logger
15
+ @logger ||= RSpectacles::Adapter::BatchedRedisLogger.new(test_run_key: current_run_key)
16
+ end
17
+ end
18
+ end
19
+ end
@@ -16,20 +16,19 @@ module RSpectacles
16
16
  end
17
17
 
18
18
  def logger
19
- @logger ||= RSpectacles::Adapter::RedisLogger.new
19
+ @logger ||= RSpectacles::Adapter::RedisLogger.new(test_run_key: current_run_key)
20
20
  end
21
21
 
22
22
  def message(notification)
23
- logger.log "message:#{notification.message}"
23
+ logger.message notification.message
24
24
  end
25
25
 
26
26
  def start(_)
27
- logger.log 'status:start'
28
- logger.delete_last_log
27
+ logger.start
29
28
  end
30
29
 
31
30
  def stop(_)
32
- logger.log 'status:stop'
31
+ logger.stop
33
32
  end
34
33
 
35
34
  def example_passed(notification)
@@ -43,6 +42,14 @@ module RSpectacles
43
42
  def example_failed(notification)
44
43
  logger.log_formatted notification.example
45
44
  end
45
+
46
+ def current_run_key
47
+ ENV['CURRENT_RSPEC_RUN'] || config.last_run_primary_key
48
+ end
49
+
50
+ def config
51
+ RSpectacles.config
52
+ end
46
53
  end
47
54
  end
48
55
  end
@@ -1,3 +1,3 @@
1
1
  module RSpectacles
2
- VERSION='0.1.3'
2
+ VERSION='0.2.0'
3
3
  end
data/rspectacles.gemspec CHANGED
@@ -23,7 +23,7 @@ Gem::Specification.new do |s|
23
23
  s.add_development_dependency 'rspec'
24
24
  s.add_dependency 'rake'
25
25
  s.add_dependency 'thin', '>= 1.5.1'
26
- s.add_dependency 'sinatra', '~> 1.4.5'
26
+ s.add_dependency 'sinatra', '>= 1.4.5'
27
27
  s.add_dependency 'redis'
28
- s.add_dependency 'em-hiredis', '~> 0.3.0'
28
+ s.add_dependency 'em-hiredis', '>= 0.3.0'
29
29
  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.1.3
4
+ version: 0.2.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: 2015-01-08 00:00:00.000000000 Z
11
+ date: 2017-09-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rspec
@@ -56,14 +56,14 @@ dependencies:
56
56
  name: sinatra
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - "~>"
59
+ - - ">="
60
60
  - !ruby/object:Gem::Version
61
61
  version: 1.4.5
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
68
  version: 1.4.5
69
69
  - !ruby/object:Gem::Dependency
@@ -84,14 +84,14 @@ dependencies:
84
84
  name: em-hiredis
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
- - - "~>"
87
+ - - ">="
88
88
  - !ruby/object:Gem::Version
89
89
  version: 0.3.0
90
90
  type: :runtime
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
- - - "~>"
94
+ - - ">="
95
95
  - !ruby/object:Gem::Version
96
96
  version: 0.3.0
97
97
  description: Visualize rspec test running in the browser
@@ -111,6 +111,7 @@ files:
111
111
  - bin/rspectacles
112
112
  - config.ru
113
113
  - lib/rspectacles.rb
114
+ - lib/rspectacles/adapter/batched_redis_logger.rb
114
115
  - lib/rspectacles/adapter/redis_logger.rb
115
116
  - lib/rspectacles/app.rb
116
117
  - lib/rspectacles/app/helpers.rb
@@ -127,6 +128,7 @@ files:
127
128
  - lib/rspectacles/app/public/js/script.js
128
129
  - lib/rspectacles/app/views/index.erb
129
130
  - lib/rspectacles/config.rb
131
+ - lib/rspectacles/formatter/batched_redis.rb
130
132
  - lib/rspectacles/formatter/legacy/redis.rb
131
133
  - lib/rspectacles/formatter/redis.rb
132
134
  - lib/rspectacles/version.rb
@@ -156,7 +158,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
156
158
  version: '0'
157
159
  requirements: []
158
160
  rubyforge_project: rspectacles
159
- rubygems_version: 2.2.2
161
+ rubygems_version: 2.6.11
160
162
  signing_key:
161
163
  specification_version: 4
162
164
  summary: Visualize rspec test running in the browser