container_ship 0.1.0 → 0.1.1

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: dd33f056d20c82975db4c69f44ded7b30125549032afca7d836792eda460bd4f
4
- data.tar.gz: 7e86a7a3f8990bc2768e1705df852780d1f731bde97832d35d38227dc0e88512
3
+ metadata.gz: 5b7ae1e6c79b424625cdfd5f12eacc00fd546ec046151606984a76c5d50cc489
4
+ data.tar.gz: 1691ee2c77d5f0ddf8064b4966abc2a326ad748615ec5f1b935037d3bc23b38a
5
5
  SHA512:
6
- metadata.gz: 9f5acd9cd7f5232eddf69661e7c961c6869518dfea10f8e148fbc4e4c0fe5f6270b420d6766286af0ece908fffef0f34224fe3bd4f8d230860db2fe8c3acf298
7
- data.tar.gz: 0becf5d69d45bdd794b8b287f2d9c7f263e52ead5a3d0ead6050031fe8860b0526c87d20b3c03a0eb09705e72ed93442a74605cfdae25abd81b98b9cc52259b0
6
+ metadata.gz: 4a11192e9091856be8e69fea92399a8e97977a8a8778bb5b6671162c9d149380938d3f5162418277e05a77f28c2c472c8cf2e37054150a40752ee82f90976485
7
+ data.tar.gz: 06543a4fd7906c378acd0a8e3f3d4c6725a594672ad6175f3fc215c769a7cdf30e52e7832a87f2b9889e783218debf9bd0eafc32d9249ba653b0db3476bf8a9a
@@ -0,0 +1,57 @@
1
+ version: 2.1
2
+
3
+ update_bundler: &update_bundler
4
+ run:
5
+ name: update bundler
6
+ command: gem update bundler
7
+
8
+ bundle_install: &bundle_install
9
+ run:
10
+ name: bundle install
11
+ command: bundle install --path vendor/bundle --jobs 4
12
+
13
+ git statusrestore_bundle_cache: &restore_bundle_cache
14
+ restore_cache:
15
+ key: cache-bundler-{{ checksum "Gemfile.lock" }}
16
+
17
+ jobs:
18
+ build:
19
+ docker:
20
+ - image: circleci/ruby
21
+ steps:
22
+ - checkout
23
+ - *restore_bundle_cache
24
+ - *update_bundler
25
+ - *bundle_install
26
+ - save_cache:
27
+ key: cache-bundler-{{ checksum "Gemfile.lock" }}
28
+ paths:
29
+ - vendor/bundle
30
+ rubocop:
31
+ docker:
32
+ - image: circleci/ruby
33
+ steps:
34
+ - checkout
35
+ - *restore_bundle_cache
36
+ - *update_bundler
37
+ - *bundle_install
38
+ - run: bundle exec rubocop
39
+ rspec:
40
+ docker:
41
+ - image: circleci/ruby
42
+ steps:
43
+ - checkout
44
+ - *restore_bundle_cache
45
+ - *update_bundler
46
+ - *bundle_install
47
+ - run:
48
+ command: bundle exec rspec
49
+ workflows:
50
+ version: 2.1
51
+ rspec:
52
+ jobs:
53
+ - build
54
+ - rubocop:
55
+ requires: [build]
56
+ - rspec:
57
+ requires: [build]
@@ -0,0 +1,25 @@
1
+ AllCops:
2
+ Exclude:
3
+ - 'vendor/**/*'
4
+ - 'spec/support/*'
5
+ - 'spec/spec_helper.rb'
6
+ - 'Rakefile'
7
+ Layout/MultilineMethodCallIndentation:
8
+ EnforcedStyle: indented_relative_to_receiver
9
+ Style/FrozenStringLiteralComment:
10
+ Enabled: false
11
+ Documentation:
12
+ Enabled: false
13
+ Metrics/BlockLength:
14
+ Exclude:
15
+ - 'spec/**/*'
16
+ Metrics/LineLength:
17
+ Max: 120
18
+ AllowURI: true
19
+ URISchemes:
20
+ - http
21
+ - https
22
+ Metrics/AbcSize:
23
+ Max: 30
24
+ Metrics/MethodLength:
25
+ Max: 30
data/Gemfile CHANGED
@@ -1,4 +1,6 @@
1
- source "https://rubygems.org"
1
+ # frozen_string_literal: true
2
+
3
+ source 'https://rubygems.org'
2
4
 
3
5
  # Specify your gem's dependencies in container_ship.gemspec
4
6
  gemspec
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- container_ship (0.1.0)
4
+ container_ship (0.1.1)
5
5
  aws-sdk-cloudwatchlogs
