modulesync 2.6.0 → 3.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -2,7 +2,7 @@ module ModuleSync
2
2
  module GitService
3
3
  # Generic class for git services
4
4
  class Base
5
- def open_pull_request(repo_path:, namespace:, title:, message:, source_branch:, target_branch:, labels:, noop:) # rubocop:disable Metrics/ParameterLists
5
+ def open_pull_request(repo_path:, namespace:, title:, message:, source_branch:, target_branch:, labels:, noop:)
6
6
  unless source_branch != target_branch
7
7
  raise ModuleSync::Error,
8
8
  "Unable to open a pull request with the same source and target branch: '#{source_branch}'"
@@ -55,7 +55,7 @@ module ModuleSync
55
55
 
56
56
  protected
57
57
 
58
- def _open_pull_request(repo_path:, namespace:, title:, message:, source_branch:, target_branch:, labels:, noop:) # rubocop:disable Metrics/ParameterLists
58
+ def _open_pull_request(repo_path:, namespace:, title:, message:, source_branch:, target_branch:, labels:, noop:)
59
59
  raise NotImplementedError
60
60
  end
61
61
  end
@@ -13,12 +13,12 @@ module ModuleSync
13
13
  Octokit.configure do |c|
14
14
  c.api_endpoint = endpoint
15
15
  end
16
- @api = Octokit::Client.new(:access_token => token)
16
+ @api = Octokit::Client.new(access_token: token)
17
17
  end
18
18
 
19
19
  private
20
20
 
21
- def _open_pull_request(repo_path:, namespace:, title:, message:, source_branch:, target_branch:, labels:, noop:) # rubocop:disable Metrics/ParameterLists
21
+ def _open_pull_request(repo_path:, namespace:, title:, message:, source_branch:, target_branch:, labels:, noop:)
22
22
  head = "#{namespace}:#{source_branch}"
23
23
 
24
24
  if noop
@@ -28,9 +28,9 @@ module ModuleSync
28
28
  end
29
29
 
30
30
  pull_requests = @api.pull_requests(repo_path,
31
- :state => 'open',
32
- :base => target_branch,
33
- :head => head)
31
+ state: 'open',
32
+ base: target_branch,
33
+ head: head)
34
34
  unless pull_requests.empty?
35
35
  # Skip creating the PR if it exists already.
36
36
  $stdout.puts "Skipped! #{pull_requests.length} PRs found for branch '#{source_branch}'"
@@ -11,8 +11,8 @@ module ModuleSync
11
11
  super()
12
12
 
13
13
  @api = Gitlab::Client.new(
14
- :endpoint => endpoint,
15
- :private_token => token,
14
+ endpoint: endpoint,
15
+ private_token: token,
16
16
  )
17
17
  end
18
18
 
@@ -26,7 +26,7 @@ module ModuleSync
26
26
 
27
27
  private
28
28
 
29
- def _open_pull_request(repo_path:, namespace:, title:, message:, source_branch:, target_branch:, labels:, noop:) # rubocop:disable Metrics/ParameterLists, Lint/UnusedMethodArgument
29
+ def _open_pull_request(repo_path:, namespace:, title:, message:, source_branch:, target_branch:, labels:, noop:) # rubocop:disable Lint/UnusedMethodArgument
30
30
  if noop
31
31
  $stdout.puts "Using no-op. Would submit MR '#{title}' to '#{repo_path}' " \
32
32
  "- merges #{source_branch} into #{target_branch}"
@@ -34,9 +34,9 @@ module ModuleSync
34
34
  end
35
35
 
36
36
  merge_requests = @api.merge_requests(repo_path,
37
- :state => 'opened',
38
- :source_branch => source_branch,
39
- :target_branch => target_branch)
37
+ state: 'opened',
38
+ source_branch: source_branch,
39
+ target_branch: target_branch)
40
40
  unless merge_requests.empty?
41
41
  # Skip creating the MR if it exists already.
42
42
  $stdout.puts "Skipped! #{merge_requests.length} MRs found for branch '#{source_branch}'"
