chamber 2.12.3 → 2.12.5

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
- 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