6
6
  aws-sdk-ecs
7
7
  thor
@@ -9,53 +9,52 @@ PATH
9
9
  GEM
10
10
  remote: https://rubygems.org/
11
11
  specs:
12
- activesupport (6.0.0)
12
+ activesupport (6.0.3.2)
13
13
  concurrent-ruby (~> 1.0, >= 1.0.2)
14
14
  i18n (>= 0.7, < 2)
15
15
  minitest (~> 5.1)
16
16
  tzinfo (~> 1.1)
17
- zeitwerk (~> 2.1, >= 2.1.8)
17
+ zeitwerk (~> 2.2, >= 2.2.2)
18
18
  addressable (2.7.0)
19
19
  public_suffix (>= 2.0.2, < 5.0)
20
- ast (2.4.0)
21
- aws-eventstream (1.0.3)
22
- aws-partitions (1.226.0)
23
- aws-sdk-cloudwatchlogs (1.25.0)
24
- aws-sdk-core (~> 3, >= 3.61.1)
20
+ ast (2.4.1)
21
+ aws-eventstream (1.1.0)
22
+ aws-partitions (1.365.0)
23
+ aws-sdk-cloudwatchlogs (1.36.0)
24
+ aws-sdk-core (~> 3, >= 3.99.0)
25
25
  aws-sigv4 (~> 1.1)
26
- aws-sdk-core (3.69.1)
27
- aws-eventstream (~> 1.0, >= 1.0.2)
28
- aws-partitions (~> 1.0)
26
+ aws-sdk-core (3.105.0)
27
+ aws-eventstream (~> 1, >= 1.0.2)
28
+ aws-partitions (~> 1, >= 1.239.0)
29
29
  aws-sigv4 (~> 1.1)
30
30
  jmespath (~> 1.0)
31
- aws-sdk-ecs (1.51.0)
32
- aws-sdk-core (~> 3, >= 3.61.1)
31
+ aws-sdk-ecs (1.68.0)
32
+ aws-sdk-core (~> 3, >= 3.99.0)
33
33
  aws-sigv4 (~> 1.1)
34
- aws-sigv4 (1.1.0)
35
- aws-eventstream (~> 1.0, >= 1.0.2)
36
- codecov (0.1.15)
34
+ aws-sigv4 (1.2.2)
35
+ aws-eventstream (~> 1, >= 1.0.2)
36
+ codecov (0.2.10)
37
37
  json
38
38
  simplecov
39
- url
40
- coderay (1.1.2)
41
- concurrent-ruby (1.1.5)
42
- diff-lcs (1.3)
39
+ coderay (1.1.3)
40
+ concurrent-ruby (1.1.7)
41
+ diff-lcs (1.4.4)
43
42
  docile (1.3.2)
44
- faraday (0.17.0)
43
+ faraday (1.0.1)
45
44
  multipart-post (>= 1.2, < 3)
46
- faraday-http-cache (2.0.0)
47
- faraday (~> 0.8)
48
- ffi (1.11.1)
45
+ faraday-http-cache (2.2.0)
46
+ faraday (>= 0.8)
47
+ ffi (1.13.1)
49
48
  formatador (0.2.5)
50
- github_changelog_generator (1.14.3)
49
+ github_changelog_generator (1.15.2)
51
50
  activesupport
52
51
  faraday-http-cache
53
52
  multi_json
54
53
  octokit (~> 4.6)
55
- rainbow (>= 2.1)
54
+ rainbow (>= 2.2.1)
56
55
  rake (>= 10.0)
57
- retriable (~> 2.1)
58
- guard (2.15.1)
56
+ retriable (~> 3.0)
57
+ guard (2.16.2)
59
58
  formatador (>= 0.2.4)
60
59
  listen (>= 2.7, < 4.0)
61
60
  lumberjack (>= 1.0.12, < 2.0)
@@ -72,75 +71,79 @@ GEM
72
71
  guard-rubocop (1.3.0)
73
72
  guard (~> 2.0)
74
73
  rubocop (~> 0.20)
75
- i18n (1.7.0)
74
+ i18n (1.8.5)
76
75
  concurrent-ruby (~> 1.0)
77
- jaro_winkler (1.5.3)
78
76
  jmespath (1.4.0)
79
- json (2.2.0)
80
- listen (3.2.0)
77
+ json (2.3.1)
78
+ listen (3.2.1)
81
79
  rb-fsevent (~> 0.10, >= 0.10.3)
82
80
  rb-inotify (~> 0.9, >= 0.9.10)
