A curated list of libraries & SDKs for the Bluesky API and AT Protocol

look up NPM releases for Tangled repos

+93 -19
+4 -4
lib/github_import.rb
··· 17 17 url =~ %r{^https://github\.com/[\w\-\.]+/[\w\-\.]+} 18 18 end 19 19 20 - def import_url(url) 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 - npm = get_npm_releases(user, repo) 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 - def get_npm_releases(user, repo) 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 - if npm.repository_url =~ %r{://github\.com/#{Regexp.escape(user)}/#{Regexp.escape(repo)}(\.git)?$} 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 + require_relative 'project' 2 3 require_relative 'tangled_import' 3 4 4 5 class MetadataImport ··· 14 15 data = {} 15 16 end 16 17 17 - urls = get_repo_urls(language) 18 + projects = Project.load_all(language) 18 19 importers = [GithubImport.new, TangledImport.new] 19 20 20 - urls.each do |url| 21 - if imp = importers.detect { |i| i.url_matches?(url) } 22 - p url 23 - data[url] = imp.import_url(url) 24 - else 25 - puts "Skipping #{url}" 21 + projects.each do |project| 22 + project.urls.each do |url| 23 + if imp = importers.detect { |i| i.url_matches?(url) } 24 + p url 25 + data[url] = imp.import_url(url, project) 26 + else 27 + puts "Skipping #{url}" 28 + end 26 29 end 27 30 end 28 31 29 32 File.write(output_path, YAML.dump(data)) 30 - end 31 - 32 - def get_repo_urls(language = nil) 33 - yamls = Dir[File.join(__dir__, '..', '_data', 'projects', language ? "#{language}.yml" : '*.yml')] 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 + def name 31 + @json['name'] 32 + end 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 - @json['repository'] && @json['repository']['url'] 43 + @json.dig('repository', 'url') 44 + end 45 + 46 + def normalized_repository_url 47 + url = repository_url 48 + url && url.gsub(%r{^.*://}, 'https://').gsub(/\.git$/, '').gsub(%r{tangled\.org/@}, 'tangled.org/') 49 + end 50 + 51 + def inspect 52 + fields = [:name, :last_version, :last_release_time].map { |v| "#{v}=#{self.send(v).inspect}" }.join(", ") 53 + "#<#{self.class}:0x#{object_id} #{fields}>" 40 54 end 41 55 end 42 56 57 + def initialize 58 + @@cache ||= {} 59 + end 60 + 43 61 def get_package_info(name) 44 - response = get_response("https://registry.npmjs.com/#{name}") 62 + response = @@cache[name] || get_response("https://registry.npmjs.com/#{name}") 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 + require 'yaml' 2 + 3 + class Project 4 + def self.load_all(language = nil) 5 + yamls = Dir[File.join(__dir__, '..', '_data', 'projects', language ? "#{language}.yml" : '*.yml')] 6 + yamls.map { |y| 7 + lang = File.basename(y).gsub(/\.yml$/, '') 8 + YAML.load(File.read(y))['repos'].map { |r| Project.new(r, lang) } 9 + }.flatten 10 + end 11 + 12 + attr_reader :language 13 + 14 + def initialize(yaml, language) 15 + @language = language.to_sym 16 + @yaml = yaml 17 + end 18 + 19 + def urls 20 + @yaml['url'] ? [@yaml['url']] : @yaml['urls'] 21 + end 22 + 23 + def name 24 + @yaml['name'] || urls.first.gsub(/\/$/, '').split('/').last 25 + end 26 + end
+32 -1
lib/tangled_import.rb
··· 17 17 url =~ %r{^https://tangled\.org/@[\w\-\.]+/[\w\-\.]+} 18 18 end 19 19 20 - def import_url(url) 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 + 50 + if project.language == :js 51 + npm = get_npm_releases(repo_folder, project) 52 + last_update = npm.map { |n| n.last_release_time }.sort.last 53 + 54 + if last_update 55 + data['last_release'] = { 'published_at' => last_update } 56 + end 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 + end 125 + 126 + def get_npm_releases(repo_folder, project) 127 + Dir.chdir(repo_folder) do 128 + packages = %x(find . -name 'package.json').strip 129 + releases = [] 130 + 131 + packages.lines.each do |file| 132 + contents = File.read(file.strip) 133 + package = NPMImport::LocalPackage.new(JSON.parse(contents)) 134 + 135 + next if package.version.nil? || package.private? 136 + 137 + if npm = NPMImport.new.get_package_info(package.name) 138 + if project.urls.include?(npm.normalized_repository_url) 139 + releases << npm 140 + end 141 + end 142 + end 143 + 144 + releases 145 + end 115 146 end 116 147 end