librarian-puppet 2.0.1 → 2.1.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.
- checksums.yaml +4 -4
- data/README.md +20 -0
- data/lib/librarian/puppet/action.rb +1 -0
- data/lib/librarian/puppet/action/resolve.rb +19 -0
- data/lib/librarian/puppet/cli.rb +10 -0
- data/lib/librarian/puppet/dependency.rb +18 -0
- data/lib/librarian/puppet/dsl.rb +16 -22
- data/lib/librarian/puppet/environment.rb +9 -1
- data/lib/librarian/puppet/extension.rb +0 -220
- data/lib/librarian/puppet/lockfile.rb +39 -0
- data/lib/librarian/puppet/source.rb +0 -1
- data/lib/librarian/puppet/source/forge.rb +1 -1
- data/lib/librarian/puppet/source/forge/repo_v1.rb +4 -25
- data/lib/librarian/puppet/source/local.rb +2 -5
- data/lib/librarian/puppet/version.rb +1 -1
- metadata +9 -8
- data/lib/librarian/puppet/lockfile/parser.rb +0 -55
- data/lib/librarian/puppet/requirement.rb +0 -35
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0a7c6bf3dfb88d0d44e3c718e302167e04508fc2
|
4
|
+
data.tar.gz: d5affa81eab4acc5aff6b93ee39bfbe3e97a2e85
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d4de7b61cffafdc51b4e46bcf7c42fd88da267620804ce52f6c55e85724e0993f71756720530ce47a7535122f13158cc5baba38485f9ccd5dc8c0c138bacb437
|
7
|
+
data.tar.gz: 743f2f84ad57d0041656e28824e59e906fdc5ab717d866ca09f151c1f1ca22fadf45acb49317f0c48bd69ac28196d71d5858aa271672fcef7491f856ffa89b95
|
data/README.md
CHANGED
@@ -13,6 +13,7 @@ Git repositories or just a path.
|
|
13
13
|
* Forge modules can be installed from [Puppetlabs Forge](https://forge.puppetlabs.com/) or an internal Forge such as [Pulp](http://www.pulpproject.org/)
|
14
14
|
* Git modules can be installed from a branch, tag or specific commit, optionally using a path inside the repository
|
15
15
|
* Modules can be installed from GitHub using tarballs, without needing Git installed
|
16
|
+
* Modules can be installed from a filesystem path
|
16
17
|
* Module dependencies are resolved transitively without needing to list all the modules explicitly
|
17
18
|
|
18
19
|
|
@@ -69,6 +70,10 @@ as if the Puppetfile contained
|
|
69
70
|
mod 'puppetlabs-apache', '0.6.0',
|
70
71
|
:github_tarball => 'puppetlabs/puppetlabs-apache'
|
71
72
|
|
73
|
+
mod 'acme-mymodule', :path => './some_folder'
|
74
|
+
|
75
|
+
exclusion 'acme-bad_module'
|
76
|
+
|
72
77
|
|
73
78
|
### Recursive module dependency resolution
|
74
79
|
|
@@ -134,6 +139,21 @@ module subdirectory.
|
|
134
139
|
Our puppet infrastructure repository depends on the `apt` module, which we have
|
135
140
|
stored as a directory under our `puppet-modules` git repos.
|
136
141
|
|
142
|
+
mod 'puppetlabs-apache', '0.6.0',
|
143
|
+
:github_tarball => 'puppetlabs/puppetlabs-apache'
|
144
|
+
|
145
|
+
Our puppet infrastructure repository depends on the `puppetlabs-apache` module,
|
146
|
+
to be downloaded from GitHub tarball.
|
147
|
+
|
148
|
+
mod 'acme-mymodule', :path => './some_folder'
|
149
|
+
|
150
|
+
Our puppet infrastructure repository depends on the `acme-mymodule` module,
|
151
|
+
which is already in the filesystem.
|
152
|
+
|
153
|
+
exclusion 'acme-bad_module'
|
154
|
+
|
155
|
+
Exclude the module `acme-bad_module` from resolution and installation.
|
156
|
+
|
137
157
|
## How to Use
|
138
158
|
|
139
159
|
Install librarian-puppet:
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module Librarian
|
2
|
+
module Puppet
|
3
|
+
module Action
|
4
|
+
class Resolve < Librarian::Action::Resolve
|
5
|
+
include Librarian::Puppet::Util
|
6
|
+
|
7
|
+
def run
|
8
|
+
super
|
9
|
+
manifests = environment.lock.manifests.select{ |m| m.name }
|
10
|
+
dupes = manifests.group_by{ |m| module_name(m.name) }.select { |k, v| v.size > 1 }
|
11
|
+
dupes.each do |k,v|
|
12
|
+
warn("Dependency on module '#{k}' is fullfilled by multiple modules and only one will be used: #{v.map{|m|m.name}}")
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
data/lib/librarian/puppet/cli.rb
CHANGED
@@ -7,6 +7,7 @@ require 'librarian/puppet/action'
|
|
7
7
|
module Librarian
|
8
8
|
module Puppet
|
9
9
|
class Cli < Librarian::Cli
|
10
|
+
include Librarian::Puppet::Util
|
10
11
|
|
11
12
|
module Particularity
|
12
13
|
def root_module
|
@@ -69,6 +70,12 @@ module Librarian
|
|
69
70
|
install!
|
70
71
|
end
|
71
72
|
|
73
|
+
# only used to replace / to - in the module names
|
74
|
+
def update(*names)
|
75
|
+
warn("Usage of module/name is deprecated, use module-name") if names.any? {|n| n.include?("/")}
|
76
|
+
super(*names.map{|n| normalize_name(n)})
|
77
|
+
end
|
78
|
+
|
72
79
|
desc "package", "Cache the puppet modules in vendor/puppet/cache."
|
73
80
|
option "quiet", :type => :boolean, :default => false
|
74
81
|
option "verbose", :type => :boolean, :default => false
|
@@ -93,6 +100,9 @@ module Librarian
|
|
93
100
|
def install!(options = { })
|
94
101
|
Action::Install.new(environment, options).run
|
95
102
|
end
|
103
|
+
def resolve!(options = { })
|
104
|
+
Action::Resolve.new(environment, options).run
|
105
|
+
end
|
96
106
|
end
|
97
107
|
end
|
98
108
|
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module Librarian
|
2
|
+
module Puppet
|
3
|
+
|
4
|
+
class Dependency < Librarian::Dependency
|
5
|
+
|
6
|
+
include Librarian::Puppet::Util
|
7
|
+
|
8
|
+
def initialize(name, requirement, source)
|
9
|
+
# Issue #235 fail if forge source is not defined
|
10
|
+
raise Error, "forge entry is not defined in Puppetfile" if source.instance_of?(Array) && source.empty?
|
11
|
+
|
12
|
+
super(normalize_name(name), requirement, source)
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
18
|
+
end
|
data/lib/librarian/puppet/dsl.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
require 'librarian/dsl'
|
2
2
|
require 'librarian/dsl/target'
|
3
3
|
require 'librarian/puppet/source'
|
4
|
+
require 'librarian/puppet/dependency'
|
4
5
|
|
5
6
|
module Librarian
|
6
7
|
module Puppet
|
@@ -15,32 +16,25 @@ module Librarian
|
|
15
16
|
source :path => Source::Path
|
16
17
|
source :github_tarball => Source::GitHubTarball
|
17
18
|
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
if specfile.kind_of?(Pathname) and !File.exists?(specfile)
|
23
|
-
debug { "Specfile not found, using defaults: #{specfile}" }
|
24
|
-
specfile = Proc.new do
|
25
|
-
forge FORGE_URL
|
26
|
-
metadata
|
27
|
-
end
|
19
|
+
def default_specfile
|
20
|
+
Proc.new do
|
21
|
+
forge FORGE_URL
|
22
|
+
metadata
|
28
23
|
end
|
24
|
+
end
|
29
25
|
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
specfile ||= Proc.new if block_given?
|
35
|
-
receiver = Receiver.new(target)
|
36
|
-
receiver.run(specfile)
|
26
|
+
def self.dependency_type
|
27
|
+
Librarian::Puppet::Dependency
|
28
|
+
end
|
37
29
|
|
38
|
-
|
39
|
-
|
40
|
-
|
30
|
+
def post_process_target(target)
|
31
|
+
# save the default forge defined
|
32
|
+
default_forge = target.sources.select {|s| s.is_a? Librarian::Puppet::Source::Forge}.first
|
33
|
+
Librarian::Puppet::Source::Forge.default = default_forge || Librarian::Puppet::Source::Forge.from_lock_options(environment, :remote => FORGE_URL)
|
34
|
+
end
|
41
35
|
|
42
|
-
|
43
|
-
|
36
|
+
def receiver(target)
|
37
|
+
Receiver.new(target)
|
44
38
|
end
|
45
39
|
|
46
40
|
class Receiver < Librarian::Dsl::Receiver
|
@@ -1,7 +1,7 @@
|
|
1
1
|
require "librarian/environment"
|
2
2
|
require "librarian/puppet/dsl"
|
3
3
|
require "librarian/puppet/source"
|
4
|
-
require "librarian/puppet/lockfile
|
4
|
+
require "librarian/puppet/lockfile"
|
5
5
|
|
6
6
|
module Librarian
|
7
7
|
module Puppet
|
@@ -11,6 +11,14 @@ module Librarian
|
|
11
11
|
"puppet"
|
12
12
|
end
|
13
13
|
|
14
|
+
def lockfile
|
15
|
+
Lockfile.new(self, lockfile_path)
|
16
|
+
end
|
17
|
+
|
18
|
+
def ephemeral_lockfile
|
19
|
+
Lockfile.new(self, nil)
|
20
|
+
end
|
21
|
+
|
14
22
|
def tmp_path
|
15
23
|
part = config_db["tmp"] || ".tmp"
|
16
24
|
project_path.join(part)
|
@@ -6,224 +6,4 @@ module Librarian
|
|
6
6
|
extend self
|
7
7
|
extend Librarian
|
8
8
|
end
|
9
|
-
|
10
|
-
class Dependency
|
11
|
-
include Librarian::Puppet::Util
|
12
|
-
|
13
|
-
def initialize(name, requirement, source)
|
14
|
-
assert_name_valid! name
|
15
|
-
|
16
|
-
# Issue #235 fail if forge source is not defined
|
17
|
-
raise Error, "forge entry is not defined in Puppetfile" if source.instance_of?(Array) && source.empty?
|
18
|
-
|
19
|
-
# let's settle on provider-module syntax instead of provider/module
|
20
|
-
self.name = normalize_name(name)
|
21
|
-
self.requirement = Requirement.new(requirement)
|
22
|
-
self.source = source
|
23
|
-
|
24
|
-
@manifests = nil
|
25
|
-
end
|
26
|
-
|
27
|
-
class Requirement
|
28
|
-
def initialize(*args)
|
29
|
-
args = initialize_normalize_args(args)
|
30
|
-
self.backing = Gem::Requirement.create(puppet_to_gem_versions(args))
|
31
|
-
end
|
32
|
-
|
33
|
-
def puppet_to_gem_versions(args)
|
34
|
-
args.map do |arg|
|
35
|
-
case arg
|
36
|
-
when Array
|
37
|
-
arg.map { |v| Librarian::Puppet::Requirement.new(v).gem_requirement }
|
38
|
-
when String
|
39
|
-
Librarian::Puppet::Requirement.new(arg).gem_requirement
|
40
|
-
else
|
41
|
-
# Gem::Requirement, convert to string (ie. =1.0) so we can concat later
|
42
|
-
# Gem::Requirements can not be concatenated
|
43
|
-
arg.requirements.map{|x,y| "#{x}#{y}"}
|
44
|
-
end
|
45
|
-
end.flatten
|
46
|
-
end
|
47
|
-
end
|
48
|
-
|
49
|
-
alias :eql? :==
|
50
|
-
|
51
|
-
def hash
|
52
|
-
self.to_s.hash
|
53
|
-
end
|
54
|
-
end
|
55
|
-
|
56
|
-
# Fixes for librarian not yet released in their gem
|
57
|
-
module Mock
|
58
|
-
module Source
|
59
|
-
class Mock
|
60
|
-
alias :eql? :==
|
61
|
-
|
62
|
-
def hash
|
63
|
-
self.to_s.hash
|
64
|
-
end
|
65
|
-
end
|
66
|
-
end
|
67
|
-
end
|
68
|
-
module Source
|
69
|
-
class Git
|
70
|
-
alias :eql? :==
|
71
|
-
|
72
|
-
def hash
|
73
|
-
self.to_s.hash
|
74
|
-
end
|
75
|
-
end
|
76
|
-
|
77
|
-
class Path
|
78
|
-
alias :eql? :==
|
79
|
-
|
80
|
-
def hash
|
81
|
-
self.to_s.hash
|
82
|
-
end
|
83
|
-
end
|
84
|
-
end
|
85
|
-
|
86
|
-
class ManifestSet
|
87
|
-
include Librarian::Puppet::Util
|
88
|
-
|
89
|
-
private
|
90
|
-
|
91
|
-
# Check if module doesn't exist and fail fast
|
92
|
-
def dependencies_of(names)
|
93
|
-
names = Array === names ? names.dup : names.to_a
|
94
|
-
assert_strings!(names)
|
95
|
-
|
96
|
-
deps = Set.new
|
97
|
-
until names.empty?
|
98
|
-
name = normalize_name(names.shift)
|
99
|
-
next if deps.include?(name)
|
100
|
-
|
101
|
-
deps << name
|
102
|
-
raise(Error, "Unable to find module #{name}. Your Puppetfile may be out of sync with the lock, try running 'librarian-puppet install' first") if index[name].nil?
|
103
|
-
names.concat index[name].dependencies.map(&:name)
|
104
|
-
end
|
105
|
-
deps.to_a
|
106
|
-
end
|
107
|
-
end
|
108
|
-
|
109
|
-
class Manifest
|
110
|
-
class PreReleaseVersion
|
111
|
-
|
112
|
-
# Compares pre-release component ids using Semver 2.0.0 spec
|
113
|
-
def self.compare_components(this_id,other_id)
|
114
|
-
case # Strings have higher precedence than numbers
|
115
|
-
when (this_id.is_a?(Integer) and other_id.is_a?(String))
|
116
|
-
-1
|
117
|
-
when (this_id.is_a?(String) and other_id.is_a?(Integer))
|
118
|
-
1
|
119
|
-
else
|
120
|
-
this_id <=> other_id
|
121
|
-
end
|
122
|
-
end
|
123
|
-
|
124
|
-
# Parses pre-release components `a.b.c` into an array ``[a,b,c]`
|
125
|
-
# Converts numeric components into +Integer+
|
126
|
-
def self.parse(prerelease)
|
127
|
-
if prerelease.nil?
|
128
|
-
[]
|
129
|
-
else
|
130
|
-
prerelease.split('.').collect do |id|
|
131
|
-
id = Integer(id) if /^[0-9]+$/ =~ id
|
132
|
-
id
|
133
|
-
end
|
134
|
-
end
|
135
|
-
end
|
136
|
-
|
137
|
-
include Comparable
|
138
|
-
|
139
|
-
attr_reader :components
|
140
|
-
|
141
|
-
def initialize(prerelease)
|
142
|
-
@prerelease = prerelease
|
143
|
-
@components = PreReleaseVersion.parse(prerelease)
|
144
|
-
end
|
145
|
-
|
146
|
-
def to_s
|
147
|
-
@prerelease
|
148
|
-
end
|
149
|
-
|
150
|
-
def <=>(other)
|
151
|
-
# null-fill zip array to prevent loss of components
|
152
|
-
z = Array.new([components.length,other.components.length])
|
153
|
-
|
154
|
-
# Compare each component against the other
|
155
|
-
comp = z.zip(components,other.components).collect do |ids|
|
156
|
-
case # All components being equal, the version with more of them takes precedence
|
157
|
-
when ids[1].nil? # Self has less elements, other wins
|
158
|
-
-1
|
159
|
-
when ids[2].nil? # Other has less elements, self wins
|
160
|
-
1
|
161
|
-
else
|
162
|
-
PreReleaseVersion.compare_components(ids[1],ids[2])
|
163
|
-
end
|
164
|
-
end
|
165
|
-
# Chose the first non-zero comparison or return 0
|
166
|
-
comp.delete_if {|c| c == 0}[0] || 0
|
167
|
-
end
|
168
|
-
end
|
169
|
-
class Version
|
170
|
-
@@SEMANTIC_VERSION_PATTERN = /^([0-9]+\.[0-9]+(?:\.[0-9]+)?)(?:-([0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*))?(?:\+([0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*))?$/
|
171
|
-
def self.parse_semver(version_string)
|
172
|
-
parsed = @@SEMANTIC_VERSION_PATTERN.match(version_string.strip)
|
173
|
-
if parsed
|
174
|
-
{
|
175
|
-
:full_version => parsed[0],
|
176
|
-
:version => parsed[1],
|
177
|
-
:prerelease => (PreReleaseVersion.new(parsed[2]) if parsed[2]),
|
178
|
-
:build => parsed[3]
|
179
|
-
}
|
180
|
-
end
|
181
|
-
end
|
182
|
-
|
183
|
-
attr_reader :prerelease
|
184
|
-
|
185
|
-
def initialize(*args)
|
186
|
-
args = initialize_normalize_args(args)
|
187
|
-
semver = Version.parse_semver(*args)
|
188
|
-
if semver
|
189
|
-
self.backing = Gem::Version.new(semver[:version])
|
190
|
-
@prerelease = semver[:prerelease]
|
191
|
-
@full_version = semver[:full_version]
|
192
|
-
else
|
193
|
-
self.backing = Gem::Version.new(*args)
|
194
|
-
@full_version = to_gem_version.to_s
|
195
|
-
end
|
196
|
-
end
|
197
|
-
|
198
|
-
def <=>(other)
|
199
|
-
cmp = to_gem_version <=> other.to_gem_version
|
200
|
-
|
201
|
-
# Should compare pre-release versions?
|
202
|
-
if cmp == 0 and not (prerelease.nil? and other.prerelease.nil?)
|
203
|
-
case # Versions without prerelease take precedence
|
204
|
-
when (prerelease.nil? and not other.prerelease.nil?)
|
205
|
-
1
|
206
|
-
when (not prerelease.nil? and other.prerelease.nil?)
|
207
|
-
-1
|
208
|
-
else
|
209
|
-
prerelease <=> other.prerelease
|
210
|
-
end
|
211
|
-
else
|
212
|
-
cmp
|
213
|
-
end
|
214
|
-
end
|
215
|
-
|
216
|
-
def to_s
|
217
|
-
@full_version
|
218
|
-
end
|
219
|
-
end
|
220
|
-
end
|
221
|
-
|
222
|
-
class Logger
|
223
|
-
def warn(string = nil, &block)
|
224
|
-
return unless ui
|
225
|
-
|
226
|
-
ui.warn(string || yield)
|
227
|
-
end
|
228
|
-
end
|
229
9
|
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
# Extend Lockfile to normalize module names from acme/mod to acme-mod
|
2
|
+
module Librarian
|
3
|
+
module Puppet
|
4
|
+
class Lockfile < Librarian::Lockfile
|
5
|
+
|
6
|
+
# Extend the parser to normalize module names in old .lock files, converting / to -
|
7
|
+
class Parser < Librarian::Lockfile::Parser
|
8
|
+
|
9
|
+
include Librarian::Puppet::Util
|
10
|
+
|
11
|
+
def extract_and_parse_sources(lines)
|
12
|
+
sources = super
|
13
|
+
sources.each do |source|
|
14
|
+
source[:manifests] = Hash[source[:manifests].map do |name,manifest|
|
15
|
+
[normalize_name(name), manifest]
|
16
|
+
end]
|
17
|
+
end
|
18
|
+
sources
|
19
|
+
end
|
20
|
+
|
21
|
+
def extract_and_parse_dependencies(lines, manifests_index)
|
22
|
+
# when looking up in manifests_index normalize the name beforehand
|
23
|
+
class << manifests_index
|
24
|
+
include Librarian::Puppet::Util
|
25
|
+
alias_method :old_lookup, :[]
|
26
|
+
define_method(:[]) { |k| self.old_lookup(normalize_name(k)) }
|
27
|
+
end
|
28
|
+
super(lines, manifests_index)
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
32
|
+
|
33
|
+
def load(string)
|
34
|
+
Parser.new(environment).parse(string)
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -143,7 +143,7 @@ module Librarian
|
|
143
143
|
|
144
144
|
def fetch_dependencies(name, version, version_uri)
|
145
145
|
repo(name).dependencies(version).map do |k, v|
|
146
|
-
v = Requirement.new(v).
|
146
|
+
v = Librarian::Dependency::Requirement.new(v).to_gem_requirement
|
147
147
|
Dependency.new(k, v, nil)
|
148
148
|
end
|
149
149
|
end
|
@@ -33,30 +33,9 @@ module Librarian
|
|
33
33
|
|
34
34
|
private
|
35
35
|
|
36
|
-
#
|
37
|
-
|
38
|
-
def clear_duplicated_dependencies(data)
|
36
|
+
# convert organization/modulename to organization-modulename
|
37
|
+
def normalize_dependencies(data)
|
39
38
|
return nil if data.nil?
|
40
|
-
data.each do |m,versions|
|
41
|
-
versions.each do |v|
|
42
|
-
if v["dependencies"] and !v["dependencies"].empty?
|
43
|
-
# convert organization/modulename to organization-modulename
|
44
|
-
v["dependencies"].each {|d| d[0] = normalize_name(d[0])}
|
45
|
-
|
46
|
-
dependency_names = v["dependencies"].map {|d| d[0]}
|
47
|
-
duplicated = dependency_names.select{ |e| dependency_names.count(e) > 1 }
|
48
|
-
unless duplicated.empty?
|
49
|
-
duplicated.uniq.each do |module_duplicated|
|
50
|
-
to_remove = []
|
51
|
-
v["dependencies"].each_index{|i| to_remove << i if module_duplicated == v["dependencies"][i][0]}
|
52
|
-
warn { "Module #{m}@#{v["version"]} contains duplicated dependencies for #{module_duplicated}, ignoring all but the first of #{to_remove.map {|i| v["dependencies"][i]}}" }
|
53
|
-
to_remove.slice(1..-1).reverse.each {|i| v["dependencies"].delete_at(i) }
|
54
|
-
v["dependencies"] = v["dependencies"] - to_remove.slice(1..-1)
|
55
|
-
end
|
56
|
-
end
|
57
|
-
end
|
58
|
-
end
|
59
|
-
end
|
60
39
|
# convert organization/modulename to organization-modulename
|
61
40
|
data.keys.each do |m|
|
62
41
|
if m =~ %r{.*/.*}
|
@@ -71,7 +50,7 @@ module Librarian
|
|
71
50
|
def api_data(module_name)
|
72
51
|
return @api_data[module_name] if @api_data
|
73
52
|
# call API and cache data
|
74
|
-
@api_data =
|
53
|
+
@api_data = normalize_dependencies(api_call(module_name))
|
75
54
|
if @api_data.nil?
|
76
55
|
raise Error, "Unable to find module '#{name}' on #{source}"
|
77
56
|
end
|
@@ -83,7 +62,7 @@ module Librarian
|
|
83
62
|
# if we already got all the versions, find in cached data
|
84
63
|
return @api_data[module_name].detect{|x| x['version'] == version.to_s} if @api_data
|
85
64
|
# otherwise call the api for this version if not cached already
|
86
|
-
@api_version_data[version] =
|
65
|
+
@api_version_data[version] = normalize_dependencies(api_call(name, version)) if @api_version_data[version].nil?
|
87
66
|
@api_version_data[version]
|
88
67
|
end
|
89
68
|
|
@@ -43,12 +43,9 @@ module Librarian
|
|
43
43
|
end
|
44
44
|
|
45
45
|
parsed_metadata['dependencies'].each do |d|
|
46
|
-
gem_requirement = Requirement.new(d['version_requirement']).
|
46
|
+
gem_requirement = Librarian::Dependency::Requirement.new(d['version_requirement']).to_gem_requirement
|
47
47
|
new_dependency = Dependency.new(d['name'], gem_requirement, forge_source)
|
48
|
-
|
49
|
-
unless dependencies.find { |spec_dependency| spec_dependency.name == new_dependency.name && spec_dependency.requirement == new_dependency.requirement }
|
50
|
-
dependencies << new_dependency
|
51
|
-
end
|
48
|
+
dependencies << new_dependency
|
52
49
|
end
|
53
50
|
|
54
51
|
dependencies
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: librarian-puppet
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0
|
4
|
+
version: 2.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tim Sharpe
|
@@ -9,22 +9,22 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2015-03-04 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
|
-
name:
|
15
|
+
name: librarianp
|
16
16
|
requirement: !ruby/object:Gem::Requirement
|
17
17
|
requirements:
|
18
18
|
- - ">="
|
19
19
|
- !ruby/object:Gem::Version
|
20
|
-
version: 0.1
|
20
|
+
version: 0.5.1
|
21
21
|
type: :runtime
|
22
22
|
prerelease: false
|
23
23
|
version_requirements: !ruby/object:Gem::Requirement
|
24
24
|
requirements:
|
25
25
|
- - ">="
|
26
26
|
- !ruby/object:Gem::Version
|
27
|
-
version: 0.1
|
27
|
+
version: 0.5.1
|
28
28
|
- !ruby/object:Gem::Dependency
|
29
29
|
name: rsync
|
30
30
|
requirement: !ruby/object:Gem::Requirement
|
@@ -184,12 +184,13 @@ files:
|
|
184
184
|
- lib/librarian/puppet.rb
|
185
185
|
- lib/librarian/puppet/action.rb
|
186
186
|
- lib/librarian/puppet/action/install.rb
|
187
|
+
- lib/librarian/puppet/action/resolve.rb
|
187
188
|
- lib/librarian/puppet/cli.rb
|
189
|
+
- lib/librarian/puppet/dependency.rb
|
188
190
|
- lib/librarian/puppet/dsl.rb
|
189
191
|
- lib/librarian/puppet/environment.rb
|
190
192
|
- lib/librarian/puppet/extension.rb
|
191
|
-
- lib/librarian/puppet/lockfile
|
192
|
-
- lib/librarian/puppet/requirement.rb
|
193
|
+
- lib/librarian/puppet/lockfile.rb
|
193
194
|
- lib/librarian/puppet/source.rb
|
194
195
|
- lib/librarian/puppet/source/forge.rb
|
195
196
|
- lib/librarian/puppet/source/forge/repo.rb
|
@@ -224,7 +225,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
224
225
|
version: '0'
|
225
226
|
requirements: []
|
226
227
|
rubyforge_project:
|
227
|
-
rubygems_version: 2.
|
228
|
+
rubygems_version: 2.4.3
|
228
229
|
signing_key:
|
229
230
|
specification_version: 4
|
230
231
|
summary: Bundler for your Puppet modules
|
@@ -1,55 +0,0 @@
|
|
1
|
-
require 'librarian/manifest'
|
2
|
-
require 'librarian/dependency'
|
3
|
-
require 'librarian/manifest_set'
|
4
|
-
|
5
|
-
module Librarian
|
6
|
-
class Lockfile
|
7
|
-
class Parser
|
8
|
-
include Librarian::Puppet::Util
|
9
|
-
|
10
|
-
def parse(string)
|
11
|
-
string = string.dup
|
12
|
-
source_type_names_map = Hash[dsl_class.source_types.map{|t| [t[1].lock_name, t[1]]}]
|
13
|
-
source_type_names = dsl_class.source_types.map{|t| t[1].lock_name}
|
14
|
-
lines = string.split(/(\r|\n|\r\n)+/).select{|l| l =~ /\S/}
|
15
|
-
sources = []
|
16
|
-
while source_type_names.include?(lines.first)
|
17
|
-
source = {}
|
18
|
-
source_type_name = lines.shift
|
19
|
-
source[:type] = source_type_names_map[source_type_name]
|
20
|
-
options = {}
|
21
|
-
while lines.first =~ /^ {2}([\w\-\/]+):\s+(.+)$/
|
22
|
-
lines.shift
|
23
|
-
options[$1.to_sym] = $2
|
24
|
-
end
|
25
|
-
source[:options] = options
|
26
|
-
lines.shift # specs
|
27
|
-
manifests = {}
|
28
|
-
while lines.first =~ /^ {4}([\w\-\/]+) \((.*)\)$/ # This change allows forward slash
|
29
|
-
lines.shift
|
30
|
-
name, version = normalize_name($1), $2
|
31
|
-
manifests[name] = {:version => version, :dependencies => {}}
|
32
|
-
while lines.first =~ /^ {6}([\w\-\/]+) \((.*)\)$/
|
33
|
-
lines.shift
|
34
|
-
manifests[name][:dependencies][$1] = $2.split(/,\s*/)
|
35
|
-
end
|
36
|
-
end
|
37
|
-
source[:manifests] = manifests
|
38
|
-
sources << source
|
39
|
-
end
|
40
|
-
manifests = compile(sources)
|
41
|
-
manifests_index = Hash[manifests.map{|m| [m.name, m]}]
|
42
|
-
raise StandardError, "Expected DEPENDENCIES topic!" unless lines.shift == "DEPENDENCIES"
|
43
|
-
dependencies = []
|
44
|
-
while lines.first =~ /^ {2}([\w\-\/]+)(?: \((.*)\))?$/ # This change allows forward slash
|
45
|
-
lines.shift
|
46
|
-
name, requirement = normalize_name($1), $2.split(/,\s*/)
|
47
|
-
dependencies << Dependency.new(name, requirement, manifests_index[name].source)
|
48
|
-
end
|
49
|
-
|
50
|
-
Resolution.new(dependencies, manifests)
|
51
|
-
end
|
52
|
-
|
53
|
-
end
|
54
|
-
end
|
55
|
-
end
|
@@ -1,35 +0,0 @@
|
|
1
|
-
module Librarian
|
2
|
-
module Puppet
|
3
|
-
class Requirement
|
4
|
-
attr_reader :requirement
|
5
|
-
|
6
|
-
def initialize(requirement)
|
7
|
-
@requirement = requirement || ">=0"
|
8
|
-
end
|
9
|
-
|
10
|
-
def gem_requirement
|
11
|
-
if range_requirement?
|
12
|
-
[@range_match[1], @range_match[2]]
|
13
|
-
elsif pessimistic_requirement?
|
14
|
-
"~> #{@pessimistic_match[1]}.0"
|
15
|
-
else
|
16
|
-
requirement
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
|
-
def to_s
|
21
|
-
gem_requirement.to_s
|
22
|
-
end
|
23
|
-
|
24
|
-
private
|
25
|
-
|
26
|
-
def range_requirement?
|
27
|
-
@range_match ||= requirement.match(/(>=? ?\d+(?:\.\d+){0,2}) (<=? ?\d+(?:\.\d+){0,2})/)
|
28
|
-
end
|
29
|
-
|
30
|
-
def pessimistic_requirement?
|
31
|
-
@pessimistic_match ||= requirement.match(/(\d+(?:\.\d+)?)\.x/)
|
32
|
-
end
|
33
|
-
end
|
34
|
-
end
|
35
|
-
end
|