anonymous_loader 0.1.0
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 +7 -0
- checksums.yaml.gz.sig +4 -0
- data/CHANGELOG.md +48 -0
- data/CITATION.cff +20 -0
- data/CODE_OF_CONDUCT.md +134 -0
- data/CONTRIBUTING.md +272 -0
- data/FUNDING.md +74 -0
- data/LICENSE.md +10 -0
- data/README.md +562 -0
- data/RUBOCOP.md +71 -0
- data/SECURITY.md +21 -0
- data/certs/pboling.pem +27 -0
- data/lib/anonymous_loader/version.rb +8 -0
- data/lib/anonymous_loader.rb +231 -0
- data/sig/anonymous_loader/version.rbs +6 -0
- data/sig/anonymous_loader.rbs +14 -0
- data.tar.gz.sig +0 -0
- metadata +314 -0
- metadata.gz.sig +0 -0
data/SECURITY.md
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# Security Policy
|
|
2
|
+
|
|
3
|
+
## Supported Versions
|
|
4
|
+
|
|
5
|
+
| Version | Supported |
|
|
6
|
+
|----------|-----------|
|
|
7
|
+
| 0.latest | ✅ |
|
|
8
|
+
|
|
9
|
+
## Security contact information
|
|
10
|
+
|
|
11
|
+
To report a security vulnerability, please use the
|
|
12
|
+
[Tidelift security contact](https://tidelift.com/security).
|
|
13
|
+
Tidelift will coordinate the fix and disclosure.
|
|
14
|
+
|
|
15
|
+
## Additional Support
|
|
16
|
+
|
|
17
|
+
If you are interested in support for versions older than the latest release,
|
|
18
|
+
please consider sponsoring the project / maintainer @ https://liberapay.com/pboling/donate,
|
|
19
|
+
or find other sponsorship links in the [README].
|
|
20
|
+
|
|
21
|
+
[README]: README.md
|
data/certs/pboling.pem
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
-----BEGIN CERTIFICATE-----
|
|
2
|
+
MIIEgDCCAuigAwIBAgIBATANBgkqhkiG9w0BAQsFADBDMRUwEwYDVQQDDAxwZXRl
|
|
3
|
+
ci5ib2xpbmcxFTATBgoJkiaJk/IsZAEZFgVnbWFpbDETMBEGCgmSJomT8ixkARkW
|
|
4
|
+
A2NvbTAeFw0yNTA1MDQxNTMzMDlaFw00NTA0MjkxNTMzMDlaMEMxFTATBgNVBAMM
|
|
5
|
+
DHBldGVyLmJvbGluZzEVMBMGCgmSJomT8ixkARkWBWdtYWlsMRMwEQYKCZImiZPy
|
|
6
|
+
LGQBGRYDY29tMIIBojANBgkqhkiG9w0BAQEFAAOCAY8AMIIBigKCAYEAruUoo0WA
|
|
7
|
+
uoNuq6puKWYeRYiZekz/nsDeK5x/0IEirzcCEvaHr3Bmz7rjo1I6On3gGKmiZs61
|
|
8
|
+
LRmQ3oxy77ydmkGTXBjruJB+pQEn7UfLSgQ0xa1/X3kdBZt6RmabFlBxnHkoaGY5
|
|
9
|
+
mZuZ5+Z7walmv6sFD9ajhzj+oIgwWfnEHkXYTR8I6VLN7MRRKGMPoZ/yvOmxb2DN
|
|
10
|
+
coEEHWKO9CvgYpW7asIihl/9GMpKiRkcYPm9dGQzZc6uTwom1COfW0+ZOFrDVBuV
|
|
11
|
+
FMQRPswZcY4Wlq0uEBLPU7hxnCL9nKK6Y9IhdDcz1mY6HZ91WImNslOSI0S8hRpj
|
|
12
|
+
yGOWxQIhBT3fqCBlRIqFQBudrnD9jSNpSGsFvbEijd5ns7Z9ZMehXkXDycpGAUj1
|
|
13
|
+
to/5cuTWWw1JqUWrKJYoifnVhtE1o1DZ+LkPtWxHtz5kjDG/zR3MG0Ula0UOavlD
|
|
14
|
+
qbnbcXPBnwXtTFeZ3C+yrWpE4pGnl3yGkZj9SMTlo9qnTMiPmuWKQDatAgMBAAGj
|
|
15
|
+
fzB9MAkGA1UdEwQCMAAwCwYDVR0PBAQDAgSwMB0GA1UdDgQWBBQE8uWvNbPVNRXZ
|
|
16
|
+
HlgPbc2PCzC4bjAhBgNVHREEGjAYgRZwZXRlci5ib2xpbmdAZ21haWwuY29tMCEG
|
|
17
|
+
A1UdEgQaMBiBFnBldGVyLmJvbGluZ0BnbWFpbC5jb20wDQYJKoZIhvcNAQELBQAD
|
|
18
|
+
ggGBAJbnUwfJQFPkBgH9cL7hoBfRtmWiCvdqdjeTmi04u8zVNCUox0A4gT982DE9
|
|
19
|
+
wmuN12LpdajxZONqbXuzZvc+nb0StFwmFYZG6iDwaf4BPywm2e/Vmq0YG45vZXGR
|
|
20
|
+
L8yMDSK1cQXjmA+ZBKOHKWavxP6Vp7lWvjAhz8RFwqF9GuNIdhv9NpnCAWcMZtpm
|
|
21
|
+
GUPyIWw/Cw/2wZp74QzZj6Npx+LdXoLTF1HMSJXZ7/pkxLCsB8m4EFVdb/IrW/0k
|
|
22
|
+
kNSfjtAfBHO8nLGuqQZVH9IBD1i9K6aSs7pT6TW8itXUIlkIUI2tg5YzW6OFfPzq
|
|
23
|
+
QekSkX3lZfY+HTSp/o+YvKkqWLUV7PQ7xh1ZYDtocpaHwgxe/j3bBqHE+CUPH2vA
|
|
24
|
+
0V/FwdTRWcwsjVoOJTrYcff8pBZ8r2MvtAc54xfnnhGFzeRHfcltobgFxkAXdE6p
|
|
25
|
+
DVjBtqT23eugOqQ73umLcYDZkc36vnqGxUBSsXrzY9pzV5gGr2I8YUxMqf6ATrZt
|
|
26
|
+
L9nRqA==
|
|
27
|
+
-----END CERTIFICATE-----
|
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "version_gem"
|
|
4
|
+
|
|
5
|
+
require_relative "anonymous_loader/version"
|
|
6
|
+
|
|
7
|
+
# Loads Ruby source under anonymous modules to avoid top-level namespace collisions.
|
|
8
|
+
module AnonymousLoader
|
|
9
|
+
# Raised for anonymous loader failures.
|
|
10
|
+
class Error < StandardError; end
|
|
11
|
+
# Raised when a requested Ruby source file cannot be resolved.
|
|
12
|
+
class FileNotFoundError < Error; end
|
|
13
|
+
# Raised when a resolved load-path candidate does not match the requested version.
|
|
14
|
+
class VersionMismatchError < Error; end
|
|
15
|
+
|
|
16
|
+
# Internal normalized resolver request.
|
|
17
|
+
# @api private
|
|
18
|
+
PathRequest = Struct.new(:path, :gem_name, :require_path, :requirement, :version_file)
|
|
19
|
+
# Internal load-path version lookup request.
|
|
20
|
+
# @api private
|
|
21
|
+
VersionRequest = Struct.new(:candidate, :version_file)
|
|
22
|
+
|
|
23
|
+
class << self
|
|
24
|
+
# Evaluate one or more Ruby files inside a fresh anonymous module.
|
|
25
|
+
#
|
|
26
|
+
# The source's natural constant nesting is preserved inside the anonymous
|
|
27
|
+
# module. For example, a file declaring `module Auth; module Sanitizer; end`
|
|
28
|
+
# becomes `anonymous_namespace::Auth::Sanitizer`, not `Object::Auth`.
|
|
29
|
+
#
|
|
30
|
+
# @param files [String, Array<String>] absolute paths, or paths relative to root
|
|
31
|
+
# @param root [String, nil] optional root for relative paths
|
|
32
|
+
# @return [Module] anonymous namespace containing the evaluated source
|
|
33
|
+
def load(files:, root: nil, **_options)
|
|
34
|
+
namespace = Module.new
|
|
35
|
+
Array(files).each do |file|
|
|
36
|
+
path = expand_file(file, root)
|
|
37
|
+
namespace.module_eval(File.read(path), path, 1)
|
|
38
|
+
end
|
|
39
|
+
namespace
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
# Resolve and anonymously load a single file.
|
|
43
|
+
#
|
|
44
|
+
# @param options [Hash] resolver options
|
|
45
|
+
# @option options [String, nil] :path explicit file path
|
|
46
|
+
# @option options [String, nil] :gem_name gem name used for RubyGems lookup
|
|
47
|
+
# @option options [String, nil] :require_path path under lib, also used for $LOAD_PATH lookup
|
|
48
|
+
# @option options [String, Gem::Requirement, nil] :version_requirement accepted gem version
|
|
49
|
+
# @option options [String, nil] :version_file file next to require_path's load root that declares VERSION
|
|
50
|
+
# @return [Module] anonymous namespace containing the evaluated source
|
|
51
|
+
def load_path(**options)
|
|
52
|
+
load(files: resolve_path(**options))
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
# Resolve a file from an explicit path, RubyGems metadata, or $LOAD_PATH.
|
|
56
|
+
#
|
|
57
|
+
# RubyGems metadata is preferred when available. The $LOAD_PATH fallback
|
|
58
|
+
# supports Bundler standalone setups where files are loadable but the
|
|
59
|
+
# dependency is absent from Gem.loaded_specs and GEM_PATH.
|
|
60
|
+
#
|
|
61
|
+
# @param options [Hash] resolver options
|
|
62
|
+
# @option options [String, nil] :path explicit file path
|
|
63
|
+
# @option options [String, nil] :gem_name gem name used for RubyGems lookup
|
|
64
|
+
# @option options [String, nil] :require_path path under lib, also used for $LOAD_PATH lookup
|
|
65
|
+
# @option options [String, Gem::Requirement, nil] :version_requirement accepted gem version
|
|
66
|
+
# @option options [String, nil] :version_file file next to require_path's load root that declares VERSION
|
|
67
|
+
# @return [String] absolute path to the resolved file
|
|
68
|
+
def resolve_path(**options)
|
|
69
|
+
request = path_request(options)
|
|
70
|
+
resolved = explicit_path_for(request) || resolve_from_gemspec(request) || resolve_from_load_path(request)
|
|
71
|
+
return resolved if resolved
|
|
72
|
+
|
|
73
|
+
raise FileNotFoundError, unresolved_message(request)
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
private
|
|
77
|
+
|
|
78
|
+
def path_request(options)
|
|
79
|
+
version_requirement = options[:version_requirement]
|
|
80
|
+
PathRequest.new(
|
|
81
|
+
options[:path],
|
|
82
|
+
options[:gem_name],
|
|
83
|
+
options[:require_path],
|
|
84
|
+
version_requirement && Gem::Requirement.create(version_requirement),
|
|
85
|
+
options[:version_file]
|
|
86
|
+
)
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
def explicit_path_for(request)
|
|
90
|
+
path = request.path
|
|
91
|
+
expand_file(path, nil) if path
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
def unresolved_message(request)
|
|
95
|
+
"could not resolve #{request.require_path.inspect} from #{request.gem_name || "load path"}"
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
def expand_file(file, root)
|
|
99
|
+
path = (root && !absolute_path?(file)) ? File.expand_path(file, root) : File.expand_path(file)
|
|
100
|
+
raise FileNotFoundError, "file not found: #{path}" unless File.file?(path)
|
|
101
|
+
|
|
102
|
+
path
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
def absolute_path?(path)
|
|
106
|
+
path.start_with?(File::SEPARATOR) || !!(File::ALT_SEPARATOR && path.start_with?(File::ALT_SEPARATOR))
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
def resolve_from_gemspec(request)
|
|
110
|
+
candidate = gemspec_candidate(request)
|
|
111
|
+
candidate if candidate && File.file?(candidate)
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
def gemspec_candidate(request)
|
|
115
|
+
return nil unless gemspec_request_complete?(request)
|
|
116
|
+
|
|
117
|
+
spec = matching_spec(request.gem_name, request.requirement)
|
|
118
|
+
spec && File.join(spec.full_gem_path, "lib", request.require_path)
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
def gemspec_request_complete?(request)
|
|
122
|
+
request.gem_name && request.require_path
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
def matching_spec(gem_name, requirement)
|
|
126
|
+
spec = Gem.loaded_specs[gem_name]
|
|
127
|
+
spec = find_spec(gem_name, requirement) if !spec || spec_version_mismatch?(spec, requirement)
|
|
128
|
+
spec
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
def spec_version_mismatch?(spec, requirement)
|
|
132
|
+
requirement && !requirement.satisfied_by?(spec.version)
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
def find_spec(gem_name, requirement)
|
|
136
|
+
if requirement
|
|
137
|
+
Gem::Specification.find_by_name(gem_name, requirement)
|
|
138
|
+
else
|
|
139
|
+
Gem::Specification.find_by_name(gem_name)
|
|
140
|
+
end
|
|
141
|
+
rescue Gem::MissingSpecError
|
|
142
|
+
nil
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
def resolve_from_load_path(request)
|
|
146
|
+
resolve_load_path_candidates(load_path_candidates_for(request), request)
|
|
147
|
+
end
|
|
148
|
+
|
|
149
|
+
def load_path_candidates_for(request)
|
|
150
|
+
require_path = request.require_path
|
|
151
|
+
return [] unless require_path
|
|
152
|
+
|
|
153
|
+
load_path_candidates(require_path)
|
|
154
|
+
end
|
|
155
|
+
|
|
156
|
+
def resolve_load_path_candidates(candidates, request)
|
|
157
|
+
return nil if candidates.empty?
|
|
158
|
+
return candidates.first unless request.requirement
|
|
159
|
+
|
|
160
|
+
resolve_versioned_load_path(candidates, request)
|
|
161
|
+
end
|
|
162
|
+
|
|
163
|
+
def load_path_candidates(require_path)
|
|
164
|
+
Gem.find_files(require_path).select { |candidate| File.file?(candidate) }
|
|
165
|
+
end
|
|
166
|
+
|
|
167
|
+
def resolve_versioned_load_path(candidates, request)
|
|
168
|
+
versions = load_path_versions(candidates, request.version_file)
|
|
169
|
+
match = versions.find { |pair| request.requirement.satisfied_by?(pair.last) }
|
|
170
|
+
return match.first if match
|
|
171
|
+
|
|
172
|
+
raise_load_path_version_mismatch(request, versions.map(&:last))
|
|
173
|
+
end
|
|
174
|
+
|
|
175
|
+
def load_path_versions(candidates, version_file)
|
|
176
|
+
candidates.each_with_object([]) do |candidate, versions|
|
|
177
|
+
version = version_for_load_path_candidate(VersionRequest.new(candidate, version_file))
|
|
178
|
+
versions << [candidate, version] if version
|
|
179
|
+
end
|
|
180
|
+
end
|
|
181
|
+
|
|
182
|
+
def raise_load_path_version_mismatch(request, mismatched_versions)
|
|
183
|
+
return nil if mismatched_versions.empty?
|
|
184
|
+
|
|
185
|
+
raise VersionMismatchError,
|
|
186
|
+
"#{request.require_path.inspect} did not satisfy #{request.requirement}; found #{mismatched_versions.uniq.join(", ")}"
|
|
187
|
+
end
|
|
188
|
+
|
|
189
|
+
def version_for_load_path_candidate(request)
|
|
190
|
+
version_path = existing_version_file(request)
|
|
191
|
+
gem_version_for(version_path) if version_path
|
|
192
|
+
rescue ArgumentError
|
|
193
|
+
nil
|
|
194
|
+
end
|
|
195
|
+
|
|
196
|
+
def existing_version_file(request)
|
|
197
|
+
return nil unless request.version_file
|
|
198
|
+
|
|
199
|
+
version_path = load_path_version_file(request)
|
|
200
|
+
version_path if File.file?(version_path)
|
|
201
|
+
end
|
|
202
|
+
|
|
203
|
+
def load_path_version_file(request)
|
|
204
|
+
File.expand_path(request.version_file, load_path_root(request))
|
|
205
|
+
end
|
|
206
|
+
|
|
207
|
+
def gem_version_for(version_path)
|
|
208
|
+
version_string = version_string_for(version_path)
|
|
209
|
+
Gem::Version.new(version_string) if version_string
|
|
210
|
+
end
|
|
211
|
+
|
|
212
|
+
def version_string_for(version_path)
|
|
213
|
+
source = File.read(version_path)
|
|
214
|
+
# This fallback only runs when RubyGems metadata is unavailable; the
|
|
215
|
+
# supported version file contract is a simple string VERSION assignment.
|
|
216
|
+
match = source.match(/VERSION\s*=\s*(["'])([^"']+)\1/)
|
|
217
|
+
match[2] if match
|
|
218
|
+
end
|
|
219
|
+
|
|
220
|
+
def load_path_root(request)
|
|
221
|
+
candidate_dir = File.dirname(request.candidate)
|
|
222
|
+
version_depth = request.version_file.split("/").length - 1
|
|
223
|
+
version_depth.times { candidate_dir = File.dirname(candidate_dir) }
|
|
224
|
+
candidate_dir
|
|
225
|
+
end
|
|
226
|
+
end
|
|
227
|
+
end
|
|
228
|
+
|
|
229
|
+
AnonymousLoader::Version.class_eval do
|
|
230
|
+
extend VersionGem::Basic
|
|
231
|
+
end
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
module AnonymousLoader
|
|
2
|
+
class Error < StandardError
|
|
3
|
+
end
|
|
4
|
+
|
|
5
|
+
class FileNotFoundError < Error
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
class VersionMismatchError < Error
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def self.load: (files: String | Array[String], ?root: String?, **untyped) -> Module
|
|
12
|
+
def self.load_path: (?path: String?, ?gem_name: String?, ?require_path: String?, ?version_requirement: String | Gem::Requirement?, ?version_file: String?, **untyped) -> Module
|
|
13
|
+
def self.resolve_path: (?path: String?, ?gem_name: String?, ?require_path: String?, ?version_requirement: String | Gem::Requirement?, ?version_file: String?, **untyped) -> String
|
|
14
|
+
end
|
data.tar.gz.sig
ADDED
|
Binary file
|
metadata
ADDED
|
@@ -0,0 +1,314 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: anonymous_loader
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
version: 0.1.0
|
|
5
|
+
platform: ruby
|
|
6
|
+
authors:
|
|
7
|
+
- Peter H. Boling
|
|
8
|
+
bindir: exe
|
|
9
|
+
cert_chain:
|
|
10
|
+
- |
|
|
11
|
+
-----BEGIN CERTIFICATE-----
|
|
12
|
+
MIIEgDCCAuigAwIBAgIBATANBgkqhkiG9w0BAQsFADBDMRUwEwYDVQQDDAxwZXRl
|
|
13
|
+
ci5ib2xpbmcxFTATBgoJkiaJk/IsZAEZFgVnbWFpbDETMBEGCgmSJomT8ixkARkW
|
|
14
|
+
A2NvbTAeFw0yNTA1MDQxNTMzMDlaFw00NTA0MjkxNTMzMDlaMEMxFTATBgNVBAMM
|
|
15
|
+
DHBldGVyLmJvbGluZzEVMBMGCgmSJomT8ixkARkWBWdtYWlsMRMwEQYKCZImiZPy
|
|
16
|
+
LGQBGRYDY29tMIIBojANBgkqhkiG9w0BAQEFAAOCAY8AMIIBigKCAYEAruUoo0WA
|
|
17
|
+
uoNuq6puKWYeRYiZekz/nsDeK5x/0IEirzcCEvaHr3Bmz7rjo1I6On3gGKmiZs61
|
|
18
|
+
LRmQ3oxy77ydmkGTXBjruJB+pQEn7UfLSgQ0xa1/X3kdBZt6RmabFlBxnHkoaGY5
|
|
19
|
+
mZuZ5+Z7walmv6sFD9ajhzj+oIgwWfnEHkXYTR8I6VLN7MRRKGMPoZ/yvOmxb2DN
|
|
20
|
+
coEEHWKO9CvgYpW7asIihl/9GMpKiRkcYPm9dGQzZc6uTwom1COfW0+ZOFrDVBuV
|
|
21
|
+
FMQRPswZcY4Wlq0uEBLPU7hxnCL9nKK6Y9IhdDcz1mY6HZ91WImNslOSI0S8hRpj
|
|
22
|
+
yGOWxQIhBT3fqCBlRIqFQBudrnD9jSNpSGsFvbEijd5ns7Z9ZMehXkXDycpGAUj1
|
|
23
|
+
to/5cuTWWw1JqUWrKJYoifnVhtE1o1DZ+LkPtWxHtz5kjDG/zR3MG0Ula0UOavlD
|
|
24
|
+
qbnbcXPBnwXtTFeZ3C+yrWpE4pGnl3yGkZj9SMTlo9qnTMiPmuWKQDatAgMBAAGj
|
|
25
|
+
fzB9MAkGA1UdEwQCMAAwCwYDVR0PBAQDAgSwMB0GA1UdDgQWBBQE8uWvNbPVNRXZ
|
|
26
|
+
HlgPbc2PCzC4bjAhBgNVHREEGjAYgRZwZXRlci5ib2xpbmdAZ21haWwuY29tMCEG
|
|
27
|
+
A1UdEgQaMBiBFnBldGVyLmJvbGluZ0BnbWFpbC5jb20wDQYJKoZIhvcNAQELBQAD
|
|
28
|
+
ggGBAJbnUwfJQFPkBgH9cL7hoBfRtmWiCvdqdjeTmi04u8zVNCUox0A4gT982DE9
|
|
29
|
+
wmuN12LpdajxZONqbXuzZvc+nb0StFwmFYZG6iDwaf4BPywm2e/Vmq0YG45vZXGR
|
|
30
|
+
L8yMDSK1cQXjmA+ZBKOHKWavxP6Vp7lWvjAhz8RFwqF9GuNIdhv9NpnCAWcMZtpm
|
|
31
|
+
GUPyIWw/Cw/2wZp74QzZj6Npx+LdXoLTF1HMSJXZ7/pkxLCsB8m4EFVdb/IrW/0k
|
|
32
|
+
kNSfjtAfBHO8nLGuqQZVH9IBD1i9K6aSs7pT6TW8itXUIlkIUI2tg5YzW6OFfPzq
|
|
33
|
+
QekSkX3lZfY+HTSp/o+YvKkqWLUV7PQ7xh1ZYDtocpaHwgxe/j3bBqHE+CUPH2vA
|
|
34
|
+
0V/FwdTRWcwsjVoOJTrYcff8pBZ8r2MvtAc54xfnnhGFzeRHfcltobgFxkAXdE6p
|
|
35
|
+
DVjBtqT23eugOqQ73umLcYDZkc36vnqGxUBSsXrzY9pzV5gGr2I8YUxMqf6ATrZt
|
|
36
|
+
L9nRqA==
|
|
37
|
+
-----END CERTIFICATE-----
|
|
38
|
+
date: 1980-01-02 00:00:00.000000000 Z
|
|
39
|
+
dependencies:
|
|
40
|
+
- !ruby/object:Gem::Dependency
|
|
41
|
+
name: version_gem
|
|
42
|
+
requirement: !ruby/object:Gem::Requirement
|
|
43
|
+
requirements:
|
|
44
|
+
- - "~>"
|
|
45
|
+
- !ruby/object:Gem::Version
|
|
46
|
+
version: '1.1'
|
|
47
|
+
- - ">="
|
|
48
|
+
- !ruby/object:Gem::Version
|
|
49
|
+
version: 1.1.12
|
|
50
|
+
type: :runtime
|
|
51
|
+
prerelease: false
|
|
52
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
53
|
+
requirements:
|
|
54
|
+
- - "~>"
|
|
55
|
+
- !ruby/object:Gem::Version
|
|
56
|
+
version: '1.1'
|
|
57
|
+
- - ">="
|
|
58
|
+
- !ruby/object:Gem::Version
|
|
59
|
+
version: 1.1.12
|
|
60
|
+
- !ruby/object:Gem::Dependency
|
|
61
|
+
name: kettle-dev
|
|
62
|
+
requirement: !ruby/object:Gem::Requirement
|
|
63
|
+
requirements:
|
|
64
|
+
- - "~>"
|
|
65
|
+
- !ruby/object:Gem::Version
|
|
66
|
+
version: '2.2'
|
|
67
|
+
- - ">="
|
|
68
|
+
- !ruby/object:Gem::Version
|
|
69
|
+
version: 2.2.12
|
|
70
|
+
type: :development
|
|
71
|
+
prerelease: false
|
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
73
|
+
requirements:
|
|
74
|
+
- - "~>"
|
|
75
|
+
- !ruby/object:Gem::Version
|
|
76
|
+
version: '2.2'
|
|
77
|
+
- - ">="
|
|
78
|
+
- !ruby/object:Gem::Version
|
|
79
|
+
version: 2.2.12
|
|
80
|
+
- !ruby/object:Gem::Dependency
|
|
81
|
+
name: bundler-audit
|
|
82
|
+
requirement: !ruby/object:Gem::Requirement
|
|
83
|
+
requirements:
|
|
84
|
+
- - "~>"
|
|
85
|
+
- !ruby/object:Gem::Version
|
|
86
|
+
version: 0.9.3
|
|
87
|
+
type: :development
|
|
88
|
+
prerelease: false
|
|
89
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
90
|
+
requirements:
|
|
91
|
+
- - "~>"
|
|
92
|
+
- !ruby/object:Gem::Version
|
|
93
|
+
version: 0.9.3
|
|
94
|
+
- !ruby/object:Gem::Dependency
|
|
95
|
+
name: rake
|
|
96
|
+
requirement: !ruby/object:Gem::Requirement
|
|
97
|
+
requirements:
|
|
98
|
+
- - "~>"
|
|
99
|
+
- !ruby/object:Gem::Version
|
|
100
|
+
version: '13.0'
|
|
101
|
+
type: :development
|
|
102
|
+
prerelease: false
|
|
103
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
104
|
+
requirements:
|
|
105
|
+
- - "~>"
|
|
106
|
+
- !ruby/object:Gem::Version
|
|
107
|
+
version: '13.0'
|
|
108
|
+
- !ruby/object:Gem::Dependency
|
|
109
|
+
name: require_bench
|
|
110
|
+
requirement: !ruby/object:Gem::Requirement
|
|
111
|
+
requirements:
|
|
112
|
+
- - "~>"
|
|
113
|
+
- !ruby/object:Gem::Version
|
|
114
|
+
version: '1.0'
|
|
115
|
+
- - ">="
|
|
116
|
+
- !ruby/object:Gem::Version
|
|
117
|
+
version: 1.0.4
|
|
118
|
+
type: :development
|
|
119
|
+
prerelease: false
|
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
121
|
+
requirements:
|
|
122
|
+
- - "~>"
|
|
123
|
+
- !ruby/object:Gem::Version
|
|
124
|
+
version: '1.0'
|
|
125
|
+
- - ">="
|
|
126
|
+
- !ruby/object:Gem::Version
|
|
127
|
+
version: 1.0.4
|
|
128
|
+
- !ruby/object:Gem::Dependency
|
|
129
|
+
name: appraisal2
|
|
130
|
+
requirement: !ruby/object:Gem::Requirement
|
|
131
|
+
requirements:
|
|
132
|
+
- - "~>"
|
|
133
|
+
- !ruby/object:Gem::Version
|
|
134
|
+
version: '3.1'
|
|
135
|
+
- - ">="
|
|
136
|
+
- !ruby/object:Gem::Version
|
|
137
|
+
version: 3.1.2
|
|
138
|
+
type: :development
|
|
139
|
+
prerelease: false
|
|
140
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
141
|
+
requirements:
|
|
142
|
+
- - "~>"
|
|
143
|
+
- !ruby/object:Gem::Version
|
|
144
|
+
version: '3.1'
|
|
145
|
+
- - ">="
|
|
146
|
+
- !ruby/object:Gem::Version
|
|
147
|
+
version: 3.1.2
|
|
148
|
+
- !ruby/object:Gem::Dependency
|
|
149
|
+
name: kettle-test
|
|
150
|
+
requirement: !ruby/object:Gem::Requirement
|
|
151
|
+
requirements:
|
|
152
|
+
- - "~>"
|
|
153
|
+
- !ruby/object:Gem::Version
|
|
154
|
+
version: '2.0'
|
|
155
|
+
- - ">="
|
|
156
|
+
- !ruby/object:Gem::Version
|
|
157
|
+
version: 2.0.5
|
|
158
|
+
type: :development
|
|
159
|
+
prerelease: false
|
|
160
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
161
|
+
requirements:
|
|
162
|
+
- - "~>"
|
|
163
|
+
- !ruby/object:Gem::Version
|
|
164
|
+
version: '2.0'
|
|
165
|
+
- - ">="
|
|
166
|
+
- !ruby/object:Gem::Version
|
|
167
|
+
version: 2.0.5
|
|
168
|
+
- !ruby/object:Gem::Dependency
|
|
169
|
+
name: turbo_tests2
|
|
170
|
+
requirement: !ruby/object:Gem::Requirement
|
|
171
|
+
requirements:
|
|
172
|
+
- - "~>"
|
|
173
|
+
- !ruby/object:Gem::Version
|
|
174
|
+
version: '3.1'
|
|
175
|
+
- - ">="
|
|
176
|
+
- !ruby/object:Gem::Version
|
|
177
|
+
version: 3.1.4
|
|
178
|
+
type: :development
|
|
179
|
+
prerelease: false
|
|
180
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
181
|
+
requirements:
|
|
182
|
+
- - "~>"
|
|
183
|
+
- !ruby/object:Gem::Version
|
|
184
|
+
version: '3.1'
|
|
185
|
+
- - ">="
|
|
186
|
+
- !ruby/object:Gem::Version
|
|
187
|
+
version: 3.1.4
|
|
188
|
+
- !ruby/object:Gem::Dependency
|
|
189
|
+
name: ruby-progressbar
|
|
190
|
+
requirement: !ruby/object:Gem::Requirement
|
|
191
|
+
requirements:
|
|
192
|
+
- - "~>"
|
|
193
|
+
- !ruby/object:Gem::Version
|
|
194
|
+
version: '1.13'
|
|
195
|
+
type: :development
|
|
196
|
+
prerelease: false
|
|
197
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
198
|
+
requirements:
|
|
199
|
+
- - "~>"
|
|
200
|
+
- !ruby/object:Gem::Version
|
|
201
|
+
version: '1.13'
|
|
202
|
+
- !ruby/object:Gem::Dependency
|
|
203
|
+
name: stone_checksums
|
|
204
|
+
requirement: !ruby/object:Gem::Requirement
|
|
205
|
+
requirements:
|
|
206
|
+
- - "~>"
|
|
207
|
+
- !ruby/object:Gem::Version
|
|
208
|
+
version: '1.0'
|
|
209
|
+
- - ">="
|
|
210
|
+
- !ruby/object:Gem::Version
|
|
211
|
+
version: 1.0.3
|
|
212
|
+
type: :development
|
|
213
|
+
prerelease: false
|
|
214
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
215
|
+
requirements:
|
|
216
|
+
- - "~>"
|
|
217
|
+
- !ruby/object:Gem::Version
|
|
218
|
+
version: '1.0'
|
|
219
|
+
- - ">="
|
|
220
|
+
- !ruby/object:Gem::Version
|
|
221
|
+
version: 1.0.3
|
|
222
|
+
- !ruby/object:Gem::Dependency
|
|
223
|
+
name: gitmoji-regex
|
|
224
|
+
requirement: !ruby/object:Gem::Requirement
|
|
225
|
+
requirements:
|
|
226
|
+
- - "~>"
|
|
227
|
+
- !ruby/object:Gem::Version
|
|
228
|
+
version: '2.0'
|
|
229
|
+
- - ">="
|
|
230
|
+
- !ruby/object:Gem::Version
|
|
231
|
+
version: 2.0.2
|
|
232
|
+
type: :development
|
|
233
|
+
prerelease: false
|
|
234
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
235
|
+
requirements:
|
|
236
|
+
- - "~>"
|
|
237
|
+
- !ruby/object:Gem::Version
|
|
238
|
+
version: '2.0'
|
|
239
|
+
- - ">="
|
|
240
|
+
- !ruby/object:Gem::Version
|
|
241
|
+
version: 2.0.2
|
|
242
|
+
description: "\U0001F48E AnonymousLoader resolves Ruby files from paths, gem metadata,
|
|
243
|
+
or $LOAD_PATH and evaluates them inside anonymous modules to avoid top-level namespace
|
|
244
|
+
collisions."
|
|
245
|
+
email:
|
|
246
|
+
- floss@galtzo.com
|
|
247
|
+
executables: []
|
|
248
|
+
extensions: []
|
|
249
|
+
extra_rdoc_files:
|
|
250
|
+
- CHANGELOG.md
|
|
251
|
+
- CITATION.cff
|
|
252
|
+
- CODE_OF_CONDUCT.md
|
|
253
|
+
- CONTRIBUTING.md
|
|
254
|
+
- FUNDING.md
|
|
255
|
+
- LICENSE.md
|
|
256
|
+
- README.md
|
|
257
|
+
- RUBOCOP.md
|
|
258
|
+
- SECURITY.md
|
|
259
|
+
files:
|
|
260
|
+
- CHANGELOG.md
|
|
261
|
+
- CITATION.cff
|
|
262
|
+
- CODE_OF_CONDUCT.md
|
|
263
|
+
- CONTRIBUTING.md
|
|
264
|
+
- FUNDING.md
|
|
265
|
+
- LICENSE.md
|
|
266
|
+
- README.md
|
|
267
|
+
- RUBOCOP.md
|
|
268
|
+
- SECURITY.md
|
|
269
|
+
- certs/pboling.pem
|
|
270
|
+
- lib/anonymous_loader.rb
|
|
271
|
+
- lib/anonymous_loader/version.rb
|
|
272
|
+
- sig/anonymous_loader.rbs
|
|
273
|
+
- sig/anonymous_loader/version.rbs
|
|
274
|
+
homepage: https://github.com/ruby-oauth/anonymous_loader
|
|
275
|
+
licenses:
|
|
276
|
+
- MIT
|
|
277
|
+
metadata:
|
|
278
|
+
homepage_uri: https://anonymous-loader.galtzo.com
|
|
279
|
+
source_code_uri: https://github.com/ruby-oauth/anonymous_loader/tree/v0.1.0
|
|
280
|
+
changelog_uri: https://github.com/ruby-oauth/anonymous_loader/blob/v0.1.0/CHANGELOG.md
|
|
281
|
+
bug_tracker_uri: https://github.com/ruby-oauth/anonymous_loader/issues
|
|
282
|
+
documentation_uri: https://www.rubydoc.info/gems/anonymous_loader/0.1.0
|
|
283
|
+
funding_uri: https://github.com/sponsors/pboling
|
|
284
|
+
wiki_uri: https://github.com/ruby-oauth/anonymous_loader/wiki
|
|
285
|
+
news_uri: https://www.railsbling.com/tags/anonymous_loader
|
|
286
|
+
discord_uri: https://discord.gg/3qme4XHNKN
|
|
287
|
+
rubygems_mfa_required: 'true'
|
|
288
|
+
rdoc_options:
|
|
289
|
+
- "--title"
|
|
290
|
+
- "anonymous_loader - \U0001F48E Load Ruby source files inside anonymous namespaces."
|
|
291
|
+
- "--main"
|
|
292
|
+
- README.md
|
|
293
|
+
- "--exclude"
|
|
294
|
+
- "^sig/"
|
|
295
|
+
- "--line-numbers"
|
|
296
|
+
- "--inline-source"
|
|
297
|
+
- "--quiet"
|
|
298
|
+
require_paths:
|
|
299
|
+
- lib
|
|
300
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
301
|
+
requirements:
|
|
302
|
+
- - ">="
|
|
303
|
+
- !ruby/object:Gem::Version
|
|
304
|
+
version: 2.2.0
|
|
305
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
306
|
+
requirements:
|
|
307
|
+
- - ">="
|
|
308
|
+
- !ruby/object:Gem::Version
|
|
309
|
+
version: '0'
|
|
310
|
+
requirements: []
|
|
311
|
+
rubygems_version: 4.0.10
|
|
312
|
+
specification_version: 4
|
|
313
|
+
summary: "\U0001F48E Load Ruby source files inside anonymous namespaces."
|
|
314
|
+
test_files: []
|
metadata.gz.sig
ADDED
|
Binary file
|