coconductor 0.9.1 → 0.10.1

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.
Files changed (52) hide show
  1. checksums.yaml +4 -4
  2. data/.github/funding.yml +1 -0
  3. data/.rubocop.yml +10 -1
  4. data/.rubocop_todo.yml +132 -0
  5. data/Gemfile +2 -0
  6. data/Rakefile +2 -0
  7. data/bin/coconductor +2 -1
  8. data/coconductor.gemspec +7 -3
  9. data/docs/SECURITY.md +3 -0
  10. data/lib/coconductor.rb +7 -5
  11. data/lib/coconductor/code_of_conduct.rb +16 -10
  12. data/lib/coconductor/commands/detect.rb +3 -1
  13. data/lib/coconductor/commands/diff.rb +5 -5
  14. data/lib/coconductor/commands/version.rb +2 -0
  15. data/lib/coconductor/field.rb +6 -6
  16. data/lib/coconductor/matchers.rb +2 -0
  17. data/lib/coconductor/matchers/dice.rb +2 -0
  18. data/lib/coconductor/matchers/exact.rb +2 -0
  19. data/lib/coconductor/matchers/field_aware.rb +4 -2
  20. data/lib/coconductor/matchers/matcher.rb +2 -0
  21. data/lib/coconductor/project_files.rb +2 -0
  22. data/lib/coconductor/project_files/code_of_conduct_file.rb +7 -5
  23. data/lib/coconductor/project_files/project_file.rb +2 -0
  24. data/lib/coconductor/projects.rb +2 -0
  25. data/lib/coconductor/projects/fs_project.rb +2 -0
  26. data/lib/coconductor/projects/git_project.rb +2 -0
  27. data/lib/coconductor/projects/github_project.rb +2 -0
  28. data/lib/coconductor/projects/project.rb +3 -1
  29. data/lib/coconductor/vendorer.rb +6 -4
  30. data/lib/coconductor/version.rb +3 -1
  31. data/script/console +1 -0
  32. data/script/vendor-codes-of-conduct +4 -3
  33. data/vendor/contributor-covenant/version/1/4/code-of-conduct.ar.md +4 -4
  34. data/vendor/contributor-covenant/version/1/4/code-of-conduct.de.md +2 -2
  35. data/vendor/contributor-covenant/version/1/4/code-of-conduct.gu.md +76 -0
  36. data/vendor/contributor-covenant/version/1/4/code-of-conduct.hi.md +2 -2
  37. data/vendor/contributor-covenant/version/1/4/code-of-conduct.hu.md +53 -0
  38. data/vendor/contributor-covenant/version/1/4/code-of-conduct.id.md +18 -20
  39. data/vendor/contributor-covenant/version/1/4/code-of-conduct.md +7 -7
  40. data/vendor/contributor-covenant/version/1/4/code-of-conduct.mr.md +78 -0
  41. data/vendor/contributor-covenant/version/1/4/code-of-conduct.pl.md +14 -15
  42. data/vendor/contributor-covenant/version/1/4/code-of-conduct.zh-cn.md +27 -27
  43. data/vendor/contributor-covenant/version/2/0/code_of_conduct.ca.md +84 -0
  44. data/vendor/contributor-covenant/version/2/0/code_of_conduct.es.md +89 -0
  45. data/vendor/contributor-covenant/version/2/0/code_of_conduct.id.md +136 -0
  46. data/vendor/contributor-covenant/version/2/0/code_of_conduct.it.md +127 -0
  47. data/vendor/contributor-covenant/version/2/0/code_of_conduct.ja.md +91 -0
  48. data/vendor/contributor-covenant/version/2/0/code_of_conduct.md +133 -0
  49. data/vendor/contributor-covenant/version/2/0/code_of_conduct.ru.md +124 -0
  50. data/vendor/contributor-covenant/version/2/0/code_of_conduct.tr.md +85 -0
  51. data/vendor/go/version/1/0/CODE_OF_CONDUCT.md +2 -2
  52. metadata +62 -15
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 9fd3d9f82c0aec28b73f9f692226a6ea3a962ff13deb2315e520363afc73c3ae
4
- data.tar.gz: 0023d2b81bc25e49604bf25828e84a30f92b5de5bb4f1c3ba90dafb56254e680
3
+ metadata.gz: f2f164d3139954a092f0e47c1a7d3ed25988927d1dc6c789c0c87906a370500c
4
+ data.tar.gz: ee301805000f620f4def3f84aea18302154aefb2bad3a43d162adf159b4832ac
5
5
  SHA512:
6
- metadata.gz: 03324bbb7084bf316394ae361cba6d7ca844c825b87525f7f78e06c4c82642bd911defd2f0f06c7f979c8731dc4d29c392a9e318626007649172e0a50ff643a8
7
- data.tar.gz: c63dc0a0abfea44a913d11435370ed7044c70985136ccc3ee8c113fd03f0e4b1b275a412a0592d4424dc806677aea1e1984b54cdc3d3d292209b950af1a6623a
6
+ metadata.gz: 94d375ee6d990acd446063a34e93d28cbd93843e76d30b571f435af1eb8e2925bf9c0e7f6fe554499200eed3fba2425b505842f343afc5c99bea9983a071afb7
7
+ data.tar.gz: caebc5d1f2743c2c08710a2c5d88bf7798c1307ee51144ba6b08add09adf0f806c9fbabaf15d1e6c1c68630926808b02e3045f1d082efe70b8a89a87276d2ec1
@@ -0,0 +1 @@
1
+ patreon: benbalter
data/.rubocop.yml CHANGED
@@ -1,3 +1,12 @@
1
+ inherit_from: .rubocop_todo.yml
2
+
3
+ require:
4
+ - rubocop-performance
5
+ - rubocop-rspec
6
+
7
+ AllCops:
8
+ NewCops: enable
9
+
1
10
  Style/Documentation:
2
11
  Enabled: false
3
12
 
@@ -6,7 +15,7 @@ Metrics/BlockLength:
6
15
  - spec/**/*
7
16
  - coconductor.gemspec
8
17
 
9
- Metrics/LineLength:
18
+ Layout/LineLength:
10
19
  Exclude:
11
20
  - lib/coconductor/project_files.rb
12
21
  - lib/coconductor/commands/*
data/.rubocop_todo.yml ADDED
@@ -0,0 +1,132 @@
1
+ # This configuration was generated by
2
+ # `rubocop --auto-gen-config`
3
+ # on 2021-03-02 20:51:18 UTC using RuboCop version 1.11.0.
4
+ # The point is for the user to remove these configuration records
5
+ # one by one as the offenses are removed from the code base.
6
+ # Note that changes in the inspected code, or installation of new
7
+ # versions of RuboCop, may require this file to be generated again.
8
+
9
+ # Offense count: 1
10
+ # Configuration parameters: Include.
11
+ # Include: **/*.gemspec
12
+ Gemspec/RequiredRubyVersion:
13
+ Exclude:
14
+ - 'coconductor.gemspec'
15
+
16
+ # Offense count: 1
17
+ Lint/NoReturnInBeginEndBlocks:
18
+ Exclude:
19
+ - 'lib/coconductor/field.rb'
20
+
21
+ # Offense count: 1
22
+ # Configuration parameters: CountComments, CountAsOne, ExcludedMethods, IgnoredMethods.
23
+ Metrics/MethodLength:
24
+ Max: 11
25
+
26
+ # Offense count: 7
27
+ # Configuration parameters: EnforcedStyle, CheckMethodNames, CheckSymbols, AllowedIdentifiers.
28
+ # SupportedStyles: snake_case, normalcase, non_integer
29
+ # AllowedIdentifiers: capture3, iso8601, rfc1123_date, rfc822, rfc2822, rfc3339
30
+ Naming/VariableNumber:
31
+ Exclude:
32
+ - 'spec/coconductor/matchers/dice_spec.rb'
33
+ - 'spec/coconductor/matchers/exact_spec.rb'
34
+ - 'spec/coconductor/project_files/code_of_conduct_file_spec.rb'
35
+ - 'spec/coconductor/project_files/project_file_spec.rb'
36
+ - 'spec/coconductor/project_spec.rb'
37
+ - 'spec/coconductor_spec.rb'
38
+ - 'spec/integration_spec.rb'
39
+
40
+ # Offense count: 4
41
+ # Configuration parameters: MinSize.
42
+ Performance/CollectionLiteralInLoop:
43
+ Exclude:
44
+ - 'spec/coconductor/code_of_conduct_spec.rb'
45
+ - 'spec/coconductor/field_spec.rb'
46
+ - 'spec/coconductor/matchers/field_aware_spec.rb'
47
+ - 'spec/vendored_coc_spec.rb'
48
+
49
+ # Offense count: 21
50
+ # Configuration parameters: Prefixes.
51
+ # Prefixes: when, with, without
52
+ RSpec/ContextWording:
53
+ Exclude:
54
+ - 'spec/coconductor/code_of_conduct_spec.rb'
55
+ - 'spec/coconductor/field_spec.rb'
56
+ - 'spec/coconductor/matchers/dice_spec.rb'
57
+ - 'spec/coconductor/matchers/field_aware_spec.rb'
58
+ - 'spec/coconductor/project_files/code_of_conduct_file_spec.rb'
59
+ - 'spec/coconductor/project_files/project_file_spec.rb'
60
+ - 'spec/coconductor/project_spec.rb'
61
+ - 'spec/coconductor_spec.rb'
62
+ - 'spec/integration_spec.rb'
63
+
64
+ # Offense count: 3
65
+ # Configuration parameters: IgnoredMetadata.
66
+ RSpec/DescribeClass:
67
+ Exclude:
68
+ - 'spec/coconductor/bin_spec.rb'
69
+ - 'spec/integration_spec.rb'
70
+ - 'spec/vendored_coc_spec.rb'
71
+
72
+ # Offense count: 3
73
+ # Configuration parameters: Max.
74
+ RSpec/ExampleLength:
75
+ Exclude:
76
+ - 'spec/coconductor/code_of_conduct_spec.rb'
77
+
78
+ # Offense count: 19
79
+ RSpec/MultipleExpectations:
80
+ Max: 4
81
+
82
+ # Offense count: 10
83
+ # Configuration parameters: AllowSubject.
84
+ RSpec/MultipleMemoizedHelpers:
85
+ Max: 8
86
+
87
+ # Offense count: 71
88
+ # Configuration parameters: IgnoreSharedExamples.
89
+ RSpec/NamedSubject:
90
+ Exclude:
91
+ - 'spec/coconductor/code_of_conduct_spec.rb'
92
+ - 'spec/coconductor/field_spec.rb'
93
+ - 'spec/coconductor/matchers/dice_spec.rb'
94
+ - 'spec/coconductor/matchers/exact_spec.rb'
95
+ - 'spec/coconductor/matchers/matcher_spec.rb'
96
+ - 'spec/coconductor/project_files/project_file_spec.rb'
97
+ - 'spec/coconductor/project_spec.rb'
98
+ - 'spec/coconductor_spec.rb'
99
+ - 'spec/integration_spec.rb'
100
+
101
+ # Offense count: 7
102
+ RSpec/NestedGroups:
103
+ Max: 4
104
+
105
+ # Offense count: 2
106
+ RSpec/RepeatedDescription:
107
+ Exclude:
108
+ - 'spec/coconductor/code_of_conduct_spec.rb'
109
+
110
+ # Offense count: 9
111
+ RSpec/ScatteredSetup:
112
+ Exclude:
113
+ - 'spec/coconductor/project_files/project_file_spec.rb'
114
+ - 'spec/coconductor/project_spec.rb'
115
+ - 'spec/integration_spec.rb'
116
+
117
+ # Offense count: 5
118
+ RSpec/SubjectStub:
119
+ Exclude:
120
+ - 'spec/coconductor/project_files/project_file_spec.rb'
121
+
122
+ # Offense count: 1
123
+ Security/Open:
124
+ Exclude:
125
+ - 'lib/coconductor/vendorer.rb'
126
+
127
+ # Offense count: 1
128
+ # Cop supports --auto-correct.
129
+ # Configuration parameters: Methods.
130
+ Style/RedundantArgument:
131
+ Exclude:
132
+ - 'spec/coconductor/project_files/project_file_spec.rb'
data/Gemfile CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  source 'https://rubygems.org'
2
4
 
