jackhammer 1.3.2 → 1.3.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 057e354d0c76b911875a577878097c392f843493d2a130dae732f5d57506993e
4
- data.tar.gz: 9b02263d887565c706c1f35cd565f0469d7402136f35bb6df08b30f4476af384
3
+ metadata.gz: d56a6f3d2a1f7ca03feba155032f34598ac37ebe0a33f909beaf8a4925bb351b
4
+ data.tar.gz: 6e2858cc50c7b9139b4b506f64fb9d4c339ac29ce5fbf5b84f8fb42e52c0305c
5
5
  SHA512:
6
- metadata.gz: cfe908b573a29a1e43d9dc5f24f59c6215a5ec5bd81f95499c4dab31efd5c32b44b67a158f0c6200cde26650a317e1d5dd6d3be7fc225cdcfeedf1bb3163f5f7
7
- data.tar.gz: 9cc9d2dc8f7eafdf63026cce6d560b5427eff84cd014586b5b4d1cd95c25321452d33c598d1bdcb6a36afabd1e317f06e0c55dd71c3f648490ee7c95665e9d2f
6
+ metadata.gz: 02304a35a6234347fac7ea7257b601accada9293c21620569968da7df1f4831d6c36e350c0c5e94872939cce27c43b179fcdaa6fc1b285e4fbef6c8e40e60836
7
+ data.tar.gz: 4ea19a99767048e119846b2a024e2c06e060cd79794dda955865d08b7153eebd03c709f63ce0e8c7e050e5b962db45488b8d91113e11a9e2327d33ba71d72dcb
@@ -9,10 +9,3 @@ update_configs:
9
9
  allowed_updates:
10
10
  - match:
11
11
  update_type: "all"
12
- automerged_updates:
13
- - match:
14
- dependency_type: "development"
15
- update_type: "all"
16
- - match:
17
- dependency_type: "production"
18
- update_type: "all"
@@ -0,0 +1,33 @@
1
+ ---
2
+ name: Bug report
3
+ about: Create a report to track an issue that has been identified
4
+ title: ''
5
+ labels: ''
6
+ assignees: ''
7
+
8
+ ---
9
+
10
+ **Describe the bug**
11
+ A clear and concise description of what the bug is.
12
+
13
+ **To Reproduce**
14
+ Steps to reproduce the behavior:
15
+ 1. Go to '...'
16
+ 2. Click on '....'
17
+ 3. Scroll down to '....'
18
+ 4. See error
19
+
20
+ **Expected behavior**
21
+ A clear and concise description of what you expected to happen.
22
+
23
+ **Mutation/Query**
24
+
25
+ **URL and HTTP method (for non-GQL):**
26
+
27
+ **Sentry or Logs URL:**
28
+
29
+ **User/authentication details**
30
+ Impacted user name or service account
31
+
32
+ **Additional context**
33
+ Add any other context about the problem here.
@@ -0,0 +1 @@
1
+ blank_issues_enabled: false
@@ -0,0 +1,22 @@
1
+ ---
2
+ name: New story
3
+ about: Add a new story for implementation
4
+ title: ''
5
+ labels: ''
6
+ assignees: ''
7
+
8
+ ---
9
+
10
+ **Describe the solution**
11
+ A clear and concise description of what you want to happen.
12
+ When will this feature be done?
13
+
14
+ **Describe the users**
15
+ Who are we building this feature for?
16
+
17
+ **Additional context**
18
+ Add any other context or screenshots about the feature request here.
19
+ Link to any applicable documents describing the feature.
20
+
21
+ **Designs**
22
+ Link to any applicable designs on Invision.
@@ -0,0 +1,18 @@
1
+ ## Description
2
+ <!--- Describe your changes in detail -->
3
+
4
+ ## Related issue(s)
5
+ <!--- GH issue number -->
6
+
7
+ ## Motivation and Context
8
+ <!--- Why is this change required? What problem does it solve? -->
9
+ <!--- If it fixes an open issue, please link to the issue here. -->
10
+
11
+ ## How Has This Been Tested?
12
+ <!--- Please describe in detail how you tested your changes. -->
13
+
14
+ ## Screenshots (if appropriate):
15
+ <!--- Please add any screenshots of the feature. -->
16
+
17
+ ## Related PRs
18
+ <!--- Please add links to any related PRs (backend, component packages, etc). -->
@@ -0,0 +1,16 @@
1
+ # automatically approve PRs submitted by Dependabot
2
+ # this will allow Dependabot to automatically merge dependency update PRs where CI passes
3
+ # from: https://github.com/hmarr/auto-approve-action
4
+ name: Auto approve Dependabot PRs
5
+
6
+ on:
7
+ pull_request
8
+
9
+ jobs:
10
+ auto-approve:
11
+ runs-on: ubuntu-latest
12
+ steps:
13
+ - uses: hmarr/auto-approve-action@v2.0.0
14
+ if: github.actor == 'dependabot[bot]' || github.actor == 'dependabot-preview[bot]'
15
+ with:
16
+ github-token: "${{ secrets.GITHUB_TOKEN }}"
@@ -3,8 +3,9 @@ sudo: false
3
3
  language: ruby
