librarian-puppet-lmco 0.9.8.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (126) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +5 -0
  3. data/LICENSE +20 -0
  4. data/README.md +187 -0
  5. data/bin/librarian-puppet +9 -0
  6. data/lib/librarian/puppet.rb +22 -0
  7. data/lib/librarian/puppet/cli.rb +85 -0
  8. data/lib/librarian/puppet/dsl.rb +16 -0
  9. data/lib/librarian/puppet/environment.rb +54 -0
  10. data/lib/librarian/puppet/extension.rb +47 -0
  11. data/lib/librarian/puppet/lockfile/parser.rb +53 -0
  12. data/lib/librarian/puppet/source.rb +4 -0
  13. data/lib/librarian/puppet/source/forge.rb +348 -0
  14. data/lib/librarian/puppet/source/git.rb +121 -0
  15. data/lib/librarian/puppet/source/githubtarball.rb +249 -0
  16. data/lib/librarian/puppet/source/local.rb +57 -0
  17. data/lib/librarian/puppet/source/path.rb +12 -0
  18. data/lib/librarian/puppet/templates/Puppetfile +10 -0
  19. data/lib/librarian/puppet/version.rb +5 -0
  20. data/vendor/librarian/CHANGELOG.md +224 -0
  21. data/vendor/librarian/Gemfile +6 -0
  22. data/vendor/librarian/MIT-LICENSE +20 -0
  23. data/vendor/librarian/README.md +401 -0
  24. data/vendor/librarian/Rakefile +34 -0
  25. data/vendor/librarian/bin/librarian-chef +7 -0
  26. data/vendor/librarian/bin/librarian-mock +7 -0
  27. data/vendor/librarian/config/cucumber.yaml +1 -0
  28. data/vendor/librarian/features/chef/cli/init.feature +11 -0
  29. data/vendor/librarian/features/chef/cli/install.feature +64 -0
  30. data/vendor/librarian/features/chef/cli/show.feature +77 -0
  31. data/vendor/librarian/features/chef/cli/version.feature +11 -0
  32. data/vendor/librarian/features/support/env.rb +9 -0
  33. data/vendor/librarian/lib/librarian.rb +11 -0
  34. data/vendor/librarian/lib/librarian/action.rb +5 -0
  35. data/vendor/librarian/lib/librarian/action/base.rb +24 -0
  36. data/vendor/librarian/lib/librarian/action/clean.rb +44 -0
  37. data/vendor/librarian/lib/librarian/action/ensure.rb +24 -0
  38. data/vendor/librarian/lib/librarian/action/install.rb +95 -0
  39. data/vendor/librarian/lib/librarian/action/persist_resolution_mixin.rb +51 -0
  40. data/vendor/librarian/lib/librarian/action/resolve.rb +46 -0
  41. data/vendor/librarian/lib/librarian/action/update.rb +44 -0
  42. data/vendor/librarian/lib/librarian/chef.rb +1 -0
  43. data/vendor/librarian/lib/librarian/chef/cli.rb +47 -0
  44. data/vendor/librarian/lib/librarian/chef/dsl.rb +16 -0
  45. data/vendor/librarian/lib/librarian/chef/environment.rb +27 -0
  46. data/vendor/librarian/lib/librarian/chef/extension.rb +9 -0
  47. data/vendor/librarian/lib/librarian/chef/integration/knife.rb +46 -0
  48. data/vendor/librarian/lib/librarian/chef/manifest_reader.rb +59 -0
  49. data/vendor/librarian/lib/librarian/chef/source.rb +4 -0
  50. data/vendor/librarian/lib/librarian/chef/source/git.rb +25 -0
  51. data/vendor/librarian/lib/librarian/chef/source/github.rb +27 -0
  52. data/vendor/librarian/lib/librarian/chef/source/local.rb +69 -0
  53. data/vendor/librarian/lib/librarian/chef/source/path.rb +12 -0
  54. data/vendor/librarian/lib/librarian/chef/source/site.rb +442 -0
  55. data/vendor/librarian/lib/librarian/chef/templates/Cheffile +15 -0
  56. data/vendor/librarian/lib/librarian/cli.rb +223 -0
  57. data/vendor/librarian/lib/librarian/cli/manifest_presenter.rb +93 -0
  58. data/vendor/librarian/lib/librarian/config.rb +7 -0
  59. data/vendor/librarian/lib/librarian/config/database.rb +205 -0
  60. data/vendor/librarian/lib/librarian/config/file_source.rb +47 -0
  61. data/vendor/librarian/lib/librarian/config/hash_source.rb +33 -0
  62. data/vendor/librarian/lib/librarian/config/source.rb +149 -0
  63. data/vendor/librarian/lib/librarian/dependency.rb +147 -0
  64. data/vendor/librarian/lib/librarian/dsl.rb +108 -0
  65. data/vendor/librarian/lib/librarian/dsl/receiver.rb +46 -0
  66. data/vendor/librarian/lib/librarian/dsl/target.rb +171 -0
  67. data/vendor/librarian/lib/librarian/environment.rb +182 -0
  68. data/vendor/librarian/lib/librarian/error.rb +4 -0
  69. data/vendor/librarian/lib/librarian/helpers.rb +13 -0
  70. data/vendor/librarian/lib/librarian/linter/source_linter.rb +55 -0
  71. data/vendor/librarian/lib/librarian/lockfile.rb +29 -0
  72. data/vendor/librarian/lib/librarian/lockfile/compiler.rb +66 -0
  73. data/vendor/librarian/lib/librarian/lockfile/parser.rb +123 -0
  74. data/vendor/librarian/lib/librarian/logger.rb +46 -0
  75. data/vendor/librarian/lib/librarian/manifest.rb +140 -0
  76. data/vendor/librarian/lib/librarian/manifest_set.rb +151 -0
  77. data/vendor/librarian/lib/librarian/mock.rb +1 -0
  78. data/vendor/librarian/lib/librarian/mock/cli.rb +19 -0
  79. data/vendor/librarian/lib/librarian/mock/dsl.rb +15 -0
  80. data/vendor/librarian/lib/librarian/mock/environment.rb +24 -0
  81. data/vendor/librarian/lib/librarian/mock/extension.rb +9 -0
  82. data/vendor/librarian/lib/librarian/mock/source.rb +1 -0
  83. data/vendor/librarian/lib/librarian/mock/source/mock.rb +80 -0
  84. data/vendor/librarian/lib/librarian/mock/source/mock/registry.rb +83 -0
  85. data/vendor/librarian/lib/librarian/resolution.rb +46 -0
  86. data/vendor/librarian/lib/librarian/resolver.rb +81 -0
  87. data/vendor/librarian/lib/librarian/resolver/implementation.rb +223 -0
  88. data/vendor/librarian/lib/librarian/source.rb +2 -0
  89. data/vendor/librarian/lib/librarian/source/basic_api.rb +45 -0
  90. data/vendor/librarian/lib/librarian/source/git.rb +134 -0
  91. data/vendor/librarian/lib/librarian/source/git/repository.rb +217 -0
  92. data/vendor/librarian/lib/librarian/source/local.rb +54 -0
  93. data/vendor/librarian/lib/librarian/source/path.rb +56 -0
  94. data/vendor/librarian/lib/librarian/spec.rb +13 -0
  95. data/vendor/librarian/lib/librarian/spec_change_set.rb +173 -0
  96. data/vendor/librarian/lib/librarian/specfile.rb +17 -0
  97. data/vendor/librarian/lib/librarian/support/abstract_method.rb +21 -0
  98. data/vendor/librarian/lib/librarian/ui.rb +64 -0
  99. data/vendor/librarian/lib/librarian/version.rb +3 -0
  100. data/vendor/librarian/librarian.gemspec +35 -0
  101. data/vendor/librarian/spec/functional/chef/cli_spec.rb +194 -0
  102. data/vendor/librarian/spec/functional/chef/source/git_spec.rb +432 -0
  103. data/vendor/librarian/spec/functional/chef/source/site_spec.rb +266 -0
  104. data/vendor/librarian/spec/functional/source/git/repository_spec.rb +150 -0
  105. data/vendor/librarian/spec/integration/chef/source/git_spec.rb +441 -0
  106. data/vendor/librarian/spec/integration/chef/source/site_spec.rb +217 -0
  107. data/vendor/librarian/spec/support/cli_macro.rb +114 -0
  108. data/vendor/librarian/spec/support/method_patch_macro.rb +30 -0
  109. data/vendor/librarian/spec/support/with_env_macro.rb +20 -0
  110. data/vendor/librarian/spec/unit/action/base_spec.rb +18 -0
  111. data/vendor/librarian/spec/unit/action/clean_spec.rb +102 -0
  112. data/vendor/librarian/spec/unit/action/ensure_spec.rb +37 -0
  113. data/vendor/librarian/spec/unit/action/install_spec.rb +111 -0
  114. data/vendor/librarian/spec/unit/config/database_spec.rb +327 -0
  115. data/vendor/librarian/spec/unit/dependency_spec.rb +212 -0
  116. data/vendor/librarian/spec/unit/dsl_spec.rb +173 -0
  117. data/vendor/librarian/spec/unit/environment_spec.rb +173 -0
  118. data/vendor/librarian/spec/unit/lockfile/parser_spec.rb +162 -0
  119. data/vendor/librarian/spec/unit/lockfile_spec.rb +65 -0
  120. data/vendor/librarian/spec/unit/manifest_set_spec.rb +202 -0
  121. data/vendor/librarian/spec/unit/manifest_spec.rb +36 -0
  122. data/vendor/librarian/spec/unit/mock/source/mock_spec.rb +22 -0
  123. data/vendor/librarian/spec/unit/resolver_spec.rb +233 -0
  124. data/vendor/librarian/spec/unit/source/git_spec.rb +29 -0
  125. data/vendor/librarian/spec/unit/spec_change_set_spec.rb +169 -0
  126. metadata +220 -0
