attr_encrypted-magicless 1.3.42

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,306 @@
1
+ # -*- encoding: utf-8 -*-
2
+ require File.expand_path('../test_helper', __FILE__)
3
+
4
+ class LegacySillyEncryptor
5
+ def self.silly_encrypt(options)
6
+ (options[:value] + options[:some_arg]).reverse
7
+ end
8
+
9
+ def self.silly_decrypt(options)
10
+ options[:value].reverse.gsub(/#{options[:some_arg]}$/, '')
11
+ end
12
+ end
13
+
14
+ class LegacyUser
15
+ include AttrEncrypted
16
+
17
+ self.attr_encrypted_options[:key] = Proc.new { |user| user.class.to_s } # default key
18
+
19
+ attr_encrypted :email, :without_encoding, :key => 'secret key'
20
+ attr_encrypted :password, :prefix => 'crypted_', :suffix => '_test'
21
+ attr_encrypted :ssn, :key => :salt, :attribute => 'ssn_encrypted'
22
+ attr_encrypted :credit_card, :encryptor => LegacySillyEncryptor, :encrypt_method => :silly_encrypt, :decrypt_method => :silly_decrypt, :some_arg => 'test'
23
+ attr_encrypted :with_encoding, :key => 'secret key', :encode => true
24
+ attr_encrypted :with_custom_encoding, :key => 'secret key', :encode => 'm'
25
+ attr_encrypted :with_marshaling, :key => 'secret key', :marshal => true
26
+ attr_encrypted :with_true_if, :key => 'secret key', :if => true
27
+ attr_encrypted :with_false_if, :key => 'secret key', :if => false
28
+ attr_encrypted :with_true_unless, :key => 'secret key', :unless => true
29
+ attr_encrypted :with_false_unless, :key => 'secret key', :unless => false
30
+ attr_encrypted :with_if_changed, :key => 'secret key', :if => :should_encrypt
31
+
32
+ attr_encryptor :aliased, :key => 'secret_key'
33
+
34
+ attr_accessor :salt
35
+ attr_accessor :should_encrypt
36
+
37
+ def initialize
38
+ self.salt = Time.now.to_i.to_s
39
+ self.should_encrypt = true
40
+ end
41
+ end
42
+
43
+ class LegacyAdmin < LegacyUser
44
+ attr_encrypted :testing
45
+ end
46
+
47
+ class LegacySomeOtherClass
48
+ include AttrEncrypted
49
+
50
+ def self.call(object)
51
+ object.class
52
+ end
53
+ end
54
+
55
+ class CryptedObject
56
+ include AttrEncrypted
57
+ end
58
+
59
+
60
+ class LegacyAttrEncryptedTest < Minitest::Test
61
+
62
+ def test_should_store_email_in_encrypted_attributes
63
+ assert LegacyUser.encrypted_attributes.include?(:email)
64
+ end
65
+
66
+ def test_should_not_store_salt_in_encrypted_attributes
67
+ assert !LegacyUser.encrypted_attributes.include?(:salt)
68
+ end
69
+
70
+ def test_attr_encrypted_should_return_true_for_email
71
+ assert LegacyUser.attr_encrypted?('email')
72
+ end
73
+
74
+ def test_attr_encrypted_should_not_use_the_same_attribute_name_for_two_attributes_in_the_same_line
75
+ refute_equal LegacyUser.encrypted_attributes[:email][:attribute], LegacyUser.encrypted_attributes[:without_encoding][:attribute]
76
+ end
77
+
78
+ def test_attr_encrypted_should_return_false_for_salt
79
+ assert !LegacyUser.attr_encrypted?('salt')
80
+ end
81
+
82
+ def test_should_generate_an_encrypted_attribute
83
+ assert LegacyUser.new.respond_to?(:encrypted_email)
84
+ end
85
+
86
+ def test_should_generate_an_encrypted_attribute_with_a_prefix_and_suffix
87
+ assert LegacyUser.new.respond_to?(:crypted_password_test)
88
+ end
89
+
90
+ def test_should_generate_an_encrypted_attribute_with_the_attribute_option
91
+ assert LegacyUser.new.respond_to?(:ssn_encrypted)
92
+ end
93
+
94
+ def test_should_not_encrypt_nil_value
95
+ assert_nil LegacyUser.encrypt_email(nil)
96
+ end
97
+
98
+ def test_should_not_encrypt_empty_string
99
+ assert_equal '', LegacyUser.encrypt_email('')
100
+ end
101
+
102
+ def test_should_encrypt_email
103
+ refute_nil LegacyUser.encrypt_email('test@example.com')
104
+ refute_equal 'test@example.com', LegacyUser.encrypt_email('test@example.com')
105
+ end
106
+
107
+ def test_should_encrypt_email_when_modifying_the_attr_writer
108
+ @user = LegacyUser.new
109
+ assert_nil @user.encrypted_email
110
+ @user.email = 'test@example.com'
111
+ refute_nil @user.encrypted_email
112
+ assert_equal LegacyUser.encrypt_email('test@example.com'), @user.encrypted_email
113
+ end
114
+
115
+ def test_should_not_decrypt_nil_value
116
+ assert_nil LegacyUser.decrypt_email(nil)
117
+ end
118
+
119
+ def test_should_not_decrypt_empty_string
120
+ assert_equal '', LegacyUser.decrypt_email('')
121
+ end
122
+
123
+ def test_should_decrypt_email
124
+ encrypted_email = LegacyUser.encrypt_email('test@example.com')
125
+ refute_equal 'test@test.com', encrypted_email
126
+ assert_equal 'test@example.com', LegacyUser.decrypt_email(encrypted_email)
127
+ end
128
+
129
+ def test_should_decrypt_email_when_reading
130
+ @user = LegacyUser.new
131
+ assert_nil @user.email
132
+ @user.encrypted_email = LegacyUser.encrypt_email('test@example.com')
133
+ assert_equal 'test@example.com', @user.email
134
+ end
135
+
136
+ def test_should_encrypt_with_encoding
137
+ assert_equal LegacyUser.encrypt_with_encoding('test'), [LegacyUser.encrypt_without_encoding('test')].pack('m')
138
+ end
139
+
140
+ def test_should_decrypt_with_encoding
141
+ encrypted = LegacyUser.encrypt_with_encoding('test')
142
+ assert_equal 'test', LegacyUser.decrypt_with_encoding(encrypted)
143
+ assert_equal LegacyUser.decrypt_with_encoding(encrypted), LegacyUser.decrypt_without_encoding(encrypted.unpack('m').first)
144
+ end
145
+
146
+ def test_should_decrypt_utf8_with_encoding
147
+ encrypted = LegacyUser.encrypt_with_encoding("test\xC2\xA0utf-8\xC2\xA0text")
148
+ assert_equal "test\xC2\xA0utf-8\xC2\xA0text", LegacyUser.decrypt_with_encoding(encrypted)
149
+ assert_equal LegacyUser.decrypt_with_encoding(encrypted), LegacyUser.decrypt_without_encoding(encrypted.unpack('m').first)
150
+ end
151
+
152
+ def test_should_encrypt_with_custom_encoding
153
+ assert_equal LegacyUser.encrypt_with_custom_encoding('test'), [LegacyUser.encrypt_without_encoding('test')].pack('m')
154
+ end
155
+
156
+ def test_should_decrypt_with_custom_encoding
157
+ encrypted = LegacyUser.encrypt_with_custom_encoding('test')
158
+ assert_equal 'test', LegacyUser.decrypt_with_custom_encoding(encrypted)
159
+ assert_equal LegacyUser.decrypt_with_custom_encoding(encrypted), LegacyUser.decrypt_without_encoding(encrypted.unpack('m').first)
160
+ end
161
+
162
+ def test_should_encrypt_with_marshaling
163
+ @user = LegacyUser.new
164
+ @user.with_marshaling = [1, 2, 3]
165
+ refute_nil @user.encrypted_with_marshaling
166
+ assert_equal LegacyUser.encrypt_with_marshaling([1, 2, 3]), @user.encrypted_with_marshaling
167
+ end
168
+
169
+ def test_should_decrypt_with_marshaling
170
+ encrypted = LegacyUser.encrypt_with_marshaling([1, 2, 3])
171
+ @user = LegacyUser.new
172
+ assert_nil @user.with_marshaling
173
+ @user.encrypted_with_marshaling = encrypted
174
+ assert_equal [1, 2, 3], @user.with_marshaling
175
+ end
176
+
177
+ def test_should_use_custom_encryptor_and_crypt_method_names_and_arguments
178
+ assert_equal LegacySillyEncryptor.silly_encrypt(:value => 'testing', :some_arg => 'test'), LegacyUser.encrypt_credit_card('testing')
179
+ end
180
+
181
+ def test_should_evaluate_a_key_passed_as_a_symbol
182
+ @user = LegacyUser.new
183
+ assert_nil @user.ssn_encrypted
184
+ @user.ssn = 'testing'
185
+ refute_nil @user.ssn_encrypted
186
+ assert_equal Encryptor.encrypt(:value => 'testing', :key => @user.salt), @user.ssn_encrypted
187
+ end
188
+
189
+ def test_should_evaluate_a_key_passed_as_a_proc
190
+ @user = LegacyUser.new
191
+ assert_nil @user.crypted_password_test
192
+ @user.password = 'testing'
193
+ refute_nil @user.crypted_password_test
194
+ assert_equal Encryptor.encrypt(:value => 'testing', :key => 'LegacyUser'), @user.crypted_password_test
195
+ end
196
+
197
+ def test_should_use_options_found_in_the_attr_encrypted_options_attribute
198
+ @user = LegacyUser.new
199
+ assert_nil @user.crypted_password_test
200
+ @user.password = 'testing'
201
+ refute_nil @user.crypted_password_test
202
+ assert_equal Encryptor.encrypt(:value => 'testing', :key => 'LegacyUser'), @user.crypted_password_test
203
+ end
204
+
205
+ def test_should_inherit_encrypted_attributes
206
+ assert_equal [LegacyUser.encrypted_attributes.keys, :testing].flatten.collect { |key| key.to_s }.sort, LegacyAdmin.encrypted_attributes.keys.collect { |key| key.to_s }.sort
207
+ end
208
+
209
+ def test_should_inherit_attr_encrypted_options
210
+ assert !LegacyUser.attr_encrypted_options.empty?
211
+ assert_equal LegacyUser.attr_encrypted_options, LegacyAdmin.attr_encrypted_options
212
+ end
213
+
214
+ def test_should_not_inherit_unrelated_attributes
215
+ assert LegacySomeOtherClass.attr_encrypted_options.empty?
216
+ assert LegacySomeOtherClass.encrypted_attributes.empty?
217
+ end
218
+
219
+ def test_should_evaluate_a_symbol_option
220
+ assert_equal CryptedObject, CryptedObject.new.send(:evaluate_attr_encrypted_option, :class)
221
+ end
222
+
223
+ def test_should_evaluate_a_proc_option
224
+ assert_equal CryptedObject, CryptedObject.new.send(:evaluate_attr_encrypted_option, proc { |object| object.class })
225
+ end
226
+
227
+ def test_should_evaluate_a_lambda_option
228
+ assert_equal CryptedObject, CryptedObject.new.send(:evaluate_attr_encrypted_option, lambda { |object| object.class })
229
+ end
230
+
231
+ def test_should_evaluate_a_method_option
232
+ assert_equal CryptedObject, CryptedObject.new.send(:evaluate_attr_encrypted_option, LegacySomeOtherClass.method(:call))
233
+ end
234
+
235
+ def test_should_return_a_string_option
236
+ assert_equal 'CryptedObject', CryptedObject.new.send(:evaluate_attr_encrypted_option, 'CryptedObject')
237
+ end
238
+
239
+ def test_should_encrypt_with_true_if
240
+ @user = LegacyUser.new
241
+ assert_nil @user.encrypted_with_true_if
242
+ @user.with_true_if = 'testing'
243
+ refute_nil @user.encrypted_with_true_if
244
+ assert_equal Encryptor.encrypt(:value => 'testing', :key => 'secret key'), @user.encrypted_with_true_if
245
+ end
246
+
247
+ def test_should_not_encrypt_with_false_if
248
+ @user = LegacyUser.new
249
+ assert_nil @user.encrypted_with_false_if
250
+ @user.with_false_if = 'testing'
251
+ refute_nil @user.encrypted_with_false_if
252
+ assert_equal 'testing', @user.encrypted_with_false_if
253
+ end
254
+
255
+ def test_should_encrypt_with_false_unless
256
+ @user = LegacyUser.new
257
+ assert_nil @user.encrypted_with_false_unless
258
+ @user.with_false_unless = 'testing'
259
+ refute_nil @user.encrypted_with_false_unless
260
+ assert_equal Encryptor.encrypt(:value => 'testing', :key => 'secret key'), @user.encrypted_with_false_unless
261
+ end
262
+
263
+ def test_should_not_encrypt_with_true_unless
264
+ @user = LegacyUser.new
265
+ assert_nil @user.encrypted_with_true_unless
266
+ @user.with_true_unless = 'testing'
267
+ refute_nil @user.encrypted_with_true_unless
268
+ assert_equal 'testing', @user.encrypted_with_true_unless
269
+ end
270
+
271
+ def test_should_work_with_aliased_attr_encryptor
272
+ assert LegacyUser.encrypted_attributes.include?(:aliased)
273
+ end
274
+
275
+ def test_should_always_reset_options
276
+ @user = LegacyUser.new
277
+ @user.with_if_changed = "encrypt_stuff"
278
+ @user.stubs(:instance_variable_get).returns(nil)
279
+ @user.stubs(:instance_variable_set).raises("BadStuff")
280
+ assert_raises RuntimeError do
281
+ @user.with_if_changed
282
+ end
283
+
284
+ @user = LegacyUser.new
285
+ @user.should_encrypt = false
286
+ @user.with_if_changed = "not_encrypted_stuff"
287
+ assert_equal "not_encrypted_stuff", @user.with_if_changed
288
+ assert_equal "not_encrypted_stuff", @user.encrypted_with_if_changed
289
+ end
290
+
291
+ def test_should_cast_values_as_strings_before_encrypting
292
+ string_encrypted_email = LegacyUser.encrypt_email('3')
293
+ assert_equal string_encrypted_email, LegacyUser.encrypt_email(3)
294
+ assert_equal '3', LegacyUser.decrypt_email(string_encrypted_email)
295
+ end
296
+
297
+ def test_should_create_query_accessor
298
+ @user = LegacyUser.new
299
+ assert !@user.email?
300
+ @user.email = ''
301
+ assert !@user.email?
302
+ @user.email = 'test@example.com'
303
+ assert @user.email?
304
+ end
305
+
306
+ end
@@ -0,0 +1,87 @@
1
+ # -*- encoding: utf-8 -*-
2
+ require File.expand_path('../test_helper', __FILE__)
3
+
4
+ # Test to ensure that existing representations in database do not break on
5
+ # migrating to new versions of this gem. This ensures that future versions of
6
+ # this gem will retain backwards compatibility with data generated by earlier
7
+ # versions.
8
+ class LegacyCompatibilityTest < Minitest::Test
9
+ class LegacyNonmarshallingPet < ActiveRecord::Base
10
+ PET_NICKNAME_SALT = Digest::SHA256.hexdigest('my-really-really-secret-pet-nickname-salt')
11
+ PET_NICKNAME_KEY = 'my-really-really-secret-pet-nickname-key'
12
+ PET_BIRTHDATE_SALT = Digest::SHA256.hexdigest('my-really-really-secret-pet-birthdate-salt')
13
+ PET_BIRTHDATE_KEY = 'my-really-really-secret-pet-birthdate-key'
14
+
15
+ attr_encrypted :nickname,
16
+ :key => proc { Encryptor.encrypt(:value => PET_NICKNAME_SALT, :key => PET_NICKNAME_KEY) }
17
+ attr_encrypted :birthdate,
18
+ :key => proc { Encryptor.encrypt(:value => PET_BIRTHDATE_SALT, :key => PET_BIRTHDATE_KEY) }
19
+ end
20
+
21
+ class LegacyMarshallingPet < ActiveRecord::Base
22
+ PET_NICKNAME_SALT = Digest::SHA256.hexdigest('my-really-really-secret-pet-nickname-salt')
23
+ PET_NICKNAME_KEY = 'my-really-really-secret-pet-nickname-key'
24
+ PET_BIRTHDATE_SALT = Digest::SHA256.hexdigest('my-really-really-secret-pet-birthdate-salt')
25
+ PET_BIRTHDATE_KEY = 'my-really-really-secret-pet-birthdate-key'
26
+
27
+ attr_encrypted :nickname,
28
+ :key => proc { Encryptor.encrypt(:value => PET_NICKNAME_SALT, :key => PET_NICKNAME_KEY) },
29
+ :marshal => true
30
+ attr_encrypted :birthdate,
31
+ :key => proc { Encryptor.encrypt(:value => PET_BIRTHDATE_SALT, :key => PET_BIRTHDATE_KEY) },
32
+ :marshal => true
33
+ end
34
+
35
+ def setup
36
+ ActiveRecord::Base.connection.tables.each { |table| ActiveRecord::Base.connection.drop_table(table) }
37
+ create_tables
38
+ end
39
+
40
+ def test_nonmarshalling_backwards_compatibility
41
+ pet = LegacyNonmarshallingPet.create!(
42
+ :name => 'Fido',
43
+ :encrypted_nickname => 'uSUB6KGzta87yxesyVc3DA==',
44
+ :encrypted_birthdate => 'I3d691B2PtFXLx15kO067g=='
45
+ )
46
+
47
+ assert_equal 'Fido', pet.name
48
+ assert_equal 'Fido the Dog', pet.nickname
49
+ assert_equal '2011-07-09', pet.birthdate
50
+ end
51
+
52
+ def test_marshalling_backwards_compatibility
53
+ pet = LegacyMarshallingPet.create!(
54
+ :name => 'Fido',
55
+ :encrypted_nickname => '7RwoT64in4H+fGVBPYtRcN0K4RtriIy1EP4nDojUa8g=',
56
+ :encrypted_birthdate => 'bSp9sJhXQSp2QlNZHiujtcK4lRVBE8HQhn1y7moQ63bGJR20hvRSZ73ePAmm+wc5'
57
+ )
58
+
59
+ assert_equal 'Fido', pet.name
60
+ assert_equal 'Mummy\'s little helper', pet.nickname
61
+
62
+ assert_equal Date.new(2011, 7, 9), pet.birthdate
63
+ end
64
+
65
+ private
66
+
67
+ def create_tables
68
+ silence_stream(STDOUT) do
69
+ ActiveRecord::Schema.define(:version => 1) do
70
+ create_table :legacy_nonmarshalling_pets do |t|
71
+ t.string :name
72
+ t.string :encrypted_nickname
73
+ t.string :encrypted_birthdate
74
+ t.string :salt
75
+ end
76
+ create_table :legacy_marshalling_pets do |t|
77
+ t.string :name
78
+ t.string :encrypted_nickname
79
+ t.string :encrypted_birthdate
80
+ t.string :salt
81
+ end
82
+ end
83
+ end
84
+ end
85
+ end
86
+
87
+ ActiveRecord::Base.establish_connection :adapter => 'sqlite3', :database => ':memory:'
@@ -0,0 +1,38 @@
1
+ if RUBY_VERSION >= '1.9.3'
2
+ require 'simplecov'
3
+ require 'simplecov-rcov'
4
+
5
+ SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter[
6
+ SimpleCov::Formatter::HTMLFormatter,
7
+ SimpleCov::Formatter::RcovFormatter,
8
+ ]
9
+
10
+ SimpleCov.start do
11
+ add_filter 'test'
12
+ end
13
+ end
14
+
15
+ # ENV['ACTIVE_RECORD_VERSION'] ||= ENV['ACTIVERECORD']
16
+
17
+ require 'minitest'
18
+ require 'minitest/autorun'
19
+ require 'digest/sha2'
20
+ require 'rubygems'
21
+ gem 'activerecord', ENV['ACTIVE_RECORD_VERSION'] if ENV['ACTIVE_RECORD_VERSION']
22
+ require 'active_record'
23
+ require 'mocha/test_unit'
24
+
25
+ $:.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
26
+ $:.unshift(File.dirname(__FILE__))
27
+ require 'attr_encrypted'
28
+
29
+ require 'active_support/lazy_load_hooks'
30
+
31
+ ActiveSupport.on_load(:active_record) do
32
+ include AttrEncrypted
33
+ end
34
+
35
+ puts "\nTesting with ActiveRecord #{ActiveRecord::VERSION::STRING rescue ENV['ACTIVE_RECORD_VERSION']}"
36
+
37
+ SECRET_KEY = 4.times.map { Digest::SHA256.hexdigest((Time.now.to_i * rand(5)).to_s) }.join
38
+
metadata ADDED
@@ -0,0 +1,245 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: attr_encrypted-magicless
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.3.42
5
+ platform: ruby
6
+ authors:
7
+ - Sean Huber
8
+ - S. Brent Faulkner
9
+ - William Monk
10
+ - Stephen Aghaulor
11
+ autorequire:
12
+ bindir: exe
13
+ cert_chain: []
14
+ date: 2015-09-09 00:00:00.000000000 Z
15
+ dependencies:
16
+ - !ruby/object:Gem::Dependency
17
+ name: encryptor
18
+ requirement: !ruby/object:Gem::Requirement
19
+ requirements:
20
+ - - ">="
21
+ - !ruby/object:Gem::Version
22
+ version: 1.3.0
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ version: 1.3.0
30
+ - !ruby/object:Gem::Dependency
31
+ name: activesupport
32
+ requirement: !ruby/object:Gem::Requirement
33
+ requirements:
34
+ - - ">="
35
+ - !ruby/object:Gem::Version
36
+ version: '4.0'
37
+ - - "<"
38
+ - !ruby/object:Gem::Version
39
+ version: '5.0'
40
+ type: :runtime
41
+ prerelease: false
42
+ version_requirements: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: '4.0'
47
+ - - "<"
48
+ - !ruby/object:Gem::Version
49
+ version: '5.0'
50
+ - !ruby/object:Gem::Dependency
51
+ name: bundler
52
+ requirement: !ruby/object:Gem::Requirement
53
+ requirements:
54
+ - - "~>"
55
+ - !ruby/object:Gem::Version
56
+ version: '1.10'
57
+ type: :development
58
+ prerelease: false
59
+ version_requirements: !ruby/object:Gem::Requirement
60
+ requirements:
61
+ - - "~>"
62
+ - !ruby/object:Gem::Version
63
+ version: '1.10'
64
+ - !ruby/object:Gem::Dependency
65
+ name: rake
66
+ requirement: !ruby/object:Gem::Requirement
67
+ requirements:
68
+ - - "~>"
69
+ - !ruby/object:Gem::Version
70
+ version: '10.0'
71
+ type: :development
72
+ prerelease: false
73
+ version_requirements: !ruby/object:Gem::Requirement
74
+ requirements:
75
+ - - "~>"
76
+ - !ruby/object:Gem::Version
77
+ version: '10.0'
78
+ - !ruby/object:Gem::Dependency
79
+ name: rdoc
80
+ requirement: !ruby/object:Gem::Requirement
81
+ requirements:
82
+ - - ">="
83
+ - !ruby/object:Gem::Version
84
+ version: '0'
85
+ type: :development
86
+ prerelease: false
87
+ version_requirements: !ruby/object:Gem::Requirement
88
+ requirements:
89
+ - - ">="
90
+ - !ruby/object:Gem::Version
91
+ version: '0'
92
+ - !ruby/object:Gem::Dependency
93
+ name: sqlite3
94
+ requirement: !ruby/object:Gem::Requirement
95
+ requirements:
96
+ - - ">="
97
+ - !ruby/object:Gem::Version
98
+ version: '0'
99
+ type: :development
100
+ prerelease: false
101
+ version_requirements: !ruby/object:Gem::Requirement
102
+ requirements:
103
+ - - ">="
104
+ - !ruby/object:Gem::Version
105
+ version: '0'
106
+ - !ruby/object:Gem::Dependency
107
+ name: activerecord
108
+ requirement: !ruby/object:Gem::Requirement
109
+ requirements:
110
+ - - ">="
111
+ - !ruby/object:Gem::Version
112
+ version: '4.0'
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: '4.0'
123
+ - - "<"
124
+ - !ruby/object:Gem::Version
125
+ version: '5.0'
126
+ - !ruby/object:Gem::Dependency
127
+ name: minitest
128
+ requirement: !ruby/object:Gem::Requirement
129
+ requirements:
130
+ - - ">="
131
+ - !ruby/object:Gem::Version
132
+ version: '0'
133
+ type: :development
134
+ prerelease: false
135
+ version_requirements: !ruby/object:Gem::Requirement
136
+ requirements:
137
+ - - ">="
138
+ - !ruby/object:Gem::Version
139
+ version: '0'
140
+ - !ruby/object:Gem::Dependency
141
+ name: mocha
142
+ requirement: !ruby/object:Gem::Requirement
143
+ requirements:
144
+ - - "~>"
145
+ - !ruby/object:Gem::Version
146
+ version: 1.0.0
147
+ type: :development
148
+ prerelease: false
149
+ version_requirements: !ruby/object:Gem::Requirement
150
+ requirements:
151
+ - - "~>"
152
+ - !ruby/object:Gem::Version
153
+ version: 1.0.0
154
+ - !ruby/object:Gem::Dependency
155
+ name: simplecov
156
+ requirement: !ruby/object:Gem::Requirement
157
+ requirements:
158
+ - - ">="
159
+ - !ruby/object:Gem::Version
160
+ version: '0'
161
+ type: :development
162
+ prerelease: false
163
+ version_requirements: !ruby/object:Gem::Requirement
164
+ requirements:
165
+ - - ">="
166
+ - !ruby/object:Gem::Version
167
+ version: '0'
168
+ - !ruby/object:Gem::Dependency
169
+ name: simplecov-rcov
170
+ requirement: !ruby/object:Gem::Requirement
171
+ requirements:
172
+ - - ">="
173
+ - !ruby/object:Gem::Version
174
+ version: '0'
175
+ type: :development
176
+ prerelease: false
177
+ version_requirements: !ruby/object:Gem::Requirement
178
+ requirements:
179
+ - - ">="
180
+ - !ruby/object:Gem::Version
181
+ version: '0'
182
+ description: Generates attr_accessors that encrypt and decrypt attributes transparently
183
+ email:
184
+ - shuber@huberry.com
185
+ - sbfaulkner@gmail.com
186
+ - billy.monk@gmail.com
187
+ - saghaulor@gmail.com
188
+ executables: []
189
+ extensions: []
190
+ extra_rdoc_files: []
191
+ files:
192
+ - ".gitignore"
193
+ - ".travis.yml"
194
+ - Gemfile
195
+ - MIT-LICENSE
196
+ - README.rdoc
197
+ - Rakefile
198
+ - attr_encrypted-magicless.gemspec
199
+ - lib/attr_encrypted-magicless.rb
200
+ - lib/attr_encrypted.rb
201
+ - lib/attr_encrypted/adapters/active_record.rb
202
+ - lib/attr_encrypted/version.rb
203
+ - test/active_record_test.rb
204
+ - test/attr_encrypted_test.rb
205
+ - test/compatibility_test.rb
206
+ - test/legacy_active_record_test.rb
207
+ - test/legacy_attr_encrypted_test.rb
208
+ - test/legacy_compatibility_test.rb
209
+ - test/test_helper.rb
210
+ homepage: https://github.com/estum/attr_encrypted
211
+ licenses: []
212
+ metadata: {}
213
+ post_install_message:
214
+ rdoc_options:
215
+ - "--line-numbers"
216
+ - "--inline-source"
217
+ - "--main"
218
+ - README.rdoc
219
+ require_paths:
220
+ - lib
221
+ required_ruby_version: !ruby/object:Gem::Requirement
222
+ requirements:
223
+ - - ">="
224
+ - !ruby/object:Gem::Version
225
+ version: '0'
226
+ required_rubygems_version: !ruby/object:Gem::Requirement
227
+ requirements:
228
+ - - ">="
229
+ - !ruby/object:Gem::Version
230
+ version: '0'
231
+ requirements: []
232
+ rubyforge_project:
233
+ rubygems_version: 2.4.8
234
+ signing_key:
235
+ specification_version: 4
236
+ summary: Encrypt and decrypt attributes
237
+ test_files:
238
+ - test/active_record_test.rb
239
+ - test/attr_encrypted_test.rb
240
+ - test/compatibility_test.rb
241
+ - test/legacy_active_record_test.rb
242
+ - test/legacy_attr_encrypted_test.rb
243
+ - test/legacy_compatibility_test.rb
244
+ - test/test_helper.rb
245
+ has_rdoc: false