puppet-blacksmith 4.1.2 → 5.0.0

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
  SHA256:
3
- metadata.gz: 0c5fe0a0ea848cc10d19a20511cee762cb0b6441d99f08f637ba9c81a7fa4b8a
4
- data.tar.gz: a5a715ea02d0a7b4878679ec0a7d9c1350e361eac887c3127bafa2a444604093
3
+ metadata.gz: a927a889bdf0cfbd7d704e233b43a6eab265a1388c7374c5d2190807cad807b8
4
+ data.tar.gz: 58c976364590d195ef251220e90801560b57433cbf7a65274ad2dbd8b4d30908
5
5
  SHA512:
6
- metadata.gz: b1b32ddcc1022b19845e1bfcbafcb7aebb17d6096bfd17a332dbd84aa3aa0a877c1f447e5eb15bad0232a957d727873272b5a38049efe2f5ecd20e19235a139b
7
- data.tar.gz: 0f3757316471f2d9709f5b6d96dc63e0f6496b4a88ecb55bab0c9f6e908d548159f0ab201032fbf4297efe794f7a96fe147d504f5b41d1ea8c8092a029d38d82
6
+ metadata.gz: d0f90cd167ebd0d01d1f266795d8602548b0869654a48a98c58fc8c3652c125b9cde78e6041754fb4d3ab58ded58d277f059af8a7cb2f9955ccf2d14ffa2f2c7
7
+ data.tar.gz: 39df9eb53e3616be2f47ba972206c09d43928c7bbefb550b6cf167c2332c0a8764405f482bba59b99ee560a063b7ac3a8db295213460e4279d8363566e9541ad
@@ -1,6 +1,7 @@
1
1
  require 'rest-client'
2
2
  require 'json'
3
3
  require 'yaml'
4
+ require 'base64'
4
5
 
5
6
  module Blacksmith
6
7
  class Forge
@@ -8,14 +9,18 @@ module Blacksmith
8
9
  PUPPETLABS_FORGE = "https://forgeapi.puppetlabs.com"
9
10
  CREDENTIALS_FILE_HOME = "~/.puppetforge.yml"
10
11
  CREDENTIALS_FILE_PROJECT = '.puppetforge.yml'
11
- DEFAULT_CREDENTIALS = { 'url' => PUPPETLABS_FORGE }
12
+ FORGE_TYPE_PUPPET = 'puppet'
13
+ FORGE_TYPE_ARTIFACTORY = 'artifactory'
14
+ SUPPORTED_FORGE_TYPES = [FORGE_TYPE_PUPPET, FORGE_TYPE_ARTIFACTORY]
15
+ DEFAULT_CREDENTIALS = { 'url' => PUPPETLABS_FORGE, 'forge_type' => FORGE_TYPE_PUPPET }
12
16
  HEADERS = { 'User-Agent' => "Blacksmith/#{Blacksmith::VERSION} Ruby/#{RUBY_VERSION}-p#{RUBY_PATCHLEVEL} (#{RUBY_RELEASE_DATE}; #{RUBY_PLATFORM})" }
13
17
 
14
- attr_accessor :username, :password, :url, :client_id, :client_secret
18
+ attr_accessor :username, :password, :url, :client_id, :client_secret, :forge_type, :token
15
19
 
16
- def initialize(username = nil, password = nil, url = nil)
20
+ def initialize(username = nil, password = nil, url = nil, forge_type = nil, token = nil)
17
21
  self.username = username
18
22
  self.password = password
23
+ self.token = token
19
24
  RestClient.proxy = ENV['http_proxy']
20
25
  load_credentials
21
26
  load_client_credentials_from_file
@@ -24,19 +29,61 @@ module Blacksmith
24
29
  puts "Ignoring url entry in .puppetforge.yml: must point to the api server at #{PUPPETLABS_FORGE}, not the Forge webpage"
25
30
  self.url = PUPPETLABS_FORGE
26
31
  end
