coconductor 0.8.1 → 0.8.2
Sign up to get free protection for your applications and to get access to all the features.
- 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._
|