chamber 2.12.3 → 2.12.5

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
- SHA1:
3
- metadata.gz: 553e93e239b69f83d7fe5fb0cda5153fcc0f8ce7
4
- data.tar.gz: 3d9007fe77914b4e7d88a1665cce0fb4291a9c32
2
+ SHA256:
3
+ metadata.gz: 425f228909eed866d3e32a614a37f4c5d6cfbb4245fe7b063a1373d40ed9aa99
4
+ data.tar.gz: eb9f9fec710e239379c6126344a958d45f57b9ce587e1a6084e32eb61fa6ea47
5
5
  SHA512:
6
- metadata.gz: ea0d5e559bf833679d176bc5a3930c1a49f1e3d2e14233ec6e7f33ae2fed039be9a725138824c7e03930bfbc2360f6ccb66bc4c51f61c3b8fa03a7d4de4e2723
7
- data.tar.gz: 6d9d274ddb7871100155501bc811bac435109fb2cd918aa7962f52e55c7270c206cad097dd61c4c4ee80ae73181f7e22177c2e11878896db9a8f9d87d544c97b
6
+ metadata.gz: f2a087b086635a2b23ece643d72f0f15eb4c3556ce235d27465165aab20e694182dcb67b12e821a3a9b4377ff4bdda7189a485208820cf65b1b399989eaf9f39
7
+ data.tar.gz: 0146d205f516a1c689aae1f3c29e80d252cc5a0bc68d73f44c4964fe6a8effdebddc40fbc7925393814a470743a5ab0ed52587d4f5c31db54f7dd024ea45f277
checksums.yaml.gz.sig CHANGED
Binary file
data.tar.gz.sig CHANGED
Binary file
data/README.md CHANGED
@@ -32,7 +32,7 @@ The names and logos for The Kompanee are trademarks of The Kompanee, Ltd.
32
32
 
33
33
  ## License
34
34
 
35
- Chamber is Copyright © 2014-2018 Jeff Felchner and Mark McEahern. It is free
35
+ Chamber is Copyright © 2014-2019 Jeff Felchner and Mark McEahern. It is free
36
36
  software, and may be redistributed under the terms specified in the
37
37
  [LICENSE][license] file.
38
38
 
@@ -25,7 +25,7 @@ class Base
25
25
  protected
26
26
 
27
27
  def rootpath=(other)
28
- @rootpath ||= Pathname.new(other)
28
+ @rootpath = Pathname.new(other)
29
29
  end
30
30
  end
31
31
  end
@@ -53,7 +53,7 @@ module Securable
53
53
  end
54
54
 
55
55
  `
56
- git ls-files --other --ignored --exclude-from=.gitignore |
56
+ git ls-files --other --ignored --exclude-per-directory=.gitignore |
57
57
  sed -e "s|^|#{Shellwords.escape(rootpath.to_s)}/|" |
58
58
  grep --colour=never -E '#{shell_escaped_chamber_filenames.join('|')}'
59
59
  `.split("\n")
@@ -30,6 +30,7 @@ class ContextResolver
30
30
  options[:basepath] ||= options[:rootpath]
31
31
  end
32
32
 
33
+ options[:namespaces] = resolve_namespaces(options[:namespaces])
33
34
  options[:encryption_keys] = Keys::Encryption.resolve(filenames: options[:encryption_keys],
34
35
  namespaces: options[:namespaces],
35
36
  rootpath: options[:rootpath])
@@ -52,6 +53,13 @@ class ContextResolver
52
53
 
53
54
  protected
54
55
 
56
+ def resolve_namespaces(other)
57
+ (other.respond_to?(:values) ? other.values : other)
58
+ .map do |namespace|
59
+ namespace.respond_to?(:call) ? namespace.call : namespace
60
+ end
61
+ end
62
+
55
63
  def resolve_preset
56
64
  if in_a_rails_project?
57
65
  'rails'
@@ -5,7 +5,16 @@ require 'base64'
5
5
  module Chamber
6
6
  module EncryptionMethods