32
+ self.forge_type = forge_type unless forge_type.nil?
33
+ raise Blacksmith::Error, "Unsupported forge type: #{self.forge_type}" unless SUPPORTED_FORGE_TYPES.include?(self.forge_type)
27
34
  end
28
35
 
29
- def push!(name, package = nil)
36
+ def push!(name, package = nil, author = nil, version = nil)
37
+ user = author || username
30
38
  unless package
31
- regex = /^#{username}-#{name}-.*\.tar\.gz$/
39
+ v = version ? Regexp.escape(version) : '.*'
40
+ regex = /^#{user}-#{name}-#{v}\.tar\.gz$/
32
41
  pkg = File.expand_path("pkg")
33
- f = Dir.new(pkg).select{|f| f.match(regex)}.last
42
+ f = Dir.new(pkg).select{|fn| fn.match(regex)}.last
34
43
  raise Errno::ENOENT, "File not found in #{pkg} with regex #{regex}" if f.nil?
35
44
  package = File.join(pkg, f)
36
45
  end
37
46
  raise Errno::ENOENT, "File does not exist: #{package}" unless File.exists?(package)
38
47
 
39
- # login to the puppet forge
48
+ upload(user, name, package)
49
+ end
50
+
51
+ private
52
+
53
+ def upload(author, name, file)
54
+ case forge_type
55
+ when FORGE_TYPE_ARTIFACTORY
56
+ RestClient::Request.execute(:method => :put, :url => http_url(author, name, file), :payload => File.new(file, 'rb'), :headers => http_headers)
57
+ else
58
+ RestClient::Request.execute(:method => :post, :url => http_url(author, name, file), :payload => {:file => File.new(file, 'rb')}, :headers => http_headers)
59
+ end
60
+ rescue RestClient::Exception => e
61
+ raise Blacksmith::Error, "Error uploading #{package} to the forge #{url} [#{e.message}]: #{e.response}"
62
+ end
63
+
64
+ def http_url(author, name, file)
65
+ case forge_type
66
+ when FORGE_TYPE_ARTIFACTORY
67
+ "#{url}/#{author}/#{name}/#{File.basename(file)}"
68
+ else
69
+ "#{url}/v2/releases"
70
+ end
71
+ end
72
+
73
+ def http_headers
74
+ case forge_type
75
+ when FORGE_TYPE_ARTIFACTORY
76
+ if token
77
+ HEADERS.merge({'Authorization' => "Bearer #{token}"})
78
+ else
79
+ HEADERS.merge({'Authorization' => "Basic " + Base64.strict_encode64("#{username}:#{password}")})
80
+ end
81
+ else
82
+ HEADERS.merge({'Authorization' => "Bearer #{token || oauth_access_token}"})
83
+ end
84
+ end
85
+
86
+ def oauth_access_token
40
87
  begin
