coconductor 0.8.1 → 0.8.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (27) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +1 -0
  3. data/coconductor.gemspec +3 -2
  4. data/lib/coconductor.rb +2 -1
  5. data/lib/coconductor/code_of_conduct.rb +8 -2
  6. data/lib/coconductor/commands/detect.rb +2 -0
  7. data/lib/coconductor/field.rb +1 -0
  8. data/lib/coconductor/matchers/field_aware.rb +1 -0
  9. data/lib/coconductor/projects/git_project.rb +2 -0
  10. data/lib/coconductor/vendorer.rb +124 -0
  11. data/lib/coconductor/version.rb +1 -1
  12. data/script/vendor-codes-of-conduct +34 -53
  13. data/vendor/citizen-code-of-conduct/version/2/0/citizen_code_of_conduct.md +90 -90
  14. data/vendor/citizen-code-of-conduct/version/2/1/citizen_code_of_conduct.md +22 -22
  15. data/vendor/citizen-code-of-conduct/version/2/2/citizen_code_of_conduct.md +22 -22
  16. data/vendor/citizen-code-of-conduct/version/2/3/citizen_code_of_conduct.md +22 -22
  17. data/vendor/contributor-covenant/version/1/0/0/code-of-conduct.md +1 -1
  18. data/vendor/contributor-covenant/version/1/1/0/code-of-conduct.md +1 -1
  19. data/vendor/contributor-covenant/version/1/2/0/code-of-conduct.md +1 -1
  20. data/vendor/contributor-covenant/version/1/3/0/code-of-conduct.md +3 -3
  21. data/vendor/contributor-covenant/version/1/4/code-of-conduct.ar.md +51 -0
  22. data/vendor/contributor-covenant/version/1/4/code-of-conduct.fr.md +36 -35
  23. data/vendor/contributor-covenant/version/1/4/code-of-conduct.it.md +82 -0
  24. data/vendor/contributor-covenant/version/1/4/code-of-conduct.md +7 -4
  25. data/vendor/django/version/1/0/CODE_OF_CONDUCT.md +36 -0
  26. data/vendor/no-code-of-conduct/version/1/0/CODE_OF_CONDUCT.md +2 -2
  27. metadata +24 -5
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 5e480557237f7498e2cecde80b375f469b43450cd8a0f08716b01c702937cf44
4
- data.tar.gz: 595ae0238808432fe4938b5de8c91bbe46abb08b88772de85f89b7df16c2fea7
3
+ metadata.gz: e05bf7d17d5b42745715db08f27e650150208b03e7452318a0d6ba8a5008faf2
4
+ data.tar.gz: e7009c3ef47dacd37d622400dc9ed2aba6c1793aebd920d8fa09a0733e903c48
5
5
  SHA512:
6
- metadata.gz: 728e46aa91c2991ae07a2a1d48b14069d65c2d9f8026d962611713da775b677c0d71e4b4fa44cbfba02c949243b745e69507ad860b6cfb114b7bfc4fffaf0af8
7
- data.tar.gz: b188e52329adf3b0b18c0153f64b3d9ee4d5797effba0877db38fe606812c21bb2c49595a3b461abe59bbe7944ce23f9fe5bd4ad5a49b87e770150dd7501ab87
6
+ metadata.gz: 4097f1aa8b661ef6da3f7fe76f65c3150c1f17a42353a2548b70201a4378f8cd2f7763b6e71e9eed0bfc8ace2ecac8f97096118228dfb00a8ba485bac6cb4d2c
7
+ data.tar.gz: ec97081a9d6a67e508a1c64b5ac5ac88cbdee226f2d6446959658ec149a0e5fb3802a47fa91264ff827dd8ddcd56a877be0412ce29c68ba95daf453893e9b728
data/.rubocop.yml CHANGED
@@ -4,6 +4,7 @@ Style/Documentation:
4
4
  Metrics/BlockLength:
5
5
  Exclude:
6
6
  - spec/**/*
7
+ - coconductor.gemspec
7
8
 
8
9
  Metrics/LineLength:
9
10
  Exclude:
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 = 'exe'
23
- spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
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
- require 'coconductor/version'
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 ||= Dir["#{vendor_dir}/*"].map do |dir|
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?
@@ -61,6 +61,7 @@ module Coconductor
61
61
  def description
