percy-common 3.0.0 → 3.1.2.rc.1

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
  SHA256:
3
- metadata.gz: c0fe4132dddef08590d485a30d755fa43e95bc0cc4569b0f716e25c756c5dca5
4
- data.tar.gz: 9de9dbc2f26404e03f22175bfc742080df122824d9510197a23a0f55c8ca0c65
3
+ metadata.gz: 71a703d0ab1210e46a8650fca96cbba72578e3d95d68825ff7c415d2c4ac89b7
4
+ data.tar.gz: 3b66f2835412dfb59009fe71f7dd983b04e05921fabd204ce1fafab6a14742c0
5
5
  SHA512:
6
- metadata.gz: 4063a9ab97a6a5e30774733dbe8922dc690b6556f80f6a3c28651043e050043ea5a76b4de1220a2e3f3fa0688968a259fe9eaba7a77f11699fb9a9e5348f68ab
7
- data.tar.gz: 89cb3605660c98e521e3f08c72be55b3517236ee3702dda10c65d09c35eaa855b5b6715d2e349359c34e8fdb41020139dce834e8a3acb2ff7457e0bfe4e6b641
6
+ metadata.gz: 9ecdee8f494735c6865d6fc75d059db6dd2a04d68a6988483145c8b03100b39a8e5b02a5b01167b5bdbc131881da528995515a10967259dca3d39a8814d1966d
7
+ data.tar.gz: 54401332070ec4a7c5c6fd3427447237578cb557c862d56177150fec97b7c69d3552d4d81ea93a27c2ba5940c392315ba862a5c4ea1b145f28a0a7b9555c1c69
@@ -1,3 +1,5 @@
1
+ inherit_from: .rubocop_todo.yml
2
+
1
3
  inherit_gem:
2
4
  percy-style:
3
5
  - default.yml
@@ -9,3 +11,7 @@ inherit_mode:
9
11
  RSpec/DescribeClass:
10
12
  Exclude:
11
13
  - spec/percy/logger_spec.rb
14
+
15
+ AllCops:
16
+ Exclude:
17
+ - spec/support/redis_mock.rb
@@ -0,0 +1,12 @@
1
+ # This configuration was generated by
2
+ # `rubocop --auto-gen-config`
3
+ # on 2020-04-30 16:00:36 -0700 using RuboCop version 0.77.0.
4
+ # The point is for the user to remove these configuration records
5
+ # one by one as the offenses are removed from the code base.
6
+ # Note that changes in the inspected code, or installation of new
7
+ # versions of RuboCop, may require this file to be generated again.
8
+
9
+ # Offense count: 1
10
+ RSpec/LeakyConstantDeclaration:
11
+ Exclude:
12
+ - 'spec/percy/keyword_struct_spec.rb'
@@ -1,16 +1,13 @@
1
1
  # Releasing
2
2
 