41
88
  response = RestClient.post("#{url}/oauth/token", {
42
89
  'client_id' => client_id,
@@ -49,20 +96,9 @@ module Blacksmith
49
96
  raise Blacksmith::Error, "Error login to the forge #{url} as #{username} [#{e.message}]: #{e.response}"
50
97
  end
51
98
  login_data = JSON.parse(response)
52
- access_token = login_data['access_token']
53
-
54
- # upload the file
55
- begin
56
- response = RestClient.post("#{url}/v2/releases",
57
- {:file => File.new(package, 'rb')},
58
- HEADERS.merge({'Authorization' => "Bearer #{access_token}"}))
59
- rescue RestClient::Exception => e
60
- raise Blacksmith::Error, "Error uploading #{package} to the forge #{url} [#{e.message}]: #{e.response}"
61
- end
99
+ login_data['access_token']
62
100
  end
63
101
 
64
- private
65
-
66
102
  def load_credentials
67
103
  file_credentials = load_credentials_from_file
68
104
  env_credentials = load_credentials_from_env
@@ -72,21 +108,25 @@ module Blacksmith
72
108
 
73
109
  self.username = credentials['username'] if credentials['username']
74
110
  self.password = credentials['password'] if credentials['password']
111
+ self.token = credentials['token'] if credentials['token']
75
112
  if credentials['forge']
76
113
  # deprecated
77
114
  puts "'forge' entry is deprecated in .puppetforge.yml, use 'url'"
78
115
  self.url = credentials['forge']
79
116
  end
80
117
  self.url = credentials['url'] if credentials['url']
118
+ self.forge_type = credentials['forge_type'] if credentials['forge_type']
81
119
 
82
- unless self.username && self.password
120
+ unless (self.username && self.password) || self.token
83
121
  raise Blacksmith::Error, <<-eos
84
122
  Could not find Puppet Forge credentials!
85
123
 
86
124
  Please set the environment variables
87
125
  BLACKSMITH_FORGE_URL
126
+ BLACKSMITH_FORGE_TYPE
88
127
  BLACKSMITH_FORGE_USERNAME
89
128
  BLACKSMITH_FORGE_PASSWORD
129
+ BLACKSMITH_FORGE_TOKEN
90
130
 
91
131
  or create the file '#{CREDENTIALS_FILE_PROJECT}' or '#{CREDENTIALS_FILE_HOME}'
92
132
  with content similiar to:
@@ -132,6 +172,14 @@ password: mypassword
132
172
  credentials['url'] = ENV['BLACKSMITH_FORGE_URL']
133
173
  end
134
174
 
175
+ if ENV['BLACKSMITH_FORGE_TYPE']
176
+ credentials['forge_type'] = ENV['BLACKSMITH_FORGE_TYPE']
177
+ end
178
+
179
+ if ENV['BLACKSMITH_FORGE_TOKEN']
180
+ credentials['token'] = ENV['BLACKSMITH_FORGE_TOKEN']
181
+ end
182
+
135
183
  return credentials
136
184
  end
137
185
 
@@ -61,7 +61,7 @@ module Blacksmith
61
61
  desc "Bump module version to the next #{level.upcase} version"
62
62
  task level do
63
63
  m = Blacksmith::Modulefile.new
64
- v = m.send("bump_#{level}!")
64
+ v = m.bump!(level)
65
65
  puts "Bumping version from #{m.version} to #{v}"
66
66
  end
67
67
  end
@@ -129,8 +129,8 @@ module Blacksmith
129
129
  task :push => :build do
130
130
  m = Blacksmith::Modulefile.new
131
131
  forge = Blacksmith::Forge.new
132
- puts "Uploading to Puppet Forge #{forge.username}/#{m.name}"
133
- forge.push!(m.name)
132
+ puts "Uploading to Puppet Forge #{m.author}/#{m.name}"
133
+ forge.push!(m.name, nil, m.author, m.version)
134
134
  end
135
135
 
136
136
  desc "Runs clean again"
@@ -139,7 +139,7 @@ module Blacksmith
139
139
  Rake::Task["clean"].execute
140
140
  end
141
141
 
142
- desc "Release the Puppet module, doing a clean, build, tag, push, bump_commit and git push."
142
+ desc "Release the Puppet module, doing a clean, build, bump_commit, tag, push and git push."
143
143
  release_dependencies = @build ? [:clean, :build, :bump_commit, :tag, :push] : [:clean, :bump_commit, :tag]
144
144
  task :release => release_dependencies do
145
145
  puts "Pushing to remote git repo"
@@ -1,3 +1,3 @@
1
1
  module Blacksmith
2
- VERSION = '4.1.2'
2
+ VERSION = '5.0.0'
3
3
  end
@@ -115,9 +115,11 @@ module Blacksmith
115
115
 
116
116
  def increment!(term)
117
117
  new_version = clone
118
- new_value = send(term) + 1
119
118
 
120
- new_version.send("#{term}=", new_value)
119
+ if term != :patch || @pre.nil?
120
+ new_version.send("#{term}=", send(term) + 1)
121
+ end
122
+
121
123
  new_version.minor = 0 if term == :major
122
124
  new_version.patch = 0 if term == :major || term == :minor
123
125
  new_version.build = new_version.pre = nil
@@ -16,7 +16,7 @@
16
16
  },
17
17
  {
18
18
  "name": "puppet",
19
- "version_requirement": ">=2.7.20 <4.0.0"
19
+ "version_requirement": ">=2.7.20 <7.0.0"
20
20
  }
21
21
  ],
