gitlab-client-cache 0.0.1
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
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 20d4daf1d7e01d29ee5eaaf8b1edd660ce52ec89148bfc51e8daf9908909165b
|
4
|
+
data.tar.gz: 9969132bc7cd53b70c5f4602afa9c17817c18177403bb17fbd77b743def7da3d
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 02a47cb4bc8b35df3b71e1175b3df13b98044fdaf4ebc2e76a6961261490e6954e83513e68233902c16390ee0f0a32081b1fd024495b8fc99bff494dff62bebd
|
7
|
+
data.tar.gz: 3807c92653c2c9222b8f49f914ca52f1966782f4bc8be43278d4e9c3c6ed7e4280cf0815a28527314eb2671859adfcf5b59dc6b0a2b1e7e39100ff0dcae4f759
|
@@ -0,0 +1,89 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "cgi"
|
4
|
+
require "json"
|
5
|
+
require "pathname"
|
6
|
+
|
7
|
+
class Gitlab::Client::Cache::Caching
|
8
|
+
PATH_PATTERN = /^(..)(..)(.*)$/
|
9
|
+
|
10
|
+
def initialize(config)
|
11
|
+
@config = config
|
12
|
+
end
|
13
|
+
|
14
|
+
def cached(http_path, http_params)
|
15
|
+
path = path_to(http_path, http_params)
|
16
|
+
|
17
|
+
if path.exist? && path_fresh?(path)
|
18
|
+
load(path)
|
19
|
+
else
|
20
|
+
dump(path, yield)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
|
26
|
+
def path_fresh?(path)
|
27
|
+
return true unless @config.expires_in
|
28
|
+
|
29
|
+
path.mtime + @config.expires_in >= Time.now
|
30
|
+
end
|
31
|
+
|
32
|
+
def load(path)
|
33
|
+
Marshal.load(inflate(path.read))
|
34
|
+
end
|
35
|
+
|
36
|
+
def inflate(content)
|
37
|
+
return content unless @config.compression
|
38
|
+
|
39
|
+
klass, *_params = Array(@config.compression)
|
40
|
+
|
41
|
+
Object.const_get(klass).inflate(content)
|
42
|
+
end
|
43
|
+
|
44
|
+
def dump(path, response)
|
45
|
+
path.dirname.mkpath
|
46
|
+
path.write(deflate(Marshal.dump(response)))
|
47
|
+
|
48
|
+
response
|
49
|
+
end
|
50
|
+
|
51
|
+
def deflate(content)
|
52
|
+
return content unless @config.compression
|
53
|
+
|
54
|
+
klass, *params = Array(@config.compression)
|
55
|
+
|
56
|
+
if params
|
57
|
+
Object.const_get(klass).deflate(content, *params)
|
58
|
+
else
|
59
|
+
Object.const_get(klass).deflate(content)
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
def path_to(http_path, http_params)
|
64
|
+
params = clean_params(http_params)
|
65
|
+
plain = JSON.generate([http_path, params])
|
66
|
+
key = Digest::SHA256.hexdigest(plain)
|
67
|
+
|
68
|
+
parts = [
|
69
|
+
@config.cache_root,
|
70
|
+
clean_path(@config.scope),
|
71
|
+
*PATH_PATTERN.match(key).captures
|
72
|
+
].compact
|
73
|
+
|
74
|
+
Pathname.new(parts.join("/"))
|
75
|
+
end
|
76
|
+
|
77
|
+
def clean_params(params)
|
78
|
+
params = params.dup
|
79
|
+
params.delete(:logger)
|
80
|
+
params.delete(:log_level)
|
81
|
+
|
82
|
+
params
|
83
|
+
end
|
84
|
+
|
85
|
+
def clean_path(path)
|
86
|
+
CGI.escape(path)
|
87
|
+
.gsub(".", "_")
|
88
|
+
end
|
89
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Gitlab::Client::Cache
|
4
|
+
Config = Struct.new(:cache_root, :scope, :compression, :expires_in, keyword_init: true) do
|
5
|
+
def self.build
|
6
|
+
new(
|
7
|
+
cache_root: default_cache_root,
|
8
|
+
scope: default_scope,
|
9
|
+
compression: default_compression,
|
10
|
+
expires_in: default_expires_in
|
11
|
+
)
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.default_cache_root
|
15
|
+
root = ENV.fetch("GITLAB_CLIENT_CACHE_ROOT", nil)
|
16
|
+
root ||= if ENV.key?("XDG_CACHE_HOME")
|
17
|
+
File.join(ENV.fetch("XDG_CACHE_HOME"), Process.uid.to_s)
|
18
|
+
else
|
19
|
+
File.join(File.realpath(Dir.home), ".cache")
|
20
|
+
end
|
21
|
+
|
22
|
+
File.join(root, "gitlab-cache")
|
23
|
+
end
|
24
|
+
|
25
|
+
def self.default_scope
|
26
|
+
ENV.fetch("GITLAB_CLIENT_CACHE_SCOPE", File.basename($PROGRAM_NAME))
|
27
|
+
end
|
28
|
+
|
29
|
+
def self.default_compression
|
30
|
+
"Zlib"
|
31
|
+
end
|
32
|
+
|
33
|
+
def self.default_expires_in
|
34
|
+
value = ENV.fetch("GITLAB_CLIENT_CACHE_EXPIRES_IN_SECONDS", nil)
|
35
|
+
day = 24 * 60 * 60
|
36
|
+
|
37
|
+
Integer(value || day)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,9 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Gitlab::Client::Cache::Patch
|
4
|
+
def get(path, params = {})
|
5
|
+
Gitlab::Client::Cache::Caching.new(Gitlab::Client::Cache.config).cached(path, params) { super }
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
Gitlab::Request.singleton_class.prepend(Gitlab::Client::Cache::Patch)
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "digest/sha2"
|
4
|
+
|
5
|
+
require_relative "cache/version"
|
6
|
+
require_relative "cache/config"
|
7
|
+
require_relative "cache/caching"
|
8
|
+
require_relative "cache/patch"
|
9
|
+
|
10
|
+
module Gitlab::Client::Cache
|
11
|
+
VERSION = GitlabClientCache::VERSION
|
12
|
+
|
13
|
+
# Performs caching for `gitlab` gem.
|
14
|
+
def self.config
|
15
|
+
@config ||= Config.build
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.configure
|
19
|
+
yield config if block_given?
|
20
|
+
|
21
|
+
nil
|
22
|
+
end
|
23
|
+
end
|
metadata
ADDED
@@ -0,0 +1,66 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: gitlab-client-cache
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Peter Leitzen
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2023-12-07 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: gitlab
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '4'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '4'
|
27
|
+
description: Store fetched responses locally.
|
28
|
+
email:
|
29
|
+
- peter@leitzen.de
|
30
|
+
executables: []
|
31
|
+
extensions: []
|
32
|
+
extra_rdoc_files: []
|
33
|
+
files:
|
34
|
+
- lib/gitlab-client-cache.rb
|
35
|
+
- lib/gitlab/client/cache.rb
|
36
|
+
- lib/gitlab/client/cache/caching.rb
|
37
|
+
- lib/gitlab/client/cache/config.rb
|
38
|
+
- lib/gitlab/client/cache/patch.rb
|
39
|
+
- lib/gitlab/client/cache/version.rb
|
40
|
+
homepage: https://gitlab.com/splatteal/gitlab-client-cache
|
41
|
+
licenses:
|
42
|
+
- MIT
|
43
|
+
metadata:
|
44
|
+
homepage_uri: https://gitlab.com/splatteal/gitlab-client-cache
|
45
|
+
source_code_uri: https://gitlab.com/splatteal/gitlab-client-cache
|
46
|
+
changelog_uri: https://gitlab.com/splatteal/gitlab-client-cache
|
47
|
+
post_install_message:
|
48
|
+
rdoc_options: []
|
49
|
+
require_paths:
|
50
|
+
- lib
|
51
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
52
|
+
requirements:
|
53
|
+
- - ">="
|
54
|
+
- !ruby/object:Gem::Version
|
55
|
+
version: 3.0.0
|
56
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
57
|
+
requirements:
|
58
|
+
- - ">="
|
59
|
+
- !ruby/object:Gem::Version
|
60
|
+
version: '0'
|
61
|
+
requirements: []
|
62
|
+
rubygems_version: 3.4.22
|
63
|
+
signing_key:
|
64
|
+
specification_version: 4
|
65
|
+
summary: Response cache for `gitlab` gem
|
66
|
+
test_files: []
|