librarian 0.0.9 → 0.0.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CHANGELOG.md +4 -0
- data/lib/librarian.rb +5 -178
- data/lib/librarian/action.rb +5 -0
- data/lib/librarian/action/base.rb +22 -0
- data/lib/librarian/action/clean.rb +56 -0
- data/lib/librarian/action/ensure.rb +24 -0
- data/lib/librarian/action/install.rb +101 -0
- data/lib/librarian/action/resolve.rb +81 -0
- data/lib/librarian/action/update.rb +76 -0
- data/lib/librarian/chef/cli.rb +7 -2
- data/lib/librarian/chef/dsl.rb +0 -3
- data/lib/librarian/chef/environment.rb +19 -0
- data/lib/librarian/chef/extension.rb +1 -16
- data/lib/librarian/chef/integration/knife.rb +9 -16
- data/lib/librarian/chef/source/git.rb +0 -2
- data/lib/librarian/chef/source/local.rb +1 -74
- data/lib/librarian/chef/source/local/manifest.rb +82 -0
- data/lib/librarian/chef/source/path.rb +0 -2
- data/lib/librarian/chef/source/site.rb +9 -89
- data/lib/librarian/chef/source/site/manifest.rb +94 -0
- data/lib/librarian/cli.rb +56 -17
- data/lib/librarian/dependency.rb +2 -2
- data/lib/librarian/dsl.rb +15 -5
- data/lib/librarian/dsl/receiver.rb +2 -0
- data/lib/librarian/dsl/target.rb +13 -1
- data/lib/librarian/environment.rb +94 -0
- data/lib/librarian/error.rb +4 -0
- data/lib/librarian/helpers/debug.rb +6 -6
- data/lib/librarian/lockfile.rb +7 -5
- data/lib/librarian/lockfile/compiler.rb +5 -4
- data/lib/librarian/lockfile/parser.rb +6 -5
- data/lib/librarian/manifest.rb +2 -2
- data/lib/librarian/mock/cli.rb +6 -1
- data/lib/librarian/mock/dsl.rb +0 -3
- data/lib/librarian/mock/environment.rb +24 -0
- data/lib/librarian/mock/extension.rb +1 -20
- data/lib/librarian/mock/source/mock.rb +7 -7
- data/lib/librarian/mock/source/mock/registry.rb +16 -12
- data/lib/librarian/resolver.rb +5 -116
- data/lib/librarian/resolver/implementation.rb +117 -0
- data/lib/librarian/source/git.rb +8 -7
- data/lib/librarian/source/git/repository.rb +7 -5
- data/lib/librarian/source/local.rb +1 -1
- data/lib/librarian/source/path.rb +7 -6
- data/lib/librarian/spec_change_set.rb +6 -5
- data/lib/librarian/specfile.rb +10 -4
- data/lib/librarian/version.rb +1 -1
- data/librarian.gemspec +1 -0
- data/spec/functional/chef/source/git_spec.rb +177 -89
- data/spec/functional/chef/source/site_spec.rb +111 -52
- data/spec/unit/action/base_spec.rb +18 -0
- data/spec/unit/action/clean_spec.rb +133 -0
- data/spec/unit/action/ensure_spec.rb +37 -0
- data/spec/unit/action/install_spec.rb +113 -0
- data/spec/unit/dsl_spec.rb +15 -13
- data/spec/unit/environment_spec.rb +9 -0
- data/spec/unit/lockfile_spec.rb +15 -4
- data/spec/unit/mock/source/mock.rb +22 -0
- data/spec/unit/resolver_spec.rb +24 -24
- data/spec/unit/spec_change_set_spec.rb +29 -25
- metadata +47 -19
- data/lib/librarian/chef/particularity.rb +0 -9
- data/lib/librarian/mock/particularity.rb +0 -9
- data/lib/librarian/particularity.rb +0 -7
@@ -8,24 +8,24 @@ module Librarian
|
|
8
8
|
|
9
9
|
LIBRARIAN_PATH = Pathname.new('../../../../').expand_path(__FILE__)
|
10
10
|
|
11
|
-
abstract_method :
|
11
|
+
abstract_method :environment
|
12
12
|
|
13
13
|
private
|
14
14
|
|
15
15
|
def relative_path_to(path)
|
16
|
-
|
16
|
+
environment.project_relative_path_to(path)
|
17
17
|
end
|
18
18
|
|
19
19
|
def debug
|
20
|
-
if
|
21
|
-
if
|
20
|
+
if ui = environment.ui
|
21
|
+
if ui.respond_to? :debug_line_numbers and ui.debug_line_numbers
|
22
22
|
loc = caller.find{|l| !(l =~ /in `debug'$/)}
|
23
23
|
if loc =~ /^(.+):(\d+):in `(.+)'$/
|
24
24
|
loc = "#{Pathname.new($1).relative_path_from(LIBRARIAN_PATH)}:#{$2}:in `#{$3}'"
|
25
25
|
end
|
26
|
-
|
26
|
+
ui.debug { "[Librarian] #{yield} [#{loc}]" }
|
27
27
|
else
|
28
|
-
|
28
|
+
ui.debug { "[Librarian] #{yield}" }
|
29
29
|
end
|
30
30
|
end
|
31
31
|
end
|
data/lib/librarian/lockfile.rb
CHANGED
@@ -8,19 +8,21 @@ module Librarian
|
|
8
8
|
|
9
9
|
include Helpers::Debug
|
10
10
|
|
11
|
-
|
11
|
+
attr_accessor :environment
|
12
|
+
private :environment=
|
13
|
+
attr_reader :path
|
12
14
|
|
13
|
-
def initialize(
|
14
|
-
|
15
|
+
def initialize(environment, path)
|
16
|
+
self.environment = environment
|
15
17
|
@path = path
|
16
18
|
end
|
17
19
|
|
18
20
|
def save(resolution)
|
19
|
-
Compiler.new(
|
21
|
+
Compiler.new(environment).compile(resolution)
|
20
22
|
end
|
21
23
|
|
22
24
|
def load(string)
|
23
|
-
Parser.new(
|
25
|
+
Parser.new(environment).parse(string)
|
24
26
|
end
|
25
27
|
|
26
28
|
def read
|
@@ -6,10 +6,11 @@ module Librarian
|
|
6
6
|
|
7
7
|
include Helpers::Debug
|
8
8
|
|
9
|
-
|
9
|
+
attr_accessor :environment
|
10
|
+
private :environment=
|
10
11
|
|
11
|
-
def initialize(
|
12
|
-
|
12
|
+
def initialize(environment)
|
13
|
+
self.environment = environment
|
13
14
|
end
|
14
15
|
|
15
16
|
def compile(resolution)
|
@@ -61,7 +62,7 @@ module Librarian
|
|
61
62
|
end
|
62
63
|
|
63
64
|
def dsl_class
|
64
|
-
|
65
|
+
environment.dsl_class
|
65
66
|
end
|
66
67
|
|
67
68
|
end
|
@@ -17,10 +17,11 @@ module Librarian
|
|
17
17
|
|
18
18
|
include Helpers::Debug
|
19
19
|
|
20
|
-
|
20
|
+
attr_accessor :environment
|
21
|
+
private :environment=
|
21
22
|
|
22
|
-
def initialize(
|
23
|
-
|
23
|
+
def initialize(environment)
|
24
|
+
self.environment = environment
|
24
25
|
end
|
25
26
|
|
26
27
|
def parse(string)
|
@@ -71,7 +72,7 @@ module Librarian
|
|
71
72
|
manifests = {}
|
72
73
|
sources_ast.each do |source_ast|
|
73
74
|
source_type = source_ast[:type]
|
74
|
-
source = source_type.from_lock_options(source_ast[:options])
|
75
|
+
source = source_type.from_lock_options(environment, source_ast[:options])
|
75
76
|
source_ast[:manifests].each do |manifest_name, manifest_ast|
|
76
77
|
manifests[manifest_name] = ManifestPlaceholder.new(
|
77
78
|
source,
|
@@ -95,7 +96,7 @@ module Librarian
|
|
95
96
|
end
|
96
97
|
|
97
98
|
def dsl_class
|
98
|
-
|
99
|
+
environment.dsl_class
|
99
100
|
end
|
100
101
|
|
101
102
|
end
|
data/lib/librarian/manifest.rb
CHANGED
data/lib/librarian/mock/cli.rb
CHANGED
@@ -1,11 +1,16 @@
|
|
1
1
|
require 'librarian/cli'
|
2
2
|
require 'librarian/mock'
|
3
|
-
require 'librarian/mock/particularity'
|
4
3
|
|
5
4
|
module Librarian
|
6
5
|
module Mock
|
7
6
|
class Cli < Librarian::Cli
|
8
7
|
|
8
|
+
module Particularity
|
9
|
+
def root_module
|
10
|
+
Mock
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
9
14
|
include Particularity
|
10
15
|
extend Particularity
|
11
16
|
|
data/lib/librarian/mock/dsl.rb
CHANGED
@@ -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 specfile_name
|
9
|
+
"Mockfile"
|
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
|
@@ -1,28 +1,9 @@
|
|
1
|
-
require 'librarian/
|
2
|
-
require 'librarian/mock/dsl'
|
1
|
+
require 'librarian/mock/environment'
|
3
2
|
|
4
3
|
module Librarian
|
5
4
|
module Mock
|
6
5
|
extend self
|
7
6
|
extend Librarian
|
8
7
|
|
9
|
-
module Overrides
|
10
|
-
def specfile_name
|
11
|
-
'Mockfile'
|
12
|
-
end
|
13
|
-
|
14
|
-
def install_path
|
15
|
-
nil
|
16
|
-
end
|
17
|
-
|
18
|
-
def registry(options = nil, &block)
|
19
|
-
registry = Source::Mock::Registry
|
20
|
-
registry.clear! if options && options[:clear]
|
21
|
-
registry.merge!(&block) if block
|
22
|
-
registry
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
extend Overrides
|
27
8
|
end
|
28
9
|
end
|
@@ -1,5 +1,4 @@
|
|
1
1
|
require 'librarian/manifest'
|
2
|
-
require 'librarian/mock/particularity'
|
3
2
|
require 'librarian/mock/source/mock/registry'
|
4
3
|
|
5
4
|
module Librarian
|
@@ -23,21 +22,22 @@ module Librarian
|
|
23
22
|
end
|
24
23
|
end
|
25
24
|
|
26
|
-
include Particularity
|
27
|
-
|
28
25
|
class << self
|
29
26
|
LOCK_NAME = 'MOCK'
|
30
27
|
def lock_name
|
31
28
|
LOCK_NAME
|
32
29
|
end
|
33
|
-
def from_lock_options(options)
|
34
|
-
new(options[:remote], options.reject{|k, v| k == :remote})
|
30
|
+
def from_lock_options(environment, options)
|
31
|
+
new(environment, options[:remote], options.reject{|k, v| k == :remote})
|
35
32
|
end
|
36
33
|
end
|
37
34
|
|
35
|
+
attr_accessor :environment
|
36
|
+
private :environment=
|
38
37
|
attr_reader :name
|
39
38
|
|
40
|
-
def initialize(name, options)
|
39
|
+
def initialize(environment, name, options)
|
40
|
+
self.environment = environment
|
41
41
|
@name = name
|
42
42
|
end
|
43
43
|
|
@@ -60,7 +60,7 @@ module Librarian
|
|
60
60
|
end
|
61
61
|
|
62
62
|
def registry
|
63
|
-
|
63
|
+
environment.registry[name]
|
64
64
|
end
|
65
65
|
|
66
66
|
def manifest(name, version, dependencies)
|
@@ -58,19 +58,23 @@ module Librarian
|
|
58
58
|
|
59
59
|
end
|
60
60
|
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
@sources ||= {}
|
67
|
-
Dsl.run!(@sources, &block) if block
|
68
|
-
end
|
69
|
-
def [](name)
|
70
|
-
@sources ||= {}
|
71
|
-
@sources[name] ||= {}
|
72
|
-
end
|
61
|
+
def initialize
|
62
|
+
clear!
|
63
|
+
end
|
64
|
+
def clear!
|
65
|
+
self.sources = { }
|
73
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
|
74
78
|
|
75
79
|
end
|
76
80
|
end
|
data/lib/librarian/resolver.rb
CHANGED
@@ -1,126 +1,15 @@
|
|
1
|
-
require 'librarian/
|
2
|
-
|
3
|
-
require 'librarian/dependency'
|
1
|
+
require 'librarian/resolver/implementation'
|
4
2
|
require 'librarian/manifest_set'
|
5
3
|
require 'librarian/resolution'
|
6
4
|
|
7
5
|
module Librarian
|
8
6
|
class Resolver
|
9
7
|
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
attr_reader :resolver, :source, :dependency_source_map
|
14
|
-
|
15
|
-
def initialize(resolver, spec)
|
16
|
-
@resolver = resolver
|
17
|
-
@source = spec.source
|
18
|
-
@dependency_source_map = Hash[spec.dependencies.map{|d| [d.name, d.source]}]
|
19
|
-
@level = 0
|
20
|
-
end
|
21
|
-
|
22
|
-
def resolve(dependencies, manifests = {})
|
23
|
-
resolution = recursive_resolve([], manifests, dependencies.dup)
|
24
|
-
resolution ? resolution[1] : nil
|
25
|
-
end
|
26
|
-
|
27
|
-
def recursive_resolve(dependencies, manifests, queue)
|
28
|
-
if dependencies.empty?
|
29
|
-
queue.each do |dependency|
|
30
|
-
debug { "Scheduling #{dependency}" }
|
31
|
-
end
|
32
|
-
end
|
33
|
-
failure = false
|
34
|
-
until failure || queue.empty?
|
35
|
-
dependency = queue.shift
|
36
|
-
dependencies << dependency
|
37
|
-
debug { "Resolving #{dependency}" }
|
38
|
-
scope do
|
39
|
-
if manifests.key?(dependency.name)
|
40
|
-
unless dependency.satisfied_by?(manifests[dependency.name])
|
41
|
-
debug { "Conflicts with #{manifests[dependency.name]}" }
|
42
|
-
failure = true
|
43
|
-
else
|
44
|
-
debug { "Accords with all prior constraints" }
|
45
|
-
# nothing left to do
|
46
|
-
end
|
47
|
-
else
|
48
|
-
debug { "No known prior constraints" }
|
49
|
-
resolution = nil
|
50
|
-
related_dependencies = dependencies.select{|d| d.name == dependency.name}
|
51
|
-
unless dependency.manifests && dependency.manifests.first
|
52
|
-
debug { "No known manifests" }
|
53
|
-
else
|
54
|
-
debug { "Checking manifests" }
|
55
|
-
scope do
|
56
|
-
dependency.manifests.each do |manifest|
|
57
|
-
unless resolution
|
58
|
-
debug { "Checking #{manifest}" }
|
59
|
-
scope do
|
60
|
-
if related_dependencies.all?{|d| d.satisfied_by?(manifest)}
|
61
|
-
m = manifests.merge(dependency.name => manifest)
|
62
|
-
a = manifest.dependencies.map { |d|
|
63
|
-
d.source ? d :
|
64
|
-
!dependency_source_map.key?(d.name) ?
|
65
|
-
Dependency.new(d.name, d.requirement, source) :
|
66
|
-
Dependency.new(d.name, d.requirement, dependency_source_map[d.name])
|
67
|
-
}
|
68
|
-
a.each do |d|
|
69
|
-
debug { "Scheduling #{d}" }
|
70
|
-
end
|
71
|
-
q = queue + a
|
72
|
-
resolution = recursive_resolve(dependencies.dup, m, q)
|
73
|
-
end
|
74
|
-
if resolution
|
75
|
-
debug { "Resolved #{dependency} at #{manifest}" }
|
76
|
-
else
|
77
|
-
debug { "Backtracking from #{manifest}" }
|
78
|
-
end
|
79
|
-
end
|
80
|
-
end
|
81
|
-
end
|
82
|
-
end
|
83
|
-
if resolution
|
84
|
-
debug { "Resolved #{dependency}" }
|
85
|
-
else
|
86
|
-
debug { "Failed to resolve #{dependency}" }
|
87
|
-
end
|
88
|
-
end
|
89
|
-
unless resolution
|
90
|
-
failure = true
|
91
|
-
else
|
92
|
-
dependencies, manifests, queue = *resolution
|
93
|
-
end
|
94
|
-
end
|
95
|
-
end
|
96
|
-
end
|
97
|
-
failure ? nil : [dependencies, manifests, queue]
|
98
|
-
end
|
99
|
-
|
100
|
-
private
|
101
|
-
|
102
|
-
def scope
|
103
|
-
@level += 1
|
104
|
-
yield
|
105
|
-
ensure
|
106
|
-
@level -= 1
|
107
|
-
end
|
108
|
-
|
109
|
-
def debug
|
110
|
-
super { ' ' * @level + yield }
|
111
|
-
end
|
112
|
-
|
113
|
-
def root_module
|
114
|
-
resolver.root_module
|
115
|
-
end
|
116
|
-
end
|
117
|
-
|
118
|
-
include Helpers::Debug
|
119
|
-
|
120
|
-
attr_reader :root_module
|
8
|
+
attr_accessor :environment
|
9
|
+
private :environment=
|
121
10
|
|
122
|
-
def initialize(
|
123
|
-
|
11
|
+
def initialize(environment)
|
12
|
+
self.environment = environment
|
124
13
|
end
|
125
14
|
|
126
15
|
def resolve(spec, partial_manifests = [])
|
@@ -0,0 +1,117 @@
|
|
1
|
+
require 'librarian/helpers/debug'
|
2
|
+
|
3
|
+
require 'librarian/dependency'
|
4
|
+
|
5
|
+
module Librarian
|
6
|
+
class Resolver
|
7
|
+
class Implementation
|
8
|
+
|
9
|
+
include Helpers::Debug
|
10
|
+
|
11
|
+
attr_reader :resolver, :source, :dependency_source_map
|
12
|
+
|
13
|
+
def initialize(resolver, spec)
|
14
|
+
@resolver = resolver
|
15
|
+
@source = spec.source
|
16
|
+
@dependency_source_map = Hash[spec.dependencies.map{|d| [d.name, d.source]}]
|
17
|
+
@level = 0
|
18
|
+
end
|
19
|
+
|
20
|
+
def resolve(dependencies, manifests = {})
|
21
|
+
resolution = recursive_resolve([], manifests, dependencies.dup)
|
22
|
+
resolution ? resolution[1] : nil
|
23
|
+
end
|
24
|
+
|
25
|
+
def recursive_resolve(dependencies, manifests, queue)
|
26
|
+
if dependencies.empty?
|
27
|
+
queue.each do |dependency|
|
28
|
+
debug { "Scheduling #{dependency}" }
|
29
|
+
end
|
30
|
+
end
|
31
|
+
failure = false
|
32
|
+
until failure || queue.empty?
|
33
|
+
dependency = queue.shift
|
34
|
+
dependencies << dependency
|
35
|
+
debug { "Resolving #{dependency}" }
|
36
|
+
scope do
|
37
|
+
if manifests.key?(dependency.name)
|
38
|
+
unless dependency.satisfied_by?(manifests[dependency.name])
|
39
|
+
debug { "Conflicts with #{manifests[dependency.name]}" }
|
40
|
+
failure = true
|
41
|
+
else
|
42
|
+
debug { "Accords with all prior constraints" }
|
43
|
+
# nothing left to do
|
44
|
+
end
|
45
|
+
else
|
46
|
+
debug { "No known prior constraints" }
|
47
|
+
resolution = nil
|
48
|
+
related_dependencies = dependencies.select{|d| d.name == dependency.name}
|
49
|
+
unless dependency.manifests && dependency.manifests.first
|
50
|
+
debug { "No known manifests" }
|
51
|
+
else
|
52
|
+
debug { "Checking manifests" }
|
53
|
+
scope do
|
54
|
+
dependency.manifests.each do |manifest|
|
55
|
+
unless resolution
|
56
|
+
debug { "Checking #{manifest}" }
|
57
|
+
scope do
|
58
|
+
if related_dependencies.all?{|d| d.satisfied_by?(manifest)}
|
59
|
+
m = manifests.merge(dependency.name => manifest)
|
60
|
+
a = manifest.dependencies.map { |d|
|
61
|
+
d.source ? d :
|
62
|
+
!dependency_source_map.key?(d.name) ?
|
63
|
+
Dependency.new(d.name, d.requirement, source) :
|
64
|
+
Dependency.new(d.name, d.requirement, dependency_source_map[d.name])
|
65
|
+
}
|
66
|
+
a.each do |d|
|
67
|
+
debug { "Scheduling #{d}" }
|
68
|
+
end
|
69
|
+
q = queue + a
|
70
|
+
resolution = recursive_resolve(dependencies.dup, m, q)
|
71
|
+
end
|
72
|
+
if resolution
|
73
|
+
debug { "Resolved #{dependency} at #{manifest}" }
|
74
|
+
else
|
75
|
+
debug { "Backtracking from #{manifest}" }
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
if resolution
|
82
|
+
debug { "Resolved #{dependency}" }
|
83
|
+
else
|
84
|
+
debug { "Failed to resolve #{dependency}" }
|
85
|
+
end
|
86
|
+
end
|
87
|
+
unless resolution
|
88
|
+
failure = true
|
89
|
+
else
|
90
|
+
dependencies, manifests, queue = *resolution
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
95
|
+
failure ? nil : [dependencies, manifests, queue]
|
96
|
+
end
|
97
|
+
|
98
|
+
private
|
99
|
+
|
100
|
+
def scope
|
101
|
+
@level += 1
|
102
|
+
yield
|
103
|
+
ensure
|
104
|
+
@level -= 1
|
105
|
+
end
|
106
|
+
|
107
|
+
def debug
|
108
|
+
super { ' ' * @level + yield }
|
109
|
+
end
|
110
|
+
|
111
|
+
def environment
|
112
|
+
resolver.environment
|
113
|
+
end
|
114
|
+
|
115
|
+
end
|
116
|
+
end
|
117
|
+
end
|