Advertisement
Guest User

Untitled

a guest
Dec 1st, 2015
62
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.45 KB | None | 0 0
  1. # deps:
  2. # a@0.1 => b@>=0.2
  3. # a@0.2 => b@~>0.3
  4. # c@0.1 => b@~>0.2
  5.  
  6. # installed:
  7. # a@0.1
  8. # a@0.2
  9. # b@0.2
  10. # b@0.3
  11. # c@0.1
  12.  
  13. # user requests:
  14. # \require "a@>=0.1"
  15. # \require "c@~>0.1"
  16.  
  17. tree = {
  18. dependencies: {
  19. "a" => {
  20. clause: "a@>=0.1",
  21. versions: {
  22. "a@0.1" => {
  23. dependencies: {
  24. "b" => {
  25. clause: "b@>=0.2",
  26. versions: {
  27. "b@0.2" => {},
  28. "b@0.3" => {}
  29. }
  30. }
  31. }
  32. },
  33. "a@0.2" => {
  34. dependencies: {
  35. "b" => {
  36. clause: "b@~>0.3",
  37. versions: {
  38. "b@0.3" => {}
  39. }
  40. }
  41. }
  42. }
  43. }
  44. },
  45. "c" => {
  46. clause: "c@~>0.1",
  47. versions: {
  48. "c@0.1" => {
  49. dependencies: {
  50. "b" => {
  51. clause: "b@~>0.2",
  52. versions: {
  53. "b@0.2" => {}
  54. }
  55. }
  56. }
  57. }
  58. }
  59. }
  60. }
  61. }
  62.  
  63. def simplified_deps_tree(version)
  64. return {} unless version[:dependencies]
  65.  
  66. dep_versions = {}
  67.  
  68. # For each dependency, generate a deps tree for each available version
  69. version[:dependencies].each do |p, opts|
  70. opts[:versions].each do |v, opts2|
  71. dep_versions[p] ||= {}
  72. dep_versions[p][v] = simplified_deps_tree(opts2)
  73. end
  74. end
  75.  
  76. dep_versions
  77. end
  78.  
  79. def dependencies_array(tree)
  80. deps_array = []
  81. tree.each do |pack, versions|
  82. a = []
  83. versions.each do |version, deps|
  84. sub_perms = dependencies_array(deps)
  85. if sub_perms == []
  86. a << version
  87. else
  88. a += [version].product(*sub_perms)
  89. end
  90. end
  91. deps_array << a
  92. end
  93.  
  94. deps_array
  95. end
  96.  
  97. def permutate_simplified_tree(tree)
  98. deps = dependencies_array(simplified_deps_tree(tree))
  99. p deps
  100.  
  101. return deps if deps.size < 2
  102.  
  103. rest = deps[1..-1]
  104.  
  105. perms = deps[0].product(*rest).map(&:flatten)
  106. # deps[1..-1].inject(deps[0]){ |m,v| m = m.product(v).map(&:flatten) }
  107. end
  108.  
  109. perm = permutate_simplified_tree(tree)
  110.  
  111. def filter_invalid_permutations(perm)
  112. valid = []
  113. perm.each do |p|
  114. versions = {}; invalid = false
  115. p.each do |ref|
  116. if ref =~ /(.+)@(.+)/
  117. name, version = $1, $2
  118. if versions[name] && versions[name] != version
  119. invalid = true
  120. break
  121. else
  122. versions[name] = version
  123. end
  124. end
  125. end
  126. valid << p.uniq unless invalid
  127. end
  128.  
  129. valid
  130. end
  131.  
  132. p filter_invalid_permutations(perm)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement