90 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
			
		
		
	
	
			90 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
| # typed: false
 | |
| # 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"
 | 
