percy-common 1.1.0 → 1.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 +4 -4
- data/.rspec +1 -1
- data/.rubocop.yml +7 -0
- data/.travis.yml +4 -2
- data/Guardfile +16 -0
- data/README.md +96 -0
- data/Rakefile +1 -1
- data/lib/percy/common/version.rb +1 -1
- data/lib/percy/keyword_struct.rb +21 -0
- data/lib/percy/process_helpers.rb +27 -0
- data/lib/percy/stats.rb +1 -1
- data/percy-common.gemspec +3 -1
- metadata +36 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a652130076a2b0813f00bb165c51b299824510bc
|
4
|
+
data.tar.gz: 9fb9173c1160f0ce954d90fd28c58b00aa1e027f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 508907f4ae23369340fd5f34a03dbf98c2b51eb12fcf0931575b1c8fa9d506525fa502939ba46bf48c8cbc2ffe51d9fab8f8a62a80b770b54a9d33fa2b1385f8
|
7
|
+
data.tar.gz: f06831d5d30151b47fa2c60f98cd520e4a036845a7a52c2ad98e27e900a00bab568e8b70bbe0ba382eee97aa15d1f2e873c3b325d20e350e66ab18bff46bb06e
|
data/.rspec
CHANGED
data/.rubocop.yml
ADDED
data/.travis.yml
CHANGED
data/Guardfile
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
# More info at https://github.com/guard/guard#readme
|
2
|
+
|
3
|
+
guard :rspec, cmd: 'bundle exec rspec' do
|
4
|
+
require 'guard/rspec/dsl'
|
5
|
+
dsl = Guard::RSpec::Dsl.new(self)
|
6
|
+
|
7
|
+
# RSpec files
|
8
|
+
rspec = dsl.rspec
|
9
|
+
watch(rspec.spec_helper) { rspec.spec_dir }
|
10
|
+
watch(rspec.spec_support) { rspec.spec_dir }
|
11
|
+
watch(rspec.spec_files)
|
12
|
+
|
13
|
+
# Ruby files
|
14
|
+
ruby = dsl.ruby
|
15
|
+
dsl.watch_spec_files_for(ruby.lib_files)
|
16
|
+
end
|
data/README.md
CHANGED
@@ -1,3 +1,99 @@
|
|
1
1
|
# percy-common
|
2
2
|
|
3
3
|
Server-side common library for Percy.
|
4
|
+
|
5
|
+
## Percy::KeywordStruct
|
6
|
+
|
7
|
+
A simple struct that can be used when you need to return a simple value object.
|
8
|
+
|
9
|
+
```ruby
|
10
|
+
require 'percy/keyword_struct'
|
11
|
+
|
12
|
+
class Foo < Percy::KeywordStruct.new(:bar, :baz, :qux)
|
13
|
+
end
|
14
|
+
|
15
|
+
foo = Foo.new(bar: 123, baz: true)
|
16
|
+
foo.bar # --> 123
|
17
|
+
foo.baz # --> true
|
18
|
+
foo.qux # --> nil
|
19
|
+
foo.fake # --> raises NoMethodError
|
20
|
+
```
|
21
|
+
|
22
|
+
## Percy.logger
|
23
|
+
|
24
|
+
```ruby
|
25
|
+
require 'percy/logger'
|
26
|
+
|
27
|
+
Percy.logger.debug { 'debug log' }
|
28
|
+
Percy.logger.info { 'info log' }
|
29
|
+
Percy.logger.warn { 'warning log' }
|
30
|
+
Percy.logger.error { 'error message' }
|
31
|
+
```
|
32
|
+
|
33
|
+
Prefer the block form usage `Percy.logger.debug { 'message' }` over `Percy.logger.debug('message')` because it is slightly more efficient when the log will be excluded by the current logging level. For example, if the log level is currently `info`, then a `debug` log in block form will never evaluate or allocate the message string itself.
|
34
|
+
|
35
|
+
## Percy::ProcessHelpers
|
36
|
+
|
37
|
+
### `gracefully_kill(pid[, grace_period_seconds: 10])`
|
38
|
+
|
39
|
+
Returns `true` if the process was successfully killed, or `false` if the process did not exist or its exit status was already collected.
|
40
|
+
|
41
|
+
```ruby
|
42
|
+
require 'percy/process_helpers'
|
43
|
+
|
44
|
+
Percy::ProcessHelpers.gracefully_kill(pid)
|
45
|
+
```
|
46
|
+
|
47
|
+
This will send `SIGTERM` to the process, wait up to 10 seconds, then send `SIGKILL` if it has not already shut down.
|
48
|
+
|
49
|
+
## Percy::Stats
|
50
|
+
|
51
|
+
Client for recording Datadog metrics and automatically setting up Percy-specific environment tags.
|
52
|
+
|
53
|
+
This class is a wrapper for [Datadog::Statsd](https://github.com/DataDog/dogstatsd-ruby), an extended client for DogStatsD, which extends the StatsD metric server for Datadog.
|
54
|
+
|
55
|
+
Basic usage includes:
|
56
|
+
|
57
|
+
```ruby
|
58
|
+
require 'percy/stats'
|
59
|
+
|
60
|
+
stats = Percy::Stats.new
|
61
|
+
|
62
|
+
# Increment a counter.
|
63
|
+
stats.increment('page.views')
|
64
|
+
|
65
|
+
# Record a gauge 50% of the time.
|
66
|
+
stats.gauge('users.online', 123, sample_rate: 0.5)
|
67
|
+
|
68
|
+
# Sample a histogram.
|
69
|
+
stats.histogram('file.upload.size', 1234)
|
70
|
+
|
71
|
+
# Time a block of code.
|
72
|
+
stats.time('page.render') do
|
73
|
+
render_page('home.html')
|
74
|
+
end
|
75
|
+
|
76
|
+
# Send several metrics at the same time.
|
77
|
+
# All metrics will be buffered and sent in one packet when the block completes.
|
78
|
+
stats.batch do |s|
|
79
|
+
s.increment('page.views')
|
80
|
+
s.gauge('users.online', 123)
|
81
|
+
end
|
82
|
+
|
83
|
+
# Tag a metric.
|
84
|
+
stats.histogram('query.time', 10, tags: ['version:1'])
|
85
|
+
```
|
86
|
+
|
87
|
+
See the [Datadog::Statsd](https://github.com/DataDog/dogstatsd-ruby) docs for more usage.
|
88
|
+
|
89
|
+
Our wrapper adds support for a non-block based `start_timing` and `stop_timing` methods:
|
90
|
+
|
91
|
+
```ruby
|
92
|
+
require 'percy/stats'
|
93
|
+
|
94
|
+
stats = Percy::Stats.new
|
95
|
+
|
96
|
+
stats.start_timing
|
97
|
+
account.activate!
|
98
|
+
stats.stop_timing('account.activate')
|
99
|
+
```
|
data/Rakefile
CHANGED
data/lib/percy/common/version.rb
CHANGED
@@ -0,0 +1,21 @@
|
|
1
|
+
# A struct that only allows keyword arguments.
|
2
|
+
# For example, this should be used to create value objects that are returned from service methods,
|
3
|
+
# instead of just returning a hash.
|
4
|
+
#
|
5
|
+
# Usage:
|
6
|
+
# class Foo < Percy::KeywordStruct.new(:bar, :baz, :qux)
|
7
|
+
# end
|
8
|
+
#
|
9
|
+
# foo = Foo.new(bar: 123, baz: true)
|
10
|
+
# foo.bar # --> 123
|
11
|
+
# foo.baz # --> true
|
12
|
+
# foo.qux # --> nil
|
13
|
+
# foo.fake # --> raises NoMethodError
|
14
|
+
module Percy
|
15
|
+
class KeywordStruct < Struct
|
16
|
+
def initialize(**kwargs)
|
17
|
+
super(kwargs.keys)
|
18
|
+
kwargs.each { |k, v| self[k] = v }
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'timeout'
|
2
|
+
|
3
|
+
module Percy
|
4
|
+
class ProcessHelpers
|
5
|
+
DEFAULT_TERM_GRACE_SECONDS = 10
|
6
|
+
|
7
|
+
def self.gracefully_kill(pid, grace_period_seconds: DEFAULT_TERM_GRACE_SECONDS)
|
8
|
+
begin
|
9
|
+
Process.kill('TERM', pid)
|
10
|
+
Timeout.timeout(grace_period_seconds) do
|
11
|
+
Process.wait(pid)
|
12
|
+
end
|
13
|
+
rescue Errno::ESRCH
|
14
|
+
# No such process.
|
15
|
+
return false
|
16
|
+
rescue Errno::ECHILD
|
17
|
+
# Status has already been collected, perhaps by a Process.detach thread.
|
18
|
+
return false
|
19
|
+
rescue Timeout::Error
|
20
|
+
Process.kill('KILL', pid)
|
21
|
+
# Collect status so it doesn't stick around as zombie process.
|
22
|
+
Process.wait(pid, Process::WNOHANG)
|
23
|
+
end
|
24
|
+
true
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
data/lib/percy/stats.rb
CHANGED
@@ -20,7 +20,7 @@ module Percy
|
|
20
20
|
end
|
21
21
|
|
22
22
|
def stop_timing(stat, options = {})
|
23
|
-
raise 'no timing started'
|
23
|
+
raise 'no timing started' unless @_timing_start # Programmer mistake, so raise an error.
|
24
24
|
time_since(stat, @_timing_start, options)
|
25
25
|
@_timing_start = nil
|
26
26
|
true
|
data/percy-common.gemspec
CHANGED
@@ -19,7 +19,9 @@ Gem::Specification.new do |spec|
|
|
19
19
|
spec.add_dependency 'dogstatsd-ruby', '~> 1.6'
|
20
20
|
spec.add_dependency 'syslog-logger', '~> 1.6'
|
21
21
|
|
22
|
-
spec.add_development_dependency 'bundler', '~> 1.
|
22
|
+
spec.add_development_dependency 'bundler', '~> 1.15'
|
23
23
|
spec.add_development_dependency 'rake', '~> 10.0'
|
24
24
|
spec.add_development_dependency 'rspec', '~> 3.2'
|
25
|
+
spec.add_development_dependency 'guard-rspec', '~> 4.7'
|
26
|
+
spec.add_development_dependency 'percy-style'
|
25
27
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: percy-common
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Perceptual Inc.
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2017-07-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: dogstatsd-ruby
|
@@ -44,14 +44,14 @@ dependencies:
|
|
44
44
|
requirements:
|
45
45
|
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: '1.
|
47
|
+
version: '1.15'
|
48
48
|
type: :development
|
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: '1.
|
54
|
+
version: '1.15'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: rake
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -80,6 +80,34 @@ dependencies:
|
|
80
80
|
- - "~>"
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: '3.2'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: guard-rspec
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '4.7'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - "~>"
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '4.7'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: percy-style
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - ">="
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - ">="
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
83
111
|
description: ''
|
84
112
|
email:
|
85
113
|
- team@percy.io
|
@@ -89,14 +117,18 @@ extra_rdoc_files: []
|
|
89
117
|
files:
|
90
118
|
- ".gitignore"
|
91
119
|
- ".rspec"
|
120
|
+
- ".rubocop.yml"
|
92
121
|
- ".travis.yml"
|
93
122
|
- Gemfile
|
123
|
+
- Guardfile
|
94
124
|
- LICENSE
|
95
125
|
- README.md
|
96
126
|
- Rakefile
|
97
127
|
- lib/percy/common.rb
|
98
128
|
- lib/percy/common/version.rb
|
129
|
+
- lib/percy/keyword_struct.rb
|
99
130
|
- lib/percy/logger.rb
|
131
|
+
- lib/percy/process_helpers.rb
|
100
132
|
- lib/percy/stats.rb
|
101
133
|
- percy-common.gemspec
|
102
134
|
homepage: ''
|