dragonfly-cache 0.1.2 → 0.1.7

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
  SHA256:
3
- metadata.gz: 69db42bcdd7613f8f7738bec974e989b3863d508b24757fff67b4e003b6b5a04
4
- data.tar.gz: 5b48ec8599fb6aed358fb281d6f4c137aa75c427cc22554557cf61f99e0ee9f1
3
+ metadata.gz: f3df881ab7d62b87cd00ab7361c614250cc1a8706b9d2cc416a2ddb1f5d34256
4
+ data.tar.gz: 6cef3e6bdcb69d1e0418060e8db484f6b40dc2ede64ea03ca99f4aefc025e452
5
5
  SHA512:
6
- metadata.gz: 789d49580b89f059a1086466fc22975e71bcc8cd435467efe4000dc3b1da7609187442f1514687b42df1d5ba1bd5f6543b034a6b5cb046f36a9ff3bcb1b6092c
7
- data.tar.gz: cf0a7cd0b9d29a7470ea057e085c2f92cb495bf74cb87cff5d6151776d51db06f1d8b44058a7d8919eba2b0cd261ba363a4c407ac396924dfa242c102b57aacd
6
+ metadata.gz: 96a06ce4971e5ba10fc15be6789582e5e3202993a69bcc4c92504949033c2ec420f648b4cd61f1de88d41182cdae624fb4c097723b47dd81be637032d7e2dbf2
7
+ data.tar.gz: e6c1aedbd009728f83dcdbb894116d5f6ad19e938088c17f229ce75679315961d1189123c4614b2c7c92b2db3ca99be8fbf553ee021fce6b60e018502f6507a8
@@ -0,0 +1,11 @@
1
+ language: ruby
2
+ sudo: false
3
+ script: "bundle exec rake clean spec"
4
+
5
+ rvm:
6
+ - 2.5
7
+ - 2.6
8
+ - 2.7
9
+
10
+ gemfile:
11
+ - Gemfile
@@ -1,67 +1,70 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- dragonfly-cache (0.1.2)
5
- dragonfly (~> 1.1.5)
4
+ dragonfly-cache (0.1.7)
5
+ dragonfly
6
6
  i18n
7
7
 
8
8
  GEM
9
9
  remote: https://rubygems.org/
10
10
  specs:
11
- addressable (2.5.2)
12
- public_suffix (>= 2.0.2, < 4.0)
13
- ast (2.4.0)
14
- concurrent-ruby (1.0.5)
15
- diff-lcs (1.3)
16
- dragonfly (1.1.5)
11
+ addressable (2.7.0)
12
+ public_suffix (>= 2.0.2, < 5.0)
13
+ ast (2.4.1)
14
+ concurrent-ruby (1.1.7)
15
+ diff-lcs (1.4.4)
16
+ dragonfly (1.2.1)
17
17
  addressable (~> 2.3)
18
18
  multi_json (~> 1.0)
19
19
  rack (>= 1.3)
20
- i18n (1.1.0)
20
+ i18n (1.8.5)
21
21
  concurrent-ruby (~> 1.0)
22
- jaro_winkler (1.5.1)
23
- multi_json (1.13.1)
24
- parallel (1.12.1)
25
- parser (2.5.1.2)
26
- ast (~> 2.4.0)
27
- powerpack (0.1.2)
28
- public_suffix (3.0.3)
29
- rack (2.0.5)
22
+ multi_json (1.15.0)
23
+ parallel (1.19.2)
24
+ parser (2.7.2.0)
25
+ ast (~> 2.4.1)
26
+ public_suffix (4.0.6)
27
+ rack (2.2.3)
30
28
  rainbow (3.0.0)
