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
@@ -18,16 +18,17 @@ require 'spec_helper'
18
18
 
19
19
  module PuppetLibrary::Forge
20
20
  describe GitRepository do
21
- @@repo_path = Tempdir.create("git-repo")
22
- @@versions = [ "0.9.0", "1.0.0-rc1", "1.0.0" ]
23
- @@tags = @@versions + [ "xxx" ]
21
+ @@repo_dir = Tempdir.new("git-repo")
22
+ @@versions = [ "0.1.0", "0.9.0", "1.0.0-rc1", "1.0.0" ]
23
+ @@tags = @@versions.map {|version| "v#{version}"} + [ "xxx" ]
24
24
 
25
25
  before :all do
26
26
  def git(command)
27
- git_command = "git --git-dir=#{@@repo_path}/.git --work-tree=#{@@repo_path} #{command}"
28
- `#{git_command}`
29
- unless $?.success?
30
- raise "Failed to run command: \"#{git_command}\""
27
+ git_command = "git --git-dir=#{@@repo_dir.path}/.git --work-tree=#{@@repo_dir.path} #{command}"
28
+ pid, stdin, stdout, stderr = Open4.popen4(git_command)
29
+ ignored, status = Process::waitpid2 pid
30
+ unless status.success?
31
+ raise "Error running Git command: #{git_command}\n#{stdout.read}\n#{stderr.read}"
31
32
  end
32
33
  end
33
34
 
@@ -35,26 +36,66 @@ module PuppetLibrary::Forge
35
36
  git "config user.name tester"
36
37
  git "config user.email tester@example.com"
37
38
  @@versions.zip(@@tags).each do |(version, tag)|
38
- File.open(File.join(@@repo_path, "Modulefile"), "w") do |modulefile|
39
+ # Add some changes for the version
40
+ change_file_path = File.join(@@repo_dir.path, "changes.txt")
41
+ File.open(change_file_path, "a") do |change_file|
42
+ change_file.puts "Version #{version}"
43
+ end
44
+
45
+ # Update the module file
46
+ modulefile_path = File.join(@@repo_dir.path, "Modulefile")
47
+ File.open(modulefile_path, "w") do |modulefile|
39
48
  modulefile.write <<-MODULEFILE
40
49
  name 'puppetlabs-apache'
41
50
  version '#{version}'
42
51
  author 'puppetlabs'
43
52
  MODULEFILE
44
53
  end
54
+
55
+ # A dodgy early version with no modulefile
56
+ File.delete modulefile_path if version == "0.1.0"
45
57
  git "add ."
46
58
  git "commit --message='Version #{version}'"
47
59
  git "tag #{tag}"
48
60
  end
49
61
  end
50
62
 
