tangled
alpha
login
or
join now
mackuba.eu
/
sdk.blue
6
fork
atom
A curated list of libraries & SDKs for the Bluesky API and AT Protocol
6
fork
atom
overview
issues
2
pulls
pipelines
look up NPM releases for Tangled repos
mackuba.eu
3 months ago
37aabd93
c9d54f4e
+93
-19
5 changed files
expand all
collapse all
unified
split
lib
github_import.rb
metadata_import.rb
npm_import.rb
project.rb
tangled_import.rb
+4
-4
lib/github_import.rb
···
17
17
url =~ %r{^https://github\.com/[\w\-\.]+/[\w\-\.]+}
18
18
end
19
19
20
20
-
def import_url(url)
20
20
+
def import_url(url, project)
21
21
url =~ %r{^https://github\.com/([\w\-\.]+)/([\w\-\.]+)}
22
22
user, repo = $1, $2
23
23
···
33
33
end
34
34
35
35
if ['JavaScript', 'TypeScript'].include?(repo_info['language'])
36
36
-
npm = get_npm_releases(user, repo)
36
36
+
npm = get_npm_releases(user, repo, project)
37
37
last_update = npm.map { |n| n.last_release_time }.sort.last
38
38
39
39
if last_update && (release.nil? || last_update > release['published_at'])
···
142
142
end
143
143
end
144
144
145
145
-
def get_npm_releases(user, repo)
145
145
+
def get_npm_releases(user, repo, project)
146
146
sleep 5
147
147
148
148
search_url = URI("https://api.github.com/search/code")
···
164
164
next if package.version.nil? || package.private?
165
165
166
166
if npm = NPMImport.new.get_package_info(package.name)
167
167
-
if npm.repository_url =~ %r{://github\.com/#{Regexp.escape(user)}/#{Regexp.escape(repo)}(\.git)?$}
167
167
+
if project.urls.include?(npm.normalized_repository_url)
168
168
releases << npm
169
169
end
170
170
end
+10
-12
lib/metadata_import.rb
···
1
1
require_relative 'github_import'
2
2
+
require_relative 'project'
2
3
require_relative 'tangled_import'
3
4
4
5
class MetadataImport
···
14
15
data = {}
15
16
end
16
17
17
17
-
urls = get_repo_urls(language)
18
18
+
projects = Project.load_all(language)
18
19
importers = [GithubImport.new, TangledImport.new]
19
20
20
20
-
urls.each do |url|
21
21
-
if imp = importers.detect { |i| i.url_matches?(url) }
22
22
-
p url
23
23
-
data[url] = imp.import_url(url)
24
24
-
else
25
25
-
puts "Skipping #{url}"
21
21
+
projects.each do |project|
22
22
+
project.urls.each do |url|
23
23
+
if imp = importers.detect { |i| i.url_matches?(url) }
24
24
+
p url
25
25
+
data[url] = imp.import_url(url, project)
26
26
+
else
27
27
+
puts "Skipping #{url}"
28
28
+
end
26
29
end
27
30
end
28
31
29
32
File.write(output_path, YAML.dump(data))
30
30
-
end
31
31
-
32
32
-
def get_repo_urls(language = nil)
33
33
-
yamls = Dir[File.join(__dir__, '..', '_data', 'projects', language ? "#{language}.yml" : '*.yml')]
34
34
-
yamls.map { |x| YAML.load(File.read(x))['repos'] }.flatten.map { |x| x['url'] || x['urls'] }.flatten
35
33
end
36
34
end
+21
-2
lib/npm_import.rb
···
27
27
@json = json
28
28
end
29
29
30
30
+
def name
31
31
+
@json['name']
32
32
+
end
33
33
+
30
34
def last_version
31
35
@json['dist-tags']['latest']
32
36
end
···
36
40
end
37
41
38
42
def repository_url
39
39
-
@json['repository'] && @json['repository']['url']
43
43
+
@json.dig('repository', 'url')
44
44
+
end
45
45
+
46
46
+
def normalized_repository_url
47
47
+
url = repository_url
48
48
+
url && url.gsub(%r{^.*://}, 'https://').gsub(/\.git$/, '').gsub(%r{tangled\.org/@}, 'tangled.org/')
49
49
+
end
50
50
+
51
51
+
def inspect
52
52
+
fields = [:name, :last_version, :last_release_time].map { |v| "#{v}=#{self.send(v).inspect}" }.join(", ")
53
53
+
"#<#{self.class}:0x#{object_id} #{fields}>"
40
54
end
41
55
end
42
56
57
57
+
def initialize
58
58
+
@@cache ||= {}
59
59
+
end
60
60
+
43
61
def get_package_info(name)
44
44
-
response = get_response("https://registry.npmjs.com/#{name}")
62
62
+
response = @@cache[name] || get_response("https://registry.npmjs.com/#{name}")
63
63
+
@@cache[name] = response
45
64
46
65
if response.code.to_i == 200
47
66
RemotePackage.new(JSON.parse(response.body))
+26
lib/project.rb
···
1
1
+
require 'yaml'
2
2
+
3
3
+
class Project
4
4
+
def self.load_all(language = nil)
5
5
+
yamls = Dir[File.join(__dir__, '..', '_data', 'projects', language ? "#{language}.yml" : '*.yml')]
6
6
+
yamls.map { |y|
7
7
+
lang = File.basename(y).gsub(/\.yml$/, '')
8
8
+
YAML.load(File.read(y))['repos'].map { |r| Project.new(r, lang) }
9
9
+
}.flatten
10
10
+
end
11
11
+
12
12
+
attr_reader :language
13
13
+
14
14
+
def initialize(yaml, language)
15
15
+
@language = language.to_sym
16
16
+
@yaml = yaml
17
17
+
end
18
18
+
19
19
+
def urls
20
20
+
@yaml['url'] ? [@yaml['url']] : @yaml['urls']
21
21
+
end
22
22
+
23
23
+
def name
24
24
+
@yaml['name'] || urls.first.gsub(/\/$/, '').split('/').last
25
25
+
end
26
26
+
end
+32
-1
lib/tangled_import.rb
···
17
17
url =~ %r{^https://tangled\.org/@[\w\-\.]+/[\w\-\.]+}
18
18
end
19
19
20
20
-
def import_url(url)
20
20
+
def import_url(url, project)
21
21
url =~ %r{^https://tangled\.org/@([\w\-\.]+)/([\w\-\.]+)}
22
22
user, repo = $1, $2
23
23
···
46
46
end
47
47
48
48
data['stars'] = get_stars(repo_record['uri'])
49
49
+
50
50
+
if project.language == :js
51
51
+
npm = get_npm_releases(repo_folder, project)
52
52
+
last_update = npm.map { |n| n.last_release_time }.sort.last
53
53
+
54
54
+
if last_update
55
55
+
data['last_release'] = { 'published_at' => last_update }
56
56
+
end
57
57
+
end
49
58
50
59
data['last_commit'] = get_latest_commit(repo_folder)
51
60
···
112
121
113
122
json = JSON.parse(response.body)
114
123
json['total']
124
124
+
end
125
125
+
126
126
+
def get_npm_releases(repo_folder, project)
127
127
+
Dir.chdir(repo_folder) do
128
128
+
packages = %x(find . -name 'package.json').strip
129
129
+
releases = []
130
130
+
131
131
+
packages.lines.each do |file|
132
132
+
contents = File.read(file.strip)
133
133
+
package = NPMImport::LocalPackage.new(JSON.parse(contents))
134
134
+
135
135
+
next if package.version.nil? || package.private?
136
136
+
137
137
+
if npm = NPMImport.new.get_package_info(package.name)
138
138
+
if project.urls.include?(npm.normalized_repository_url)
139
139
+
releases << npm
140
140
+
end
141
141
+
end
142
142
+
end
143
143
+
144
144
+
releases
145
145
+
end
115
146
end
116
147
end