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
@@ -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