populate-me 0.1.8 → 0.2.0

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
2
  SHA1:
3
- metadata.gz: 0da7af0c111b47e4027615b2db466b6b5564ee1b
4
- data.tar.gz: 6323247fa15e8b90a5fc8944273d93405782ff93
3
+ metadata.gz: 10a0d904a55bc88de4e01af6c15816cc3c943a78
4
+ data.tar.gz: cc36c361bd647861681d153f5bf2e9d9046a7e73
5
5
  SHA512:
6
- metadata.gz: f8fe0a34b4f19b495b3fa77bcd833ebdbe83ecfaf39f98acd07d3ed23c99aceea4631cd085a60f6da2e95eb0ce76d32ee7254f7aa679622e5b6733705a3cb4f4
7
- data.tar.gz: a70e4a4838712eeb3210552c65419e39f242858178ed1dc77a3432655c79d9b13336566753db1f1297520c6f4e6cf1554ed489dfa66c9aad7eb40bc03c476dde
6
+ metadata.gz: 34f55a27c047c8e0204eaf10a9a8c4d62b3ab06e9672812f4522f6b474b48261bf6521a538383770a3be5d1106651d48c5d4502c74d3dcd282bb87bcba7c075b
7
+ data.tar.gz: 901ce3866a5c98053a4b92f5f53fac015d7b4424f0c32c89b0a4418104b904083c1901f0a5e44606aa8c7677ac24e45aa20921a470c6548774c8be0ca67d1b61
data/example/config.ru CHANGED
@@ -1,23 +1,34 @@
1
+ # We use this example for running real tests on top of unit tests.
2
+ # This is not meant to be an example to learn how PopulateMe would work.
3
+ # Real examples will come later and this file will be removed.
4
+
1
5
  $:.unshift File.expand_path('../../lib', __FILE__)
2
6
 
3
7
  # Models ##########
4
8
 
5
- require 'populate_me/mongo'
6
- require 'mongo'
9
+ require 'populate_me/document'
7
10
 
8
- MONGO = Mongo::Client.new([ '127.0.0.1:27017' ], :database => 'blog-populate-me-test')
9
- DB = MONGO.database
10
- PopulateMe::Mongo.set :db, DB
11
+ # MONGO = Mongo::Client.new([ '127.0.0.1:27017' ], :database => 'blog-populate-me-test')
12
+ # DB = MONGO.database
13
+ # PopulateMe::Mongo.set :db, DB
11
14
 
12
15
  # require 'populate_me/attachment'
13
16
  # PopulateMe::Document.set :default_attachment_class, PopulateMe::Attachment
14
17
  # require 'populate_me/file_system_attachment'
15
18
  # PopulateMe::Document.set :default_attachment_class, PopulateMe::FileSystemAttachment
16
- require 'populate_me/grid_fs_attachment'
17
- PopulateMe::Mongo.set :default_attachment_class, PopulateMe::GridFS
18
- PopulateMe::GridFS.set :db, DB
19
+ #
20
+ # require 'populate_me/grid_fs_attachment'
21
+ # PopulateMe::Mongo.set :default_attachment_class, PopulateMe::GridFS
22
+ # PopulateMe::GridFS.set :db, DB
23
+
24
+ require 'populate_me/s3_attachment'
25
+ s3_resource = Aws::S3::Resource.new
26
+ s3_bucket = s3_resource.bucket(ENV['BUCKET'])
27
+ PopulateMe::Document.set :default_attachment_class, PopulateMe::S3Attachment
28
+ PopulateMe::S3Attachment.set :bucket, s3_bucket
29
+
19
30
 
20
- class BlogPost < PopulateMe::Mongo
31
+ class BlogPost < PopulateMe::Document
21
32
  field :title, required: true
