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 +4 -4
- data/.travis.yml +11 -0
- data/Gemfile.lock +43 -40
- data/README.md +4 -0
- data/dragonfly-cache.gemspec +9 -9
- data/lib/dragonfly/cache/config.rb +7 -0
- data/lib/dragonfly/cache/manager.rb +40 -52
- data/lib/dragonfly/cache/mapper/yaml.rb +44 -0
- data/lib/dragonfly/cache/plugin.rb +13 -31
- data/lib/dragonfly/cache/storage/local.rb +38 -0
- data/lib/dragonfly/cache/version.rb +1 -1
- metadata +20 -18
- data/lib/dragonfly/cache/storage.rb +0 -68
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: f3df881ab7d62b87cd00ab7361c614250cc1a8706b9d2cc416a2ddb1f5d34256
|
|
4
|
+
data.tar.gz: 6cef3e6bdcb69d1e0418060e8db484f6b40dc2ede64ea03ca99f4aefc025e452
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 96a06ce4971e5ba10fc15be6789582e5e3202993a69bcc4c92504949033c2ec420f648b4cd61f1de88d41182cdae624fb4c097723b47dd81be637032d7e2dbf2
|
|
7
|
+
data.tar.gz: e6c1aedbd009728f83dcdbb894116d5f6ad19e938088c17f229ce75679315961d1189123c4614b2c7c92b2db3ca99be8fbf553ee021fce6b60e018502f6507a8
|
data/.travis.yml
ADDED
data/Gemfile.lock
CHANGED
|
@@ -1,67 +1,70 @@
|
|
|
1
1
|
PATH
|
|
2
2
|
remote: .
|
|
3
3
|
specs:
|
|
4
|
-
dragonfly-cache (0.1.
|
|
5
|
-
dragonfly
|
|
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.
|
|
12
|
-
public_suffix (>= 2.0.2, <
|
|
13
|
-
ast (2.4.
|
|
14
|
-
concurrent-ruby (1.
|
|
15
|
-
diff-lcs (1.
|
|
16
|
-
dragonfly (1.1
|
|
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.
|
|
20
|
+
i18n (1.8.5)
|
|
21
21
|
concurrent-ruby (~> 1.0)
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
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 (
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
rspec-
|
|
36
|
-
|
|
37
|
-
rspec-
|
|
38
|
-
rspec-
|
|
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.
|
|
41
|
-
rspec-mocks (3.
|
|
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.
|
|
44
|
-
rspec-support (3.
|
|
45
|
-
rubocop (
|
|
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.
|
|
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 (
|
|
53
|
-
|
|
54
|
-
|
|
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
|
|
63
|
+
bundler (~> 2.1)
|
|
61
64
|
dragonfly-cache!
|
|
62
|
-
rake (~>
|
|
63
|
-
rspec (~> 3.
|
|
65
|
+
rake (~> 13.0)
|
|
66
|
+
rspec (~> 3.10.0)
|
|
64
67
|
rubocop
|
|
65
68
|
|
|
66
69
|
BUNDLED WITH
|
|
67
|
-
1.
|
|
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.
|
data/dragonfly-cache.gemspec
CHANGED
|
@@ -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
|
-
|
|
19
|
-
|
|
20
|
-
|
|
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.
|
|
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
|
|
33
|
-
spec.add_development_dependency 'rake', '~>
|
|
34
|
-
spec.add_development_dependency 'rspec', '~> 3.
|
|
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/
|
|
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, :
|
|
14
|
+
attr_reader :plugin, :storage, :map
|
|
14
15
|
|
|
15
|
-
delegate %i[
|
|
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
|
|
20
|
-
@
|
|
21
|
-
|
|
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
|
|
25
|
-
return
|
|
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
|
-
|
|
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
|
|
44
|
-
@
|
|
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
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
37
|
+
def job_options(job)
|
|
38
|
+
{
|
|
39
|
+
shaish: shaish(job),
|
|
40
|
+
normalized_name: normalized_name(job)
|
|
41
|
+
}
|
|
52
42
|
end
|
|
53
43
|
|
|
54
|
-
|
|
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
|
-
|
|
64
|
-
|
|
46
|
+
def shaish(job)
|
|
47
|
+
job.sha[0..(sha_size - 1)]
|
|
65
48
|
end
|
|
66
49
|
|
|
67
|
-
def
|
|
68
|
-
|
|
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
|
|
72
|
-
@
|
|
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
|
|
76
|
-
|
|
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
|
-
|
|
80
|
-
@cache_map[job.sha] = uri.path
|
|
81
|
-
save_map
|
|
65
|
+
@sha_size += 1
|
|
82
66
|
end
|
|
83
67
|
|
|
84
|
-
def
|
|
85
|
-
|
|
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[
|
|
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
|
|
25
|
-
@manager
|
|
23
|
+
@config = Dragonfly::Cache::Config.new(cache_servers_options)
|
|
24
|
+
@manager = Dragonfly::Cache::Manager.new(self)
|
|
26
25
|
|
|
27
|
-
app.define_url do |
|
|
28
|
-
url_for(
|
|
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
|
-
|
|
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
|
-
|
|
38
|
+
protected
|
|
39
|
+
|
|
40
|
+
def build_url_for(app, job, opts)
|
|
45
41
|
loop do
|
|
46
|
-
url = server_for(app).url_for(job,
|
|
47
|
-
|
|
48
|
-
|
|
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
|
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.
|
|
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:
|
|
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:
|
|
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:
|
|
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
|
|
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
|
|
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: '
|
|
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: '
|
|
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.
|
|
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.
|
|
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: '
|
|
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
|
-
|
|
148
|
-
|
|
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
|