coconductor 0.8.1 → 0.8.2
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 +4 -4
- data/.rubocop.yml +1 -0
- data/coconductor.gemspec +3 -2
- data/lib/coconductor.rb +2 -1
- data/lib/coconductor/code_of_conduct.rb +8 -2
- data/lib/coconductor/commands/detect.rb +2 -0
- data/lib/coconductor/field.rb +1 -0
- data/lib/coconductor/matchers/field_aware.rb +1 -0
- data/lib/coconductor/projects/git_project.rb +2 -0
- data/lib/coconductor/vendorer.rb +124 -0
- data/lib/coconductor/version.rb +1 -1
- data/script/vendor-codes-of-conduct +34 -53
- data/vendor/citizen-code-of-conduct/version/2/0/citizen_code_of_conduct.md +90 -90
- data/vendor/citizen-code-of-conduct/version/2/1/citizen_code_of_conduct.md +22 -22
- data/vendor/citizen-code-of-conduct/version/2/2/citizen_code_of_conduct.md +22 -22
- data/vendor/citizen-code-of-conduct/version/2/3/citizen_code_of_conduct.md +22 -22
- data/vendor/contributor-covenant/version/1/0/0/code-of-conduct.md +1 -1
- data/vendor/contributor-covenant/version/1/1/0/code-of-conduct.md +1 -1
- data/vendor/contributor-covenant/version/1/2/0/code-of-conduct.md +1 -1
- data/vendor/contributor-covenant/version/1/3/0/code-of-conduct.md +3 -3
- data/vendor/contributor-covenant/version/1/4/code-of-conduct.ar.md +51 -0
- data/vendor/contributor-covenant/version/1/4/code-of-conduct.fr.md +36 -35
- data/vendor/contributor-covenant/version/1/4/code-of-conduct.it.md +82 -0
- data/vendor/contributor-covenant/version/1/4/code-of-conduct.md +7 -4
- data/vendor/django/version/1/0/CODE_OF_CONDUCT.md +36 -0
- data/vendor/no-code-of-conduct/version/1/0/CODE_OF_CONDUCT.md +2 -2
- metadata +24 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e05bf7d17d5b42745715db08f27e650150208b03e7452318a0d6ba8a5008faf2
|
4
|
+
data.tar.gz: e7009c3ef47dacd37d622400dc9ed2aba6c1793aebd920d8fa09a0733e903c48
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4097f1aa8b661ef6da3f7fe76f65c3150c1f17a42353a2548b70201a4378f8cd2f7763b6e71e9eed0bfc8ace2ecac8f97096118228dfb00a8ba485bac6cb4d2c
|
7
|
+
data.tar.gz: ec97081a9d6a67e508a1c64b5ac5ac88cbdee226f2d6446959658ec149a0e5fb3802a47fa91264ff827dd8ddcd56a877be0412ce29c68ba95daf453893e9b728
|
data/.rubocop.yml
CHANGED
data/coconductor.gemspec
CHANGED
@@ -19,8 +19,8 @@ Gem::Specification.new do |spec|
|
|
19
19
|
f.match(%r{^(test|spec|features)/})
|
20
20
|
end
|
21
21
|
end
|
22
|
-
spec.bindir = '
|
23
|
-
spec.executables = spec.files.grep(%r{^
|
22
|
+
spec.bindir = 'bin'
|
23
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
24
24
|
spec.require_paths = ['lib']
|
25
25
|
|
26
26
|
spec.add_dependency 'licensee', '~> 9.9', '>= 9.9.4'
|
@@ -29,6 +29,7 @@ Gem::Specification.new do |spec|
|
|
29
29
|
|
30
30
|
spec.add_development_dependency 'bundler', '~> 1.16'
|
31
31
|
spec.add_development_dependency 'pry', '~> 0.10'
|
32
|
+
spec.add_development_dependency 'reverse_markdown', '~> 1.1'
|
32
33
|
spec.add_development_dependency 'rspec', '~> 3.0'
|
33
34
|
spec.add_development_dependency 'rubocop', '~> 0.50'
|
34
35
|
spec.add_development_dependency 'webmock', '~> 3.1'
|
data/lib/coconductor.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
|
1
|
+
require_relative './coconductor/version'
|
2
2
|
require 'licensee'
|
3
3
|
|
4
4
|
module Coconductor
|
@@ -7,6 +7,7 @@ module Coconductor
|
|
7
7
|
autoload :Matchers, 'coconductor/matchers'
|
8
8
|
autoload :Projects, 'coconductor/projects'
|
9
9
|
autoload :ProjectFiles, 'coconductor/project_files'
|
10
|
+
autoload :Vendorer, 'coconductor/vendorer'
|
10
11
|
|
11
12
|
CONFIDENCE_THRESHOLD = 90
|
12
13
|
|
@@ -16,6 +16,7 @@ module Coconductor
|
|
16
16
|
# or the latest in the family if only the family is specified
|
17
17
|
def find(key_or_family)
|
18
18
|
return new(key_or_family) if new(key_or_family).pseudo?
|
19
|
+
|
19
20
|
match = all.find { |coc| coc.key == key_or_family }
|
20
21
|
match || latest_in_family(key_or_family)
|
21
22
|
end
|
@@ -32,6 +33,7 @@ module Coconductor
|
|
32
33
|
key = path.relative_path_from(vendor_dir)
|
33
34
|
matches = KEY_REGEX.match(key.to_path)
|
34
35
|
next unless matches
|
36
|
+
|
35
37
|
[
|
36
38
|
matches['family'], 'version', matches['version'], matches['lang']
|
37
39
|
].compact.join('/')
|
@@ -46,8 +48,9 @@ module Coconductor
|
|
46
48
|
end
|
47
49
|
|
48
50
|
def families
|
49
|
-
@families ||=
|
50
|
-
File.basename(dir)
|
51
|
+
@families ||= begin
|
52
|
+
families = Dir["#{vendor_dir}/*"].map { |dir| File.basename(dir) }
|
53
|
+
families - ['bundle']
|
51
54
|
end
|
52
55
|
end
|
53
56
|
|
@@ -103,6 +106,7 @@ module Coconductor
|
|
103
106
|
|
104
107
|
def name
|
105
108
|
return @name if defined? @name
|
109
|
+
|
106
110
|
@name = name_without_version.dup
|
107
111
|
@name << " (#{language.upcase})" unless default_language?
|
108
112
|
@name << " v#{version}" if version
|
@@ -177,6 +181,7 @@ module Coconductor
|
|
177
181
|
|
178
182
|
def filepath
|
179
183
|
return @filepath if defined? @filepath
|
184
|
+
|
180
185
|
parts = key.split('/')
|
181
186
|
parts.pop unless default_language?
|
182
187
|
path = File.join(*parts[0...5], filename)
|
@@ -187,6 +192,7 @@ module Coconductor
|
|
187
192
|
# Raw content of code of conduct file, including TOML front matter
|
188
193
|
def raw_content
|
189
194
|
return if pseudo?
|
195
|
+
|
190
196
|
unless File.exist?(filepath)
|
191
197
|
msg = "'#{key}' is not a valid code of conduct key"
|
192
198
|
raise Coconductor::InvalidCodeOfConduct, msg
|
@@ -30,6 +30,7 @@ class CoconductorCLI < Thor
|
|
30
30
|
print_table rows
|
31
31
|
|
32
32
|
return unless code_of_conduct_file && (options[:code_of_conduct] || options[:diff])
|
33
|
+
|
33
34
|
expected_code_of_conduct = options[:code_of_conduct] || closest_code_of_conduct
|
34
35
|
return unless expected_code_of_conduct
|
35
36
|
|
@@ -42,6 +43,7 @@ class CoconductorCLI < Thor
|
|
42
43
|
|
43
44
|
def closest_code_of_conduct
|
44
45
|
return unless code_of_conduct_file
|
46
|
+
|
45
47
|
matcher = Coconductor::Matchers::Dice.new(code_of_conduct_file)
|
46
48
|
matches = matcher.matches_by_similarity
|
47
49
|
matches.first.first.key unless matches.empty?
|
data/lib/coconductor/field.rb
CHANGED
@@ -11,10 +11,12 @@ module Coconductor
|
|
11
11
|
# :oid - the file's OID
|
12
12
|
def files
|
13
13
|
return @files if defined? @files
|
14
|
+
|
14
15
|
@files = files_from_tree(commit.tree)
|
15
16
|
|
16
17
|
commit.tree.each_tree do |tree_hash|
|
17
18
|
next unless subdir?(tree_hash)
|
19
|
+
|
18
20
|
tree = Rugged::Tree.lookup(@repository, tree_hash[:oid])
|
19
21
|
@files.concat files_from_tree(tree, tree_hash[:name]) if tree
|
20
22
|
end
|
@@ -0,0 +1,124 @@
|
|
1
|
+
require 'fileutils'
|
2
|
+
require 'open-uri'
|
3
|
+
require 'toml'
|
4
|
+
require 'reverse_markdown'
|
5
|
+
require 'logger'
|
6
|
+
|
7
|
+
# Used in development to vendor codes of conduct
|
8
|
+
module Coconductor
|
9
|
+
class Vendorer
|
10
|
+
attr_reader :family, :repo
|
11
|
+
attr_writer :ref, :raw_content
|
12
|
+
|
13
|
+
OPTIONS = %i[filename url repo replacements html source_path].freeze
|
14
|
+
INVALID_CHARS = ["\u202D", "\u202C", "\u200E", "\u200F"].freeze
|
15
|
+
UPPERCASE_WORD_REGEX = /(?:[A-Z]{3,}+ ?)+[A-Z_]+/
|
16
|
+
UNMARKED_FIELD_REGEX = /(?<= |^)#{UPPERCASE_WORD_REGEX}(?= |\.|,)/
|
17
|
+
|
18
|
+
def initialize(family, options = {})
|
19
|
+
@family = family
|
20
|
+
|
21
|
+
OPTIONS.each do |option|
|
22
|
+
instance_variable_set("@#{option}", options[option])
|
23
|
+
end
|
24
|
+
|
25
|
+
logger.info "Vendoring #{family}"
|
26
|
+
|
27
|
+
mkdir
|
28
|
+
end
|
29
|
+
|
30
|
+
def dir
|
31
|
+
@dir ||= File.expand_path family, vendor_dir
|
32
|
+
end
|
33
|
+
|
34
|
+
def filename
|
35
|
+
@filename ||= 'CODE_OF_CONDUCT.md'
|
36
|
+
end
|
37
|
+
|
38
|
+
def source_path
|
39
|
+
@source_path ||= filename
|
40
|
+
end
|
41
|
+
|
42
|
+
def content
|
43
|
+
content_normalized
|
44
|
+
end
|
45
|
+
|
46
|
+
def url
|
47
|
+
@url || "https://github.com/#{repo}/raw/#{ref}/#{source_path}"
|
48
|
+
end
|
49
|
+
|
50
|
+
def vendor(version: '1.0')
|
51
|
+
write_with_meta(content, version: version)
|
52
|
+
end
|
53
|
+
|
54
|
+
def ref
|
55
|
+
@ref ||= 'master'
|
56
|
+
end
|
57
|
+
|
58
|
+
def replacements
|
59
|
+
@replacements ||= {}
|
60
|
+
end
|
61
|
+
|
62
|
+
def write_with_meta(content, version: '1.0')
|
63
|
+
content = content_with_meta(content, 'version' => version)
|
64
|
+
write(filepath(version), content)
|
65
|
+
end
|
66
|
+
|
67
|
+
private
|
68
|
+
|
69
|
+
def logger
|
70
|
+
@logger ||= Logger.new(STDOUT)
|
71
|
+
end
|
72
|
+
|
73
|
+
def vendor_dir
|
74
|
+
@vendor_dir ||= File.expand_path '../../vendor', __dir__
|
75
|
+
end
|
76
|
+
|
77
|
+
def filepath(version = '1.0')
|
78
|
+
File.join(dir, 'version', *version.split('.'), filename)
|
79
|
+
end
|
80
|
+
|
81
|
+
def content_with_meta(content, meta)
|
82
|
+
toml = TOML::Generator.new(meta).body.strip
|
83
|
+
['+++', toml, '+++', '', content].join("\n")
|
84
|
+
end
|
85
|
+
|
86
|
+
def mkdir
|
87
|
+
FileUtils.rm_rf(dir)
|
88
|
+
FileUtils.mkdir_p(dir)
|
89
|
+
end
|
90
|
+
|
91
|
+
def write(path, content)
|
92
|
+
logger.info "Writing #{path}"
|
93
|
+
FileUtils.mkdir_p File.dirname(path)
|
94
|
+
File.write(path, content)
|
95
|
+
end
|
96
|
+
|
97
|
+
def raw_content
|
98
|
+
return @raw_content if defined? @raw_content
|
99
|
+
|
100
|
+
logger.info "Retrieving #{url}"
|
101
|
+
URI.open(url).read if url
|
102
|
+
end
|
103
|
+
|
104
|
+
def content_normalized
|
105
|
+
content = raw_content.dup.gsub(Regexp.union(INVALID_CHARS), '')
|
106
|
+
content = ReverseMarkdown.convert content if html?
|
107
|
+
replacements.each { |from, to| content.gsub!(from, to) }
|
108
|
+
content = normalize_implicit_fields(content)
|
109
|
+
content.gsub!(/ ?{% .* %} ?/, '')
|
110
|
+
content.squeeze(' ').strip
|
111
|
+
end
|
112
|
+
|
113
|
+
def normalize_implicit_fields(content)
|
114
|
+
content.gsub!(/#{UPPERCASE_WORD_REGEX} #{UPPERCASE_WORD_REGEX}/) do |m|
|
115
|
+
m.tr(' ', '_')
|
116
|
+
end
|
117
|
+
content.gsub(UNMARKED_FIELD_REGEX) { |m| "[#{m}]" }
|
118
|
+
end
|
119
|
+
|
120
|
+
def html?
|
121
|
+
@html == true
|
122
|
+
end
|
123
|
+
end
|
124
|
+
end
|
data/lib/coconductor/version.rb
CHANGED
@@ -1,73 +1,54 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
|
-
|
4
|
-
require 'open-uri'
|
5
|
-
require 'toml'
|
6
|
-
|
7
|
-
def mkdir(dir)
|
8
|
-
FileUtils.rm_rf(dir)
|
9
|
-
FileUtils.mkdir_p(dir)
|
10
|
-
end
|
11
|
-
|
12
|
-
def write_with_meta(content, version: '1.0', dir: '', file: 'CODE_OF_CONDUCT.md')
|
13
|
-
meta = { 'version' => version }
|
14
|
-
toml = TOML::Generator.new(meta).body.strip
|
15
|
-
content = ['+++', toml, '+++', '', content].join("\n")
|
16
|
-
path = File.join(dir, 'version', *version.split('.'), file)
|
17
|
-
FileUtils.mkdir_p File.dirname(path)
|
18
|
-
File.write(path, content)
|
19
|
-
end
|
20
|
-
|
21
|
-
def download_and_write(url, version: '1.0', dir: '', file: 'CODE_OF_CONDUCT.md')
|
22
|
-
content = URI.open(url).read
|
23
|
-
write_with_meta(content, version: version, dir: dir, file: file)
|
24
|
-
end
|
3
|
+
require_relative '../lib/coconductor'
|
25
4
|
|
5
|
+
# Contributor Covenant
|
26
6
|
repo = 'ContributorCovenant/contributor_covenant'
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
mkdir(dir)
|
31
|
-
|
32
|
-
tar_args = "--include=#{include_path} --strip-components=2 -C #{dir}"
|
7
|
+
vendorer = Coconductor::Vendorer.new('contributor-covenant', filename: 'code-of-conduct.md')
|
8
|
+
tar_args = "--include='*/content/version' --strip-components=2 -C #{vendorer.dir}"
|
33
9
|
`curl -L "https://api.github.com/repos/#{repo}/tarball" | tar xf - #{tar_args}`
|
10
|
+
Dir["#{vendorer.dir}/version/**/#{vendorer.filename}"].each do |path|
|
11
|
+
vendorer.raw_content = File.read(path)
|
12
|
+
File.write(path, vendorer.content)
|
13
|
+
end
|
34
14
|
|
15
|
+
# Citizen Code of Conduct
|
35
16
|
repo = 'stumpsyn/policies'
|
36
|
-
|
37
|
-
|
17
|
+
filename = 'citizen_code_of_conduct.md'
|
18
|
+
vendorer = Coconductor::Vendorer.new('citizen-code-of-conduct', repo: repo, filename: filename)
|
38
19
|
versions = {
|
39
20
|
'2.0' => 'd0594789ea324a42e26b495034952b6ce08d9f51',
|
40
21
|
'2.1' => 'b7705a4315a5e58fea58ae3d4b1de82bd564ac86',
|
41
22
|
'2.2' => '93b7b06f52c9dd526d2395bfa9f5f1723deae32a',
|
42
23
|
'2.3' => 'b1eb8deb5da073c2bd02a8e742e017edfc422554'
|
43
24
|
}
|
44
|
-
|
45
|
-
mkdir(dir)
|
46
|
-
|
47
25
|
versions.each do |version, sha|
|
48
|
-
|
49
|
-
|
26
|
+
vendorer.ref = sha
|
27
|
+
vendorer.vendor(version: version)
|
50
28
|
end
|
51
29
|
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
30
|
+
# No Code of Conduct
|
31
|
+
Coconductor::Vendorer.new('no-code-of-conduct', repo: 'domgetter/NCoC').vendor
|
32
|
+
|
33
|
+
# Django
|
34
|
+
Coconductor::Vendorer.new('django',
|
35
|
+
repo: 'django/djangoproject.com',
|
36
|
+
source_path: 'djangoproject/templates/conduct/index.html',
|
37
|
+
html: true,
|
38
|
+
replacements: {
|
39
|
+
'Django Software Foundation' => '[GOVERNING_BODY]',
|
40
|
+
'Django' => '[COMMUNITY_NAME]',
|
41
|
+
'conduct@djangoproject.com' => '[EMAIL_ADDRESS]',
|
42
|
+
"{% url 'conduct_reporting' %}" => '[LINK_TO_REPORTING_GUIDELINES]',
|
43
|
+
"{% url 'conduct_faq' %}" => '[LINK_TO_FAQ]'
|
44
|
+
}).vendor
|
45
|
+
|
46
|
+
# Geek Feminism
|
63
47
|
url = 'http://geekfeminism.wikia.com/wiki/Community_anti-harassment/Policy?action=edit'
|
64
|
-
|
65
|
-
content =
|
66
|
-
content = content.split('==Anti-harassment policy text==')[1]
|
48
|
+
vendorer = Coconductor::Vendorer.new('geek-feminism', url: url)
|
49
|
+
content = vendorer.content.split('==Anti-harassment policy text==')[1]
|
67
50
|
content = content.split('</textarea').first
|
68
|
-
content = content.gsub(/(?:[A-Z]{3,}+ ?)+[A-Z]+/) { |m| "[#{m.tr(' ', '_')}]" }
|
69
51
|
versions = content.split('===Longer version===')
|
70
52
|
versions = versions.map { |v| v.gsub('===Shorter version===', '').strip }
|
71
|
-
|
72
|
-
write_with_meta(versions.
|
73
|
-
write_with_meta(versions.last, version: 'longer', dir: dir, file: file)
|
53
|
+
vendorer.write_with_meta(versions.first, version: 'shorter')
|
54
|
+
vendorer.write_with_meta(versions.last, version: 'longer')
|
@@ -4,124 +4,124 @@ version = "2.0"
|
|
4
4
|
|
5
5
|
# Citizen Code of Conduct
|
6
6
|
|
7
|
-
## 1
|
7
|
+
## 1. Purpose
|
8
8
|
|
9
|
-
A
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
9
|
+
A primary goal of [COMMUNITY_NAME] is to be inclusive to
|
10
|
+
the largest number of contributors, with the most varied
|
11
|
+
and diverse backgrounds possible. As such, we are committed
|
12
|
+
to providing a friendly, safe and welcoming environment for
|
13
|
+
all, regardless of gender, sexual orientation, ability,
|
14
|
+
ethnicity, socioeconomic status, and religion (or lack
|
15
|
+
thereof).
|
16
16
|
|
17
|
-
This
|
18
|
-
|
19
|
-
|
17
|
+
This code of conduct outlines our expectations for all
|
18
|
+
those who participate in our community, as well as the
|
19
|
+
consequences for unacceptable behavior.
|
20
20
|
|
21
|
-
We
|
22
|
-
|
21
|
+
We invite all those who participate in [COMMUNITY_NAME] to
|
22
|
+
help us create safe and positive experiences for everyone.
|
23
23
|
|
24
|
-
## 2
|
24
|
+
## 2. Open [Source/Culture/Tech] Citizenship
|
25
25
|
|
26
|
-
A
|
27
|
-
|
28
|
-
|
29
|
-
|
26
|
+
A supplemental goal of this Code of Conduct is to
|
27
|
+
increase open [source/culture/tech] citizenship by encouraging
|
28
|
+
participants to recognize and strengthen the relationships
|
29
|
+
between our actions and their effects on our community.
|
30
30
|
|
31
31
|
Communities mirror the societies in which they exist and positive action is essential to counteract the many forms of inequality and abuses of power that exist in society.
|
32
32
|
|
33
|
-
If
|
34
|
-
|
35
|
-
|
36
|
-
|
33
|
+
If you see someone who is making an extra effort to
|
34
|
+
ensure our community is welcoming, friendly, and encourages
|
35
|
+
all participants to contribute to the fullest extent, we
|
36
|
+
want to know.
|
37
37
|
|
38
|
-
## 3
|
38
|
+
## 3. Expected Behavior
|
39
39
|
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
40
|
+
* Participate in an authentic and active way. In doing so, you contribute to the health and longevity of this community.
|
41
|
+
* Exercise consideration and respect in your speech and actions.
|
42
|
+
* Attempt collaboration before conflict.
|
43
|
+
* Refrain from demeaning, discriminatory, or harassing behavior and speech.
|
44
|
+
* Be mindful of your surroundings and of your fellow participants. Alert community leaders if you notice a dangerous situation, someone in distress, or violations of this Code of Conduct, even if they seem inconsequential.
|
45
45
|
|
46
|
-
## 4
|
46
|
+
## 4. Unacceptable Behavior
|
47
47
|
|
48
|
-
Unacceptable
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
48
|
+
Unacceptable behaviors include: intimidating, harassing, abusive,
|
49
|
+
discriminatory, derogatory or demeaning speech or actions by
|
50
|
+
any participant in our community online, at all related
|
51
|
+
events and in one-on-one communications carried out in the
|
52
|
+
context of community business. Community event venues may be
|
53
|
+
shared with members of the public; please be respectful to
|
54
|
+
all patrons of these locations.
|
55
55
|
|
56
|
-
Harassment
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
56
|
+
Harassment includes: harmful or prejudicial verbal or written
|
57
|
+
comments related to gender, sexual orientation, race,
|
58
|
+
religion, disability; inappropriate use of nudity and/or
|
59
|
+
sexual images in public spaces (including presentation
|
60
|
+
slides); deliberate intimidation, stalking or following;
|
61
|
+
harassing photography or recording; sustained disruption of
|
62
|
+
talks or other events; inappropriate physical contact, and
|
63
|
+
unwelcome sexual attention.
|
64
64
|
|
65
|
-
## 5
|
65
|
+
## 5. Consequences of Unacceptable Behavior
|
66
66
|
|
67
|
-
Unacceptable
|
68
|
-
|
69
|
-
|
67
|
+
Unacceptable behavior from any community member, including
|
68
|
+
sponsors and those with decision-making authority, will not
|
69
|
+
be tolerated.
|
70
70
|
|
71
|
-
Anyone
|
72
|
-
|
71
|
+
Anyone asked to stop unacceptable behavior is expected to
|
72
|
+
comply immediately.
|
73
73
|
|
74
|
-
If
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
74
|
+
If a community member engages in unacceptable behavior, the
|
75
|
+
community organizers may take any action they deem
|
76
|
+
appropriate, up to and including a temporary ban or
|
77
|
+
permanent expulsion from the community without warning (and
|
78
|
+
without refund in the case of a paid event).
|
79
79
|
|
80
|
-
## 6
|
80
|
+
## 6. If You Witness or Are Subject to Unacceptable Behavior
|
81
81
|
|
82
|
-
If
|
83
|
-
|
84
|
-
|
82
|
+
If you are subject to or witness unacceptable behavior, or
|
83
|
+
have any other concerns, please notify a community organizer
|
84
|
+
as soon as possible. [CONTACT_INFO_HERE]
|
85
85
|
|
86
|
-
Additionally
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
86
|
+
Additionally, community organizers are available to help
|
87
|
+
community members engage with local law enforcement or to
|
88
|
+
otherwise help those experiencing unacceptable behavior feel
|
89
|
+
safe. In the context of in-person events, organizers will
|
90
|
+
also provide escorts as desired by the person experiencing
|
91
|
+
distress.
|
92
92
|
|
93
|
-
## 7
|
93
|
+
## 7. Addressing Grievances
|
94
94
|
|
95
|
-
If
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
95
|
+
If you feel you have been falsely or unfairly accused of
|
96
|
+
violating this Code of Conduct, you should notify
|
97
|
+
[GOVERNING_BODY] with a concise description of your grievance.
|
98
|
+
Your grievance will be handled in accordance with our
|
99
|
+
existing governing policies. [LINK_TO_POLICY]
|
100
100
|
|
101
|
-
[NOTE
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
101
|
+
[NOTE: Every organization's governing policies should dictate
|
102
|
+
how you handle warnings and expulsions of community members.
|
103
|
+
It is strongly recommended that you mention those policies
|
104
|
+
here or in Section 7 and that you include a mechanism
|
105
|
+
for addressing grievances.]
|
106
106
|
|
107
|
-
## 8
|
107
|
+
## 8. Scope
|
108
108
|
|
109
|
-
We
|
110
|
-
|
111
|
-
|
112
|
-
person
|
113
|
-
|
109
|
+
We expect all community participants (contributors, paid or
|
110
|
+
otherwise; sponsors; and other guests) to abide by this
|
111
|
+
Code of Conduct in all community venues—online and in-
|
112
|
+
person—as well as in all one-on-one communications pertaining
|
113
|
+
to community business.
|
114
114
|
|
115
|
-
## 9
|
115
|
+
## 9. Contact info
|
116
116
|
|
117
|
-
|
118
|
-
|
119
|
-
|
117
|
+
[YOUR_CONTACT_INFO_HERE -- this should be a single
|
118
|
+
person or a small team who can respond to issues
|
119
|
+
directly]
|
120
120
|
|
121
|
-
## 10
|
121
|
+
## 10. License and attribution
|
122
122
|
|
123
|
-
This
|
124
|
-
|
123
|
+
This Code of Conduct is distributed under a [Creative
|
124
|
+
Commons Attribution-ShareAlike license](http://creativecommons.org/licenses/by-sa/3.0/)
|
125
125
|
|
126
126
|
_Revision 2.0, adopted by the [Stumptown
|
127
|
-
Syndicate](http://stumptownsyndicate.org) board on 10 January 2013. Posted 17 March 2013._
|
127
|
+
Syndicate](http://stumptownsyndicate.org) board on 10 January 2013. Posted 17 March 2013._
|