83
- lumberjack (1.0.13)
84
- method_source (0.9.2)
85
- minitest (5.12.2)
86
- multi_json (1.14.1)
81
+ lumberjack (1.2.8)
82
+ method_source (1.0.0)
83
+ minitest (5.14.2)
84
+ multi_json (1.15.0)
87
85
  multipart-post (2.1.1)
88
86
  nenv (0.3.0)
89
87
  notiffany (0.1.3)
90
88
  nenv (~> 0.1)
91
89
  shellany (~> 0.0)
92
- octokit (4.14.0)
90
+ octokit (4.18.0)
91
+ faraday (>= 0.9)
93
92
  sawyer (~> 0.8.0, >= 0.5.3)
94
- parallel (1.18.0)
95
- parser (2.6.5.0)
96
- ast (~> 2.4.0)
97
- pry (0.12.2)
98
- coderay (~> 1.1.0)
99
- method_source (~> 0.9.0)
100
- public_suffix (4.0.1)
93
+ parallel (1.19.2)
94
+ parser (2.7.1.4)
95
+ ast (~> 2.4.1)
96
+ pry (0.13.1)
97
+ coderay (~> 1.1)
98
+ method_source (~> 1.0)
99
+ public_suffix (4.0.6)
101
100
  rainbow (3.0.0)
102
- rake (13.0.0)
103
- rb-fsevent (0.10.3)
104
- rb-inotify (0.10.0)
101
+ rake (13.0.1)
102
+ rb-fsevent (0.10.4)
103
+ rb-inotify (0.10.1)
105
104
  ffi (~> 1.0)
106
- retriable (2.1.0)
105
+ regexp_parser (1.7.1)
106
+ retriable (3.1.2)
107
+ rexml (3.2.4)
107
108
  rspec (3.9.0)
108
109
  rspec-core (~> 3.9.0)
109
110
  rspec-expectations (~> 3.9.0)
110
111
  rspec-mocks (~> 3.9.0)
111
- rspec-core (3.9.0)
112
- rspec-support (~> 3.9.0)
113
- rspec-expectations (3.9.0)
112
+ rspec-core (3.9.2)
113
+ rspec-support (~> 3.9.3)
114
+ rspec-expectations (3.9.2)
114
115
  diff-lcs (>= 1.2.0, < 2.0)
115
116
  rspec-support (~> 3.9.0)
116
- rspec-mocks (3.9.0)
117
+ rspec-mocks (3.9.1)
117
118
  diff-lcs (>= 1.2.0, < 2.0)
118
119
  rspec-support (~> 3.9.0)
119
- rspec-support (3.9.0)
120
- rubocop (0.75.1)
121
- jaro_winkler (~> 1.5.1)
120
+ rspec-support (3.9.3)
121
+ rubocop (0.90.0)
122
122
  parallel (~> 1.10)
123
- parser (>= 2.6)
123
+ parser (>= 2.7.1.1)
124
124
  rainbow (>= 2.2.2, < 4.0)
125
+ regexp_parser (>= 1.7)
126
+ rexml
127
+ rubocop-ast (>= 0.3.0, < 1.0)
125
128
  ruby-progressbar (~> 1.7)
126
- unicode-display_width (>= 1.4.0, < 1.7)
129
+ unicode-display_width (>= 1.4.0, < 2.0)
130
+ rubocop-ast (0.3.0)
131
+ parser (>= 2.7.1.4)
127
132
  ruby-progressbar (1.10.1)
128
133
  sawyer (0.8.2)
129
134
  addressable (>= 2.3.5)
130
135
  faraday (> 0.8, < 2.0)
131
136
  shellany (0.0.1)
132
- simplecov (0.17.1)
137
+ simplecov (0.19.0)
133
138
  docile (~> 1.1)
134
- json (>= 1.8, < 3)
135
- simplecov-html (~> 0.10.0)
136
- simplecov-html (0.10.2)
137
- thor (0.20.3)
139
+ simplecov-html (~> 0.11)
140
+ simplecov-html (0.12.2)
141
+ thor (1.0.1)
138
142
  thread_safe (0.3.6)
139
- tzinfo (1.2.5)
143
+ tzinfo (1.2.7)
140
144
  thread_safe (~> 0.1)
141
- unicode-display_width (1.6.0)
142
- url (0.3.2)
143
- zeitwerk (2.2.0)
145
+ unicode-display_width (1.7.0)
146
+ zeitwerk (2.4.0)
144
147
 
145
148
  PLATFORMS
146
149
  ruby
data/README.md CHANGED
@@ -8,9 +8,9 @@
8
8
 
9
9
  `container_ship` is yet another ECS deployment tool.
