87 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
		
		
			
		
	
	
			87 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
|   | # frozen_string_literal: true | ||
|  | 
 | ||
|  | module Homebrew | ||
|  |   module Livecheck | ||
|  |     # The `Livecheck::Strategy` module contains the various strategies as well | ||
|  |     # as some general-purpose methods for working with them. Within the context | ||
|  |     # of the `brew livecheck` command, strategies are established procedures | ||
|  |     # for finding new software versions at a given source. | ||
|  |     # | ||
|  |     # @api private | ||
|  |     module Strategy | ||
|  |       module_function | ||
|  | 
 | ||
|  |       # Strategy priorities informally range from 1 to 10, where 10 is the | ||
|  |       # highest priority. 5 is the default priority because it's roughly in | ||
|  |       # the middle of this range. Strategies with a priority of 0 (or lower) | ||
|  |       # are ignored. | ||
|  |       DEFAULT_PRIORITY = 5
 | ||
|  |       private_constant :DEFAULT_PRIORITY | ||
|  | 
 | ||
|  |       # Creates and/or returns a `@strategies` `Hash` ,which maps a snake | ||
|  |       # case strategy name symbol (e.g., `:page_match`) to the associated | ||
|  |       # `Strategy`. | ||
|  |       # | ||
|  |       # At present, this should only be called after tap strategies have been | ||
|  |       # loaded, otherwise livecheck won't be able to use them. | ||
|  |       # @return [Hash] | ||
|  |       def strategies | ||
|  |         return @strategies if defined? @strategies | ||
|  | 
 | ||
|  |         @strategies = {} | ||
|  |         constants.sort.each do |strategy_symbol| | ||
|  |           key = strategy_symbol.to_s.underscore.to_sym | ||
|  |           strategy = const_get(strategy_symbol) | ||
|  |           @strategies[key] = strategy | ||
|  |         end | ||
|  |         @strategies | ||
|  |       end | ||
|  |       private_class_method :strategies | ||
|  | 
 | ||
|  |       # Returns the `Strategy` that corresponds to the provided `Symbol` (or | ||
|  |       # `nil` if there is no matching `Strategy`). | ||
|  |       # @param symbol [Symbol] the strategy name in snake case as a `Symbol` | ||
|  |       #   (e.g., `:page_match`) | ||
|  |       # @return [Strategy, nil] | ||
|  |       def from_symbol(symbol) | ||
|  |         strategies[symbol] | ||
|  |       end | ||
|  | 
 | ||
|  |       # Returns an array of strategies that apply to the provided URL. | ||
|  |       # @param url [String] the URL to check for matching strategies | ||
|  |       # @param regex_provided [Boolean] whether a regex is provided in a | ||
|  |       #   `livecheck` block | ||
|  |       # @return [Array] | ||
|  |       def from_url(url, regex_provided = nil) | ||
|  |         usable_strategies = strategies.values.select do |strategy| | ||
|  |           # Ignore strategies with a priority of 0 or lower | ||
|  |           next if strategy.const_defined?(:PRIORITY) && !strategy::PRIORITY.positive? | ||
|  | 
 | ||
|  |           strategy.respond_to?(:match?) && strategy.match?(url) | ||
|  |         end | ||
|  | 
 | ||
|  |         usable_strategies << strategies[:page_match] if strategies.key?(:page_match) && regex_provided | ||
|  | 
 | ||
|  |         # Sort usable strategies in descending order by priority, using the | ||
|  |         # DEFAULT_PRIORITY when a strategy doesn't contain a PRIORITY constant | ||
|  |         usable_strategies.sort_by do |strategy| | ||
|  |           (strategy.const_defined?(:PRIORITY) ? -strategy::PRIORITY : -DEFAULT_PRIORITY) | ||
|  |         end | ||
|  |       end | ||
|  |     end | ||
|  |   end | ||
|  | end | ||
|  | 
 | ||
|  | require_relative "strategy/apache" | ||
|  | require_relative "strategy/bitbucket" | ||
|  | require_relative "strategy/git" | ||
|  | require_relative "strategy/gnome" | ||
|  | require_relative "strategy/gnu" | ||
|  | require_relative "strategy/hackage" | ||
|  | require_relative "strategy/launchpad" | ||
|  | require_relative "strategy/npm" | ||
|  | require_relative "strategy/page_match" | ||
|  | require_relative "strategy/pypi" | ||
|  | require_relative "strategy/sourceforge" | ||
|  | require_relative "strategy/xorg" |