22
22
  "name": "maestrodev-test",
@@ -28,9 +28,9 @@
28
28
  "description": "Standard Library for Puppet Modules",
29
29
  "project_page": "https://github.com/puppetlabs/puppetlabs-stdlib",
30
30
  "dependencies": [
31
- {
32
- "name": "puppetlabs-stdlib",
33
- "version_requirement": ">= 3.0.0"
34
- }
31
+ {
32
+ "name": "puppetlabs-stdlib",
33
+ "version_requirement": ">= 3.0.0"
34
+ }
35
35
  ]
36
36
  }
@@ -91,7 +91,7 @@ describe 'Blacksmith::Forge' do
91
91
  :headers => {})
92
92
 
93
93
  stub_request(:post, "#{forge}/v2/releases").with(
94
- :headers => headers.merge({'Accept'=>'*/*', 'Accept-Encoding'=>'gzip, deflate', 'Authorization'=>'Bearer e52f78b62e97cb8d8db6659a73aa522cca0f5c74d4714e0ed0bdd10000000000', 'Content-Type'=>%r{\Amultipart/form-data;}})
94
+ :headers => headers.merge({'Accept'=>'*/*', 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'Authorization'=>'Bearer e52f78b62e97cb8d8db6659a73aa522cca0f5c74d4714e0ed0bdd10000000000', 'Content-Type'=>%r{\Amultipart/form-data;}})
95
95
  ) { |request |
96
96
  request.body =~ %r{Content-Disposition: form-data; name=\"file\"; filename=\"maestrodev-test.tar.gz\"\r\nContent-Type: application/gzip}
97
97
  }.to_return(:status => 200, :body => File.read(File.join(spec_data, "response.json")), :headers => {})
@@ -37,7 +37,7 @@ describe 'Blacksmith::Modulefile' do
37
37
  },
38
38
  {
39
39
  "name": "puppet",
40
- "version_requirement": ">=2.7.20 <4.0.0"
40
+ "version_requirement": ">=2.7.20 <7.0.0"
41
41
  }
42
42
  ],
43
43
  "name": "maestrodev-test",
@@ -83,7 +83,7 @@ describe 'Blacksmith::Modulefile' do
83
83
  },
84
84
  {
85
85
  "name": "puppet",
86
- "version_requirement": ">=2.7.20 <4.0.0"
86
+ "version_requirement": ">=2.7.20 <7.0.0"
87
87
  }
88
88
  ],
89
89
  "name": "maestrodev-test",
@@ -116,25 +116,28 @@ describe 'Blacksmith::Modulefile' do
116
116
  describe 'increase_version' do
117
117
  it { expect(subject.increase_version("1.0.0")).to eql("1.0.1") }
118
118
  it { expect(subject.increase_version("1.0.1")).to eql("1.0.2") }
119
- it { expect { subject.increase_version("1.0") }.to raise_error }
120
- it { expect { subject.increase_version("1.0.12qwe") }.to raise_error }
119
+ it { expect { subject.increase_version("1.0") }.to raise_error(ArgumentError) }
120
+ it { expect { subject.increase_version("1.0.12qwe") }.to raise_error(ArgumentError) }
121
121
  end
122
122
 
123
123
  describe 'bump patch version' do
124
124
  it { expect(subject.increase_version("1.0.0", :patch)).to eql("1.0.1") }
125
125
  it { expect(subject.increase_version("1.1.0", :patch)).to eql("1.1.1") }
126
126
  it { expect(subject.increase_version("1.1.1", :patch)).to eql("1.1.2") }
127
+ it { expect(subject.increase_version("1.1.2-rc0", :patch)).to eql("1.1.2") }
127
128
  end
128
129
 
129
130
  describe 'bump minor version' do
130
131
  it { expect(subject.increase_version("1.0.0", :minor)).to eql("1.1.0") }
