puppet-library 0.10.0 → 0.11.0

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 (58) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.yml +11 -0
  3. data/README.md +16 -7
  4. data/Rakefile +21 -21
  5. data/TODO.yml +10 -6
  6. data/bin/puppet-library +0 -1
  7. data/config.ru +14 -16
  8. data/features/step_definitions/sinatra_steps.rb +3 -12
  9. data/lib/puppet_library/forge.rb +1 -0
  10. data/lib/puppet_library/forge/abstract.rb +2 -1
  11. data/lib/puppet_library/forge/cache.rb +11 -7
  12. data/lib/puppet_library/forge/directory.rb +15 -13
  13. data/lib/puppet_library/forge/forge.rb +25 -0
  14. data/lib/puppet_library/forge/git_repository.rb +42 -17
  15. data/lib/puppet_library/forge/multi.rb +11 -1
  16. data/lib/puppet_library/forge/proxy.rb +14 -9
  17. data/lib/puppet_library/forge/source.rb +12 -13
  18. data/lib/puppet_library/http/cache/disk.rb +26 -8
  19. data/lib/puppet_library/http/cache/in_memory.rb +13 -10
  20. data/lib/puppet_library/http/cache/noop.rb +4 -1
  21. data/lib/puppet_library/puppet_library.rb +10 -7
  22. data/lib/puppet_library/puppet_module/modulefile.rb +5 -1
  23. data/lib/puppet_library/server.rb +13 -9
  24. data/lib/puppet_library/util.rb +1 -0
  25. data/lib/puppet_library/util/config_api.rb +115 -0
  26. data/lib/puppet_library/util/git.rb +36 -8
  27. data/lib/puppet_library/util/logging.rb +49 -0
  28. data/lib/puppet_library/util/patches.rb +21 -0
  29. data/lib/puppet_library/util/temp_dir.rb +20 -5
  30. data/lib/puppet_library/version.rb +1 -1
  31. data/puppet-library.gemspec +2 -0
  32. data/spec/archive/archive_reader_spec.rb +2 -6
  33. data/spec/archive/archiver_spec.rb +5 -9
  34. data/spec/forge/cache_spec.rb +13 -7
  35. data/spec/forge/directory_spec.rb +31 -18
  36. data/spec/forge/git_repository_spec.rb +60 -13
  37. data/spec/forge/multi_spec.rb +16 -0
  38. data/spec/forge/proxy_spec.rb +18 -0
  39. data/spec/forge/source_spec.rb +14 -9
  40. data/spec/http/cache/disk_spec.rb +11 -6
  41. data/spec/http/cache/in_memory_spec.rb +12 -0
  42. data/spec/http/cache/noop_spec.rb +6 -0
  43. data/spec/integration_test_helper.rb +3 -3
  44. data/spec/module_spec_helper.rb +2 -2
  45. data/spec/puppet_library_spec.rb +34 -16
  46. data/spec/puppet_module/modulefile_spec.rb +48 -9
  47. data/spec/server_spec.rb +28 -1
  48. data/spec/spec_helper.rb +2 -14
  49. data/spec/util/config_api_spec.rb +77 -0
  50. data/spec/util/git_spec.rb +20 -20
  51. data/spec/util/patches_spec.rb +18 -0
  52. data/test/directory_forge_integration_test.rb +6 -8
  53. data/test/offline_git_repo_forge_integration_test.rb +9 -14
  54. data/test/offline_proxy_forge_integration_test.rb +11 -14
  55. data/test/online_git_repo_forge_integration_test.rb +7 -8
  56. data/test/online_proxy_forge_integration_test.rb +10 -13
  57. data/test/source_forge_integration_test.rb +7 -8
  58. metadata +35 -2
@@ -24,10 +24,29 @@ module PuppetLibrary
24
24
  include Rack::Test::Methods
25
25
 
26
26
  let(:forge) { double(Forge) }
27
- let(:app) do
27
+ let :app do
28
+ allow(forge).to receive(:prime)
28
29
  Server.new(forge)
29
30
  end
30
31
 
32
+ describe "#new" do
33
+ it "primes the repositories" do
34
+ expect(forge).to receive(:prime)
35
+ app
36
+ end
37
+ end
38
+
39
+ describe "#configure" do
40
+ it "exposes a configuration API" do
41
+ repo_path = "."
42
+ Server.configure do
43
+ forge :directory do
44
+ path repo_path # make sure our API keeps the block's scope
45
+ end
46
+ end
47
+ end
48
+ end
49
+
31
50
  describe "GET /" do
