capistrano-measure 0.8.1 → 0.10.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: 8800ff49810b512b1a0fac4e8efa703f0cd2a3a4
4
- data.tar.gz: fa54945a4235c958ec5c7a1df9ed58207ac76242
3
+ metadata.gz: 7985b11ba0b7a76c5839925a75d929a7991222ec
4
+ data.tar.gz: d9d5b4a4bb46921324ffe71b8b4769788bdd5d68
5
5
  SHA512:
6
- metadata.gz: 342c4504f111003037d240c6c2e5c1473d3297c24c1b3f6c91e61db813a9f3d1c24871ce1083c7bc4edbd975b307f7afe5f825e1063af74ff6dcbc764f0b1232
7
- data.tar.gz: 0a472eaae23502477d039e487fc03e12040e7102b556bdd6a314017f2c222b1cf85711215a63b247eb6780de4d13e115c8e4a4e8b7c57f76f15708a618fa4008
6
+ metadata.gz: 9afca2004487f749ba1863e190f7ec1716362e9fd9df5519293765533849a2a9e9287c72fa8c551240fafde5a0d8f6799739556004720f29e144aaa876c6216d
7
+ data.tar.gz: d9d7958f05359b27fdc8d54d943632572e81a73308d63126047be83b48ff00f169801160c6968efcdc11cf1302a7e7b7346071612d7c9423f0e7aeef11cb9d48
data/.travis.yml ADDED
@@ -0,0 +1,6 @@
1
+ language: ruby
2
+ script: "bundle exec rspec spec"
3
+ rvm:
4
+ - 2.0.0
5
+ - 2.3.1
6
+ sudo: false
data/README.md CHANGED
@@ -1,4 +1,6 @@
1
1
  # Capistrano::Measure - deployment speed measure tool