31
- rake (10.5.0)
32
- rspec (3.8.0)
33
- rspec-core (~> 3.8.0)
34
- rspec-expectations (~> 3.8.0)
35
- rspec-mocks (~> 3.8.0)
36
- rspec-core (3.8.0)
37
- rspec-support (~> 3.8.0)
38
- rspec-expectations (3.8.1)
29
+ rake (13.0.1)
30
+ regexp_parser (1.8.2)
31
+ rexml (3.2.4)
32
+ rspec (3.10.0)
33
+ rspec-core (~> 3.10.0)
34
+ rspec-expectations (~> 3.10.0)
35
+ rspec-mocks (~> 3.10.0)
36
+ rspec-core (3.10.0)
37
+ rspec-support (~> 3.10.0)
38
+ rspec-expectations (3.10.0)
39
39
  diff-lcs (>= 1.2.0, < 2.0)
40
- rspec-support (~> 3.8.0)
41
- rspec-mocks (3.8.0)
40
+ rspec-support (~> 3.10.0)
41
+ rspec-mocks (3.10.0)
42
42
  diff-lcs (>= 1.2.0, < 2.0)
43
- rspec-support (~> 3.8.0)
44
- rspec-support (3.8.0)
45
- rubocop (0.58.2)
46
- jaro_winkler (~> 1.5.1)
43
+ rspec-support (~> 3.10.0)
44
+ rspec-support (3.10.0)
45
+ rubocop (1.1.0)
47
46
  parallel (~> 1.10)
48
- parser (>= 2.5, != 2.5.1.1)
49
- powerpack (~> 0.1)
47
+ parser (>= 2.7.1.5)
50
48
  rainbow (>= 2.2.2, < 4.0)
49
+ regexp_parser (>= 1.8)
50
+ rexml
51
+ rubocop-ast (>= 1.0.1)
51
52
  ruby-progressbar (~> 1.7)
52
- unicode-display_width (~> 1.0, >= 1.0.1)
53
- ruby-progressbar (1.10.0)
54
- unicode-display_width (1.4.0)
53
+ unicode-display_width (>= 1.4.0, < 2.0)
54
+ rubocop-ast (1.1.0)
55
+ parser (>= 2.7.1.5)
56
+ ruby-progressbar (1.10.1)
57
+ unicode-display_width (1.7.0)
55
58
 
56
59
  PLATFORMS
57
60
  ruby
58
61
 
59
62
  DEPENDENCIES
60
- bundler (~> 1.16)
63
+ bundler (~> 2.1)
61
64
  dragonfly-cache!
62
- rake (~> 10.0)
63
- rspec (~> 3.8.0)
65
+ rake (~> 13.0)
66
+ rspec (~> 3.10.0)
64
67
  rubocop
65
68
 
66
69
  BUNDLED WITH
67
- 1.16.2
70
+ 2.1.4
data/README.md CHANGED
@@ -43,3 +43,7 @@ Configured as this, cached files will be stored in `/public/media-cache/:sha/:na
43
43
  ## How does it work?
44
44
 
45
45
  `dragonfly-cache` use a method similar to [the one described in the Dragonfly documentation to process files on-the-fly and serve them remotely](http://markevans.github.io/dragonfly/cache#processing-on-the-fly-and-serving-remotely) but use only `define_url`.
46
+
47
+ ## Credits
48
+
49
+ The dragonfly photography used in specs is a work from [André Karwath](https://commons.wikimedia.org/wiki/User:Aka) and is licensed under the [Creative Commons Attribution-Share Alike 2.5 Generic](https://creativecommons.org/licenses/by-sa/2.5/deed.en) license.
@@ -15,23 +15,23 @@ Gem::Specification.new do |spec|
15
15
  spec.description = 'Allow Dragonfly to keep a cache of jobs results'
16
16
  spec.homepage = 'https://github.com/notus-sh/dragonfly-cache'
17
17
 
18
- if spec.respond_to?(:metadata)
19
- spec.metadata['allowed_push_host'] = 'https://rubygems.org'
20
- else
21
- raise 'RubyGems 2.0 or newer is required.'
22
- end
18
+ raise 'RubyGems 2.0 or newer is required.' unless spec.respond_to?(:metadata)
19
+
20
+ spec.metadata['allowed_push_host'] = 'https://rubygems.org'
23
21
 
24
22
  spec.require_paths = ['lib']
25
23
  spec.files = Dir.chdir(File.expand_path(__dir__)) do
26
24
  `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
27
25
  end
28
26
 