3
5
  git_source(:github) { |repo_name| "https://github.com/#{repo_name}" }
data/Rakefile CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'bundler/gem_tasks'
2
4
  require 'rspec/core/rake_task'
3
5
 
data/bin/coconductor CHANGED
@@ -1,4 +1,5 @@
1
1
  #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
2
3
 
3
4
  require_relative '../lib/coconductor'
4
5
  require 'thor'
@@ -38,6 +39,6 @@ class CoconductorCLI < Thor
38
39
  end
39
40
 
40
41
  commands_dir = File.expand_path '../lib/coconductor/commands/', __dir__
41
- Dir["#{commands_dir}/*.rb"].each { |c| require(c) }
42
+ Dir["#{commands_dir}/*.rb"].sort.each { |c| require(c) }
42
43
 
43
44
  CoconductorCLI.start(ARGV)
data/coconductor.gemspec CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  lib = File.expand_path('lib', __dir__)
2
4
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
5
  require 'coconductor/version'
@@ -24,14 +26,16 @@ Gem::Specification.new do |spec|
24
26
  spec.require_paths = ['lib']
25
27
 
26
28
  spec.add_dependency 'licensee', '~> 9.9', '>= 9.9.4'
27
- spec.add_dependency 'thor', '~> 0.18'
29
+ spec.add_dependency 'thor', '>= 0.18', '< 2.0'
28
30
  spec.add_dependency 'toml', '~> 0.2'
29
31
 
30
- spec.add_development_dependency 'bundler', '~> 1.16'
32
+ spec.add_development_dependency 'gem-release', '~> 2.0'
31
33
  spec.add_development_dependency 'pry', '~> 0.10'
32
34
  spec.add_development_dependency 'reverse_markdown', '~> 1.1'
33
35
  spec.add_development_dependency 'rspec', '~> 3.0'
34
- spec.add_development_dependency 'rubocop', '~> 0.50'
36
+ spec.add_development_dependency 'rubocop', '~> 1.0'
37
+ spec.add_development_dependency 'rubocop-performance', '~> 1.5'
38
+ spec.add_development_dependency 'rubocop-rspec', '~> 2.0'
35
39
  spec.add_development_dependency 'twitter-text', '< 2.0'
36
40
  spec.add_development_dependency 'webmock', '~> 3.1'
37
41
  spec.add_development_dependency 'wikicloth', '~> 0.8'
data/docs/SECURITY.md ADDED
@@ -0,0 +1,3 @@
1
+ # Security Policy
2
+
3
+ To report a security vulnerability, please email [ben@balter.com](mailto:ben@balter.com).
data/lib/coconductor.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require_relative './coconductor/version'
2
4
  require 'licensee'
3
5
 
@@ -9,7 +11,7 @@ module Coconductor
9
11
  autoload :ProjectFiles, 'coconductor/project_files'
10
12
  autoload :Vendorer, 'coconductor/vendorer'
11
13
 
12
- CONFIDENCE_THRESHOLD = 90
14
+ CONFIDENCE_THRESHOLD = 85
13
15
 
14
16
  class << self
15
17
  attr_writer :confidence_threshold
@@ -23,13 +25,13 @@ module Coconductor
23
25
  end