10
10
 
11
- Key features are:
11
+ ## Key features
12
12
 
13
- - Using raw `task_definition.json` file not a template file with complex state or variables
13
+ - Using raw `task_definition.json` file instead of a template file with complex state or variables
14
14
  - Convention over configuration
15
15
 
16
16
  ## Installation
@@ -19,9 +19,17 @@ gem 'container_ship'
19
19
  ```
20
20
 
21
21
  ## Usage
22
- ### Prepare task_definition.json
23
- `container_ship init YOUR_CLUSTER_NAME` will create empty directory for you.
24
- And you must put `task_definition.json` file in directories like below.
22
+ ### Prepare Dockerfile
23
+ You need to put `Dockerfile` in your app root directory.
24
+ And all the services/tasks will use the image built with that.
25
+
26
+ ### Prepare task_definition.json and Dockerfile
27
+
28
+ ```sh
29
+ container_ship init YOUR_CLUSTER_NAME
30
+ ```
31
+
32
+ will create empty directory for you. And you must put `task_definition.json` file in directories like below.
25
33
 
26
34
  ```
27
35
  your_app
@@ -54,26 +62,29 @@ your_app
54
62
  ### Prepare ECS resources
55
63
  You must obey `convention over configuration` concept. So, naming convention is presented below.
56
64
 
57
- - ECS cluster: "#{cluster_name}-#{environment}"
58
- - ECS service: "#{cluster_name}-#{service_name}-#{environment}"
59
- - ECS task: "#{cluster_name}-#{task_name}-#{environment}"
65
+ - ECS cluster: `"#{cluster_name}-#{environment}"`
66
+ - ECS service: `"#{cluster_name}-#{service_name}-#{environment}"`
67
+ - ECS task: `"#{cluster_name}-#{task_name}-#{environment}"`
60
68
 
61
69
  And export your ECR repository root uri.
62
70
 
63
- ```
71
+ ```sh
64
72
  export ECR_REPOSITORY=xxxxxxxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/
65
73
  ```
66
74
 
67
75
  ### Deploy a service
68
- ```
76
+ ```sh
69
77
  container_ship ship CLUSTER_NAME SERVICE_NAME ENVIRONMENT BUILD_NUMBER
70
78
  ```
71
79
 
80
+ will deploy a service in `.container_ship/CLUSTER_NAME/services/SERVICE_NAME/ENVIRONMENT/task_definition.json`
81
+
72
82
  ### Run a task
73
- ```
83
+ ```sh
74
84
  container_ship exec CLUSTER_NAME TASK_NAME ENVIRONMENT BUILD_NUMBER
75
85
  ```
76
-
86
+ will run a task in `.container_ship/CLUSTER_NAME/tasks/TASK_NAME/ENVIRONMENT/task_definition.json`
87
+
77
88
  ## Contributing
78
89
 
79
90
  Bug reports and pull requests are welcome on GitHub at https://github.com/seibii/container_ship. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.
data/Rakefile CHANGED
@@ -1,6 +1,8 @@
1
- require "bundler/gem_tasks"
2
- require "rspec/core/rake_task"
1
+ # frozen_string_literal: true
2
+
3
+ require 'bundler/gem_tasks'
4
+ require 'rspec/core/rake_task'
3
5
 
4
6
  RSpec::Core::RakeTask.new(:spec)
5
7
 
6
- task :default => :spec
8
+ task default: :spec
@@ -1,15 +1,18 @@
1
- lib = File.expand_path("lib", __dir__)
1
+ # frozen_string_literal: true
2
+
3
+ lib = File.expand_path('lib', __dir__)
2
4
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
- require "container_ship/version"
5
+ require 'container_ship/version'
4
6
 
5
- Gem::Specification.new do |spec|
7
+ Gem::Specification.new do |spec| # rubocop:disable Metrics/BlockLength
6
8
  spec.name = 'container_ship'
7
9
  spec.version = ContainerShip::VERSION
10
+ spec.required_ruby_version = '>= 2.4'
8
11
  spec.authors = ['Yuji Ueki']
9
12
  spec.email = ['unhappychoice@gmail.com']
10
13
 
11
- spec.summary = %q{Yet another ECS deployment tool}
12
- spec.description = %q{container_ship is a simple ECS deployment tool. You only need to prepare Dockerfile and task_definition.json}
14
+ spec.summary = 'Yet another ECS deployment tool'
15
+ spec.description = 'container_ship is a simple ECS deployment tool. You only need to prepare Dockerfile and task_definition.json' # rubocop:disable Metrics/LineLength
13
16
  spec.homepage = 'https://github.com/seibii/container_ship'
14
17
  spec.license = 'MIT'
15
18
 
@@ -19,7 +22,7 @@ Gem::Specification.new do |spec|
19
22
 
20
23
  # Specify which files should be added to the gem when it is released.
21
24
  # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
22
- spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
25
+ spec.files = Dir.chdir(File.expand_path(__dir__)) do
23
26
  `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
