librarian 0.0.24 → 0.0.25

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.
Files changed (52) hide show
  1. data/.travis.yml +7 -1
  2. data/CHANGELOG.md +19 -1
  3. data/README.md +2 -9
  4. data/Rakefile +0 -11
  5. data/lib/librarian.rb +0 -8
  6. data/lib/librarian/action/base.rb +6 -4
  7. data/lib/librarian/chef/cli.rb +1 -1
  8. data/lib/librarian/chef/integration/knife.rb +4 -0
  9. data/lib/librarian/chef/manifest_reader.rb +14 -2
  10. data/lib/librarian/chef/source/local.rb +2 -0
  11. data/lib/librarian/chef/source/site.rb +49 -41
  12. data/lib/librarian/cli.rb +32 -17
  13. data/lib/librarian/dependency.rb +1 -9
  14. data/lib/librarian/dsl.rb +6 -3
  15. data/lib/librarian/dsl/receiver.rb +10 -12
  16. data/lib/librarian/dsl/target.rb +5 -10
  17. data/lib/librarian/environment.rb +41 -2
  18. data/lib/librarian/lockfile.rb +0 -4
  19. data/lib/librarian/lockfile/compiler.rb +0 -4
  20. data/lib/librarian/lockfile/parser.rb +0 -4
  21. data/lib/librarian/logger.rb +46 -0
  22. data/lib/librarian/manifest.rb +1 -9
  23. data/lib/librarian/resolution.rb +5 -3
  24. data/lib/librarian/resolver.rb +6 -1
  25. data/lib/librarian/resolver/implementation.rb +18 -8
  26. data/lib/librarian/source/git.rb +2 -0
  27. data/lib/librarian/source/git/repository.rb +9 -5
  28. data/lib/librarian/source/local.rb +12 -2
  29. data/lib/librarian/spec.rb +4 -4
  30. data/lib/librarian/spec_change_set.rb +7 -4
  31. data/lib/librarian/specfile.rb +3 -8
  32. data/lib/librarian/version.rb +1 -1
  33. data/librarian.gemspec +3 -9
  34. data/spec/functional/chef/cli_spec.rb +194 -0
  35. data/spec/functional/chef/source/site_spec.rb +11 -10
  36. data/spec/functional/source/git/repository_spec.rb +1 -1
  37. data/spec/support/cli_macro.rb +122 -0
  38. data/spec/support/with_env_macro.rb +20 -0
  39. data/spec/unit/config/database_spec.rb +2 -2
  40. data/spec/unit/dependency_spec.rb +6 -0
  41. data/spec/unit/dsl_spec.rb +16 -37
  42. data/spec/unit/environment_spec.rb +95 -0
  43. data/spec/unit/manifest_spec.rb +6 -0
  44. data/spec/unit/resolver_spec.rb +41 -0
  45. metadata +7 -42
  46. data/config/cucumber.yaml +0 -1
  47. data/features/chef/cli/init.feature +0 -11
  48. data/features/chef/cli/install.feature +0 -64
  49. data/features/chef/cli/show.feature +0 -77
  50. data/features/chef/cli/version.feature +0 -11
  51. data/features/support/env.rb +0 -9
  52. data/lib/librarian/helpers/debug.rb +0 -35
data/.travis.yml CHANGED
@@ -1,6 +1,12 @@
1
1
  language: ruby
2
+ script: rspec spec
2
3
  rvm:
3
4
  - 1.8.7
4
5
  - 1.9.2
5
6
  - 1.9.3
6
- - rbx
7
+ - rbx-18mode
8
+ - rbx-19mode
9
+ matrix:
10
+ allow_failures:
11
+ - rvm: rbx-18mode
12
+ - rvm: rbx-19mode
data/CHANGELOG.md CHANGED
@@ -1,5 +1,23 @@
1
1
  # Change Log
2
2
 
3
+ ## 0.0.25
4
+
5
+ * \#71. Fix an error, given certain locale settings, with reading cookbook
6
+ metadata files.
7
+
8
+ * \#89. Fix an error when encountering manifests and dependencies with names of
9
+ a single letter, such as `"R"`.
10
+
11
+ * \#92, \#99. HTTP proxy support via the `HTTP_PROXY` environment variable. Also
12
+ supports `HTTP_PROXY_USER` and `HTTP_PROXY_PASS` environment variables. Thanks
13
+ @tknerr.
14
+
15
+ * \#97. Enforce that the `:ref` option in the `:git` source may only be given a
16
+ string.
17
+
18
+ * \#98. Fix unpacking chef site-sourced packages where the directory in the
19
+ tarball does not match the cookbook name.
20
+
3
21
  ## 0.0.24