4
4
  cache: bundler
5
5
  rvm:
6
- - 2.5
7
6
  - 2.6
7
+ - 2.7
8
8
  before_install: gem install bundler
9
9
  script:
10
- - bundle exec rake
10
+ - bundle exec rake spec
11
+ - bundle exec rake rubocop
@@ -1,59 +1,82 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- jackhammer (1.3.2)
4
+ jackhammer (1.3.7)
5
5
  bunny (~> 2.14)
6
6
 
7
7
  GEM
8
8
  remote: https://rubygems.org/
9
9
  specs:
10
- amq-protocol (2.3.0)
11
- ast (2.4.0)
12
- bunny (2.14.4)
13
- amq-protocol (~> 2.3, >= 2.3.0)
10
+ activemodel (6.0.3.2)
11
+ activesupport (= 6.0.3.2)
12
+ activerecord (6.0.3.2)
13
+ activemodel (= 6.0.3.2)
14
+ activesupport (= 6.0.3.2)
15
+ activesupport (6.0.3.2)
16
+ concurrent-ruby (~> 1.0, >= 1.0.2)
17
+ i18n (>= 0.7, < 2)
18
+ minitest (~> 5.1)
19
+ tzinfo (~> 1.1)
20
+ zeitwerk (~> 2.2, >= 2.2.2)
21
+ amq-protocol (2.3.2)
22
+ ast (2.4.1)
23
+ bunny (2.16.1)
24
+ amq-protocol (~> 2.3, >= 2.3.1)
14
25
  bunny-mock (1.7.0)
15
26
  bunny (>= 1.7)
16
- byebug (11.1.1)
17
- diff-lcs (1.3)
18
- jaro_winkler (1.5.4)
19
- parallel (1.19.1)
20
- parser (2.7.0.3)
21
- ast (~> 2.4.0)
27
+ byebug (11.1.3)
28
+ concurrent-ruby (1.1.7)
29
+ diff-lcs (1.4.4)
30
+ i18n (1.8.5)
31
+ concurrent-ruby (~> 1.0)
32
+ minitest (5.14.2)
33
+ parallel (1.19.2)
34
+ parser (2.7.1.4)
35
+ ast (~> 2.4.1)
22
36
  rainbow (3.0.0)
23
37
  rake (13.0.1)
38
+ regexp_parser (1.7.1)
24
39
  rexml (3.2.4)
25
40
  rspec (3.9.0)
26
41
  rspec-core (~> 3.9.0)
27
42
  rspec-expectations (~> 3.9.0)
28
43
  rspec-mocks (~> 3.9.0)
29
- rspec-core (3.9.1)
30
- rspec-support (~> 3.9.1)
31
- rspec-expectations (3.9.0)
44
+ rspec-core (3.9.2)
45
+ rspec-support (~> 3.9.3)
46
+ rspec-expectations (3.9.2)
32
47
  diff-lcs (>= 1.2.0, < 2.0)