@@ -45,9 +45,9 @@ module ModuleSync
45
45
 
46
46
  mr = @api.create_merge_request(repo_path,
47
47
  title,
48
- :source_branch => source_branch,
49
- :target_branch => target_branch,
50
- :labels => labels)
48
+ source_branch: source_branch,
49
+ target_branch: target_branch,
50
+ labels: labels)
51
51
  $stdout.puts \
52
52
  "Submitted MR '#{title}' to '#{repo_path}' " \
53
53
  "- merges '#{source_branch}' into '#{target_branch}'"
@@ -15,7 +15,7 @@ module ModuleSync
15
15
  erb_obj = if RUBY_VERSION >= '2.7'
16
16
  ERB.new(template, trim_mode: '-')
17
17
  else
18
- ERB.new(template, nil, '-')
18
+ ERB.new(template, trim_mode: '-')
19
19
  end
20
20
  erb_obj.filename = template_file
21
21
  erb_obj.def_method(ForgeModuleFile, 'render()', template_file)
@@ -140,8 +140,8 @@ module ModuleSync
140
140
  begin
141
141
  opts_commit = {}
142
142
  opts_push = {}
143
- opts_commit = { :amend => true } if options[:amend]
144
- opts_push = { :force => true } if options[:force]
143
+ opts_commit = { amend: true } if options[:amend]
144
+ opts_push = { force: true } if options[:force]
145
145
  if options[:pre_commit_script]
146
146
  script = "#{File.dirname(File.dirname(__FILE__))}/../contrib/#{options[:pre_commit_script]}"
147
147
  `#{script} #{@directory}`
data/lib/modulesync.rb CHANGED
@@ -12,17 +12,17 @@ require 'modulesync/util'
12
12
 
13
13
  require 'monkey_patches'
14
14
 
15
- module ModuleSync # rubocop:disable Metrics/ModuleLength
15
+ module ModuleSync
16
16
  class Error < StandardError; end
17
17
 
18
18
  include Constants
19
19
 
20
20
  def self.config_defaults
21
21
  {
22
- :project_root => 'modules/',
23
- :managed_modules_conf => 'managed_modules.yml',
24
- :configs => '.',
25
- :tag_pattern => '%s',
22
+ project_root: 'modules/',
23
+ managed_modules_conf: 'managed_modules.yml',
24
+ configs: '.',
25
+ tag_pattern: '%s',
26
26
  }
27
27
  end
28
28
 
@@ -33,7 +33,7 @@ module ModuleSync # rubocop:disable Metrics/ModuleLength
33
33
  def self.local_file(config_path, file)
34
34
  path = File.join(config_path, MODULE_FILES_DIR, file)
35
35
  if !File.exist?("#{path}.erb") && File.exist?(path)
36
- $stderr.puts "Warning: using '#{path}' as template without '.erb' suffix"
36
+ warn "Warning: using '#{path}' as template without '.erb' suffix"
37
37
  path
38
38
  else
39
39
  "#{path}.erb"
@@ -50,9 +50,9 @@ module ModuleSync # rubocop:disable Metrics/ModuleLength
50
50
  .collect { |p| p.chomp('.erb') }
51
51
  .to_a
52
52
  else
53
- $stderr.puts "#{local_template_dir} does not exist." \
54
- ' Check that you are working in your module configs directory or' \
55
- ' that you have passed in the correct directory with -c.'
53
+ warn "#{local_template_dir} does not exist. " \
54
+ 'Check that you are working in your module configs directory or ' \
55
+ 'that you have passed in the correct directory with -c.'
56
56
  exit 1
57
57
  end
58
58
  end
@@ -68,8 +68,8 @@ module ModuleSync # rubocop:disable Metrics/ModuleLength
68
68
 
69
69
  managed_modules = Util.parse_config(config_file)
70
70
  if managed_modules.empty?
71
- $stderr.puts "No modules found in #{config_file}." \
72
- ' Check that you specified the right :configs directory and :managed_modules_conf file.'
71
+ warn "No modules found in #{config_file}. " \
72
+ 'Check that you specified the right :configs directory and :managed_modules_conf file.'
73
73
  exit 1