4
22
 
5
23
  * \#15. A remembered configuration system.
@@ -12,7 +30,7 @@
12
30
  * \#76. Support git annotated tags.
13
31
 
14
32
  * \#80. Ignore directories in the `PATH` named `git` when looking for the `git`
15
- bin.
33
+ bin. Thanks @avit.
16
34
 
17
35
  * \#85. Provide a helpful message when running the `show` command without a
18
36
  lockfile present.
data/README.md CHANGED
@@ -146,8 +146,8 @@ Prepare your infrastructure repository:
146
146
 
147
147
  $ cd ~/path/to/chef-repo
148
148
  $ git rm -r cookbooks
149
- $ echo cookbooks >> .gitignore
150
- $ echo tmp >> .gitignore
149
+ $ echo /cookbooks >> .gitignore
150
+ $ echo /tmp >> .gitignore
151
151
 
152
152
  Librarian-Chef takes over your `cookbooks/` directory, and will always reinstall
153
153
  the cookbooks listed the `Cheffile.lock` into your `cookbooks/` directory. Hence
@@ -359,12 +359,7 @@ How to Contribute
359
359
 
360
360
  ### Running the tests
361
361
 
362
- # Either
363
362
  $ rspec spec
364
- $ cucumber
365
-
366
- # Or
367
- $ rake
368
363
 
369
364
  You will probably need some way to isolate gems. Librarian provides a `Gemfile`,
370
365
  so if you want to use bundler, you can prepare the directory with the usual
@@ -372,8 +367,6 @@ so if you want to use bundler, you can prepare the directory with the usual
372
367
 
373
368
  $ bundle install
374
369
  $ bundle exec rspec spec
375
- $ bundle exec cucumber
376
- $ bundle exec rake
377
370
 
378
371
  ### Installing locally
379
372
 
data/Rakefile CHANGED
@@ -21,14 +21,3 @@ module Bundler
21
21
  end
22
22
 
23
23
  Bundler::GemHelper.install_tasks
24
-
25
- begin
26
- require 'rspec/core/rake_task'
27
- RSpec::Core::RakeTask.new(:spec)
28
-
29
- require 'cucumber/rake/task'
30
- Cucumber::Rake::Task.new(:features)
31
-
32
- task :default => [:spec, :features]
33
- rescue LoadError
34
- end
data/lib/librarian.rb CHANGED
@@ -8,12 +8,4 @@ module Librarian
8
8
  self::Environment
9
9
  end
10
10
 
11
- def environment
12
- @environment ||= environment_class.new
13
- end
14
-
15
- def version
16
- VERSION
17
- end
18
-
19
11
  end
@@ -1,11 +1,7 @@
1
- require "librarian/helpers/debug"
2
-
3
1
  module Librarian
4
2
  module Action
5
3
  class Base
6
4
 
7
- include Helpers::Debug
8
-
9
5
  attr_accessor :environment
10
6
  private :environment=
11
7
 
@@ -17,6 +13,12 @@ module Librarian
17
13
  self.options = options
18
14
  end
19
15
 
16
+ private
17
+
18
+ def debug(*args, &block)
19
+ environment.logger.debug(*args, &block)
20
+ end
21
+
20
22
  end
21
23
  end
22
24
  end
@@ -13,7 +13,6 @@ module Librarian
13
13
  end
14
14
  end
15
15
 
16
- include Particularity
17
16
  extend Particularity
18
17
 
19
18
  source_root Pathname.new(__FILE__).dirname.join("templates")
@@ -23,6 +22,7 @@ module Librarian
23
22
  end
24
23
 
25
24
  desc "install", "Resolves and installs all of the dependencies you specify."
25
+ option "quiet", :type => :boolean, :default => false
26
26
  option "verbose", :type => :boolean, :default => false
27
27
  option "line-numbers", :type => :boolean, :default => false
28
28
  option "clean", :type => :boolean, :default => false
@@ -24,6 +24,10 @@ module Librarian
24
24
  end
25
25
  end
26
26
 
27
+ def environment
28
+ @environment ||= environment_class.new
29
+ end
30
+
27
31
  def install_path
28
32
  environment.install_path
29
33
  end
@@ -16,8 +16,8 @@ module Librarian
16
16
 
17
17
  def read_manifest(name, manifest_path)
18
18
  case manifest_path.extname
19
- when ".json" then JSON.parse(manifest_path.read)
20
- when ".yml", ".yaml" then YAML.load(manifest_path.read)
19
+ when ".json" then JSON.parse(binread(manifest_path))
20
+ when ".yml", ".yaml" then YAML.load(binread(manifest_path))
21
21
  when ".rb" then compile_manifest(name, manifest_path.dirname)
