dragonfly-cache 0.1.2 → 0.1.7

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: 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