74
74
  end
75
75
  managed_modules.select! { |m| m =~ Regexp.new(filter) } unless filter.nil?
@@ -99,16 +99,16 @@ module ModuleSync # rubocop:disable Metrics/ModuleLength
99
99
  erb = Renderer.build(template_file)
100
100
  # Meta data passed to the template as @metadata[:name]
101
101
  metadata = {
102
- :module_name => settings.additional_settings[:puppet_module],
103
- :namespace => settings.additional_settings[:namespace],
104
- :workdir => puppet_module.working_directory,
105
- :target_file => target_file,
102
+ module_name: settings.additional_settings[:puppet_module],
103
+ namespace: settings.additional_settings[:namespace],
104
+ workdir: puppet_module.working_directory,
105
+ target_file: target_file,
106
106
  }
107
107
  template = Renderer.render(erb, configs, metadata)
108
108
  mode = File.stat(template_file).mode
109
109
  Renderer.sync(template, target_file, mode)
110
110
  rescue StandardError
111
- $stderr.puts "#{puppet_module.given_name}: Error while rendering file: '#{filename}'"
111
+ warn "#{puppet_module.given_name}: Error while rendering file: '#{filename}'"
112
112
  raise
113
113
  end
114
114
  end
@@ -128,9 +128,9 @@ module ModuleSync # rubocop:disable Metrics/ModuleLength
128
128
  defaults,
129
129
  module_configs[GLOBAL_DEFAULTS_KEY] || {},
130
130
  module_configs,
131
- :puppet_module => puppet_module.repository_name,
132
- :git_base => options[:git_base],
133
- :namespace => puppet_module.repository_namespace)
131
+ puppet_module: puppet_module.repository_name,
132
+ git_base: options[:git_base],
133
+ namespace: puppet_module.repository_namespace)
134
134
 
135
135
  settings.unmanaged_files(module_files).each do |filename|
136
136
  $stdout.puts "Not managing '#{filename}' in '#{puppet_module.given_name}'"
@@ -178,7 +178,7 @@ module ModuleSync # rubocop:disable Metrics/ModuleLength
178
178
  manage_module(puppet_module, module_files, defaults)
179
179
  rescue ModuleSync::Error, Git::GitExecuteError => e
180
180
  message = e.message || 'Error during `update`'
181
- $stderr.puts "#{puppet_module.given_name}: #{message}"
181
+ warn "#{puppet_module.given_name}: #{message}"
182
182
  exit 1 unless options[:skip_broken]
183
183
  errors = true
184
184
  $stdout.puts "Skipping '#{puppet_module.given_name}' as update process failed"
@@ -222,7 +222,7 @@ module ModuleSync # rubocop:disable Metrics/ModuleLength
222
222
  raise Thor::Error, message if @options[:fail_fast]
223
223
 
224
224
  errors[puppet_module.given_name] = message
225
- $stderr.puts message
225
+ warn message
226
226
  end
227
227
 
228
228
  $stdout.puts ''
data/modulesync.gemspec CHANGED
@@ -3,33 +3,29 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
3
 
4
4
  Gem::Specification.new do |spec|
5
5
  spec.name = 'modulesync'
6
- spec.version = '2.6.0'
6
+ spec.version = '3.1.0'
7
7
  spec.authors = ['Vox Pupuli']
8
8
  spec.email = ['voxpupuli@groups.io']
9
9
  spec.summary = 'Puppet Module Synchronizer'
10
10
  spec.description = 'Utility to synchronize common files across puppet modules in Github.'
11
11
  spec.homepage = 'https://github.com/voxpupuli/modulesync'
12
12
  spec.license = 'Apache-2.0'
13
- spec.required_ruby_version = '>= 2.5.0'
13
+ spec.required_ruby_version = '>= 2.7.0'
14
14
 
15
15
  spec.files = `git ls-files -z`.split("\x0")
16
16
  spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
17
17
  spec.require_paths = ['lib']
18
18
 