24
27
  end
25
28
  spec.bindir = 'exe'
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'container_ship/cli'
2
4
  require 'container_ship/command'
3
5
  require 'container_ship/task_definition'
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'fileutils'
2
4
  require 'thor'
3
5
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'container_ship/command/exec_command'
2
4
  require 'container_ship/command/init_command'
3
5
  require 'container_ship/command/ship_command'
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'aws-sdk-ecs'
2
4
  require 'json'
3
5
  require 'open3'
@@ -20,15 +22,15 @@ module ContainerShip
20
22
 
21
23
  push_image task_definition
22
24
 
23
- revision = print_around_task("Registering task definition... ") do
25
+ revision = print_around_task('Registering task definition... ') do
24
26
  register task_definition
25
27
  end
26
28
 
27
- task_arn = print_around_task("Sending task request... ") do
29
+ task_arn = print_around_task('Sending task request... ') do
28
30
  run_task task_definition, revision
29
31
  end
30
32
 
31
- exit_status = print_around_task("Waiting task is completed... ") do
33
+ exit_status = print_around_task('Waiting task is completed... ') do
32
34
  wait_task task_definition, task_arn
33
35
  end
34
36
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ContainerShip
2
4
  module Command
3
5
  class InitCommand
@@ -7,7 +9,7 @@ module ContainerShip
7
9
  FileUtils.mkdir_p(".container_ship/#{cluster_name}/services")
8
10
  puts "Created .container_ship/#{cluster_name}/services directory"
9
11
 
10
- puts "Next: Create tasks_definition.json file to deploy in tasks or services directory 🖖🏻"
12
+ puts 'Next: Create tasks_definition.json file to deploy in tasks or services directory 🖖🏻'
11
13
  end
12
14
  end
13
15
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'aws-sdk-cloudwatchlogs'
2
4
 
3
5
  module ContainerShip
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ContainerShip
2
4
  module Command
3
5
  module Modules
@@ -15,7 +17,7 @@ module ContainerShip
15
17
  o.each { |line| puts line }
16
18
  status = w.value
17
19
  end
18
- exit(status.exit_status) unless status.success?
20
+ exit(status.exitstatus) unless status.success?
19
21
  end
20
22
  end
21
23
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ContainerShip
2
4
  module Command
3
5
  module Modules
@@ -47,13 +49,14 @@ module ContainerShip
47
49
 
48
50
  def do_every_5_seconds
49
51
  count = 0
50
- while true
52
+ loop do
51
53
  sleep 3
52
54
  print '.'
53
55
  exit_status = yield
54
56
  count += 1
55
57
  next if exit_status.nil?
56
58
  return 124 if count > 60
59
+
57
60
  return exit_status
58
61
  end
59
62
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ContainerShip
2
4
  module Command
3
5
  module Modules
@@ -7,7 +9,7 @@ module ContainerShip
7
9
  def print_around_task(message)
8
10
  print message
9
11
  result = yield
10
- puts "Done"
12
+ puts 'Done'
11
13
  result
12
14
  end
13
15
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'aws-sdk-ecs'
2
4
  require 'json'
3
5
  require 'open3'
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ContainerShip
2
4
  class TaskDefinition
3
5
  attr_reader :cluster_name, :name, :environment, :build_number
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ContainerShip
2
- VERSION = "0.1.0"
4
+ VERSION = '0.1.1'
3
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: container_ship
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Yuji Ueki
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2019-10-24 00:00:00.000000000 Z
11
+ date: 2020-09-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: aws-sdk-cloudwatchlogs
@@ -201,7 +201,9 @@ executables:
201
201
  extensions: []
202
202
  extra_rdoc_files: []
203
203
  files:
204
+ - ".circleci/config.yml"
204
205
  - ".gitignore"
206
+ - ".rubocop.yml"
205
207
  - ".travis.yml"
206
208
  - CODE_OF_CONDUCT.md
207
209
  - Gemfile
@@ -238,7 +240,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
238
240
  requirements:
239
241
  - - ">="
240
242
  - !ruby/object:Gem::Version
241
- version: '0'
243
+ version: '2.4'
242
244
  required_rubygems_version: !ruby/object:Gem::Requirement
243
245
  requirements:
244
246
  - - ">="