24
26
 
25
27
  def project(path, **args)
26
- if path =~ %r{\Ahttps://github.com}
27
- Coconductor::Projects::GitHubProject.new(path, args)
28
+ if %r{\Ahttps://github.com}.match?(path)
29
+ Coconductor::Projects::GitHubProject.new(path, **args)
28
30
  else
29
- Coconductor::Projects::GitProject.new(path, args)
31
+ Coconductor::Projects::GitProject.new(path, **args)
30
32
  end
31
33
  rescue Coconductor::Projects::GitProject::InvalidRepository
32
- Coconductor::Projects::FSProject.new(path, args)
34
+ Coconductor::Projects::FSProject.new(path, **args)
33
35
  end
34
36
 
35
37
  def confidence_threshold
@@ -1,7 +1,10 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'toml'
2
4
 
3
5
  module Coconductor
4
6
  class InvalidCodeOfConduct < ArgumentError; end
7
+
5
8
  class CodeOfConduct
6
9
  class << self
7
10
  def all
@@ -37,7 +40,7 @@ module Coconductor
37
40
  [
38
41
  matches['family'], 'version', matches['version'], matches['lang']
39
42
  ].compact.join('/')
40
- end.compact
43
+ end.compact.sort
41
44
  end
42
45
 
43
46
  def latest_in_family(family, language: DEFAULT_LANGUAGE)
@@ -50,7 +53,7 @@ module Coconductor
50
53
  def families
51
54
  @families ||= begin
52
55
  families = Dir["#{vendor_dir}/*"].map { |dir| File.basename(dir) }
53
- families - ['bundle']
56
+ (families - ['bundle']).sort
54
57
  end
55
58
  end
56
59
 
@@ -70,17 +73,18 @@ module Coconductor
70
73
  /version
71
74
  /(?<version>(?<major>\d)/(?<minor>\d)(/(?<patch>\d))?|(longer|shorter))
72
75
  /#{Coconductor::ProjectFiles::CodeOfConductFile::FILENAME_REGEX}
73
- }ix
74
- DEFAULT_LANGUAGE = 'en'.freeze
76
+ }ix.freeze
77
+ DEFAULT_LANGUAGE = 'en'
75
78
 
76
79
  attr_reader :key
77
80
  attr_writer :content
81
+
78
82
  include Licensee::ContentHelper
79
83
 
80
84
  # Define dynamic predicate helpers to determine if a code of conduct is a
81
85
  # member of a given family, e.g., code_of_conduct.contributor_covenant?
82
86
  CodeOfConduct.families.each do |f|
83
- define_method(f.tr('-', '_') + '?') { family == f }
87
+ define_method("#{f.tr('-', '_')}?") { family == f }
84
88
  end
85
89
 
86
90
  def initialize(key)
@@ -96,7 +100,7 @@ module Coconductor
96
100
  parts = key.split('/')
97
101
  if pseudo?
98
102
  nil
99
- elsif parts.last =~ /^[a-z-]{2,5}$/
103
+ elsif /^[a-z-]{2,5}$/.match?(parts.last)
100
104
  parts.last
101
105
  else
102
106
  DEFAULT_LANGUAGE
@@ -130,7 +134,7 @@ module Coconductor
130
134
  alias body content
131
135
 
132
136
  def inspect
133
- "#<Licensee::CodeOfConduct key=#{key}>"
137
+ "#<Coconductor::CodeOfConduct key=#{key}>"
134
138
  end
135
139
 
136
140
  def family
@@ -177,16 +181,18 @@ module Coconductor
177
181
  private
178
182
 
179
183
  def filename
180
- filename = if contributor_covenant?
184
+ filename = if contributor_covenant? && key.include?('/version/1/')
181
185
  'code-of-conduct'
186
+ elsif contributor_covenant? && key.include?('/version/2/')
187
+ 'code_of_conduct'
182
188
  elsif citizen_code_of_conduct?
183
189
  'citizen_code_of_conduct'