33
48
  rspec-support (~> 3.9.0)
34
49
  rspec-mocks (3.9.1)
35
50
  diff-lcs (>= 1.2.0, < 2.0)
36
51
  rspec-support (~> 3.9.0)
37
- rspec-support (3.9.2)
38
- rubocop (0.80.0)
39
- jaro_winkler (~> 1.5.1)
52
+ rspec-support (3.9.3)
53
+ rubocop (0.90.0)
40
54
  parallel (~> 1.10)
41
- parser (>= 2.7.0.1)
55
+ parser (>= 2.7.1.1)
42
56
  rainbow (>= 2.2.2, < 4.0)
57
+ regexp_parser (>= 1.7)
43
58
  rexml
59
+ rubocop-ast (>= 0.3.0, < 1.0)
44
60
  ruby-progressbar (~> 1.7)
45
- unicode-display_width (>= 1.4.0, < 1.7)
46
- rubocop-performance (1.5.2)
47
- rubocop (>= 0.71.0)
48
- rubocop-rspec (1.38.1)
49
- rubocop (>= 0.68.1)
61
+ unicode-display_width (>= 1.4.0, < 2.0)
62
+ rubocop-ast (0.3.0)
63
+ parser (>= 2.7.1.4)
64
+ rubocop-performance (1.7.1)
65
+ rubocop (>= 0.82.0)
66
+ rubocop-rspec (1.43.2)
67
+ rubocop (~> 0.87)
50
68
  ruby-progressbar (1.10.1)
51
- unicode-display_width (1.6.1)
69
+ thread_safe (0.3.6)
70
+ tzinfo (1.2.7)
71
+ thread_safe (~> 0.1)
72
+ unicode-display_width (1.7.0)
73
+ zeitwerk (2.4.0)
52
74
 
53
75
  PLATFORMS
54
76
  ruby
55
77
 
56
78
  DEPENDENCIES
79
+ activerecord
57
80
  bundler
58
81
  bunny-mock
59
82
  byebug
