1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
|
require File.expand_path("../endpoint", __FILE__)
Artifice.deactivate
module ApiDependencies
def self.dependencies_for(gem_names, repo_path)
return [] if gem_names.nil? || gem_names.empty?
read_dependencies(gem_names, repo_path, "specs.4.8") # + read_dependencies(gem_names, repo_path, "prerelease_specs.4.8")
end
def self.read_dependencies(gem_names, repo_path, index_file)
marshal_file = File.join(repo_path, index_file)
return [] unless File.exists?(marshal_file)
require 'rubygems'
require 'bundler'
Bundler::Deprecate.skip_during do
Marshal.load(File.open(marshal_file).read).map do |name, version, platform|
spec = load_spec(name, version, platform, repo_path)
if gem_names.include?(spec.name)
rv = {
:name => spec.name,
:number => spec.version.version,
:platform => spec.platform.to_s,
:dependencies => spec.dependencies.select {|dep| dep.type == :runtime }.map do |dep|
[dep.name, dep.requirement.requirements.map {|a| a.join(" ") }.join(", ")]
end
}
rv
end
end.compact
end
end
def self.load_spec(name, version, platform, repo_path)
full_name = "#{name}-#{version}"
full_name += "-#{platform}" if platform != "ruby"
Marshal.load(Gem.inflate(File.open(File.join(repo_path, "/quick/Marshal.4.8/#{full_name}.gemspec.rz")).read))
end
end
class LocalEndpointWithApi < Endpoint
# Local
get "/local/quick/Marshal.4.8/:id" do
redirect "/local/fetch/actual/gem/#{params[:id]}"
end
get "/local/fetch/actual/gem/:id" do
File.read("#{local_gem_repo}/quick/Marshal.4.8/#{params[:id]}")
end
get "/local/gems/:id" do
File.read("#{local_gem_repo}/gems/#{params[:id]}")
end
get "/local/api/v1/dependencies" do
gem_list = (params[:gems] || '').split(',')
deps = Marshal.dump(ApiDependencies.dependencies_for(gem_list, local_gem_repo))
deps
end
get "/local/specs.4.8.gz" do
File.read("#{local_gem_repo}/specs.4.8.gz")
end
get "/local/prerelease_specs.4.8.gz" do
File.read("#{local_gem_repo}/prerelease_specs.4.8.gz")
end
# Upstream
get "/upstream/quick/Marshal.4.8/:id" do
redirect "/upstream/fetch/actual/gem/#{params[:id]}"
end
get "/upstream/fetch/actual/gem/:id" do
File.read("#{upstream_gem_repo}/quick/Marshal.4.8/#{params[:id]}")
end
get "/upstream/gems/:id" do
File.read("#{upstream_gem_repo}/gems/#{params[:id]}")
end
get "/upstream/api/v1/dependencies" do
gem_list = (params[:gems] || '').split(',')
Marshal.dump(ApiDependencies.dependencies_for(gem_list, upstream_gem_repo))
end
get "/upstream/specs.4.8.gz" do
File.read("#{upstream_gem_repo}/specs.4.8.gz")
end
get "/upstream/prerelease_specs.4.8.gz" do
File.read("#{upstream_gem_repo}/prerelease_specs.4.8.gz")
end
end
Artifice.activate_with(LocalEndpointWithApi)
|