rspectacles 0.1.3 → 0.2.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 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