Module: Extensions::GemRequirement

Defined in:
lib/baltix/extensions.rb

Constant Summary collapse

INVALID_DEP =

:nodoc:

["<", Gem::Version.new(0)]
AND_RELAS =

:nodoc:

{ #:nodoc:
   [ "=", ">=", 0 ] => ->(l, r) { [["=", l]] },
   [ "=", ">=", 1 ] => ->(l, r) { [["=", l]] },
   [ "=", "<=", -1 ] => ->(l, r) { [["=", l]] },
   [ "=", "<=", 0 ] => ->(l, r) { [["=", l]] },
   [ "=", ">", 1 ] => ->(l, r) { [["=", l]] },
   [ "=", "<", -1 ] => ->(l, r) { [["=", l]] },
   [ "=", "=", 0 ] => ->(l, r) { [["=", l]] },
   [ "=", "~>", 0 ] => ->(l, r) { [["=", l]] },
   [ "=", "~>", ->(l, r) { l > r && l < r.bump } ] => ->(l, r) { [["=", l]] },
   [ "!=", "=", -1 ] => ->(l, r) { [["=", r]] },
   [ "!=", "=", 1 ] => ->(l, r) { [["=", r]] },
   [ "!=", "!=", -1 ] => ->(l, r) { [["!=", l]] },
   [ "!=", "!=", 0 ] => ->(l, r) { [["!=", l]] },
   [ "!=", "!=", 1 ] => ->(l, r) { [["!=", l]] },
   [ "!=", ">", -1 ] => ->(l, r) { [[">", r]] },
   [ "!=", ">", 0 ] => ->(l, r) { [[">", r]] },
   [ "!=", ">", 1 ] => ->(l, r) { [[">", r], ["<", l]] },
   [ "!=", "<", -1 ] => ->(l, r) { [[">", l], ["<", r]] },
   [ "!=", "<", 0 ] => ->(l, r) { [["<", r]] },
   [ "!=", "<", 1 ] => ->(l, r) { [["<", r]] },
   [ "!=", ">=", -1 ] => ->(l, r) { [[">=", r]] },
   [ "!=", ">=", 0 ] => ->(l, r) { [[">", r]] },
   [ "!=", ">=", 1 ] => ->(l, r) { [[">=", r], ["<", l]] },
   [ "!=", "<=", -1 ] => ->(l, r) { [[">", l], ["<=", r]] },
   [ "!=", "<=", 0 ] => ->(l, r) { [["<", r]] },
   [ "!=", "<=", 1 ] => ->(̀r, l) { [["<=", r]] },
   [ "!=", "~>", -1 ] => ->(l, r) { [[">=", r], ["<", r.bump]] },
   [ "!=", "~>", 0 ] => ->(l, r) { [[">", r], ["<", r.bump]] },
   [ "!=", "~>", ->(l, r) { l > r && l < r.bump } ] => ->(l, r) { [[">", l], ["<", r.bump]] },
   [ "!=", "~>", ->(l, r) { l >= r.bump } ] => ->(l, r) { [[">=", l]] },
   [ ">", "=", -1 ] => ->(l, r) { [["=", r]] },
   [ ">", "!=", -1 ] => ->(l, r) { [[">", l], ["<", r]] },
   [ ">", "!=", 0 ] => ->(l, r) { [[">", l]] },
   [ ">", "!=", 1 ] => ->(l, r) { [[">", l]] },
   [ ">", ">", -1 ] => ->(l, r) { [[">", [r, l].max]] },
   [ ">", ">=", -1 ] => ->(l, r) { [[">=", l]] },
   [ ">", ">=", 0 ] => ->(l, r) { [[">", l]] },
   [ ">", ">=", 1 ] => ->(l, r) { [[">", l]] },
   [ ">", "<=", -1 ] => ->(l, r) { [[">", l], ["<=", r]] },
   [ ">", "~>", -1 ] => ->(l, r) { [[">=", l], ["<", r.bump]] },
   [ ">", "~>", 0 ] => ->(l, r) { [[">", l], ["<", r.bump]] },
   [ ">", "~>", ->(l, r) { l > r && l < r.bump } ] => ->(l, r) { [[">", l], ["<", r.bump]] },
   [ ">", "~>", ->(l, r) { l >= r.bump } ] => ->(l, r) { [[">", l]] },
   [ "<", "=", 1 ] => ->(l, r) { [["=", r]] },
   [ "<", "!=", -1 ] => ->(l, r) { [["<", l]] },
   [ "<", "!=", 0 ] => ->(l, r) { [["<", l]] },
   [ "<", "!=", 1 ] => ->(l, r) { [[">=", r], ["<", l]] },
   [ "<", ">", 1 ] => ->(l, r) { [[">", r], ["<", l]] },
   [ "<", "<", nil ] => ->(l, r) { [["<", [r, l].min]] },
   [ "<", ">=", 1 ] => ->(l, r) { [[">=", r], ["<", l]] },
   [ "<", "~>", 1 ] => ->(l, r) { [[">=", r], ["<", [l, r.bump].min]] },
   [ ">=", "=", -1 ] => ->(l, r) { [["=", r]] },
   [ ">=", "=", 0 ] => ->(l, r) { [["=", r]] },
   [ ">=", "!=", -1 ] => ->(l, r) { [[">=", l], ["<", r]] },
   [ ">=", "!=", 0 ] => ->(l, r) { [[">", l]] },
   [ ">=", "!=", 1 ] => ->(l, r) { [[">=", l]] },
   [ ">=", ">", -1 ] => ->(l, r) { [[">", r]] },
   [ ">=", ">", 0 ] => ->(l, r) { [[">", r]] },
   [ ">=", ">", 1 ] => ->(l, r) { [[">=", l]] },
   [ ">=", "<", -1 ] => ->(l, r) { [[">=", l], ["<", r]] },
   [ ">=", ">=", nil ] => ->(l, r) { [[">=", [r, l].max]] },
   [ ">=", "<=", -1 ] => ->(l, r) { [[">=", l], ["<=", r]] },
   [ ">=", "<=", 0 ] => ->(l, r) { [["=", l]] },
   [ ">=", "~>", ->(l, r) { l < r.bump } ] => ->(l, r) { [[">=", [r, l].max], ["<", r.bump]] },
   [ "<=", "=", 0 ] => ->(l, r) { [["=", r]] },
   [ "<=", "=", 1 ] => ->(l, r) { [["=", r]] },
   [ "<=", "!=", -1 ] => ->(l, r) { [["<=", l]] },
   [ "<=", "!=", 0 ] => ->(l, r) { [["<=", l]] },
   [ "<=", "!=", 1 ] => ->(l, r) { [[">", r], ["<=", l]] },
   [ "<=", ">", 1 ] => ->(l, r) { [[">", r], ["<=", l]] },
   [ "<=", "<", -1 ] => ->(l, r) { [["<=", l]] },
   [ "<=", "<", 0 ] => ->(l, r) { [["<", l]] },
   [ "<=", "<", 1 ] => ->(l, r) { [["<", r]] },
   [ "<=", ">=", 0 ] => ->(l, r) { [["=", l]] },
   [ "<=", ">=", 1 ] => ->(l, r) { [[">=", r], ["<=", l]] },
   [ "<=", "~>", ->(l, r) { r.bump > l } ] => ->(l, r) { [[">=", r], ["<", r.bump]] },
   [ "<=", "~>", ->(l, r) { r >= l && r.bump <= l } ] => ->(l, r) { [[">=", r], ["<=", l]] },
   [ "~>", "=", 0 ] => ->(l, r) { [["=", r]] },
   [ "~>", "=", ->(l, r) { l.bump > r } ] => ->(l, r) { [["=", r]] },
   [ "~>", "!=", ->(l, r) { l.bump >= r } ] => ->(l, r) { [[">=", l], ["<", l.bump]] },
   [ "~>", "!=", ->(l, r) { l > r && l.bump < r } ] => ->(l, r) { [[">=", l], ["<", r]] },
   [ "~>", "!=", 0 ] => ->(l, r) { [[">", l], ["<", l.bump]] },
   [ "~>", "!=", 1 ] => ->(l, r) { [[">=", l], ["<", l.bump]] },
   [ "~>", ">", ->(l, r) { l < r && l.bump >= r } ] => ->(l, r) { [[">", r], ["<", l.bump]] },
   [ "~>", ">", 0 ] => ->(l, r) { [[">", l], ["<", l.bump]] },
   [ "~>", ">", 1 ] => ->(l, r) { [[">=", l], ["<", l.bump]]},
   [ "~>", "<", nil ] => ->(l, r) { [[">=", l], ["<", [r, l.bump].max]] },
   [ "~>", ">=", ->(l, r) { l < r && l.bump >= r } ] => ->(l, r) { [[">=", r], ["<", l.bump]] },
   [ "~>", ">=", 0 ] => ->(l, r) { [[">=", l], ["<", l.bump]] },
   [ "~>", ">=", 1 ] => ->(l, r) { [[">=", l], ["<", l.bump]] },
   [ "~>", "<=", ->(l, r) { l < r && l.bump >= r } ] => ->(l, r) { [[">=", l], ["<=", r]] },
   [ "~>", "<=", ->(l, r) { l.bump < r } ] => ->(l, r) { [[">=", l], ["<", l.bump]] },
   [ "~>", "<=", 0 ] => ->(l, r) { [["=", l]] },
   [ "~>", "~>", ->(l, r) { l.bump >= r && l < r.bump || r.bump >= l && r < l.bump } ] => ->(l, r) { [[">=", [r, l].max], ["<", [r.bump, l.bump].min]] }
}.freeze
OR_RELAS =