32
51
  it "lists all the modules" do
33
52
  modules = [
@@ -78,6 +97,14 @@ module PuppetLibrary
78
97
  end
79
98
  end
80
99
 
100
+ describe "POST /api/forge/clear-cache" do
101
+ it "clears the forges' caches" do
102
+ expect(forge).to receive(:clear_cache)
103
+
104
+ post "/api/forge/clear-cache"
105
+ end
106
+ end
107
+
81
108
  describe "GET /modules.json" do
82
109
  it "renders the search result as JSON" do
83
110
  search_results = [
@@ -24,21 +24,9 @@ require 'tempfile'
24
24
  require 'fileutils'
25
25
 
26
26
  include FileUtils
27
+ Tempdir = PuppetLibrary::Util::TempDir
27
28
 
28
- class Tempdir
29
- attr_reader :path
30
-
31
- def self.create(name)
32
- Tempdir.new(name).path
33
- end
34
-
35
- def initialize(name)
36
- file = Tempfile.new(name)
37
- @path = file.path
38
- file.unlink
39
- FileUtils.mkdir @path
40
- end
41
- end
29
+ ENV["TESTING"] = "true"
42
30
 
43
31
  class Tgz
44
32
  def initialize(buffer)
@@ -0,0 +1,77 @@
1
+ # Puppet Library
2
+ # Copyright (C) 2014 drrb
3
+ #
4
+ # This program is free software: you can redistribute it and/or modify
5
+ # it under the terms of the GNU General Public License as published by
6
+ # the Free Software Foundation, either version 3 of the License, or
7
+ # (at your option) any later version.
8
+ #
9
+ # This program is distributed in the hope that it will be useful,
10
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
+ # GNU General Public License for more details.
13
+ #
14
+ # You should have received a copy of the GNU General Public License
15
+ # along with this program. If not, see <http://www.gnu.org/licenses/>.
16
+
17
+ require 'spec_helper'
18
+
19
+ module PuppetLibrary::Util
20
+ describe ConfigApi do
21
+ describe "#for" do
22
+ it "creates a config API" do
23
+ api = ConfigApi.for(self.class) do
24
+ required :name, "String"
25
+ end
26
+
27
+ config = api.configure do
28
+ name "Dave"
29
+ end
30
+
31
+ expect(config.get_name).to eq "Dave"
32
+ end
33
+
34
+ it "sees the block's scope" do
35
+ api = ConfigApi.for(self.class) do
36
+ required :name, "String"
37
+ end
38
+
39
+ daves_name = "Dave"
40
+ config = api.configure do
41
+ name daves_name
42
+ end
43
+
44
+ expect(config.get_name).to eq "Dave"
45
+ end
46
+
47
+ context "when a required parameter is missing" do
48
+ it "throws an exception" do
49
+ api = ConfigApi.for(self.class) do
50
+ required :name, "String"
51
+ end
52
+
53
+ expect {
54
+ api.configure do
55
+ end
56
+ }.to raise_error /name/
57
+ end
58
+ end
59
+
60
+ context "when a parameter isn't valid, according to its validator" do
61
+ it "throws an exception" do
62
+ api = ConfigApi.for(self.class) do
63
+ required :name, "String" do |value|
64
+ raise "Invalid!"
65
+ end
66
+ end
67
+
68
+ expect {
69
+ api.configure do
70
+ name "Dave"
71
+ end
72
+ }.to raise_error /Invalid!/
73
+ end
74
+ end
75
+ end
76
+ end
77
+ end
@@ -18,12 +18,12 @@ require 'spec_helper'
18
18
 
19
19
  module PuppetLibrary::Util
20
20
  describe Git do
21
- @@repo_path = Tempdir.create("git-repo")
21
+ @@repo_dir = Tempdir.new("git-repo")
22
22
  @@tags = [ "0.9.0", "1.0.0-rc1", "1.0.0", "xxx" ]
23
23
 
24
24
  before :all do
25
25
  def git(command)
26
- git_command = "git --git-dir=#{@@repo_path}/.git --work-tree=#{@@repo_path} #{command}"
26
+ git_command = "git --git-dir=#{@@repo_dir.path}/.git --work-tree=#{@@repo_dir.path} #{command}"
27
27
  `#{git_command}`
28
28
  unless $?.success?
29
29
  raise "Failed to run command: \"#{git_command}\""
@@ -34,7 +34,7 @@ module PuppetLibrary::Util
34
34
  git "config user.name tester"
35
35
  git "config user.email tester@example.com"
36
36
  @@tags.each do |tag|
37
- File.open(File.join(@@repo_path, "Modulefile"), "w") do |modulefile|
37
+ File.open(File.join(@@repo_dir.path, "Modulefile"), "w") do |modulefile|
38
38
  modulefile.write <<-MODULEFILE
39
39
  name 'puppetlabs-apache'
40
40
  version '#{tag}'
@@ -47,15 +47,15 @@ module PuppetLibrary::Util
47
47
  end
48
48
  end
49
49
 
50
- after :all do
51
- rm_rf @@repo_path
52
- end
53
-
54
- let(:git) { Git.new(@@repo_path, cache_path) }
55
- let(:cache_path) { Tempdir.create("git-cache") }
50
+ let(:git) { Git.new(@@repo_dir.path, cache_dir) }
51
+ let(:cache_dir) { Tempdir.new("git-cache") }
56
52
 
57
- after do
58
- git.clear_cache!
53
+ context "when a git command returns nonzero" do
54
+ it "raises an error" do
55
+ expect {
56
+ git.read_file("nonexistant.file", "0.9.0")
57
+ }.to raise_error /Error running Git command/
58
+ end
59
59
  end
60
60
 
61
61
  describe "#tags" do
@@ -82,17 +82,17 @@ module PuppetLibrary::Util
82
82
  it "clones the git repository to the cache directory" do
83
83
  git.update_cache!
84
84
 
85
- expect(`git --git-dir #{cache_path}/.git remote -v`).to include @@repo_path
85
+ expect(`git --git-dir #{cache_dir.path}/.git remote -v`).to include @@repo_dir.path
86
86
  end
87
87
 
88
88
  it "creates Git's .git/FETCH_HEAD file so that we know that the cache was recently created" do
89
89
  git.update_cache!
90
90
 
91
- expect(File.exist?(File.join(cache_path, ".git", "FETCH_HEAD"))).to be_true
91
+ expect(File.exist?(File.join(cache_dir.path, ".git", "FETCH_HEAD"))).to be_true
92
92
  end
93
93
 
94
94
  it "copes with a missing .git/FETCH_HEAD file" do
95
- fetch_file = File.join(cache_path, ".git", "FETCH_HEAD")
95
+ fetch_file = File.join(cache_dir.path, ".git", "FETCH_HEAD")
96
96
  git.update_cache!
97
97
  rm fetch_file
98
98
 
@@ -103,7 +103,7 @@ module PuppetLibrary::Util
103
103
 
104
104
  it "doesn't update the cache if it was recently updated" do
105
105
  git.update_cache!
106
- new_head = Dir.chdir(@@repo_path) do
106
+ new_head = Dir.chdir(@@repo_dir.path) do
107
107
  touch "xxx"
108
108
  `git add xxx`
109
109
  `git commit --message='Added file'`
@@ -112,13 +112,13 @@ module PuppetLibrary::Util
112
112
 
113
113
  git.update_cache!
114
114
 
115
- expect(`git --git-dir #{cache_path}/.git rev-parse HEAD`).not_to eq new_head
115
+ expect(`git --git-dir #{cache_dir.path}/.git rev-parse HEAD`).not_to eq new_head
116
116
  end
117
117
 
118
118
  it "updates the cache if it's been long enough" do
119
119
  git.update_cache!
120
- git = Git.new(@@repo_path, cache_path, 0) # zero second cache TTL
121
- new_head = Dir.chdir(@@repo_path) do
120
+ git = Git.new(@@repo_dir.path, cache_dir, 0) # zero second cache TTL
121
+ new_head = Dir.chdir(@@repo_dir.path) do
122
122
  touch "xxx"
123
123
  `git add xxx`
124
124
  `git commit --message='Added file'`
@@ -127,7 +127,7 @@ module PuppetLibrary::Util
127
127
 
128
128
  git.update_cache!
129
129
 
130
- expect(`git --git-dir #{cache_path}/.git rev-parse HEAD`).to eq new_head
130
+ expect(`git --git-dir #{cache_dir.path}/.git rev-parse HEAD`).to eq new_head
131
131
  end
132
132
  end
133
133
 
@@ -136,7 +136,7 @@ module PuppetLibrary::Util
136
136
  git.update_cache!
137
137
  git.clear_cache!
138
138
 
139
- expect(File.exist? cache_path).to be_false
139
+ expect(File.exist? cache_dir.path).to be_false
140
140
  end
141
141
  end
142
142
  end
@@ -82,5 +82,23 @@ describe 'patches' do
82
82
  expect(["1.10.0-badprerelease", "1.3", "1.10.0", "xxx", "1.10.0.rc1", "1.2.0"].version_sort).to eq ["xxx", "1.2.0", "1.3", "1.10.0-badprerelease", "1.10.0.rc1", "1.10.0"]
83
83
  end
84
84
  end
85
+
86
+ describe "#each_in_parallel" do
87
+ it "does something to each in parallel" do
88
+ array = [ "a", "b", "c" ]
89
+ array.each_in_parallel &:upcase!
90
+
91
+ expect(array).to eq [ "A", "B", "C" ]
92
+ end
93
+ end
94
+ end
95
+
96
+ describe String do
97
+ describe "#snake_case_to_camel_case" do
98
+ it "converts snake case to camel case" do
99
+ camelized = "my_variable_name".snake_case_to_camel_case
100
+ expect(camelized).to eq "MyVariableName"
101
+ end
102
+ end
85
103
  end
86
104
  end
@@ -24,13 +24,13 @@ module PuppetLibrary
24
24
  include ModuleSpecHelper
25
25
 
26
26
  let(:port) { Ports.next! }
27
- let(:module_dir) { Tempdir.create("module_dir") }
28
- let(:project_dir) { Tempdir.create("project_dir") }
27
+ let(:module_dir) { Tempdir.new("module_dir") }
28
+ let(:project_dir) { Tempdir.new("project_dir") }
29
29
  let(:start_dir) { pwd }
30
30
  let(:disk_server) do
31
- Server.configure do |server|
32
- server.forge Forge::Directory do |forge|
33
- forge.path = module_dir
31
+ Server.configure do
32
+ forge :directory do
33
+ path module_dir.path
34
34
  end
35
35
  end
36
36
  end
@@ -55,12 +55,10 @@ module PuppetLibrary
55
55
  # Start the servers
56
56
  disk_server_runner
57
57
  start_dir
58
- cd project_dir
58
+ cd project_dir.path
59
59
  end
60
60
 
61
61
  after do
62
- rm_rf module_dir
63
- rm_rf project_dir
64
62
  cd start_dir
65
63
  end
66
64
 
@@ -21,13 +21,13 @@ require 'open-uri'
21
21
 
22
22
  module PuppetLibrary
23
23
  describe "offline git repo forge" do
24
- @@repo_path = Tempdir.create("git-repo")
24
+ @@repo_dir = Tempdir.new("git-repo")
25
25
  @@versions = [ "0.9.0", "1.0.0-rc1", "1.0.0" ]
26
26
  @@tags = @@versions + [ "xxx" ]
27
27
 
28
28
  before :all do
29
29
  def git(command)
30
- git_command = "git --git-dir=#{@@repo_path}/.git --work-tree=#{@@repo_path} #{command}"
30
+ git_command = "git --git-dir=#{@@repo_dir.path}/.git --work-tree=#{@@repo_dir.path} #{command}"
31
31
  `#{git_command}`
32
32
  unless $?.success?
33
33
  raise "Failed to run command: \"#{git_command}\""
@@ -38,7 +38,7 @@ module PuppetLibrary
38
38
  git "config user.name tester"
39
39
  git "config user.email tester@example.com"
40
40
  @@versions.zip(@@tags).each do |(version, tag)|
41
- File.open(File.join(@@repo_path, "Modulefile"), "w") do |modulefile|
41
+ File.open(File.join(@@repo_dir.path, "Modulefile"), "w") do |modulefile|
42
42
  modulefile.write <<-MODULEFILE
43
43
  name 'puppetlabs-apache'
44
44
  version '#{version}'
@@ -51,20 +51,16 @@ module PuppetLibrary
51
51
  end
52
52
  end
53
53
 
54
- after :all do
55
- rm_rf @@repo_path
56
- end
57
-
58
54
  include ModuleSpecHelper
59
55
 
60
56
  let(:port) { Ports.next! }
61
- let(:project_dir) { Tempdir.create("project_dir") }
57
+ let(:project_dir) { Tempdir.new("project_dir") }
62
58
  let(:start_dir) { pwd }
63
59
  let(:git_server) do
64
- Server.configure do |server|
65
- server.forge Forge::GitRepository do |forge|
66
- forge.source = @@repo_path
67
- forge.include_tags = /^[0-9.]+/
60
+ Server.configure do
61
+ forge :git_repository do
62
+ source @@repo_dir.path
63
+ include_tags /^[0-9.]+/
68
64
  end
69
65
  end
70
66
  end
@@ -89,11 +85,10 @@ module PuppetLibrary
89
85
  # Start the servers
90
86
  git_server_runner
91
87
  start_dir
92
- cd project_dir
88
+ cd project_dir.path
93
89
  end
94
90
 
95
91
  after do
96
- rm_rf project_dir
97
92
  cd start_dir
98
93
  end
99
94
 
@@ -25,14 +25,14 @@ module PuppetLibrary
25
25
 
26
26
  let(:proxy_port) { Ports.next! }
27
27
  let(:disk_port) { Ports.next! }
28
- let(:module_dir) { Tempdir.create("module_dir") }
29
- let(:project_dir) { Tempdir.create("project_dir") }
30
- let(:cache_dir) { Tempdir.create("cache_dir") }
28
+ let(:module_dir) { Tempdir.new("module_dir") }
29
+ let(:project_dir) { Tempdir.new("project_dir") }
30
+ let(:cache_dir) { Tempdir.new("cache_dir") }
31
31
  let(:start_dir) { pwd }
32
32
  let(:disk_server) do
33
- Server.configure do |server|
34
- server.forge Forge::Directory do |forge|
35
- forge.path = module_dir
33
+ Server.configure do
34
+ forge :directory do
35
+ path module_dir.path
36
36
  end
37
37
  end
38
38
  end
@@ -50,10 +50,10 @@ module PuppetLibrary
50
50
  end
51
51
  end
52
52
  let(:proxy_server) do
53
- Server.configure do |server|
54
- server.forge Forge::Cache do |forge|
55
- forge.url = "http://localhost:#{disk_port}"
56
- forge.path = cache_dir
53
+ Server.configure do
54
+ forge :cache do
55
+ url "http://localhost:#{disk_port}"
56
+ path cache_dir.path
57
57
  end
58
58
  end
59
59
  end
@@ -80,13 +80,10 @@ module PuppetLibrary
80
80
  disk_server_runner
81
81
  proxy_server_runner
82
82
  start_dir
83
- cd project_dir
83
+ cd project_dir.path
84
84
  end
85
85
 
86
86
  after do
87
- rm_rf module_dir
88
- rm_rf project_dir
89
- rm_rf cache_dir
90
87
  cd start_dir
91
88
  end
92
89
 
@@ -25,13 +25,13 @@ module PuppetLibrary
25
25
  include ModuleSpecHelper
26
26
 
27
27
  let(:port) { Ports.next! }
28
- let(:project_dir) { Tempdir.create("project_dir") }
28
+ let(:project_dir) { Tempdir.new("project_dir") }
29
29
  let(:start_dir) { pwd }
30
30
  let(:git_server) do
31
- Server.configure do |server|
32
- server.forge Forge::GitRepository do |forge|
33
- forge.source = "https://github.com/puppetlabs/puppetlabs-stdlib.git"
34
- forge.include_tags = /^[0-9.]+/
31
+ Server.configure do
32
+ forge :git_repository do
33
+ source "https://github.com/puppetlabs/puppetlabs-stdlib.git"
34
+ include_tags /^[0-9.]+/
35
35
  end
36
36
  end
37
37
  end
@@ -56,11 +56,10 @@ module PuppetLibrary
56
56
  # Start the servers
57
57
  git_server_runner
58
58
  start_dir
59
- cd project_dir
59
+ cd project_dir.path
60
60
  end
61
61
 
62
62
  after do
63
- rm_rf project_dir
64
63
  cd start_dir
65
64
  end
66
65
 
@@ -71,7 +70,7 @@ module PuppetLibrary
71
70
  EOF
72
71
 
73
72
  # Install modules
74
- system "librarian-puppet install" or fail "call to puppet-library failed"
73
+ system "librarian-puppet install --verbose" or fail "call to puppet-library failed"
75
74
  expect("stdlib").to be_installed
76
75
 
77
76
  # Search