data/README.md CHANGED
@@ -1,10 +1,9 @@
1
+ [![Gem Version](https://badge.fury.io/rb/jackhammer.svg)](https://rubygems.org/gems/jackhammer)
1
2
  [![Build Status](https://travis-ci.org/RenoFi/jackhammer.svg?branch=master)](https://travis-ci.org/RenoFi/jackhammer)
2
- [![GitHub issues](https://img.shields.io/github/issues/renofi/jackhammer)](https://github.com/renofi/jackhammer/issues)
3
- [![GitHub license](https://img.shields.io/github/license/renofi/jackhammer)](https://github.com/RenoFi/jackhammer/blob/master/LICENSE.txt)
4
3
 
5
- # Jackhammer
4
+ # jackhammer
6
5
 
7
- Jackhammer is an opinionated, configurable facade over the RabbitMQ Bunny
6
+ `jackhammer` is an opinionated, configurable facade over the RabbitMQ Bunny
8
7
  module.
9
8
 
10
9
  ## Installation
@@ -180,7 +179,3 @@ Bug reports and pull requests are welcome on GitHub at https://github.com/renofi
180
179
  ## License
181
180
 
182
181
  The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
183
-
184
- ## Code of Conduct
185
-
186
- Everyone interacting in the Jackhammer project’s codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/renofi/jackhammer/blob/master/CODE_OF_CONDUCT.md).
data/Rakefile CHANGED
@@ -5,4 +5,4 @@ require 'rubocop/rake_task'
5
5
  RSpec::Core::RakeTask.new(:spec)
6
6
  RuboCop::RakeTask.new
7
7
 
8
- task default: %i[rubocop:auto_correct spec]
8
+ task default: %i[spec rubocop:auto_correct]
@@ -22,8 +22,11 @@ Gem::Specification.new do |spec|
22
22
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
23
23
  spec.require_paths = ['lib']
24
24
 
25
+ spec.required_ruby_version = '>= 2.6'
26
+
25
27
  spec.add_dependency 'bunny', '~> 2.14'
26
28
 
29
+ spec.add_development_dependency 'activerecord'
27
30
  spec.add_development_dependency 'bundler'
28
31
  spec.add_development_dependency 'bunny-mock'
29
32
  spec.add_development_dependency 'byebug'
@@ -5,7 +5,7 @@ module Jackhammer
5
5
  attr_reader :logger, :opts
6
6
 
7
7
  def initialize(options = {})
8
- @logger = Logger.new STDERR
8
+ @logger = Logger.new $stderr
9
9
  @opts = { require: './config/environment' }.merge(options)
10
10
  end
11
11
 
@@ -0,0 +1,60 @@
1
+ module Jackhammer
2
+ class ConfigurationValidator
3
+ attr_accessor :config_yaml, :environment, :errors
4
+
5
+ def initialize
6
+ @errors = []
7
+ end
8
+
9
+ def validate
10
+ validate_environment_defined
11
+ return if errors.any?
12
+ validate_topic_exchange_defined
13
+ return if errors.any?
14
+ validate_queues_defined
15
+ return if errors.any?
16
+ validate_handlers_defined
17
+ end
18
+
19
+ def validate_environment_defined
20
+ return if config_yaml[environment]
21
+
22
+ add_error("Environment '#{environment}' is not defined")
23
+ end
24
+
25
+ def validate_topic_exchange_defined
26
+ return if config_yaml[environment].keys.any?
27
+
28
+ add_error("Environment '#{environment}' does not define a topic exchange")
29
+ end
30
+
31
+ def validate_queues_defined
32
+ topics = config_yaml[environment].keys
33
+ topics.each do |topic|
34
+ begin
35
+ next if config_yaml[environment][topic]['queues']
36
+ rescue StandardError
37
+ false
38
+ end
39
+
40
+ add_error("Topic '#{topic}' does not define any queues")
41
+ end
42
+ end
43
+
44
+ def validate_handlers_defined
45
+ config_yaml[environment].each do |exchange_name, exchange_config|
46
+ exchange_config['queues'].each do |qconfig|
47
+ Object.const_get(qconfig['handler'])
48
+ rescue NameError
49
+ add_error("Uninitialized constant #{qconfig['handler']}")
50
+ end
51
+ end
52
+ end
53
+
54
+ private
55
+
56
+ def add_error(str)
57
+ @errors << str
58
+ end
59
+ end
60
+ end
@@ -15,6 +15,8 @@ module Jackhammer
15
15
  else
16
16
  handler.call message
17
17
  end
18
+ ensure
19
+ ActiveRecord::Base.clear_active_connections! if defined?(ActiveRecord::Base)
18
20
  end
19
21
  end
20
22
  end
@@ -7,7 +7,7 @@ module Jackhammer
7
7
  def self.from_routing_key(routing_key)
8
8
  fail(InvalidConfigError, "app_name must be set to determine queue_name from routing_key") if app_name.to_s.empty?
9
9
 
10
- "#{app_name}_#{routing_key}_q".gsub(/[^\w]+/, '_').gsub(/[_]+/, '_')
10
+ "#{app_name}_#{routing_key}_q".gsub(/[^\w]+/, '_').squeeze('_')
11
11
  end
12
12
  end
13
13
  end
@@ -0,0 +1,71 @@
1
+ require 'rake'
2
+ require 'rake/tasklib'
3
+ require 'yaml'
4
+ require 'jackhammer/configuration_validator'
5
+
6
+ module Jackhammer
7
+ class RakeTask < ::Rake::TaskLib
8
+ # Name of test task. (default is :jackhammer)
9
+ attr_accessor :name
10
+
11
+ # File path of the configuration file. (default is ./config/jackhammer.yml)
12
+ attr_accessor :path
13
+
14
+ # Description of the test task. (default is 'Validate Jackhammer
15
+ # configuration')
16
+ attr_accessor :description
17
+
18
+ # Task prerequisites.
19
+ attr_accessor :deps
20
+
21
+ # Specifies the environment to inspect. (default is 'production')
22
+ attr_accessor :env
23
+
24
+ def initialize
25
+ super
26
+ @name = :jackhammer
27
+ @env = 'production'
28
+ @path = './config/jackhammer.yml'
29
+ @description = 'Validate Jackhammer configuration'
30
+ @deps = []
31
+ yield self if block_given?
32
+ if @name.is_a?(Hash)
33
+ @deps = @name.values.first
34
+ @name = @name.keys.first
35
+ end
36
+ define
37
+ end
38
+
39
+ def define
40
+ desc @description
41
+ task @name => Array(deps) do
42
+ validator = ConfigurationValidator.new
43
+ validator.config_yaml = YAML.safe_load(File.read(@path), [], [], true)
44
+ validator.environment = env
45
+ validator.validate
46
+ print_results validator.errors
47
+ end
48
+ end
49
+
50
+ private
51
+
52
+ def print_results(errors)
53
+ puts "Jackhammer configuration #{path}\n"
54
+ if errors.any?
55
+ puts red("Problems identified: #{errors.size}\n")
56
+ errors.each { |error| puts red(error) }
57
+ exit 1
58
+ else
59
+ puts green('OK')
60
+ end
61
+ end
62
+
63
+ def red(text)
64
+ "\e[1;31m#{text}\e[0m"
65
+ end
66
+
67
+ def green(text)
68
+ "\e[1;32m#{text}\e[0m"
69
+ end
70
+ end
71
+ end
@@ -1,3 +1,3 @@
1
1
  module Jackhammer
2
- VERSION = '1.3.2'.freeze
2
+ VERSION = '1.3.7'.freeze
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jackhammer
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.2
4
+ version: 1.3.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Scott Serok
8
- autorequire:
8
+ autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-02-28 00:00:00.000000000 Z
11
+ date: 2020-09-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bunny
@@ -24,6 +24,20 @@ dependencies:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '2.14'
27
+ - !ruby/object:Gem::Dependency
28
+ name: activerecord
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
27
41
  - !ruby/object:Gem::Dependency
28
42
  name: bundler
29
43
  requirement: !ruby/object:Gem::Requirement
@@ -136,7 +150,7 @@ dependencies:
136
150
  - - ">="
137
151
  - !ruby/object:Gem::Version
138
152
  version: '0'
139
- description:
153
+ description:
140
154
  email:
141
155
  - scott@renofi.com
142
156
  executables:
@@ -145,10 +159,14 @@ extensions: []
145
159
  extra_rdoc_files: []
146
160
  files:
147
161
  - ".dependabot/config.yml"
162
+ - ".github/ISSUE_TEMPLATE/bug_report.md"
163
+ - ".github/ISSUE_TEMPLATE/config.yml"
164
+ - ".github/ISSUE_TEMPLATE/story.md"
165
+ - ".github/PULL_REQUEST_TEMPLATE.md"
166
+ - ".github/workflows/auto-approve.yml"
148
167
  - ".gitignore"
149
168
  - ".rspec"
150
169
  - ".travis.yml"
151
- - CODE_OF_CONDUCT.md
152
170
  - Gemfile
153
171
  - Gemfile.lock
154
172
  - LICENSE.txt
@@ -159,11 +177,13 @@ files:
159
177
  - lib/jackhammer.rb
160
178
  - lib/jackhammer/cli.rb
161
179
  - lib/jackhammer/configuration.rb
180
+ - lib/jackhammer/configuration_validator.rb
162
181
  - lib/jackhammer/exceptions.rb
163
182
  - lib/jackhammer/log.rb
164
183
  - lib/jackhammer/message_receiver.rb
165
184
  - lib/jackhammer/queue.rb
166
185
  - lib/jackhammer/queue_name.rb
186
+ - lib/jackhammer/rake_task.rb
167
187
  - lib/jackhammer/server.rb
168
188
  - lib/jackhammer/topic.rb
169
189
  - lib/jackhammer/topic_manager.rb
@@ -174,7 +194,7 @@ licenses:
174
194
  metadata:
175
195
  homepage_uri: https://github.com/renofi/jackhammer
176
196
  source_code_uri: https://github.com/renofi/jackhammer
177
- post_install_message:
197
+ post_install_message:
178
198
  rdoc_options: []
179
199
  require_paths:
180
200
  - lib
@@ -182,15 +202,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
182
202
  requirements:
183
203
  - - ">="
184
204
  - !ruby/object:Gem::Version
185
- version: '0'
205
+ version: '2.6'
186
206
  required_rubygems_version: !ruby/object:Gem::Requirement
187
207
  requirements:
188
208
  - - ">="
189
209
  - !ruby/object:Gem::Version
190
210
  version: '0'
191
211
  requirements: []
192
- rubygems_version: 3.0.6
193
- signing_key:
212
+ rubygems_version: 3.1.2
213
+ signing_key:
194
214
  specification_version: 4
195
215
  summary: Jackhammer is an opinionated facade over RabbitMQ Bunny
196
216
  test_files: []
@@ -1,74 +0,0 @@
1
- # Contributor Covenant Code of Conduct
2
-
3
- ## Our Pledge
4
-
5
- In the interest of fostering an open and welcoming environment, we as
6
- contributors and maintainers pledge to making participation in our project and
7
- our community a harassment-free experience for everyone, regardless of age, body
8
- size, disability, ethnicity, gender identity and expression, level of experience,
9
- nationality, personal appearance, race, religion, or sexual identity and
10
- orientation.
11
-
12
- ## Our Standards
13
-
14
- Examples of behavior that contributes to creating a positive environment
15
- include:
16
-
17
- * Using welcoming and inclusive language
18
- * Being respectful of differing viewpoints and experiences
19
- * Gracefully accepting constructive criticism
20
- * Focusing on what is best for the community
21
- * Showing empathy towards other community members
22
-
23
- Examples of unacceptable behavior by participants include:
24
-
25
- * The use of sexualized language or imagery and unwelcome sexual attention or
26
- advances
27
- * Trolling, insulting/derogatory comments, and personal or political attacks
28
- * Public or private harassment
29
- * Publishing others' private information, such as a physical or electronic
30
- address, without explicit permission
31
- * Other conduct which could reasonably be considered inappropriate in a
32
- professional setting
33
-
34
- ## Our Responsibilities
35
-
36
- Project maintainers are responsible for clarifying the standards of acceptable
37
- behavior and are expected to take appropriate and fair corrective action in
38
- response to any instances of unacceptable behavior.
39
-
40
- Project maintainers have the right and responsibility to remove, edit, or
41
- reject comments, commits, code, wiki edits, issues, and other contributions
42
- that are not aligned to this Code of Conduct, or to ban temporarily or
43
- permanently any contributor for other behaviors that they deem inappropriate,
44
- threatening, offensive, or harmful.
45
-
46
- ## Scope
47
-
48
- This Code of Conduct applies both within project spaces and in public spaces
49
- when an individual is representing the project or its community. Examples of
50
- representing a project or community include using an official project e-mail
51
- address, posting via an official social media account, or acting as an appointed
52
- representative at an online or offline event. Representation of a project may be
53
- further defined and clarified by project maintainers.
54
-
55
- ## Enforcement
56
-
57
- Instances of abusive, harassing, or otherwise unacceptable behavior may be
58
- reported by contacting the project team at scott@renofi.com. All
59
- complaints will be reviewed and investigated and will result in a response that
60
- is deemed necessary and appropriate to the circumstances. The project team is
61
- obligated to maintain confidentiality with regard to the reporter of an incident.
62
- Further details of specific enforcement policies may be posted separately.
63
-
64
- Project maintainers who do not follow or enforce the Code of Conduct in good
65
- faith may face temporary or permanent repercussions as determined by other
66
- members of the project's leadership.
67
-
68
- ## Attribution
69
-
70
- This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
71
- available at [http://contributor-covenant.org/version/1/4][version]
72
-
73
- [homepage]: http://contributor-covenant.org
74
- [version]: http://contributor-covenant.org/version/1/4/