Class: Homebrew::Livecheck::Strategy::Hackage
- Inherits:
-
Object
- Object
- Homebrew::Livecheck::Strategy::Hackage
- Extended by:
- T::Sig
- Defined in:
- livecheck/strategy/hackage.rb
Overview
The Hackage strategy identifies versions of software at hackage.haskell.org by checking directory listing pages.
Hackage URLs take one of the following formats:
https://hackage.haskell.org/package/example-1.2.3/example-1.2.3.tar.gz
https://downloads.haskell.org/~ghc/8.10.1/ghc-8.10.1-src.tar.xz
The default regex checks for the latest version in an h3
heading element
with a format like <h3>example-1.2.3/</h3>
.
Constant Summary collapse
- PACKAGE_NAME_REGEX =
A
Regexp
used in determining if the strategy applies to the URL and also as part of extracting the package name from the URL basename. /(?<package_name>.+?)-\d+/i.freeze
- FILENAME_REGEX =
A
Regexp
used to extract the package name from the URL basename. /^#{PACKAGE_NAME_REGEX.source.strip}/i.freeze
- URL_MATCH_REGEX =
A
Regexp
used in determining if the strategy applies to the URL. %r{ ^https?://(?:downloads|hackage)\.haskell\.org (?:/[^/]+)+ # Path before the filename #{PACKAGE_NAME_REGEX.source.strip} }ix.freeze
Class Method Summary collapse
-
.find_versions(url, regex, cask: nil, &block) ⇒ Hash{Symbol => T.untyped}
Generates a URL and regex (if one isn’t provided) and passes them to PageMatch.find_versions to identify versions in the content.
-
.match?(url) ⇒ Boolean
Whether the strategy can be applied to the provided URL.
Class Method Details
.find_versions(url, regex, cask: nil, &block) ⇒ Hash{Symbol => T.untyped}
Generates a URL and regex (if one isn’t provided) and passes them to PageMatch.find_versions to identify versions in the content.
58 59 60 61 62 63 64 65 66 67 68 |
# File 'livecheck/strategy/hackage.rb', line 58 def self.find_versions(url, regex, cask: nil, &block) match = File.basename(url).match(FILENAME_REGEX) # A page containing a directory listing of the latest source tarball page_url = "https://hackage.haskell.org/package/#{match[:package_name]}/src/" # Example regex: `%r{<h3>example-(.*?)/?</h3>}i` regex ||= %r{<h3>#{Regexp.escape(match[:package_name])}-(.*?)/?</h3>}i PageMatch.find_versions(page_url, regex, cask: cask, &block) end |
.match?(url) ⇒ Boolean
Whether the strategy can be applied to the provided URL.
40 41 42 |
# File 'livecheck/strategy/hackage.rb', line 40 def self.match?(url) URL_MATCH_REGEX.match?(url) end |