forked from librariesio/libraries.io
-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathcpan.rb
68 lines (61 loc) · 2.39 KB
/
cpan.rb
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
module PackageManager
class CPAN < Base
HAS_VERSIONS = true
HAS_DEPENDENCIES = true
BIBLIOTHECARY_SUPPORT = true
URL = 'https://metacpan.org'
COLOR = '#0298c3'
def self.package_link(project, version = nil)
"https://metacpan.org/release/#{project.name}"
end
def self.project_names
page = 1
projects = []
while true
r = get("https://fastapi.metacpan.org/v1/release/_search?q=status:latest&fields=distribution&sort=date:desc&size=5000&from=#{page*5000}")['hits']['hits']
break if r == []
projects += r
page +=1
end
projects.map{|project| project['fields']['distribution'] }.uniq
end
def self.recent_names
names = get('https://fastapi.metacpan.org/v1/release/_search?q=status:latest&fields=distribution&sort=date:desc&size=100')['hits']['hits']
names.map{|project| project['fields']['distribution'] }.uniq
end
def self.project(name)
get("https://fastapi.metacpan.org/v1/release/#{name}")
end
def self.mapping(project)
{
:name => project['distribution'],
:homepage => project.fetch('resources',{})['homepage'],
:description => project['abstract'],
:licenses => project['license'].join(','),
:repository_url => repo_fallback(project.fetch('resources',{}).fetch('repository',{})['web'], project.fetch('resources',{})['homepage']),
:versions => get("https://fastapi.metacpan.org/v1/release/_search?q=distribution:#{project['distribution']}&size=5000&fields=version,dependency")['hits']['hits']
}
end
def self.versions(project)
versions = get("https://fastapi.metacpan.org/v1/release/_search?q=distribution:#{project['distribution']}&size=5000&fields=version,date")['hits']['hits']
versions.map do |version|
{
:number => version['fields']['version'],
:published_at => version['fields']['date']
}
end
end
def self.dependencies(name, version, project)
versions = project[:versions]
version_data = versions.find{|v| v['fields']['version'] == version }
version_data['fields']['dependency'].select{|dep| dep['relationship'] == 'requires' }.map do |dep|
{
project_name: dep['module'].gsub('::', '-'),
requirements: dep['version'],
kind: dep['phase'],
platform: self.name.demodulize
}
end
end
end
end