184
190
  else
185
191
  'CODE_OF_CONDUCT'
186
192
  end
187
193
 
188
- filename << '.' + language unless default_language?
189
- filename << '.md'
194
+ filename += ".#{language}" unless default_language?
195
+ "#{filename}.md"
190
196
  end
191
197
 
192
198
  def filepath
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class CoconductorCLI < Thor
2
4
  desc 'detect [PATH]', 'Detect the code of conduct of the given project', default: Dir.pwd
3
5
  option :confidence, type: :numeric, default: Coconductor.confidence_threshold, desc: 'Confidence threshold'
@@ -57,7 +59,7 @@ class CoconductorCLI < Thor
57
59
  when :confidence
58
60
  Licensee::ContentHelper.format_percent(value)
59
61
  when :method
60
- value.to_s.tr('_', ' ').capitalize + ':'
62
+ "#{value.to_s.tr('_', ' ').capitalize}:"
61
63
  else
62
64
  value
63
65
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'tmpdir'
2
4
 
3
5
  class CoconductorCLI < Thor
@@ -39,20 +41,18 @@ class CoconductorCLI < Thor
39
41
  private
40
42
 
41
43
  def code_of_conduct_to_diff
42
- if options[:code_of_conduct_to_diff]
43
- return options[:code_of_conduct_to_diff]
44
- end
44
+ return options[:code_of_conduct_to_diff] if options[:code_of_conduct_to_diff]
45
45
 
46
46
  return project.code_of_conduct_file if remote?
47
47
 
48
48
  @code_of_conduct_to_diff ||= begin
49
- if STDIN.tty?
49
+ if $stdin.tty?
50
50
  error 'You must pipe the file contents to the command via STDIN'
51
51
  exit 1
52
52
  end
53
53
 
54
54
  filename = 'CODE_OF_CONDUCT.txt'
55
- Coconductor::ProjectFiles::CodeOfConductFile.new(STDIN.read, filename)
55
+ Coconductor::ProjectFiles::CodeOfConductFile.new($stdin.read, filename)
56
56
  end
57
57
  end
58
58
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class CoconductorCLI < Thor
2
4
  desc 'version', 'Return the Coconductor version'
3
5
  def version
@@ -1,7 +1,9 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Coconductor
2
4
  # Represents a fillable field in a code of conduct
3
5
  class Field
4
- REGEX = /\[(?<name>[A-Z_ ]{2,})[\s:-]*(?<description>.*?)\]/
6
+ REGEX = /\[(?<name>[A-Z_ ]{2,})[\s:-]*(?<description>.*?)\]/.freeze
5
7
 
6
8
  # the matchable raw text within the code of conduct including brackets
7
9
  attr_reader :raw_text
@@ -18,7 +20,7 @@ module Coconductor
18
20
  # Returns an array of Fields for the given code of conduct
19
21
  def from_code_of_conduct(code_of_conduct)
20
22
  matches = []
21
- return [] unless code_of_conduct && code_of_conduct.content
23
+ return [] unless code_of_conduct&.content
22
24
 
23
25
  code_of_conduct.content.scan(REGEX) do |_m|
24
26
  matches << Regexp.last_match
@@ -40,7 +42,7 @@ module Coconductor
40
42
  def initialize(raw_text, name: nil, description: nil)
41
43
  @raw_text = raw_text
42
44
  @name = name
43
- @description = description if description && description != ''
45
+ @description = description.capitalize if description && description != ''
44
46
  end
45
47
 
46
48
  # The unformatted field name as found in the code of conduct text
@@ -60,9 +62,7 @@ module Coconductor
60
62
 
61
63
  def description
62
64
  @description ||= begin
63
- if parts && parts[:description] && parts[:description] != ''
64
- return parts[:description].capitalize
65
- end
65
+ return parts[:description].capitalize if parts && parts[:description] && parts[:description] != ''
66
66
 
67
67
  DESCRIPTIONS[key]
68
68
  end