:nodoc:

{ #:nodoc:
   [ "=", ">=", nil ] => ->(l, r) { [[">=", [r, l].min]] },
   [ "=", "<=", -1 ] => ->(l, r) { [["<=", r]] },
   [ "=", "<=", 0 ] => ->(l, r) { [["<=", r]] },
   [ "=", ">", 0 ] => ->(l, r) { [[">=", r]] },
   [ "=", ">", 1 ] => ->(l, r) { [[">", r]] },
   [ "=", "<", -1 ] => ->(l, r) { [["<", r]] },
   [ "=", "<", 0 ] => ->(l, r) { [["<=", r]] },
   [ "=", "=", 0 ] => ->(l, r) { [["=", l]] },
   [ "=", "~>", nil ] => ->(l, r) { [[">=", [r, l].min], ["<", r.bump]] },
   [ "!=", "=", -1 ] => ->(l, r) { [["=", r], ["!=", l]] },
   [ "!=", "=", 0 ] => ->(l, r) { [] },
   [ "!=", "=", 1 ] => ->(l, r) { [["=", r], ["!=", l]] },
   [ "!=", "!=", 0 ] => ->(l, r) { [["!=", l]] },
   [ "!=", ">", -1 ] => ->(l, r) { [[">", r]] },
   [ "!=", ">", 0 ] => ->(l, r) { [[">", r]] },
   [ "!=", ">", 1 ] => ->(l, r) { [[">", r], ["!=", l]] },
   [ "!=", "<", -1 ] => ->(l, r) { [["<", r], ["!=", l]] },
   [ "!=", "<", 0 ] => ->(l, r) { [["<", r]] },
   [ "!=", "<", 1 ] => ->(l, r) { [["<", r]] },
   [ "!=", ">=", -1 ] => ->(l, r) { [[">=", r]] },
   [ "!=", ">=", 0 ] => ->(l, r) { [[">", r]] },
   [ "!=", ">=", 1 ] => ->(l, r) { [[">=", r], ["!=", l]] },
   [ "!=", "<=", -1 ] => ->(l, r) { [["<=", r], ["!=", l]] },
   [ "!=", "<=", 0 ] => ->(l, r) { [["<", r]] },
   [ "!=", "<=", 1 ] => ->(̀r, l) { [["<=", r]] },
   [ "!=", "~>", -1 ] => ->(l, r) { [[">=", r], ["<", r.bump], ["!=", l]] },
   [ "!=", "~>", 0 ] => ->(l, r) { [[">", r], ["<", r.bump]] },
   [ "!=", "~>", 1 ] => ->(l, r) { [[">=", r], ["<", r.bump], ["!=", l]] },
   [ ">", "=", 0 ] => ->(l, r) { [[">=", l]] },
   [ ">", "=", 1 ] => ->(l, r) { [[">", l]] },
   [ ">", "!=", 0 ] => ->(l, r) { [[">", l]] },
   [ ">", "!=", 1 ] => ->(l, r) { [[">", l]] },
   [ ">", ">", nil ] => ->(l, r) { [[">", [r, l].min]] },
   [ ">", "<", 0 ] => ->(l, r) { [] },
   [ ">", "<", 1 ] => ->(l, r) { [] },
   [ ">", ">=", -1 ] => ->(l, r) { [[">", l]] },
   [ ">", ">=", 0 ] => ->(l, r) { [[">=", r]] },
   [ ">", ">=", 1 ] => ->(l, r) { [[">=", r]] },
   [ ">", "<=", 0 ] => ->(l, r) { [] },
   [ ">", "<=", 1 ] => ->(l, r) { [] },
   [ ">", "~>", -1 ] => ->(l, r) { [[">", l], ["<", r.bump]] },
   [ ">", "~>", 0 ] => ->(l, r) { [[">=", r], ["<", r.bump]] },
   [ ">", "~>", 1 ] => ->(l, r) { [[">=", r], ["<", r.bump]] },
   [ "<", "=", 0 ] => ->(l, r) { [["<=", l]] },
   [ "<", "=", 1 ] => ->(l, r) { [["<", l]] },
   [ "<", "!=", -1 ] => ->(l, r) { [["<", l]] },
   [ "<", "!=", 0 ] => ->(l, r) { [["<", l]] },
   [ "<", ">", -1 ] => ->(l, r) { [] },
   [ "<", ">", 0 ] => ->(l, r) { [] },
   [ "<", ">", 1 ] => ->(l, r) { [[">", r], ["<", l]] },
   [ "<", "<", nil ] => ->(l, r) { [["<", [r, l].max]] },
   [ "<", ">=", -1 ] => ->(l, r) { [] },
   [ "<", ">=", 0 ] => ->(l, r) { [] },
   [ "<", ">=", 1 ] => ->(l, r) { [[">=", r], ["<", l]] },
   [ "<", "~>", nil ] => ->(l, r) { [[">=", r], ["<", [l, r.bump].max]] },
   [ ">=", "=", 0 ] => ->(l, r) { [[">=", l]] },
   [ ">=", "=", -1 ] => ->(l, r) { [[">=", l], ["=", r]] },
   [ ">=", "!=", 0 ] => ->(l, r) { [[">", l]] },
   [ ">=", "!=", 1 ] => ->(l, r) { [[">=", l]] },
   [ ">=", ">", -1 ] => ->(l, r) { [[">=", l]] },
   [ ">=", ">", 0 ] => ->(l, r) { [[">=", l]] },
   [ ">=", ">", 1 ] => ->(l, r) { [[">", r]] },
   [ ">=", "<", 0 ] => ->(l, r) { [] },
   [ ">=", "<", 1 ] => ->(l, r) { [] },
   [ ">=", ">=", nil ] => ->(l, r) { [[">=", [r, l].min]] },
   [ ">=", "<=", 0 ] => ->(l, r) { [["=", l]] },
   [ ">=", "<=", 1 ] => ->(l, r) { [] },
   [ ">=", "~>", nil ] => ->(l, r) { [[">=", [r, l].min], ["<", r.bump]] },
   [ "<=", "=", 0 ] => ->(l, r) { [["<=", l]] },
   [ "<=", "=", 1 ] => ->(l, r) { [["<=", l]] },
   [ "<=", "!=", -1 ] => ->(l, r) { [["<", l]] },
   [ "<=", "!=", 0 ] => ->(l, r) { [["<", l]] },
   [ "<=", ">", -1 ] => ->(l, r) { [] },
   [ "<=", ">", 0 ] => ->(l, r) { [] },
   [ "<=", ">", 1 ] => ->(l, r) { [[">", r], ["<=", l]] },
   [ "<=", "<", -1 ] => ->(l, r) { [["<=", l]] },
   [ "<=", "<", 0 ] => ->(l, r) { [["<=", l]] },
   [ "<=", "<", 1 ] => ->(l, r) { [["<", r]] },
   [ "<=", ">=", -1 ] => ->(l, r) { [] },
   [ "<=", ">=", 0 ] => ->(l, r) { [["=", l]] },
   [ "<=", ">=", 1 ] => ->(l, r) { [[">=", r], ["<=", l]] },
   [ "<=", "~>", ->(l, r) { r.bump > l } ] => ->(l, r) { [[">=", r], ["<", r.bump]] },
   [ "<=", "~>", ->(l, r) { r.bump <= l } ] => ->(l, r) { [[">=", r], ["<=", l]] },
   [ "~>", "=", nil ] => ->(l, r) { [[">=", [l, r].min], ["<", l.bump]] },
   [ "~>", "!=", -1 ] => ->(l, r) { [[">=", l], ["<", l.bump], ["!=", r]] },
   [ "~>", "!=", 0 ] => ->(l, r) { [[">", l], ["<", l.bump]] },
   [ "~>", "!=", 1 ] => ->(l, r) { [[">=", l], ["<", l.bump], ["!=", r]] },
   [ "~>", ">", -1 ] => ->(l, r) { [[">=", l], ["<", l.bump]] },
   [ "~>", ">", 0 ] => ->(l, r) { [[">=", l], ["<", l.bump]] },
   [ "~>", ">", 1 ] => ->(l, r) { [[">", r], ["<", l.bump]]},
   [ "~>", "<", nil ] => ->(l, r) { [[">=", l], ["<", [r, l.bump].max]] },
   [ "~>", ">=", nil ] => ->(l, r) { [[">=", [l, r].min], ["<", l.bump]] },
   [ "~>", "<=", ->(l, r) { l.bump > r } ] => ->(l, r) { [[">=", l], ["<", l.bump]] },
   [ "~>", "<=", ->(l, r) { l.bump <= r } ] => ->(l, r) { [[">=", l], ["<=", r]] },
   [ "~>", "~>", nil ] => ->(l, r) { [[">=", [r, l].min], ["<", [r.bump, l.bump].max]] }
}.freeze

