puppet-library 0.10.0 → 0.11.0

Sign up to get free protection for your applications and to get access to all the features.
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