19
19
  spec.add_development_dependency 'aruba', '~>2.0'
20
- spec.add_development_dependency 'bundler'
21
20
  spec.add_development_dependency 'cucumber'
22
21
  spec.add_development_dependency 'rake'
23
22
  spec.add_development_dependency 'rspec'
24
- spec.add_development_dependency 'rubocop', '~> 1.28.2'
25
- spec.add_development_dependency 'rubocop-performance'
26
- spec.add_development_dependency 'rubocop-rake'
27
- spec.add_development_dependency 'rubocop-rspec'
28
23
  spec.add_development_dependency 'simplecov'
24
+ spec.add_development_dependency 'voxpupuli-rubocop', '~> 2.0'
29
25
 
30
26
  spec.add_runtime_dependency 'git', '~>1.7'
31
27
  spec.add_runtime_dependency 'gitlab', '~>4.0'
32
- spec.add_runtime_dependency 'octokit', '~>4.0'
33
- spec.add_runtime_dependency 'puppet-blacksmith', '>= 3.0', '< 7'
28
+ spec.add_runtime_dependency 'octokit', '>=4', '<8'
29
+ spec.add_runtime_dependency 'puppet-blacksmith', '>= 3.0', '< 8'
34
30
  spec.add_runtime_dependency 'thor'
35
31
  end
@@ -102,21 +102,21 @@ module ModuleSync
102
102
 
103
103
  def tags
104
104
  FileUtils.chdir(bare_repo_dir) do
105
- return run %w{git tag --list}
105
+ return run %w[git tag --list]
106
106
  end
107
107
  end
108
108
 
109
109
  def delete_branch(branch)
110
110
  FileUtils.chdir(bare_repo_dir) do