22
33
  field :thumbnail, type: :attachment, variations: [
23
34
  PopulateMe::Variation.new_image_magick_job(:populate_me_thumb, :jpg, "-resize '400x225^' -gravity center -extent 400x225")
@@ -30,14 +41,14 @@ class BlogPost < PopulateMe::Mongo
30
41
  error_on(:content,'Cannot be blank') if WebUtils.blank?(self.content)
31
42
  end
32
43
  end
33
- class BlogPost::Author < PopulateMe::Mongo
44
+ class BlogPost::Author < PopulateMe::Document
34
45
  # nested
35
46
  field :name
36
47
  def validate
37
48
  error_on(:name, 'Cannot be shit') if self.name=='shit'
38
49
  end
39
50
  end
40
- class BlogPost::Comment < PopulateMe::Mongo
51
+ class BlogPost::Comment < PopulateMe::Document
41
52
  # not nested
42
53
  field :author, default: 'Anonymous'
43
54
  field :content, type: :text
@@ -45,7 +56,7 @@ class BlogPost::Comment < PopulateMe::Mongo
45
56
  position_field scope: :blog_post_id
46
57
  end
47
58
 
48
- class Article < PopulateMe::Mongo
59
+ class Article < PopulateMe::Document
49
60
  field :title
50
61
  field :content, type: :text
51
62
  position_field
@@ -63,6 +74,6 @@ end
63
74
 
64
75
  # use PopulateMe::Attachment::Middleware
65
76
  # use PopulateMe::FileSystemAttachment::Middleware
66
- use PopulateMe::GridFS::Middleware
77
+ # use PopulateMe::GridFS::Middleware
67
78
  run Admin
68
79
 
@@ -52,8 +52,12 @@ module PopulateMe
52
52
  self.document.__send__(field)
53
53
  end
54
54
 
55
+ def field_options
56
+ self.document.class.fields[self.field]
57
+ end
58
+
55
59
  def variations
56
- self.document.class.fields[self.field][:variations] || []
60
+ self.field_options[:variations] || []
57
61
  end
58
62
 
59
63
  def field_filename variation_name=:original
@@ -1,3 +1,5 @@
1
+ require 'securerandom'
2
+
1
3
  module PopulateMe
2
4
  module DocumentMixins
3
5
  module Callbacks
@@ -24,7 +26,7 @@ module PopulateMe
24
26
 
25
27
  def ensure_id
26
28
  if self.id.nil?
27
- self.id = WebUtils::generate_random_id
29
+ self.id = SecureRandom.hex
28
30
  end
29
31
  self
30
32
  end
@@ -0,0 +1,120 @@
1
+ require 'populate_me/attachment'
2
+ require 'aws-sdk'
3
+
4
+ module PopulateMe
5
+
6
+ class MissingBucketError < StandardError; end
7
+
8
+ class S3Attachment < Attachment
9
+
10
+ # For S3 this option behaves a bit differently.
11
+ # Because S3 file are served directly instead of using a middleware,
12
+ # the url_prefix is just used in the key name before the attachee_prefix.
13
+ # It helps saving keys under /public for example which is a common idiom
14
+ # to save file in a path public by default.
15
+ # This option can be overriden at the field level.
16
+ set :url_prefix, '/public'
17
+
18
+ # Attachee_prefix is moved on field_value for S3
19
+ # as well as url_prefix
20
+ def url variation_name=:original
21
+ return nil if WebUtils.blank?(self.field_filename(variation_name))
22
+ "#{settings.bucket.url}/#{self.field_filename(variation_name)}"
23
+ end
24
+ # Attachee_prefix is moved on field_value for S3
25
+ # as well as url_prefix
26
+ def location_root
27
+ File.join(
28
+ settings.root,
29
+ settings.url_prefix
30
+ )
31
+ end
32
+
33
+ def local_url_prefix
34
+ (
35
+ self.field_options[:url_prefix] ||
36
+ self.document.class.settings.s3_url_prefix ||
37
+ settings.url_prefix
38
+ ).gsub(/^\/|\/$/,'')
39
+ end
40
+
41
+ def next_available_filename filename
42
+ ext = File.extname(filename)
43
+ base = File.join(
44
+ local_url_prefix,
45
+ attachee_prefix,
46
+ File.basename(filename,ext)
47
+ ).gsub(/^\//,'')
48
+ i = 0
49
+ loop do
50
+ suffix = i==0 ? '' : "-#{i}"
51
+ potential_filename = [base,suffix,ext].join
52
+ if settings.bucket.object(potential_filename).exists?
53
+ i += 1
54
+ else
55
+ filename = potential_filename
56
+ break
57
+ end
58
+ end
59
+ filename
60
+ end
61
+
62
+ def perform_create hash
63
+ if hash[:variation].nil?
64
+ fn = next_available_filename(hash[:filename])
65
+ file = hash[:tempfile]
66
+ type = hash[:type]
67
+ else
68
+ fn = WebUtils.filename_variation hash[:future_field_value], hash[:variation].name, hash[:variation].ext
69
+ file = File.open(hash[:variation_path])
70
+ type = Rack::Mime.mime_type ".#{hash[:variation].ext}"
71
+ end
72
+ settings.bucket.put_object({
73
+ acl: self.field_options[:acl] || 'public-read',
74
+ key: fn,
75
+ content_type: type,
76
+ body: file,
77
+ metadata: {
78
+ parent_collection: (self.document.class.respond_to?(:collection) ? self.document.class.collection.name : self.attachee_prefix),
79
+ }
80
+ })
81
+ file.close unless hash[:variation].nil?
82
+ fn
83
+ end
84
+
85
+ def deletable? variation_name=:original
86
+ !WebUtils.blank? self.field_filename(variation_name)
87
+ # Fine since deleting a non-existent file does not raise an error in S3
88
+ end
89
+
90
+ def perform_delete variation_name=:original
91
+ s3file = settings.bucket.object(self.field_filename(variation_name))
92
+ s3file.delete unless s3file.nil?
93
+ end
94
+
95
+ class << self
96
+
97
+ def ensure_bucket
98
+ raise MissingBucketError, "Attachment class #{self.name} does not have an S3 bucket." if settings.bucket.nil?
99
+ end
100
+
101
+ def middleware
102
+ nil
103
+ end
104
+
105
+ # def middleware_options
106
+ # [
107
+ # {
108
+ # prefix: settings.url_prefix.dup.gsub(/^\/|\/$/,''),
109
+ # db: settings.db,
110
+ # # lookup: :path
111
+ # }
112
+ # ]
113
+ # end
114
+
115
+ end
116
+
117
+ end
118
+
119
+ end
120
+
@@ -1,4 +1,4 @@
1
1
  module PopulateMe
2
- VERSION = '0.1.8'
2
+ VERSION = '0.2.0'
3
3
  end
4
4
 
data/populate-me.gemspec CHANGED
@@ -27,6 +27,7 @@ Gem::Specification.new do |s|
27
27
  s.add_development_dependency 'rack-cerberus', '~> 1.0'
28
28
  s.add_development_dependency 'mongo', '~> 2.0'
29
29
  s.add_development_dependency 'rack-grid-serve', '~> 0.0.8'
30
+ s.add_development_dependency 'aws-sdk', '~> 3'
30
31
  s.add_development_dependency 'racksh', '~> 1.0'
31
32
  s.add_development_dependency 'rake', '~> 10.1'
32
33
  end
@@ -43,6 +43,12 @@ describe PopulateMe::Attachment do
43
43
  end
44
44
  end
45
45
 
46
+ describe "#field_options" do
47
+ it "Get options of the field" do
48
+ assert_equal :attachment, subject.field_options[:type]
49
+ end
50
+ end
51
+
46
52
  describe "#variations" do
47
53
  it "Gets variations for the field" do
48
54
  variations = subject.variations
@@ -2,6 +2,8 @@ require 'helper'
2
2
  require 'populate_me/mongo'
3
3
  require 'populate_me/grid_fs_attachment'
4
4
 
5
+ Mongo::Logger.logger.level = Logger::ERROR
6
+
5
7
  GRIDMONGO = Mongo::Client.new([ '127.0.0.1:27017' ], :database => 'populate-me-grid-test')
6
8
  GRIDDB = GRIDMONGO.database
7
9
  GRIDDB.drop
@@ -29,7 +31,7 @@ describe 'PopulateMe::GridFS' do
29
31
 
30
32
  # Utils
31
33
 
32
- it 'Returns URL with attachee_prefix' do
34
+ it 'Returns URL with url_prefix' do
33
35
  book = GridBook.new cover: "candy.jpg"
34
36
  assert_equal '/attachment/candy.jpg', book.attachment(:cover).url
35
37
  assert_equal '/attachment/candy.thumb.gif', book.attachment(:cover).url(:thumb)
data/test/test_mongo.rb CHANGED
@@ -2,6 +2,8 @@ require 'helper'
2
2
  require 'populate_me/mongo'
3
3
  # require 'mongo'
4
4
 
5
+ Mongo::Logger.logger.level = Logger::ERROR
6
+
5
7
  MONGO = Mongo::Client.new([ '127.0.0.1:27017' ], :database => 'populate-me-test')
6
8
  DB = MONGO.database
7
9
  DB.drop
@@ -0,0 +1,273 @@
1
+ require 'helper'
2
+ require 'populate_me/document'
3
+ require 'populate_me/s3_attachment'
4
+
5
+ s3_resource = Aws::S3::Resource.new
6
+ s3_bucket = s3_resource.bucket(ENV['BUCKET'])
7
+ PopulateMe::Document.set :default_attachment_class, PopulateMe::S3Attachment
8
+ PopulateMe::S3Attachment.set :bucket, s3_bucket
9
+
10
+ describe 'PopulateMe::S3Attachment' do
11
+ # parallelize_me!
12
+
13
+ class S3Book < PopulateMe::Document
14
+ field :cover, type: :attachment, variations: [
15
+ PopulateMe::Variation.new_image_magick_job(:thumb, :gif, "-resize '300x'")
16
+ ]
17
+ field :content, type: :attachment, variations: [
18
+ PopulateMe::Variation.new(:upcase, :txt, lambda{ |src,dst|
19
+ Kernel.system "cat \"#{src}\" | tr 'a-z' 'A-Z' > \"#{dst}\""
20
+ })
21
+ ]
22
+ field :open_content, type: :attachment, url_prefix: 'open', variations: [
23
+ PopulateMe::Variation.new(:upcase, :txt, lambda{ |src,dst|
24
+ Kernel.system "cat \"#{src}\" | tr 'a-z' 'A-Z' > \"#{dst}\""
25
+ })
26
+ ]
27
+ end
28
+
29
+ class S3BookNoPrefix < PopulateMe::Document
30
+ set :s3_url_prefix, ''
31
+ field :content, type: :attachment, variations: [
32
+ PopulateMe::Variation.new(:upcase, :txt, lambda{ |src,dst|
33
+ Kernel.system "cat \"#{src}\" | tr 'a-z' 'A-Z' > \"#{dst}\""
34
+ })
35
+ ]
36
+ end
37
+
38
+ before do
39
+ s3_bucket.clear!
40
+ end
41
+
42
+ # Utils
43
+
44
+ it 'Returns URL with bucket url' do
45
+ book = S3Book.new cover: "candy.jpg"
46
+ assert_equal "#{s3_bucket.url}/candy.jpg", book.attachment(:cover).url
47
+ assert_equal "#{s3_bucket.url}/candy.thumb.gif", book.attachment(:cover).url(:thumb)
48
+ end
49
+
50
+ it 'Has nil URL when field is blank' do
51
+ book = S3Book.new
52
+ assert_nil book.attachment(:cover).url
53
+ end
54
+
55
+ it 'Has location root without attachee prefix' do
56
+ book = S3Book.new
57
+ refute_match book.attachment(:cover).attachee_prefix, book.attachment(:cover).location_root
58
+ end
59
+
60
+ # Create
61
+
62
+ it "Saves attachments on create with variations" do
63
+ book = S3Book.new
64
+
65
+ file = Tempfile.new('foo')
66
+ file.write('hello')
67
+ file.rewind
68
+
69
+ field_value = book.attachment(:content).create({
70
+ tempfile: file,
71
+ filename: 'story.txt',
72
+ type: 'text/plain'
73
+ })
74
+ assert_equal 'public/s-3-book/story.txt', field_value
75
+ assert s3_bucket.object('public/s-3-book/story.txt').exists?
76
+ assert s3_bucket.object('public/s-3-book/story.upcase.txt').exists?
77
+
78
+ s3file = s3_bucket.object('public/s-3-book/story.txt')
79
+ assert_equal 'text/plain', s3file.content_type
80
+ assert check_if_public_read(s3file)
81
+ assert_equal 's-3-book', s3file.metadata['parent_collection']
82
+ assert_equal 'hello', s3file.get.body.read
83
+
84
+ vars3file = s3_bucket.object('public/s-3-book/story.upcase.txt')
85
+ assert_equal 'text/plain', vars3file.content_type
86
+ # assert_equal 'public-read', vars3file.acl
87
+ assert_equal 's-3-book', vars3file.metadata['parent_collection']
88
+ assert_equal 'HELLO', vars3file.get.body.read
89
+
90
+ file.close
91
+ file.unlink
92
+ end
93
+
94
+ it "Can override the url_prefix at document class level" do
95
+ file = Tempfile.new('foo')
96
+ book = S3BookNoPrefix.new
97
+
98
+ field_value = book.attachment(:content).create({
99
+ tempfile: file,
100
+ filename: 'story.txt',
101
+ type: 'text/plain'
102
+ })
103
+
104
+ assert_equal 's-3-book-no-prefix/story.txt', field_value
105
+ assert s3_bucket.object('s-3-book-no-prefix/story.txt').exists?
106
+ assert s3_bucket.object('s-3-book-no-prefix/story.upcase.txt').exists?
107
+ end
108
+
109
+ it "Can override the url_prefix at field level" do
110
+ file = Tempfile.new('foo')
111
+ book = S3Book.new
112
+
113
+ field_value = book.attachment(:open_content).create({
114
+ tempfile: file,
115
+ filename: 'story.txt',
116
+ type: 'text/plain'
117
+ })
118
+
119
+ assert_equal 'open/s-3-book/story.txt', field_value
120
+ assert s3_bucket.object('open/s-3-book/story.txt').exists?
121
+ assert s3_bucket.object('open/s-3-book/story.upcase.txt').exists?
122
+ end
123
+
124
+ it 'Does not create 2 files with the same name' do
125
+ file = Tempfile.new('foo')
126
+
127
+ book = S3Book.new
128
+
129
+ field_value = book.attachment(:content).create({
130
+ tempfile: file,
131
+ filename: 'story.txt',
132
+ type: 'text/plain'
133
+ })
134
+
135
+ assert_equal 'public/s-3-book/story.txt', field_value
136
+
137
+ field_value = book.attachment(:content).create({
138
+ tempfile: file,
139
+ filename: 'story.txt',
140
+ type: 'text/plain'
141
+ })
142
+
143
+ assert_equal 'public/s-3-book/story-1.txt', field_value
144
+
145
+ field_value = book.attachment(:content).create({
146
+ tempfile: file,
147
+ filename: 'story.txt',
148
+ type: 'text/plain'
149
+ })
150
+
151
+ assert_equal 'public/s-3-book/story-2.txt', field_value
152
+
153
+ file.close
154
+ file.unlink
155
+ end
156
+
157
+ # Delete
158
+
159
+ it 'Is deletable when field is not blank' do
160
+ book = S3Book.new cover: "candy.jpg"
161
+ assert book.attachment(:cover).deletable?
162
+ end
163
+
164
+ it 'Is not deletable when field is blank' do
165
+ book = S3Book.new
166
+ refute book.attachment(:cover).deletable?
167
+ end
168
+
169
+ it 'Deletes all attachments' do
170
+ file = Tempfile.new('foo')
171
+
172
+ book = S3Book.new
173
+
174
+ field_value = book.attachment(:content).create({
175
+ tempfile: file,
176
+ filename: 'story.txt',
177
+ type: 'text/plain'
178
+ })
179
+ book.content = field_value
180
+
181
+ assert s3_bucket.object('public/s-3-book/story.txt').exists?
182
+ assert s3_bucket.object('public/s-3-book/story.upcase.txt').exists?
183
+
184
+ book.attachment(:content).delete_all
185
+
186
+ refute s3_bucket.object('public/s-3-book/story.txt').exists?
187
+ refute s3_bucket.object('public/s-3-book/story.upcase.txt').exists?
188
+
189
+ file.close
190
+ file.unlink
191
+ end
192
+
193
+ it 'Deletes one attachment at a time' do
194
+ file = Tempfile.new('foo')
195
+
196
+ book = S3Book.new
197
+
198
+ field_value = book.attachment(:content).create({
199
+ tempfile: file,
200
+ filename: 'story.txt',
201
+ type: 'text/plain'
202
+ })
203
+ book.content = field_value
204
+
205
+ assert s3_bucket.object('public/s-3-book/story.txt').exists?
206
+ assert s3_bucket.object('public/s-3-book/story.upcase.txt').exists?
207
+
208
+ book.attachment(:content).delete
209
+
210
+ refute s3_bucket.object('public/s-3-book/story.txt').exists?
211
+ assert s3_bucket.object('public/s-3-book/story.upcase.txt').exists?
212
+
213
+ book.attachment(:content).delete :upcase
214
+
215
+ refute s3_bucket.object('public/s-3-book/story.upcase.txt').exists?
216
+
217
+ file.close
218
+ file.unlink
219
+ end
220
+
221
+ # Update
222
+
223
+ it 'Deletes previous attachment when saving a new one' do
224
+ file = Tempfile.new('foo')
225
+ file.write('hello')
226
+ file.rewind
227
+
228
+ book = S3Book.new
229
+
230
+ field_value = book.attachment(:content).create({
231
+ tempfile: file,
232
+ filename: 'story.txt',
233
+ type: 'text/plain'
234
+ })
235
+ book.content = field_value
236
+
237
+ assert s3_bucket.object('public/s-3-book/story.txt').exists?
238
+ assert s3_bucket.object('public/s-3-book/story.upcase.txt').exists?
239
+
240
+ file.rewind
241
+ file.write('world')
242
+ file.rewind
243
+
244
+ field_value = book.attachment(:content).create({
245
+ tempfile: file,
246
+ filename: 'history.md',
247
+ type: 'text/markdown'
248
+ })
249
+ book.content = field_value
250
+
251
+ refute s3_bucket.object('public/s-3-book/story.txt').exists?
252
+ refute s3_bucket.object('public/s-3-book/story.upcase.txt').exists?
253
+ assert s3_bucket.object('public/s-3-book/history.md').exists?
254
+ assert s3_bucket.object('public/s-3-book/history.upcase.txt').exists?
255
+
256
+ s3file = s3_bucket.object('public/s-3-book/history.md')
257
+ assert_equal 'text/markdown', s3file.content_type
258
+ assert_equal 's-3-book', s3file.metadata['parent_collection']
259
+ assert_equal 'world', s3file.get.body.read
260
+
261
+ s3file = s3_bucket.object('public/s-3-book/history.upcase.txt')
262
+ assert_equal 'text/plain', s3file.content_type
263
+ assert_equal 's-3-book', s3file.metadata['parent_collection']
264
+ assert_equal 'WORLD', s3file.get.body.read
265
+
266
+ file.close
267
+ file.unlink
268
+ end
269
+
270
+ end
271
+
272
+ s3_bucket.clear!
273
+
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: populate-me
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.8
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mickael Riga
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-08-24 00:00:00.000000000 Z
11
+ date: 2017-11-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: web-utils
@@ -136,6 +136,20 @@ dependencies:
136
136
  - - "~>"
137
137
  - !ruby/object:Gem::Version
138
138
  version: 0.0.8
139
+ - !ruby/object:Gem::Dependency
140
+ name: aws-sdk
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - "~>"
144
+ - !ruby/object:Gem::Version
145
+ version: '3'
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - "~>"
151
+ - !ruby/object:Gem::Version
152
+ version: '3'
139
153
  - !ruby/object:Gem::Dependency
140
154
  name: racksh
141
155
  requirement: !ruby/object:Gem::Requirement
@@ -200,6 +214,7 @@ files:
200
214
  - lib/populate_me/file_system_attachment.rb
201
215
  - lib/populate_me/grid_fs_attachment.rb
202
216
  - lib/populate_me/mongo.rb
217
+ - lib/populate_me/s3_attachment.rb
203
218
  - lib/populate_me/variation.rb
204
219
  - lib/populate_me/version.rb
205
220
  - populate-me.gemspec
@@ -215,6 +230,7 @@ files:
215
230
  - test/test_document_typecasting.rb
216
231
  - test/test_grid_fs_attachment.rb
217
232
  - test/test_mongo.rb
233
+ - test/test_s3_attachment.rb
218
234
  - test/test_variation.rb
219
235
  - test/test_version.rb
220
236
  homepage: https://github.com/mig-hub/populate-me
@@ -237,7 +253,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
237
253
  version: '0'
238
254
  requirements: []
239
255
  rubyforge_project:
240
- rubygems_version: 2.6.11
256
+ rubygems_version: 2.6.13
241
257
  signing_key:
242
258
  specification_version: 4
243
259
  summary: PopulateMe is an admin system for web applications.
@@ -254,5 +270,6 @@ test_files:
254
270
  - test/test_document_typecasting.rb
255
271
  - test/test_grid_fs_attachment.rb
256
272
  - test/test_mongo.rb
273
+ - test/test_s3_attachment.rb
257
274
  - test/test_variation.rb
258
275
  - test/test_version.rb