Guest User

Untitled

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