29
- spec.add_dependency 'dragonfly', '~> 1.1.5'
27
+ spec.required_ruby_version = '>= 2.5'
28
+
29
+ spec.add_dependency 'dragonfly'
30
30
  spec.add_dependency 'i18n'
31
31
 
32
- spec.add_development_dependency 'bundler', '~> 1.16'
33
- spec.add_development_dependency 'rake', '~> 10.0'
34
- spec.add_development_dependency 'rspec', '~> 3.8.0'
32
+ spec.add_development_dependency 'bundler', '~> 2.1'
33
+ spec.add_development_dependency 'rake', '~> 13.0'
34
+ spec.add_development_dependency 'rspec', '~> 3.10.0'
35
35
  spec.add_development_dependency 'rubocop'
36
36
 
37
37
  spec.post_install_message = <<~POST_INSTALL_MESSAGE
@@ -15,6 +15,13 @@ module Dragonfly
15
15
  rewrite_url_format!
16
16
  end
17
17
 
18
+ def base_dir
19
+ @base_dir ||= begin
20
+ path_format = File.join(servers_options[:server_root], servers_options[:url_format])
21
+ path_format.split('/').take_while { |p| p != ':shaish' }.join('/')
22
+ end
23
+ end
24
+
18
25
  protected
19
26
 
20
27
  def validate!
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'dragonfly/cache/storage'
3
+ require 'dragonfly/cache/mapper/yaml'
4
+ require 'dragonfly/cache/storage/local'
4
5
 
5
6
  module Dragonfly
6
7
  module Cache
@@ -10,79 +11,66 @@ module Dragonfly
10
11
  MIN_SHA_SIZE = 2
11
12
  MAX_SHA_SIZE = 16 # Length of SHA identifier generated by Dragonfly
12
13
 
13
- attr_reader :plugin, :storage, :sha_size
14
+ attr_reader :plugin, :storage, :map
14
15
 
15
- delegate %i[servers_options] => :plugin
16
- delegate %i[write writen? current_max_sha_size base_dir] => :storage
16
+ delegate %i[config] => :plugin
17
17
 
18
18
  def initialize(plugin)
19
- @plugin = plugin
20
- @storage = Dragonfly::Cache::Storage.new(self)
21
- initialize!
19
+ @plugin = plugin
20
+ @map = Dragonfly::Cache::Mapper::Yaml.new(config.servers_options)
21
+ @storage = Dragonfly::Cache::Storage::Local.new(config.servers_options)
22
22
  end
23
23
 
24
- def valid_uri?(job, uri)
25
- return true unless wrong_key?(job, uri) || wrong_value?(job, uri)
26
- increase_sha_size!
27
- false
28
- end
29
-
30
- def store(job, uri)
31
- write(job, uri) unless writen?(job, uri)
32
- map(job, uri) unless mapped?(job, uri)
33
- rescue Dragonfly::Cache::Error => e
34
- Dragonfly.warn(e.message)
35
- end
24
+ def cache(job)
25
+ return @map[job.sha] if @map.key?(job.sha)
36
26
 
37
- protected
38
-
39
- def wrong_key?(job, uri)
40
- @cache_map.value?(uri.path) && @cache_map.key(uri.path) != job.sha
27
+ store(job, yield)
41
28
  end
42
29
 
43
- def wrong_value?(job, uri)
44
- @cache_map.key?(job.sha) && @cache_map[job.sha] != uri.path
30
+ def valid?(job, uri)
31
+ valid = (@map.key?(job.sha) && @map[job.sha] == uri) || !@map.key?(job.sha)
32
+ valid &= (@map.value?(uri) && @map.key(uri) == job.sha) || !@map.value?(uri)
33
+ increase_sha_size! unless valid
34
+ valid
45
35
  end
46
36
 
47
- def initialize!
48
- detect_sha_size
49
- load_map
50
- rescue ::StandardError => e
51
- raise Dragonfly::Cache::Error, e.message
37
+ def job_options(job)
38
+ {
39
+ shaish: shaish(job),
40
+ normalized_name: normalized_name(job)
41
+ }
52
42
  end
