summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2013-05-08 20:15:52 -0700
committerYukihiro "Matz" Matsumoto <[email protected]>2013-05-08 20:15:52 -0700
commit14bd8ceff3ee5e82f10b4cd5a9fe6f78d00bd3bd (patch)
treec537a8aca3261e43c11e04b394573e43414a30ab
parentea10d2d3d6f6c6096f7f9f36443a8bcb121e7c6b (diff)
parent34f7dd539d6464af65c9e1dcc8b3d2fd214db8f8 (diff)
downloadmruby-14bd8ceff3ee5e82f10b4cd5a9fe6f78d00bd3bd.tar.gz
mruby-14bd8ceff3ee5e82f10b4cd5a9fe6f78d00bd3bd.zip
Merge pull request #1241 from bovi/add-gem-dependency-check
[mrbgems] GEM Dependency Check
-rw-r--r--tasks/mrbgem_spec.rake94
-rw-r--r--tasks/mrbgems.rake1
2 files changed, 94 insertions, 1 deletions
diff --git a/tasks/mrbgem_spec.rake b/tasks/mrbgem_spec.rake
index d2dbc860c..528542a03 100644
--- a/tasks/mrbgem_spec.rake
+++ b/tasks/mrbgem_spec.rake
@@ -89,7 +89,7 @@ module MRuby
def add_dependency(name, *requirements)
requirements = ['> 0.0.0'] if requirements.empty?
requirements.flatten!
- @dependencies << [:gem => name, :requirements => requirements]
+ @dependencies << {:gem => name, :requirements => requirements}
end
def self.bin=(bin)
@@ -168,8 +168,82 @@ module MRuby
f.puts %Q[#include "mruby/hash.h"]
end
+ def version_ok?(req_versions)
+ req_versions.map do |req|
+ cmp, ver = req.split
+ cmp_result = Version.new(version) <=> Version.new(ver)
+ case cmp
+ when '=' then cmp_result == 0
+ when '!=' then cmp_result != 0
+ when '>' then cmp_result == 1
+ when '<' then cmp_result == -1
+ when '>=' then cmp_result >= 0
+ when '<=' then cmp_result <= 0
+ when '~>'
+ Version.new(version).twiddle_wakka_ok?(Version.new(ver))
+ else
+ fail "Comparison not possible with '#{cmp}'"
+ end
+ end.all?
+ end
end # Specification
+ class Version
+ include Comparable
+ include Enumerable
+
+ def <=>(other)
+ ret = 0
+ own = to_enum
+
+ other.each do |oth|
+ begin
+ ret = own.next <=> oth
+ rescue StopIteration
+ ret = 0 <=> oth
+ end
+
+ break unless ret == 0
+ end
+
+ ret
+ end
+
+ # ~> compare alghorithm
+ #
+ # Example:
+ # ~> 2.2 means >= 2.2.0 and < 3.0.0
+ # ~> 2.2.0 means >= 2.2.0 and < 2.3.0
+ def twiddle_wakka_ok?(other)
+ gr_or_eql = (self <=> other) >= 0
+ still_minor = (self <=> other.skip_minor) < 0
+ gr_or_eql and still_minor
+ end
+
+ def skip_minor
+ a = @ary.dup
+ a.slice!(-1)
+ a[-1] = a[-1].succ
+ a
+ end
+
+ def initialize(str)
+ @str = str
+ @ary = @str.split('.').map(&:to_i)
+ end
+
+ def each(&block); @ary.each(&block); end
+ def [](index); @ary[index]; end
+ def []=(index, value)
+ @ary[index] = value
+ @str = @ary.join('.')
+ end
+ def slice!(index)
+ @ary.slice!(index)
+ @str = @ary.join('.')
+ end
+ end # Version
+
class List
include Enumerable
@@ -192,6 +266,24 @@ module MRuby
def empty?
@ary.empty?
end
+
+ def check
+ each do |g|
+ g.dependencies.each do |dep|
+ name = dep[:gem]
+ req_versions = dep[:requirements]
+
+ # check each GEM dependency against all available GEMs
+ each do |dep_g|
+ if name == dep_g.name
+ unless dep_g.version_ok?(req_versions)
+ fail "#{name} version should be #{req_versions.join(' and ')} but was '#{dep_g.version}'"
+ end
+ end
+ end
+ end
+ end
+ end
end # List
end # Gem
diff --git a/tasks/mrbgems.rake b/tasks/mrbgems.rake
index c18a9a181..43435cf0b 100644
--- a/tasks/mrbgems.rake
+++ b/tasks/mrbgems.rake
@@ -5,6 +5,7 @@ MRuby.each_target do
if enable_gems?
# set up all gems
gems.each(&:setup)
+ gems.check
# loader all gems
self.libmruby << objfile("#{build_dir}/mrbgems/gem_init")