Instance Method Summary collapse

Instance Method Details

#expandObject



435
436
437
# File 'lib/baltix/extensions.rb', line 435

def expand
   self.expand_requirements(self.requirements)
end

#expand_requirements(requirements) ⇒ Object



439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
# File 'lib/baltix/extensions.rb', line 439

def expand_requirements requirements
   reqs_in = []
   res = requirements.dup

   #binding.pry
   while reqs_in != res do
      reqs_in = res
      reqs = reqs_in.dup
      res = []

      #binding.pry
      while !reqs.empty? do
         op1, ver1 = reqs.shift
         op2, ver2 = reqs.shift || [op1, ver1]

         prc =
            Gem::Requirement::OR_RELAS.find do |((left, right, comp), _)|
               match = op1 == left && op2 == right &&
                  case comp
                  when NilClass
                     true
                  when Integer
                     comp == (ver1 <=> ver2)
                  when Proc
                     comp[ver1, ver2]
                  end
            end

         #binding.pry
         res =
            if prc
               res.concat(prc.last[ver1, ver2])
            elsif reqs.empty?
               res.concat([[op1, ver1], [op2, ver2]])
            else
               #binding.pry
               reqs.unshift([op2, ver2])
               res.concat([[op1, ver1]])
            end
      end
   end

   #binding.pry
   Gem::Requirement.new(res.map {|x|x.join(" ")})
end

#merge(other_requirement) ⇒ Object

merging gem requirement with others strictizing the conditions



486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
# File 'lib/baltix/extensions.rb', line 486

def merge other_requirement
   reqs_pre = self.requirements | other_requirement.requirements
   reqs_tmp = []

   while reqs_tmp != reqs_pre
      reqs_tmp = reqs_pre
      reqs_pre =
         reqs_tmp[1..-1].reduce([reqs_tmp.first]) do |res, req|
            op1, ver1 = res.last
            op2, ver2 = req

            prc =
               Gem::Requirement::AND_RELAS.find do |((left, right, comp), _)|
                  match = op1 == left && op2 == right &&
                     case comp
                     when NilClass
                        true
                     when Integer
                        comp == (ver1 <=> ver2)
                     when Proc
                        comp[ver1, ver2]
                     end
               end

            res[0...-1] | prc ? prc.last[ver1, ver2] : [INVALID_DEP]
      end
   end

   # binding.pry
   Gem::Requirement.new(reqs_pre.map {|x|x.join(" ")})
end

#|(other_requirement) ⇒ Object



431
432
433
# File 'lib/baltix/extensions.rb', line 431

def | other_requirement
   self.expand_requirements(self.requirements | other_requirement.requirements)
end