62
62
  @description ||= begin
63
63
  return parts[:description] if parts && parts[:description] != ''
64
+
64
65
  DESCRIPTIONS[key]
65
66
  end
66
67
  end
@@ -5,6 +5,7 @@ module Coconductor
5
5
 
6
6
  def match
7
7
  return @match if defined? @match
8
+
8
9
  potential_matches.find do |code_of_conduct|
9
10
  file.content_normalized =~ regex_for(code_of_conduct)
10
11
  end
@@ -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
@@ -1,3 +1,3 @@
1
1
  module Coconductor
2
- VERSION = '0.8.1'.freeze
2
+ VERSION = '0.8.2'.freeze
3
3
  end
@@ -1,73 +1,54 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- require 'fileutils'
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
- dir = File.expand_path '../vendor/contributor-covenant', __dir__
28
- include_path = '*/content/version'
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
- dir = File.expand_path '../vendor/citizen-code-of-conduct', __dir__
37
- file = 'citizen_code_of_conduct.md'
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
- url = "https://github.com/#{repo}/raw/#{sha}/#{file}"
49
- download_and_write(url, version: version, dir: dir, file: file)
26
+ vendorer.ref = sha
27
+ vendorer.vendor(version: version)
50
28
  end
51
29
 
52
- repo = 'domgetter/NCoC'
53
- dir = 'vendor/no-code-of-conduct'
54
- file = 'CODE_OF_CONDUCT.md'
55
-
56
- mkdir(dir)
57
-
58
- url = "https://github.com/#{repo}/raw/master/#{file}"
59
- download_and_write(url, dir: dir, file: file)
60
-
61
- dir = 'vendor/geek-feminism'
62
- file = 'CODE_OF_CONDUCT.md'
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 = URI.open(url).read
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.first, version: 'shorter', dir: dir, file: file)
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.‭ Purpose
7
+ ## 1. Purpose
8
8
 
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)‬.‭
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 code of conduct outlines our expectations for all
18
- those who participate in our community,‭ as well as the
19
- consequences for unacceptable behavior.
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 invite all those who participate in ‬COMMUNITY‭_‬NAME‭ to
22
- help us create safe and positive experiences for everyone.
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.‎ Open [Source/Culture/Tech] Citizenship
24
+ ## 2. Open [Source/Culture/Tech] Citizenship
25
25
 
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.
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 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.
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.‎ Expected Behavior
38
+ ## 3. Expected Behavior
39
39
 
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.
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.‎ Unacceptable Behavior
46
+ ## 4. Unacceptable Behavior
47
47
 
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.
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 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.
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.‎ Consequences of Unacceptable Behavior
65
+ ## 5. Consequences of Unacceptable Behavior
66
66
 
67
- Unacceptable behavior from any community member,‭ including
68
- sponsors and those with decision-making authority,‭ will not
69
- be tolerated.
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 asked to stop unacceptable behavior is expected to
72
- comply immediately.
71
+ Anyone asked to stop unacceptable behavior is expected to
72
+ comply immediately.
73
73
 
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)‬.
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.‎ If You Witness or Are Subject to Unacceptable Behavior
80
+ ## 6. If You Witness or Are Subject to Unacceptable Behavior
81
81
 
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‭]
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,‭ 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.
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.‎ Addressing Grievances
93
+ ## 7. Addressing Grievances
94
94
 
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‭]
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:‎ 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.‭]
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.‎ Scope
107
+ ## 8. Scope
108
108
 
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.
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 venuesonline and in-
112
+ personas well as in all one-on-one communications pertaining
113
+ to community business.
114
114
 
115
- ## 9.‎ Contact info
115
+ ## 9. Contact info
116
116
 
117
- [‏YOUR‭ ‬CONTACT‭ ‬INFO‭ ‬HERE‭ ‬--‭ ‬this should be a single
118
- person or a small team who can respond to issues
119
- directly]
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.‎ License and attribution
121
+ ## 10. License and attribution
122
122
 
123
- This Code of Conduct is distributed under a [Creative
124
- Commons Attribution-ShareAlike license](http://creativecommons.org/licenses/by-sa/3.0/)
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._