saviour 0.6.6 → 0.6.10

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e01220554bae6d136bace3b491f366aa5e5f8a8e6b853b1d19f5fe2ee194f7ac
4
- data.tar.gz: cce3bf80da5aad0f7056422f9e30d9595f5c2b597f899346f09f0b615e0c5ce3
3
+ metadata.gz: 94654aa75977e1fc1b51ac4635cf62d99daacfe0c63b94b27132176e1a89b2f8
4
+ data.tar.gz: 72c77578ddfc92a494b4397a11ee55d5427075158939a3ab82d46fa620dada04
5
5
  SHA512:
6
- metadata.gz: 0b9b2682ffb7d3584853b3cb3ceca37cbae5f95a9802eabbe5d3df80a5de79810dbb3f26e5cb29fdfcf2acb128a9cd8d9f459458e0dc43bf93c47ec1274af303
7
- data.tar.gz: 0a94d1526dcbb231bb27feb1b47cd913dd668ee127e6ce41961a67d2cd14ff646a7f52b856d5dc2b2758c1e3ca59b12473f2a8b9227c5c1078d17cd860a90bbe
6
+ metadata.gz: 1261335b9ae8af1929e708769cbcb115cb73e05f458241467a8a93124b198cbb1c7e2faec51a70b79dd068cab016277f84d4478d323bd7b83b25419a4a883ef7
7
+ data.tar.gz: f9012382aacb98104c4e83fe7049c554dad19ee2fae77f6f9524c43b03f4a531ea432fbd615211b0f2c2dcf7fc6669b3cdf2908a653db2e6aac37c6b7c7cc2e6
data/.gitignore CHANGED
@@ -19,4 +19,5 @@ spec/support/test_data_dir/*
19
19
  .idea
20
20
  .rbenv-gemsets
21
21
  *.gemfile.lock
22
- .DS_Store
22
+ .DS_Store
23
+ .ruby-version
data/.travis.yml CHANGED
@@ -2,8 +2,9 @@ language: ruby
2
2
  sudo: false
3
3
  cache: bundler
4
4
  rvm:
5
- - 2.5.0
6
- - 2.6.0
5
+ - 2.5.8
6
+ - 2.6.6
7
+ - 2.7.1
7
8
 
8
9
  gemfile:
9
10
  - gemfiles/5.1.gemfile
@@ -1,5 +1,7 @@
1
1
  module Saviour
2
2
  class LifeCycle
3
+ SHOULD_USE_INTERLOCK = defined?(Rails) && !Rails.env.test?
4
+
3
5
  class FileCreator
4
6
  def initialize(current_path, file, column, connection)
5
7
  @file = file
@@ -84,26 +86,17 @@ module Saviour
84
86
 
85
87
  def delete!
86
88
  DbHelpers.run_after_commit do
87
- pool = Concurrent::FixedThreadPool.new(Saviour::Config.concurrent_workers)
89
+ pool = Concurrent::Throttle.new Saviour::Config.concurrent_workers
88
90
 
89
91
  futures = attached_files.map do |column|
90
- Concurrent::Future.execute(executor: pool) {
91
- file = @model.send(column)
92
+ pool.future(@model.send(column)) do |file|
92
93
  path = file.persisted_path
93
94
  file.uploader.storage.delete(path) if path
94
95
  file.delete
95
- }
96
- end
97
-
98
- ActiveSupport::Dependencies.interlock.permit_concurrent_loads do
99
- futures.each do |future|
100
- future.value
101
- raise(future.reason) if future.rejected?
102
96
  end
103
97
  end
104
98
 
105
- pool.shutdown
106
- pool.wait_for_termination
99
+ futures.each(&:value!)
107
100
  end
108
101
  end
109
102
 
@@ -131,35 +124,26 @@ module Saviour
131
124
  )
132
125
  end.compact
133
126
 
134
- pool = Concurrent::FixedThreadPool.new(Saviour::Config.concurrent_workers)
127
+ pool = Concurrent::Throttle.new Saviour::Config.concurrent_workers
135
128
 
136
129
  futures = uploaders.map { |uploader|
137
- Concurrent::Future.execute(executor: pool) {
138
- if defined?(Rails) && Rails::VERSION::MAJOR < 6
139
- Rails.application.executor.wrap { uploader.upload }
130
+ pool.future(uploader) { |given_uploader|
131
+ if SHOULD_USE_INTERLOCK
132
+ Rails.application.executor.wrap { given_uploader.upload }
140
133
  else
141
- uploader.upload
134
+ given_uploader.upload
142
135
  end
143
136
  }
144
137
  }
145
138
 
146
- work = -> {
147
- futures.map do |x|
148
- x.value.tap do
149
- raise(x.reason) if x.rejected?
150
- end
151
- end.compact
152
- }
139
+ work = -> { futures.map(&:value!).compact }
153
140
 
154
- result = if defined?(Rails) && Rails::VERSION::MAJOR < 6
141
+ result = if SHOULD_USE_INTERLOCK
155
142
  ActiveSupport::Dependencies.interlock.permit_concurrent_loads(&work)
156
143
  else
157
144
  work.call
158
145
  end
159
146
 
160
- pool.shutdown
161
- pool.wait_for_termination
162
-
163
147
  attrs = result.to_h
164
148
 
165
149
  uploaders.map(&:uploader).select { |x| x.class.after_upload_hooks.any? }.each do |uploader|
@@ -3,6 +3,8 @@ begin
3
3
  rescue LoadError
4
4
  end
5
5
 
6
+ require 'marcel'
7
+
6
8
  module Saviour
7
9
  class S3Storage
8
10
  MissingPublicUrlPrefix = Class.new(StandardError)
@@ -27,8 +29,12 @@ module Saviour
27
29
  raise(KeyTooLarge, "The key in S3 must be at max 1024 bytes, this key is too big: #{path}")
28
30
  end
29
31
 
32
+ mime_type = Marcel::MimeType.for file_or_contents
33
+
30
34
  # TODO: Use multipart api
31
- client.put_object(@create_options.merge(body: file_or_contents, bucket: @bucket, key: path))
35
+ client.put_object(@create_options.merge(
36
+ body: file_or_contents, bucket: @bucket, key: path, content_type: mime_type
37
+ ))
32
38
  end
33
39
 
34
40
  def write_from_file(file, path)
@@ -24,7 +24,7 @@ module Saviour
24
24
  if opts.empty?
25
25
  @uploader.send(method_or_block, data, filename)
26
26
  else
27
- @uploader.send(method_or_block, data, filename, opts)
27
+ @uploader.send(method_or_block, data, filename, **opts)
28
28
  end
29
29
  end
30
30
  end
@@ -1,3 +1,3 @@
1
1
  module Saviour
2
- VERSION = "0.6.6"
2
+ VERSION = "0.6.10"
3
3
  end
data/lib/saviour.rb CHANGED
@@ -17,7 +17,8 @@ require 'saviour/db_helpers'
17
17
 
18
18
  require 'tempfile'
19
19
  require 'fileutils'
20
- require 'concurrent/future'
20
+ require 'concurrent/edge/throttle'
21
+ require 'concurrent/edge/lock_free_queue'
21
22
 
22
23
  require 'active_support/dependencies'
23
24
 
data/saviour.gemspec CHANGED
@@ -15,9 +15,11 @@ Gem::Specification.new do |spec|
15
15
 
16
16
  spec.required_ruby_version = ">= 2.5.0"
17
17
 
18
- spec.add_dependency "activerecord", ">= 5.1"
18
+ spec.add_dependency "activerecord", ">= 5.1", "< 7.0.0"
19
19
  spec.add_dependency "activesupport", ">= 5.1"
20
20
  spec.add_dependency "concurrent-ruby", ">= 1.0.5"
21
+ spec.add_dependency "concurrent-ruby-edge", ">= 0.6.0"
22
+ spec.add_dependency "marcel", ">= 1.0.0"
21
23
 
22
24
  spec.add_development_dependency "bundler"
23
25
  spec.add_development_dependency "rspec"
@@ -56,8 +56,7 @@ describe "memory usage" do
56
56
 
57
57
  a.update! file: f
58
58
 
59
- # Expect memory usage to grow below 10% of the file size
60
- expect(GetProcessMem.new.mb - base_line).to be < size_to_test / 10
59
+ expect(GetProcessMem.new.mb - base_line).to be < 3
61
60
  end
62
61
  end
63
62
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: saviour
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.6
4
+ version: 0.6.10
5
5
  platform: ruby
6
6
  authors:
7
7
  - Roger Campos
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-10-16 00:00:00.000000000 Z
11
+ date: 2021-12-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord
@@ -17,6 +17,9 @@ dependencies:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
19
  version: '5.1'
20
+ - - "<"
21
+ - !ruby/object:Gem::Version
22
+ version: 7.0.0
20
23
  type: :runtime
21
24
  prerelease: false
22
25
  version_requirements: !ruby/object:Gem::Requirement
@@ -24,6 +27,9 @@ dependencies:
24
27
  - - ">="
25
28
  - !ruby/object:Gem::Version
26
29
  version: '5.1'
30
+ - - "<"
31
+ - !ruby/object:Gem::Version
32
+ version: 7.0.0
27
33
  - !ruby/object:Gem::Dependency
28
34
  name: activesupport
29
35
  requirement: !ruby/object:Gem::Requirement
@@ -52,6 +58,34 @@ dependencies:
52
58
  - - ">="
53
59
  - !ruby/object:Gem::Version
54
60
  version: 1.0.5
61
+ - !ruby/object:Gem::Dependency
62
+ name: concurrent-ruby-edge
63
+ requirement: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - ">="
66
+ - !ruby/object:Gem::Version
67
+ version: 0.6.0
68
+ type: :runtime
69
+ prerelease: false
70
+ version_requirements: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - ">="
73
+ - !ruby/object:Gem::Version
74
+ version: 0.6.0
75
+ - !ruby/object:Gem::Dependency
76
+ name: marcel
77
+ requirement: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - ">="
80
+ - !ruby/object:Gem::Version
81
+ version: 1.0.0
82
+ type: :runtime
83
+ prerelease: false
84
+ version_requirements: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - ">="
87
+ - !ruby/object:Gem::Version
88
+ version: 1.0.0
55
89
  - !ruby/object:Gem::Dependency
56
90
  name: bundler
57
91
  requirement: !ruby/object:Gem::Requirement
@@ -241,8 +275,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
241
275
  - !ruby/object:Gem::Version
242
276
  version: '0'
243
277
  requirements: []
244
- rubyforge_project:
245
- rubygems_version: 2.7.6
278
+ rubygems_version: 3.1.6
246
279
  signing_key:
247
280
  specification_version: 4
248
281
  summary: File storage handler following active record model lifecycle