22
22
  end
23
23
  end
@@ -42,6 +42,18 @@ module Librarian
42
42
  manifest["name"] == name
43
43
  end
44
44
 
45
+ private
46
+
47
+ if IO.respond_to?(:binread)
48
+ def binread(path)
49
+ path.binread
50
+ end
51
+ else
52
+ def binread(path)
53
+ path.read
54
+ end
55
+ end
56
+
45
57
  end
46
58
  end
47
59
  end
@@ -8,6 +8,8 @@ module Librarian
8
8
  def install!(manifest)
9
9
  manifest.source == self or raise ArgumentError
10
10
 
11
+ info { "Installing #{manifest.name} (#{manifest.version})" }
12
+
11
13
  debug { "Installing #{manifest}" }
12
14
 
13
15
  name, version = manifest.name, manifest.version
@@ -8,8 +8,6 @@ require 'zlib'
8
8
  require 'securerandom'
9
9
  require 'archive/tar/minitar'
10
10
 
11
- require 'librarian/helpers/debug'
12
-
13
11
  require 'librarian/chef/manifest_reader'
14
12
 
15
13
  module Librarian
@@ -17,12 +15,8 @@ module Librarian
17
15
  module Source
18
16
  class Site
19
17
 
20
- include Helpers::Debug
21
-
22
18
  class Line
23
19
 
24
- include Helpers::Debug
25
-
26
20
  attr_accessor :source, :name
27
21
  private :source=, :name=
28
22
 
@@ -238,39 +232,27 @@ module Librarian
238
232
  end
239
233
 
240
234
  def cache_remote_json!(path, uri)
241
- path = Pathname(path)
242
- uri = to_uri(uri)
243
-
244
- path.dirname.mkpath unless path.dirname.directory?
245
-
246
- debug { "Caching #{uri} to #{path}" }
247
-
248
- http = Net::HTTP.new(uri.host, uri.port)
249
- request = Net::HTTP::Get.new(uri.path)
250
- response = http.start{|http| http.request(request)}
251
- unless Net::HTTPSuccess === response
252
- raise Error, "Could not get #{uri} because #{response.code} #{response.message}!"
253
- end
254
- json = response.body
255
- JSON.parse(json) # verify that it's really JSON.
256
- write! path, json
235
+ cache_remote_object!(path, uri, :type => :json)
257
236
  end
258
237
 
259
- def cache_remote_object!(path, uri)
238
+ def cache_remote_object!(path, uri, options = { })
260
239
  path = Pathname(path)
261
240
  uri = to_uri(uri)
262
-
263
- path.dirname.mkpath unless path.dirname.directory?
241
+ type = options[:type]
264
242
 
265
243
  debug { "Caching #{uri} to #{path}" }
266
244
 
267
- http = Net::HTTP.new(uri.host, uri.port)
268
- request = Net::HTTP::Get.new(uri.path)
269
- response = http.start{|http| http.request(request)}
245
+ response = http_get(uri)
270
246
  unless Net::HTTPSuccess === response
271
247
  raise Error, "Could not get #{uri} because #{response.code} #{response.message}!"
272
248
  end
273
- write! path, response.body
249
+
250
+ object = response.body
251
+ case type
252
+ when :json
253
+ JSON.parse(object) # verify that it's really JSON.
254
+ end
255
+ write! path, object
274
256
  end
275
257
 
276
258
  def write!(path, bytes)
@@ -291,9 +273,11 @@ module Librarian
291
273
  end
292
274
 
293
275
  # 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)
276
+ # embedded in a subdirectory of the tarball.
277
+ subtemps = temp.children
278
+ subtemps.empty? and raise "The package archive was empty!"
279
+ subtemps.size > 1 and raise "The package archive has too many children!"
280
+ subtemp = subtemps.first
297
281
  debug { "Moving #{relative_path_to(subtemp)} to #{relative_path_to(path)}" }
298
282
  FileUtils.mv(subtemp, path)
299
283
  ensure
@@ -313,6 +297,26 @@ module Librarian
313
297
  uri
314
298
  end
315
299
 
300
+ def debug(*args, &block)
301
+ environment.logger.debug(*args, &block)
302
+ end
303
+
304
+ def relative_path_to(path)
305
+ environment.logger.relative_path_to(path)
306
+ end
307
+
308
+ def http(uri)
309
+ environment.net_http_class.new(uri.host, uri.port)
310
+ end
311
+
312
+ def http_get(uri)
313
+ http = http(uri)
314
+ request = Net::HTTP::Get.new(uri.path)
315
+ response = http.start{|http| http.request(request)}
316
+
317
+ response
318
+ end
319
+
316
320
  end
