chamber 2.9.1 → 2.10.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/lib/chamber/encryption_methods/ssl.rb +2 -2
- data/lib/chamber/filters/boolean_conversion_filter.rb +2 -0
- data/lib/chamber/filters/encryption_filter.rb +5 -1
- data/lib/chamber/instance.rb +32 -0
- data/lib/chamber/types/secured.rb +79 -0
- data/lib/chamber/version.rb +1 -1
- data/spec/lib/chamber/filters/encryption_filter_spec.rb +50 -1
- data/spec/lib/chamber/types/secured_spec.rb +70 -0
- data/spec/lib/chamber_spec.rb +0 -2
- metadata +34 -4
- metadata.gz.sig +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f64e70d25c37ca329a62d1fb9154e8c20afcb672
|
4
|
+
data.tar.gz: fcd7a592e5200ff1d9cefe0b893eb38a9ee588d1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 88901e1606334bea29432cc4942029e75f9348481c94583c915244ad5fccdca1fe27560aa74fede87a95d6c95902d238eb5ca11559b004b414f89af8a9dd0e25
|
7
|
+
data.tar.gz: eb9cb535f93b01b1bde53d55e345914a9586aef32ee76d199eb0df9b1dd0810b035cf862854cf22cfa51b928cf8bbbf7c1643632faeea957809bf6a64ebb1831
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
data.tar.gz.sig
CHANGED
Binary file
|
@@ -5,7 +5,7 @@ class Ssl
|
|
5
5
|
|
6
6
|
def self.encrypt(_key, value, encryption_key)
|
7
7
|
value = YAML.dump(value)
|
8
|
-
cipher = OpenSSL::Cipher
|
8
|
+
cipher = OpenSSL::Cipher.new('AES-128-CBC')
|
9
9
|
cipher.encrypt
|
10
10
|
symmetric_key = cipher.random_key
|
11
11
|
iv = cipher.random_iv
|
@@ -34,7 +34,7 @@ class Ssl
|
|
34
34
|
end
|
35
35
|
key = decryption_key.private_decrypt(key)
|
36
36
|
|
37
|
-
cipher_dec = OpenSSL::Cipher
|
37
|
+
cipher_dec = OpenSSL::Cipher.new('AES-128-CBC')
|
38
38
|
|
39
39
|
cipher_dec.decrypt
|
40
40
|
|
@@ -14,6 +14,7 @@ class BooleanConversionFilter
|
|
14
14
|
|
15
15
|
attr_accessor :data
|
16
16
|
|
17
|
+
# rubocop:disable Metrics/BlockNesting
|
17
18
|
def execute(settings = data)
|
18
19
|
settings.each_pair do |key, value|
|
19
20
|
if value.respond_to? :each_pair
|
@@ -34,6 +35,7 @@ class BooleanConversionFilter
|
|
34
35
|
end
|
35
36
|
end
|
36
37
|
end
|
38
|
+
# rubocop:enable Metrics/BlockNesting
|
37
39
|
end
|
38
40
|
end
|
39
41
|
end
|
@@ -57,7 +57,11 @@ class EncryptionFilter
|
|
57
57
|
end
|
58
58
|
|
59
59
|
def encryption_method(value)
|
60
|
-
|
60
|
+
value_is_encrypted = value.respond_to?(:match) &&
|
61
|
+
(value.match(BASE64_STRING_PATTERN) ||
|
62
|
+
value.match(LARGE_DATA_STRING_PATTERN))
|
63
|
+
|
64
|
+
if value_is_encrypted
|
61
65
|
EncryptionMethods::None
|
62
66
|
else
|
63
67
|
serialized_value = YAML.dump(value)
|
data/lib/chamber/instance.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
require 'chamber/configuration'
|
3
3
|
require 'chamber/file_set'
|
4
|
+
require 'chamber/settings'
|
4
5
|
|
5
6
|
module Chamber
|
6
7
|
class Instance
|
@@ -24,6 +25,37 @@ class Instance
|
|
24
25
|
files.secure
|
25
26
|
end
|
26
27
|
|
28
|
+
def encrypt(data, options = {})
|
29
|
+
config = configuration.to_hash.merge(options)
|
30
|
+
|
31
|
+
Settings.
|
32
|
+
new(
|
33
|
+
config.merge(
|
34
|
+
settings: data,
|
35
|
+
pre_filters: [Filters::EncryptionFilter],
|
36
|
+
post_filters: [],
|
37
|
+
),
|
38
|
+
).
|
39
|
+
to_hash
|
40
|
+
end
|
41
|
+
|
42
|
+
def decrypt(data, options = {})
|
43
|
+
config = configuration.to_hash.merge(options)
|
44
|
+
|
45
|
+
Settings.
|
46
|
+
new(
|
47
|
+
config.merge(
|
48
|
+
settings: data,
|
49
|
+
pre_filters: [Filters::NamespaceFilter],
|
50
|
+
post_filters: [
|
51
|
+
Filters::DecryptionFilter,
|
52
|
+
Filters::FailedDecryptionFilter,
|
53
|
+
],
|
54
|
+
),
|
55
|
+
).
|
56
|
+
to_hash
|
57
|
+
end
|
58
|
+
|
27
59
|
def to_s(options = {})
|
28
60
|
settings.to_s(options)
|
29
61
|
end
|
@@ -0,0 +1,79 @@
|
|
1
|
+
require 'active_support/json'
|
2
|
+
require 'chamber'
|
3
|
+
|
4
|
+
# rubocop:disable Lint/HandleExceptions, Style/EmptyLinesAroundModuleBody
|
5
|
+
module Chamber
|
6
|
+
|
7
|
+
begin
|
8
|
+
require 'active_record/type/value'
|
9
|
+
|
10
|
+
CHAMBER_TYPE_VALUE_SUPERCLASS = ActiveRecord::Type::Value
|
11
|
+
rescue LoadError
|
12
|
+
end
|
13
|
+
|
14
|
+
begin
|
15
|
+
require 'active_model/type/value'
|
16
|
+
|
17
|
+
CHAMBER_TYPE_VALUE_SUPERCLASS = ActiveModel::Type::Value
|
18
|
+
rescue LoadError
|
19
|
+
end
|
20
|
+
|
21
|
+
module Types
|
22
|
+
class Secured < CHAMBER_TYPE_VALUE_SUPERCLASS
|
23
|
+
attr_accessor :decryption_key,
|
24
|
+
:encryption_key
|
25
|
+
|
26
|
+
def initialize(options = {})
|
27
|
+
self.encryption_key = options.fetch(:encryption_key,
|
28
|
+
Chamber.configuration.encryption_key)
|
29
|
+
self.decryption_key = options.fetch(:decryption_key,
|
30
|
+
Chamber.configuration.decryption_key)
|
31
|
+
end
|
32
|
+
|
33
|
+
def type
|
34
|
+
:jsonb
|
35
|
+
end
|
36
|
+
|
37
|
+
def cast(value)
|
38
|
+
case value
|
39
|
+
when Hash
|
40
|
+
value
|
41
|
+
when String
|
42
|
+
::ActiveSupport::JSON.decode(value)
|
43
|
+
when NilClass
|
44
|
+
nil
|
45
|
+
else
|
46
|
+
fail ArgumentError, 'Any attributes encrypted with Chamber must be either a Hash or a valid JSON string'
|
47
|
+
end
|
48
|
+
end
|
49
|
+
alias type_cast_from_user cast
|
50
|
+
|
51
|
+
def deserialize(value)
|
52
|
+
value = cast(value)
|
53
|
+
|
54
|
+
return if value.nil?
|
55
|
+
|
56
|
+
Chamber.decrypt(value,
|
57
|
+
decryption_key: decryption_key,
|
58
|
+
encryption_key: encryption_key)
|
59
|
+
end
|
60
|
+
alias type_cast_from_database deserialize
|
61
|
+
|
62
|
+
def serialize(value)
|
63
|
+
fail ArgumentError, 'Any attributes encrypted with Chamber must be a Hash' unless value.is_a?(Hash)
|
64
|
+
|
65
|
+
::ActiveSupport::JSON.encode(
|
66
|
+
Chamber.encrypt(value,
|
67
|
+
decryption_key: decryption_key,
|
68
|
+
encryption_key: encryption_key),
|
69
|
+
)
|
70
|
+
end
|
71
|
+
alias type_cast_for_database serialize
|
72
|
+
|
73
|
+
def changed_in_place?(raw_old_value, new_value)
|
74
|
+
deserialize(raw_old_value) == new_value
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
# rubocop:enable Lint/HandleExceptions, Style/EmptyLinesAroundModuleBody
|
data/lib/chamber/version.rb
CHANGED
@@ -61,7 +61,7 @@ describe EncryptionFilter do
|
|
61
61
|
EncryptionFilter::BASE64_STRING_PATTERN
|
62
62
|
end
|
63
63
|
|
64
|
-
it 'will not attempt to encrypt values if it guesses that they are already encrypted' do
|
64
|
+
it 'will not attempt to encrypt normal values if it guesses that they are already encrypted' do
|
65
65
|
filtered_settings = EncryptionFilter.execute(
|
66
66
|
data: {
|
67
67
|
_secure_my_secure_setting: 'fNI5wlBniNhEU4396pmhWwx+A09bRAMJOUASuP7PzprewBX8C' \
|
@@ -87,6 +87,55 @@ describe EncryptionFilter do
|
|
87
87
|
'uF3CDIKRIC6U+mnM5SRMO4Dzysw=='
|
88
88
|
end
|
89
89
|
|
90
|
+
it 'will not attempt to encrypt large values if it guesses that they are already encrypted' do
|
91
|
+
filtered_settings = EncryptionFilter.execute(
|
92
|
+
data: {
|
93
|
+
_secure_my_secure_setting: 'AcMY7ALLoGZRakL3ibyo2WB438ipdMDIjsa4SCDBP2saOY63A' \
|
94
|
+
'D3C/SZanexlYDQoYoYC0V5J5EvKHgGMDAU8qnp9LjzU5VCwJ3' \
|
95
|
+
'SVRGz3J0c7LXgTlC585Lgy8LX+/yjYFm4D13hlMvvsoI35Bo8' \
|
96
|
+
'EVkTSU2+0gRSjRpQJeK1o7az5+fBuNmFipevA4YfLnarnpwo2' \
|
97
|
+
'd2oO+BqStI2QQI1UWwN2R04rvOdHoEzA6DLsdvYX+QTKDk4K5' \
|
98
|
+
'oSKXfuMBvzOCaCGT75cmt85ZY7XZnwbKi6c4mtL1ajrCr8sQF' \
|
99
|
+
'TA/GyG1EiYLFp1uQco0m2/S9yFf26REjax4ZE6O/ilXgT6xg=' \
|
100
|
+
'=#YAm25swWRQx4ip1RjVzpGQ==#vRGvgjErI+dATM4UOtFkkg' \
|
101
|
+
'efFpFTvxGpHN0gRbf1VCO4K07eqAQPb46BDI67a8iNum9cBph' \
|
102
|
+
'es7oGmuNnUvBg4JiZhKsXnolcRWdITDVh/XYNioXRmesvj4x+' \
|
103
|
+
'tY0FVhkLV2zubRVfC7CDJgin6wRHP+bcZhICDD2YqB+XRS4ou' \
|
104
|
+
'66UeaiGA4eV4G6sPIo+DPjDM3m8JFnuRFMvGk73wthbN4MdAp' \
|
105
|
+
'9xONt5wfobJUiUR11k2iAqwhx7Wyj0imz/afI8goDTdMfQt3V' \
|
106
|
+
'DOYqYG3y2AcYOfsOL6m0GtQRlKvtsvw+m8/ICwSGiL2Loup0j' \
|
107
|
+
'/jDGhFi1lwf4ded8aSwyS+2/Ks9C008dsJwpR1SxJ59z1KSzd' \
|
108
|
+
'QcTcrJTnxd+2qpOVVIoaRGud2tSV+5wKXy9dWRflLsjEtBRFR' \
|
109
|
+
'eFurTVQPodjDy+Lhs452/O/+KAJOXMKeYegCGOe8z9tLD3tel' \
|
110
|
+
'jjTyJPeW/1FE3+tP3G3HJAV4sgoO0YwhNY1Nji56igCl3UvEP' \
|
111
|
+
'nEQcJgu0w/+dqSreqwp6TqaqXY3lzr8vi733lti4nss=',
|
112
|
+
},
|
113
|
+
encryption_key: './spec/spec_key.pub',
|
114
|
+
)
|
115
|
+
|
116
|
+
my_secure_setting = filtered_settings._secure_my_secure_setting
|
117
|
+
|
118
|
+
expect(my_secure_setting).to eql 'AcMY7ALLoGZRakL3ibyo2WB438ipdMDIjsa4SCDBP2saOY63A' \
|
119
|
+
'D3C/SZanexlYDQoYoYC0V5J5EvKHgGMDAU8qnp9LjzU5VCwJ3' \
|
120
|
+
'SVRGz3J0c7LXgTlC585Lgy8LX+/yjYFm4D13hlMvvsoI35Bo8' \
|
121
|
+
'EVkTSU2+0gRSjRpQJeK1o7az5+fBuNmFipevA4YfLnarnpwo2' \
|
122
|
+
'd2oO+BqStI2QQI1UWwN2R04rvOdHoEzA6DLsdvYX+QTKDk4K5' \
|
123
|
+
'oSKXfuMBvzOCaCGT75cmt85ZY7XZnwbKi6c4mtL1ajrCr8sQF' \
|
124
|
+
'TA/GyG1EiYLFp1uQco0m2/S9yFf26REjax4ZE6O/ilXgT6xg=' \
|
125
|
+
'=#YAm25swWRQx4ip1RjVzpGQ==#vRGvgjErI+dATM4UOtFkkg' \
|
126
|
+
'efFpFTvxGpHN0gRbf1VCO4K07eqAQPb46BDI67a8iNum9cBph' \
|
127
|
+
'es7oGmuNnUvBg4JiZhKsXnolcRWdITDVh/XYNioXRmesvj4x+' \
|
128
|
+
'tY0FVhkLV2zubRVfC7CDJgin6wRHP+bcZhICDD2YqB+XRS4ou' \
|
129
|
+
'66UeaiGA4eV4G6sPIo+DPjDM3m8JFnuRFMvGk73wthbN4MdAp' \
|
130
|
+
'9xONt5wfobJUiUR11k2iAqwhx7Wyj0imz/afI8goDTdMfQt3V' \
|
131
|
+
'DOYqYG3y2AcYOfsOL6m0GtQRlKvtsvw+m8/ICwSGiL2Loup0j' \
|
132
|
+
'/jDGhFi1lwf4ded8aSwyS+2/Ks9C008dsJwpR1SxJ59z1KSzd' \
|
133
|
+
'QcTcrJTnxd+2qpOVVIoaRGud2tSV+5wKXy9dWRflLsjEtBRFR' \
|
134
|
+
'eFurTVQPodjDy+Lhs452/O/+KAJOXMKeYegCGOe8z9tLD3tel' \
|
135
|
+
'jjTyJPeW/1FE3+tP3G3HJAV4sgoO0YwhNY1Nji56igCl3UvEP' \
|
136
|
+
'nEQcJgu0w/+dqSreqwp6TqaqXY3lzr8vi733lti4nss='
|
137
|
+
end
|
138
|
+
|
90
139
|
it 'can encrypt long multiline strings' do
|
91
140
|
filtered_settings = EncryptionFilter.execute(
|
92
141
|
data: {
|
@@ -0,0 +1,70 @@
|
|
1
|
+
require 'rspectacular'
|
2
|
+
require 'active_support/hash_with_indifferent_access'
|
3
|
+
require 'chamber/types/secured'
|
4
|
+
|
5
|
+
module Chamber
|
6
|
+
module Types
|
7
|
+
describe Secured do
|
8
|
+
BASE64_STRING_PATTERN = %r{[A-Za-z0-9\+/]{342}==}
|
9
|
+
|
10
|
+
subject do
|
11
|
+
Secured.new(decryption_key: './spec/spec_key',
|
12
|
+
encryption_key: './spec/spec_key.pub')
|
13
|
+
end
|
14
|
+
|
15
|
+
it 'allows strings to be cast from the user' do
|
16
|
+
json_string = '{ "hello": "there", "whatever": 3 }'
|
17
|
+
secured = subject.cast(json_string)
|
18
|
+
|
19
|
+
expect(secured).to eql('hello' => 'there', 'whatever' => 3)
|
20
|
+
end
|
21
|
+
|
22
|
+
it 'allows hashes to be cast from a user' do
|
23
|
+
json_hash = { 'hello' => 'there', 'whatever' => 3 }
|
24
|
+
secured = subject.cast(json_hash)
|
25
|
+
|
26
|
+
expect(secured).to eql('hello' => 'there', 'whatever' => 3)
|
27
|
+
end
|
28
|
+
|
29
|
+
it 'allows nils to be cast from a user' do
|
30
|
+
secured = subject.cast(nil)
|
31
|
+
|
32
|
+
expect(secured).to be_nil
|
33
|
+
end
|
34
|
+
|
35
|
+
it 'fails if passed something that it cannot be cast' do
|
36
|
+
expect { subject.cast(3) }.to \
|
37
|
+
raise_error(ArgumentError).
|
38
|
+
with_message('Any attributes encrypted with Chamber must ' \
|
39
|
+
'be either a Hash or a valid JSON string')
|
40
|
+
end
|
41
|
+
|
42
|
+
it 'can deserialize a hash' do
|
43
|
+
json_string = '{' \
|
44
|
+
'"_secure_hello":"cpsTajQ/28E0YLQBpJ2tORnLSc6wliCqrmMzU0QfQZJlUWf' \
|
45
|
+
'Q1yuev2xLsX56o5QkuJiqaspH9W68qXDC17UqcV0pB0y75d' \
|
46
|
+
'6ttQZbk3p9QbYgWGZOVlHEA8eJIqDUzisShrrOo+nSin6QK' \
|
47
|
+
'UqizSjqhQC3Ii7CjTpMOK5RVc2y34vsVvYoJaqz5IYUEatA' \
|
48
|
+
'XxzHsQ5tkcqy++a9LTJVFOt+ug+mTCstNJHW2sUK9L1XrbD' \
|
49
|
+
'2+KwUNkImCbhl6qeA+4CeVXMFgcpxjaawg5cQCgfSPj8gSy' \
|
50
|
+
'pisbID59P0QVXRDQTdncrRv7q16RLmTqKI0xhNGevreFkNG' \
|
51
|
+
'LAtSQjFRYfAQA==",' \
|
52
|
+
'"whatever":3' \
|
53
|
+
'}'
|
54
|
+
secured = subject.deserialize(json_string)
|
55
|
+
|
56
|
+
expect(secured).to eql('_secure_hello' => 'there', 'whatever' => 3)
|
57
|
+
end
|
58
|
+
|
59
|
+
# rubocop:disable Metrics/LineLength
|
60
|
+
it 'can serialize a hash' do
|
61
|
+
json_hash = { '_secure_hello' => 'there', 'whatever' => 3 }
|
62
|
+
secured = subject.serialize(json_hash)
|
63
|
+
|
64
|
+
expect(secured).to be_a String
|
65
|
+
expect(secured).to match(/{\"_secure_hello\":\"#{BASE64_STRING_PATTERN}\",\"whatever\":3}/)
|
66
|
+
end
|
67
|
+
# rubocop:enable Metrics/LineLength
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
data/spec/lib/chamber_spec.rb
CHANGED
@@ -3,7 +3,6 @@ require 'rspectacular'
|
|
3
3
|
require 'chamber'
|
4
4
|
require 'fileutils'
|
5
5
|
|
6
|
-
# rubocop:disable Metrics/LineLength
|
7
6
|
FileUtils.mkdir_p '/tmp/chamber/settings' unless File.exist? '/tmp/chamber/settings'
|
8
7
|
|
9
8
|
File.open('/tmp/chamber/settings.yml', 'w+') do |file|
|
@@ -313,4 +312,3 @@ describe 'Chamber' do
|
|
313
312
|
expect(Chamber.test.my_encrpyted_setting).to eql 'hello'
|
314
313
|
end
|
315
314
|
end
|
316
|
-
# rubocop:enable Metrics/LineLength
|
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.
|
4
|
+
version: 2.10.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- thekompanee
|
@@ -34,7 +34,7 @@ cert_chain:
|
|
34
34
|
QwSfDGz6+zsImi5N3UT71+mk7YcviQSgvMRl3VkAv8MZ6wcJ5SQRpf9w0OeFH6Ln
|
35
35
|
nNbCoHiYeXX/lz/M6AIbxDIZZTwxcyvF7bdrQ2fbH5MsfQ==
|
36
36
|
-----END CERTIFICATE-----
|
37
|
-
date:
|
37
|
+
date: 2017-02-04 00:00:00.000000000 Z
|
38
38
|
dependencies:
|
39
39
|
- !ruby/object:Gem::Dependency
|
40
40
|
name: thor
|
@@ -92,6 +92,34 @@ dependencies:
|
|
92
92
|
- - "~>"
|
93
93
|
- !ruby/object:Gem::Version
|
94
94
|
version: '0.46'
|
95
|
+
- !ruby/object:Gem::Dependency
|
96
|
+
name: activemodel
|
97
|
+
requirement: !ruby/object:Gem::Requirement
|
98
|
+
requirements:
|
99
|
+
- - "~>"
|
100
|
+
- !ruby/object:Gem::Version
|
101
|
+
version: '5.0'
|
102
|
+
type: :development
|
103
|
+
prerelease: false
|
104
|
+
version_requirements: !ruby/object:Gem::Requirement
|
105
|
+
requirements:
|
106
|
+
- - "~>"
|
107
|
+
- !ruby/object:Gem::Version
|
108
|
+
version: '5.0'
|
109
|
+
- !ruby/object:Gem::Dependency
|
110
|
+
name: activesupport
|
111
|
+
requirement: !ruby/object:Gem::Requirement
|
112
|
+
requirements:
|
113
|
+
- - "~>"
|
114
|
+
- !ruby/object:Gem::Version
|
115
|
+
version: '5.0'
|
116
|
+
type: :development
|
117
|
+
prerelease: false
|
118
|
+
version_requirements: !ruby/object:Gem::Requirement
|
119
|
+
requirements:
|
120
|
+
- - "~>"
|
121
|
+
- !ruby/object:Gem::Version
|
122
|
+
version: '5.0'
|
95
123
|
description: "\n Chamber lets you source your Settings from
|
96
124
|
an arbitrary number of YAML files and\n provides a simple
|
97
125
|
mechanism for overriding settings from the ENV, which is\n friendly
|
@@ -149,6 +177,7 @@ files:
|
|
149
177
|
- lib/chamber/rails/railtie.rb
|
150
178
|
- lib/chamber/rubinius_fix.rb
|
151
179
|
- lib/chamber/settings.rb
|
180
|
+
- lib/chamber/types/secured.rb
|
152
181
|
- lib/chamber/version.rb
|
153
182
|
- spec/fixtures/settings.yml
|
154
183
|
- spec/lib/chamber/commands/files_spec.rb
|
@@ -172,6 +201,7 @@ files:
|
|
172
201
|
- spec/lib/chamber/filters/translate_secure_keys_filter_spec.rb
|
173
202
|
- spec/lib/chamber/namespace_set_spec.rb
|
174
203
|
- spec/lib/chamber/settings_spec.rb
|
204
|
+
- spec/lib/chamber/types/secured_spec.rb
|
175
205
|
- spec/lib/chamber_spec.rb
|
176
206
|
- spec/rails-2-test/config.ru
|
177
207
|
- spec/rails-2-test/config/application.rb
|
@@ -209,7 +239,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
209
239
|
version: '0'
|
210
240
|
requirements: []
|
211
241
|
rubyforge_project:
|
212
|
-
rubygems_version: 2.
|
242
|
+
rubygems_version: 2.6.8
|
213
243
|
signing_key:
|
214
244
|
specification_version: 4
|
215
245
|
summary: A surprisingly configurable convention-based approach to managing your application's
|
@@ -237,6 +267,7 @@ test_files:
|
|
237
267
|
- spec/lib/chamber/filters/translate_secure_keys_filter_spec.rb
|
238
268
|
- spec/lib/chamber/namespace_set_spec.rb
|
239
269
|
- spec/lib/chamber/settings_spec.rb
|
270
|
+
- spec/lib/chamber/types/secured_spec.rb
|
240
271
|
- spec/lib/chamber_spec.rb
|
241
272
|
- spec/rails-2-test/config/application.rb
|
242
273
|
- spec/rails-2-test/config.ru
|
@@ -252,4 +283,3 @@ test_files:
|
|
252
283
|
- spec/rails-engine-test/spec/dummy/script/rails
|
253
284
|
- spec/spec_key
|
254
285
|
- spec/spec_key.pub
|
255
|
-
has_rdoc:
|
metadata.gz.sig
CHANGED
Binary file
|