111
- run %W{git branch -D #{branch}}
111
+ run %W[git branch -D #{branch}]
112
112
  end
113
113
  end
114
114
 
115
115
  def create_branch(branch, from = nil)
116
116
  from ||= default_branch
117
117
  FileUtils.chdir(tmp_repo_dir) do
118
- run %W{git branch -c #{from} #{branch}}
119
- run %W{git push --set-upstream origin #{branch}}
118
+ run %W[git branch -c #{from} #{branch}]
119
+ run %W[git push --set-upstream origin #{branch}]
120
120
  end
121
121
  end
122
122
 
@@ -7,6 +7,7 @@ module ModuleSync
7
7
 
8
8
  def self.working_directory
9
9
  raise 'Working directory must be set' if @working_directory.nil?
10
+
10
11
  FileUtils.mkdir_p @working_directory
11
12
  @working_directory
12
13
  end
@@ -4,13 +4,19 @@ require 'modulesync/git_service/factory'
4
4
  describe ModuleSync::GitService::Factory do
5
5
  context 'when instantiate a GitHub service without credentials' do
6
6
  it 'raises an error' do
7
- expect { ModuleSync::GitService::Factory.instantiate(type: :github, endpoint: nil, token: nil) }.to raise_error(ModuleSync::GitService::MissingCredentialsError)
7
+ expect do
8
+ ModuleSync::GitService::Factory.instantiate(type: :github, endpoint: nil,
9
+ token: nil)
10
+ end.to raise_error(ModuleSync::GitService::MissingCredentialsError)
8
11
  end
9
12
  end
10
13
 
11
14
  context 'when instantiate a GitLab service without credentials' do
12
15
  it 'raises an error' do
13
- expect { ModuleSync::GitService::Factory.instantiate(type: :gitlab, endpoint: nil, token: nil) }.to raise_error(ModuleSync::GitService::MissingCredentialsError)
16
+ expect do
17
+ ModuleSync::GitService::Factory.instantiate(type: :gitlab, endpoint: nil,
18
+ token: nil)
19
+ end.to raise_error(ModuleSync::GitService::MissingCredentialsError)
14
20
  end
15
21
  end
16
22
  end
@@ -4,8 +4,8 @@ require 'modulesync/git_service/github'
4
4
 
5
5
  describe ModuleSync::GitService::GitHub do
6
6
  context '::open_pull_request' do
7
- before(:each) do
8
- @client = double()
7
+ before do
8
+ @client = double
9
9
  allow(Octokit::Client).to receive(:new).and_return(@client)
10
10
  @it = ModuleSync::GitService::GitHub.new('test', 'https://api.github.com')
11
11
  end
@@ -28,53 +28,51 @@ describe ModuleSync::GitService::GitHub do
28
28
  it 'submits PR when --pr is set' do
29
29
  allow(@client).to receive(:pull_requests)
30
30
  .with(args[:repo_path],
31
- :state => 'open',
32
- :base => 'master',
33
- :head => "#{args[:namespace]}:#{args[:source_branch]}"
34
- ).and_return([])
31
+ state: 'open',
32
+ base: 'master',
33
+ head: "#{args[:namespace]}:#{args[:source_branch]}").and_return([])
35
34
  expect(@client).to receive(:create_pull_request)
36
35
  .with(args[:repo_path],
37
36
  'master',
38
37
  args[:source_branch],
39
38
  args[:title],
40
- args[:message]
41
- ).and_return({"html_url" => "http://example.com/pulls/22"})
39
+ args[:message]).and_return({ 'html_url' => 'http://example.com/pulls/22' })
42
40
  expect { @it.open_pull_request(**args) }.to output(/Submitted PR/).to_stdout
43
41
  end
44
42
 
45
43
  it 'skips submitting PR if one has already been issued' do
46
44
  pr = {
47
- "title" => "Test title",
48
- "html_url" => "https://example.com/pulls/44",
49
- "number" => "44"
45
+ 'title' => 'Test title',
46
+ 'html_url' => 'https://example.com/pulls/44',
47
+ 'number' => '44',
50
48
  }
51
49
 
52
50
  expect(@client).to receive(:pull_requests)
53
51
  .with(args[:repo_path],
54
- :state => 'open',
55
- :base => 'master',
56
- :head => "#{args[:namespace]}:#{args[:source_branch]}"
57
- ).and_return([pr])
52
+ state: 'open',
53
+ base: 'master',
54
+ head: "#{args[:namespace]}:#{args[:source_branch]}").and_return([pr])
58
55
  expect { @it.open_pull_request(**args) }.to output("Skipped! 1 PRs found for branch 'test'\n").to_stdout
59
56
  end
60
57
 
61
58
  context 'when labels are set' do
62
- let(:labels) { %w{HELLO WORLD} }
59
+ let(:labels) { %w[HELLO WORLD] }
63
60
 
64
61
  it 'adds labels to PR' do
65
- allow(@client).to receive(:create_pull_request).and_return({"html_url" => "http://example.com/pulls/22", "number" => "44"})
62
+ allow(@client).to receive(:create_pull_request).and_return({ 'html_url' => 'http://example.com/pulls/22',
63
+ 'number' => '44', })
66
64
  allow(@client).to receive(:pull_requests)
67
65
  .with(args[:repo_path],
68
- :state => 'open',
69
- :base => 'master',
70
- :head => "#{args[:namespace]}:#{args[:source_branch]}"
71
- ).and_return([])
66
+ state: 'open',
67
+ base: 'master',
68
+ head: "#{args[:namespace]}:#{args[:source_branch]}").and_return([])
72
69
  expect(@client).to receive(:add_labels_to_an_issue)
73
70
  .with(args[:repo_path],
74
- "44",
75
- ["HELLO", "WORLD"]
76
- )
77
- expect { @it.open_pull_request(**args) }.to output(/Attaching the following labels to PR 44: HELLO, WORLD/).to_stdout
71
+ '44',
72
+ %w[HELLO WORLD])
73
+ expect do
74
+ @it.open_pull_request(**args)
75
+ end.to output(/Attaching the following labels to PR 44: HELLO, WORLD/).to_stdout
78
76
  end
79
77
  end
80
78
  end
@@ -4,8 +4,8 @@ require 'modulesync/git_service/gitlab'
4
4
 
5
5
  describe ModuleSync::GitService::GitLab do
6
6
  context '::open_pull_request' do
7
- before(:each) do
8
- @client = double()
7
+ before do
8
+ @client = double
9
9
  allow(Gitlab::Client).to receive(:new).and_return(@client)
10
10
  @it = ModuleSync::GitService::GitLab.new('test', 'https://gitlab.com/api/v4')
11
11
  end
@@ -28,62 +28,59 @@ describe ModuleSync::GitService::GitLab do
28
28
  it 'submits MR when --pr is set' do
29
29
  allow(@client).to receive(:merge_requests)
30
30
  .with(args[:repo_path],
31
- :state => 'opened',
32
- :source_branch => args[:source_branch],
33
- :target_branch => 'master',
34
- ).and_return([])
31
+ state: 'opened',
32
+ source_branch: args[:source_branch],
33
+ target_branch: 'master').and_return([])
35
34
 