53
43
 
54
- def detect_sha_size
55
- @sha_size = [current_max_sha_size, MIN_SHA_SIZE].compact.max
56
- @sha_size = [@sha_size, MAX_SHA_SIZE].min
57
- end
58
-
59
- def increase_sha_size!
60
- raise Error, "Can't build longer :sha identifier" if @sha_size == MAX_SHA_SIZE
61
- @sha_size += 1
44
+ protected
62
45
 
63
- @cache_map.clear
64
- save_map
46
+ def shaish(job)
47
+ job.sha[0..(sha_size - 1)]
65
48
  end
66
49
 
67
- def map_path
68
- @map_path ||= File.join(base_dir, 'map.yml')
50
+ def normalized_name(job)
51
+ basename = job.basename || job.signature
52
+ sanitized = basename.gsub(/[[:space:][:punct:][:cntrl:]]/, ' ').squeeze(' ').strip
53
+ transliterated = I18n.transliterate(sanitized, replacement: ' ').squeeze(' ').strip
54
+ downcased = (transliterated.empty? ? job.signature : transliterated).downcase.tr(' ', '-')
55
+ [downcased, job.ext].compact.join('.')
69
56
  end
70
57
 
71
- def load_map
72
- @cache_map = File.size?(map_path) ? YAML.load_file(map_path) : {}
58
+ def sha_size
59
+ @sha_size ||= [[storage.sha_size, MIN_SHA_SIZE].compact.max, MAX_SHA_SIZE].min
73
60
  end
74
61
 
75
- def save_map
76
- File.open(map_path, 'wb') { |f| YAML.dump(@cache_map, f) }
77
- end
62
+ def increase_sha_size!
63
+ raise Error, "Can't build longer :sha identifier" if @sha_size == MAX_SHA_SIZE
78
64
 
79
- def map(job, uri)
80
- @cache_map[job.sha] = uri.path
81
- save_map
65
+ @sha_size += 1
82
66
  end
83
67
 
84
- def mapped?(job, _uri)
85
- @cache_map.key?(job.sha)
68
+ def store(job, url)
69
+ storage.store(url, job)
70
+ map.store(job.sha, url)
71
+ url
72
+ rescue Dragonfly::Cache::Error => e
73
+ Dragonfly.warn(e.message)
86
74
  end
87
75
  end
88
76
  end
@@ -0,0 +1,44 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'yaml'
4
+
5
+ module Dragonfly
6
+ module Cache
7
+ module Mapper
8
+ class Yaml
9
+ extend Forwardable
10
+
11
+ attr_reader :root, :internal
12
+
13
+ delegate %i[[] key? value? key keys values] => :internal
14
+
15
+ def initialize(config)
16
+ @root = config[:server_root]
17
+ @internal = {}
18
+ load!
19
+ end
20
+
21
+ def store(key, value)
22
+ @internal[key] = value
23
+ save!
24
+ end
25
+
26
+ alias []= store
27
+
28
+ protected
29
+
30
+ def path
31
+ @path ||= File.join(root, 'map.yml')
32
+ end
33
+
34
+ def load!
35
+ @internal = File.size?(path) ? YAML.load_file(path) : {}
36
+ end
37
+
38
+ def save!
39
+ File.open(path, 'wb') { |f| YAML.dump(@internal, f) }
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
@@ -17,56 +17,38 @@ module Dragonfly
17
17
 
18
18
  attr_reader :config, :manager
19
19
 
20
- delegate %i[servers_options] => :config
21
- delegate %i[sha_size valid_uri? store] => :manager
20
+ delegate %i[cache valid? job_options] => :manager
22
21
 
23
22
  def call(app, cache_servers_options = {})
24
- @config = Dragonfly::Cache::Config.new(cache_servers_options)
25
- @manager = Dragonfly::Cache::Manager.new(self)
23
+ @config = Dragonfly::Cache::Config.new(cache_servers_options)
24
+ @manager = Dragonfly::Cache::Manager.new(self)
26
25
 