51
- after :all do
52
- rm_rf @@repo_path
63
+ let :forge do
64
+ cache_dir = Tempdir.new("git-repo-cache")
65
+ git = PuppetLibrary::Util::Git.new(@@repo_dir.path, cache_dir)
66
+ GitRepository.new(git, /[0-9.]+/)
67
+ end
68
+
69
+ describe "#configure" do
70
+ it "exposes a configuration API" do
71
+ forge = GitRepository.configure do
72
+ source @@repo_dir.path
73
+ include_tags /v123/
74
+ end
75
+ expect(forge.instance_eval "@version_tag_regex").to eq /v123/
76
+ end
77
+ end
78
+
79
+ describe "#prime" do
80
+ it "creates the repo cache" do
81
+ git = double('git')
82
+ forge = GitRepository.new(git, //)
83
+
84
+ expect(git).to receive(:update_cache!)
85
+
86
+ forge.prime
87
+ end
53
88
  end
54
89
 
55
- let(:forge) { GitRepository.new(@@repo_path, /[0-9.]+/) }
56
- after do
57
- forge.destroy!
90
+ describe "#clear_cache" do
91
+ it "deletes the repo cache" do
92
+ git = double('git')
93
+ forge = GitRepository.new(git, //)
94
+
95
+ expect(git).to receive(:clear_cache!)
96
+
97
+ forge.clear_cache
98
+ end
58
99
  end
59
100
 
60
101
  describe "#get_module" do
@@ -123,6 +164,12 @@ module PuppetLibrary::Forge
123
164
  expect(metadata.first["name"]).to eq "puppetlabs-apache"
124
165
  expect(metadata.first["version"]).to eq "0.9.0"
125
166
  end
167
+
168
+ it "doesn't include versions with no Modulefile" do
169
+ metadata = forge.get_all_metadata
170
+ dodgy_version = metadata.find {|m| m["version"] == "0.1.0" }
171
+ expect(dodgy_version).to be_nil
172
+ end
126
173
  end
127
174
  end
128
175
  end
@@ -38,6 +38,22 @@ module PuppetLibrary::Forge
38
38
  return forge
39
39
  end
40
40
 
41
+ describe "#prime" do
42
+ it "primes the subforges" do
43
+ expect(subforge_one).to receive(:prime)
44
+ expect(subforge_two).to receive(:prime)
45
+ multi_forge.prime
46
+ end
47
+ end
48
+
49
+ describe "#clear_cache" do
50
+ it "clears the subforges' caches" do
51
+ expect(subforge_one).to receive(:clear_cache)
52
+ expect(subforge_two).to receive(:clear_cache)
53
+ multi_forge.clear_cache
54
+ end
55
+ end
56
+
41
57
  describe "#search_modules" do
42
58
  context "when no modules match in any subforge" do
43
59
  it "returns an empty array" do
@@ -24,6 +24,24 @@ module PuppetLibrary::Forge
24
24
  let(:download_cache) { PuppetLibrary::Http::Cache::InMemory.new }
25
25
  let(:forge) { Proxy.new("http://puppetforge.example.com", query_cache, download_cache, http_client) }
26
26
 
27
+ describe "#configure" do
28
+ it "exposes a configuration API" do
29
+ forge = Proxy.configure do
30
+ url "http://example.com"
31
+ end
32
+ expect(forge.instance_eval "@url").to eq "http://example.com"
33
+ end
34
+ end
35
+
36
+ describe "#clear_cache" do
37
+ it "clears the caches" do
38
+ expect(query_cache).to receive(:clear)
39
+ expect(download_cache).to receive(:clear)
40
+
41
+ forge.clear_cache
42
+ end
43
+ end
44
+
27
45
  describe "#search_modules" do
28
46
  it "forwards the request directly" do
29
47
  search_results = '["a","b","c"]'
@@ -18,8 +18,8 @@ require 'spec_helper'
18
18
 
19
19
  module PuppetLibrary::Forge
20
20
  describe Source do
21
- let(:module_dir) { Tempdir.create("module_dir") }
22
- let(:modulefile_path) { File.join(module_dir, "Modulefile") }
21
+ let(:module_dir) { Tempdir.new("module_dir") }
22
+ let(:modulefile_path) { File.join(module_dir.path, "Modulefile") }
23
23
  let(:forge) { Source.new(module_dir) }
24
24
 
25
25
  before do
@@ -28,10 +28,6 @@ module PuppetLibrary::Forge
28
28
  add_module_dependency! "puppetlabs", "concat", ">= 1.0.1"
29
29
  end
30
30
 
31
- after do
32
- rm_rf module_dir
33
- end
34
-
35
31
  def set_module!(author, name, version)
36
32
  File.open(modulefile_path, "w") do |modulefile|
37
33
  modulefile.puts <<-EOF
@@ -51,10 +47,19 @@ module PuppetLibrary::Forge
51
47
  end
52
48
  end
53
49
 
50
+ describe "#configure" do
51
+ it "exposes a configuration API" do
52
+ forge = Source.configure do
53
+ path module_dir.path
54
+ end
55
+ expect(forge.instance_eval "@module_dir.path").to eq module_dir.path
56
+ end
57
+ end
58
+
54
59
  describe "#initialize" do
55
60
  context "when the module directory doesn't exist" do
56
61
  before do
57
- rm_rf module_dir
62
+ rm_rf module_dir.path
58
63
  end
59
64
 
60
65
  it "raises an error" do
@@ -66,11 +71,11 @@ module PuppetLibrary::Forge
66
71
 
67
72
  context "when the module directory isn't readable" do
68
73
  before do
69
- chmod 0400, module_dir
74
+ chmod 0400, module_dir.path
70
75
  end
71
76
 
72
77
  after do
73
- chmod 0777, module_dir
78
+ chmod 0777, module_dir.path
74
79
  end
75
80
 
76
81
  it "raises an error" do
@@ -19,13 +19,9 @@ require 'spec_helper'
19
19
 
20
20
  module PuppetLibrary::Http::Cache
21
21
  describe Disk do
22
- let(:cache_dir) { Tempdir.new("modulecache").path }
22
+ let(:cache_dir) { Tempdir.new("modulecache") }
23
23
  let(:cache) { Disk.new(cache_dir) }
24
24
 
25
- after do
26
- rm_rf cache_dir
27
- end
28
-
29
25
  describe "#get" do
30
26
  context "the first time it's called" do
31
27
  it "returns the value from the block" do
@@ -41,7 +37,7 @@ module PuppetLibrary::Http::Cache
41
37
 
42
38
  result = cache.get("dir/my-file") { buffer }
43
39
 
44
- path = File.join(cache_dir, "dir", "my-file")
40
+ path = File.join(cache_dir.path, "dir", "my-file")
45
41
  expect(File.read(path)).to eq "hello"
46
42
  end
47
43
  end
@@ -53,5 +49,14 @@ module PuppetLibrary::Http::Cache
53
49
  end
54
50
  end
55
51
  end
52
+
53
+ describe "#clear" do
54
+ it "clears the cache" do
55
+ cache.get("dir/my-file") { StringIO.new "1" }
56
+ cache.clear
57
+ result = cache.get("dir/my-file") { StringIO.new "2" }
58
+ expect(result.read).to eq "2"
59
+ end
60
+ end
56
61
  end
57
62
  end
@@ -59,5 +59,17 @@ module PuppetLibrary::Http::Cache
59
59
  end
60
60
  end
61
61
  end
62
+
63
+ describe "#clear" do
64
+ it "clears the cache" do
65
+ cache.get { 1 }
66
+ result = cache.get { 2 }
67
+ expect(result).to eq 1
68
+
69
+ cache.clear
70
+ result = cache.get { 3 }
71
+ expect(result).to eq 3
72
+ end
73
+ end
62
74
  end
63
75
  end
@@ -28,5 +28,11 @@ module PuppetLibrary::Http::Cache
28
28
  expect(name).to eq "james"
29
29
  end
30
30
  end
31
+
32
+ describe "#clear" do
33
+ it "does nothing" do
34
+ cache.clear
35
+ end
36
+ end
31
37
  end
32
38
  end
@@ -17,18 +17,18 @@
17
17
 
18
18
  RSpec::Matchers.define :be_cached do
19
19
  match do |mod_file|
20
- ! Dir[File.join(cache_dir, mod_file)].empty?
20
+ ! Dir[File.join(cache_dir.path, mod_file)].empty?
21
21
  end
22
22
  end
23
23
 
24
24
  RSpec::Matchers.define :be_installed do
25
25
  match do |mod_name|
26
- File.directory?(File.join(project_dir, "modules", mod_name))
26
+ File.directory?(File.join(project_dir.path, "modules", mod_name))
27
27
  end
28
28
  end
29
29
 
30
30
  def write_puppetfile(content)
31
- File.open("#{project_dir}/Puppetfile", "w") do |puppetfile|
31
+ File.open("#{project_dir.path}/Puppetfile", "w") do |puppetfile|
32
32
  puppetfile.puts content
33
33
  end
34
34
  end
@@ -59,12 +59,12 @@ module ModuleSpecHelper
59
59
  end
60
60
 
61
61
  def add_module(author, name, version, &block)
62
- writer = ModuleWriter.new(module_dir)
62
+ writer = ModuleWriter.new(module_dir.path)
63
63
  writer.write_module(author, name, version, &block)
64
64
  end
65
65
 
66
66
  def add_file(file, content)
67
- File.open(File.join(module_dir, file), "w") do |f|
67
+ File.open(File.join(module_dir.path, file), "w") do |f|
68
68
  f.write content
69
69
  end
70
70
  end
@@ -19,12 +19,12 @@ require 'spec_helper'
19
19
 
20
20
  module PuppetLibrary
21
21
  describe PuppetLibrary do
22
- let(:forge) do
22
+ let :forge do
23
23
  forge = double(Forge::Multi).as_null_object
24
24
  allow(Forge::Multi).to receive(:new).and_return(forge)
25
25
  return forge
26
26
  end
27
- let(:server) do
27
+ let :server do
28
28
  server = double(Server)
29
29
  allow(Server).to receive(:new).with(forge).and_return(server)
30
30
  return server
@@ -108,18 +108,19 @@ module PuppetLibrary
108
108
 
109
109
  context "when using --config-file option" do
110
110
  it "uses config values from config file as config defaults" do
111
+ forge_dir = Tempdir.new("forge")
111
112
  config = {
112
113
  "port" => 4567,
113
114
  "daemonize" => true,
114
115
  "server" => "thin",
115
116
  "pidfile" => "/var/run/puppet-library.pid",
116
117
  "forges" => [
117
- { "Directory" => "/var/lib/modules" },
118
+ { "Directory" => forge_dir.path },
118
119
  { "Proxy" => "http://forge.puppetlabs.com" }
119
120
  ]
120
121
  }
121
122
  File.open(config_file.path, "w") { |f| f << config.to_yaml }
122
- expect(Forge::Directory).to receive(:new).with("/var/lib/modules")
123
+ expect(Forge::Directory).to receive(:new)
123
124
  expect(Forge::Proxy).to receive(:new).with("http://forge.puppetlabs.com")
124
125
  expect(forge).to receive(:add_forge).twice
125
126
  expect(Rack::Server).to receive(:start).with(default_options_with(:Port => 4567, :daemonize => true, :pid => "/var/run/puppet-library.pid", :server => "thin"))
@@ -129,6 +130,8 @@ module PuppetLibrary
129
130
  end
130
131
 
131
132
  context "when using --proxy option" do
133
+ let(:proxy) { double('proxy').as_null_object }
134
+
132
135
  it "adds a proxy module forge for each option specified" do
133
136
  proxy1 = double('proxy1')
134
137
  proxy2 = double('proxy2')
@@ -143,7 +146,7 @@ module PuppetLibrary
143
146
 
144
147
  context "when no protocol is specified" do
145
148
  it "defaults to HTTP" do
146
- expect(Forge::Proxy).to receive(:new).with("http://forge.example.com")
149
+ expect(Forge::Proxy).to receive(:new).with("http://forge.example.com").and_return proxy
147
150
 
148
151
  library.go(["--proxy", "forge.example.com"])
149
152
  end
@@ -151,7 +154,7 @@ module PuppetLibrary
151
154
 
152
155
  context "when the URL contains a trailing slash" do
153
156
  it "removes the slash" do
154
- expect(Forge::Proxy).to receive(:new).with("http://forge.example.com")
157
+ expect(Forge::Proxy).to receive(:new).with("http://forge.example.com").and_return proxy
155
158
 
156
159
  library.go(["--proxy", "http://forge.example.com/"])
157
160
  end
@@ -159,28 +162,42 @@ module PuppetLibrary
159
162
  end
160
163
 
161
164
  context "when using --cache-basedir option" do
165
+ let(:proxy) { double('proxy').as_null_object }
166
+ let(:cache_basedir) { Tempdir.new("cache") }
167
+ let(:cache_dir) { double(Dir) }
168
+
169
+ before do
170
+ expect(Dir).to receive(:new).with("#{cache_basedir.path}/forge1.example.com").and_return(cache_dir)
171
+ end
172
+
162
173
  it "uses the specified directory to hold cache directories for all proxies" do
163
- proxy1 = double('proxy')
164
- expect(Forge::Cache).to receive(:new).with("http://forge1.example.com", "/var/modules/forge1.example.com").and_return(proxy1)
165
- expect(forge).to receive(:add_forge).with(proxy1)
174
+ expect(Forge::Cache).to receive(:new).with("http://forge1.example.com", cache_dir).and_return(proxy)
175
+ expect(forge).to receive(:add_forge).with(proxy)
166
176
  expect(Rack::Server).to receive(:start).with(default_options)
167
177
 
168
- library.go(["--proxy", "http://forge1.example.com", "--cache-basedir", "/var/modules"])
178
+ library.go(["--proxy", "http://forge1.example.com", "--cache-basedir", cache_basedir.path])
169
179
  end
170
180
 
171
181
  it "expands the path specified" do
172
- expect(Forge::Cache).to receive(:new).with("http://forge1.example.com", "/var/modules/forge1.example.com")
182
+ expect(Forge::Cache).to receive(:new).with("http://forge1.example.com", cache_dir).and_return(proxy)
173
183
 
174
- library.go(["--proxy", "http://forge1.example.com", "--cache-basedir", "/var/../var/modules"])
184
+ library.go(["--proxy", "http://forge1.example.com", "--cache-basedir", "#{cache_basedir.path}/xxx/.."])
175
185
  end
176
186
  end
177
187
 
188
+ def dir(path)
189
+ dir = double(Dir)
190
+ allow(Dir).to receive(:new).with(/.*#{path}$/).and_return dir
191
+ dir
192
+ end
193
+
178
194
  context "when using --module-dir option" do
179
195
  it "adds a directory forge to the server for each module directory" do
180
196
  directory_forge_1 = double("directory_forge_1")
181
197
  directory_forge_2 = double("directory_forge_2")
182
- expect(Forge::Directory).to receive(:new).with("dir1").and_return(directory_forge_1)
183
- expect(Forge::Directory).to receive(:new).with("dir2").and_return(directory_forge_2)
198
+ dir1, dir2 = dir("dir1"), dir("dir2")
199
+ expect(Forge::Directory).to receive(:new).with(dir1).and_return(directory_forge_1)
200
+ expect(Forge::Directory).to receive(:new).with(dir2).and_return(directory_forge_2)
184
201
  expect(forge).to receive(:add_forge).with(directory_forge_1)
185
202
  expect(forge).to receive(:add_forge).with(directory_forge_2)
186
203
  expect(Rack::Server).to receive(:start).with(default_options)
@@ -193,8 +210,9 @@ module PuppetLibrary
193
210
  it "adds a source forge to the server for each source directory" do
194
211
  source_forge_1 = double("source_forge_1")
195
212
  source_forge_2 = double("source_forge_2")
196
- expect(Forge::Source).to receive(:new).with("dir1").and_return(source_forge_1)
197
- expect(Forge::Source).to receive(:new).with("dir2").and_return(source_forge_2)
213
+ dir1, dir2 = dir("dir1"), dir("dir2")
214
+ expect(Forge::Source).to receive(:new).with(dir1).and_return(source_forge_1)
215
+ expect(Forge::Source).to receive(:new).with(dir2).and_return(source_forge_2)
198
216
  expect(forge).to receive(:add_forge).with(source_forge_1)
199
217
  expect(forge).to receive(:add_forge).with(source_forge_2)
200
218
  expect(Rack::Server).to receive(:start).with(default_options)
@@ -18,10 +18,10 @@ require 'spec_helper'
18
18
 
19
19
  module PuppetLibrary::PuppetModule
20
20
  describe Modulefile do
21
- let(:modulefile) { Tempfile.new("Modulefile") }
21
+ let(:module_file) { Tempfile.new("Modulefile") }
22
22
 
23
23
  def write_modulefile(content)
24
- File.open(modulefile.path, "w") do |f|
24
+ File.open(module_file.path, "w") do |f|
25
25
  f.write content
26
26
  end
27
27
  end
@@ -42,12 +42,8 @@ module PuppetLibrary::PuppetModule
42
42
  EOF
43
43
  end
44
44
 
45
- after do
46
- modulefile.unlink
47
- end
48
-
49
45
  describe "#read" do
50
- let(:metadata) { Modulefile.read(modulefile.path) }
46
+ let(:metadata) { Modulefile.read(module_file.path) }
51
47
 
52
48
  it "parses the name" do
53
49
  expect(metadata.get_name).to eq "joe-ficticious"
@@ -81,7 +77,6 @@ module PuppetLibrary::PuppetModule
81
77
  expect(metadata.get_license).to eq "Apache 2.0"
82
78
  end
83
79
 
84
-
85
80
  it "parses the dependencies" do
86
81
  expect(metadata.get_dependencies).to eq [
87
82
  { "name" => "example/standard", "version_requirement" => '>= 2.3.4' },
@@ -97,7 +92,7 @@ module PuppetLibrary::PuppetModule
97
92
  rating '10'
98
93
  EOF
99
94
  expect(Modulefile).to receive(:log).with(/rating/)
100
- Modulefile.read(modulefile.path)
95
+ Modulefile.read(module_file.path)
101
96
  end
102
97
  end
103
98
  end
@@ -107,6 +102,50 @@ module PuppetLibrary::PuppetModule
107
102
  metadata = Modulefile.parse("version '1.0.0'")
108
103
  expect(metadata.get_version).to eq "1.0.0"
109
104
  end
105
+
106
+ context "when a a value is missing" do
107
+ it "defaults to an empty string" do
108
+ modulefile = Modulefile.parse <<-EOF
109
+ name 'joe-ficticious'
110
+ version '1.2.3'
111
+ EOF
112
+ expect(modulefile.get_description).to eq ""
113
+ end
114
+ end
115
+ end
116
+
117
+ describe "#to_metadata" do
118
+ let :modulefile do
119
+ Modulefile.parse <<-EOF
120
+ name 'joe-ficticious'
121
+ version '1.2.3'
122
+ source 'git://example.com/joe/puppet-ficticious.git'
123
+ author 'joe'
124
+ license 'Apache 2.0'
125
+ summary 'Example module'
126
+ description 'Module for use in a test'
127
+ project_page 'https://example.com/joe/puppet-apache'
128
+
129
+ dependency 'example/standard', '>= 2.3.4'
130
+ dependency 'example/other', '>= 5.6.7'
131
+ EOF
132
+ end
133
+
134
+ it "converts the modulefile into a metadata hash" do
135
+ metadata = modulefile.to_metadata
136
+ expect(metadata["name"]).to eq "joe-ficticious"
137
+ expect(metadata["version"]).to eq "1.2.3"
138
+ expect(metadata["source"]).to eq "git://example.com/joe/puppet-ficticious.git"
139
+ expect(metadata["author"]).to eq "joe"
140
+ expect(metadata["license"]).to eq "Apache 2.0"
141
+ expect(metadata["summary"]).to eq "Example module"
142
+ expect(metadata["description"]).to eq "Module for use in a test"
143
+ expect(metadata["project_page"]).to eq "https://example.com/joe/puppet-apache"
144
+ expect(metadata["dependencies"]).to eq [
145
+ { "name" => 'example/standard', "version_requirement" => ">= 2.3.4" },
146
+ { "name" => 'example/other', "version_requirement" => ">= 5.6.7" }
147
+ ]
148
+ end
110
149
  end
111
150
  end
112
151
  end