Module: LucideRuby::ReleaseResolver
- Extended by:
- ReleaseResolver
- Included in:
- ReleaseResolver
- Defined in:
- lib/lucide_ruby/release_resolver.rb
Constant Summary collapse
- REPOSITORY_API_URL =
"https://api.github.com/repos/lucide-icons/lucide"- ASSET_NAME_PATTERN =
/^lucide-icons-.*\.zip$/
Instance Method Summary collapse
- #fetch_json(url) ⇒ Object
- #make_request(uri) ⇒ Object
- #release_asset(release) ⇒ Object
- #release_info(release, fallback_version: nil) ⇒ Object
- #resolve(version: nil) ⇒ Object
- #resolve_latest ⇒ Object
- #resolve_version(version) ⇒ Object
Instance Method Details
#fetch_json(url) ⇒ Object
59 60 61 62 63 64 |
# File 'lib/lucide_ruby/release_resolver.rb', line 59 def fetch_json(url) response = make_request(URI(url)) JSON.parse(response.body) rescue JSON::ParserError => error raise LucideRuby::SyncError, "Invalid response from GitHub: #{error.message}" end |
#make_request(uri) ⇒ Object
66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 |
# File 'lib/lucide_ruby/release_resolver.rb', line 66 def make_request(uri) http = Net::HTTP.new(uri.host, uri.port) http.use_ssl = (uri.scheme == "https") http.open_timeout = 15 http.read_timeout = 60 request = Net::HTTP::Get.new(uri) request["User-Agent"] = "lucide-ruby/#{LucideRuby::VERSION}" request["Accept"] = "application/vnd.github+json" response = http.request(request) return response if response.is_a?(Net::HTTPSuccess) raise LucideRuby::SyncError, "GitHub request failed: #{response.code} #{response.message}" end |
#release_asset(release) ⇒ Object
39 40 41 42 43 |
# File 'lib/lucide_ruby/release_resolver.rb', line 39 def release_asset(release) release.fetch("assets", []).find do |asset| asset["name"]&.match?(ASSET_NAME_PATTERN) end end |
#release_info(release, fallback_version: nil) ⇒ Object
45 46 47 48 49 50 51 52 53 54 55 56 57 |
# File 'lib/lucide_ruby/release_resolver.rb', line 45 def release_info(release, fallback_version: nil) asset = release_asset(release) version = release["tag_name"] || fallback_version unless asset raise LucideRuby::SyncError, "Could not find lucide-icons zip for release #{version}" end { version: version, download_url: asset["browser_download_url"] } end |
#resolve(version: nil) ⇒ Object
14 15 16 |
# File 'lib/lucide_ruby/release_resolver.rb', line 14 def resolve(version: nil) version ? resolve_version(version) : resolve_latest end |
#resolve_latest ⇒ Object
18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
# File 'lib/lucide_ruby/release_resolver.rb', line 18 def resolve_latest releases = fetch_json("#{REPOSITORY_API_URL}/releases?per_page=30") release = releases.find do |candidate| next false if candidate["draft"] || candidate["prerelease"] release_asset(candidate) end unless release raise LucideRuby::SyncError, "Could not find a Lucide release with downloadable assets" end release_info(release) end |
#resolve_version(version) ⇒ Object
34 35 36 37 |
# File 'lib/lucide_ruby/release_resolver.rb', line 34 def resolve_version(version) release = fetch_json("#{REPOSITORY_API_URL}/releases/tags/#{version}") release_info(release, fallback_version: version) end |