27
- app.define_url do |app, job, opts|
28
- url_for(app, job, opts)
26
+ app.define_url do |same, job, opts|
27
+ url_for(same, job, opts)
29
28
  rescue Dragonfly::Cache::Error => e
30
29
  Dragonfly.warn(e.message)
31
30
  app.server.url_for(job, opts) # Fallback to default Dragonfly::App url building
32
31
  end
33
32
  end
34
33
 
35
- protected
36
-
37
34
  def url_for(app, job, opts)
38
- uri = find_valid_url_for(app, job, opts)
39
- # File are stored on url building instead of in a before_serve block to allow use of assets host
40
- store(job, uri)
41
- uri.to_s
35
+ cache(job) { build_url_for(app, job, opts) }
42
36
  end
43
37
 
44
- def find_valid_url_for(app, job, opts)
38
+ protected
39
+
40
+ def build_url_for(app, job, opts)
45
41
  loop do
46
- url = server_for(app).url_for(job, options_for(job).merge(opts))
47
- uri = URI.parse(url)
48
- uri.query = nil
49
- uri.fragment = nil
50
- return uri if valid_uri?(job, uri)
42
+ url = server_for(app).url_for(job, job_options(job).merge(opts))
43
+ path = URI.parse(url).path
44
+ return path if valid?(job, path)
51
45
  end
52
46
  end
53
47
 
54
- def options_for(job)
55
- basename = job.basename || job.signature
56
- sanitized = basename.gsub(/[[:space:][:punct:][:cntrl:]]/, ' ').squeeze(' ').strip
57
- transliterated = I18n.transliterate(sanitized, replacement: ' ').squeeze(' ').strip
58
- downcased = (transliterated.empty? ? job.signature : transliterated).downcase.tr(' ', '-')
59
-
60
- {
61
- shaish: job.sha[0..(sha_size - 1)],
62
- normalized_name: [downcased, job.ext].join('.')
63
- }
64
- end
65
-
66
48
  def server_for(app)
67
49
  @@servers[app.name] ||= begin
68
50
  server = app.server.dup
69
- servers_options.each do |name, value|
51
+ config.servers_options.each do |name, value|
70
52
  server.send("#{name}=", value) if server.respond_to?("#{name}=")
71
53
  end
72
54
  server
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Dragonfly
4
+ module Cache
5
+ module Storage
6
+ class Local
7
+ attr_reader :root, :format
8
+
9
+ def initialize(config)
10
+ @root = config[:server_root]
11
+ @format = config[:url_format]
12
+ end
13
+
14
+ def store(url, job)
15
+ job.to_file(path(url), mode: 0o644)
16
+ end
17
+
18
+ def sha_size
19
+ longest = Dir["#{base_dir}/*"].select { |p| File.directory?(p) }.max { |a, b| a <=> b }
20
+ (longest ? File.basename(longest).size : nil)
21
+ end
22
+
23
+ protected
24
+
25
+ def path(url)
26
+ File.join(root, url)
27
+ end
28
+
29
+ def base_dir
30
+ @base_dir ||= begin
31
+ path_format = File.join(root, format)
32
+ path_format.split('/').take_while { |p| p != ':shaish' }.join('/')
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Dragonfly
4
4
  module Cache
5
- VERSION = '0.1.2'
5
+ VERSION = '0.1.7'
6
6
  end
7
7
  end
metadata CHANGED
@@ -1,29 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dragonfly-cache
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.1.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Gaël-Ian Havard
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-09-07 00:00:00.000000000 Z
11
+ date: 2020-11-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: dragonfly
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "~>"
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: 1.1.5
19
+ version: '0'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - "~>"
24
+ - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: 1.1.5
26
+ version: '0'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: i18n
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -44,42 +44,42 @@ dependencies:
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: '1.16'
47
+ version: '2.1'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: '1.16'
54
+ version: '2.1'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: rake
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
59
  - - "~>"
60
60
  - !ruby/object:Gem::Version
61
- version: '10.0'
61
+ version: '13.0'
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
- version: '10.0'
68
+ version: '13.0'
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: rspec
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
73
  - - "~>"
74
74
  - !ruby/object:Gem::Version