131
132
  it { expect(subject.increase_version("1.1.0", :minor)).to eql("1.2.0") }
132
133
  it { expect(subject.increase_version("1.1.1", :minor)).to eql("1.2.0") }
134
+ it { expect(subject.increase_version("1.1.1-rc0", :minor)).to eql("1.2.0") }
133
135
  end
134
136
 
135
137
  describe 'bump major version' do
136
138
  it { expect(subject.increase_version("1.0.0", :major)).to eql("2.0.0") }
137
139
  it { expect(subject.increase_version("1.1.0", :major)).to eql("2.0.0") }
138
140
  it { expect(subject.increase_version("1.1.1", :major)).to eql("2.0.0") }
141
+ it { expect(subject.increase_version("1.1.1-rc0", :major)).to eql("2.0.0") }
139
142
  end
140
143
  end
metadata CHANGED
@@ -1,14 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: puppet-blacksmith
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.1.2
4
+ version: 5.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - MaestroDev
8
+ - Vox Pupuli
8
9
  autorequire:
9
10
  bindir: bin
10
11
  cert_chain: []
11
- date: 2017-12-15 00:00:00.000000000 Z
12
+ date: 2019-09-13 00:00:00.000000000 Z
12
13
  dependencies:
13
14
  - !ruby/object:Gem::Dependency
14
15
  name: rest-client
@@ -38,6 +39,20 @@ dependencies:
38
39
  - - ">="
39
40
  - !ruby/object:Gem::Version
40
41
  version: '0'
42
+ - !ruby/object:Gem::Dependency
43
+ name: pdk
44
+ requirement: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - ">="
47
+ - !ruby/object:Gem::Version
48
+ version: '0'
49
+ type: :development
50
+ prerelease: false
51
+ version_requirements: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - ">="
54
+ - !ruby/object:Gem::Version
55
+ version: '0'
41
56
  - !ruby/object:Gem::Dependency
42
57
  name: puppet
43
58
  requirement: !ruby/object:Gem::Requirement
@@ -124,7 +139,7 @@ dependencies:
124
139
  version: '2.0'
125
140
  description: Puppet module tools for development and Puppet Forge management
126
141
  email:
127
- - info@maestrodev.com
142
+ - voxpupuli@groups.io
128
143
  executables: []
129
144
  extensions: []
130
145
  extra_rdoc_files: []
@@ -160,7 +175,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
160
175
  requirements:
161
176
  - - ">="
162
177
  - !ruby/object:Gem::Version
163
- version: 2.0.0
178
+ version: 2.4.0
164
179
  required_rubygems_version: !ruby/object:Gem::Requirement
165
180
  requirements:
166
181
  - - ">="
@@ -168,18 +183,18 @@ required_rubygems_version: !ruby/object:Gem::Requirement
168
183
  version: '0'
169
184
  requirements: []
170
185
  rubyforge_project:
171
- rubygems_version: 2.7.3
186
+ rubygems_version: 2.7.7
172
187
  signing_key:
173
188
  specification_version: 4
174
189
  summary: Tasks to manage Puppet module builds
175
190
  test_files:
176
- - spec/data/Modulefile
177
- - spec/data/maestrodev-test/metadata.json
178
- - spec/data/response.json
179
- - spec/data/metadata.json
180
- - spec/puppet_blacksmith/forge_live_spec.rb
181
191
  - spec/puppet_blacksmith/forge_shared.rb
182
- - spec/puppet_blacksmith/forge_spec.rb
192
+ - spec/puppet_blacksmith/forge_live_spec.rb
183
193
  - spec/puppet_blacksmith/git_spec.rb
184
194
  - spec/puppet_blacksmith/modulefile_spec.rb
195
+ - spec/puppet_blacksmith/forge_spec.rb
185
196
  - spec/spec_helper.rb
197
+ - spec/data/maestrodev-test/metadata.json
198
+ - spec/data/Modulefile
199
+ - spec/data/response.json
200
+ - spec/data/metadata.json