mongoid_ext 0.6.1 → 0.6.2
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile +1 -0
- data/VERSION +1 -1
- data/lib/mongoid_ext.rb +1 -0
- data/lib/mongoid_ext/encryptor.rb +33 -0
- data/lib/mongoid_ext/file.rb +5 -1
- data/lib/mongoid_ext/versioning.rb +28 -5
- data/mongoid_ext.gemspec +7 -2
- data/test/models.rb +9 -0
- data/test/test_encryptor.rb +31 -0
- data/test/test_versioning.rb +3 -3
- data/test/types/test_open_struct.rb +1 -1
- data/test/types/test_set.rb +6 -1
- metadata +36 -19
data/Gemfile
CHANGED
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.6.
|
1
|
+
0.6.2
|
data/lib/mongoid_ext.rb
CHANGED
@@ -0,0 +1,33 @@
|
|
1
|
+
module MongoidExt
|
2
|
+
module Encryptor
|
3
|
+
extend ActiveSupport::Concern
|
4
|
+
|
5
|
+
included do
|
6
|
+
require 'encryptor'
|
7
|
+
end
|
8
|
+
|
9
|
+
module ClassMethods
|
10
|
+
def encrypted_field(name, options = {})
|
11
|
+
key = options.delete(:key)
|
12
|
+
raise ArgumentError, ":key option must be given" if key.nil?
|
13
|
+
|
14
|
+
field(name, options)
|
15
|
+
alias_method :"#{name}_encrypted", name
|
16
|
+
|
17
|
+
define_method(name) do
|
18
|
+
value = [send(:"#{name}_encrypted").to_s].pack('H*')
|
19
|
+
|
20
|
+
return if value.blank?
|
21
|
+
Marshal.load(::Encryptor.decrypt(value, :key => key))
|
22
|
+
end
|
23
|
+
|
24
|
+
define_method("#{name}=") do |v|
|
25
|
+
marshaled = Marshal.dump(v)
|
26
|
+
enc_value = ::Encryptor.encrypt(marshaled, :key => key).unpack('H*')[0]
|
27
|
+
|
28
|
+
write_attribute(name, enc_value)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
data/lib/mongoid_ext/file.rb
CHANGED
@@ -33,7 +33,9 @@ module Versioning
|
|
33
33
|
end
|
34
34
|
|
35
35
|
@rolling_back = true
|
36
|
-
save!
|
36
|
+
r = save!
|
37
|
+
@rolling_back = false
|
38
|
+
r
|
37
39
|
end
|
38
40
|
|
39
41
|
def load_version(pos = nil)
|
@@ -51,9 +53,30 @@ module Versioning
|
|
51
53
|
version1 = self.version_at(pos1)
|
52
54
|
version2 = self.version_at(pos2)
|
53
55
|
|
56
|
+
Differ.diff(version1.content(key), version2.content(key)).format_as(format).html_safe
|
57
|
+
end
|
58
|
+
|
59
|
+
def diff_by_word(key, pos1, pos2, format = :html)
|
60
|
+
version1 = self.version_at(pos1)
|
61
|
+
version2 = self.version_at(pos2)
|
62
|
+
|
54
63
|
Differ.diff_by_word(version1.content(key), version2.content(key)).format_as(format).html_safe
|
55
64
|
end
|
56
65
|
|
66
|
+
def diff_by_line(key, pos1, pos2, format = :html)
|
67
|
+
version1 = self.version_at(pos1)
|
68
|
+
version2 = self.version_at(pos2)
|
69
|
+
|
70
|
+
Differ.diff_by_line(version1.content(key), version2.content(key)).format_as(format).html_safe
|
71
|
+
end
|
72
|
+
|
73
|
+
def diff_by_char(key, pos1, pos2, format = :html)
|
74
|
+
version1 = self.version_at(pos1)
|
75
|
+
version2 = self.version_at(pos2)
|
76
|
+
|
77
|
+
Differ.diff_by_char(version1.content(key), version2.content(key)).format_as(format).html_safe
|
78
|
+
end
|
79
|
+
|
57
80
|
def current_version
|
58
81
|
version_klass.new(:data => self.attributes, self.class.versionable_options[:owner_field] => (self.updated_by_id_was || self.updated_by_id), :created_at => Time.now)
|
59
82
|
end
|
@@ -107,7 +130,7 @@ module Versioning
|
|
107
130
|
validates_presence_of :target_id
|
108
131
|
|
109
132
|
def content(key)
|
110
|
-
cdata = self.data[key]
|
133
|
+
cdata = self.data[key.to_s]
|
111
134
|
if cdata.respond_to?(:join)
|
112
135
|
cdata.join(" ")
|
113
136
|
else
|
@@ -162,10 +185,10 @@ module Versioning
|
|
162
185
|
uuser_id = send(self.versionable_options[:owner_field]+"_was")||send(self.versionable_options[:owner_field])
|
163
186
|
if !self.new? && !data.empty? && uuser_id
|
164
187
|
max_versions = self.versionable_options[:max_versions].to_i
|
165
|
-
if self.version_ids.size >= max_versions
|
166
|
-
old = self.version_ids.slice!(0, max_versions)
|
188
|
+
if max_versions > 0 && self.version_ids.size >= max_versions
|
189
|
+
old = self.version_ids.slice!(0, max_versions-1)
|
167
190
|
self.class.skip_callback(:save, :before, :save_version)
|
168
|
-
self.version_klass.
|
191
|
+
self.version_klass.where(:_id.in => old).delete_all
|
169
192
|
self.save
|
170
193
|
self.class.set_callback(:save, :before, :save_version)
|
171
194
|
end
|
data/mongoid_ext.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{mongoid_ext}
|
8
|
-
s.version = "0.6.
|
8
|
+
s.version = "0.6.2"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["David A. Cuadrado"]
|
12
|
-
s.date = %q{2011-
|
12
|
+
s.date = %q{2011-07-15}
|
13
13
|
s.default_executable = %q{mongoid_console}
|
14
14
|
s.description = %q{mongoid plugins}
|
15
15
|
s.email = %q{krawek@gmail.com}
|
@@ -30,6 +30,7 @@ Gem::Specification.new do |s|
|
|
30
30
|
"lib/mongoid_ext.rb",
|
31
31
|
"lib/mongoid_ext/criteria_ext.rb",
|
32
32
|
"lib/mongoid_ext/document_ext.rb",
|
33
|
+
"lib/mongoid_ext/encryptor.rb",
|
33
34
|
"lib/mongoid_ext/file.rb",
|
34
35
|
"lib/mongoid_ext/file_list.rb",
|
35
36
|
"lib/mongoid_ext/file_server.rb",
|
@@ -58,6 +59,7 @@ Gem::Specification.new do |s|
|
|
58
59
|
"test/helper.rb",
|
59
60
|
"test/models.rb",
|
60
61
|
"test/support/custom_matchers.rb",
|
62
|
+
"test/test_encryptor.rb",
|
61
63
|
"test/test_filter.rb",
|
62
64
|
"test/test_modifiers.rb",
|
63
65
|
"test/test_paranoia.rb",
|
@@ -87,6 +89,7 @@ Gem::Specification.new do |s|
|
|
87
89
|
s.add_runtime_dependency(%q<i18n>, [">= 0"])
|
88
90
|
s.add_runtime_dependency(%q<tzinfo>, [">= 0"])
|
89
91
|
s.add_runtime_dependency(%q<differ>, [">= 0.1.2"])
|
92
|
+
s.add_runtime_dependency(%q<encryptor>, ["~> 1.1.3"])
|
90
93
|
s.add_development_dependency(%q<yard>, ["~> 0.6.0"])
|
91
94
|
s.add_development_dependency(%q<bundler>, ["~> 1.0.0"])
|
92
95
|
s.add_development_dependency(%q<jeweler>, ["~> 1.5.2"])
|
@@ -101,6 +104,7 @@ Gem::Specification.new do |s|
|
|
101
104
|
s.add_dependency(%q<i18n>, [">= 0"])
|
102
105
|
s.add_dependency(%q<tzinfo>, [">= 0"])
|
103
106
|
s.add_dependency(%q<differ>, [">= 0.1.2"])
|
107
|
+
s.add_dependency(%q<encryptor>, ["~> 1.1.3"])
|
104
108
|
s.add_dependency(%q<yard>, ["~> 0.6.0"])
|
105
109
|
s.add_dependency(%q<bundler>, ["~> 1.0.0"])
|
106
110
|
s.add_dependency(%q<jeweler>, ["~> 1.5.2"])
|
@@ -116,6 +120,7 @@ Gem::Specification.new do |s|
|
|
116
120
|
s.add_dependency(%q<i18n>, [">= 0"])
|
117
121
|
s.add_dependency(%q<tzinfo>, [">= 0"])
|
118
122
|
s.add_dependency(%q<differ>, [">= 0.1.2"])
|
123
|
+
s.add_dependency(%q<encryptor>, ["~> 1.1.3"])
|
119
124
|
s.add_dependency(%q<yard>, ["~> 0.6.0"])
|
120
125
|
s.add_dependency(%q<bundler>, ["~> 1.0.0"])
|
121
126
|
s.add_dependency(%q<jeweler>, ["~> 1.5.2"])
|
data/test/models.rb
CHANGED
@@ -1,3 +1,12 @@
|
|
1
|
+
class CreditCard # for encryptor
|
2
|
+
include Mongoid::Document
|
3
|
+
include MongoidExt::Encryptor
|
4
|
+
|
5
|
+
encrypted_field :number, :type => Integer, :key => "my password"
|
6
|
+
encrypted_field :data, :type => Hash, :key => "my password"
|
7
|
+
encrypted_field :extra, :key => "my password"
|
8
|
+
end
|
9
|
+
|
1
10
|
|
2
11
|
class Event # for safe_update, and Timestamp
|
3
12
|
include Mongoid::Document
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
class StorageTest < Test::Unit::TestCase
|
4
|
+
context "Encrypting fields" do
|
5
|
+
setup do
|
6
|
+
@cc = CreditCard.create(:number => 12345, :data => {:month => 10, :year => 2014})
|
7
|
+
end
|
8
|
+
|
9
|
+
should "be able to load the number" do
|
10
|
+
@cc.reload
|
11
|
+
@cc.number.should == 12345
|
12
|
+
end
|
13
|
+
|
14
|
+
should "be able to load a hash or array" do
|
15
|
+
@cc.reload
|
16
|
+
@cc.data.should == {:month => 10, :year => 2014}
|
17
|
+
end
|
18
|
+
|
19
|
+
should "encrypt the field" do
|
20
|
+
@cc.reload
|
21
|
+
@cc.data_encrypted.should == 'd3f1d84f75f95027af7697f59c07437508ec98377a6d4104c7d7dc79967bf46b'
|
22
|
+
end
|
23
|
+
|
24
|
+
should "not fail with nil values" do
|
25
|
+
@cc.data = nil
|
26
|
+
@cc.save
|
27
|
+
@cc.reload
|
28
|
+
@cc.data.should == nil
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
data/test/test_versioning.rb
CHANGED
@@ -24,9 +24,8 @@ class TestVersioning < Test::Unit::TestCase
|
|
24
24
|
@blogpost.title = "sistemas operativos"
|
25
25
|
@blogpost.save!
|
26
26
|
@blogpost.reload
|
27
|
-
|
28
|
-
@blogpost.
|
29
|
-
@blogpost.diff(:title, 0, "current", :ascii).should == '{-"sistemas operativos"}'
|
27
|
+
@blogpost.diff_by_word(:title, "current", 0, :ascii).should == "{\"operating\" >> \"sistemas\"} {\"systems\" >> \"operativos\"}"
|
28
|
+
@blogpost.diff_by_line(:title, 0, "current", :ascii).should == "{\"sistemas operativos\" >> \"operating systems\"}"
|
30
29
|
end
|
31
30
|
|
32
31
|
should "be able to restore a previous version" do
|
@@ -49,6 +48,7 @@ class TestVersioning < Test::Unit::TestCase
|
|
49
48
|
@blogpost.title = "sistemas operativos 3"
|
50
49
|
@blogpost.save!
|
51
50
|
@blogpost.reload
|
51
|
+
|
52
52
|
@blogpost.versions.count.should == 2
|
53
53
|
end
|
54
54
|
end
|
data/test/types/test_set.rb
CHANGED
@@ -7,7 +7,9 @@ class SetTest < Test::Unit::TestCase
|
|
7
7
|
|
8
8
|
context "working with sets" do
|
9
9
|
setup do
|
10
|
-
@recipe = Recipe.
|
10
|
+
@recipe = Recipe.new
|
11
|
+
@recipe.ingredients = Set.new(%w[salt sugar water salt sugar water])
|
12
|
+
@recipe.save
|
11
13
|
end
|
12
14
|
|
13
15
|
should "not have duplicates" do
|
@@ -20,6 +22,9 @@ class SetTest < Test::Unit::TestCase
|
|
20
22
|
should "not add duplicates" do
|
21
23
|
original_size = @recipe.ingredients.size
|
22
24
|
@recipe.ingredients << "salt"
|
25
|
+
@recipe.save
|
26
|
+
@recipe.reload
|
27
|
+
|
23
28
|
@recipe.ingredients.size.should == original_size
|
24
29
|
end
|
25
30
|
end
|
metadata
CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 0
|
7
7
|
- 6
|
8
|
-
-
|
9
|
-
version: 0.6.
|
8
|
+
- 2
|
9
|
+
version: 0.6.2
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- David A. Cuadrado
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2011-
|
17
|
+
date: 2011-07-15 00:00:00 -05:00
|
18
18
|
default_executable: mongoid_console
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
@@ -87,8 +87,23 @@ dependencies:
|
|
87
87
|
prerelease: false
|
88
88
|
version_requirements: *id005
|
89
89
|
- !ruby/object:Gem::Dependency
|
90
|
-
name:
|
90
|
+
name: encryptor
|
91
91
|
requirement: &id006 !ruby/object:Gem::Requirement
|
92
|
+
none: false
|
93
|
+
requirements:
|
94
|
+
- - ~>
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
segments:
|
97
|
+
- 1
|
98
|
+
- 1
|
99
|
+
- 3
|
100
|
+
version: 1.1.3
|
101
|
+
type: :runtime
|
102
|
+
prerelease: false
|
103
|
+
version_requirements: *id006
|
104
|
+
- !ruby/object:Gem::Dependency
|
105
|
+
name: yard
|
106
|
+
requirement: &id007 !ruby/object:Gem::Requirement
|
92
107
|
none: false
|
93
108
|
requirements:
|
94
109
|
- - ~>
|
@@ -100,10 +115,10 @@ dependencies:
|
|
100
115
|
version: 0.6.0
|
101
116
|
type: :development
|
102
117
|
prerelease: false
|
103
|
-
version_requirements: *
|
118
|
+
version_requirements: *id007
|
104
119
|
- !ruby/object:Gem::Dependency
|
105
120
|
name: bundler
|
106
|
-
requirement: &
|
121
|
+
requirement: &id008 !ruby/object:Gem::Requirement
|
107
122
|
none: false
|
108
123
|
requirements:
|
109
124
|
- - ~>
|
@@ -115,10 +130,10 @@ dependencies:
|
|
115
130
|
version: 1.0.0
|
116
131
|
type: :development
|
117
132
|
prerelease: false
|
118
|
-
version_requirements: *
|
133
|
+
version_requirements: *id008
|
119
134
|
- !ruby/object:Gem::Dependency
|
120
135
|
name: jeweler
|
121
|
-
requirement: &
|
136
|
+
requirement: &id009 !ruby/object:Gem::Requirement
|
122
137
|
none: false
|
123
138
|
requirements:
|
124
139
|
- - ~>
|
@@ -130,10 +145,10 @@ dependencies:
|
|
130
145
|
version: 1.5.2
|
131
146
|
type: :development
|
132
147
|
prerelease: false
|
133
|
-
version_requirements: *
|
148
|
+
version_requirements: *id009
|
134
149
|
- !ruby/object:Gem::Dependency
|
135
150
|
name: shoulda
|
136
|
-
requirement: &
|
151
|
+
requirement: &id010 !ruby/object:Gem::Requirement
|
137
152
|
none: false
|
138
153
|
requirements:
|
139
154
|
- - ~>
|
@@ -145,10 +160,10 @@ dependencies:
|
|
145
160
|
version: 2.11.3
|
146
161
|
type: :development
|
147
162
|
prerelease: false
|
148
|
-
version_requirements: *
|
163
|
+
version_requirements: *id010
|
149
164
|
- !ruby/object:Gem::Dependency
|
150
165
|
name: jnunemaker-matchy
|
151
|
-
requirement: &
|
166
|
+
requirement: &id011 !ruby/object:Gem::Requirement
|
152
167
|
none: false
|
153
168
|
requirements:
|
154
169
|
- - ~>
|
@@ -159,10 +174,10 @@ dependencies:
|
|
159
174
|
version: "0.4"
|
160
175
|
type: :development
|
161
176
|
prerelease: false
|
162
|
-
version_requirements: *
|
177
|
+
version_requirements: *id011
|
163
178
|
- !ruby/object:Gem::Dependency
|
164
179
|
name: shoulda
|
165
|
-
requirement: &
|
180
|
+
requirement: &id012 !ruby/object:Gem::Requirement
|
166
181
|
none: false
|
167
182
|
requirements:
|
168
183
|
- - ~>
|
@@ -174,10 +189,10 @@ dependencies:
|
|
174
189
|
version: 2.11.3
|
175
190
|
type: :development
|
176
191
|
prerelease: false
|
177
|
-
version_requirements: *
|
192
|
+
version_requirements: *id012
|
178
193
|
- !ruby/object:Gem::Dependency
|
179
194
|
name: mocha
|
180
|
-
requirement: &
|
195
|
+
requirement: &id013 !ruby/object:Gem::Requirement
|
181
196
|
none: false
|
182
197
|
requirements:
|
183
198
|
- - ~>
|
@@ -189,10 +204,10 @@ dependencies:
|
|
189
204
|
version: 0.9.4
|
190
205
|
type: :development
|
191
206
|
prerelease: false
|
192
|
-
version_requirements: *
|
207
|
+
version_requirements: *id013
|
193
208
|
- !ruby/object:Gem::Dependency
|
194
209
|
name: timecop
|
195
|
-
requirement: &
|
210
|
+
requirement: &id014 !ruby/object:Gem::Requirement
|
196
211
|
none: false
|
197
212
|
requirements:
|
198
213
|
- - ">="
|
@@ -202,7 +217,7 @@ dependencies:
|
|
202
217
|
version: "0"
|
203
218
|
type: :development
|
204
219
|
prerelease: false
|
205
|
-
version_requirements: *
|
220
|
+
version_requirements: *id014
|
206
221
|
description: mongoid plugins
|
207
222
|
email: krawek@gmail.com
|
208
223
|
executables:
|
@@ -224,6 +239,7 @@ files:
|
|
224
239
|
- lib/mongoid_ext.rb
|
225
240
|
- lib/mongoid_ext/criteria_ext.rb
|
226
241
|
- lib/mongoid_ext/document_ext.rb
|
242
|
+
- lib/mongoid_ext/encryptor.rb
|
227
243
|
- lib/mongoid_ext/file.rb
|
228
244
|
- lib/mongoid_ext/file_list.rb
|
229
245
|
- lib/mongoid_ext/file_server.rb
|
@@ -252,6 +268,7 @@ files:
|
|
252
268
|
- test/helper.rb
|
253
269
|
- test/models.rb
|
254
270
|
- test/support/custom_matchers.rb
|
271
|
+
- test/test_encryptor.rb
|
255
272
|
- test/test_filter.rb
|
256
273
|
- test/test_modifiers.rb
|
257
274
|
- test/test_paranoia.rb
|