36
35
  expect(@client).to receive(:create_merge_request)
37
36
  .with(args[:repo_path],
38
37
  args[:title],
39
- :labels => [],
40
- :source_branch => args[:source_branch],
41
- :target_branch => 'master',
42
- ).and_return({"html_url" => "http://example.com/pulls/22"})
38
+ labels: [],
39
+ source_branch: args[:source_branch],
40
+ target_branch: 'master').and_return({ 'html_url' => 'http://example.com/pulls/22' })
43
41
 
44
42
  expect { @it.open_pull_request(**args) }.to output(/Submitted MR/).to_stdout
45
43
  end
46
44
 
47
45
  it 'skips submitting MR if one has already been issued' do
48
46
  mr = {
49
- "title" => "Test title",
50
- "html_url" => "https://example.com/pulls/44",
51
- "iid" => "44"
47
+ 'title' => 'Test title',
48
+ 'html_url' => 'https://example.com/pulls/44',
49
+ 'iid' => '44',
52
50
  }
53
51
 
54
52
  expect(@client).to receive(:merge_requests)
55
53
  .with(args[:repo_path],
56
- :state => 'opened',
57
- :source_branch => args[:source_branch],
58
- :target_branch => 'master',
59
- ).and_return([mr])
54
+ state: 'opened',
55
+ source_branch: args[:source_branch],
56
+ target_branch: 'master').and_return([mr])
60
57
 
61
58
  expect { @it.open_pull_request(**args) }.to output("Skipped! 1 MRs found for branch 'test'\n").to_stdout
62
59
  end
63
60
 
64
61
  context 'when labels are set' do
65
- let(:labels) { %w{HELLO WORLD} }
62
+ let(:labels) { %w[HELLO WORLD] }
66
63
 
67
64
  it 'adds labels to MR' do
68
- mr = double()
69
- allow(mr).to receive(:iid).and_return("42")
65
+ mr = double
66
+ allow(mr).to receive(:iid).and_return('42')
70
67
 
71
68
  expect(@client).to receive(:create_merge_request)
72
69
  .with(args[:repo_path],
73
70
  args[:title],
74
- :labels => ["HELLO", "WORLD"],
75
- :source_branch => args[:source_branch],
76
- :target_branch => 'master',
77
- ).and_return(mr)
71
+ labels: %w[HELLO WORLD],
72
+ source_branch: args[:source_branch],
73
+ target_branch: 'master').and_return(mr)
78
74
 
79
75
  allow(@client).to receive(:merge_requests)
80
76
  .with(args[:repo_path],
81
- :state => 'opened',
82
- :source_branch => args[:source_branch],
83
- :target_branch => 'master',
84
- ).and_return([])
77
+ state: 'opened',
78
+ source_branch: args[:source_branch],
79
+ target_branch: 'master').and_return([])
85
80
 
86
- expect { @it.open_pull_request(**args) }.to output(/Attached the following labels to MR 42: HELLO, WORLD/).to_stdout
81
+ expect do
82
+ @it.open_pull_request(**args)
83
+ end.to output(/Attached the following labels to MR 42: HELLO, WORLD/).to_stdout
87
84
  end
88
85
  end
89
86
  end