7
7
  class Ssl
8
- LARGE_DATA_STRING_PATTERN = %r{\A([A-Za-z0-9\+\/#]*\={0,2})#([A-Za-z0-9\+\/#]*\={0,2})#([A-Za-z0-9\+\/#]*\={0,2})\z} # rubocop:disable Metrics/LineLength
8
+ BASE64_STRING_PATTERN = %r{[A-Za-z0-9\+\/#]*\={0,2}}.freeze
9
+ LARGE_DATA_STRING_PATTERN = /
10
+ \A
11
+ (#{BASE64_STRING_PATTERN})
12
+ \#
13
+ (#{BASE64_STRING_PATTERN})
14
+ \#
15
+ (#{BASE64_STRING_PATTERN})
16
+ \z
17
+ /x.freeze
9
18
 
10
19
  def self.encrypt(_key, value, encryption_keys)
11
20
  value = YAML.dump(value)
data/lib/chamber/file.rb CHANGED
@@ -70,10 +70,10 @@ class File < Pathname
70
70
  # ```
71
71
  #
72
72
  def to_settings
73
- @data ||= Settings.new(settings: file_contents_hash,
74
- namespaces: namespaces,
75
- decryption_keys: decryption_keys,
76
- encryption_keys: encryption_keys)
73
+ @to_settings ||= Settings.new(settings: file_contents_hash,
74
+ namespaces: namespaces,
75
+ decryption_keys: decryption_keys,
76
+ encryption_keys: encryption_keys)
77
77
  end
78
78
 
79
79
  # rubocop:disable Metrics/LineLength
@@ -92,13 +92,13 @@ class File < Pathname
92
92
  sub!(
93
93
  /^(\s*)#{secure_prefix_pattern}#{escaped_name}(\s*):(\s*)['"]?#{escaped_value}['"]?$/,
94
94
  "\\1#{secure_prefix}#{name_pieces.last}\\2:\\3#{secure_value}",
95
- )
95
+ )
96
96
 
97
97
  file_contents.
98
98
  sub!(
99
99
  /^(\s*)#{secure_prefix_pattern}#{escaped_name}(\s*):(\s*)\|((?:\n\1\s{2}.*)+)/,
100
100
  "\\1#{secure_prefix}#{name_pieces.last}\\2:\\3#{secure_value}",
101
- )
101
+ )
102
102
  end
103
103
 
104
104
  write(file_contents)
@@ -112,11 +112,11 @@ require 'chamber/settings'
112
112
  #
113
113
  module Chamber
114
114
  class FileSet
115
- attr_reader :namespaces,
116
- :paths
117
115
  attr_accessor :decryption_keys,
118
116
  :encryption_keys,
119
117
  :basepath
118
+ attr_reader :namespaces,
119
+ :paths
120
120
 
121
121
  def initialize(options = {})
122
122
  self.namespaces = options[:namespaces] || {}
@@ -247,7 +247,7 @@ class FileSet
247
247
  private
248
248
 
249
249
  def all_files
250
- @all_files ||= file_globs.map { |fg| Pathname.glob(fg) }.flatten.uniq.sort
250
+ @all_files ||= file_globs.map { |fg| Pathname.glob(fg) }.flatten.uniq.sort # rubocop:disable Performance/ChainArrayAllocation
251
251
  end
252
252
 
253
253
  def non_namespaced_files
@@ -7,9 +7,15 @@ require 'time'
7
7
  module Chamber
8
8
  module Files
9
9
  class Signature
10
- SIGNATURE_HEADER = '-----BEGIN CHAMBER SIGNATURE-----'
11
- SIGNATURE_FOOTER = '-----END CHAMBER SIGNATURE-----'
12
- SIGNATURE_IN_SIGNATURE_FILE_PATTERN = /#{SIGNATURE_HEADER}\n(.*)\n#{SIGNATURE_FOOTER}/
10
+ SIGNATURE_HEADER = '-----BEGIN CHAMBER SIGNATURE-----'
11
+ SIGNATURE_HEADER_PATTERN = /\-\-\-\-\-BEGIN\sCHAMBER\sSIGNATURE\-\-\-\-\-/.freeze
12
+ SIGNATURE_FOOTER = '-----END CHAMBER SIGNATURE-----'
13
+ SIGNATURE_FOOTER_PATTERN = /\-\-\-\-\-END\sCHAMBER\sSIGNATURE\-\-\-\-\-/.freeze
14
+ SIGNATURE_IN_FILE_PATTERN = /
15
+ #{SIGNATURE_HEADER_PATTERN}\n # Header
16
+ (.*)\n # Signature Body
17
+ #{SIGNATURE_FOOTER_PATTERN} # Footer
18
+ /x.freeze
13
19
 
14
20
  attr_accessor :settings_content,
15
21
  :settings_filename
@@ -23,14 +29,14 @@ class Signature
23
29
  end
24
30
 
25
31
  def signature_key=(keyish)
26
- @signature_key ||= if keyish.is_a?(OpenSSL::PKey::RSA)
27
- keyish
28
- elsif ::File.readable?(::File.expand_path(keyish))
29
- file_contents = ::File.read(::File.expand_path(keyish))
30
- OpenSSL::PKey::RSA.new(file_contents)
31
- else
32
- OpenSSL::PKey::RSA.new(keyish)
33
- end
32
+ @signature_key = if keyish.is_a?(OpenSSL::PKey::RSA)
33
+ keyish
34
+ elsif ::File.readable?(::File.expand_path(keyish))
35
+ file_contents = ::File.read(::File.expand_path(keyish))
36
+ OpenSSL::PKey::RSA.new(file_contents)
37
+ else
38
+ OpenSSL::PKey::RSA.new(keyish)
39
+ end
34
40
  end
35
41
 
36
42
  def write
@@ -68,7 +74,7 @@ Signed At: #{Time.now.utc.iso8601}
68
74
  def encoded_signature_content
69
75
  @encoded_signature_content ||= signature_filename.
70
76
  read.
71
- match(SIGNATURE_IN_SIGNATURE_FILE_PATTERN) do |match|
77
+ match(SIGNATURE_IN_FILE_PATTERN) do |match|
72
78
  match[1]
73
79
  end
74
80
  end
@@ -12,7 +12,7 @@ require 'chamber/errors/decryption_failure'
12
12
  module Chamber
13
13
  module Filters
14
14
  class DecryptionFilter
15
- BASE64_STRING_PATTERN = %r{\A[A-Za-z0-9\+/]{342}==\z}
15
+ BASE64_STRING_PATTERN = %r{\A[A-Za-z0-9\+/]{342}==\z}.freeze
16
16
  LARGE_DATA_STRING_PATTERN = %r{
17
17
  \A # Beginning of String
18
18
  (
@@ -27,7 +27,7 @@ class DecryptionFilter
27
27
  [A-Za-z0-9\+\/#]*\={0,2} # Base64 Encoded Data
28
28
  )
29
29
  \z # End of String
30
- }x
30
+ }x.freeze
31
31
 
32
32
  attr_accessor :data,
33
33
  :secure_key_token
@@ -79,11 +79,9 @@ class DecryptionFilter
79
79
  method = decryption_method(value)
80
80
 
81
81
  decryption_keys.each do |decryption_key|
82
- begin
83
- return method.decrypt(key, value, decryption_key)
84
- rescue OpenSSL::PKey::RSAError
85
- next
86
- end
82
+ return method.decrypt(key, value, decryption_key)
83
+ rescue OpenSSL::PKey::RSAError
84
+ next
87
85
  end
88
86
 
89
87
  value
@@ -10,8 +10,17 @@ require 'chamber/encryption_methods/none'
10
10
  module Chamber
11
11
  module Filters
12
12
  class EncryptionFilter
13
- BASE64_STRING_PATTERN = %r{\A[A-Za-z0-9\+\/]{342}==\z}
14
- LARGE_DATA_STRING_PATTERN = %r{\A([A-Za-z0-9\+\/#]*\={0,2})#([A-Za-z0-9\+\/#]*\={0,2})#([A-Za-z0-9\+\/#]*\={0,2})\z} # rubocop:disable Metrics/LineLength
13
+ BASE64_STRING_PATTERN = %r{\A[A-Za-z0-9\+\/]{342}==\z}.freeze
14
+ BASE64_SUBSTRING_PATTERN = %r{[A-Za-z0-9\+\/#]*\={0,2}}.freeze
15
+ LARGE_DATA_STRING_PATTERN = /
16
+ \A
17
+ (#{BASE64_SUBSTRING_PATTERN})
18
+ \#
19
+ (#{BASE64_SUBSTRING_PATTERN})
20
+ \#
21
+ (#{BASE64_SUBSTRING_PATTERN})
22
+ \z
23
+ /x.freeze
15
24
 
16
25
  attr_accessor :data,
17
26
  :secure_key_token
@@ -5,7 +5,7 @@ require 'chamber/errors/decryption_failure'
5
5
  module Chamber
6
6
  module Filters
7
7
  class FailedDecryptionFilter
8
- BASE64_STRING_PATTERN = %r{\A[A-Za-z0-9\+/]{342}==\z}
8
+ BASE64_STRING_PATTERN = %r{\A[A-Za-z0-9\+/]{342}==\z}.freeze
9
9
 
10
10
  def self.execute(options = {})
11
11
  new(options).__send__(:execute)
@@ -6,8 +6,17 @@ require 'chamber/filters/secure_filter'
6
6
  module Chamber
7
7
  module Filters
8
8
  class InsecureFilter < SecureFilter
9
- BASE64_STRING_PATTERN = %r{\A[A-Za-z0-9\+\/]{342}==\z}
10
- LARGE_DATA_STRING_PATTERN = %r{\A([A-Za-z0-9\+\/#]*\={0,2})#([A-Za-z0-9\+\/#]*\={0,2})#([A-Za-z0-9\+\/#]*\={0,2})\z} # rubocop:disable Metrics/LineLength
9
+ BASE64_STRING_PATTERN = %r{\A[A-Za-z0-9\+\/]{342}==\z}.freeze
10
+ BASE64_SUBSTRING_PATTERN = %r{[A-Za-z0-9\+\/#]*\={0,2}}.freeze
11
+ LARGE_DATA_STRING_PATTERN = /
12
+ \A
13
+ (#{BASE64_SUBSTRING_PATTERN})
14
+ \#
15
+ (#{BASE64_SUBSTRING_PATTERN})
16
+ \#
17
+ (#{BASE64_SUBSTRING_PATTERN})
18
+ \z
19
+ /x.freeze
11
20
 
12
21
  protected
13
22
 
@@ -39,12 +39,12 @@ class Instance
39
39
 
40
40
  Settings.
41
41
  new(
42
- config.merge(
43
- settings: data,
44
- pre_filters: [Filters::EncryptionFilter],
45
- post_filters: [],
46
- ),
47
- ).
42
+ config.merge(
43
+ settings: data,
44
+ pre_filters: [Filters::EncryptionFilter],
45
+ post_filters: [],
46
+ ),
47
+ ).
48
48
  to_hash
49
49
  end
50
50
 
@@ -53,15 +53,15 @@ class Instance
53
53
 
54
54
  Settings.
55
55
  new(
56
- config.merge(
57
- settings: data,
58
- pre_filters: [Filters::NamespaceFilter],
59
- post_filters: [
60
- Filters::DecryptionFilter,
61
- Filters::FailedDecryptionFilter,
62
- ],
63
- ),
64
- ).
56
+ config.merge(
57
+ settings: data,
58
+ pre_filters: [Filters::NamespaceFilter],
59
+ post_filters: [
60
+ Filters::DecryptionFilter,
61
+ Filters::FailedDecryptionFilter,
62
+ ],
63
+ ),
64
+ ).
65
65
  to_hash
66
66
  end
67
67
 
@@ -9,7 +9,7 @@ class Rails < ::Rails::Railtie
9
9
  Chamber.load(basepath: ::Rails.root.join('config'),
10
10
  namespaces: {
11
11
  environment: -> { ::Rails.env },
12
- hostname: -> { Socket.gethostname },
12
+ hostname: -> { ::Socket.gethostname },
13
13
  })
14
14
  end
15
15
  end
@@ -16,12 +16,12 @@ module Sinatra
16
16
  end
17
17
 
18
18
  Chamber.load(
19
- basepath: root,
20
- namespaces: {
21
- environment: -> { env },
22
- hostname: -> { Socket.gethostname },
23
- },
24
- )
19
+ basepath: root,
20
+ namespaces: {
21
+ environment: -> { env },
22
+ hostname: -> { Socket.gethostname },
23
+ },
24
+ )
25
25
  end
26
26
  end
27
27
  end
@@ -77,7 +77,7 @@ class KeyPair
77
77
  def base_key_filename
78
78
  @base_key_filename ||= [
79
79
  '.chamber',
80
- namespace,
80
+ namespace ? namespace.tr('-.', '') : nil,
81
81
  ].
82
82
  compact.
83
83
  join('.')
@@ -27,6 +27,7 @@ class Base
27
27
  end
28
28
  end
29
29
 
30
+ # rubocop:disable Performance/ChainArrayAllocation
30
31
  def filenames=(other)
31
32
  @filenames = begin
32
33
  paths = Array(other).
@@ -42,19 +43,20 @@ class Base
42
43
  uniq
43
44
  end
44
45
  end
46
+ # rubocop:enable Performance/ChainArrayAllocation
45
47
 
46
48
  private
47
49
 
48
50
  def namespaces=(other)
49
- @namespaces ||= begin
50
- keys = if other.respond_to?(:keys)
51
- other.keys.map(&:to_s)
52
- else
53
- other
54
- end
55
-
56
- keys + %w{signature}
57
- end
51
+ @namespaces = begin
52
+ keys = if other.respond_to?(:keys)
53
+ other.keys.map(&:to_s)
54
+ else
55
+ other
56
+ end
57
+
58
+ keys + %w{signature}
59
+ end
58
60
  end
59
61
 
60
62
  def key_from_file_contents(filename)
@@ -71,6 +73,16 @@ class Base
71
73
  to_s.
72
74
  match(self.class::NAMESPACE_PATTERN) { |m| m[1].upcase }
73
75
  end
76
+
77
+ def generate_key_filenames
78
+ namespaces.map do |namespace|
79
+ rootpath + ".chamber.#{namespace.to_s.tr('.-', '')}#{key_filename_extension}"
80
+ end
81
+ end
82
+
83
+ def default_key_file_path
84
+ Pathname.new(rootpath + ".chamber#{key_filename_extension}")
85
+ end
74
86
  end
75
87
  end
76
88
  end
@@ -13,7 +13,7 @@ class Decryption < Chamber::Keys::Base
13
13
  (\w+) # Namespace
14
14
  \.pem # Extension
15
15
  \z # End of Filename
16
- /x
16
+ /x.freeze
17
17
 
18
18
  private
19
19
 
@@ -27,14 +27,8 @@ class Decryption < Chamber::Keys::Base
27
27
  join('_')
28
28
  end
29
29
 
30
- def generate_key_filenames
31
- namespaces.map do |namespace|
32
- rootpath + ".chamber.#{namespace}.pem"
33
- end
34
- end
35
-
36
- def default_key_file_path
37
- Pathname.new(rootpath + '.chamber.pem')
30
+ def key_filename_extension
31
+ '.pem'
38
32
  end
39
33
  end
40
34
  end
@@ -13,7 +13,7 @@ class Encryption < Chamber::Keys::Base
13
13
  (\w+) # Namespace
14
14
  \.pub\.pem # Extension
15
15
  \z # End of Filename
16
- /x
16
+ /x.freeze
17
17
 
18
18
  private
19
19
 
@@ -27,14 +27,8 @@ class Encryption < Chamber::Keys::Base
27
27
  join('_')
28
28
  end
29
29
 
30
- def generate_key_filenames
31
- namespaces.map do |namespace|
32
- rootpath + ".chamber.#{namespace}.pub.pem"
33
- end
34
- end
35
-
36
- def default_key_file_path
37
- Pathname.new(rootpath + '.chamber.pub.pem')
30
+ def key_filename_extension
31
+ '.pub.pem'
38
32
  end
39
33
  end
40
34
  end
@@ -221,25 +221,25 @@ class Settings
221
221
 
222
222
  def securable
223
223
  Settings.new(metadata.merge(
224
- settings: raw_data,
225
- pre_filters: [Filters::SecureFilter],
226
- ))
224
+ settings: raw_data,
225
+ pre_filters: [Filters::SecureFilter],
226
+ ))
227
227
  end
228
228
 
229
229
  def secure
230
230
  Settings.new(metadata.merge(
231
- settings: raw_data,
232
- pre_filters: [Filters::EncryptionFilter],
233
- post_filters: [Filters::TranslateSecureKeysFilter],
234
- ))
231
+ settings: raw_data,
232
+ pre_filters: [Filters::EncryptionFilter],
233
+ post_filters: [Filters::TranslateSecureKeysFilter],
234
+ ))
235
235
  end
236
236
 
237
237
  def insecure
238
238
  Settings.new(metadata.merge(
239
- settings: raw_data,
240
- pre_filters: [Filters::InsecureFilter],
241
- post_filters: [Filters::TranslateSecureKeysFilter],
242
- ))
239
+ settings: raw_data,
240
+ pre_filters: [Filters::InsecureFilter],
241
+ post_filters: [Filters::TranslateSecureKeysFilter],
242
+ ))
243
243
  end
244
244
 
245
245
  def method_missing(name, *args)
@@ -262,12 +262,14 @@ class Settings
262
262
  @namespaces = NamespaceSet.new(raw_namespaces)
263
263
  end
264
264
 
265
+ # rubocop:disable Naming/MemoizedInstanceVariableName
265
266
  def raw_data
266
267
  @filtered_raw_data ||= pre_filters.inject(@raw_data) do |filtered_data, filter|
267
268
  filter.execute({ data: filtered_data }.
268
269
  merge(metadata))
269
270
  end
270
271
  end
272
+ # rubocop:enable Naming/MemoizedInstanceVariableName
271
273
 
272
274
  def data
273
275
  @data ||= post_filters.inject(raw_data) do |filtered_data, filter|
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Chamber
4
- VERSION = '2.12.3'
4
+ VERSION = '2.12.5'
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: chamber
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.12.3
4
+ version: 2.12.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - thekompanee
@@ -13,49 +13,53 @@ bindir: bin
13
13
  cert_chain:
14
14
  - |
15
15
  -----BEGIN CERTIFICATE-----
16
- MIIDrjCCApagAwIBAgIBATANBgkqhkiG9w0BAQUFADBOMRowGAYDVQQDDBFhY2Nv
17
- dW50c19ydWJ5Z2VtczEbMBkGCgmSJomT8ixkARkWC3RoZWtvbXBhbmVlMRMwEQYK
18
- CZImiZPyLGQBGRYDY29tMB4XDTE3MTIzMTIzMzUwNloXDTE4MTIzMTIzMzUwNlow
19
- TjEaMBgGA1UEAwwRYWNjb3VudHNfcnVieWdlbXMxGzAZBgoJkiaJk/IsZAEZFgt0
20
- aGVrb21wYW5lZTETMBEGCgmSJomT8ixkARkWA2NvbTCCASIwDQYJKoZIhvcNAQEB
21
- BQADggEPADCCAQoCggEBAO4TFnvU5R1rchKsNvNEiZUlOTuMtuE+OvMW4aOk3tIP
22
- JpczhDnRSLpbkpVvsuwfT9PgLjnAuan4oLB0eQVaOAgATFbmAfMsfU0gGtSWlczx
23
- 6vZjQqyGsW3P1abgGquLVubj409FMxfV18JUZlEmvCE1y9bM61gZ3oHTFPvBDoyX
24
- 3g9or9nenIa5jcJZd4C3ujW8yOxD+UskgAp+iZI2mIRtt2cJVg2/dnFAgqqp7Xy4
25
- c4OHZ6hqp2UcvhzuEdUJ6yRA8+Gn3jPOD+uXgUG84FfmU++NVoZyz+r0Nwa+De0H
26
- IObr8jftfL0PGdR8t1K61g12dZwGmpYTzmoJ1C+yS2ECAwEAAaOBljCBkzAJBgNV
27
- HRMEAjAAMAsGA1UdDwQEAwIEsDAdBgNVHQ4EFgQUxmSoxOGENcFagbIbl/CikHCU
28
- hyMwLAYDVR0RBCUwI4EhYWNjb3VudHMrcnVieWdlbXNAdGhla29tcGFuZWUuY29t
29
- MCwGA1UdEgQlMCOBIWFjY291bnRzK3J1YnlnZW1zQHRoZWtvbXBhbmVlLmNvbTAN
30
- BgkqhkiG9w0BAQUFAAOCAQEAoiXGZB5aUV/31MOlrY6Jmfk/4+kIBcgrOCMCi3Nn
31
- 58fZ/LJDmxs+C3zdW0wHxYf06r3ZcHTulhk1suztLCWyUxyOkGj4IW+LXPRGP66o
32
- 6qcofBVFh7GXatsgbj87f7a8/opXaeQHqC2X18sCTwOCcO5PjtFrXK7A3v1u2yRj
33
- rEe6qyTkY77mRgG3f/feAizAvYYkPxOngUwN8rpfKpU5iESS4UUaxIi3AGJHgTw2
34
- etYUO0DlNY/qYfSfExrgt0W5dZeT09V++WPlYauHw/EZtAB0AsJwVdtIscq0HSvX
35
- yH9AFp3KIe0v70EXzao/94n+XoDULrHEhqGMo34iS+37ZA==
16
+ MIIEdjCCAt6gAwIBAgIBATANBgkqhkiG9w0BAQsFADAyMTAwLgYDVQQDDCdhY2Nv
17
+ dW50c19ydWJ5Z2Vtcy9EQz10aGVrb21wYW5lZS9EQz1jb20wHhcNMTgwODAzMjEz
18
+ NjUzWhcNMTkwODAzMjEzNjUzWjAyMTAwLgYDVQQDDCdhY2NvdW50c19ydWJ5Z2Vt
19
+ cy9EQz10aGVrb21wYW5lZS9EQz1jb20wggGiMA0GCSqGSIb3DQEBAQUAA4IBjwAw
20
+ ggGKAoIBgQDR6ma5Z4B2Qz+ykVUKn2CoWwoJ3vStZLDNc6nIOUTUDFS5rg43XwwB
21
+ nnHCLhHZ9QeNflBpJObMwIUwDqxfZoxhmEILzUfv/yuoBj90zmnf7K2mmsPuT44a
22
+ aTyZjYGid+yyTbzIpR4CCBHyvGNVm9ss64C2XXPNXrlLO3eAxgB9zNYkxOeJatZp
23
+ d1h5FZIkAqgw7rx65W+e4HUSNnUvzUmZKoO0u/yMlnc4NcK05RdgHZ5FcXgSAZG/
24
+ MRzJ0rIdEk7wT8fBJ6w9oeFca8qW7C9M/ONJ4WiS+HoquCRcR+FiNAS3LQtQbiaR
25
+ ADVS0CBzc2/6zBxWf/+C6wv8vEkoIDSgJ4T07IV2oEJH2ox1z0PYLcNQ9KIrz9iW
26
+ +Q2DPjjO2+ymR3QOBpOrDr4keYS25tfUiSkBXemHj94Bm95/Szi8At8ywCtBVWUx
27
+ AumxK9WPjr7WFDk5o71NX4SZft99Ey5XBeZ1+I2v4+ozio/cqOFz9UTarQryCf0e
28
+ 2uJLFPBPkzcCAwEAAaOBljCBkzAJBgNVHRMEAjAAMAsGA1UdDwQEAwIEsDAdBgNV
29
+ HQ4EFgQUUTthhLkcr6+8JU1/B/dxKYaYnKUwLAYDVR0RBCUwI4EhYWNjb3VudHMr
30
+ cnVieWdlbXNAdGhla29tcGFuZWUuY29tMCwGA1UdEgQlMCOBIWFjY291bnRzK3J1
31
+ YnlnZW1zQHRoZWtvbXBhbmVlLmNvbTANBgkqhkiG9w0BAQsFAAOCAYEAED2U/MD3
32
+ PHRHyeh9Ge3JTKJ/bjZLYquJWQr+ei4rsNk8oO2O6CcoiC84oNEnpnENHX9KiZu8
33
+ h7ylKO7u6vKJl9p9IV2YR0uOnXbSApYr5olDDlEz7HNGL3xUCJJhJBf09C4AkaAn
34
+ kfaOv9Nkko0izYPpKsGlyKvbWBIzT3urBMRNbv95DzhBdNI6RF0q13eCePPqXPGe
35
+ RaikE1dUWcVsW29XzO/RINmuMcKU6k0caC7X4kTD657Nf74oGUXHxYPmfUmYmppg
36
+ uAF3jK5824uMvxofLysxqXhrUlTuCVndaexDm3bYK+YrTnZJEu6CimpMYa2u6JEE
37
+ sWLZKmDLUxEUs/5jVGuypZbSBJBDb6VnmCkoEr3Fmh4O/FH4IZ+Gd3QdYCohLoKd
38
+ 09JNgxpgZHCDuKwoycU+wXdWVSzMtchMQygnEu6th1SY5qHj4ISipBEBtKG0MdgB
39
+ L3AbMAHTztj5YI+gvmpuV1B4Zv1QZjZWOeNSnLZdrnOQbyyDBzJyXmNV
36
40
  -----END CERTIFICATE-----
37
- date: 2018-01-27 00:00:00.000000000 Z
41
+ date: 2019-05-29 00:00:00.000000000 Z
38
42
  dependencies:
39
43
  - !ruby/object:Gem::Dependency
40
44
  name: thor
41
45
  requirement: !ruby/object:Gem::Requirement
42
46
  requirements:
43
- - - "<"
44
- - !ruby/object:Gem::Version
45
- version: '0.21'
46
47
  - - ">="
47
48
  - !ruby/object:Gem::Version
48
49
  version: 0.19.1
50
+ - - "<"
51
+ - !ruby/object:Gem::Version
52
+ version: '0.21'
49
53
  type: :runtime
50
54
  prerelease: false
51
55
  version_requirements: !ruby/object:Gem::Requirement
52
56
  requirements:
53
- - - "<"
54
- - !ruby/object:Gem::Version
55
- version: '0.21'
56
57
  - - ">="
57
58
  - !ruby/object:Gem::Version
58
59
  version: 0.19.1
60
+ - - "<"
61
+ - !ruby/object:Gem::Version
62
+ version: '0.21'
59
63
  - !ruby/object:Gem::Dependency
60
64
  name: hashie
61
65
  requirement: !ruby/object:Gem::Requirement
@@ -227,8 +231,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
227
231
  - !ruby/object:Gem::Version
228
232
  version: '0'
229
233
  requirements: []
230
- rubyforge_project:
231
- rubygems_version: 2.6.14
234
+ rubygems_version: 3.0.3
232
235
  signing_key:
233
236
  specification_version: 4
234
237
  summary: A surprisingly configurable convention-based approach to managing your application's
metadata.gz.sig CHANGED
Binary file