317
321
 
318
322
  class << self
@@ -337,18 +341,12 @@ module Librarian
337
341
 
338
342
  end
339
343
 
340
- attr_accessor :environment
341
- private :environment=
342
- attr_reader :uri
343
-
344
- attr_accessor :_metadata_cache
345
- private :_metadata_cache, :_metadata_cache=
344
+ attr_accessor :environment, :uri
345
+ private :environment=, :uri=
346
346
 
347
347
  def initialize(environment, uri, options = {})
348
348
  self.environment = environment
349
- @uri = uri
350
- @cache_path = nil
351
- self._metadata_cache = { }
349
+ self.uri = uri
352
350
  end
353
351
 
354
352
  def to_s
@@ -384,6 +382,8 @@ module Librarian
384
382
  install_path = install_path(name)
385
383
  line = line(name)
386
384
 
385
+ info { "Installing #{manifest.name} (#{manifest.version})" }
386
+
387
387
  debug { "Installing #{manifest}" }
388
388
 
389
389
  line.install_version! version, install_path
@@ -428,6 +428,14 @@ module Librarian
428
428
  @line[name] ||= Line.new(self, name)
429
429
  end
430
430
 
431
+ def info(*args, &block)
432
+ environment.logger.info(*args, &block)
433
+ end
434
+
435
+ def debug(*args, &block)
436
+ environment.logger.debug(*args, &block)
437
+ end
438
+
431
439
  end
432
440
  end
433
441
  end
data/lib/librarian/cli.rb CHANGED
@@ -6,8 +6,6 @@ require 'librarian/error'
6
6
  require 'librarian/action'
7
7
  require "librarian/ui"
8
8
 
9
- require "librarian/helpers/debug"
10
-
11
9
  module Librarian
12
10
  class Cli < Thor
13
11
 
@@ -21,31 +19,40 @@ module Librarian
21
19
  end
22
20
  end
23
21
 
24
- include Particularity
25
22
  extend Particularity
26
23
 
27
- include Helpers::Debug
28
-
29
24
  class << self
30
25
  def bin!
31
- begin
32
- environment = root_module.environment
33
- start
34
- rescue Librarian::Error => e
35
- environment.ui.error e.message
36
- environment.ui.debug e.backtrace.join("\n")
37
- exit (e.respond_to?(:status_code) ? e.status_code : 1)
38
- rescue Interrupt => e
39
- environment.ui.error "\nQuitting..."
40
- exit 1
26
+ with_environment do |environment|
27
+ begin
28
+ start
29
+ rescue Librarian::Error => e
30
+ environment.ui.error e.message
31
+ environment.ui.debug e.backtrace.join("\n")
32
+ exit (e.respond_to?(:status_code) ? e.status_code : 1)
33
+ rescue Interrupt => e
34
+ environment.ui.error "\nQuitting..."
35
+ exit 1
36
+ end
41
37
  end
42
38
  end
39
+
40
+ attr_accessor :environment
41
+
42
+ def with_environment
43
+ environment = root_module.environment_class.new
44
+ self.environment, orig_environment = environment, self.environment
45
+ yield(environment)
46
+ ensure
47
+ self.environment = orig_environment
48
+ end
43
49
  end
44
50
 
45
51
  def initialize(*)
46
52
  super
47
53
  the_shell = (options["no-color"] ? Thor::Shell::Basic.new : shell)
48
54
  environment.ui = UI::Shell.new(the_shell)
55
+ environment.ui.be_quiet! if options["quiet"]
49
56
  environment.ui.debug! if options["verbose"]
50
57
  environment.ui.debug_line_numbers! if options["verbose"] && options["line-numbers"]
51
58
 
@@ -54,7 +61,7 @@ module Librarian
54
61
 
55
62
  desc "version", "Displays the version."
56
63
  def version
57
- say "librarian-#{root_module.version}"
64
+ say "librarian-#{environment.version}"
58
65
  end
59
66
 
60
67
  desc "config", "Show or edit the config."
@@ -145,7 +152,7 @@ module Librarian
145
152
  private
146
153
 
147
154
  def environment
148
- root_module.environment
155
+ self.class.environment
149
156
  end
150
157
 
151
158
  def ensure!(options = { })
@@ -196,5 +203,13 @@ module Librarian
196
203
  end
197
204
  end
198
205
 
206
+ def debug(*args, &block)
207
+ environment.logger.debug(*args, &block)
208
+ end
209
+
210
+ def relative_path_to(path)
211
+ environment.logger.relative_path_to(path)
212
+ end
213
+
199
214
  end
200
215
  end