@@ -0,0 +1 @@
1
+ require 'librarian/mock/extension'
@@ -0,0 +1,19 @@
1
+ require 'librarian/cli'
2
+ require 'librarian/mock'
3
+
4
+ module Librarian
5
+ module Mock
6
+ class Cli < Librarian::Cli
7
+
8
+ module Particularity
9
+ def root_module
10
+ Mock
11
+ end
12
+ end
13
+
14
+ include Particularity
15
+ extend Particularity
16
+
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,15 @@
1
+ require 'librarian/dsl'
2
+ require 'librarian/mock/source'
3
+
4
+ module Librarian
5
+ module Mock
6
+ class Dsl < Librarian::Dsl
7
+
8
+ dependency :dep
9
+
10
+ source :src => Source::Mock
11
+
12
+ shortcut :a, :src => 'source-a'
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,24 @@
1
+ require "librarian/environment"
2
+ require "librarian/mock/dsl"
3
+
4
+ module Librarian
5
+ module Mock
6
+ class Environment < Environment
7
+
8
+ def adapter_name
9
+ "mock"
10
+ end
11
+
12
+ def install_path
13
+ nil
14
+ end
15
+
16
+ def registry(options = nil, &block)
17
+ @registry ||= Source::Mock::Registry.new
18
+ @registry.merge!(options, &block)
19
+ @registry
20
+ end
21
+ end
22
+
23
+ end
24
+ end
@@ -0,0 +1,9 @@
1
+ require 'librarian/mock/environment'
2
+
3
+ module Librarian
4
+ module Mock
5
+ extend self
6
+ extend Librarian
7
+
8
+ end
9
+ end
@@ -0,0 +1 @@
1
+ require 'librarian/mock/source/mock'
@@ -0,0 +1,80 @@
1
+ require 'librarian/manifest'
2
+ require 'librarian/source/basic_api'
3
+ require 'librarian/mock/source/mock/registry'
4
+
5
+ module Librarian
6
+ module Mock
7
+ module Source
8
+ class Mock
9
+ include Librarian::Source::BasicApi
10
+
11
+ lock_name 'MOCK'
12
+ spec_options []
13
+
14
+ attr_accessor :environment
15
+ private :environment=
16
+ attr_reader :name
17
+
18
+ def initialize(environment, name, options)
19
+ self.environment = environment
20
+ @name = name
21
+ end
22
+
23
+ def to_s
24
+ name
25
+ end
26
+
27
+ def ==(other)
28
+ other &&
29
+ self.class == other.class &&
30
+ self.name == other.name
31
+ end
32
+
33
+ def to_spec_args
34
+ [name, {}]
35
+ end
36
+
37
+ def to_lock_options
38
+ {:remote => name}
39
+ end
40
+
41
+ def registry
42
+ environment.registry[name]
43
+ end
44
+
45
+ def manifest(name, version, dependencies)
46
+ manifest = Manifest.new(self, name)
47
+ manifest.version = version
48
+ manifest.dependencies = dependencies
49
+ manifest
50
+ end
51
+
52
+ def manifests(name)
53
+ if d = registry[name]
54
+ d.map{|v| manifest(name, v[:version], v[:dependencies])}
55
+ else
56
+ nil
57
+ end
58
+ end
59
+
60
+ def install!(manifest)
61
+ end
62
+
63
+ def to_s
64
+ name
65
+ end
66
+
67
+ def fetch_version(name, extra)
68
+ extra
69
+ end
70
+
71
+ def fetch_dependencies(name, version, extra)
72
+ d = registry[name]
73
+ m = d.find{|v| v[:version] == version.to_s}
74
+ m[:dependencies]
75
+ end
76
+
77
+ end
78
+ end
79
+ end
80
+ end
@@ -0,0 +1,83 @@
1
+ module Librarian
2
+ module Mock
3
+ module Source
4
+ class Mock
5
+ class Registry
6
+
7
+ module Dsl
8
+
9
+ class Top
10
+ def initialize(sources)
11
+ @sources = sources
12
+ end
13
+ def source(name, &block)
14
+ @sources[name] ||= {}
15
+ Source.new(@sources[name]).instance_eval(&block) if block
16
+ end
17
+ end
18
+
19
+ class Source
20
+ def initialize(source)
21
+ @source = source
22
+ end
23
+ def spec(name, version = nil, &block)
24
+ @source[name] ||= []
25
+ unless version
26
+ Spec.new(@source[name]).instance_eval(&block) if block
27
+ else
28
+ Spec.new(@source[name]).version(version, &block)
29
+ end
30
+ @source[name] = @source[name].sort_by{|a| Manifest::Version.new(a[:version])}.reverse
31
+ end
32
+ end
33
+
34
+ class Spec
35
+ def initialize(spec)
36
+ @spec = spec
37
+ end
38
+ def version(name, &block)
39
+ @spec << { :version => name, :dependencies => {} }
40
+ Version.new(@spec.last[:dependencies]).instance_eval(&block) if block
41
+ end
42
+ end
43
+
44
+ class Version
45
+ def initialize(version)
46
+ @version = version
47
+ end
48
+ def dependency(name, *requirement)
49
+ @version[name] = requirement
50
+ end
51
+ end
52
+
53
+ class << self
54
+ def run!(sources, &block)
55
+ Top.new(sources).instance_eval(&block) if block
56
+ end
57
+ end
58
+
59
+ end
60
+
61
+ def initialize
62
+ clear!
63
+ end
64
+ def clear!
65
+ self.sources = { }
66
+ end
67
+ def merge!(options = nil, &block)
68
+ clear! if options && options[:clear]
69
+ Dsl.run!(sources, &block) if block
70
+ end
71
+ def [](name)
72
+ sources[name] ||= {}
73
+ end
74
+
75
+ private
76
+
77
+ attr_accessor :sources
78
+
79
+ end
80
+ end
81
+ end
82
+ end
83
+ end
@@ -0,0 +1,46 @@
1
+ module Librarian
2
+ #
3
+ # Represents the output of the resolution process. Captures the declared
4
+ # dependencies plus the full set of resolved manifests. The sources are
5
+ # already known by the dependencies and by the resolved manifests, so they do
6
+ # not need to be captured explicitly.
7
+ #
8
+ # This representation may be produced by the resolver, may be serialized into
9
+ # a lockfile, and may be deserialized from a lockfile. It is expected that the
10
+ # lockfile is a direct representation in text of this representation, so that
11
+ # the serialization-deserialization process is just the identity function.
12
+ #
13
+ class Resolution
14
+ attr_accessor :dependencies, :manifests, :manifests_index
15
+ private :dependencies=, :manifests=, :manifests_index=
16
+
17
+ def initialize(dependencies, manifests)
18
+ self.dependencies = dependencies
19
+ self.manifests = manifests
20
+ self.manifests_index = build_manifests_index(manifests)
21
+ end
22
+
23
+ def correct?
24
+ manifests && manifests_consistent_with_dependencies? && manifests_internally_consistent?
25
+ end
26
+
27
+ def sources
28
+ manifests.map(&:source).uniq
29
+ end
30
+
31
+ private
32
+
33
+ def build_manifests_index(manifests)
34
+ Hash[manifests.map{|m| [m.name, m]}] if manifests
35
+ end
36
+
37
+ def manifests_consistent_with_dependencies?
38
+ ManifestSet.new(manifests).in_compliance_with?(dependencies)
39
+ end
40
+
41
+ def manifests_internally_consistent?
42
+ ManifestSet.new(manifests).consistent?
43
+ end
44
+
45
+ end
46
+ end
@@ -0,0 +1,81 @@
1
+ require 'librarian/resolver/implementation'
2
+ require 'librarian/manifest_set'
3
+ require 'librarian/resolution'
4
+
5
+ module Librarian
6
+ class Resolver
7
+
8
+ attr_accessor :environment
9
+ private :environment=
10
+
11
+ def initialize(environment)
12
+ self.environment = environment
13
+ end
14
+
15
+ def resolve(spec, partial_manifests = [])
16
+ manifests = implementation(spec).resolve(partial_manifests)
17
+ if manifests
18
+ enforce_consistency!(spec.dependencies, manifests)
19
+ manifests = sort(manifests)
20
+ Resolution.new(spec.dependencies, manifests)
21
+ end
22
+ end
23
+
24
+ private
25
+
26
+ def implementation(spec)
27
+ Implementation.new(self, spec)
28
+ end
29
+
30
+ def enforce_consistency!(dependencies, manifests)
31
+ manifest_set = ManifestSet.new(manifests)
32
+ return if manifest_set.in_compliance_with?(dependencies)
33
+ return if manifest_set.consistent?
34
+
35
+ debug { "Resolver Malfunctioned!" }
36
+ errors = []
37
+ dependencies.sort_by(&:name).each do |d|
38
+ m = manifests[d.name]
39
+ if !m
40
+ errors << ["Depends on #{d}", "Missing!"]
41
+ elsif !d.satisfied_by?(m)
42
+ errors << ["Depends on #{d}", "Found: #{m}"]
43
+ end
44
+ end
45
+ unless errors.empty?
46
+ errors.each do |a, b|
47
+ debug { " #{a}" }
48
+ debug { " #{b}" }
49
+ end
50
+ end
51
+ manifests.values.sort_by(&:name).each do |manifest|
52
+ errors = []
53
+ manifest.dependencies.sort_by(&:name).each do |d|
54
+ m = manifests[d.name]
55
+ if !m
56
+ errors << ["Depends on: #{d}", "Missing!"]
57
+ elsif !d.satisfied_by?(m)
58
+ errors << ["Depends on: #{d}", "Found: #{m}"]
59
+ end
60
+ end
61
+ unless errors.empty?
62
+ debug { " #{manifest}" }
63
+ errors.each do |a, b|
64
+ debug { " #{a}" }
65
+ debug { " #{b}" }
66
+ end
67
+ end
68
+ end
69
+ raise Error, "Resolver Malfunctioned!"
70
+ end
71
+
72
+ def sort(manifests)
73
+ ManifestSet.sort(manifests)
74
+ end
75
+
76
+ def debug(*args, &block)
77
+ environment.logger.debug(*args, &block)
78
+ end
79
+
80
+ end
81
+ end
@@ -0,0 +1,223 @@
1
+ require 'librarian/dependency'
2
+
3
+ module Librarian
4
+ class Resolver
5
+ class Implementation
6
+
7
+ class MultiSource
8
+ attr_accessor :sources
9
+ def initialize(sources)
10
+ self.sources = sources
11
+ end
12
+ def manifests(name)
13
+ sources.reverse.map{|source| source.manifests(name)}.flatten(1).compact
14
+ end
15
+ def to_s
16
+ "(no source specified)"
17
+ end
18
+ end
19
+
20
+ attr_accessor :resolver, :spec
21
+ private :resolver=, :spec=
22
+
23
+ def initialize(resolver, spec)
24
+ self.resolver = resolver
25
+ self.spec = spec
26
+ @level = 0
27
+ end
28
+
29
+ def resolve(manifests)
30
+ manifests = index_by(manifests, &:name) if manifests.kind_of?(Array)
31
+ addtl = spec.dependencies + sourced_dependencies_for_manifests(manifests)
32
+ recursive_resolve([], manifests, [], addtl)
33
+ end
34
+
35
+ private
36
+
37
+ def find_inconsistency(dep, deps, mans)
38
+ m = mans[dep.name]
39
+ dep.satisfied_by?(m) or return m if m
40
+ deps.find{|d| !dep.consistent_with?(d)}
41
+ end
42
+
43
+ def recursive_resolve(dependencies, manifests, queue, addtl)
44
+ dependencies = dependencies.dup
45
+ manifests = manifests.dup
46
+ queue = queue.dup
47
+
48
+ return unless enqueue_dependencies(queue, addtl, dependencies, manifests)
49
+ return unless shift_resolved_enqueued_dependencies(dependencies, manifests, queue)
50
+ return manifests if queue.empty?
51
+
52
+ dependency = queue.shift
53
+ dependencies << dependency
54
+ all_deps = dependencies + queue
55
+
56
+ resolving_dependency_map_find_manifests(dependency) do |manifest|
57
+ next unless check_manifest(manifest, all_deps)
58
+
59
+ m = manifests.merge(dependency.name => manifest)
60
+ a = sourced_dependencies_for_manifest(manifest)
61
+
62
+ recursive_resolve(dependencies, m, queue, a)
63
+ end
64
+ end
65
+
66
+ # When using this method, you are required to check the return value.
67
+ # Returns +true+ if the enqueueables could all be enqueued.
68
+ # Returns +false+ if there was an inconsistency when trying to enqueue one
69
+ # or more of them.
70
+ # This modifies +queue+ but does not modify any other arguments.
71
+ def enqueue_dependencies(queue, enqueueables, dependencies, manifests)
72
+ enqueueables.each do |d|
73
+ if q = find_inconsistency(d, dependencies + queue, manifests)
74
+ debug_conflict d, q
75
+ return false
76
+ end
77
+ debug_schedule d
78
+ queue << d
79
+ end
80
+ true
81
+ end
82
+
83
+ # When using this method, you are required to check the return value.
84
+ # Returns +true+ if the resolved enqueued dependencies at the front of the
85
+ # queue could all be moved to the resolved dependencies list.
86
+ # Returns +false+ if there was an inconsistency when trying to move one or
87
+ # more of them.
88
+ # This modifies +queue+ and +dependencies+.
89
+ def shift_resolved_enqueued_dependencies(dependencies, manifests, queue)
90
+ all_deps = dependencies + queue
91
+ while (dependency = queue.first) && manifests[dependency.name]
92
+ if q = find_inconsistency(dependency, all_deps, manifests)
93
+ debug_conflict dependency, q
94
+ return false
95
+ end
96
+ dependencies << queue.shift
97
+ end
98
+ true
99
+ end
100
+
101
+ # When using this method, you are required to check the return value.
102
+ # Returns +true+ if the manifest satisfies all of the dependencies.
103
+ # Returns +false+ if there was a dependency that the manifest does not
104
+ # satisfy.
105
+ def check_manifest(manifest, all_deps)
106
+ related = all_deps.select{|d| d.name == manifest.name}
107
+ if q = related.find{|d| !d.satisfied_by?(manifest)}
108
+ debug_conflict manifest, q
109
+ return false
110
+ end
111
+ true
112
+ end
113
+
114
+ def default_source
115
+ @default_source ||= MultiSource.new(spec.sources)
116
+ end
117
+
118
+ def dependency_source_map
119
+ @dependency_source_map ||=
120
+ Hash[spec.dependencies.map{|d| [d.name, d.source]}]
121
+ end
122
+
123
+ def sourced_dependency_for(dependency)
124
+ return dependency if dependency.source
125
+
126
+ source = dependency_source_map[dependency.name] || default_source
127
+ Dependency.new(dependency.name, dependency.requirement, source)
128
+ end
129
+
130
+ def sourced_dependencies_for_manifest(manifest)
131
+ manifest.dependencies.map{|d| sourced_dependency_for(d)}
132
+ end
133
+
134
+ def sourced_dependencies_for_manifests(manifests)
135
+ manifests = manifests.values if manifests.kind_of?(Hash)
136
+ manifests.map{|m| sourced_dependencies_for_manifest(m)}.flatten(1)
137
+ end
138
+
139
+ def resolving_dependency_map_find_manifests(dependency)
140
+ scope_resolving_dependency dependency do
141
+ map_find(dependency.manifests) do |manifest|
142
+ scope_checking_manifest dependency, manifest do
143
+ yield manifest
144
+ end
145
+ end
146
+ end
147
+ end
148
+
149
+ def scope_resolving_dependency(dependency)
150
+ debug { "Resolving #{dependency}" }
151
+ resolution = nil
152
+ scope do
153
+ scope_checking_manifests do
154
+ resolution = yield
155
+ end
156
+ if resolution
157
+ debug { "Resolved #{dependency}" }
158
+ else
159
+ debug { "Failed to resolve #{dependency}" }
160
+ end
161
+ end
162
+ resolution
163
+ end
164
+
165
+ def scope_checking_manifests
166
+ debug { "Checking manifests" }
167
+ scope do
168
+ yield
169
+ end
170
+ end
171
+
172
+ def scope_checking_manifest(dependency, manifest)
173
+ debug { "Checking #{manifest}" }
174
+ resolution = nil
175
+ scope do
176
+ resolution = yield
177
+ if resolution
178
+ debug { "Resolved #{dependency} at #{manifest}" }
179
+ else
180
+ debug { "Backtracking from #{manifest}" }
181
+ end
182
+ end
183
+ resolution
184
+ end
185
+
186
+ def debug_schedule(dependency)
187
+ debug { "Scheduling #{dependency}" }
188
+ end
189
+
190
+ def debug_conflict(dependency, conflict)
191
+ debug { "Conflict between #{dependency} and #{conflict}" }
192
+ end
193
+
194
+ def map_find(enum)
195
+ enum.each do |obj|
196
+ res = yield(obj)
197
+ res.nil? or return res
198
+ end
199
+ nil
200
+ end
201
+
202
+ def index_by(enum)
203
+ Hash[enum.map{|obj| [yield(obj), obj]}]
204
+ end
205
+
206
+ def scope
207
+ @level += 1
208
+ yield
209
+ ensure
210
+ @level -= 1
211
+ end
212
+
213
+ def debug
214
+ environment.logger.debug { ' ' * @level + yield }
215
+ end
216
+
217
+ def environment
218
+ resolver.environment
219
+ end
220
+
221
+ end
222
+ end
223
+ end