lib/licensee/matchers/gemspec.rb in licensee-9.6.0 vs lib/licensee/matchers/gemspec.rb in licensee-9.7.0
- old
+ new
@@ -1,20 +1,46 @@
module Licensee
module Matchers
class Gemspec < Licensee::Matchers::Package
+ # a value is a string surrounded by any amount of whitespace
+ # optionally ended with (non-captured) ".freeze"
+ VALUE_REGEX = /\s*[\'\"]([a-z\-0-9\.]+)[\'\"](?:\.freeze)?\s*/i
+
+ # an array contains one or more values. all values, or array itself,
+ # can be surrounded by any amount of whitespace. do not capture
+ # non-value groups
+ ARRAY_REGEX = /\s*\[#{VALUE_REGEX}(?:,#{VALUE_REGEX})*\]\s*/i
+
DECLARATION_REGEX = /
- ^\s*[a-z0-9_]+\.([a-z0-9_]+)\s*\=\s*[\'\"]([a-z\-0-9\.]+)[\'\"]\s*$
- /ix
+ ^\s*[a-z0-9_]+\.([a-z0-9_]+)\s*\=#{VALUE_REGEX}$
+ /ix
LICENSE_REGEX = /
- ^\s*[a-z0-9_]+\.license\s*\=\s*[\'\"]([a-z\-0-9\.]+)[\'\"]\s*$
- /ix
+ ^\s*[a-z0-9_]+\.license\s*\=#{VALUE_REGEX}$
+ /ix
+ LICENSE_ARRAY_REGEX = /
+ ^\s*[a-z0-9_]+\.licenses\s*\=#{ARRAY_REGEX}$
+ /ix
+
private
def license_property
match = @file.content.match LICENSE_REGEX
- match[1].downcase if match && match[1]
+ return match[1].downcase if match && match[1]
+
+ # check for a licenses array property
+ licenses = license_array_property
+ return unless licenses
+
+ # use 'other' if array contains multiple licenses
+ return 'other' unless licenses.size == 1
+ licenses[0]
+ end
+
+ def license_array_property
+ match = @file.content.match LICENSE_ARRAY_REGEX
+ match.captures.compact.map(&:downcase) if match
end
def declarations
@declarations ||= @file.content.match DECLARATION_REGEX
end