librarian 0.0.22 → 0.0.23
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 +18 -0
- data/Rakefile +21 -0
- data/lib/librarian/action/install.rb +0 -7
- data/lib/librarian/chef/source/site.rb +24 -9
- data/lib/librarian/cli.rb +30 -1
- data/lib/librarian/dependency.rb +5 -4
- data/lib/librarian/environment.rb +4 -0
- data/lib/librarian/lockfile/parser.rb +2 -2
- data/lib/librarian/manifest_set.rb +8 -4
- data/lib/librarian/mock/source/mock.rb +0 -3
- data/lib/librarian/resolution.rb +1 -4
- data/lib/librarian/source/git.rb +36 -13
- data/lib/librarian/source/git/repository.rb +66 -7
- data/lib/librarian/source/local.rb +7 -3
- data/lib/librarian/source/path.rb +1 -1
- data/lib/librarian/version.rb +1 -1
- data/librarian.gemspec +47 -25
- data/spec/unit/action/install_spec.rb +1 -8
- data/spec/unit/lockfile/parser_spec.rb +162 -0
- data/spec/unit/mock/source/{mock.rb → mock_spec.rb} +0 -0
- metadata +23 -27
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,23 @@
|
|
1
1
|
# Change Log
|
2
2
|
|
3
|
+
## 0.0.23
|
4
|
+
|
5
|
+
* \#41. Build gems with a built gemspec.
|
6
|
+
|
7
|
+
* \#67. Cache remote objects at the latest possible moments, and only when they
|
8
|
+
are needed.
|
9
|
+
|
10
|
+
* \#68. Fix unpacking chef site-sourced packages on Windows by pivoting from a
|
11
|
+
Librarian-managed scratch space, rather than pivoting from Windows' temp
|
12
|
+
directory. There were unexplained problems with using the Windows temp
|
13
|
+
directory in certain cases, possibly related to the temp directory and the
|
14
|
+
Librarian cache directory being on different volumes.
|
15
|
+
|
16
|
+
* \#69. Fix invoking Librarian with git-sourced dependencies from git hooks by
|
17
|
+
unsetting `GIT_DIR` around shelling out to git.
|
18
|
+
|
19
|
+
* Print general environment information when running with `--verbose`.
|
20
|
+
|
3
21
|
## 0.0.22
|
4
22
|
|
5
23
|
* Fix the `outdated` CLI command.
|
data/Rakefile
CHANGED
@@ -1,4 +1,25 @@
|
|
1
1
|
require 'bundler'
|
2
|
+
|
3
|
+
module Bundler
|
4
|
+
class GemHelper
|
5
|
+
|
6
|
+
def build_gem_with_built_spec
|
7
|
+
spec = Gem::Specification.load(spec_path)
|
8
|
+
spec_ruby = spec.to_ruby
|
9
|
+
original_spec_path = spec_path + ".original"
|
10
|
+
FileUtils.mv(spec_path, original_spec_path)
|
11
|
+
File.open(spec_path, "wb"){|f| f.write(spec_ruby)}
|
12
|
+
build_gem_without_built_spec
|
13
|
+
ensure
|
14
|
+
FileUtils.mv(original_spec_path, spec_path)
|
15
|
+
end
|
16
|
+
|
17
|
+
alias build_gem_without_built_spec build_gem
|
18
|
+
alias build_gem build_gem_with_built_spec
|
19
|
+
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
2
23
|
Bundler::GemHelper.install_tasks
|
3
24
|
|
4
25
|
begin
|
@@ -35,17 +35,10 @@ module Librarian
|
|
35
35
|
def perform_installation
|
36
36
|
manifests = sorted_manifests
|
37
37
|
|
38
|
-
cache_manifests(manifests)
|
39
38
|
create_install_path
|
40
39
|
install_manifests(manifests)
|
41
40
|
end
|
42
41
|
|
43
|
-
def cache_manifests(manifests)
|
44
|
-
manifests.each do |manifest|
|
45
|
-
manifest.source.cache!([manifest.name])
|
46
|
-
end
|
47
|
-
end
|
48
|
-
|
49
42
|
def create_install_path
|
50
43
|
install_path.rmtree if install_path.exist?
|
51
44
|
install_path.mkpath
|
@@ -5,7 +5,7 @@ require 'net/http'
|
|
5
5
|
require 'json'
|
6
6
|
require 'digest'
|
7
7
|
require 'zlib'
|
8
|
-
require '
|
8
|
+
require 'securerandom'
|
9
9
|
require 'archive/tar/minitar'
|
10
10
|
|
11
11
|
require 'librarian/helpers/debug'
|
@@ -233,12 +233,8 @@ module Librarian
|
|
233
233
|
|
234
234
|
package_path = version_uri_package_cache_path(version_uri)
|
235
235
|
unpacked_path = version_uri_unpacked_cache_path(version_uri)
|
236
|
-
temp_path = Pathname(Dir.tmpdir)
|
237
236
|
|
238
|
-
|
239
|
-
Archive::Tar::Minitar.unpack(input, temp_path.to_s)
|
240
|
-
end
|
241
|
-
FileUtils.move(temp_path.join(name), unpacked_path)
|
237
|
+
unpack_package! unpacked_path, package_path
|
242
238
|
end
|
243
239
|
|
244
240
|
def cache_remote_json!(path, uri)
|
@@ -282,6 +278,28 @@ module Librarian
|
|
282
278
|
path.open("wb"){|f| f.write(bytes)}
|
283
279
|
end
|
284
280
|
|
281
|
+
def unpack_package!(path, source)
|
282
|
+
path = Pathname(path)
|
283
|
+
source = Pathname(source)
|
284
|
+
|
285
|
+
temp = environment.scratch_path.join(SecureRandom.hex(16))
|
286
|
+
temp.mkpath
|
287
|
+
|
288
|
+
debug { "Unpacking #{relative_path_to(source)} to #{relative_path_to(temp)}" }
|
289
|
+
Zlib::GzipReader.open(source) do |input|
|
290
|
+
Archive::Tar::Minitar.unpack(input, temp.to_s)
|
291
|
+
end
|
292
|
+
|
293
|
+
# Cookbook files, as pulled from Opscode Community Site API, are
|
294
|
+
# embedded in a subdirectory of the tarball, and the subdirectory's
|
295
|
+
# name is equal to the name of the cookbook.
|
296
|
+
subtemp = temp.join(name)
|
297
|
+
debug { "Moving #{relative_path_to(subtemp)} to #{relative_path_to(path)}" }
|
298
|
+
FileUtils.mv(subtemp, path)
|
299
|
+
ensure
|
300
|
+
temp.rmtree if temp && temp.exist?
|
301
|
+
end
|
302
|
+
|
285
303
|
def parse_local_json(path)
|
286
304
|
JSON.parse(path.read)
|
287
305
|
end
|
@@ -358,9 +376,6 @@ module Librarian
|
|
358
376
|
def unpin!
|
359
377
|
end
|
360
378
|
|
361
|
-
def cache!(names)
|
362
|
-
end
|
363
|
-
|
364
379
|
def install!(manifest)
|
365
380
|
manifest.source == self or raise ArgumentError
|
366
381
|
|
data/lib/librarian/cli.rb
CHANGED
@@ -6,6 +6,8 @@ require 'librarian/error'
|
|
6
6
|
require 'librarian/action'
|
7
7
|
require "librarian/ui"
|
8
8
|
|
9
|
+
require "librarian/helpers/debug"
|
10
|
+
|
9
11
|
module Librarian
|
10
12
|
class Cli < Thor
|
11
13
|
|
@@ -22,6 +24,8 @@ module Librarian
|
|
22
24
|
include Particularity
|
23
25
|
extend Particularity
|
24
26
|
|
27
|
+
include Helpers::Debug
|
28
|
+
|
25
29
|
class << self
|
26
30
|
def bin!
|
27
31
|
begin
|
@@ -44,6 +48,8 @@ module Librarian
|
|
44
48
|
environment.ui = UI::Shell.new(the_shell)
|
45
49
|
environment.ui.debug! if options["verbose"]
|
46
50
|
environment.ui.debug_line_numbers! if options["verbose"] && options["line-numbers"]
|
51
|
+
|
52
|
+
write_debug_header
|
47
53
|
end
|
48
54
|
|
49
55
|
desc "version", "Displays the version."
|
@@ -91,7 +97,6 @@ module Librarian
|
|
91
97
|
resolution = environment.lock
|
92
98
|
resolution.manifests.sort_by(&:name).each do |manifest|
|
93
99
|
source = manifest.source
|
94
|
-
source.cache!([manifest.name])
|
95
100
|
source_manifest = source.manifests(manifest.name).first
|
96
101
|
next if manifest.version == source_manifest.version
|
97
102
|
say "#{manifest.name} (#{manifest.version} -> #{source_manifest.version})"
|
@@ -142,5 +147,29 @@ module Librarian
|
|
142
147
|
ManifestPresenter.new(self, environment.lock.manifests)
|
143
148
|
end
|
144
149
|
|
150
|
+
def write_debug_header
|
151
|
+
debug { "Ruby Version: #{RUBY_VERSION}" }
|
152
|
+
debug { "Ruby Platform: #{RUBY_PLATFORM}" }
|
153
|
+
debug { "Rubinius Version: #{Rubinius::VERSION}" } if defined?(Rubinius)
|
154
|
+
debug { "JRuby Version: #{JRUBY_VERSION}" } if defined?(JRUBY_VERSION)
|
155
|
+
debug { "Rubygems Version: #{Gem::VERSION}" }
|
156
|
+
debug { "Librarian Version: #{VERSION}" }
|
157
|
+
debug { "Librarian Adapter: #{environment.adapter_name}"}
|
158
|
+
debug { "Project: #{environment.project_path}" }
|
159
|
+
debug { "Specfile: #{relative_path_to(environment.specfile_path)}" }
|
160
|
+
debug { "Lockfile: #{relative_path_to(environment.lockfile_path)}" }
|
161
|
+
debug { "Git: #{Source::Git::Repository.bin}" }
|
162
|
+
debug { "Git Version: #{Source::Git::Repository.new(environment, environment.project_path).version(:silent => true)}" }
|
163
|
+
debug { "Git Environment Variables:" }
|
164
|
+
git_env = ENV.to_a.select{|(k, v)| k =~ /\AGIT/}.sort_by{|(k, v)| k}
|
165
|
+
if git_env.empty?
|
166
|
+
debug { " (empty)" }
|
167
|
+
else
|
168
|
+
git_env.each do |(k, v)|
|
169
|
+
debug { " #{k}=#{v}"}
|
170
|
+
end
|
171
|
+
end
|
172
|
+
end
|
173
|
+
|
145
174
|
end
|
146
175
|
end
|
data/lib/librarian/dependency.rb
CHANGED
@@ -28,16 +28,18 @@ module Librarian
|
|
28
28
|
to_gem_requirement.to_s
|
29
29
|
end
|
30
30
|
|
31
|
+
protected
|
32
|
+
|
33
|
+
attr_accessor :backing
|
34
|
+
|
31
35
|
private
|
32
36
|
|
33
37
|
def initialize_normalize_args(args)
|
34
38
|
args.map do |arg|
|
35
|
-
arg =
|
39
|
+
arg = arg.backing if self.class === arg
|
36
40
|
arg
|
37
41
|
end
|
38
42
|
end
|
39
|
-
|
40
|
-
attr_accessor :backing
|
41
43
|
end
|
42
44
|
|
43
45
|
include Helpers::Debug
|
@@ -60,7 +62,6 @@ module Librarian
|
|
60
62
|
end
|
61
63
|
|
62
64
|
def cache_manifests!
|
63
|
-
source.cache!([name])
|
64
65
|
source.manifests(name)
|
65
66
|
end
|
66
67
|
|
@@ -28,7 +28,7 @@ module Librarian
|
|
28
28
|
string = string.dup
|
29
29
|
source_type_names_map = Hash[dsl_class.source_types.map{|t| [t[1].lock_name, t[1]]}]
|
30
30
|
source_type_names = dsl_class.source_types.map{|t| t[1].lock_name}
|
31
|
-
lines = string.split(/(\r
|
31
|
+
lines = string.split(/(\r|\n|\r\n)+/).select{|l| l =~ /\S/}
|
32
32
|
sources = []
|
33
33
|
while source_type_names.include?(lines.first)
|
34
34
|
source = {}
|
@@ -60,7 +60,7 @@ module Librarian
|
|
60
60
|
dependencies = []
|
61
61
|
while lines.first =~ /^ {2}([\w-]+)(?: \((.*)\))?$/
|
62
62
|
lines.shift
|
63
|
-
name, requirement = $1, $2
|
63
|
+
name, requirement = $1, $2.split(/,\s*/)
|
64
64
|
dependencies << Dependency.new(name, requirement, manifests_index[name].source)
|
65
65
|
end
|
66
66
|
Resolution.new(dependencies, manifests)
|
@@ -113,10 +113,14 @@ module Librarian
|
|
113
113
|
|
114
114
|
def consistent?
|
115
115
|
index.values.all? do |manifest|
|
116
|
-
manifest.dependencies
|
117
|
-
|
118
|
-
|
119
|
-
|
116
|
+
in_compliance_with?(manifest.dependencies)
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
def in_compliance_with?(dependencies)
|
121
|
+
dependencies.all? do |dependency|
|
122
|
+
manifest = index[dependency.name]
|
123
|
+
manifest && manifest.satisfies?(dependency)
|
120
124
|
end
|
121
125
|
end
|
122
126
|
|
data/lib/librarian/resolution.rb
CHANGED
@@ -33,10 +33,7 @@ module Librarian
|
|
33
33
|
end
|
34
34
|
|
35
35
|
def manifests_consistent_with_dependencies?
|
36
|
-
|
37
|
-
manifest = manifests_index[dependency.name]
|
38
|
-
dependency.satisfied_by?(manifest)
|
39
|
-
end
|
36
|
+
ManifestSet.new(manifests).in_compliance_with?(dependencies)
|
40
37
|
end
|
41
38
|
|
42
39
|
def manifests_internally_consistent?
|
data/lib/librarian/source/git.rb
CHANGED
@@ -39,14 +39,17 @@ module Librarian
|
|
39
39
|
|
40
40
|
attr_accessor :environment
|
41
41
|
private :environment=
|
42
|
-
|
42
|
+
|
43
|
+
attr_accessor :uri, :ref, :sha, :path
|
44
|
+
private :uri=, :ref=, :sha=, :path=
|
43
45
|
|
44
46
|
def initialize(environment, uri, options)
|
45
47
|
self.environment = environment
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
48
|
+
self.uri = uri
|
49
|
+
self.ref = options[:ref] || DEFAULTS[:ref]
|
50
|
+
self.sha = options[:sha]
|
51
|
+
self.path = options[:path]
|
52
|
+
|
50
53
|
@repository = nil
|
51
54
|
@repository_cache_path = nil
|
52
55
|
end
|
@@ -85,30 +88,40 @@ module Librarian
|
|
85
88
|
@sha = nil
|
86
89
|
end
|
87
90
|
|
88
|
-
def cache!
|
91
|
+
def cache!
|
92
|
+
repository_cached? and return or repository_cached!
|
93
|
+
|
89
94
|
unless repository.git?
|
90
95
|
repository.path.rmtree if repository.path.exist?
|
91
96
|
repository.path.mkpath
|
92
97
|
repository.clone!(uri)
|
93
98
|
end
|
94
99
|
repository.reset_hard!
|
95
|
-
|
100
|
+
repository.clean!
|
101
|
+
unless repository.checked_out?(sha)
|
96
102
|
remote = repository.default_remote
|
97
103
|
repository.fetch!(remote)
|
98
104
|
repository.fetch!(remote, :tags => true)
|
99
105
|
|
100
|
-
|
101
|
-
repository.checkout!(
|
106
|
+
self.sha = repository.hash_from(remote, ref) unless sha
|
107
|
+
repository.checkout!(sha) unless repository.checked_out?(sha)
|
102
108
|
|
103
|
-
|
109
|
+
raise Error, "failed to checkout #{sha}" unless repository.checked_out?(sha)
|
104
110
|
end
|
105
111
|
end
|
106
112
|
|
113
|
+
private
|
114
|
+
|
115
|
+
attr_accessor :repository_cached
|
116
|
+
alias repository_cached? repository_cached
|
117
|
+
|
118
|
+
def repository_cached!
|
119
|
+
self.repository_cached = true
|
120
|
+
end
|
121
|
+
|
107
122
|
def repository_cache_path
|
108
123
|
@repository_cache_path ||= begin
|
109
|
-
|
110
|
-
dir = Digest::MD5.hexdigest(dir)
|
111
|
-
environment.cache_path.join("source/git/#{dir}")
|
124
|
+
environment.cache_path.join("source/git/#{cache_key}")
|
112
125
|
end
|
113
126
|
end
|
114
127
|
|
@@ -122,6 +135,16 @@ module Librarian
|
|
122
135
|
@filesystem_path ||= path ? repository.path.join(path) : repository.path
|
123
136
|
end
|
124
137
|
|
138
|
+
def cache_key
|
139
|
+
@cache_key ||= begin
|
140
|
+
uri_part = uri
|
141
|
+
path_part = "/#{path}" if path
|
142
|
+
ref_part = "##{ref}"
|
143
|
+
key_source = [uri_part, path_part, ref_part].join
|
144
|
+
Digest::MD5.hexdigest(key_source)
|
145
|
+
end
|
146
|
+
end
|
147
|
+
|
125
148
|
end
|
126
149
|
end
|
127
150
|
end
|
@@ -59,6 +59,17 @@ module Librarian
|
|
59
59
|
"origin"
|
60
60
|
end
|
61
61
|
|
62
|
+
def version(options = { })
|
63
|
+
version!(options).strip
|
64
|
+
end
|
65
|
+
|
66
|
+
def version!(options = { })
|
67
|
+
silent = options.delete(:silent)
|
68
|
+
|
69
|
+
command = %w(--version)
|
70
|
+
run!(command, :silent => silent)
|
71
|
+
end
|
72
|
+
|
62
73
|
def clone!(repository_url)
|
63
74
|
command = %W(clone #{repository_url} . --quiet)
|
64
75
|
run!(command, :chdir => true)
|
@@ -81,6 +92,15 @@ module Librarian
|
|
81
92
|
run!(command, :chdir => true)
|
82
93
|
end
|
83
94
|
|
95
|
+
def clean!
|
96
|
+
command = %w(clean -x -d --force --force)
|
97
|
+
run!(command, :chdir => true)
|
98
|
+
end
|
99
|
+
|
100
|
+
def checked_out?(sha)
|
101
|
+
current_commit_hash == sha
|
102
|
+
end
|
103
|
+
|
84
104
|
def remote_names
|
85
105
|
command = %W(remote)
|
86
106
|
run!(command, :chdir => true).strip.lines.map(&:strip)
|
@@ -126,28 +146,67 @@ module Librarian
|
|
126
146
|
chdir = options.delete(:chdir)
|
127
147
|
chdir = path.to_s if chdir == true
|
128
148
|
|
149
|
+
silent = options.delete(:silent)
|
150
|
+
|
129
151
|
command = [bin]
|
130
152
|
command.concat(args)
|
131
153
|
|
132
154
|
maybe_within(chdir) do
|
133
|
-
|
134
|
-
|
135
|
-
raise StandardError, e.read unless (t ? t.value : $?).success?
|
136
|
-
o.read
|
155
|
+
logging_command(command, :silent => silent) do
|
156
|
+
run_command_internal(command)
|
137
157
|
end
|
138
|
-
debug { " -> #{out}" } if out.size > 0
|
139
|
-
out
|
140
158
|
end
|
141
159
|
end
|
142
160
|
|
143
161
|
def maybe_within(path)
|
144
162
|
if path
|
145
|
-
Dir.chdir(path) { yield }
|
163
|
+
Dir.chdir(path) { with_env_var("GIT_DIR", nil) { yield } }
|
146
164
|
else
|
147
165
|
yield
|
148
166
|
end
|
149
167
|
end
|
150
168
|
|
169
|
+
def with_env_var(name, value)
|
170
|
+
original_value = ENV[name]
|
171
|
+
begin
|
172
|
+
ENV[name] = value
|
173
|
+
yield
|
174
|
+
ensure
|
175
|
+
ENV[name] = original_value
|
176
|
+
end
|
177
|
+
end
|
178
|
+
|
179
|
+
def logging_command(command, options)
|
180
|
+
silent = options.delete(:silent)
|
181
|
+
|
182
|
+
pwd = Dir.pwd
|
183
|
+
|
184
|
+
unless silent
|
185
|
+
debug { "Running `#{command.join(' ')}` in #{relative_path_to(pwd)}" }
|
186
|
+
end
|
187
|
+
|
188
|
+
out = yield
|
189
|
+
|
190
|
+
unless silent
|
191
|
+
if out.size > 0
|
192
|
+
out.lines.each do |line|
|
193
|
+
debug { " --> #{line}" }
|
194
|
+
end
|
195
|
+
else
|
196
|
+
debug { " --- No output" }
|
197
|
+
end
|
198
|
+
end
|
199
|
+
|
200
|
+
out
|
201
|
+
end
|
202
|
+
|
203
|
+
def run_command_internal(command)
|
204
|
+
Open3.popen3(*command) do |i, o, e, t|
|
205
|
+
raise StandardError, e.read unless (t ? t.value : $?).success?
|
206
|
+
o.read
|
207
|
+
end
|
208
|
+
end
|
209
|
+
|
151
210
|
end
|
152
211
|
end
|
153
212
|
end
|
@@ -11,7 +11,7 @@ module Librarian
|
|
11
11
|
include Helpers::Debug
|
12
12
|
include Support::AbstractMethod
|
13
13
|
|
14
|
-
abstract_method :path
|
14
|
+
abstract_method :path, :fetch_version, :fetch_dependencies
|
15
15
|
|
16
16
|
def manifests(name)
|
17
17
|
manifest = Manifest.new(self, name)
|
@@ -26,8 +26,12 @@ module Librarian
|
|
26
26
|
end
|
27
27
|
|
28
28
|
def manifest_search_paths(name)
|
29
|
-
|
30
|
-
|
29
|
+
@manifest_search_paths ||= { }
|
30
|
+
@manifest_search_paths[name] ||= begin
|
31
|
+
cache!
|
32
|
+
paths = [filesystem_path, filesystem_path.join(name)]
|
33
|
+
paths.select{|s| s.exist?}
|
34
|
+
end
|
31
35
|
end
|
32
36
|
|
33
37
|
def found_path(name)
|
data/lib/librarian/version.rb
CHANGED
data/librarian.gemspec
CHANGED
@@ -1,33 +1,55 @@
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
2
|
-
$:.push File.expand_path("../lib", __FILE__)
|
3
|
-
require "librarian/version"
|
4
2
|
|
5
3
|
Gem::Specification.new do |s|
|
6
|
-
s.name
|
7
|
-
s.version
|
8
|
-
s.platform = Gem::Platform::RUBY
|
9
|
-
s.authors = ["Jay Feldblum"]
|
10
|
-
s.email = ["y_feldblum@yahoo.com"]
|
11
|
-
s.homepage = ""
|
12
|
-
s.summary = %q{Librarian}
|
13
|
-
s.description = %q{Librarian}
|
4
|
+
s.name = "librarian"
|
5
|
+
s.version = "0.0.23"
|
14
6
|
|
15
|
-
s.
|
16
|
-
|
17
|
-
s.
|
18
|
-
s.
|
19
|
-
s.
|
7
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
8
|
+
s.authors = ["Jay Feldblum"]
|
9
|
+
s.date = "2012-05-14"
|
10
|
+
s.description = "Librarian"
|
11
|
+
s.email = ["y_feldblum@yahoo.com"]
|
12
|
+
s.executables = ["librarian-chef", "librarian-mock"]
|
13
|
+
s.files = [".gitignore", ".rspec", ".travis.yml", "CHANGELOG.md", "Gemfile", "MIT-LICENSE", "README.md", "Rakefile", "bin/librarian-chef", "bin/librarian-mock", "config/cucumber.yaml", "features/chef/cli/init.feature", "features/chef/cli/install.feature", "features/chef/cli/show.feature", "features/chef/cli/version.feature", "features/support/env.rb", "lib/librarian.rb", "lib/librarian/action.rb", "lib/librarian/action/base.rb", "lib/librarian/action/clean.rb", "lib/librarian/action/ensure.rb", "lib/librarian/action/install.rb", "lib/librarian/action/resolve.rb", "lib/librarian/action/update.rb", "lib/librarian/chef.rb", "lib/librarian/chef/cli.rb", "lib/librarian/chef/dsl.rb", "lib/librarian/chef/environment.rb", "lib/librarian/chef/extension.rb", "lib/librarian/chef/integration/knife.rb", "lib/librarian/chef/manifest_reader.rb", "lib/librarian/chef/source.rb", "lib/librarian/chef/source/git.rb", "lib/librarian/chef/source/local.rb", "lib/librarian/chef/source/path.rb", "lib/librarian/chef/source/site.rb", "lib/librarian/chef/templates/Cheffile", "lib/librarian/cli.rb", "lib/librarian/cli/manifest_presenter.rb", "lib/librarian/dependency.rb", "lib/librarian/dsl.rb", "lib/librarian/dsl/receiver.rb", "lib/librarian/dsl/target.rb", "lib/librarian/environment.rb", "lib/librarian/error.rb", "lib/librarian/helpers.rb", "lib/librarian/helpers/debug.rb", "lib/librarian/lockfile.rb", "lib/librarian/lockfile/compiler.rb", "lib/librarian/lockfile/parser.rb", "lib/librarian/manifest.rb", "lib/librarian/manifest_set.rb", "lib/librarian/mock.rb", "lib/librarian/mock/cli.rb", "lib/librarian/mock/dsl.rb", "lib/librarian/mock/environment.rb", "lib/librarian/mock/extension.rb", "lib/librarian/mock/source.rb", "lib/librarian/mock/source/mock.rb", "lib/librarian/mock/source/mock/registry.rb", "lib/librarian/resolution.rb", "lib/librarian/resolver.rb", "lib/librarian/resolver/implementation.rb", "lib/librarian/source.rb", "lib/librarian/source/git.rb", "lib/librarian/source/git/repository.rb", "lib/librarian/source/local.rb", "lib/librarian/source/path.rb", "lib/librarian/spec.rb", "lib/librarian/spec_change_set.rb", "lib/librarian/specfile.rb", "lib/librarian/support/abstract_method.rb", "lib/librarian/ui.rb", "lib/librarian/version.rb", "librarian.gemspec", "spec/functional/chef/source/git_spec.rb", "spec/functional/chef/source/site_spec.rb", "spec/unit/action/base_spec.rb", "spec/unit/action/clean_spec.rb", "spec/unit/action/ensure_spec.rb", "spec/unit/action/install_spec.rb", "spec/unit/dependency_spec.rb", "spec/unit/dsl_spec.rb", "spec/unit/environment_spec.rb", "spec/unit/lockfile/parser_spec.rb", "spec/unit/lockfile_spec.rb", "spec/unit/manifest_set_spec.rb", "spec/unit/manifest_spec.rb", "spec/unit/mock/source/mock_spec.rb", "spec/unit/resolver_spec.rb", "spec/unit/source/git_spec.rb", "spec/unit/spec_change_set_spec.rb"]
|
14
|
+
s.homepage = ""
|
20
15
|
s.require_paths = ["lib"]
|
16
|
+
s.rubyforge_project = "librarian"
|
17
|
+
s.rubygems_version = "1.8.17"
|
18
|
+
s.summary = "Librarian"
|
21
19
|
|
22
|
-
s.
|
23
|
-
|
24
|
-
s.add_development_dependency "rake"
|
25
|
-
s.add_development_dependency "rspec"
|
26
|
-
s.add_development_dependency "cucumber"
|
27
|
-
s.add_development_dependency "aruba"
|
28
|
-
s.add_development_dependency "webmock"
|
20
|
+
if s.respond_to? :specification_version then
|
21
|
+
s.specification_version = 3
|
29
22
|
|
30
|
-
|
31
|
-
|
32
|
-
|
23
|
+
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
24
|
+
s.add_runtime_dependency(%q<thor>, ["~> 0.15"])
|
25
|
+
s.add_development_dependency(%q<rake>, [">= 0"])
|
26
|
+
s.add_development_dependency(%q<rspec>, [">= 0"])
|
27
|
+
s.add_development_dependency(%q<cucumber>, [">= 0"])
|
28
|
+
s.add_development_dependency(%q<aruba>, [">= 0"])
|
29
|
+
s.add_development_dependency(%q<webmock>, [">= 0"])
|
30
|
+
s.add_runtime_dependency(%q<chef>, [">= 0.10"])
|
31
|
+
s.add_runtime_dependency(%q<highline>, [">= 0"])
|
32
|
+
s.add_runtime_dependency(%q<archive-tar-minitar>, [">= 0.5.2"])
|
33
|
+
else
|
34
|
+
s.add_dependency(%q<thor>, ["~> 0.15"])
|
35
|
+
s.add_dependency(%q<rake>, [">= 0"])
|
36
|
+
s.add_dependency(%q<rspec>, [">= 0"])
|
37
|
+
s.add_dependency(%q<cucumber>, [">= 0"])
|
38
|
+
s.add_dependency(%q<aruba>, [">= 0"])
|
39
|
+
s.add_dependency(%q<webmock>, [">= 0"])
|
40
|
+
s.add_dependency(%q<chef>, [">= 0.10"])
|
41
|
+
s.add_dependency(%q<highline>, [">= 0"])
|
42
|
+
s.add_dependency(%q<archive-tar-minitar>, [">= 0.5.2"])
|
43
|
+
end
|
44
|
+
else
|
45
|
+
s.add_dependency(%q<thor>, ["~> 0.15"])
|
46
|
+
s.add_dependency(%q<rake>, [">= 0"])
|
47
|
+
s.add_dependency(%q<rspec>, [">= 0"])
|
48
|
+
s.add_dependency(%q<cucumber>, [">= 0"])
|
49
|
+
s.add_dependency(%q<aruba>, [">= 0"])
|
50
|
+
s.add_dependency(%q<webmock>, [">= 0"])
|
51
|
+
s.add_dependency(%q<chef>, [">= 0.10"])
|
52
|
+
s.add_dependency(%q<highline>, [">= 0"])
|
53
|
+
s.add_dependency(%q<archive-tar-minitar>, [">= 0.5.2"])
|
54
|
+
end
|
33
55
|
end
|
@@ -81,15 +81,9 @@ module Librarian
|
|
81
81
|
action.run
|
82
82
|
end
|
83
83
|
|
84
|
-
it "should sort
|
84
|
+
it "should sort and install the manifests" do
|
85
85
|
ManifestSet.should_receive(:sort).with(manifests).exactly(:once).ordered { sorted_manifests }
|
86
86
|
|
87
|
-
sorted_manifests.each do |manifest|
|
88
|
-
source = mock
|
89
|
-
manifest.stub(:source) { source }
|
90
|
-
source.should_receive(:cache!).with([manifest.name]).exactly(:once).ordered
|
91
|
-
end
|
92
|
-
|
93
87
|
install_path.stub(:exist?) { false }
|
94
88
|
install_path.should_receive(:mkpath).exactly(:once).ordered
|
95
89
|
|
@@ -100,7 +94,6 @@ module Librarian
|
|
100
94
|
|
101
95
|
it "should recreate the install path if it already exists" do
|
102
96
|
action.stub(:sorted_manifests) { sorted_manifests }
|
103
|
-
action.stub(:cache_manifests)
|
104
97
|
action.stub(:install_manifests)
|
105
98
|
|
106
99
|
install_path.stub(:exist?) { true }
|
@@ -0,0 +1,162 @@
|
|
1
|
+
require "librarian/helpers"
|
2
|
+
require "librarian/lockfile/parser"
|
3
|
+
require "librarian/mock"
|
4
|
+
|
5
|
+
module Librarian
|
6
|
+
describe Lockfile::Parser do
|
7
|
+
|
8
|
+
let(:env) { Mock::Environment.new }
|
9
|
+
let(:parser) { described_class.new(env) }
|
10
|
+
let(:resolution) { parser.parse(lockfile) }
|
11
|
+
|
12
|
+
context "a mock lockfile with one source and no dependencies" do
|
13
|
+
let(:lockfile) do
|
14
|
+
Helpers.strip_heredoc <<-LOCKFILE
|
15
|
+
MOCK
|
16
|
+
remote: source-a
|
17
|
+
specs:
|
18
|
+
|
19
|
+
DEPENDENCIES
|
20
|
+
|
21
|
+
LOCKFILE
|
22
|
+
end
|
23
|
+
|
24
|
+
it "should give an empty list of dependencies" do
|
25
|
+
resolution.dependencies.should be_empty
|
26
|
+
end
|
27
|
+
|
28
|
+
it "should give an empty list of manifests" do
|
29
|
+
resolution.manifests.should be_empty
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
context "a mock lockfile with one source and one dependency" do
|
34
|
+
let(:lockfile) do
|
35
|
+
Helpers.strip_heredoc <<-LOCKFILE
|
36
|
+
MOCK
|
37
|
+
remote: source-a
|
38
|
+
specs:
|
39
|
+
jelly (1.3.5)
|
40
|
+
|
41
|
+
DEPENDENCIES
|
42
|
+
jelly (!= 1.2.6, ~> 1.1)
|
43
|
+
|
44
|
+
LOCKFILE
|
45
|
+
end
|
46
|
+
|
47
|
+
it "should give a list of one dependency" do
|
48
|
+
resolution.should have(1).dependencies
|
49
|
+
end
|
50
|
+
|
51
|
+
it "should give a dependency with the expected name" do
|
52
|
+
dependency = resolution.dependencies.first
|
53
|
+
|
54
|
+
dependency.name.should == "jelly"
|
55
|
+
end
|
56
|
+
|
57
|
+
it "should give a dependency with the expected requirement" do
|
58
|
+
dependency = resolution.dependencies.first
|
59
|
+
|
60
|
+
# Note: it must be this order because this order is lexicographically sorted.
|
61
|
+
dependency.requirement.to_s.should == "!= 1.2.6, ~> 1.1"
|
62
|
+
end
|
63
|
+
|
64
|
+
it "should give a dependency wth the expected source" do
|
65
|
+
dependency = resolution.dependencies.first
|
66
|
+
source = dependency.source
|
67
|
+
|
68
|
+
source.name.should == "source-a"
|
69
|
+
end
|
70
|
+
|
71
|
+
it "should give a list of one manifest" do
|
72
|
+
resolution.should have(1).manifests
|
73
|
+
end
|
74
|
+
|
75
|
+
it "should give a manifest with the expected name" do
|
76
|
+
manifest = resolution.manifests.first
|
77
|
+
|
78
|
+
manifest.name.should == "jelly"
|
79
|
+
end
|
80
|
+
|
81
|
+
it "should give a manifest with the expected version" do
|
82
|
+
manifest = resolution.manifests.first
|
83
|
+
|
84
|
+
manifest.version.to_s.should == "1.3.5"
|
85
|
+
end
|
86
|
+
|
87
|
+
it "should give a manifest with no dependencies" do
|
88
|
+
manifest = resolution.manifests.first
|
89
|
+
|
90
|
+
manifest.dependencies.should be_empty
|
91
|
+
end
|
92
|
+
|
93
|
+
it "should give a manifest with the expected source" do
|
94
|
+
manifest = resolution.manifests.first
|
95
|
+
source = manifest.source
|
96
|
+
|
97
|
+
source.name.should == "source-a"
|
98
|
+
end
|
99
|
+
|
100
|
+
it "should give the dependency and the manifest the same source instance" do
|
101
|
+
dependency = resolution.dependencies.first
|
102
|
+
manifest = resolution.manifests.first
|
103
|
+
|
104
|
+
dependency_source = dependency.source
|
105
|
+
manifest_source = manifest.source
|
106
|
+
|
107
|
+
manifest_source.should be dependency_source
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
context "a mock lockfile with one source and a complex dependency" do
|
112
|
+
let(:lockfile) do
|
113
|
+
Helpers.strip_heredoc <<-LOCKFILE
|
114
|
+
MOCK
|
115
|
+
remote: source-a
|
116
|
+
specs:
|
117
|
+
butter (2.5.3)
|
118
|
+
jelly (1.3.5)
|
119
|
+
butter (< 3, >= 1.1)
|
120
|
+
|
121
|
+
DEPENDENCIES
|
122
|
+
jelly (!= 1.2.6, ~> 1.1)
|
123
|
+
|
124
|
+
LOCKFILE
|
125
|
+
end
|
126
|
+
|
127
|
+
it "should give a list of one dependency" do
|
128
|
+
resolution.should have(1).dependencies
|
129
|
+
end
|
130
|
+
|
131
|
+
it "should have the expected dependency" do
|
132
|
+
dependency = resolution.dependencies.first
|
133
|
+
|
134
|
+
dependency.name.should == "jelly"
|
135
|
+
end
|
136
|
+
|
137
|
+
it "should give a list of all the manifests" do
|
138
|
+
resolution.should have(2).manifests
|
139
|
+
end
|
140
|
+
|
141
|
+
it "should include all the expected manifests" do
|
142
|
+
manifests = ManifestSet.new(resolution.manifests)
|
143
|
+
|
144
|
+
manifests.to_hash.keys.should =~ %w(butter jelly)
|
145
|
+
end
|
146
|
+
|
147
|
+
it "should have an internally consistent set of manifests" do
|
148
|
+
manifests = ManifestSet.new(resolution.manifests)
|
149
|
+
|
150
|
+
manifests.should be_consistent
|
151
|
+
end
|
152
|
+
|
153
|
+
it "should have an externally consistent set of manifests" do
|
154
|
+
dependencies = resolution.dependencies
|
155
|
+
manifests = ManifestSet.new(resolution.manifests)
|
156
|
+
|
157
|
+
manifests.should be_in_compliance_with dependencies
|
158
|
+
end
|
159
|
+
end
|
160
|
+
|
161
|
+
end
|
162
|
+
end
|
File without changes
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: librarian
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.23
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-05-
|
12
|
+
date: 2012-05-14 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: thor
|
16
|
-
requirement: &
|
16
|
+
requirement: &9010000 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ~>
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: '0.15'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *9010000
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: rake
|
27
|
-
requirement: &
|
27
|
+
requirement: &9008640 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ! '>='
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: '0'
|
33
33
|
type: :development
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *9008640
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: rspec
|
38
|
-
requirement: &
|
38
|
+
requirement: &9006600 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ! '>='
|
@@ -43,10 +43,10 @@ dependencies:
|
|
43
43
|
version: '0'
|
44
44
|
type: :development
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *9006600
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: cucumber
|
49
|
-
requirement: &
|
49
|
+
requirement: &9004980 !ruby/object:Gem::Requirement
|
50
50
|
none: false
|
51
51
|
requirements:
|
52
52
|
- - ! '>='
|
@@ -54,10 +54,10 @@ dependencies:
|
|
54
54
|
version: '0'
|
55
55
|
type: :development
|
56
56
|
prerelease: false
|
57
|
-
version_requirements: *
|
57
|
+
version_requirements: *9004980
|
58
58
|
- !ruby/object:Gem::Dependency
|
59
59
|
name: aruba
|
60
|
-
requirement: &
|
60
|
+
requirement: &9003760 !ruby/object:Gem::Requirement
|
61
61
|
none: false
|
62
62
|
requirements:
|
63
63
|
- - ! '>='
|
@@ -65,10 +65,10 @@ dependencies:
|
|
65
65
|
version: '0'
|
66
66
|
type: :development
|
67
67
|
prerelease: false
|
68
|
-
version_requirements: *
|
68
|
+
version_requirements: *9003760
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: webmock
|
71
|
-
requirement: &
|
71
|
+
requirement: &8997140 !ruby/object:Gem::Requirement
|
72
72
|
none: false
|
73
73
|
requirements:
|
74
74
|
- - ! '>='
|
@@ -76,10 +76,10 @@ dependencies:
|
|
76
76
|
version: '0'
|
77
77
|
type: :development
|
78
78
|
prerelease: false
|
79
|
-
version_requirements: *
|
79
|
+
version_requirements: *8997140
|
80
80
|
- !ruby/object:Gem::Dependency
|
81
81
|
name: chef
|
82
|
-
requirement: &
|
82
|
+
requirement: &8956960 !ruby/object:Gem::Requirement
|
83
83
|
none: false
|
84
84
|
requirements:
|
85
85
|
- - ! '>='
|
@@ -87,10 +87,10 @@ dependencies:
|
|
87
87
|
version: '0.10'
|
88
88
|
type: :runtime
|
89
89
|
prerelease: false
|
90
|
-
version_requirements: *
|
90
|
+
version_requirements: *8956960
|
91
91
|
- !ruby/object:Gem::Dependency
|
92
92
|
name: highline
|
93
|
-
requirement: &
|
93
|
+
requirement: &8951000 !ruby/object:Gem::Requirement
|
94
94
|
none: false
|
95
95
|
requirements:
|
96
96
|
- - ! '>='
|
@@ -98,10 +98,10 @@ dependencies:
|
|
98
98
|
version: '0'
|
99
99
|
type: :runtime
|
100
100
|
prerelease: false
|
101
|
-
version_requirements: *
|
101
|
+
version_requirements: *8951000
|
102
102
|
- !ruby/object:Gem::Dependency
|
103
103
|
name: archive-tar-minitar
|
104
|
-
requirement: &
|
104
|
+
requirement: &8947440 !ruby/object:Gem::Requirement
|
105
105
|
none: false
|
106
106
|
requirements:
|
107
107
|
- - ! '>='
|
@@ -109,7 +109,7 @@ dependencies:
|
|
109
109
|
version: 0.5.2
|
110
110
|
type: :runtime
|
111
111
|
prerelease: false
|
112
|
-
version_requirements: *
|
112
|
+
version_requirements: *8947440
|
113
113
|
description: Librarian
|
114
114
|
email:
|
115
115
|
- y_feldblum@yahoo.com
|
@@ -203,10 +203,11 @@ files:
|
|
203
203
|
- spec/unit/dependency_spec.rb
|
204
204
|
- spec/unit/dsl_spec.rb
|
205
205
|
- spec/unit/environment_spec.rb
|
206
|
+
- spec/unit/lockfile/parser_spec.rb
|
206
207
|
- spec/unit/lockfile_spec.rb
|
207
208
|
- spec/unit/manifest_set_spec.rb
|
208
209
|
- spec/unit/manifest_spec.rb
|
209
|
-
- spec/unit/mock/source/
|
210
|
+
- spec/unit/mock/source/mock_spec.rb
|
210
211
|
- spec/unit/resolver_spec.rb
|
211
212
|
- spec/unit/source/git_spec.rb
|
212
213
|
- spec/unit/spec_change_set_spec.rb
|
@@ -222,18 +223,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
222
223
|
- - ! '>='
|
223
224
|
- !ruby/object:Gem::Version
|
224
225
|
version: '0'
|
225
|
-
segments:
|
226
|
-
- 0
|
227
|
-
hash: -1509747376632430187
|
228
226
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
229
227
|
none: false
|
230
228
|
requirements:
|
231
229
|
- - ! '>='
|
232
230
|
- !ruby/object:Gem::Version
|
233
231
|
version: '0'
|
234
|
-
segments:
|
235
|
-
- 0
|
236
|
-
hash: -1509747376632430187
|
237
232
|
requirements: []
|
238
233
|
rubyforge_project: librarian
|
239
234
|
rubygems_version: 1.8.17
|
@@ -241,3 +236,4 @@ signing_key:
|
|
241
236
|
specification_version: 3
|
242
237
|
summary: Librarian
|
243
238
|
test_files: []
|
239
|
+
has_rdoc:
|