3
- 1. `git pull origin master`
4
- 1. Bump the version number in `lib/percy/common/version.rb`
5
- 1. `git add lib/percy/common/version.rb`
6
- 1. `git commit -m "version bump to X.X.X"`
7
- 1. `git push origin master`
8
- 1. `git tag vX.X.X`
9
- 1. `git push --tags`
10
- 1. `bundle exec rake build`
11
- 1. `gem push pkg/percy-common-X.X.X.gem`
3
+ 1. Ensure you are on the expected branch (presumably `master`) and the current branch is up-to-date.
4
+ 1. Run `./release.sh`
12
5
  1. Visit [RubyGems.org](https://rubygems.org/gems/percy-common) and see the gem has been published
13
- 1. Document the release on Github by first [creating a new release](https://github.com/percy/percy-common/releases/new)
6
+
7
+ # Creating a Release on GitHub
8
+
9
+ Finish the pre-started release opened by the script, or [create a new release](https://github.com/percy/percy-common/releases/new):
10
+
14
11
  1. Enter "vX.X.X" as the tag version. It should auto complete to say "Existing Tag"
15
12
  1. Enter "vX.X.X" as the release title
16
13
  1. Write a brief description as to what is included in this release. Linking to specific PRs is great.
@@ -1,5 +1,5 @@
1
1
  module Percy
2
2
  module Common
3
- VERSION = '3.0.0'.freeze
3
+ VERSION = '3.1.2.rc.1'.freeze
4
4
  end
5
5
  end
@@ -2,7 +2,8 @@ require 'logger'
2
2
 
3
3
  module Percy
4
4
  def self.logger
5
- @logger if defined?(@logger)
5
+ return @logger if defined?(@logger)
6
+
6
7
  @logger ||= Logger.new(STDOUT)
7
8
  @logger.level = Logger::INFO if ENV['PERCY_ENV'] == 'production'
8
9
  @logger.formatter = proc do |severity, _datetime, _progname, msg|
@@ -0,0 +1,101 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'redis'
4
+
5
+ module Percy
6
+ class RedisClient
7
+ class InvalidConfiguration < ArgumentError
8
+ end
9
+ attr_reader :client
10
+ attr_reader :options
11
+
12
+ def initialize(given_options = {})
13
+ @provided_options = given_options
14
+ @options = ssl_params.merge(given_options)
15
+ @client = ::Redis.new(options)
16
+ end
17
+
18
+ private def ssl_enabled?
19
+ provided_url.to_s.start_with?('rediss://')
20
+ end
21
+
22
+ private def provided_url
23
+ @provided_options&.dig(:url)
24
+ end
25
+
26
+ private def ssl_options
27
+ {
28
+ ssl: ssl_enabled?,
29
+ ssl_params: ssl_params,
30
+ }
31
+ end
32
+
33
+ private def ssl_params
34
+ return {} unless ssl_enabled?
35
+
36
+ {
37
+ ca_file: certificate_authority,
38
+ cert: OpenSSL::X509::Certificate.new(client_certificate),
39
+ key: OpenSSL::PKey::RSA.new(private_key),
40
+ }
41
+ end
42
+
43
+ private def client_certificate
44
+ @provided_options&.dig(:ssl_params, :cert) ||
45
+ client_certificate_from_env ||
46
+ client_certificate_from_path
47
+ end
48
+
49
+ private def client_certificate_from_env
50
+ ENV['REDIS_SSL_CLIENT_CERTIFICATE']
51
+ end
52
+
53
+ private def client_certificate_from_path
54
+ File.read(fetch_key('REDIS_SSL_CLIENT_CERTIFICATE_PATH'))
55
+ end
56
+
57
+ private def private_key
58
+ provided_private_key ||
59
+ private_key_from_env ||
60
+ private_key_from_path
61
+ end
62
+
63
+ private def provided_private_key
64
+ @provided_options&.dig(:ssl_params, :key)
65
+ end
66
+
67
+ private def private_key_from_env
68
+ ENV['REDIS_SSL_PRIVATE_KEY']
69
+ end
70
+
71
+ private def private_key_from_path
72
+ File.read(fetch_key('REDIS_SSL_PRIVATE_KEY_PATH'))
73
+ end
74
+
75
+ private def certificate_authority
76
+ provided_certificate_authority ||
77
+ certificate_authority_from_env ||
78
+ certificate_authority_from_path
79
+ end
80
+
81
+ private def provided_certificate_authority
82
+ @provided_options&.dig(:ssl_params, :ca_file)
83
+ end
84
+
85
+ private def certificate_authority_from_env
86
+ ENV['REDIS_SSL_CERTIFICATE_AUTHORITY']
87
+ end
88
+
89
+ private def certificate_authority_from_path
90
+ File.read(fetch_key('REDIS_SSL_CERTIFICATE_AUTHORITY_PATH'))
91
+ end
92
+
93
+ private def fetch_key(key)
94
+ ENV.fetch(key) { missing_key(key) }
95
+ end
96
+
97
+ private def missing_key(key)
98
+ raise InvalidConfiguration, "#{key} is not defined"
99
+ end
100
+ end
101
+ end
@@ -44,15 +44,31 @@ module Percy
44
44
  # Programmer mistake, so raise an error.
45
45
  raise 'no timing started' unless @_timing_start
46
46
 
47
- time_since(stat, @_timing_start, options)
47
+ time_since_monotonic(stat, @_timing_start, options)
48
48
  @_timing_start = nil
49
49
  true
50
50
  end
51
51
 
52
- def time_since(stat, start, opts = {})
52
+ # dogstatsd uses a monotonic (linearly increasing) clock to calculate time
53
+ # intervals, so this should be used where necessary. However, it's not
54
+ # possible to compare monotonic time values with fixed times, so both are
55
+ # available.
56
+ def time_since_monotonic(stat, start, opts = {})
57
+ unless start.instance_of? Float
58
+ raise ArgumentError, 'start value must be Float'
59
+ end
60
+
53
61
  timing(stat, ((now.to_f - start.to_f) * 1000).round, opts)
54
62
  end
55
63
 
64
+ def time_since(stat, start, opts = {})
65
+ unless start.instance_of? Time
66
+ raise ArgumentError, 'start value must be Time'
67
+ end
68
+
69
+ timing(stat, ((Time.now.to_f - start.to_f) * 1000).round, opts)
70
+ end
71
+
56
72
  private def now
57
73
  Process.clock_gettime(Process::CLOCK_MONOTONIC)
58
74
  end
@@ -1,5 +1,4 @@
1
- # coding: utf-8
2
- lib = File.expand_path('../lib', __FILE__)
1
+ lib = File.expand_path('lib', __dir__)
3
2
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
3
  require 'percy/common/version'
5
4
 
@@ -9,19 +8,22 @@ Gem::Specification.new do |spec|
9
8
  spec.authors = ['Perceptual Inc.']
10
9
  spec.email = ['team@percy.io']
11
10
 
12
- spec.summary = %q{Server-side common library for Percy.}
13
- spec.description = %q{}
11
+ spec.summary = 'Server-side common library for Percy.'
12
+ spec.description = ''
14
13
  spec.homepage = ''
15
14
 
16
- spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
15
+ spec.files = `git ls-files -z`.split("\x0").reject do |f|
16
+ f.match(/^(test|spec|features)\//)
17
+ end
17
18
  spec.require_paths = ['lib']
18
19
 
19
20
  spec.add_dependency 'dogstatsd-ruby', '~> 4.4.0'
20
21
  spec.add_dependency 'excon', '~> 0.57'
22
+ spec.add_dependency 'redis', '>= 4.1.3', '< 5.0.0'
21
23
 
22
- spec.add_development_dependency 'bundler', '~> 2.0.2'
23
- spec.add_development_dependency 'rake', '~> 10.0'
24
- spec.add_development_dependency 'rspec', '~> 3.2'
24
+ spec.add_development_dependency 'bundler', '~> 2.1.4'
25
25
  spec.add_development_dependency 'guard-rspec', '~> 4.7'
26
- spec.add_development_dependency 'percy-style', '~> 0.6.0'
26
+ spec.add_development_dependency 'percy-style', '~> 0.7.0'
27
+ spec.add_development_dependency 'rake', '~> 12.3'
28
+ spec.add_development_dependency 'rspec', '~> 3.2'
27
29
  end
@@ -0,0 +1,64 @@
1
+ #!/usr/bin/env bash
2
+
3
+ set -e
4
+
5
+ cd "$(dirname "$0")" || exit 1
6
+ CURDIR="$(pwd)"
7
+
8
+ PERCY_COMMON_VERSION="$(grep "VERSION" lib/percy/common/version.rb | awk -F "'" '{print $2}')"
9
+
10
+ echo "Current percy-common version: $PERCY_COMMON_VERSION"
11
+
12
+ if [[ $# -lt 1 ]]; then
13
+ echo "Usage $0 <version>"
14
+ exit 1
15
+ fi
16
+
17
+ rm "$CURDIR/"percy-common*.gem >/dev/null 2>&1 || true
18
+
19
+ delete_existing_version() {
20
+ git tag -d "v$1" || true
21
+ git push origin ":v$1" || true
22
+ gem yank "percy-common$1.gem" || true
23
+ }
24
+
25
+ if [[ $1 == 'delete' ]]; then
26
+ delete_existing_version "$PERCY_COMMON_VERSION"
27
+ else
28
+ CLEAN=$(
29
+ git diff-index --quiet HEAD --
30
+ echo $?
31
+ )
32
+ if [[ "$CLEAN" == "0" ]]; then
33
+ if [[ $1 == '--force' ]]; then
34
+ shift
35
+ if [[ -n $1 ]]; then
36
+ echo "Deleting version $1"
37
+ sleep 1
38
+ delete_existing_version "$1"
39
+ else
40
+ echo "Missing release version"
41
+ exit 1
42
+ fi
43
+ fi
44
+ VERSION=$1
45
+ echo "Releasing $VERSION"
46
+ sleep 1
47
+
48
+ sed -i "" -e "s/$PERCY_COMMON_VERSION/$VERSION/g" "lib/percy/common/version.rb"
49
+ git add "lib/percy/common/version.rb"
50
+ git commit -a -m "Release $VERSION" || true
51
+
52
+ git tag -a "v$VERSION" -m "$1" || true
53
+ git push origin "v$VERSION" || true
54
+
55
+ bundle exec rake build
56
+ gem push "$CURDIR/pkg/percy-common-$VERSION.gem"
57
+ open "https://github.com/percy/percy-common/releases/new?tag=v$VERSION&title=$VERSION"
58
+ rm "$CURDIR/pkg/percy-common-$VERSION.gem"
59
+ else
60
+ echo "Please commit your changes and try again"
61
+ exit 1
62
+ fi
63
+ fi
64
+ echo "Done"
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: 3.0.0
4
+ version: 3.1.2.rc.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Perceptual Inc.
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-07-16 00:00:00.000000000 Z
11
+ date: 2020-06-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: dogstatsd-ruby
@@ -38,76 +38,96 @@ dependencies:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0.57'
41
+ - !ruby/object:Gem::Dependency
42
+ name: redis
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: 4.1.3
48
+ - - "<"
49
+ - !ruby/object:Gem::Version
50
+ version: 5.0.0
51
+ type: :runtime
52
+ prerelease: false
53
+ version_requirements: !ruby/object:Gem::Requirement
54
+ requirements:
55
+ - - ">="
56
+ - !ruby/object:Gem::Version
57
+ version: 4.1.3
58
+ - - "<"
59
+ - !ruby/object:Gem::Version
60
+ version: 5.0.0
41
61
  - !ruby/object:Gem::Dependency
42
62
  name: bundler
43
63
  requirement: !ruby/object:Gem::Requirement
44
64
  requirements:
45
65
  - - "~>"
46
66
  - !ruby/object:Gem::Version
47
- version: 2.0.2
67
+ version: 2.1.4
48
68
  type: :development
49
69
  prerelease: false
50
70
  version_requirements: !ruby/object:Gem::Requirement
51
71
  requirements:
52
72
  - - "~>"
53
73
  - !ruby/object:Gem::Version
54
- version: 2.0.2
74
+ version: 2.1.4
55
75
  - !ruby/object:Gem::Dependency
56
- name: rake
76
+ name: guard-rspec
57
77
  requirement: !ruby/object:Gem::Requirement
58
78
  requirements:
59
79
  - - "~>"
60
80
  - !ruby/object:Gem::Version
61
- version: '10.0'
81
+ version: '4.7'
62
82
  type: :development
63
83
  prerelease: false
64
84
  version_requirements: !ruby/object:Gem::Requirement
65
85
  requirements:
66
86
  - - "~>"
67
87
  - !ruby/object:Gem::Version
68
- version: '10.0'
88
+ version: '4.7'
69
89
  - !ruby/object:Gem::Dependency
70
- name: rspec
90
+ name: percy-style
71
91
  requirement: !ruby/object:Gem::Requirement
72
92
  requirements:
73
93
  - - "~>"
74
94
  - !ruby/object:Gem::Version
75
- version: '3.2'
95
+ version: 0.7.0
76
96
  type: :development
77
97
  prerelease: false
78
98
  version_requirements: !ruby/object:Gem::Requirement
79
99
  requirements:
80
100
  - - "~>"
81
101
  - !ruby/object:Gem::Version
82
- version: '3.2'
102
+ version: 0.7.0
83
103
  - !ruby/object:Gem::Dependency
84
- name: guard-rspec
104
+ name: rake
85
105
  requirement: !ruby/object:Gem::Requirement
86
106
  requirements:
87
107
  - - "~>"
88
108
  - !ruby/object:Gem::Version
89
- version: '4.7'
109
+ version: '12.3'
90
110
  type: :development
91
111
  prerelease: false
92
112
  version_requirements: !ruby/object:Gem::Requirement
93
113
  requirements:
94
114
  - - "~>"
95
115
  - !ruby/object:Gem::Version
96
- version: '4.7'
116
+ version: '12.3'
97
117
  - !ruby/object:Gem::Dependency
98
- name: percy-style
118
+ name: rspec
99
119
  requirement: !ruby/object:Gem::Requirement
100
120
  requirements:
101
121
  - - "~>"
102
122
  - !ruby/object:Gem::Version
103
- version: 0.6.0
123
+ version: '3.2'
104
124
  type: :development
105
125
  prerelease: false
106
126
  version_requirements: !ruby/object:Gem::Requirement
107
127
  requirements:
108
128
  - - "~>"
109
129
  - !ruby/object:Gem::Version
110
- version: 0.6.0
130
+ version: '3.2'
111
131
  description: ''
112
132
  email:
113
133
  - team@percy.io
@@ -119,6 +139,7 @@ files:
119
139
  - ".gitignore"
120
140
  - ".rspec"
121
141
  - ".rubocop.yml"
142
+ - ".rubocop_todo.yml"
122
143
  - Gemfile
123
144
  - Guardfile
124
145
  - LICENSE
@@ -132,8 +153,10 @@ files:
132
153
  - lib/percy/logger.rb
133
154
  - lib/percy/network_helpers.rb
134
155
  - lib/percy/process_helpers.rb
156
+ - lib/percy/redis_client.rb
135
157
  - lib/percy/stats.rb
136
158
  - percy-common.gemspec
159
+ - release.sh
137
160
  homepage: ''
138
161
  licenses: []
139
162
  metadata: {}
@@ -148,12 +171,11 @@ required_ruby_version: !ruby/object:Gem::Requirement
148
171
  version: '0'
149
172
  required_rubygems_version: !ruby/object:Gem::Requirement
150
173
  requirements:
151
- - - ">="
174
+ - - ">"
152
175
  - !ruby/object:Gem::Version
153
- version: '0'
176
+ version: 1.3.1
154
177
  requirements: []
155
- rubyforge_project:
156
- rubygems_version: 2.7.8
178
+ rubygems_version: 3.1.2
157
179
  signing_key:
158
180
  specification_version: 4
159
181
  summary: Server-side common library for Percy.