beaker-docker 1.2.0 → 1.4.0

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG.md CHANGED
@@ -1,5 +1,31 @@
1
1
  # Changelog
2
2
 
3
+ ## [1.4.0](https://github.com/voxpupuli/beaker-docker/tree/1.4.0) (2023-03-09)
4
+
5
+ [Full Changelog](https://github.com/voxpupuli/beaker-docker/compare/1.3.0...1.4.0)
6
+
7
+ **Implemented enhancements:**
8
+
9
+ - Enable Rubocop [\#72](https://github.com/voxpupuli/beaker-docker/pull/72) ([jay7x](https://github.com/jay7x))
10
+ - Refactor built-in Dockerfile and fix\_ssh\(\) [\#71](https://github.com/voxpupuli/beaker-docker/pull/71) ([jay7x](https://github.com/jay7x))
11
+
12
+ **Fixed bugs:**
13
+
14
+ - set flag for container to container communication [\#84](https://github.com/voxpupuli/beaker-docker/pull/84) ([rwaffen](https://github.com/rwaffen))
15
+
16
+ **Merged pull requests:**
17
+
18
+ - Bump actions/checkout from 2 to 3 [\#90](https://github.com/voxpupuli/beaker-docker/pull/90) ([dependabot[bot]](https://github.com/apps/dependabot))
19
+ - dependabot: check for github actions as well [\#89](https://github.com/voxpupuli/beaker-docker/pull/89) ([bastelfreak](https://github.com/bastelfreak))
20
+
21
+ ## [1.3.0](https://github.com/voxpupuli/beaker-docker/tree/1.3.0) (2022-12-18)
22
+
23
+ [Full Changelog](https://github.com/voxpupuli/beaker-docker/compare/1.2.0...1.3.0)
24
+
25
+ **Implemented enhancements:**
26
+
27
+ - Generate a ssh port from 1025..9999 range [\#68](https://github.com/voxpupuli/beaker-docker/pull/68) ([jay7x](https://github.com/jay7x))
28
+
3
29
  ## [1.2.0](https://github.com/voxpupuli/beaker-docker/tree/1.2.0) (2022-08-11)
4
30
 
5
31
  [Full Changelog](https://github.com/voxpupuli/beaker-docker/compare/1.1.1...1.2.0)
data/Gemfile CHANGED
@@ -6,9 +6,9 @@ if File.exists? "#{__FILE__}.local"
6
6
  eval(File.read("#{__FILE__}.local"), binding)
7
7
  end
8
8
 
9
- group :coverage, optional: ENV['COVERAGE']!='yes' do
10
- gem 'simplecov-console', :require => false
11
- gem 'codecov', :require => false
9
+ group :coverage, optional: ENV['COVERAGE'] != 'yes' do
10
+ gem 'simplecov-console', require: false
11
+ gem 'codecov', require: false
12
12
  end
13
13
 
14
14
  group :release do
data/Rakefile CHANGED
@@ -1,9 +1,17 @@
1
1
  require 'rspec/core/rake_task'
2
2
 
3
- namespace :test do
3
+ namespace :lint do
4
+ require 'rubocop/rake_task'
5
+ RuboCop::RakeTask.new(:rubocop) do |task|
6
+ # Use Rubocop's Github Actions formatter
7
+ if ENV['GITHUB_ACTIONS'] == 'true'
8
+ task.formatters << 'github'
9
+ end
10
+ end
11
+ end
4
12
 
13
+ namespace :test do
5
14
  namespace :spec do
6
-
7
15
  desc "Run spec tests"
8
16
  RSpec::Core::RakeTask.new(:run) do |t|
9
17
  t.rspec_opts = ['--color', '--format documentation']
@@ -16,11 +24,9 @@ namespace :test do
16
24
  t.rspec_opts = ['--color', '--format documentation']
17
25
  t.pattern = 'spec/'
18
26
  end
19
-
20
27
  end
21
28
 
22
29
  namespace :acceptance do
23
-
24
30
  desc <<-EOS
25
31
  A quick acceptance test, named because it has no pre-suites to run
26
32
  EOS
@@ -32,9 +38,8 @@ A quick acceptance test, named because it has no pre-suites to run
32
38
  beaker_test_base_dir = File.join(beaker_gem_dir, 'acceptance/tests/base')
33
39
  load_path_option = File.join(beaker_gem_dir, 'acceptance/lib')
34
40
 
35
- ENV['BEAKER_setfile'] = 'acceptance/config/nodes/hosts.yaml'
41
+ ENV['BEAKER_setfile'] = 'acceptance/config/nodes/hosts.yaml' unless ENV.key?('BEAKER_setfile')
36
42
  sh("beaker",
37
- "--hosts", "acceptance/config/nodes/hosts.yaml",
38
43
  # We can't run these tests until the rsync support in the main
39
44
  # beaker/host.rb is updated to work with passwords.
40
45
  # "--tests", beaker_test_base_dir,
@@ -43,9 +48,7 @@ A quick acceptance test, named because it has no pre-suites to run
43
48
  "--log-level", "debug",
44
49
  "--debug")
45
50
  end
46
-
47
51
  end
48
-
49
52
  end
50
53
 
51
54
  # namespace-named default tasks.
@@ -55,6 +58,7 @@ task 'test:spec' => 'test:spec:run'
55
58
  task 'test:acceptance' => 'test:acceptance:quick'
56
59
 
57
60
  # global defaults
61
+ task :lint => %i[lint:rubocop]
58
62
  task :test => 'test:spec'
59
63
  task :default => :test
60
64
 
@@ -90,7 +94,6 @@ task :docs => 'docs:clear' do
90
94
  end
91
95
 
92
96
  namespace :docs do
93
-
94
97
  desc 'Clear the generated documentation cache'
95
98
  task :clear do
96
99
  original_dir = Dir.pwd
@@ -27,6 +27,10 @@ Gem::Specification.new do |s|
27
27
  s.add_development_dependency 'rspec-its', '~> 1.3'
28
28
  s.add_development_dependency 'fakefs', '~> 1.3'
29
29
  s.add_development_dependency 'rake', '~> 13.0'
30
+ s.add_development_dependency 'rubocop', '~> 1.12.0'
31
+ s.add_development_dependency 'rubocop-performance', '~> 1.10'
32
+ s.add_development_dependency 'rubocop-rake', '~> 0.2'
33
+ s.add_development_dependency 'rubocop-rspec', '>= 1.44'
30
34
 
31
35
  # Run time dependencies
32
36
  s.add_runtime_dependency 'stringify-hash', '~> 0.0.0'
@@ -30,7 +30,7 @@ module Beaker
30
30
  * Check your DOCKER_HOST variable has been set
31
31
  * If you are on OSX or Windows, you might not have Docker Machine setup correctly: https://docs.docker.com/machine/
32
32
  * If you are using rootless podman, you might need to set up your local socket and service
33
- ERRMSG
33
+ ERRMSG
34
34
  end
35
35
 
36
36
  # Pass on all the logging from docker-api to the beaker logger instance
@@ -78,7 +78,7 @@ module Beaker
78
78
  'Hostname' => host.name,
79
79
  'HostConfig' => {
80
80
  'PortBindings' => {
81
- '22/tcp' => [{ 'HostPort' => rand.to_s[2..5], 'HostIp' => '0.0.0.0'}]
81
+ '22/tcp' => [{ 'HostPort' => rand(1025..9999).to_s, 'HostIp' => '0.0.0.0'}]
82
82
  },
83
83
  'PublishAllPorts' => true,
84
84
  'RestartPolicy' => {
@@ -142,9 +142,9 @@ module Beaker
142
142
  port: nil
143
143
  }
144
144
 
145
- container_json = container.json
145
+ container_json = container.json
146
146
  network_settings = container_json['NetworkSettings']
147
- host_config = container_json['HostConfig']
147
+ host_config = container_json['HostConfig']
148
148
 
149
149
  ip = nil
150
150
  port = nil
@@ -161,9 +161,10 @@ module Beaker
161
161
 
162
162
  # Host to Container
163
163
  port22 = network_settings.dig('PortBindings','22/tcp')
164
- if port22.nil? && network_settings.key?('Ports')
164
+ if port22.nil? && network_settings.key?('Ports') && !nested_docker?
165
165
  port22 = network_settings.dig('Ports','22/tcp')
166
166
  end
167
+
167
168
  ip = port22[0]['HostIp'] if port22
168
169
  port = port22[0]['HostPort'] if port22
169
170
 
@@ -216,7 +217,6 @@ module Beaker
216
217
  @hosts.each do |host|
217
218
  @logger.notify "provisioning #{host.name}"
218
219
 
219
-
220
220
  image = get_container_image(host)
221
221
 
222
222
  if host['tag']
@@ -510,145 +510,132 @@ module Beaker
510
510
 
511
511
  def dockerfile_for(host)
512
512
  # specify base image
513
- dockerfile = <<-EOF
513
+ dockerfile = <<~DF
514
514
  FROM #{host['image']}
515
515
  ENV container docker
516
- EOF
516
+ DF
517
517
 
518
518
  # Commands before any other commands. Can be used for eg. proxy configuration
519
- dockerfile += (host['docker_image_first_commands'] || []).map { |command|
520
- "RUN #{command}\n"
521
- }.join('')
522
-
523
- # additional options to specify to the sshd
524
- # may vary by platform
525
- sshd_options = ''
519
+ dockerfile += (host['docker_image_first_commands'] || []).map { |cmd| "RUN #{cmd}\n" }.join('')
526
520
 
527
521
  # add platform-specific actions
528
- service_name = "sshd"
522
+ service_name = 'sshd'
529
523
  additional_packages = host_packages(host)
530
524
  case host['platform']
531
525
  when /ubuntu/, /debian/
532
- service_name = "ssh"
533
- dockerfile += <<~EOF
534
- RUN apt-get update
535
- RUN apt-get install -y openssh-server openssh-client #{additional_packages.join(' ')}
536
- RUN sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/*
537
- EOF
538
- when /cumulus/
539
- dockerfile += <<~EOF
540
- RUN apt-get update
541
- RUN apt-get install -y openssh-server openssh-client #{additional_packages.join(' ')}
542
- EOF
526
+ service_name = 'ssh'
527
+ dockerfile += <<~DF
528
+ RUN apt-get update \
529
+ && apt-get install -y openssh-server openssh-client #{additional_packages.join(' ')} \
530
+ && sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/*
531
+ DF
532
+ when /cumulus/
533
+ dockerfile += <<~DF
534
+ RUN apt-get update \
535
+ && apt-get install -y openssh-server openssh-client #{additional_packages.join(' ')}
536
+ DF
543
537
  when /el-[89]/, /fedora-(2[2-9]|3)/
544
- dockerfile += <<~EOF
545
- RUN dnf clean all
546
- RUN dnf install -y sudo openssh-server openssh-clients #{additional_packages.join(' ')}
547
- RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key
548
- RUN ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key
549
- RUN sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/*
550
- EOF
538
+ dockerfile += <<~DF
539
+ RUN dnf clean all \
540
+ && dnf install -y sudo openssh-server openssh-clients #{additional_packages.join(' ')} \
541
+ && ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key \
542
+ && ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key \
543
+ && sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/*
544
+ DF
551
545
  when /^el-/, /centos/, /fedora/, /redhat/, /eos/
552
- dockerfile += <<~EOF
553
- RUN yum clean all
554
- RUN yum install -y sudo openssh-server openssh-clients #{additional_packages.join(' ')}
555
- RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key
556
- RUN ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key
557
- RUN sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/*
558
- EOF
546
+ dockerfile += <<~DF
547
+ RUN yum clean all \
548
+ && yum install -y sudo openssh-server openssh-clients #{additional_packages.join(' ')} \
549
+ && ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key \
550
+ && ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key \
551
+ && sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/*
552
+ DF
559
553
  when /opensuse/, /sles/
560
- dockerfile += <<~EOF
561
- RUN zypper -n in openssh #{additional_packages.join(' ')}
562
- RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key
563
- RUN ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key
564
- RUN sed -ri 's/^#?UsePAM .*/UsePAM no/' /etc/ssh/sshd_config
565
- RUN sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/*
566
- EOF
554
+ dockerfile += <<~DF
555
+ RUN zypper -n in openssh #{additional_packages.join(' ')} \
556
+ && ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key \
557
+ && ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key \
558
+ && sed -ri 's/^#?UsePAM .*/UsePAM no/' /etc/ssh/sshd_config \
559
+ && sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/*
560
+ DF
567
561
  when /archlinux/
568
- dockerfile += <<~EOF
569
- RUN pacman --sync --refresh --noconfirm archlinux-keyring
570
- RUN pacman --sync --refresh --noconfirm --sysupgrade
571
- RUN pacman --sync --noconfirm #{additional_packages.join(' ')}
572
- RUN ssh-keygen -A
573
- RUN sed -ri 's/^#?UsePAM .*/UsePAM no/' /etc/ssh/sshd_config
574
- RUN systemctl enable sshd
575
- EOF
562
+ dockerfile += <<~DF
563
+ RUN pacman --sync --refresh --noconfirm archlinux-keyring \
564
+ && pacman --sync --refresh --noconfirm --sysupgrade \
565
+ && pacman --sync --noconfirm #{additional_packages.join(' ')} \
566
+ && ssh-keygen -A \
567
+ && sed -ri 's/^#?UsePAM .*/UsePAM no/' /etc/ssh/sshd_config \
568
+ && systemctl enable sshd
569
+ DF
576
570
  else
577
- # TODO add more platform steps here
571
+ # TODO: add more platform steps here
578
572
  raise "platform #{host['platform']} not yet supported on docker"
579
573
  end
580
574
 
581
575
  # Make sshd directory, set root password
582
- dockerfile += <<~EOF
583
- RUN mkdir -p /var/run/sshd
584
- RUN echo root:#{root_password} | chpasswd
585
- EOF
576
+ dockerfile += <<~DF
577
+ RUN mkdir -p /var/run/sshd \
578
+ && echo root:#{root_password} | chpasswd
579
+ DF
586
580
 
587
581
  # Configure sshd service to allowroot login using password
588
582
  # Also, disable reverse DNS lookups to prevent every. single. ssh
589
583
  # operation taking 30 seconds while the lookup times out.
590
- dockerfile += <<~EOF
591
- RUN sed -ri 's/^#?PermitRootLogin .*/PermitRootLogin yes/' /etc/ssh/sshd_config
592
- RUN sed -ri 's/^#?PasswordAuthentication .*/PasswordAuthentication yes/' /etc/ssh/sshd_config
593
- RUN sed -ri 's/^#?UseDNS .*/UseDNS no/' /etc/ssh/sshd_config
594
- EOF
595
-
584
+ # Also unbreak users with a bunch of SSH keys loaded in their keyring.
585
+ dockerfile += <<~DF
586
+ RUN sed -ri \
587
+ -e 's/^#?PermitRootLogin .*/PermitRootLogin yes/' \
588
+ -e 's/^#?PasswordAuthentication .*/PasswordAuthentication yes/' \
589
+ -e 's/^#?UseDNS .*/UseDNS no/' \
590
+ -e 's/^#?MaxAuthTries.*/MaxAuthTries 1000/' \
591
+ /etc/ssh/sshd_config
592
+ DF
596
593
 
597
594
  # Any extra commands specified for the host
598
- dockerfile += (host['docker_image_commands'] || []).map { |command|
599
- "RUN #{command}\n"
600
- }.join('')
595
+ dockerfile += (host['docker_image_commands'] || []).map { |cmd| "RUN #{cmd}\n" }.join('')
601
596
 
602
597
  # Override image entrypoint
603
- if host['docker_image_entrypoint']
604
- dockerfile += "ENTRYPOINT #{host['docker_image_entrypoint']}\n"
605
- end
598
+ dockerfile += "ENTRYPOINT #{host['docker_image_entrypoint']}\n" if host['docker_image_entrypoint']
606
599
 
607
600
  # How to start a sshd on port 22. May be an init for more supervision
608
601
  # Ensure that the ssh server can be restarted (done from set_env) and container keeps running
609
- cmd = host['docker_cmd'] || ["sh","-c","service #{service_name} start ; tail -f /dev/null"]
610
- dockerfile += <<-EOF
602
+ cmd = host['docker_cmd'] || ['sh', '-c', "service #{service_name} start; tail -f /dev/null"]
603
+ dockerfile += <<~DF
611
604
  EXPOSE 22
612
605
  CMD #{cmd}
613
- EOF
614
-
615
- # end
606
+ DF
616
607
 
617
608
  @logger.debug("Dockerfile is #{dockerfile}")
618
- return dockerfile
609
+
610
+ dockerfile
619
611
  end
620
612
 
621
613
  # a puppet run may have changed the ssh config which would
622
614
  # keep us out of the container. This is a best effort to fix it.
623
615
  # Optionally pass in a host object to to determine which ssh
624
616
  # restart command we should try.
625
- def fix_ssh(container, host=nil)
617
+ def fix_ssh(container, host = nil)
626
618
  @logger.debug("Fixing ssh on container #{container.id}")
627
- container.exec(['sed','-ri',
628
- 's/^#?PermitRootLogin .*/PermitRootLogin yes/',
629
- '/etc/ssh/sshd_config'])
630
- container.exec(['sed','-ri',
631
- 's/^#?PasswordAuthentication .*/PasswordAuthentication yes/',
619
+ container.exec(['sed', '-ri',
620
+ '-e', 's/^#?PermitRootLogin .*/PermitRootLogin yes/',
621
+ '-e', 's/^#?PasswordAuthentication .*/PasswordAuthentication yes/',
622
+ '-e', 's/^#?UseDNS .*/UseDNS no/',
623
+ # Unbreak users with a bunch of SSH keys loaded in their keyring.
624
+ '-e', 's/^#?MaxAuthTries.*/MaxAuthTries 1000/',
632
625
  '/etc/ssh/sshd_config'])
633
- container.exec(['sed','-ri',
634
- 's/^#?UseDNS .*/UseDNS no/',
635
- '/etc/ssh/sshd_config'])
636
- # Make sure users with a bunch of SSH keys loaded in their keyring can
637
- # still run tests
638
- container.exec(['sed','-ri',
639
- 's/^#?MaxAuthTries.*/MaxAuthTries 1000/',
640
- '/etc/ssh/sshd_config'])
641
-
642
- if host
643
- if host['platform'] =~ /alpine/
644
- container.exec(%w(/usr/sbin/sshd))
645
- else
646
- container.exec(%w(service ssh restart))
647
- end
626
+
627
+ return unless host
628
+
629
+ case host['platform']
630
+ when /alpine/
631
+ container.exec(%w[/usr/sbin/sshd])
632
+ when /ubuntu/, /debian/
633
+ container.exec(%w[service ssh restart])
634
+ else
635
+ container.exec(%w[service sshd restart])
648
636
  end
649
637
  end
650
638
 
651
-
652
639
  # return the existing container if we're not provisioning
653
640
  # and docker_container_name is set
654
641
  def find_container(host)
@@ -679,6 +666,5 @@ module Beaker
679
666
  def in_container?
680
667
  return File.file?('/.dockerenv')
681
668
  end
682
-
683
669
  end
684
670
  end
@@ -1,3 +1,3 @@
1
1
  module BeakerDocker
2
- VERSION = '1.2.0'
2
+ VERSION = '1.4.0'
3
3
  end
@@ -746,7 +746,7 @@ module Beaker
746
746
  'image' => 'foobar',
747
747
  })
748
748
 
749
- expect( dockerfile ).to be =~ /RUN zypper -n in openssh/
749
+ expect( dockerfile ).to be =~ /zypper -n in openssh/
750
750
  end
751
751
 
752
752
  (22..39).to_a.each do | fedora_release |
@@ -757,7 +757,7 @@ module Beaker
757
757
  'image' => 'foobar',
758
758
  })
759
759
 
760
- expect( dockerfile ).to be =~ /RUN dnf install -y sudo/
760
+ expect( dockerfile ).to be =~ /dnf install -y sudo/
761
761
  end
762
762
  end
763
763
 
@@ -768,9 +768,48 @@ module Beaker
768
768
  'image' => 'foobar',
769
769
  })
770
770
 
771
- expect( dockerfile ).to match(/RUN pacman --sync --refresh --noconfirm archlinux-keyring/)
772
- expect( dockerfile ).to match(/RUN pacman --sync --refresh --noconfirm --sysupgrade/)
773
- expect( dockerfile ).to match(/RUN pacman --sync --noconfirm curl ntp net-tools openssh/)
771
+ expect( dockerfile ).to match(/pacman --sync --refresh --noconfirm archlinux-keyring/)
772
+ expect( dockerfile ).to match(/pacman --sync --refresh --noconfirm --sysupgrade/)
773
+ expect( dockerfile ).to match(/pacman --sync --noconfirm curl ntp net-tools openssh/)
774
+ end
775
+ end
776
+
777
+ describe '#fix_ssh' do
778
+ let(:test_container) { double('container') }
779
+ let(:host) { hosts[0] }
780
+ before :each do
781
+ expect(test_container).to receive(:id).and_return('abcdef')
782
+ end
783
+
784
+ it 'should call exec once when called without host' do
785
+ expect(test_container).to receive(:exec).once.with(
786
+ include(/PermitRootLogin/) &&
787
+ include(/PasswordAuthentication/) &&
788
+ include(/UseDNS/) &&
789
+ include(/MaxAuthTries/)
790
+ )
791
+ docker.send(:fix_ssh, test_container)
792
+ end
793
+
794
+ it 'should exec sshd on alpine' do
795
+ host['platform'] = 'alpine-3.8-x86_64'
796
+ expect(test_container).to receive(:exec).with(array_including('sed'))
797
+ expect(test_container).to receive(:exec).with(%w[/usr/sbin/sshd])
798
+ docker.send(:fix_ssh, test_container, host)
799
+ end
800
+
801
+ it 'should restart ssh service on ubuntu' do
802
+ host['platform'] = 'ubuntu-20.04-x86_64'
803
+ expect(test_container).to receive(:exec).with(array_including('sed'))
804
+ expect(test_container).to receive(:exec).with(%w[service ssh restart])
805
+ docker.send(:fix_ssh, test_container, host)
806
+ end
807
+
808
+ it 'should restart sshd service otherwise' do
809
+ host['platform'] = 'boogeyman-2000-x86_64'
810
+ expect(test_container).to receive(:exec).with(array_including('sed'))
811
+ expect(test_container).to receive(:exec).with(%w[service sshd restart])
812
+ docker.send(:fix_ssh, test_container, host)
774
813
  end
775
814
  end
776
815
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: beaker-docker
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.0
4
+ version: 1.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Vox Pupuli
@@ -11,7 +11,7 @@ authors:
11
11
  autorequire:
12
12
  bindir: bin
13
13
  cert_chain: []
14
- date: 2022-08-11 00:00:00.000000000 Z
14
+ date: 2023-03-10 00:00:00.000000000 Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
17
  name: rspec
@@ -69,6 +69,62 @@ dependencies:
69
69
  - - "~>"
70
70
  - !ruby/object:Gem::Version
71
71
  version: '13.0'
72
+ - !ruby/object:Gem::Dependency
73
+ name: rubocop
74
+ requirement: !ruby/object:Gem::Requirement
75
+ requirements:
76
+ - - "~>"
77
+ - !ruby/object:Gem::Version
78
+ version: 1.12.0
79
+ type: :development
80
+ prerelease: false
81
+ version_requirements: !ruby/object:Gem::Requirement
82
+ requirements:
83
+ - - "~>"
84
+ - !ruby/object:Gem::Version
85
+ version: 1.12.0
86
+ - !ruby/object:Gem::Dependency
87
+ name: rubocop-performance
88
+ requirement: !ruby/object:Gem::Requirement
89
+ requirements:
90
+ - - "~>"
91
+ - !ruby/object:Gem::Version
92
+ version: '1.10'
93
+ type: :development
94
+ prerelease: false
95
+ version_requirements: !ruby/object:Gem::Requirement
96
+ requirements:
97
+ - - "~>"
98
+ - !ruby/object:Gem::Version
99
+ version: '1.10'
100
+ - !ruby/object:Gem::Dependency
101
+ name: rubocop-rake
102
+ requirement: !ruby/object:Gem::Requirement
103
+ requirements:
104
+ - - "~>"
105
+ - !ruby/object:Gem::Version
106
+ version: '0.2'
107
+ type: :development
108
+ prerelease: false
109
+ version_requirements: !ruby/object:Gem::Requirement
110
+ requirements:
111
+ - - "~>"
112
+ - !ruby/object:Gem::Version
113
+ version: '0.2'
114
+ - !ruby/object:Gem::Dependency
115
+ name: rubocop-rspec
116
+ requirement: !ruby/object:Gem::Requirement
117
+ requirements:
118
+ - - ">="
119
+ - !ruby/object:Gem::Version
120
+ version: '1.44'
121
+ type: :development
122
+ prerelease: false
123
+ version_requirements: !ruby/object:Gem::Requirement
124
+ requirements:
125
+ - - ">="
126
+ - !ruby/object:Gem::Version
127
+ version: '1.44'
72
128
  - !ruby/object:Gem::Dependency
73
129
  name: stringify-hash
74
130
  requirement: !ruby/object:Gem::Requirement
@@ -123,6 +179,8 @@ files:
123
179
  - ".github/workflows/release.yml"
124
180
  - ".github/workflows/test.yml"
125
181
  - ".gitignore"
182
+ - ".rubocop.yml"
183
+ - ".rubocop_todo.yml"
126
184
  - ".simplecov"
127
185
  - CHANGELOG.md
128
186
  - Gemfile