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

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_latestObject



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