75
- version: 3.8.0
75
+ version: 3.10.0
76
76
  type: :development
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
80
  - - "~>"
81
81
  - !ruby/object:Gem::Version
82
- version: 3.8.0
82
+ version: 3.10.0
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: rubocop
85
85
  requirement: !ruby/object:Gem::Requirement
@@ -103,6 +103,7 @@ extra_rdoc_files: []
103
103
  files:
104
104
  - ".gitignore"
105
105
  - ".rspec"
106
+ - ".travis.yml"
106
107
  - Gemfile
107
108
  - Gemfile.lock
108
109
  - LICENSE
@@ -113,8 +114,9 @@ files:
113
114
  - lib/dragonfly/cache.rb
114
115
  - lib/dragonfly/cache/config.rb
115
116
  - lib/dragonfly/cache/manager.rb
117
+ - lib/dragonfly/cache/mapper/yaml.rb
116
118
  - lib/dragonfly/cache/plugin.rb
117
- - lib/dragonfly/cache/storage.rb
119
+ - lib/dragonfly/cache/storage/local.rb
118
120
  - lib/dragonfly/cache/version.rb
119
121
  homepage: https://github.com/notus-sh/dragonfly-cache
120
122
  licenses:
@@ -137,16 +139,16 @@ required_ruby_version: !ruby/object:Gem::Requirement
137
139
  requirements:
138
140
  - - ">="
139
141
  - !ruby/object:Gem::Version
140
- version: '0'
142
+ version: '2.5'
141
143
  required_rubygems_version: !ruby/object:Gem::Requirement
142
144
  requirements:
143
145
  - - ">="
144
146
  - !ruby/object:Gem::Version
145
147
  version: '0'
146
148
  requirements: []
147
- rubyforge_project:
148
- rubygems_version: 2.7.6
149
- signing_key:
149
+ rubygems_version: 3.1.2
150
+ signing_key:
150
151
  specification_version: 4
151
152
  summary: Cache adapter for Dragonfly
152
153
  test_files: []
154
+ ...
@@ -1,68 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Dragonfly
4
- module Cache
5
- class Storage
6
- extend Forwardable
7
-
8
- attr_reader :manager
9
-
10
- delegate %i[servers_options] => :manager
11
-
12
- def initialize(manager)
13
- @manager = manager
14
- check_directory!(base_dir)
15
- end
16
-
17
- def current_max_sha_size
18
- longest = Dir["#{base_dir}/*"].select { |p| File.directory?(p) }.max { |a, b| a <=> b }
19
- (longest ? File.basename(longest).size : nil)
20
- end
21
-
22
- def write(job, uri)
23
- path = cache_path(uri)
24
- check_directory!(File.dirname(path))
25
- with_umask(0o022) do
26
- job.to_file(path, mode: 0o644, mkdirs: false)
27
- end
28
- end
29
-
30
- def writen?(_job, uri)
31
- File.exist?(cache_path(uri))
32
- end
33
-
34
- def base_dir
35
- @base_dir ||= begin
36
- path_format = File.join(servers_options[:server_root], servers_options[:url_format])
37
- path_format.split('/').take_while { |p| p != ':shaish' }.join('/')
38
- end
39
- end
40
-
41
- protected
42
-
43
- def check_directory!(directory)
44
- return if File.exist?(directory) && File.directory?(directory) && File.writable?(directory)
45
- with_umask(0o022) do
46
- File.unlink(directory) if File.exist?(directory) && !File.directory?(directory)
47
- FileUtils.mkdir_p(directory, mode: 0o755) unless File.exist?(directory)
48
- File.chmod(0o755, directory) unless File.writable?(directory)
49
- end
50
- rescue ::StandardError => e
51
- raise Dragonfly::Cache::Error, e.message
52
- end
53
-
54
- def with_umask(umask)
55
- original_umask = File.umask(umask)
56
- begin
57
- yield
58
- ensure
59
- File.umask(original_umask)
60
- end
61
- end
62
-
63
- def cache_path(uri)
64
- File.join(servers_options[:server_root], uri.path)
65
- end
66
- end
67
- end
68
- end