librarian-puppet 1.1.2 → 1.1.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b51ee7e9d024d0df081d224ba54a12e4a06dde25
4
- data.tar.gz: ef88d4c028b403d861dbb3a7e5ee2d8f53593095
3
+ metadata.gz: 65da3b51c58c415edbe7148801d7eccd40232fb1
4
+ data.tar.gz: fa243fef1a099850e0620c79f814561822735b6c
5
5
  SHA512:
6
- metadata.gz: eeecb236adf9ef6285069e01655e0d559fd63cbebe1a8c8464f610982307a5b1b7a48a94e786f5435cf8eedd719a0837cc1ec25f80a59151883558452abc4794
7
- data.tar.gz: c4df7ac66216eb589a12302718a5f9ac7e3aaf1ec21ebb8baff472a1d5eea8fea91208b823d8e192ef893b4cb6b6efd8084a652eb26a3051b97a0377a0d35279
6
+ metadata.gz: 719f6605dc5ceb95ea7917683f2cf833a96ab39d0b1ba6ebd61b96c597d718dd56306497d0bc5bb973dfd6fcf706a59fdf26d70fb361efe5d6236405e277bdb4
7
+ data.tar.gz: ff64b0efd0c19766d77f27799a900dbc2e5920e15541d3f8d640b6d2d4cc32a1406a3aa21b6be29f4d013a69cc69ba4b8f0ac5a804f2f5798670b729eb7aa07d
data/README.md CHANGED
@@ -28,6 +28,13 @@ It is based on [Librarian](https://github.com/applicationsonline/librarian), a
28
28
  framework for writing bundlers, which are tools that resolve, fetch, install,
29
29
  and isolate a project's dependencies.
30
30
 
31
+ ## Versions
32
+
33
+ Librarian-puppet >= 1.1.0 requires Ruby 1.9 and uses the Puppet Forge API v3.
34
+ Versions < 1.1.0 works on Ruby 1.8.
35
+
36
+ See the [Changelog](Changelog.md) for more details.
37
+
31
38
  ## The Puppetfile
32
39
 
33
40
  Every Puppet repository that uses Librarian-puppet will have a file named
@@ -47,16 +54,16 @@ This Puppetfile will download all the dependencies listed in your Modulefile fro
47
54
 
48
55
  forge "https://forge.puppetlabs.com"
49
56
 
50
- mod "puppetlabs/razor"
51
- mod "puppetlabs/ntp", "0.0.3"
57
+ mod 'puppetlabs-razor'
58
+ mod 'puppetlabs-ntp', "0.0.3"
52
59
 
53
- mod "puppetlabs/apt",
60
+ mod 'puppetlabs-apt',
54
61
  :git => "git://github.com/puppetlabs/puppetlabs-apt.git"
55
62
 
56
- mod "puppetlabs/stdlib",
63
+ mod 'puppetlabs-stdlib',
57
64
  :git => "git://github.com/puppetlabs/puppetlabs-stdlib.git"
58
65
 
59
- mod 'puppetlabs/apache', '0.6.0',
66
+ mod 'puppetlabs-apache', '0.6.0',
60
67
  :github_tarball => 'puppetlabs/puppetlabs-apache'
61
68
 
62
69
 
@@ -73,29 +80,29 @@ This declares that we want to use the official Puppet Labs Forge as our default
73
80
  source when pulling down modules. If you run your own local forge, you may
74
81
  want to change this.
75
82
 
76
- mod "puppetlabs/razor"
83
+ mod 'puppetlabs-razor'
77
84
 
78
85
  Pull in the latest version of the Puppet Labs Razor module from the default
79
86
  source.
80
87
 
81
- mod "puppetlabs/ntp", "0.0.3"
88
+ mod 'puppetlabs-ntp', "0.0.3"
82
89
 
83
90
  Pull in version 0.0.3 of the Puppet Labs NTP module from the default source.
84
91
 
85
- mod "puppetlabs/apt",
92
+ mod 'puppetlabs-apt',
86
93
  :git => "git://github.com/puppetlabs/puppetlabs-apt.git"
87
94
 
88
95
  Our puppet infrastructure repository depends on the `apt` module from the
89
96
  Puppet Labs GitHub repos and checks out the `master` branch.
90
97
 
91
- mod "puppetlabs/apt",
98
+ mod 'puppetlabs-apt',
92
99
  :git => "git://github.com/puppetlabs/puppetlabs-apt.git",
93
100
  :ref => '0.0.3'
94
101
 
95
102
  Our puppet infrastructure repository depends on the `apt` module from the
96
103
  Puppet Labs GitHub repos and checks out a tag of `0.0.3`.
97
104
 
98
- mod "puppetlabs/apt",
105
+ mod 'puppetlabs-apt',
99
106
  :git => "git://github.com/puppetlabs/puppetlabs-apt.git",
100
107
  :ref => 'feature/master/dans_refactor'
101
108
 
@@ -117,7 +124,7 @@ with many modules in it. If we need a module from such a repository, we can
117
124
  use the `:path =>` option here to help Librarian-puppet drill down and find the
118
125
  module subdirectory.
119
126
 
120
- mod "puppetlabs/apt",
127
+ mod 'puppetlabs-apt',
121
128
  :git => "git://github.com/fake/puppet-modules.git",
122
129
  :path => "modules/apt"
123
130
 
@@ -154,6 +161,14 @@ source specified. This command writes the complete resolution into
154
161
  `Puppetfile.lock` and then copies all of the fetched modules into your
155
162
  `modules/` directory, overwriting whatever was there before.
156
163
 
164
+ Librarian-puppet support both v1 and v3 of the Puppet Forge API.
165
+ Specify a specific API version when installing modules:
166
+
167
+ $ librarian-puppet install --use-v1-api # this is default
168
+ $ librarian-puppet install --no-use-v1-api # use the v3 API
169
+
170
+ Please note that this does not apply for the official Puppet Forge where v3 is used by default.
171
+
157
172
  Get an overview of your `Puppetfile.lock` with:
158
173
 
159
174
  $ librarian-puppet show
@@ -44,6 +44,7 @@ module Librarian
44
44
  option "path", :type => :string
45
45
  option "destructive", :type => :boolean, :default => false
46
46
  option "local", :type => :boolean, :default => false
47
+ option "use-v1-api", :type => :boolean, :default => true
47
48
  def install
48
49
 
49
50
  unless File.exist?('Puppetfile')
@@ -64,6 +65,7 @@ module Librarian
64
65
  environment.config_db.local["path"] = options["path"]
65
66
  end
66
67
 
68
+ environment.config_db.local['use-v1-api'] = options['use-v1-api'] ? '1' : nil
67
69
  environment.config_db.local['mode'] = options['local'] ? 'local' : nil
68
70
 
69
71
  resolve!
@@ -46,6 +46,9 @@ module Librarian
46
46
  config_db['mode'] == 'local'
47
47
  end
48
48
 
49
+ def use_v1_api
50
+ config_db['use-v1-api']
51
+ end
49
52
  end
50
53
  end
51
54
  end
@@ -8,6 +8,19 @@ module Librarian
8
8
  end
9
9
 
10
10
  class Dependency
11
+ include Librarian::Puppet::Util
12
+
13
+ def initialize(name, requirement, source)
14
+ assert_name_valid! name
15
+
16
+ # let's settle on provider-module syntax instead of provider/module
17
+ self.name = normalize_name(name)
18
+ self.requirement = Requirement.new(requirement)
19
+ self.source = source
20
+
21
+ @manifests = nil
22
+ end
23
+
11
24
  class Requirement
12
25
  def initialize(*args)
13
26
  args = initialize_normalize_args(args)
@@ -84,6 +97,8 @@ module Librarian
84
97
  end
85
98
 
86
99
  class ManifestSet
100
+ include Librarian::Puppet::Util
101
+
87
102
  private
88
103
 
89
104
  # Check if module doesn't exist and fail fast
@@ -93,7 +108,7 @@ module Librarian
93
108
 
94
109
  deps = Set.new
95
110
  until names.empty?
96
- name = names.shift
111
+ name = normalize_name(names.shift)
97
112
  next if deps.include?(name)
98
113
 
99
114
  deps << name
@@ -105,7 +120,6 @@ module Librarian
105
120
  end
106
121
 
107
122
  class Manifest
108
-
109
123
  class PreReleaseVersion
110
124
 
111
125
  # Compares pre-release component ids using Semver 2.0.0 spec
@@ -5,6 +5,7 @@ require 'librarian/manifest_set'
5
5
  module Librarian
6
6
  class Lockfile
7
7
  class Parser
8
+ include Librarian::Puppet::Util
8
9
 
9
10
  def parse(string)
10
11
  string = string.dup
@@ -26,8 +27,8 @@ module Librarian
26
27
  manifests = {}
27
28
  while lines.first =~ /^ {4}([\w\-\/]+) \((.*)\)$/ # This change allows forward slash
28
29
  lines.shift
29
- name = $1
30
- manifests[name] = {:version => $2, :dependencies => {}}
30
+ name, version = normalize_name($1), $2
31
+ manifests[name] = {:version => version, :dependencies => {}}
31
32
  while lines.first =~ /^ {6}([\w\-\/]+) \((.*)\)$/
32
33
  lines.shift
33
34
  manifests[name][:dependencies][$1] = $2.split(/,\s*/)
@@ -42,9 +43,10 @@ module Librarian
42
43
  dependencies = []
43
44
  while lines.first =~ /^ {2}([\w\-\/]+)(?: \((.*)\))?$/ # This change allows forward slash
44
45
  lines.shift
45
- name, requirement = $1, $2.split(/,\s*/)
46
+ name, requirement = normalize_name($1), $2.split(/,\s*/)
46
47
  dependencies << Dependency.new(name, requirement, manifests_index[name].source)
47
48
  end
49
+
48
50
  Resolution.new(dependencies, manifests)
49
51
  end
50
52
 
@@ -59,7 +59,7 @@ module Librarian
59
59
  install_path.rmtree
60
60
  end
61
61
 
62
- unpacked_path = version_unpacked_cache_path(version).join(name.split('/').last)
62
+ unpacked_path = version_unpacked_cache_path(version).join(name.split('-').last)
63
63
 
64
64
  unless unpacked_path.exist?
65
65
  raise Error, "#{unpacked_path} does not exist, something went wrong. Try removing it manually"
@@ -34,11 +34,15 @@ module Librarian
34
34
  private
35
35
 
36
36
  # Issue #223 dependencies may be duplicated
37
+ # and convert organization/modulename to organization-modulename
37
38
  def clear_duplicated_dependencies(data)
38
39
  return nil if data.nil?
39
40
  data.each do |m,versions|
40
41
  versions.each do |v|
41
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
+
42
46
  dependency_names = v["dependencies"].map {|d| d[0]}
43
47
  duplicated = dependency_names.select{ |e| dependency_names.count(e) > 1 }
44
48
  unless duplicated.empty?
@@ -53,6 +57,13 @@ module Librarian
53
57
  end
54
58
  end
55
59
  end
60
+ # convert organization/modulename to organization-modulename
61
+ data.keys.each do |m|
62
+ if m =~ %r{.*/.*}
63
+ data[normalize_name(m)] = data[m]
64
+ data.delete(m)
65
+ end
66
+ end
56
67
  data
57
68
  end
58
69
 
@@ -79,7 +90,7 @@ module Librarian
79
90
  def api_call(module_name, version=nil)
80
91
  url = source.uri.clone
81
92
  url.path += "#{'/' if url.path.empty? or url.path[-1] != '/'}api/v1/releases.json"
82
- url.query = "module=#{module_name}"
93
+ url.query = "module=#{module_name.sub('-','/')}" # v1 API expects "organization/module"
83
94
  url.query += "&version=#{version}" unless version.nil?
84
95
  debug { "Querying Forge API for module #{name}#{" and version #{version}" unless version.nil?}: #{url}" }
85
96
 
@@ -25,7 +25,7 @@ module Librarian
25
25
  else
26
26
  # should never get here as we use one repo object for each module (to be changed in the future)
27
27
  debug { "Looking up url for #{name}@#{version}" }
28
- release = PuppetForge::Release.find("#{name.sub('/','-')}-#{version}")
28
+ release = PuppetForge::Release.find("#{name}-#{version}")
29
29
  end
30
30
  "#{source}#{release.file_uri}"
31
31
  end
@@ -33,7 +33,7 @@ module Librarian
33
33
  private
34
34
 
35
35
  def get_module
36
- @module ||= PuppetForge::Module.find(name.sub('/','-'))
36
+ @module ||= PuppetForge::Module.find(name)
37
37
  raise(Error, "Unable to find module '#{name}' on #{source}") unless @module
38
38
  @module
39
39
  end
@@ -121,7 +121,7 @@ module Librarian
121
121
  end
122
122
 
123
123
  def install_path(name)
124
- environment.install_path.join(name.split('/').last)
124
+ environment.install_path.join(name.split('-').last)
125
125
  end
126
126
 
127
127
  def fetch_version(name, version_uri)
@@ -148,9 +148,10 @@ module Librarian
148
148
 
149
149
  def repo(name)
150
150
  @repo ||= {}
151
+
151
152
  unless @repo[name]
152
153
  # if we are using the official Forge then use API v3, otherwise stick to v1 for now
153
- if uri.hostname =~ /\.puppetlabs\.com$/
154
+ if uri.hostname =~ /\.puppetlabs\.com$/ || !environment.use_v1_api
154
155
  @repo[name] = RepoV3.new(self, name)
155
156
  else
156
157
  @repo[name] = RepoV1.new(self, name)
@@ -40,11 +40,11 @@ module Librarian
40
40
  end
41
41
 
42
42
  def install_version!(version, install_path)
43
- if environment.local? && !vendored?(source.uri.to_s, version)
43
+ if environment.local? && !vendored?(vendored_name, version)
44
44
  raise Error, "Could not find a local copy of #{source.uri} at #{version}."
45
45
  end
46
46
 
47
- vendor_cache(source.uri.to_s, version) unless vendored?(source.uri.to_s, version)
47
+ vendor_cache(source.uri.to_s, version) unless vendored?(vendored_name, version)
48
48
 
49
49
  cache_version_unpacked! version
50
50
 
@@ -62,19 +62,19 @@ module Librarian
62
62
 
63
63
  path.mkpath
64
64
 
65
- target = vendored?(source.uri.to_s, version) ? vendored_path(source.uri.to_s, version) : name
65
+ target = vendored?(vendored_name, version) ? vendored_path(vendored_name, version) : name
66
66
 
67
67
  Librarian::Posix.run!(%W{tar xzf #{target} -C #{path}})
68
68
  end
69
69
 
70
70
  def vendor_cache(name, version)
71
- clean_up_old_cached_versions(name)
71
+ clean_up_old_cached_versions(vendored_name(name))
72
72
 
73
73
  url = "https://api.github.com/repos/#{name}/tarball/#{version}"
74
74
  add_api_token_to_url(url)
75
75
 
76
76
  environment.vendor!
77
- File.open(vendored_path(name, version).to_s, 'wb') do |f|
77
+ File.open(vendored_path(vendored_name(name), version).to_s, 'wb') do |f|
78
78
  begin
79
79
  debug { "Downloading <#{url}> to <#{f.path}>" }
80
80
  open(url,
@@ -90,7 +90,7 @@ module Librarian
90
90
  end
91
91
 
92
92
  def clean_up_old_cached_versions(name)
93
- Dir["#{environment.vendor_cache}/#{name.sub('/', '-')}*.tar.gz"].each do |old_version|
93
+ Dir["#{environment.vendor_cache}/#{name}*.tar.gz"].each do |old_version|
94
94
  FileUtils.rm old_version
95
95
  end
96
96
  end
@@ -106,6 +106,8 @@ module Librarian
106
106
  def add_api_token_to_url url
107
107
  if token_key_nil?
108
108
  debug { "#{TOKEN_KEY} environment value is empty or missing" }
109
+ elsif url.include? "?"
110
+ url << "&access_token=#{ENV[TOKEN_KEY]}"
109
111
  else
110
112
  url << "?access_token=#{ENV[TOKEN_KEY]}"
111
113
  end
@@ -159,6 +161,10 @@ module Librarian
159
161
  options[:headers].each { |k, v| request.add_field k, v }
160
162
  http.request(request)
161
163
  end
164
+
165
+ def vendored_name(name = source.uri.to_s)
166
+ name.sub('/','-')
167
+ end
162
168
  end
163
169
  end
164
170
  end
@@ -98,7 +98,7 @@ module Librarian
98
98
  end
99
99
 
100
100
  def install_path(name)
101
- environment.install_path.join(name.split('/').last)
101
+ environment.install_path.join(name.split('-').last)
102
102
  end
103
103
 
104
104
  def fetch_version(name, version_uri)
@@ -26,11 +26,11 @@ module Librarian
26
26
  found_path = found_path(name)
27
27
  raise Error, "Path for #{name} doesn't contain a puppet module" if found_path.nil?
28
28
 
29
- unless name.include? '/'
30
- warn { "Invalid module name '#{name}', you should qualify it with 'ORGANIZATION/#{name}' for resolution to work correctly" }
29
+ unless name.include? '/' or name.include? '-'
30
+ warn { "Invalid module name '#{name}', you should qualify it with 'ORGANIZATION-#{name}' for resolution to work correctly" }
31
31
  end
32
32
 
33
- install_path = environment.install_path.join(name.split('/').last)
33
+ install_path = environment.install_path.join(name.split('-').last)
34
34
  if install_path.exist?
35
35
  debug { "Deleting #{relative_path_to(install_path)}" }
36
36
  install_path.rmtree
@@ -29,7 +29,7 @@ module Librarian
29
29
  end
30
30
 
31
31
  def vendored_path(name, version)
32
- environment.vendor_cache.join("#{name.sub("/", "-")}-#{version}.tar.gz")
32
+ environment.vendor_cache.join("#{name}-#{version}.tar.gz")
33
33
  end
34
34
 
35
35
  end
@@ -7,16 +7,16 @@ forge "https://forgeapi.puppetlabs.com"
7
7
  modulefile
8
8
 
9
9
  # A module from the Puppet Forge
10
- # mod 'puppetlabs/stdlib'
10
+ # mod 'puppetlabs-stdlib'
11
11
 
12
12
  # A module from git
13
- # mod 'puppetlabs/ntp',
13
+ # mod 'puppetlabs-ntp',
14
14
  # :git => 'git://github.com/puppetlabs/puppetlabs-ntp.git'
15
15
 
16
16
  # A module from a git branch/tag
17
- # mod 'puppetlabs/apt',
17
+ # mod 'puppetlabs-apt',
18
18
  # :git => 'https://github.com/puppetlabs/puppetlabs-apt.git',
19
19
  # :ref => '1.4.x'
20
20
 
21
21
  # A module from Github pre-packaged tarball
22
- # mod 'puppetlabs/apache', '0.6.0', :github_tarball => 'puppetlabs/puppetlabs-apache'
22
+ # mod 'puppetlabs-apache', '0.6.0', :github_tarball => 'puppetlabs/puppetlabs-apache'
@@ -33,6 +33,11 @@ module Librarian
33
33
  new_uri.password = nil
34
34
  new_uri
35
35
  end
36
+
37
+ # normalize module name to use organization-module instead of organization/module
38
+ def normalize_name(name)
39
+ name.sub('/','-')
40
+ end
36
41
  end
37
42
  end
38
43
  end
@@ -1,5 +1,5 @@
1
1
  module Librarian
2
2
  module Puppet
3
- VERSION = "1.1.2"
3
+ VERSION = "1.1.3"
4
4
  end
5
5
  end
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: 1.1.2
4
+ version: 1.1.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tim Sharpe
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2014-06-25 00:00:00.000000000 Z
12
+ date: 2014-07-22 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: librarian
@@ -39,20 +39,6 @@ dependencies:
39
39
  - - '>='
40
40
  - !ruby/object:Gem::Version
41
41
  version: '0'
42
- - !ruby/object:Gem::Dependency
43
- name: json
44
- requirement: !ruby/object:Gem::Requirement
45
- requirements:
46
- - - '>='
47
- - !ruby/object:Gem::Version
48
- version: '0'
49
- type: :runtime
50
- prerelease: false
51
- version_requirements: !ruby/object:Gem::Requirement
52
- requirements:
53
- - - '>='
54
- - !ruby/object:Gem::Version
55
- version: '0'
56
42
  - !ruby/object:Gem::Dependency
57
43
  name: rake
58
44
  requirement: !ruby/object:Gem::Requirement
@@ -200,7 +186,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
200
186
  requirements:
201
187
  - - '>='
202
188
  - !ruby/object:Gem::Version
203
- version: '0'
189
+ version: 1.9.0
204
190
  required_rubygems_version: !ruby/object:Gem::Requirement
205
191
  requirements:
206
192
  - - '>='