2
+ [![Gem Version](https://badge.fury.io/rb/capistrano-measure.svg)](https://badge.fury.io/rb/capistrano-measure)
3
+ [![Build Status](https://travis-ci.org/AMekss/capistrano-measure.svg?branch=master)](https://travis-ci.org/AMekss/capistrano-measure)
2
4
 
3
5
  In order to improve something you have to measure it! This helps you measure performance of your Capistrano deployments by appending performance reports after each Capistrano execution
4
6
 
@@ -85,6 +87,15 @@ It will append every capistrano execution with similar report
85
87
  I, [2014-10-23T18:10:31.386225 #14352] INFO -- : deploy 104s
86
88
  I, [2014-10-23T18:10:31.386246 #14352] INFO -- : ==========================================================
87
89
 
90
+ ### Settings
91
+ You could change threshold time to change the results duration's color.
92
+
93
+ ```ruby
94
+ set :alert_threshold, 10 # default 60 sec
95
+ set :warning_threshold, 5 # default 30 sec
96
+ set :measure_error_handling, :raise # default :silent
97
+ ```
98
+
88
99
  ## Contributing
89
100
 
90
101
  1. Fork it ( https://github.com/[my-github-username]/capistrano-measure/fork )
@@ -18,7 +18,7 @@ Gem::Specification.new do |spec|
18
18
  spec.require_paths = ["lib"]
19
19
 
20
20
  spec.add_dependency "capistrano", ">= 2", "< 4"
21
- spec.add_dependency "colored", "~> 1.2"
21
+ spec.add_dependency "colorize", '>= 0.8.1'
22
22
 
23
23
  spec.add_development_dependency "bundler", "~> 1.7"
24
24
  spec.add_development_dependency "rake", "~> 10.0"
@@ -8,21 +8,53 @@ module Capistrano
8
8
  nil
9
9
  end
10
10
 
11
- def initialize(logger=nil)
12
- @timer = Capistrano::Measure::Timer.new
13
- @log_reporter = Capistrano::Measure::LogReporter.new(logger)
11
+ def initialize(logger, config)
12
+ @logger = logger
13
+ @config = config
14
+ @valid = true
14
15
  end
15
16
 
16
17
  def before_task(task_name)
17
- @timer.start(task_name)
18
+ with_error_handling { timer.start(task_name) }
18
19
  end
19
20
 
20
21
  def after_task(task_name)
21
- @timer.stop(task_name)
22
+ with_error_handling { timer.stop(task_name) }
22
23
  end
23
24
 
24
25
  def print_report
25
- @log_reporter.render(@timer.report_events)
26
+ if valid?
27
+ log_reporter.render(timer.report_events)
28
+ else
29
+ log_reporter.render_error("Capistrano::Measure plugin encountered an error during performance evaluation and is not able to present a performance report, in order to `raise` and troubleshoot this error add `set :measure_error_handling, :raise` into your capistrano config")
30
+ end
31
+ end
32
+
33
+ private
34
+
35
+ attr_reader :logger, :config
36
+
37
+ def log_reporter
38
+ @log_reporter ||= Capistrano::Measure::LogReporter.new(logger, config)
39
+ end
40
+
41
+ def timer
42
+ @timer ||= Capistrano::Measure::Timer.new
43
+ end
44
+
45
+ def debug?
46
+ config.fetch(:measure_error_handling, :silent) == :raise
47
+ end
48
+
49
+ def valid?
50
+ @valid
51
+ end
52
+
53
+ def with_error_handling
54
+ yield
55
+ rescue StandardError => e
56
+ @valid = false
57
+ raise e if debug?
26
58
  end
27
59
 
28
60
  end
@@ -0,0 +1,5 @@
1
+ module Capistrano
2
+ module Measure
3
+ class Error < StandardError; end
4
+ end
5
+ end
@@ -1,5 +1,5 @@
1
1
  Capistrano::Configuration.instance(:must_exist).load do |config|
2
- adapter = Capistrano::Measure::Adapter.new(logger)
2
+ adapter = Capistrano::Measure::Adapter.new(logger, config)
3
3
 
4
4
  on :before do
5
5
  adapter.before_task(current_task.fully_qualified_name)
@@ -3,7 +3,7 @@ module Capistrano
3
3
  module Integration
4
4
  module Capistrano3
5
5
  def measure_adapter
6
- @measure_adapter ||= Capistrano::Measure::Adapter.new
6
+ @measure_adapter ||= Capistrano::Measure::Adapter.new(::Logger.new(STDOUT), ::Capistrano::Configuration.env)
7
7
  end
8
8
 
9
9
  def insert_measure_tasks
@@ -1,33 +1,49 @@
1
- require 'colored'
1
+ require 'colorized_string'
2
2
  require 'logger'
3
3
 
4
4
  module Capistrano
5
5
  module Measure
6
6
  class LogReporter
7
- ALERT_TRASHOLD = 60
8
- WARNING_TRASHOLD = 30
9
7
 
10
- def initialize(logger=nil)
11
- @logger = logger || ::Logger.new(STDOUT)
8
+ attr_reader :alert_threshold, :warning_threshold
9
+
10
+ DEFALUT_ALERT_THRESHOLD = 60
11
+ DEFAULT_WARNING_THRESHOLD = 30
12
+
13
+ def initialize(logger, config)
14
+ @logger = logger
15
+ @alert_threshold = config.fetch(:alert_threshold, DEFALUT_ALERT_THRESHOLD)
16
+ @warning_threshold = config.fetch(:warning_threshold, DEFAULT_WARNING_THRESHOLD)
12
17
  end
13
18
 
14
19
  def render(events)
15
20
  return if events.to_a.empty?
16
21
 
17
- log_sepertor
18
- log " Performance Report".green
19
- log_sepertor
22
+ with_layout do
23
+ events.each do |event|
24
+ log "#{'..' * event.indent}#{event.name} #{colorize_time(event.elapsed_time)}"
25
+ end
26
+ end
27
+ end
20
28
 
21
- events.each do |event|
22
- log "#{'..' * event.indent}#{event.name} #{colorize_time(event.elapsed_time)}"
29
+ def render_error(message)
30
+ with_layout do
31
+ @logger.error message
23
32
  end
24
- log_sepertor
25
33
  end
26
34
 
27
35
  private
28
36
 
37
+ def with_layout
38
+ log_sepertor
39
+ log ColorizedString[" Performance Report"].green
40
+ log_sepertor
41
+ yield
42
+ log_sepertor
43
+ end
44
+
29
45
  def log_sepertor
30
- log "=========================================================="
46
+ log "=" * 60
31
47
  end
32
48
 
33
49
  def log(text)
@@ -36,10 +52,12 @@ module Capistrano
36
52
 
37
53
  def colorize_time(time_spent)
38
54
  return if time_spent.nil?
39
- color = (time_spent > ALERT_TRASHOLD ? :red : (time_spent > WARNING_TRASHOLD ? :yellow : :green))
40
- "#{time_spent}s".send(color)
55
+ ColorizedString["#{time_spent}s"].colorize(color(time_spent))
41
56
  end
42
57
 
58
+ def color(time_spent)
59
+ (time_spent > alert_threshold ? :red : (time_spent > warning_threshold ? :yellow : :green))
60
+ end
43
61
  end
44
62
  end
45
63
  end
@@ -42,7 +42,7 @@ module Capistrano
42
42
  end
43
43
 
44
44
  def report_events
45
- raise 'Performance measure is not completed' unless @open_events.empty?
45
+ raise ::Capistrano::Measure::Error, "Performance evaluation is not yet completed, as there are events still open: #{@open_events.map(&:name).join(', ')}" unless @open_events.empty?
46
46
  return to_enum(__callee__) unless block_given?
47
47
 
48
48
  (events + [Event.new]).each_cons(2) do |event, next_event|
@@ -55,7 +55,7 @@ module Capistrano
55
55
  def close_event(event_name)
56
56
  event = Event.new(event_name, :stop, Time.now, @indent-1)
57
57
  open_event = @open_events.last
58
- raise "You're trying to stop unstarted event" unless event.eq?(open_event)
58
+ raise ::Capistrano::Measure::Error, "Cannot estimate time for event `#{event_name}`" unless event.eq?(open_event)
59
59
 
60
60
  event.elapsed_time = (event.time - open_event.time).to_i
61
61
  event
@@ -1,5 +1,5 @@
1
1
  module Capistrano
2
2
  module Measure
3
- VERSION = "0.8.1"
3
+ VERSION = "0.10.0"
4
4
  end
5
5
  end
@@ -3,6 +3,7 @@ require 'capistrano/measure/version'
3
3
  require 'capistrano/measure/timer'
4
4
  require 'capistrano/measure/log_reporter'
5
5
  require 'capistrano/measure/adapter'
6
+ require 'capistrano/measure/error'
6
7
 
7
8
  case ::Capistrano::Measure::Adapter::capistrano_version
8
9
  when 2
@@ -10,7 +11,7 @@ when 2
10
11
  when 3
11
12
  require 'capistrano/measure/integration/capistrano_3'
12
13
  else
13
- raise 'This version of Capistrano is not supported.'
14
+ raise ::Capistrano::Measure::Error, 'This version of Capistrano is not supported.'
14
15
  end
15
16
 
16
17
  module Capistrano
@@ -5,7 +5,8 @@ require 'capistrano/measure/adapter'
5
5
 
6
6
  describe Capistrano::Measure::Adapter do
7
7
  let(:logger) { ::StringLogger.new }
8
- subject { Capistrano::Measure::Adapter.new(logger) }
8
+ let(:config) { {} }
9
+ subject { Capistrano::Measure::Adapter.new(logger, config) }
9
10
 
10
11
  it "end-to-end test" do
11
12
  subject.before_task('root_task')
@@ -19,7 +20,31 @@ describe Capistrano::Measure::Adapter do
19
20
 
20
21
  subject.print_report
21
22
 
22
- expect(logger.to_s).not_to be_empty
23
+ expect(logger.to_s).to include("Performance Report")
24
+ expect(logger.to_s).to include("root_task")
25
+ expect(logger.to_s).to include("..sub_task")
26
+ expect(logger.to_s).to include("....sub_task1")
27
+ end
28
+
29
+ it "doesn't rise any errors by default" do
30
+ subject.before_task('root_task')
31
+ subject.after_task('sub_task')
32
+
33
+ subject.print_report
34
+
35
+ expect(logger.to_s).to include("Capistrano::Measure plugin encountered an error during performance evaluation")
36
+ end
37
+
38
+ it "raises an error in debug mode (and interrupts the deployment)" do
39
+ config[:measure_error_handling] = :raise
40
+
41
+ expect {
42
+ subject.before_task('root_task')
43
+ subject.after_task('sub_task')
44
+
45
+ subject.print_report
46
+ }.to raise_error(::Capistrano::Measure::Error)
47
+
23
48
  end
24
49
 
25
50
  describe "::capistrano_version" do
@@ -5,25 +5,36 @@ LogItem = Struct.new(:indent, :name, :elapsed_time)
5
5
 
6
6
  describe Capistrano::Measure::LogReporter do
7
7
  let(:logger) { ::StringLogger.new }
8
- subject { Capistrano::Measure::LogReporter.new(logger) }
9
-
10
- it "should be able to create with default logger" do
11
- expect(::Logger).to receive(:new).with(STDOUT)
12
- Capistrano::Measure::LogReporter.new
13
- end
8
+ let(:config) { {} }
9
+ subject { Capistrano::Measure::LogReporter.new(logger, config) }
14
10
 
15
11
  describe "#render" do
16
12
  {green: [0, 30], yellow: [31, 60], red: [61, 100]}.each do |color, times|
17
13
  times.each do |elapsed_time|
18
14
  it "should render line with time in #{color} when elapsed time eq #{elapsed_time}" do
19
15
  subject.render([LogItem.new(0, 'test', elapsed_time)])
20
- colorized_time = "#{elapsed_time}s".send(color)
16
+ colorized_time = ColorizedString["#{elapsed_time}s"].colorize(color)
21
17
 
22
18
  expect(logger.to_s).to include("test #{colorized_time}\n")
23
19
  end
24
20
  end
25
21
  end
26
22
 
23
+ context "with changed thresholds" do
24
+ let(:config) { { warning_threshold: 20, alert_threshold: 30 } }
25
+
26
+ {green: [0, 20], yellow: [21, 30], red: [31, 100]}.each do |color, times|
27
+ times.each do |elapsed_time|
28
+ it "should render line with time in #{color} when elapsed time eq #{elapsed_time}" do
29
+ subject.render([LogItem.new(0, 'test', elapsed_time)])
30
+ colorized_time = ColorizedString["#{elapsed_time}s"].colorize(color)
31
+
32
+ expect(logger.to_s).to include("test #{colorized_time}\n")
33
+ end
34
+ end
35
+ end
36
+ end
37
+
27
38
  it "should not render empty report" do
28
39
  subject.render([])
29
40
  expect(logger.to_s).to eq ""
@@ -1,4 +1,5 @@
1
1
  require 'spec_helper'
2
+ require 'capistrano/measure/error'
2
3
  require 'capistrano/measure/timer'
3
4
 
4
5
  describe Capistrano::Measure::Timer do
@@ -75,14 +76,14 @@ describe Capistrano::Measure::Timer do
75
76
  end
76
77
 
77
78
  it "should raise exception with unstarted event" do
78
- expect{ subject.stop('test123') }.to raise_exception
79
+ expect{ subject.stop('test123') }.to raise_error(::Capistrano::Measure::Error)
79
80
  end
80
81
  end
81
82
 
82
83
  describe "#report_events" do
83
84
  it "should raise exception if called in the middle of process" do
84
85
  subject.start('test')
85
- expect{ subject.report_events }.to raise_exception
86
+ expect{ subject.report_events }.to raise_error(::Capistrano::Measure::Error)
86
87
  end
87
88
 
88
89
  context "in completed state" do
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: capistrano-measure
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.1
4
+ version: 0.10.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Artūrs Mekšs
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-10-27 00:00:00.000000000 Z
11
+ date: 2016-10-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: capistrano
@@ -31,19 +31,19 @@ dependencies:
31
31
  - !ruby/object:Gem::Version
32
32
  version: '4'
33
33
  - !ruby/object:Gem::Dependency
34
- name: colored
34
+ name: colorize
35
35
  requirement: !ruby/object:Gem::Requirement
36
36
  requirements:
37
- - - "~>"
37
+ - - ">="
38
38
  - !ruby/object:Gem::Version
39
- version: '1.2'
39
+ version: 0.8.1
40
40
  type: :runtime
41
41
  prerelease: false
42
42
  version_requirements: !ruby/object:Gem::Requirement
43
43
  requirements:
44
- - - "~>"
44
+ - - ">="
45
45
  - !ruby/object:Gem::Version
46
- version: '1.2'
46
+ version: 0.8.1
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: bundler
49
49
  requirement: !ruby/object:Gem::Requirement
@@ -111,6 +111,7 @@ extra_rdoc_files: []
111
111
  files:
112
112
  - ".gitignore"
113
113
  - ".rspec"
114
+ - ".travis.yml"
114
115
  - Gemfile
115
116
  - LICENSE.txt
116
117
  - README.md
@@ -119,6 +120,7 @@ files:
119
120
  - lib/capistrano-measure.rb
120
121
  - lib/capistrano/measure.rb
121
122
  - lib/capistrano/measure/adapter.rb
123
+ - lib/capistrano/measure/error.rb
122
124
  - lib/capistrano/measure/integration/capistrano_2.rb
123
125
  - lib/capistrano/measure/integration/capistrano_3.rb
124
126
  - lib/capistrano/measure/log_reporter.rb
@@ -149,7 +151,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
149
151
  version: '0'
150
152
  requirements: []
151
153
  rubyforge_project:
152
- rubygems_version: 2.2.2
154
+ rubygems_version: 2.5.1
153
155
  signing_key:
154
156
  specification_version: 4
155
157
  summary: Capistrano deployment speed measure tool